听见天晴 发表于 2024-7-7 11:44:09

请大神帮忙看看,左往右指定位数文字后加空格的程序!

各位大佬好,手上有一个这样的程序,我希望在单行/多行文字中,从左往右数,第3个字后面加2个空格,目前遇到的问题是第3个字是字母,数字,的时候没问题,但是第3个字是特殊符号,汉字的时候,就出现问题了,可能因为是符号,汉字不止一个字符?我不知道怎么去区分开这个。有没有大佬能帮忙修改一下,要求就是单行、多行文字下,批量框选后,都在第3个字后面加2个空格,无论第3个字是什么,谢谢~
如果不能实现就做把第3个字符是φ的时候不拆成%%c吧,从φ后面开始分,谢谢

希望大概能帮忙改一下,本人不太会写程序,谢谢

(defun c:TT ()
(prompt "\n选择需要处理的文字: ") ; 提示用户选择文字
(setq sslst (ssget '((0 . "TEXT,MTEXT")))) ; 获取选中的文字对象集合

(if sslst ; 如果选择对象集合非空
    (progn
      (setq n -1) ; 初始化计数器
      (repeat (sslength sslst) ; 循环处理每一个选中的文字对象
      (setq ename (ssname sslst (setq n (1+ n)))) ; 获取对象名字
      (setq entdata (entget ename)) ; 获取对象的详细数据
      (setq textstr (cdr (assoc 1 entdata))) ; 提取文字内容

      ;; 判断文字长度是否大于等于3,然后处理文字
      (if (>= (strlen textstr) 3)
          (progn
            (setq part1 (substr textstr 1 3)) ; 取前3个字符
            (setq part2 (substr textstr 4)); 剩余的字符
            (setq newtext (strcat part1 "" part2)) ; 在第三个字符后添加两个空格
          )
          (setq newtext textstr)) ; 如果长度小于3,则不做改变

      ;; 更新文字内容
      (setq entdata (subst (cons 1 newtext) (assoc 1 entdata) entdata)) ; 替换原始数据中的文字内容
      (entmod entdata) ; 更新对象
      )
      (princ "\n处理完成!") ; 打印处理完成信息
    )
    (princ "\n没有选择任何文字.") ; 如果选择对象集合为空,则打印未选择任何文字信息
)
(princ) ; 返回空值
)







kozmosovia 发表于 2024-7-7 11:44:10

(Defun c:TT (/ _AddSpacerbar ENAME ENTDATA N NEWTEXT SSLST TEXTSTR)
(Defun _AddSpacerbar (txt / HEAD LEN NUM)
    (setq txt (vl-string->list txt)
          len 0
    )
    (while (< len 3)
      (setq num (car txt))
      (cond ((> num 128)
             (setq head        (append head (list num (cadr txt)))
                   txt        (cddr txt)
             )
          )
          ((= num (cadr txt) 37)
             (setq head        (append head (list num (cadr txt) (caddr txt)))
                   txt        (cdddr txt)
             )
          )
          (t
             (setq head        (append head (list num))
                   txt        (cdr txt)
             )
          )
      )
      (setq len (1+ len))
    )
    (strcat (vl-list->string head)
          ""
          (vl-list->string txt)
    )
)
(prompt "\n选择需要处理的文字: ")        ; 提示用户选择文字
(setq sslst (ssget '((0 . "TEXT,MTEXT")))) ; 获取选中的文字对象集合

(if sslst                                ; 如果选择对象集合非空
    (progn
      (setq n -1)                        ; 初始化计数器
      (repeat (sslength sslst)                ; 循环处理每一个选中的文字对象
        (setq ename (ssname sslst (setq n (1+ n)))) ; 获取对象名字
        (setq entdata (entget ename))        ; 获取对象的详细数据
        (setq textstr (cdr (assoc 1 entdata))) ; 提取文字内容
        (setq newtext (_AddSpacerbar textstr))
        ;; 更新文字内容
        (setq
          entdata (subst (cons 1 newtext) (assoc 1 entdata) entdata)
        )                                ; 替换原始数据中的文字内容
        (entmod entdata)                ; 更新对象
      )
      (princ "\n处理完成!")                ; 打印处理完成信息
    )
    (princ "\n没有选择任何文字.")        ; 如果选择对象集合为空,则打印未选择任何文字信息
)
(princ)                                ; 返回空值
)

听见天晴 发表于 2024-7-7 13:45:57

kozmosovia 发表于 2024-7-7 12:16
(Defun c:TT (/ _AddSpacerbar ENAME ENTDATA N NEWTEXT SSLST TEXTSTR)
(Defun _AddSpacerbar (txt / H ...

谢谢大佬,程序没问题。只是因为我的图是3D软件画好后转的,那个∅(直径符号)虽然看着一样,但是不是%%C,在单行文字下会变成\U+2205,多行文字下没问题,这个也不影响使用,我批量替换直径符号就好。
大佬我还有个想法,我用这个是分开孔数量和孔规格用的,让人好看一点,能否实现判断,第4个字,是否为数字,如果是的话,就在四4个字后面加两空格,如果不是数字,还是保持原样,在第三个字后加。比如A-12M5螺纹通孔,这种情况,孔有2位数,就可以分成A-12M5螺纹通孔(而不是A-12M5螺纹通孔),大佬如果有空的话麻烦帮忙改一下,谢谢~

kozmosovia 发表于 2024-7-7 16:14:49

(Defun c:TT (/ _AddSpacerbar ENAME ENTDATA N NEWTEXT SSLST TEXTSTR)
(Defun _AddSpacerbar (txt / HEAD LEN NUM)
    (setq txt (vl-string->list txt)
    len 0
    )
    (while (< len 3)
      (setq num (car txt))
      (cond ((> num 128)
       (setq head(append head (list num (cadr txt)))
       txt(cddr txt)
       )
      )
      ((= num (cadr txt) 37)
       (setq head(append head (list num (cadr txt) (caddr txt)))
       txt(cdddr txt)
       )
      )
      (t
       (setq head(append head (list num))
       txt(cdr txt)
       )
      )
      )
      (setq len (1+ len))
    )
    (and (wcmatch (chr (car txt)) "#")
   (setq head (append head (list (car txt)))
         txt(cdr txt)
   )
    )
    (strcat (vl-list->string head)
      ""
      (vl-list->string txt)
    )
)
(prompt "\n选择需要处理的文字: "); 提示用户选择文字
(setq sslst (ssget '((0 . "TEXT,MTEXT")))) ; 获取选中的文字对象集合

(if sslst      ; 如果选择对象集合非空
    (progn
      (setq n -1)      ; 初始化计数器
      (repeat (sslength sslst)    ; 循环处理每一个选中的文字对象
(setq ename (ssname sslst (setq n (1+ n)))) ; 获取对象名字
(setq entdata (entget ename)); 获取对象的详细数据
(setq textstr (cdr (assoc 1 entdata))) ; 提取文字内容
(setq newtext (_AddSpacerbar textstr))
;; 更新文字内容
(setq
    entdata (subst (cons 1 newtext) (assoc 1 entdata) entdata)
)      ; 替换原始数据中的文字内容
(entmod entdata)    ; 更新对象
      )
      (princ "\n处理完成!")    ; 打印处理完成信息
    )
    (princ "\n没有选择任何文字."); 如果选择对象集合为空,则打印未选择任何文字信息
)
(princ)      ; 返回空值
)

听见天晴 发表于 2024-7-7 19:23:42

kozmosovia 发表于 2024-7-7 16:14


非常好用,再次感谢。
页: [1]
查看完整版本: 请大神帮忙看看,左往右指定位数文字后加空格的程序!