abobneil 发表于 2022-7-6 06:39:31

分解除一个以外的所有块

我叫尼尔,是autolisp的新手。我正在尝试编写一个lisp文件,该文件将分解除用户选择的块之外的所有块。这样做的目的是,当我从架构师那里收到一个文件,我将使用它作为我工作的基础文件,我希望能够分解所有块。有时,建筑师使用具有属性的块作为房间标记。我不想爆炸。下面是我到目前为止编写的代码。我可能做错了,如果有更好的方法,请告诉我。另外,如果你能解释一下你发布的任何代码,这样我就可以学习了。以下是我的代码:
 
(defun C:重新选择()
(提示“选择所有不希望分解的块。”)
(setq a(ssget“_X”'((0。“插入”)))
(setq b(ssget()))
(setq c(?)
(命令“_.explode”c”)
(普林斯)
)

Lee Mac 发表于 2022-7-6 07:02:18

欢迎来到CADTutor Neil
 
请尝试以下代码:
(defun c:myexplode ( / all ent inc qaf sel )
   (if
       (and
         (setq sel (ssget      '((0 . "INSERT"))))
         (setq all (ssget "_X" '((0 . "INSERT"))))
       )
       (progn
         (repeat (setq inc (sslength all))
               (if (ssmemb (setq ent (ssname all (setq inc (1- inc)))) sel)
                   (ssdel ent all)
               )
         )
         (setq qaf (getvar 'qaflags))
         (setvar 'qaflags 1)
         (command "_.explode" all "")
         (setvar 'qaflags qaf)
       )
   )
   (princ)
)
只要问问你是否对代码有什么不理解的地方。

fabriciorby 发表于 2022-7-6 07:15:19

(defun c:dontexplode(/ contss contssall ss ssall)
(setq contss 0)
(setq contssall 0)
(princ "Select the blocks you don't want to explode.")
(setq ss (ssget '((0 . "INSERT"))))
(setq ssall (ssget "_X" '((0 . "INSERT"))))
(repeat (sslength ss)
(repeat (sslength ssall)
        (if (not(eq (ssname ss contss) (ssname ssall contssall)))
        (command "explode" (ssname ssall contssall))
        )
(setq contssall( + 1 contssall))
)
(setq contss(+ 1 contss))
(setq contssall 0)
)
)
 
我得到了这个,但李更快,我相信他的代码是更好的哈哈

fabriciorby 发表于 2022-7-6 07:19:23

哇,我不知道qaflags和ssmemb,很高兴知道(:

abobneil 发表于 2022-7-6 07:37:57

李,这很有效。谢谢你的帮助。

Lee Mac 发表于 2022-7-6 07:44:10

 
非常欢迎你,尼尔,很乐意帮忙。
 
 
QAFLAGS系统变量是一个奇怪的变量;它没有文档记录,并且对不同值的命令有一些模糊的影响-我只在需要向分解命令传递选择集而不是单个实体名称时才真正倾向于使用它。
页: [1]
查看完整版本: 分解除一个以外的所有块