字符串覆盖
我需要一个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
粗略一看,您发布的代码看起来是正确的——这里有另一种编写相同内容的方法:
(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) 效果完美。谢谢你,李 请阅读代码发布指南并编辑您的帖子,将代码包含在代码标签中。 有人知道如何修改上述lisp以包含选定的属性吗?我尝试过更改代码,但没有成功:
"TEXT,MTEXT,attdef" 由于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) 我又来救援了!
再次感谢你,李,它完全按照需要工作
-哈里 不客气,哈利! 不记得是在2007年找到的会做你想做的事情的一个Autocad命令。 好吧,我输了。我一直在尝试创建一个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