Happy Hobbit 发表于 2022-7-5 18:44:37

字符串覆盖

我需要一个lisp来覆盖文字/多行文字
 
它将提示用户输入字符串[(getstring“\n输入要覆盖的文本”)]
 
然后选择要覆盖的窗口或拾取实体。
 
这是我到目前为止得到的:
 


;; STRing OverWrite for text/mtext strings to user specified string


;;


(defun C:STROW (/ d t x))


(setq x (getstring "\nEnter text to overwrite"))


(setq t (ssget "_:L" (list '(0 . "TEXT,MTEXT"))))


   (repeat (setq t (sslength t))


      (setq d (entget (ssname t 0))


      (entmod (subst (cons 1 x) (assoc 1 d)d)


    ); end setq


    (entmod d)


    (ssdel (ssname t 0) t)


); end repeat


(princ)


); end defun

Lee Mac 发表于 2022-7-5 18:52:09

粗略一看,您发布的代码看起来是正确的——这里有另一种编写相同内容的方法:
(defun c:strow ( / i s x )
   (if (and (/= "" (setq x (getstring t "\nEnter text to overwrite: ")))
            (setq s (ssget "_:L" '((0 . "TEXT,MTEXT"))))
       )
       (repeat (setq i (sslength s))
         (vla-put-textstring (vlax-ename->vla-object (ssname s (setq i (1- i)))) x)
       )
   )
   (princ)
)
(vl-load-com) (princ)

Happy Hobbit 发表于 2022-7-5 18:58:24

效果完美。谢谢你,李

SLW210 发表于 2022-7-5 19:01:39

请阅读代码发布指南并编辑您的帖子,将代码包含在代码标签中。

Happy Hobbit 发表于 2022-7-5 19:07:17

有人知道如何修改上述lisp以包含选定的属性吗?我尝试过更改代码,但没有成功:
"TEXT,MTEXT,attdef"

Lee Mac 发表于 2022-7-5 19:11:14

由于ssget不允许选择属性等子实体,因此您需要使用nentsel选择(单个对象),或允许选择属性块(插入),然后迭代块持有的属性,例如:
(defun c:strow ( / i o s x )
   (if (and (/= "" (setq x (getstring t "\nEnter text to overwrite: ")))
            (setq s (ssget "_:L" '((-4 . "<OR") (0 . "TEXT,MTEXT") (-4 . "<AND") (0 . "INSERT") (66 . 1) (-4 . "AND>") (-4 . "OR>"))))
       )
       (repeat (setq i (sslength s))
         (setq o (vlax-ename->vla-object (ssname s (setq i (1- i)))))
         (if (= "AcDbBlockReference" (vla-get-objectname o))
               (foreach a (vlax-invoke o 'getattributes) (vla-put-textstring a x))
               (vla-put-textstring o x)
         )
       )
   )
   (princ)
)
(vl-load-com) (princ)

Happy Hobbit 发表于 2022-7-5 19:13:07

我又来救援了!
再次感谢你,李,它完全按照需要工作
-哈里

Lee Mac 发表于 2022-7-5 19:19:23

不客气,哈利!

BIGAL 发表于 2022-7-5 19:23:23

不记得是在2007年找到的会做你想做的事情的一个Autocad命令。

Happy Hobbit 发表于 2022-7-5 19:26:41

好吧,我输了。我一直在尝试创建一个lisp,它使用Lee Mac上面建议的“nentsel”修改单个属性。我能想到的最好的方法是如下所示,但在运行lisp时,我很难放入“while”或“repeat”语句来修改多个属性。
-哈里
PS为什么代码标签按钮[#]不再工作了?
 
 
 
 
(defun c:catt (/ new existing)
(setq new "ref")
(setq existing(entget (car(nentsel "\nselect attribute text to replace :"))))
(setq existing
(subst (cons 1 new)
(assoc 1 existing)
existing)
)
(entmod existing)
(princ)
);end defun
页: [1] 2
查看完整版本: 字符串覆盖