kam1967 发表于 2022-7-6 06:39:50

将块复制到所有层

大家好,
 
我很久没来这里了。希望你仍然像以前一样提供令人敬畏的支持。
 
无论如何,我想知道复制块的最快方法——比如说BLOCKX,并将其复制到所有现有层上——包括层0。
 
任何帮助都将不胜感激!

Lee Mac 发表于 2022-7-6 07:08:06

有COPYTOLAYER命令;或者你可以用这样的东西:
(defun c:copy2lay ( / lal lan lay sel )
   (if (ssget "_:L")
       (progn
         (while (setq lay (tblnext "LAYER" (null lay)))
               (setq lal (cons (cdr (assoc 2 lay)) lal))
         )
         (vlax-for obj
               (setq sel (vla-get-activeselectionset (vla-get-activedocument (vlax-get-acad-object))))
               (setq lan (vla-get-layer obj))
               (foreach lay lal
                   (if (/= lay lan)
                     (vla-put-layer (vla-copy obj) lay)
                   )
               )
         )
         (vla-delete sel)
       )
   )
   (princ)
)
(vl-load-com) (princ)

kam1967 发表于 2022-7-6 07:17:59

谢谢你,李。我刚刚测试过。工作起来很有魅力。如果我需要指定块名,我不确定您将如何按自己的方式进行编码。“L”-我不熟悉这条捷径。无论如何,我插入了这段代码来指定块,它运行良好。
 
;(如果(ssget“_:L”)
(if(setq blk(ssget“x”(列表(cons 0“插入”)(cons 2“BLOCKX”)))
 
你的世界末日怎么样?希望一切顺利。一如既往,我们非常感谢您的帮助和支持!

Lee Mac 发表于 2022-7-6 07:39:01

 
太好了,不客气。
 
 
“:L”模式字符串排除锁定层上的对象;下划线前缀确保此模式字符串在AutoCAD的所有语言版本上都有效。
 
 
您也可以简单地使用:
(if (ssget "_X" '((0 . "INSERT") (2 . "BLOCKX")))
 
由于程序通过ActiveX检索activeselectionset对象,因此不需要将初始选择集分配给变量;此外,过滤器列表中没有要计算的表达式,因此可以将其引用为文字列表。
 
但是,请注意,如果块的任何引用位于锁定层上,或者如果块是动态的,则经过修改后,程序将出错。
 
 
很好,谢谢,我希望你也一切顺利

kam1967 发表于 2022-7-6 07:50:14

谢谢你的解释,李!我会确保层没有被锁定,以防止发生任何错误。干杯
页: [1]
查看完整版本: 将块复制到所有层