找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4484|回复: 21

[LISP程序]:超级拆分修改文字

[复制链接]
发表于 2006-8-20 13:30:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
程序大意:点取一个文字(最好是TSSD字体,其他字体不敢保证正确),程序将文字按文字类型拆开(如数字汉字、特殊钢筋符号、逗号、句号等),然后再点取其中的一部分进行修改,修改完后右键结束,文字变成局部修改后的新的文字,比如我要修改KL-1(2) 250X500中的梁编号,先点取这个文字,然后再点取“1”,改成23,则最终文字变成KL-23(2) 250X500。不过这个代码还有问题需要解决,即:文字断开后会出现与原文字对不上的尴尬,我特别想实现TSSD中拆分文字的那种效果,只是苦于没找到方法,请高手支招,感谢之致。本程序与本论坛中的ddt命令很相似,不过我认为我这个更好。

  1. (defun c:g (/              numextra        extrastr  strlist   strlist1  wz
  2.             obj              objlist        neirong          pselect   angtext   ptext
  3.             key              key0        num          neirong1  i              j
  4.             k              findindex        stri          numi            type1     type2
  5.             entlist   objlayer        averageL  p1            wz1              obj1
  6.             objlist1  neirong0        neirong1  objent    neirongent
  7.             osvalue   h                templist  htextstyle
  8.            )
  9.                                         ;直接改文字,目前不支持中文
  10.   (prompt "文字内容分拆修改")
  11.   (setq        extrastr (list "%%130"          "%%131"    "%%132"        "%%133"
  12.                        "%%134"          "%%135"    "%%136"        "%%137"
  13.                        "%%138"          "%%139"    "%%140"        "%%141"
  14.                        "%%142"          "%%143"    "%%144"        "%%145"
  15.                        "%%146"          "%%147"    "%%u"        "%%U"
  16.                        "%%o"          "%%O"             "%%150"        "%%151"
  17.                        "%%152"          "%%153"    "%%154"        "%%155"
  18.                        "%%156"          "%%157"    "%%158"        "%%159"
  19.                        "%%200"          "%%201"    "%%202"        "%%203"
  20.                        "%%204"          "%%205"    "%%p"        "%%P"
  21.                        "%%c"          "%%C"             "%%d"        "%%D"
  22.                       )
  23.   )                                        ;特殊字符,此表内的元素应互异
  24.   (setq oldstatus (dyq-get-oldstatus))
  25.   (setvar "OSMODE" 0)
  26.   (setq i 1)
  27.   (while (< i 46)
  28.     (setq extrastr (cons (chr i) extrastr))
  29.     (setq i (+ i 1))
  30.   )
  31.   (setq extrastr (cons "/" extrastr))
  32.   (setq i 58)
  33.   (while (< i 65)
  34.     (setq extrastr (cons (chr i) extrastr))
  35.     (setq i (+ i 1))
  36.   )
  37.   (setq i 91)
  38.   (while (< i 97)
  39.     (setq extrastr (cons (chr i) extrastr))
  40.     (setq i (+ i 1))
  41.   )
  42.   (setq i 123)
  43.   (while (< i 127)
  44.     (setq extrastr (cons (chr i) extrastr))
  45.     (setq i (+ i 1))
  46.   )

  47.   (defun wideofstring (str / a p1 p2 l)
  48.     (setq a (textbox (list (cons 1 str))))
  49.     (setq p1 (car a))
  50.     (setq p2 (cadr a))
  51.     (setq l (- (car p2) (car p1)))
  52.   )

  53.   (defun judgetype (s / ascNoi typestr)        ;判断单字符s的类型:数字1、大小写字母2、其他3
  54.     (setq ascNoi (ascii s))
  55.     (cond ((and (>= ascNoi 48) (<= ascNoi 57)) (setq typestr 1))
  56.           ((or (and (>= ascNoi 65) (<= ascNoi 90))
  57.                (and (>= ascNoi 97) (<= ascNoi 122))
  58.            )
  59.            (setq typestr 2)
  60.           )
  61.           ((> ascNoi 160)
  62.            (setq typestr 4)
  63.           )
  64.           (t (setq typestr 3))
  65.     )
  66.     (if        (= ascNoi 46)
  67.       (setq typestr 1)
  68.     )
  69.     typestr
  70.   )

  71.   (setq numextra (length extrastr))        ;extrastr表的元素的数目
  72.   (vl-load-com)
  73.   (setq strlist (list "string"))        ;存储分割开后的文字内容
  74.   (if (setq wz (entsel "\n请选择要修改的文字:"))
  75.                                         ;增加判断文字类型机制
  76.     (progn
  77.                                         ;首先把TSSD里的特殊字符给柃出来
  78.       (setq obj (car wz))
  79.       (setq objlist (entget obj))
  80.       (setq neirong (cdr (assoc '1 objlist))) ;文字内容
  81.       (setq neirong (dyq-string-subst "?" " " neirong))
  82.                                         ;用?来代替空格,没办法,只能牺牲?了
  83.       (setq objlist (subst (cons 1 neirong) (assoc '1 objlist) objlist))
  84.       (setq h (cdr (assoc '40 objlist))) ;文字高度
  85.       (setq htextstyle
  86.              (cdr (assoc '40
  87.                          (tblsearch "style" (getvar "TEXTSTYLE"))
  88.                   )
  89.              )
  90.       )
  91.       (if (< htextstyle 0.001)
  92.         (progn (command "-style" "" "" 300 0.7 0 "" "" "")
  93.                (setq htextstyle 300)
  94.         )
  95.       )
  96.       (setq pselect (cadr wz))                ;选择文字时的选择点
  97.       (setq angtext (cdr (assoc '50 objlist))) ;文字的角度
  98.       (setq ptext (cdr (assoc '10 objlist))) ;文字的左插入点
  99.       (setq objlayer (cdr (assoc '8 objlist))) ;文字的图层
  100.       (setq key 1)                        ;指针
  101.       (setq key0 1)
  102.       (setq num (strlen neirong))        ;文字的长度
  103.       (while (<= key num)
  104.         (setq neirong1 (substr neirong key))
  105.         (setq i 0)
  106.         (setq findindex -1)
  107.         (repeat        numextra
  108.           (if (= (vl-string-search (nth i extrastr) neirong1) 0)
  109.             (setq findindex i)
  110.           )
  111.           (setq i (+ i 1))
  112.         )
  113.         (if (> findindex -1)                ;如果搜索到特殊字符在第一的位置
  114.           (progn
  115.             (if        (/= key0 key)
  116.               (setq
  117.                 strlist        (cons (substr neirong key0 (- key key0))
  118.                               strlist
  119.                         )
  120.               )
  121.             )                                ;连续的非特殊符号,如%%1308@100/200(2)中的100或200
  122.             (setq strlist (cons (nth findindex extrastr) strlist))
  123.                                         ;将特殊符号加入strlist
  124.             (setq key (+ key (strlen (nth findindex extrastr))))
  125.                                         ;key跳到下一个非特殊符号的地方
  126.             (setq key0 key)
  127.           )
  128.           (setq key (+ key 1))
  129.         )
  130.       )
  131.       (if (/= key0 key)                        ;处理尾巴
  132.         (setq strlist (cons (substr neirong key0 (- key key0))
  133.                             strlist
  134.                       )
  135.         )
  136.       )
  137.       (setq strlist (reverse strlist))        ;将表转置
  138.                                         ;以下处理表内连续的字母、数字、汉字的情况,如G0.4、22本跨通长、G本跨通长、G42本跨通长的情况
  139.       (setq num (length strlist))
  140.       (setq strlist1 (list "string"))
  141.       (setq i 1)
  142.       (repeat (- num 1)
  143.         (setq stri (nth i strlist))        ;第i个元素内容
  144.         (if (member stri extrastr)        ;如果是特殊字符
  145.           (setq strlist1 (cons stri strlist1))
  146.                                         ;不作处理,直接调走
  147.           (progn                        ;如果不是特殊字符
  148.             (setq numi (strlen stri))        ;第i个元素的字符长度
  149.             (setq j 1)
  150.             (while (<= j numi)
  151.               (setq type1 (judgetype (substr stri j 1)))
  152.                                         ;第一个字符的类型
  153.               (setq key T)
  154.               (setq k (+ j 1))
  155.               (while key
  156.                 (setq type2 (judgetype (substr stri k 1)))
  157.                 (if (= type2 type1)
  158.                   (setq k (+ k 1))
  159.                   (setq key nil)
  160.                 )
  161.               )
  162.               (setq
  163.                 strlist1 (cons (substr stri j (- k j)) strlist1)
  164.               )
  165.               (setq j k)
  166.             )
  167.           )
  168.         )
  169.         (setq i (+ i 1))
  170.       )
  171.       (setq strlist (reverse strlist1))
  172.       (setq i 1)
  173.       (setq ll 0)
  174.       (setq num (length strlist))
  175.       (repeat (- num 1)
  176.         (if (wcmatch (nth i strlist) "%%###")
  177.           (setq ll (+ ll 1))
  178.           (setq ll (+ ll (strlen (nth i strlist))))
  179.         )
  180.         (setq i (+ i 1))
  181.       )
  182.       (setq num (length strlist))
  183.       (setq p1 ptext)
  184.       (setq entlist (list "entlist"))
  185.                                         ;用copy,先求尾巴之前的长度、坐标
  186.       (setq i 1)
  187.       (repeat (- num 1)
  188.         (setq j 1)
  189.         (setq neirong "")
  190.         (repeat        (- i 1)
  191.           (setq neirong (strcat neirong (nth j strlist)))
  192.           (setq j (+ j 1))
  193.         )
  194.         (setq
  195.           objlist (subst (cons 1 neirong) (assoc '1 objlist) objlist)
  196.         )
  197.         (entmod objlist)                ;将原文字改成
  198.         (setq wideofstring1 (dyq-get-wide-string obj))
  199.         (setq
  200.           objlist (subst (cons 1 (nth i strlist)) (assoc '1 objlist) objlist)
  201.         )
  202.         (entmod objlist)
  203.         (command "copy"
  204.                  obj
  205.                  ""
  206.                  p1
  207.                  (polar p1 angtext wideofstring1)
  208.         )
  209.         (setq entlist (cons (entlast) entlist))
  210.         (setq i (+ i 1))
  211.       )
  212.       (setq
  213.         objlist        (subst (cons 1 "") (assoc '1 objlist) objlist)
  214.       )
  215.       (entmod objlist)                        ;将原文字清空

  216.       (setq entlist (reverse entlist))
  217.       (while (setq wz1 (entsel "\n请选择要修改的部分:"))
  218.         (progn
  219.           (setq obj1 (car wz1))
  220.           (vla-Highlight (vlax-ename->vla-object obj1) :vlax-true)
  221.           (setq objlist1 (entget obj1))
  222.           (setq neirong0 (cdr (assoc '1 objlist1)))
  223.           (if (and (setq neirong1 (getstring "\n修改后的新内容:" T))
  224.                    (/= neirong1 "")
  225.               )
  226.             (progn
  227.               (if (wcmatch neirong1 " ,  ,   ,    ")
  228.                 (setq neirong1 "")
  229.               )
  230.               (if (wcmatch neirong0 "%%13#")
  231.                                         ;如果是钢筋符号则输入0、1、2、3等即可
  232.                 (setq objlist1 (subst (cons 1
  233.                                             (strcat "%%13" neirong1)
  234.                                       )
  235.                                       (assoc '1 objlist1)
  236.                                       objlist1
  237.                                )
  238.                 )
  239.                 (setq objlist1 (subst (cons 1 neirong1)
  240.                                       (assoc '1 objlist1)
  241.                                       objlist1
  242.                                )
  243.                 )
  244.               )
  245.               (entmod objlist1)
  246.             )
  247.             (progn
  248.               (setq objlist1 (subst (cons 1
  249.                                           neirong0
  250.                                     )
  251.                                     (assoc '1 objlist1)
  252.                                     objlist1
  253.                              )
  254.               )
  255.               (entmod objlist1)
  256.             )
  257.           )
  258.         )
  259.       )
  260.                                         ;以下重新连接字符
  261.       (setq neirong "")
  262.       (setq i 1)
  263.       (setq num (length entlist))
  264.       (repeat (- num 1)
  265.         (setq objent (nth i entlist))
  266.         (setq neirongent (cdr (assoc '1 (entget objent))))
  267.         (setq neirong (strcat neirong neirongent))
  268.         (setq i (+ i 1))
  269.       )

  270.       (setq i 1)
  271.       (setq num (length entlist))
  272.       (repeat (- num 1)
  273.         (entdel (nth i entlist))        ;将拆散的字删除
  274.         (setq i (+ i 1))
  275.       )

  276.       (while (> (vl-string-search "?" neirong) -1)
  277.         (setq neirong (vl-string-subst " " "?" neirong))
  278.       )
  279.       (setq objlist (subst (cons 1 neirong) (assoc '1 objlist) objlist))
  280.       (entmod objlist)
  281.     )
  282.   )
  283.   (dyq-put-oldstatus oldstatus)
  284.   (princ)
  285. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 194个

财富等级: 日进斗金

发表于 2006-8-20 13:38:13 | 显示全部楼层
程序可以在CAD任何版本上用?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-8-20 13:48:37 | 显示全部楼层
用find改不行么?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-8-24 15:41:08 | 显示全部楼层
思路很好,但执行后出现“ no function definition: DYQ-GET-OLDSTATUS”,请再看看
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-2 10:37:02 | 显示全部楼层
补上一个函数:
(defun dyq-get-oldstatus (/ oldstatus)        ;存储系统原状态
  (setq oldstatus (list "oldstatus"))
  (setq oldstatus (cons "CLAYER" oldstatus))
  (setq oldstatus (cons (getvar "CLAYER") oldstatus))
  (setq oldstatus (cons "OSMODE" oldstatus))
  (setq oldstatus (cons (getvar "OSMODE") oldstatus))
  (setq oldstatus (cons "ORTHOMODE" oldstatus))
  (setq oldstatus (cons (getvar "ORTHOMODE") oldstatus))
  (setq oldstatus (cons "TEXTSTYLE" oldstatus))
  (setq oldstatus (cons (getvar "TEXTSTYLE") oldstatus))
  (setq oldstatus (cons "TEXTSIZE" oldstatus))
  (setq oldstatus (cons (getvar "TEXTSIZE") oldstatus))
                                        ;当前标注样式要修改
  (setq oldstatus (reverse oldstatus))
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-9-8 17:48:29 | 显示全部楼层
不知是否跟俺签名档里的 屏幕改字 有什么区别

应该是这个:
http://www.xdcad.net/forum/showt ... y=&pagenumber=2
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-9-14 21:43:11 | 显示全部楼层
能将文字拆分成单线形式吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-9-15 17:23:39 | 显示全部楼层
文字变单线,express tools里有
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-1-2 13:59:54 | 显示全部楼层
我的程序不是将文字炸开,而是将"152不不不4564AAAA"拆分成“152  不不不不  4564  AAAA",然后分别修改,比如将152改成180,程序结束后文字就变成"180不不不4564AAAA"了,请大家不要搞错了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-1-17 21:36:00 | 显示全部楼层
还少一个函数:DYQ-STRING-SUBST
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-2-4 15:45:31 | 显示全部楼层
(defun dyq-string-subst
                        (newtext oldtext textstring / n)
                                        ;替换时将革命进行到底,不仅仅是第一个替换
  (while (> (vl-string-search oldtext textstring) -1)
    (setq textstring (vl-string-subst newtext oldtext textstring))
  )
  textstring
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-5-11 01:12:33 | 显示全部楼层
还少一个函数:dyq-get-wide-string
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-12 15:04:14 | 显示全部楼层

补充一个函数

;获得文字的宽度
(defun dyq-get-wide-string (obj / objlist minp maxp)
  (setq objlist (entget obj))
  (command "rotate"
           obj
           ""
           (cdr (assoc '10 objlist))
           (angtos (* -1 (cdr (assoc '50 objlist))) 0 4)
  )
  (vla-getboundingbox
    (vlax-ename->vla-object obj)
    'minp
    'maxp
  )
  (setq minp (vlax-safearray->list minp))
  (setq maxp (vlax-safearray->list maxp))
  (- (car maxp) (car minp))
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-5-14 07:56:06 | 显示全部楼层
看完之后,发现还是等楼主完善后在下来试试看了。希望楼主再接再厉,开发出更好的程序来!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-29 23:11:05 | 显示全部楼层
英雄寂寞,其实我的程序非常实用,本论坛没有识货的人,真是寂寞。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-24 17:28 , Processed in 0.435895 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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