本帖最后由 chen3732088 于 2025-7-29 14:00 编辑
下面代码可以复制最底层的嵌套块,与其说复制不如说获取块名重新插入,我想修改选到不是嵌套块时复制图元,但是想不出来,求大神提供思路(尽量不要用ncopy,中望只有26版才有)
网友答: ; 获取指定块儿内部的所有非块儿图元的图元名列表
; (GetVLAEntities (setq blkref (car(entsel))))
(defun GetVLAEntities (blkref / blkobj blks res)
(setq blkobj (vlax-ename->vla-object blkref)
blks (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))))
(vlax-for obj (setq ls(vla-item blks (vla-get-Name blkobj)))
(setq res (cons (vlax-vla-object->ename obj) res))
(if (= (vla-get-ObjectName obj) "AcDbBlockReference")
(setq res (append res (GetVLAEntities (vlax-vla-object->ename obj))))
))
(vl-remove-if '(lambda(x)(eq "INSERT" (cdr(assoc 0(entget x))))) res)
)
这个是deep seek 弄的 参考下
网友答:
;(progn
;(setq objbz (car data))
;(command "NCOPY" objbz "" "" (pause))
;
我里面注释掉的这句就是获取该图元名的,我之前用NCOPY复制的话会连同他所在的嵌套块一起复制出来,用copy的话就会复制在他所在的嵌套块里面,懵逼了网友答: 本帖最后由 kozmosovia 于 2025-7-29 16:43 编辑
如果不是嵌套快,那么自身就是个块,相当于nentselp点取了块内的一个图元,然后需要得到其父级块。这时候,nentsel返回的第四个元素是只有一个图元的表,那个图元就是上级块。所以,判断获取它只需要
(and (= (length (setq dat (nentselp))) 4)
(= (length (setq dat (cadddr dat))) 1)
(setq blk (car dat))
)
你的代码本身也不可能复制出嵌套在图块里面的图块。因为nentselp点取获取的第一个元素,也依然是最里层图块内的一个图元,永远不会返回图块。
网友答: 本帖最后由 437271963 于 2025-7-29 13:25 编辑
(setq ent (nentsel "\n请选择对象"))
(setq ent (car ent));此图元为选中图元,不是块。
用法查看nentsel帮助
网友答: 本帖最后由 kozmosovia 于 2025-7-29 13:34 编辑
直接用VLDCL-AQX的NCBLK命令即可:https://www.yuque.com/kozjonoyeoh/vldcl/xa0nfu7hhrzggdgn
网友答:
感觉好复杂啊
网友答:
谢谢您,我试试网友答: 复制非块儿图元也是个根据节点等参数重新建一个, 比如直线 或者多段线图元,就获取其所有节点重构直线 多段线,如果是样条线就更复杂,也可以炸开,把不要的要素删掉网友答:
块内嵌套的图元原位复制,需要根据图块嵌套层级进行矩阵转换,否则新生成的图元会跑位
下面代码可以复制最底层的嵌套块,与其说复制不如说获取块名重新插入,我想修改选到不是嵌套块时复制图元,但是想不出来,求大神提供思路(尽量不要用ncopy,中望只有26版才有)

- (defun c:BBC ()
- (setvar "cmdecho" 0)
- (setq data (nentselp "\n选择块内实体: ")
- dataent (cadddr data)
- listcount (length dataent)
- )
- (if (>= listcount 2)
- (progn
- (setq dataX (car dataent)
- blocka (entget dataX)
- bname (cdr (assoc 2 blocka))
- xscale (cdr (assoc 41 blocka))
- yscale (cdr (assoc 42 blocka))
- bton (cdr (assoc 50 blocka))
- pb (getpoint "\n选择块复制位置:")
- )
- (command "INSERT" bname pb xscale yscale (/ (* bton 180) pi))
- )
- (princ "\n所选不是嵌套块:")
- ;(progn
- ;(setq objbz (car data))
- ;(command "NCOPY" objbz "" "" (pause))
- ;)
- )
- (setvar "cmdecho" 1)
- (princ)
- )
网友答: ; 获取指定块儿内部的所有非块儿图元的图元名列表
; (GetVLAEntities (setq blkref (car(entsel))))
(defun GetVLAEntities (blkref / blkobj blks res)
(setq blkobj (vlax-ename->vla-object blkref)
blks (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))))
(vlax-for obj (setq ls(vla-item blks (vla-get-Name blkobj)))
(setq res (cons (vlax-vla-object->ename obj) res))
(if (= (vla-get-ObjectName obj) "AcDbBlockReference")
(setq res (append res (GetVLAEntities (vlax-vla-object->ename obj))))
))
(vl-remove-if '(lambda(x)(eq "INSERT" (cdr(assoc 0(entget x))))) res)
)
这个是deep seek 弄的 参考下
网友答:
437271963 发表于 2025-7-29 13:24
(setq ent (nentsel "\n请选择对象"))
(setq ent (car ent));此图元为选中图元,不是块。
用法查看nentse ...
;(progn
;(setq objbz (car data))
;(command "NCOPY" objbz "" "" (pause))
;
我里面注释掉的这句就是获取该图元名的,我之前用NCOPY复制的话会连同他所在的嵌套块一起复制出来,用copy的话就会复制在他所在的嵌套块里面,懵逼了网友答: 本帖最后由 kozmosovia 于 2025-7-29 16:43 编辑
如果不是嵌套快,那么自身就是个块,相当于nentselp点取了块内的一个图元,然后需要得到其父级块。这时候,nentsel返回的第四个元素是只有一个图元的表,那个图元就是上级块。所以,判断获取它只需要
(and (= (length (setq dat (nentselp))) 4)
(= (length (setq dat (cadddr dat))) 1)
(setq blk (car dat))
)
你的代码本身也不可能复制出嵌套在图块里面的图块。因为nentselp点取获取的第一个元素,也依然是最里层图块内的一个图元,永远不会返回图块。
网友答: 本帖最后由 437271963 于 2025-7-29 13:25 编辑
(setq ent (nentsel "\n请选择对象"))
(setq ent (car ent));此图元为选中图元,不是块。
用法查看nentsel帮助
网友答: 本帖最后由 kozmosovia 于 2025-7-29 13:34 编辑
直接用VLDCL-AQX的NCBLK命令即可:https://www.yuque.com/kozjonoyeoh/vldcl/xa0nfu7hhrzggdgn
网友答:
kozmosovia 发表于 2025-7-29 13:32
直接用VLDCL-AQX的NCBLK命令即可:https://www.yuque.com/kozjonoyeoh/vldcl/xa0nfu7hhrzggdgn
感觉好复杂啊
网友答:
guosheyang 发表于 2025-7-29 13:29
; 获取指定块儿内部的所有非块儿图元的图元名列表
; (GetVLAEntities (setq blkref (car(entsel))))
(d ...
谢谢您,我试试网友答: 复制非块儿图元也是个根据节点等参数重新建一个, 比如直线 或者多段线图元,就获取其所有节点重构直线 多段线,如果是样条线就更复杂,也可以炸开,把不要的要素删掉网友答:
guosheyang 发表于 2025-7-29 17:36
复制非块儿图元也是个根据节点等参数重新建一个, 比如直线 或者多段线图元,就获取其所有节点重构直线 多 ...
块内嵌套的图元原位复制,需要根据图块嵌套层级进行矩阵转换,否则新生成的图元会跑位