找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1053|回复: 5

[LISP程序]:用程序修改鼠标指定的字符,支持多选

[复制链接]
发表于 2005-2-3 16:59:30 | 显示全部楼层 |阅读模式

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

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

×
原本此帖发在
http://www.xdcad.net/forum/showt ... 1639959#post1639959
此次增加多选,另发了新贴,斑竹如果以为不妥,还移至原处。
1、支持UCS。
2、可修改TEXT和ATTRIB。
3、支持%%*。可能是%%?,%%??,%%???
4、支持上下标,但要固定,本例中%%151上标开始,%%152上标结束,
%%153下标开始,%%154下标结束,不同的字体修改相应源程序即可。
5、支持汉字及双字节字符。
6、不支持加圈字符。
7、不支持TEXTSTYLE中的upside down,backwards,vertical,oblique angles。
8、使用了vl-remove函数,R14不能用。
9、在eachy的帮助下,如果程序被强行中断,去处新生成的实体。
10、支持框选,框选的边界要压到两侧字符上
11、以亮显方式显示修改字符。对不同SHX的不同被选字符有时会错位,
    这是定义SHP时造成的,例如“1”,定义SHP时,
    是在左侧加一些空白区还是在右侧加一些空白区,或者不加,这将会造成错位,
    我的算法是从左向右算所选字符结束点,也试了XD的$xdlsp_text_position的算法,
    是总宽减去所选字符后面宽度,都存在问题。我觉得这个问题也可以解决,像
    它山之石朋友的做法,每次都使用entmod更新,定位会准,但耗时,如果TEXT很长
    可以看到从头到位的变颜色。
12、多选时支持空格。

