xj6019 发表于 2020-5-11 08:51:41

选择的对象连续炸开多次,处理多重块,有更简单的方法吗

本帖最后由 xj6019 于 2020-5-11 08:54 编辑

选择的对象连续炸开多次,有更简单的方法吗,以下代码是连续炸开8次,这样基本所有对象基本都能处理了,能炸的彻底论坛上倒是有炸开多重块的,但是试用都不行呢,所有自己弄了下面的代码,一遍一遍的炸,这样也是能用的,只是觉得这代码有些繁琐,是否
可以再进行优化呀,有的话就教我一下;

(defun c:BX()
(setvar "cmdecho" 0)
(command "undo" "be")
(setvar "QAFLAGS" 1)
(setq ss1(ssget))
(command "explode" ss1 "")
(setq ss2 (ssget "p"))
(command "explode" ss2 "")
(setq ss3 (ssget "p"))
(command "explode" ss3 "")
(setq ss4(ssget "p"))
(command "explode" ss4 "")
(setq ss5(ssget "p"))
(command "explode" ss5 "")
(setq ss6(ssget "p"))
(command "explode" ss6 "")
(setq ss7(ssget "p"))
(command "explode" ss7 "")
(setq ss8(ssget "p"))
(command "explode" ss8 "")
   (command "undo" "e")   
   (setvar "QAFLAGS" 0)
   (setvar "cmdecho" 1)
   (command "REGEN" )
(princ)
)













陨落 发表于 2020-5-11 11:11:08

(defun explode2toe(ent);;;;将复合块炸到底
(setq lst0(explodeblk ent))
(setq n 0)
(while (member "INSERT"(ENTLISTNAMES LST0))
    (SETQ LST1(VL-REMOVE-IF-NOT '(LAMBDA(X)(=(CDR(ASSOC 0 (ENTGET X)))"INSERT")) LST0)
          LST0(VL-REMOVE-IF '(LAMBDA(X)(=(CDR(ASSOC 0 (ENTGET X)))"INSERT")) LST0))
    (SETQ I 0
          lst2 nil)
    (foreach x lst1 (progn(setq lst2 (append (explodeblk x) lst2))(entdel x)))
    (setq lst0(append lst0 lst2))
    (if (>(setq n (+ n 1))100000)
      (progn
      (princ "疑似出现死循环,将强制退出")
      (exit))
      )
    )
(defun explodeblk(ent)
(mapcar 'vlax-vla-object->ename(vlax-safearray->list
    (vlax-variant-value
                          (vla-explode(vlax-ename->vla-object ent)))))
)

xj6019 发表于 2020-5-11 17:05:30

陨落 发表于 2020-5-11 11:11
(defun explode2toe(ent);;;;将复合块炸到底
(setq lst0(explodeblk ent))
(setq n 0)


谢谢回复,我不会用呢,不是下面代码的这种加载方法吗?可以降解一下你的代码怎么用吗,谢谢!!
(defun c:NM()
   (vl-load-com)
(setq SS1(ssget))
(explode2toe SS1)
(princ)
)
加载后不能运行,应该不是这个用法。

灰石Jeremy 发表于 2020-5-11 18:03:56

用一下递归就可以了
页: [1]
查看完整版本: 选择的对象连续炸开多次,处理多重块,有更简单的方法吗