woodman78 发表于 2022-7-6 06:51:37

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

BlackBox 发表于 2022-7-6 07:02:24

尝试一下:
 

(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”)不包括在动态块的允许值中,则不采取任何操作。

woodman78 发表于 2022-7-6 07:13:22

谢谢RenderMan。尽管如此,我还是得到了“没有选择”。我尝试过重命名块和不同的东西,但没有乐趣。有什么想法吗?

Tharwat 发表于 2022-7-6 07:18:00


 
(8.“DYN_图例”)
(2.“DYN_图例”)

BlackBox 发表于 2022-7-6 07:29:55

 
这意味着“DYN_LEGEND”层上没有块。也许我误解了你的原始代码。。。我接受了这句话:
 
 
... 也就是说,这将是块的层名称?因此,我包括以下内容:
 
 
... 其中DXF代码8是图元的图层名。尝试将红色代码替换为:
 

(2 . "*DYN_LEGEND*")

 
... 否则,我们只需跨过所有块的SS。

BlackBox 发表于 2022-7-6 07:40:53

 
不要忘记添加星号:眨眼:

Tharwat 发表于 2022-7-6 07:46:08

 
当然
 
当做

lamensterms 发表于 2022-7-6 07:51:45

嘿伙计们,
 
我自己刚刚发现了动态块的可见性状态,非常有趣,可能非常有用。
 
我只是在定制一张客户图纸,供我们办公室使用,我只是想了解如何在多个图形中批量切换块的可见性状态。
 
上面的例程看起来应该可以做到这一点,但不幸的是,当我运行它时,结果是“**未选择任何内容**”。
 
如果我从选择集中删除块名过滤器,例程似乎运行良好。
 
我的工作代码是…
 
(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]
查看完整版本: lisp更改动态块v