如果它实际上是一个属性,那么通过Lisp更改它(绕过LDT命令)应该没有问题。 亲爱的罗伊,你能给我一张嘴唇吗
如果你想学习一些东西,你可能需要阅读本页:http://lee-mac.com/attributefunctions.html#vlsetattributevalue
我很想帮忙,但我现在没有时间。 @hidxb123:更改c:测试功能以适合您的特定情况:
(defun KGA_Conv_Collection_To_List (coll / ret)
(reverse
(vlax-for a coll
(setq ret (cons a ret))
)
)
)
; (UpdateAttribValue "Layout1" "MyBlock" "MYTAG" "New Text" nil)
(defun UpdateAttribValue (lyt blk tag str allP / lyt)
(setq lyt (strcase lyt))
(setq blk (strcase blk))
(setq tag (strcase tag))
(if
(or
(= "MODEL" lyt)
(vl-position lyt (mapcar 'strcase (layoutlist)))
)
((if allP mapcar vl-some)
'(lambda (obj)
(if
(and
(= "AcDbBlockReference" (vla-get-objectname obj))
(=
blk
(strcase
((if (vlax-property-available-p obj 'effectivename) vla-get-effectivename vla-get-name)
obj
)
)
)
(= :vlax-true (vla-get-hasattributes obj))
)
(vl-some
'(lambda (att)
(if (= tag (strcase (vla-get-tagstring att)))
(progn
(vla-put-textstring att str)
T
)
)
)
(vlax-invoke obj 'getattributes)
)
)
)
(KGA_Conv_Collection_To_List
(vla-get-block
(vla-item (vla-get-layouts (vla-get-activedocument (vlax-get-acad-object))) lyt)
)
)
)
)
)
(defun c:Test ( / doc)
(setq doc (vla-get-activedocument (vlax-get-acad-object)))
(vla-endundomark doc)
(vla-startundomark doc)
(if (UpdateAttribValue "Layout1" "MyBlock" "MYTAG" "New Text" nil)
(princ "\nAttibute updated ")
(princ "\nAttibute NOT updated ")
)
(vla-endundomark doc)
(princ)
) 罗伊,你可以减少这个:
(and
(= "AcDbBlockReference" (vla-get-objectname obj))
(=
blk
(strcase
((if (vlax-property-available-p obj 'effectivename) vla-get-effectivename vla-get-name)
obj
)
)
)
(= :vlax-true (vla-get-hasattributes obj))
)
收件人:
(vl-every '(lambda (a b) (eq a b))
(list (vla-get-objectname obj) (strcase (vla-get-effectivename obj)) (vla-get-hasattributes obj))
(list "AcDbBlockReference" blk :vlax-true)
)
请注意,当您有此功能时:
(= "AcDbBlockReference" (vla-get-objectname obj))
该检查是多余的:
((if (vlax-property-available-p obj 'effectivename) vla-get-effectivename vla-get-name)
obj
)
因为“AcDbBlockReference”总是有一个effectivename属性(假设检查用于“AcDbBlockReference”或“AcDbBlockDefinition”objectname)。 @Grrr:
我个人不喜欢你的“减少”建议。在我看来,这是一个“complification”的案例。更少的线:也许。但是它会执行得更快还是更容易阅读:不!
在较旧的AutoCAD版本中,effectivename特性不存在。考虑到这一点,你提到的冗余并不存在。
现在我明白了(对于旧版本,我没有意识到这一点)。
顺便说一句,为什么不改变这一点:
(if (= tag (strcase (vla-get-tagstring att)))
(progn
(vla-put-textstring att str)
T
)
)
收件人:
(if (= tag (strcase (vla-get-tagstring att)))
(vla-put-textstring att str)
)
(尽量不要听起来挑剔) 谢谢Girr&Roy
@Grrr:请挑剔。我更喜欢它。
关于您之前的“减少”建议(vl every):
如果你测试这个建议,你会发现如果obj不是块参考,它就会出错。
关于您的最新建议:
为了停止vl某个函数(如果allP=nil),我需要一个非nil返回值。
页:
1
[2]