明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 572|回复: 4

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

[复制链接]
发表于 2024-7-7 11:44:09 | 显示全部楼层 |阅读模式
5明经币
各位大佬好,手上有一个这样的程序,我希望在单行/多行文字中,从左往右数,第3个字后面加2个空格,目前遇到的问题是第3个字是字母,数字,的时候没问题,但是第3个字是特殊符号,汉字的时候,就出现问题了,可能因为是符号,汉字不止一个字符?我不知道怎么去区分开这个。有没有大佬能帮忙修改一下,要求就是单行、多行文字下,批量框选后,都在第3个字后面加2个空格,无论第3个字是什么,谢谢~
如果不能实现就做把第3个字符是φ的时候不拆成%  %c吧,从φ后面开始分,谢谢

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

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

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

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

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







附件: 您需要 登录 才可以下载或查看,没有账号?注册

最佳答案

查看完整内容

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

使用道具 举报

发表于 2024-7-7 16:14:49 | 显示全部楼层
  1. (Defun c:TT (/ _AddSpacerbar ENAME ENTDATA N NEWTEXT SSLST TEXTSTR)
  2.   (Defun _AddSpacerbar (txt / HEAD LEN NUM)
  3.     (setq txt (vl-string->list txt)
  4.     len 0
  5.     )
  6.     (while (< len 3)
  7.       (setq num (car txt))
  8.       (cond ((> num 128)
  9.        (setq head  (append head (list num (cadr txt)))
  10.        txt  (cddr txt)
  11.        )
  12.       )
  13.       ((= num (cadr txt) 37)
  14.        (setq head  (append head (list num (cadr txt) (caddr txt)))
  15.        txt  (cdddr txt)
  16.        )
  17.       )
  18.       (t
  19.        (setq head  (append head (list num))
  20.        txt  (cdr txt)
  21.        )
  22.       )
  23.       )
  24.       (setq len (1+ len))
  25.     )
  26.     (and (wcmatch (chr (car txt)) "#")
  27.    (setq head (append head (list (car txt)))
  28.          txt  (cdr txt)
  29.    )
  30.     )
  31.     (strcat (vl-list->string head)
  32.       "  "
  33.       (vl-list->string txt)
  34.     )
  35.   )
  36.   (prompt "\n选择需要处理的文字: ")  ; 提示用户选择文字
  37.   (setq sslst (ssget '((0 . "TEXT,MTEXT")))) ; 获取选中的文字对象集合

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

评分

参与人数 1明经币 +1 收起 理由
bssurvey + 1 赞一个!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2024-7-7 19:23:42 | 显示全部楼层

非常好用,再次感谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 13:54 , Processed in 0.170819 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表