请大神帮忙看看,左往右指定位数文字后加空格的程序!
各位大佬好,手上有一个这样的程序,我希望在单行/多行文字中,从左往右数,第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) ; 返回空值
)
(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) ; 返回空值
) 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螺纹通孔),大佬如果有空的话麻烦帮忙改一下,谢谢~ (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) ; 返回空值
) kozmosovia 发表于 2024-7-7 16:14
非常好用,再次感谢。
页:
[1]