2005.2.5
  11的定位不准的问题已解决,代码及附件已更新。



  1. (defun c:aaa (/ obj obj-name pt-select dxfdata text-value-old dxfdata-2 obj-2 dxfdata-3
  2.               list-whichchar-charlen-supersubscript which-char-main char-len-main
  3.               super-sub-script-main newstr text-value-new
  4.               layer iflock dxflayer dxflayer2 get-whichchar-charlen-supersubscript k
  5.               pt-select-1 pt-select-2 pt-temp dxfdata-4
  6.               which-char-main-1 char-len-main-1  super-sub-script-main-1 which-char-main-2
  7.               *error* msg list-error olderror
  8.               text-angle-main pt-left-1 pt-left-2 pt-right-textbox text-modify)
  9. (defun *error*  (msg / n)
  10. (setq n 0)
  11. (if (= msg  "Function cancelled")
  12.    (if (/=  list-error nil)
  13.       (repeat (length list-error)
  14.          (entdel (nth n list-error))
  15.          (setq n (1+ n))
  16.       )
  17.    )
  18. )
  19. (setq *error* olderror)
  20. )            

  21. (defun get-whichchar-charlen-supersubscript (pt-select-sub dxfdata-sub
  22.    / pt-left text-angle text-value loop which-char char-len box-1 box-2 str-wid
  23.      pt-dummy-1 pt-dummy-2 pt-dummy dist box super-sub-script)
  24. (setq pt-left (cdr (assoc 10 dxfdata-sub)))
  25. (setq text-angle (cdr (assoc 50 dxfdata-sub)))
  26. (setq text-value (cdr (assoc 1 dxfdata-sub)))
  27. (setq which-char 0)
  28. (setq loop t)
  29. (setq super-sub-script "")

  30. (setq pt-dummy-1 (polar pt-left text-angle 100.0))
  31. (setq pt-dummy-2 (polar pt-select-sub (+ (/ pi 2.0) text-angle) 100.0))
  32. (setq pt-dummy (inters pt-left pt-dummy-1 pt-select-sub pt-dummy-2 nil))
  33. (setq dist (distance pt-left pt-dummy))

  34. (while loop
  35.    (setq char-len 1)

  36.    (if (wcmatch (substr text-value (+ 1 which-char) 5) "%%*");if1
  37.    (if (wcmatch (substr text-value (+ 1 which-char) 5) "%%[0-9][0-9][0-9]")
  38.       (setq char-len 5)
  39.       (if (wcmatch (substr text-value (+ 1 which-char) 5) "%%[0-9][0-9][~0-9]")
  40.          (setq char-len 4)
  41.          (if (and (wcmatch (substr text-value (+ 1 which-char) 5) "%%[0-9][0-9]")
  42.                   (= 4 (strlen (substr text-value (+ 1 which-char) 5))))
  43.             (setq char-len 4)
  44.             (setq char-len 3)
  45.          )
  46.       )
  47.    )
  48.    );if1

  49.    ;%%151--start of superscript
  50.    ;%%152--end of superscript
  51.    ;%%153--start of subscript
  52.    ;%%154--end of subscript
  53.    ;%%155--start of subscript
  54.    ;%%156--end of subscript
  55.    (if (wcmatch (substr text-value (+ 1 which-char) 5) "%%151,%%152,%%153,%%154,%%155,%%156")
  56.        (setq super-sub-script (strcat super-sub-script (substr text-value (+ 1 which-char) 5))))

  57.    (if (> (ascii (substr text-value (+ 1 which-char) 1)) 159);if2
  58.       (setq char-len 2)
  59.    );if2

  60.    (setq which-char (+ which-char char-len))
  61.    
  62.    (setq box-1 (textbox (subst (cons 1 (strcat "A" (substr text-value 1 which-char) "A"))
  63.                                (assoc 1 dxfdata-sub) dxfdata-sub)))
  64.    (setq box-2 (textbox (subst (cons 1 (strcat "A" super-sub-script "A")) (assoc 1 dxfdata-sub) dxfdata-sub)))
  65.    (setq str-wid (abs (- (- (car (car box-1)) (car (cadr box-1)))(- (car (car box-2)) (car (cadr box-2))))))
  66.       
  67.    (if (> str-wid dist)(setq loop nil))
  68.    
  69. );while
  70.    
  71. (list which-char char-len super-sub-script)
  72. );defun-sub


  73. (setq olderror *error*)
  74. (setq list-error '())
  75. (command "undo" "be")
  76. (setq k t)
  77. (if (setq obj (nentsel "\npick a char to modify / <exit>:")) ;if0
  78.    (progn;0
  79.       (setq obj-name (car obj) pt-select (cadr obj))
  80.       (setq pt-select (trans pt-select 1 0))
  81.       (setq dxfdata (entget obj-name))
  82.       (setq text-value-old (cdr (assoc 1 dxfdata)))
  83.       (if (wcmatch (cdr (assoc 0 dxfdata)) "TEXT,ATTRIB");if1
  84.          (progn;1
  85.             (setq dxfdata-2 dxfdata)
  86.             (if (= "TEXT" (cdr (assoc 0 dxfdata-2)))
  87.                (progn
  88.                   (if (= 4 (cdr (assoc 70 (tblsearch "layer" (cdr (assoc 8 dxfdata))))))
  89.                      (progn  (alert "object is on a locked layer !")(exit)))
  90.                   
  91.                   (entmake dxfdata-2)
  92.                );progn
  93.             );if
  94.             (if (= "ATTRIB" (cdr (assoc 0 dxfdata-2)))
  95.                (progn
  96.                   (if (= 4 (cdr (assoc 70 (tblsearch "layer" (cdr (assoc 8 (entget (cdr (assoc 330 dxfdata)))))))))
  97.                      (progn  (alert "object is on a locked layer !")(exit)))
  98.                   
  99.                   (setq dxfdata-2 (subst (cons 0 "TEXT") (assoc 0 dxfdata-2) dxfdata-2))
  100.                   (setq dxfdata-2 (vl-remove (assoc 2  dxfdata-2) dxfdata-2))
  101.                   (setq dxfdata-2 (vl-remove (assoc 70 dxfdata-2) dxfdata-2))
  102.                   (setq dxfdata-2 (vl-remove (assoc 74 dxfdata-2) dxfdata-2))
  103.                   (entmake dxfdata-2)
  104.                )
  105.             );if
  106.             (setq text-angle-main (cdr (assoc 50 dxfdata-2)))
  107.             (setq pt-left-1 (cdr (assoc 10 dxfdata-2)))
  108.             (setq obj-2 (entlast))
  109.             (setq list-error (cons obj-2 list-error))
  110.             (setq dxfdata-3 (entget obj-2))
  111.             (setq dxfdata-4 dxfdata-3)
  112.             (setq dxfdata-3 (subst (cons 72 0) (assoc 72 dxfdata-3) dxfdata-3))
  113.             (setq dxfdata-3 (subst (cons 73 0) (assoc 73 dxfdata-3) dxfdata-3))
  114.             (setq dxfdata-4 (subst (cons 72 0) (assoc 72 dxfdata-4) dxfdata-4))
  115.             (setq dxfdata-4 (subst (cons 73 0) (assoc 73 dxfdata-4) dxfdata-4))
  116.             
  117.             (setq list-whichchar-charlen-supersubscript
  118.                  (get-whichchar-charlen-supersubscript pt-select dxfdata-3))
  119.             (setq which-char-main       (car    list-whichchar-charlen-supersubscript))
  120.             (setq char-len-main         (cadr   list-whichchar-charlen-supersubscript))
  121.             (setq super-sub-script-main (caddr  list-whichchar-charlen-supersubscript))
  122.                         
  123.             (setq pt-right-textbox (polar pt-left-1 text-angle-main (caadr (textbox
  124.                        (subst (cons 1 (substr text-value-old 1  which-char-main))
  125.                                        (assoc 1 dxfdata-3) dxfdata-3)))))
  126.             (setq text-modify (substr text-value-old (+ 1 (- which-char-main char-len-main)) char-len-main))
  127.             (setq pt-left-2 (polar pt-right-textbox (+ pi text-angle-main) (caadr (textbox
  128.                 (subst (cons 1 (strcat super-sub-script-main text-modify))(assoc 1 dxfdata-3) dxfdata-3)))))
  129.             (setq dxfdata-3 (subst (cons 1 (strcat super-sub-script-main text-modify))(assoc 1 dxfdata-3) dxfdata-3))
  130.             (setq dxfdata-3 (subst (cons 10 pt-left-2) (assoc 10 dxfdata-3) dxfdata-3))
  131.             (entmod dxfdata-3)
  132.             (redraw (cdr (assoc -1 dxfdata-3)) 3)            
  133.             
  134.             (setq newstr (getstring (strcat "\nenter to multiple or remove / [" text-modify "]:")))
  135.    
  136.             (if (/= "" newstr)
  137.                (setq text-value-new (strcat (substr text-value-old 1 (- which-char-main char-len-main))
  138.                                                      newstr
  139.                                             (substr text-value-old (+ 1 which-char-main))
  140.                                             ));setq text-value
  141.             );if

  142.             (if (= "" newstr);if2
  143.                (progn
  144.                   (redraw (cdr (assoc -1 dxfdata-3)) 4)
  145.                   (initget "Remove")
  146.                   (setq k (getpoint "\nRemove / <multiple first corner>:"))

  147.                   (if (= k "Remove")
  148.                      (setq text-value-new (strcat (substr text-value-old 1 (- which-char-main char-len-main))
  149.                                                    (substr text-value-old (+ 1 which-char-main))
  150.                                          ));setq text-value
  151.                   );if
  152.                   
  153.                   (if (= 'list (type k));if5
  154.                      (progn;5
  155.                         (setq pt-select-1 k)
  156.                         (initget 32)
  157.                         (setq k (getcorner pt-select-1 "\nmultiple second corner:"))
  158.                
  159.                         (if (= 'list (type k));if8
  160.                            (progn;8
  161.                               (setq pt-select-2 k)
  162.                               (setq pt-select-1 (trans pt-select-1 1 0))
  163.                               (setq pt-select-2 (trans pt-select-2 1 0))
  164.                               (if (> (car pt-select-1)(car pt-select-2))
  165.                                  (progn
  166.                                     (setq pt-temp pt-select-1)
  167.                                     (setq pt-select-1 pt-select-2)
  168.                                     (setq pt-select-2 pt-temp)
  169.                                  )
  170.                               )

  171.                               (setq list-whichchar-charlen-supersubscript
  172.                                    (get-whichchar-charlen-supersubscript pt-select-1 dxfdata-4))
  173.                               (setq which-char-main-1       (car    list-whichchar-charlen-supersubscript))
  174.                               (setq char-len-main-1         (cadr   list-whichchar-charlen-supersubscript))
  175.                               (setq super-sub-script-main-1 (caddr  list-whichchar-charlen-supersubscript))
  176.                               (setq list-whichchar-charlen-supersubscript
  177.                                    (get-whichchar-charlen-supersubscript pt-select-2 dxfdata-4))
  178.                               (setq which-char-main-2       (car    list-whichchar-charlen-supersubscript))
  179.                                                          
  180.                               (setq pt-right-textbox (polar pt-left-1 text-angle-main (caadr (textbox
  181.                                           (subst (cons 1 (substr text-value-old 1  which-char-main-2))
  182.                                        (assoc 1 dxfdata-4) dxfdata-4)))))
  183.                               (setq text-modify (substr text-value-old (+ 1 (- which-char-main-1 char-len-main-1))
  184.                                                (abs (- which-char-main-2 (- which-char-main-1 char-len-main-1)))
  185.                                            ))
  186.                               (setq pt-left-2 (polar pt-right-textbox (+ pi text-angle-main) (caadr (textbox
  187.                                  (subst (cons 1 (strcat super-sub-script-main-1 text-modify))
  188.                                         (assoc 1 dxfdata-4) dxfdata-4)))))
  189.                               (setq dxfdata-3 (subst (cons 1 (strcat super-sub-script-main-1 text-modify))
  190.                                               (assoc 1 dxfdata-4) dxfdata-4))
  191.                               (setq dxfdata-3 (subst (cons 10 pt-left-2) (assoc 10 dxfdata-3) dxfdata-3))
  192.                               (entmod dxfdata-3)
  193.                               (redraw (cdr (assoc -1 dxfdata-3)) 3)            
  194.                        
  195.                               (setq newstr (getstring (strcat "\nenter to modify to remove / [" text-modify "]:")))
  196.                              
  197.                               (if (/= "" newstr)
  198.                                  (setq text-value-new (strcat (substr text-value-old 1 (- which-char-main-1 char-len-main-1))
  199.                                                          newstr
  200.                                                (substr text-value-old (+ 1 which-char-main-2))
  201.                                                ));setq text-value
  202.                                  )
  203.                               (if (= "" newstr)
  204.                                  (progn
  205.                                     (initget "Remove")
  206.                                     (setq k (getkword "\nRemove?"));k/=k
  207.                                     (if (= k "Remove")
  208.                                     (setq text-value-new (strcat (substr text-value-old 1 (- which-char-main-1 char-len-main-1))
  209.                                                                         (substr text-value-old (+ 1 which-char-main-2))
  210.                                                            ));setq text-value
  211.                                     )
  212.                                  )
  213.                               );if
  214.                            );progn8
  215.                         );if8
  216.                      );progn5
  217.                   );if5
  218.                );progn
  219.             );if2
  220.             ;-------------------------------------------------
  221.                (if (/= k nil);if9
  222.                (progn;9
  223.                   (setq dxfdata (subst (cons 1 text-value-new) (assoc 1 dxfdata) dxfdata))
  224.                   (if (= "TEXT" (cdr (assoc 0 dxfdata)))
  225.                      (entmake dxfdata)
  226.                   );if
  227.                   (if (= "ATTRIB" (cdr (assoc 0 dxfdata)))
  228.                      (progn
  229.                         (setq layer (cdr (assoc 8 dxfdata)))
  230.                         (setq iflock 0)
  231.                         (if (= 4 (cdr (assoc 70 (tblsearch "layer" layer))))
  232.                            (progn
  233.                               (setq iflock 1)
  234.                               (setq dxflayer (entget (tblobjname "layer" layer)))
  235.                               (setq dxflayer2 dxflayer)
  236.                               (setq dxflayer (subst (cons 70 0) (assoc 70 dxflayer) dxflayer))
  237.                               (entmod dxflayer)
  238.                            )
  239.                         )
  240.                   
  241.                         (entmod dxfdata)
  242.                         (entupd (cdr (assoc 330 dxfdata)))
  243.                                     
  244.                      );progn
  245.                   );if
  246.                   (entdel (cdr (assoc -1 dxfdata-2)))
  247.                );progn9
  248.             );if9
  249.             (entdel (cdr (assoc -1 dxfdata-3)))
  250.             (if (= 1 iflock)(entmod dxflayer2))         
  251.          );progn1
  252.          (alert "\nselected object is not a TEXT or a ATTRIB !")
  253.       );if1
  254.    );progn0
  255.    (princ "\nno object is selected !")
  256. );if0
  257. (command "undo" "end")
  258. (setq *error* olderror)
  259. (princ)
  260. );defun
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-2-4 08:24:35 | 显示全部楼层
俺们的那个程序已经好久没有更新了。试试你的这个先。共同做出更好的程序。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2005-2-5 11:11:17 | 显示全部楼层
个人很反对改标注中的字符,稍有错位时我宁可改标注的定义点,这样打印是看不出,又可以使用stretch命令。如果楼上很需要,倒是可以加上。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-2-7 12:31:26 | 显示全部楼层
用了一下,感觉满不错的。
可我在ACAD里边用字符很少,一般用FIND 指令。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-11-17 09:49:28 | 显示全部楼层
我试用了,提几个建议:1.象它山之石的程序改钢筋符号时直接输入1,2,3等改钢筋等级。2.
程序被强行中断,新生成的实体还在。3.多选和删除效率不高,可改成未选中字即默认为多选窗和选中字符后回车直接删除。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 09:50 , Processed in 0.423520 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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