談話室のほうで、子や孫のブロックまでは分解されないとのことで
図面内の全部のブロックを分解だとこちらにありました。
https://forums.autodesk.com/t5/visual-lisp-autolisp-and-general/recursive-explode-lisp/td-p/5699939
拡張分解をするように少し追加するとこんな感じです。
(vl-load-com)
(defun c:XBLS (/ explodable adoc exp_lst not_explodable ss obj objs)
(defun explodable (ss / i lst name obj)
(repeat (setq i (sslength ss))
(setq obj (vlax-ename->vla-object (ssname ss (setq i (1- i))))
name (vla-get-effectivename obj)
)
(if (and (not (vl-position name not_explodable))
(vlax-write-enabled-p obj)
)
(setq lst (cons obj lst))
)
)
lst
)
(setq adoc (vla-get-activedocument (vlax-get-acad-object)))
(vla-startundomark adoc)
(vlax-for blk (vla-get-Blocks adoc)
(if (or (eq (vla-get-explodable blk) :vlax-false)
(eq (vla-get-isxref blk) :vlax-true)
)
(setq not_explodable (cons (vla-get-name blk) not_explodable))
)
)
(while (and (setq ss (ssget "_X" '((0 . "INSERT"))))
(setq exp_lst (explodable ss))
)
(foreach blk exp_lst
; (vla-explode blk)
; ここから追加部分
(setq objs (vla-explode blk))
(setq objs (vlax-safearray->list (vlax-variant-value objs)))
(foreach obj objs
(if (= 0 (vlax-get-property obj 'color))
(vlax-put-property obj 'color (vlax-get-property blk 'color))
)
(if (= "0" (vlax-get-property obj 'layer))
(vlax-put-property obj 'layer (vlax-get-property blk 'layer))
)
(if (= "ByBlock" (vlax-get-property obj 'linetype))
(vlax-put-property obj 'linetype (vlax-get-property blk 'linetype))
)
(if (= -2 (vlax-get-property obj 'lineweight))
(vlax-put-property obj 'lineweight (vlax-get-property blk 'lineweight))
)
)
; ここまで
(vla-delete blk)
);foreach
)
(vla-endundomark adoc)
(princ)
)
--------------------------
ブロックを選択させるとこんな感じ
(vl-load-com)
(defun c:XBLO (/ explodable adoc exp_lst not_explodable ss obj objs)
(defun explodable (ss / i lst name obj)
(repeat (setq i (sslength ss))
(setq obj (vlax-ename->vla-object (ssname ss (setq i (1- i))))
name (vla-get-effectivename obj)
)
(if (and (not (vl-position name not_explodable))
(vlax-write-enabled-p obj)
)
(setq lst (cons obj lst))
)
)
lst
)
(setq adoc (vla-get-activedocument (vlax-get-acad-object)))
(vla-startundomark adoc)
(vlax-for blk (vla-get-Blocks adoc)
(if (or (eq (vla-get-explodable blk) :vlax-false)
(eq (vla-get-isxref blk) :vlax-true)
)
(setq not_explodable (cons (vla-get-name blk) not_explodable))
)
)
(setq ss (ssget '((0 . "INSERT"))))
(while (and (> (sslength ss) 0) (setq exp_lst (explodable ss)))
(setq ss (ssadd))
(foreach blk exp_lst
(setq objs (vla-explode blk))
(setq objs (vlax-safearray->list (vlax-variant-value objs)))
(foreach obj objs
(if (= 0 (vlax-get-property obj 'color))
(vlax-put-property obj 'color (vlax-get-property blk 'color))
)
(if (= "0" (vlax-get-property obj 'layer))
(vlax-put-property obj 'layer (vlax-get-property blk 'layer))
)
(if (= "ByBlock" (vlax-get-property obj 'linetype))
(vlax-put-property obj 'linetype (vlax-get-property blk 'linetype))
)
(if (= -2 (vlax-get-property obj 'lineweight))
(vlax-put-property obj 'lineweight (vlax-get-property blk 'lineweight))
)
(if (= "AcDbBlockReference" (vla-get-ObjectName obj))
(ssadd (vlax-vla-object->ename obj) ss)
)
)
(vla-delete blk)
);foreach
)
(vla-endundomark adoc)
(princ)
)