a2022002 发表于 2025-5-6 14:37:37

炸开嵌套块保留最外图块加入选择的块炸开

用AI写了一个炸开嵌套保留最外的图块,但是是全局的,我想要一个能局部选择块的,麻烦大佬解决下,AI不行啊怎么都解决不了各种报错,附件和CAD图块一块上传

jh1215218 发表于 2025-5-11 07:24:34

先让他全部炸开,然后再生成块,是不是就可以了?

菜卷鱼 发表于 2025-5-12 08:51:17

(defun c:xx (/ s i res)
(setq s (ssget "_+.:E:S" '((0 . "INSERT"))))
(undobe)
(setq res (xpinside s))
(if (= (member "on" res) nil)
    (princ "\n对象内不含嵌套块")
    (PROGN
      (while
        (member "on" res)
       (setq res (xpinside s))
      )
      (princ "\n已分解嵌套块")
    )
)
(setq i nil)
(undoe)
(prin1)
)
(defun xpinside        (s / lock)
(setq lock "off")
(LM:ApplytoBlockObjects
    (vla-get-blocks
      (vla-get-activedocument (vlax-get-acad-object))
    )
    (vla-get-effectivename
      (vlax-ename->vla-object (ssname s 0))
    )
    '(lambda (obj)
       (if
       (= (vla-get-ObjectName obj) "AcDbBlockReference")
          (PROGN (vla-explode obj) (vla-delete obj) (setq lock "on"))
       )
   )
)
)

(defun LM:ApplytoBlockObjects (blks name func / result)
(setq func (eval func))
(if
    (not
      (vl-catch-all-error-p
        (setq def (vl-catch-all-apply 'vla-item (list blks name)))
      )
    )
   (vlax-for obj def (setq result (cons (func obj) result)))
)
(reverse result)
)
(prin1)

a2022002 发表于 2025-5-12 09:20:56

菜卷鱼 发表于 2025-5-12 08:51


no function definition: UNDOBE大神这个报错哦

a2022002 发表于 2025-5-12 09:23:31

jh1215218 发表于 2025-5-11 07:24
先让他全部炸开,然后再生成块,是不是就可以了?

就是需要选取范围内的块进行炸开,要求就是炸开块内所有的其他块,然后就可以了 AI搞不出来

菜卷鱼 发表于 2025-5-13 08:40:40

a2022002 发表于 2025-5-12 09:23
就是需要选取范围内的块进行炸开,要求就是炸开块内所有的其他块,然后就可以了 AI搞不出来

(command "_.undo" "be")
.............
(command "_.undo" "e")

wudechao 发表于 2025-5-14 00:37:50

菜卷鱼 发表于 2025-5-12 08:51


带属性的图块不应该炸开,比如轴号和门窗,这些在建筑图里都是带属性的图块。我修改了一下这个函数(defun xpinside (s / lock)
(setq lock "off")
(lm:applytoblockobjects (vla-get-blocks (vla-get-activedocument (vlax-get-acad-object))) (vla-get-effectivename
                                                                                                                  (vlax-ename->vla-object
                                                                                                                                          (ssname s 0)
                                                                                                                  )
                                                                                           ) '(lambda (obj)
                                                                                                (if (and
                                                                                                      (=
                                                                                                       (vla-get-objectname obj)
                                                                                                       "AcDbBlockReference"
                                                                                                      )
                                                                                                      (=
                                                                                                       (vla-get-hasattributes obj)
                                                                                                       :vlax-false
                                                                                                      )
                                                                                                  )
                                                                                                  (progn
                                                                                                  (vla-explode obj)
                                                                                                  (vla-delete obj)
                                                                                                  (setq lock "on")
                                                                                                  )
                                                                                                )
                                                                                              )
)
)

kozmosovia 发表于 2025-5-14 13:39:35

wudechao 发表于 2025-5-14 00:37
带属性的图块不应该炸开,比如轴号和门窗,这些在建筑图里都是带属性的图块。我修改了一下这个函数(defun ...

也可以炸,要保留属性值,可以炸之前先burst,炸后删除属性定义
页: [1]
查看完整版本: 炸开嵌套块保留最外图块加入选择的块炸开