lisp更改动态块v
我试图通过lisp更改块可见性,并将其拼凑在一起。但它不起作用,我想知道是否有人可以找我。谢谢(defun c:Legend_Scale (/ LName BWild obj)
(setq LName "dyn_legend") ;Get the layer's name
(setq BWild (strcat "*" LName "*")) ;Default to LName
(setq obj (ssget "_X" (list '(0 . "INSERT") (cons 2 BWild)))) ;And some blocks found
(chgdynprop obj "visibility" "1:1000")
(entupd obj)
(princ)
)
(defun chgdynprop (e propname newval / obj v vval sal tot i)
(setq obj (if (= (type e) 'vla-object) e (vlax-ename->vla-object e)))
(if (= (vlax-get-property obj 'isdynamicblock) :vlax-true)
(progn
(setq v (vla-getdynamicblockproperties obj)
vval (vlax-variant-value v)
sal (vlax-safearray->list vval)
tot (length sal)
i 0
);setq
(while (< i tot)
(if (= (vlax-get-property (nth i sal) "PropertyName")
propname)
(progn
(vlax-put-property (nth i sal) "Value" newval)
(setq i tot)
);progn
(setq i (1+ i))
);endif
);endwhile
);progn
);endif
);chgdynprop
尝试一下:
(defun c:FOO ( / ss dynProps val)
(vl-load-com)
(if (setq ss (ssget "_x" '((0 . "INSERT") (2 . "*DYN_LEGEND*"))))
(progn
(vla-startundomark
(cond (*activeDoc*)
((setq *activeDoc*
(vla-get-activedocument
(vlax-get-acad-object))))))
(vlax-for x (setq ss (vla-get-activeselectionset *activeDoc*))
(if (and (= :vlax-true (vla-get-isdynamicblock x))
(vl-string-search
"DYN_LEGEND"
(strcase (vla-get-effectivename x)))
(setq dynProps (car (vlax-invoke
x
'getdynamicblockproperties)))
(vl-position
(cond (val) ((setq val "1:1000")))
(vlax-get dynProps 'allowedvalues)))
(vlax-put-property dynProps 'value val)))
(vla-endundomark *activeDoc*)
(vla-delete ss))
(prompt "\n** Nothing selected ** "))
(princ))
注意,如果val(“1:1000”)不包括在动态块的允许值中,则不采取任何操作。 谢谢RenderMan。尽管如此,我还是得到了“没有选择”。我尝试过重命名块和不同的东西,但没有乐趣。有什么想法吗? 这
(8.“DYN_图例”)
(2.“DYN_图例”)
这意味着“DYN_LEGEND”层上没有块。也许我误解了你的原始代码。。。我接受了这句话:
... 也就是说,这将是块的层名称?因此,我包括以下内容:
... 其中DXF代码8是图元的图层名。尝试将红色代码替换为:
(2 . "*DYN_LEGEND*")
... 否则,我们只需跨过所有块的SS。
不要忘记添加星号:眨眼:
当然
当做 嘿伙计们,
我自己刚刚发现了动态块的可见性状态,非常有趣,可能非常有用。
我只是在定制一张客户图纸,供我们办公室使用,我只是想了解如何在多个图形中批量切换块的可见性状态。
上面的例程看起来应该可以做到这一点,但不幸的是,当我运行它时,结果是“**未选择任何内容**”。
如果我从选择集中删除块名过滤器,例程似乎运行良好。
我的工作代码是…
(defun c:test1 ( / ss dynProps val)
(vl-load-com)
(if (setq ss (ssget "_x" '((0 . "INSERT"))))
(progn
(vla-startundomark
(cond (*activeDoc*)
((setq *activeDoc*
(vla-get-activedocument
(vlax-get-acad-object))))))
(vlax-for x (setq ss (vla-get-activeselectionset *activeDoc*))
(if (and (= :vlax-true (vla-get-isdynamicblock x))
(vl-string-search
"4057_STICKER"
(strcase (vla-get-effectivename x)))
(setq dynProps (car (vlax-invoke
x
'getdynamicblockproperties)))
(vl-position
(cond (val) ((setq val "For Client Review")))
(vlax-get dynProps 'allowedvalues)))
(vlax-put-property dynProps 'value val)))
(vla-endundomark *activeDoc*)
(vla-delete ss))
(prompt "\n** Nothing selected ** "))
(princ))
但我不明白为什么它没有检测到我的名为“4057_贴纸”的块。这和匿名的名字有关吗?
谢谢你的帮助。
页:
[1]