OMEGA-ThundeR 发表于 2022-7-5 17:22:57

那我甚至不知道这是否可能。。。你可能需要一些。net编程技巧,如果可能的话。

Roy_043 发表于 2022-7-5 17:27:15

如前所述:
如果它实际上是一个属性,那么通过Lisp更改它(绕过LDT命令)应该没有问题。

hidxb123 发表于 2022-7-5 17:31:06

亲爱的罗伊,你能给我一张嘴唇吗
 
 
 

OMEGA-ThundeR 发表于 2022-7-5 17:33:18

如果你想学习一些东西,你可能需要阅读本页:http://lee-mac.com/attributefunctions.html#vlsetattributevalue
 
我很想帮忙,但我现在没有时间。

Roy_043 发表于 2022-7-5 17:37:59

@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)
)

Grrr 发表于 2022-7-5 17:39:13

罗伊,你可以减少这个:

(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)。

Roy_043 发表于 2022-7-5 17:42:29

@Grrr:
我个人不喜欢你的“减少”建议。在我看来,这是一个“complification”的案例。更少的线:也许。但是它会执行得更快还是更容易阅读:不!
 
在较旧的AutoCAD版本中,effectivename特性不存在。考虑到这一点,你提到的冗余并不存在。

Grrr 发表于 2022-7-5 17:45:44

 
现在我明白了(对于旧版本,我没有意识到这一点)。
顺便说一句,为什么不改变这一点:

(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)
)

(尽量不要听起来挑剔)

hidxb123 发表于 2022-7-5 17:49:00

谢谢Girr&Roy
 
 
 

Roy_043 发表于 2022-7-5 17:51:10

@Grrr:请挑剔。我更喜欢它。
 
关于您之前的“减少”建议(vl every):
如果你测试这个建议,你会发现如果obj不是块参考,它就会出错。
 
关于您的最新建议:
为了停止vl某个函数(如果allP=nil),我需要一个非nil返回值。
页: 1 [2]
查看完整版本: lisp帮助