乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 80|回复: 13

[编程交流] 需要帮助才能更改脚本o

[复制链接]

1

主题

7

帖子

6

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:12:40 | 显示全部楼层 |阅读模式
你好
我需要一个脚本在文本字符串中的最后一个数字处添加一个值“n”。如果可能的话,这也适用于块和多重选择。
 
例子:
TT-1530->TT-1890
10-TT-1530->10-TT-1890
 
你能帮我吗?
我不知道如何编辑或写脚本,但我在网上找到了两个脚本
 
第一个脚本:
这个脚本在字符串的第一个数字处添加值,而不是在最后,并且不在块上工作。
 
  1. (defun DXF (code elist)
  2. ; finds the association pair, strips 1st element
  3.    (cdr (assoc code elist))
  4. )
  5. (princ)
  6. (defun c:CEL (/ me ce hl rm bm bmoff dprec i j en ed ety lay ss len etxt wtxt elen pretxt txt posttxt ex ey ez ntxt nz old new nxyz mod)
  7. (prompt "\n\nChange Bench Mark for Annotation Text  v2.2      2/10/93")
  8. ;
  9.   (setq me (getvar "menuecho"))
  10.   (setvar "menuecho" 0)
  11.   (setq ce (getvar "cmdecho"))
  12.   (setvar "cmdecho" 0)
  13.   (setq rm (getvar "regenmode"))
  14.   (setvar "regenmode" 0)
  15.   (setq bm (getvar "blipmode"))
  16.   (setvar "blipmode" 0)
  17. ;  Prompt for bench mark offset
  18.    (print)
  19.    (initget 1)
  20.    (setq bmoff (getreal "\nEnter value for bench mark offset, <0> to exit? "))
  21.    (if (/= bmoff 0)
  22.        (progn
  23.            (initget 1)
  24.             (setq dprec (getint "Enter decimal precision for annotation? "))
  25.             (prompt "\n\nBench Mark Offset value:            ")(princ bmoff)
  26.             (prompt   "\nDecimal precision on annotation:    ")(princ dprec)
  27. ;  Locate text to change and select all text on that layer
  28. ; prompt user to pick text entity
  29.       
  30. ;  Create selection set of all annotation text entities
  31.               (setq ss (ssget (list (cons 0 "TEXT"))))
  32. ;  Process text and modify based on bench mark offset
  33.            (setq i 0
  34.                  mod 0)
  35.            (setq len (sslength ss))
  36.            (while (< i len)
  37.                (setq en (ssname ss i)
  38.                        ed (entget en)
  39.                        txt ""
  40.                        pretxt ""
  41.                        posttxt ""
  42.                        noproc 0)
  43.                    (setq etxt (dxf 1 ed))
  44.                    (setq wtxt etxt)
  45.                  (setq ex (car (dxf 10 ed)))
  46.                  (setq ey (cadr (dxf 10 ed)))
  47.                  (setq ez (caddr (dxf 10 ed)))
  48.                (setq elen (strlen etxt))
  49.                (setq j 1)
  50. ; Locate PRE-text
  51.                (if (not (member (substr etxt j 1) '("1" "2" "3" "4" "5" "6" "7" "8" "9" "0" ".")))
  52.                    (progn
  53.                        (while (< j  (1+ elen))
  54.                            (if (not (member (setq cc (substr etxt j 1)) '("1" "2" "3" "4" "5" "6" "7" "8" "9" "0" ".")))
  55.                                (setq j (1+ j))
  56.                                (progn
  57.                                    (setq pretxt (substr etxt 1 (- j 1)))
  58.                                    (setq etxt (substr etxt j elen))
  59.                                    (setq j (+ elen 2))
  60.                                    (setq noproc 1)
  61.                                );progn
  62.                            );if
  63.                        );while
  64.                        (if (= j (1+ elen))
  65.                            (setq noproc 1)
  66.                        );if
  67.                    );progn
  68.                    (setq pretxt "")
  69.                );if
  70. ;
  71. ; Locate text to modify
  72. ;
  73.                (setq j 1)
  74.                (setq elen (strlen etxt))
  75.                (if (> elen 0)
  76.                    (progn
  77.                        (while (< j  (1+ elen))
  78.                            (if (member (setq cc (substr etxt j 1)) '("1" "2" "3" "4" "5" "6" "7" "8" "9" "0" "."))
  79.                                (setq j (1+ j))
  80.                                (progn
  81.                                    (if (member cc '(""" "\'"))
  82.                                        (progn
  83.                                            (setq noproc 1)
  84.                                            (setq j (1+ elen))
  85.                                        );progn
  86.                                        (progn
  87.                                            (setq txt (substr etxt 1 (- j 1)))
  88.                                            (setq posttxt (substr etxt j elen))
  89.                                            (setq j (1+ elen))
  90.                                        );progn
  91.                                    );if
  92.                                );progn
  93.                            );if
  94.                            (if (= j elen)
  95.                                (progn
  96.                                    (setq txt etxt)
  97.                                    (setq posttxt "")
  98.                                );progn
  99.                            );if
  100.                        );while
  101.                    );progn
  102.                );if
  103. ;
  104. ; Add BM Change
  105. ;
  106.                     (if (= noproc 0)
  107.                         (progn
  108.                             (setq ztxt (rtos (+ (atof txt) bmoff) 2 dprec))
  109.                          (setq ntxt (strcat pretxt ztxt posttxt))
  110.                        (setq nz (+ ez bmoff))
  111. ;
  112. ;  Modifying entity data
  113. ;
  114.                        (setq old (assoc 1 ed))
  115.                        (setq new (cons 1 ntxt))        ; Text value
  116.                        (setq ed (subst new old ed))
  117.                        (setq ed (subst new old ed))
  118.                        (entmod ed)
  119.                        (setq mod (1+ mod))
  120.                    );progn
  121.                    (progn
  122.                    );progn
  123.                );if
  124.                (setq i (+ i 1))
  125.               );while
  126.        ) ;progn
  127. ;
  128. ; result to BM OFFSET = 0
  129. ;
  130.        (prompt "\n\nProgram terminated.  ")
  131.    );endif
  132.    (princ "\n\nThere were ")(princ len)(princ " entities processed and ")
  133.        (princ mod)(princ " entities modified.")
  134. ; reset system variables
  135.    (setvar "regenmode" rm)
  136.    (setvar "blipmode" bm)
  137.    (setvar "cmdecho" ce)
  138.    (setvar "menuecho" me)
  139.    (princ)
  140. ) ;End of CEL

 
 
第二个脚本:
此脚本在字符串上的每个数字处添加值,并添加小数点(不适用于块)
 
  1. (defun c:Text_Inc (/ *error* ParseNumbers uFlag ss)
  2. (vl-load-com)
  3. ;; Lee Mac ~ 10.03.10
  4. (defun *error* (msg)
  5. (setvar 'NOMUTT 0)
  6. (and uFlag (vla-EndUndoMark *doc))
  7. (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
  8. (princ (strcat "\n** Error: " msg " **")))
  9. (princ))
  10. (defun ParseNumbers (str / lst Num Aph x rtn)
  11. ;; Lee Mac ~ 20.09.09
  12. (setq lst (vl-string->list str) Num "" Aph "")
  13. (while (setq x (car lst))
  14. (setq lst (cdr lst))
  15. (cond ( (and (/= "" Num) (= 46 x))
  16. (setq Num (strcat Num (chr x))))
  17. ( (< 47 x 58)
  18. (setq Num (strcat Num (chr x))
  19. rtn (cons Aph rtn) Aph ""))
  20. (t (setq Aph (strcat Aph (chr x))
  21. rtn (cons (read Num) rtn) Num ""))))
  22. (vl-remove nil
  23. (vl-remove "" (reverse (cons Aph (cons (read Num) rtn))))))
  24. (setq *inc* (cond (*inc*) (1.0)))
  25. (setq *inc* (cond ((getreal (strcat "\nSpecify Increment <"
  26. (vl-princ-to-string *inc*) "> : ")))
  27. (*inc*)))
  28. (setq *doc (cond (*doc) ((vla-get-ActiveDocument (vlax-get-acad-object)))))
  29. (setvar 'NOMUTT 1)
  30. (princ "\nSelect Text to Increment <All> : ")
  31. (if (or (ssget "_:L" '((0 . "MTEXT,TEXT")))
  32. (ssget "_X" '((0 . "MTEXT,TEXT"))))
  33. (progn
  34. (setq uFlag (not (vla-StartUndoMark *doc)))
  35. (vlax-for obj (setq ss (vla-get-ActiveSelectionSet *doc))
  36. (vla-put-TextString obj
  37. (apply (function strcat)
  38. (mapcar
  39. (function
  40. (lambda (x) (if (vl-position (type x) '(INT REAL))
  41. (rtos (+ x *inc*) (getvar 'LUNITS) 3) x)))
  42. (ParseNumbers (vla-get-TextString obj))))))
  43. (vla-delete ss)
  44. (setq uFlag (vla-EndUndoMark *doc))))
  45. (setvar 'NOMUTT 0)
  46. (princ))
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 17:17:24 | 显示全部楼层
只有当分隔符类似于您的示例中的“-”并且根本没有经过测试时。。。
 
  1. (defun c:lastattnumaddition ( / f-MR numstrchk ss n i bl str splitstr lastnumber pref newpref newstr attlst )
  2. (vl-load-com)
  3. (defun f-MR ( d s / d1 dl k ss c pl z l )
  4.    (while (and (setq d1 (substr d 1 1)) (/= d1 ""))
  5.      (setq d (substr d 2))
  6.      (setq dl (cons d1 dl))
  7.    )
  8.    (foreach d1 dl
  9.      (setq k -1 ss s)
  10.      (while (and (setq c (substr ss 1 1)) (/= c ""))
  11.        (setq ss (substr ss 2))
  12.        (setq k (1+ k))
  13.        (if (= c d1)
  14.          (setq pl (cons k pl))
  15.        )
  16.      )
  17.    )
  18.    (if pl
  19.      (progn
  20.        (setq pl (vl-sort pl '<))
  21.        (foreach p pl
  22.          (if (null z)
  23.            (setq z 1)
  24.          )
  25.          (setq l (cons (substr s z (1+ (- p z))) l))
  26.          (setq z (+ p 2))
  27.        )
  28.        (setq l (cons (substr s z) l))
  29.        (vl-remove "" (reverse l))
  30.      )
  31.      s
  32.    )
  33. )
  34. (defun numstrchk ( s / ss ssl )
  35.    (while (and (setq ss (substr s 1 1)) (/= ss ""))
  36.      (setq s (substr s 2))
  37.      (setq ssl (cons ss ssl))
  38.    )
  39.    (vl-every '(lambda ( x ) (vl-position x '("0" "1" "2" "3" "4" "5" "6" "7" "8" "9"))) ssl)
  40. )
  41. (prompt "\nSelect blocks to perform operation on...")
  42. (setq ss (ssget "_:L" '((0 . "INSERT") (66 . 1))))
  43. (if ss
  44.    (progn
  45.      (initget 3)
  46.      (setq n (getint "\nSpecify number for addition to last number of blocks attributes : "))
  47.      (repeat (setq i (sslength ss))
  48.        (setq bl (ssname ss (setq i (1- i))))
  49.        (foreach att (append (vlax-invoke (vlax-ename->vla-object bl) 'getattributes) (vlax-invoke (vlax-ename->vla-object bl) 'getconstantattributes))
  50.          (if (not (vl-position att attlst))
  51.            (progn
  52.              (setq str (vla-get-textstring att))
  53.              (if (and
  54.                    (/= str "")
  55.                    (or
  56.                      (and (listp (f-MR "/" str)) (listp (f-MR "-" (car (f-MR "/" str)))) (numstrchk (last (f-MR "-" (car (f-MR "/" str))))))
  57.                      (and (listp (f-MR "/" str)) (= (type (f-MR "-" (car (f-MR "/" str)))) 'str) (numstrchk (f-MR "-" (car (f-MR "/" str)))))
  58.                      (and (= (type (f-MR "/" str)) 'str) (listp (f-MR "-" str)) (numstrchk (last (f-MR "-" str))))
  59.                    )
  60.                  )
  61.                (progn
  62.                  (setq splitstr (f-MR "/" str))
  63.                  (if (listp splitstr)
  64.                    (progn
  65.                      (setq pref (car splitstr))
  66.                      (setq pref (f-MR "-" pref))
  67.                      (if (listp pref)
  68.                        (progn
  69.                          (setq lastnumber (last pref))
  70.                          (setq lastnumber (itoa (+ (atoi lastnumber) n)))
  71.                          (setq pref (reverse (cons lastnumber (cdr (reverse pref)))))
  72.                          (setq newpref "")
  73.                          (foreach s (reverse pref)
  74.                            (setq newpref (strcat s "-" newpref))
  75.                          )
  76.                          (setq newpref (vl-string-right-trim "-" newpref))
  77.                          (setq newstr (strcat newpref "/" (last splitstr)))
  78.                        )
  79.                        (progn
  80.                          (setq lastnumber (itoa (+ (atoi pref) n)))
  81.                          (setq newstr (strcat lastnumber "/" (last splitstr)))
  82.                        )
  83.                      )
  84.                    )
  85.                    (progn
  86.                      (setq splitstr (f-MR "-" splitstr))
  87.                      (if (listp splitstr)
  88.                        (progn
  89.                          (setq lastnumber (last splitstr))
  90.                          (setq lastnumber (itoa (+ (atoi lastnumber) n)))
  91.                          (setq splitstr (reverse (cons lastnumber (cdr (reverse splitstr)))))
  92.                          (setq newstr "")
  93.                          (foreach s (reverse splitstr)
  94.                            (setq newstr (strcat s "-" newstr))
  95.                          )
  96.                          (setq newstr (vl-string-right-trim "-" newstr))
  97.                        )
  98.                      )
  99.                    )
  100.                  )
  101.                  (vla-put-textstring att newstr)
  102.                  (setq attlst (cons att attlst))
  103.                )
  104.              )
  105.            )
  106.          )
  107.        )
  108.      )
  109.    )
  110. )
  111. (princ)
  112. )
M.R。
回复

使用道具 举报

1

主题

7

帖子

6

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:26:09 | 显示全部楼层
谢谢你的回答。
 
我刚才测试了一下,发现了这个错误:
 
; 错误:没有函数定义:VLA-PUT-TEXTSTREING
 
ps:有没有机会让它也适用于正常的文本字符串?
 
对不起,我英语不好。
 
安德里亚。
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 17:28:32 | 显示全部楼层
我看到那个打字错误。。。似乎你在我第一次发布时就抓到了代码,然后我纠正了。。。也许现在再次尝试抓取。。。你说的普通文本字符串是什么意思?这将是非常相似的,但我建议另一个lisp基于我的帖子。。。现在自己试穿,你有一些东西要开始。。。如果你被困在某个地方,请报告并发布代码以进行修订。。。
 
M、 R。
回复

使用道具 举报

1

主题

7

帖子

6

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:35:31 | 显示全部楼层
我从不用Lisp程序的语言写作,我很快就会开始。我只写了C,C++,Java,Visual Basic,HTML。对于字符串,我认为文本包含字母、数字和符号。我必须编辑文本框和框的属性。原谅误解。
 
你知道好的lisp手册读吗?还是学习指南?
 
安德莉亚
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 17:39:04 | 显示全部楼层
以下是最近的类似请求:
https://www.theswamp.org/index.php?topic=51989.0
 
您好,M.R。
回复

使用道具 举报

1

主题

7

帖子

6

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:41:10 | 显示全部楼层
你好
马尔科·里巴。
 
我今天试了一下你的Script,我可以看到:
 
-

                               
登录/注册后可看大图

 
-不要在

                               
登录/注册后可看大图

 
-选择“多个对象”时,脚本仅更改最后选择的对象。
 
很抱歉再次打扰你,你能再帮我一次吗?
我认为我不能及时阅读和学习手册,我需要这个宏才能工作。
 
谢谢你。
亲切的问候
安德莉亚
回复

使用道具 举报

1

主题

7

帖子

6

银币

初来乍到

Rank: 1

铜币
5
发表于 2022-7-5 17:47:12 | 显示全部楼层
你好
马尔科·里巴。
 
我今天试了一下你的Script,我可以看到:
 
-关于“块参考”的工作
 
-不要处理“文本”
 
-选择“多个对象”时,脚本仅更改最后选择的对象。
 
很抱歉再次打扰你,你能再帮我一次吗?
我认为我不能及时阅读和学习手册,我需要这个宏才能工作。
 
谢谢你。
亲切的问候
安德莉亚
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 17:52:36 | 显示全部楼层
我已经更新了我以前的代码,并尝试此文本。。。
 
[code](defun c:lasttxtnumaddition(/f-MR ss n i txt str splitstr lastnumber pref newpref newstr)(vl load com)(defun f-MR(d s/d1 dl k ss c pl z l)(while(and(setq d1(substr d 1))(/=d1“”)(setq d(substr d 2))(setq dl(cons d1 dl))(foreach d1 dl(setq k-1 ss s)(while(and(setq c(substr ss 1))(/=c“”)(setq ss(substr ss 2))(setq k(1+k))(if(=c d1)(setq pl(cons k pl))))(if pl(progn(setq pl(vl sort pl)'
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 17:54:36 | 显示全部楼层
Andrea,你能上传DWG显示之前的情况,以及DWG显示之后的情况应该是什么*。lsp do。。。您可以在几个块上手动创建,但DWG应该显示您需要什么和*。lsp没有按预期进行。。。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-8-24 09:49 , Processed in 1.420088 second(s), 73 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表