明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1670|回复: 18

[提问] 求提取块内图元的思路

  [复制链接]
发表于 2025-7-29 11:09:08 | 显示全部楼层 |阅读模式
本帖最后由 chen3732088 于 2025-7-29 14:00 编辑

下面代码可以复制最底层的嵌套块,与其说复制不如说获取块名重新插入,我想修改选到不是嵌套块时复制图元,但是想不出来,求大神提供思路(尽量不要用ncopy,中望只有26版才有)
  1. (defun c:BBC ()
  2.   (setvar "cmdecho" 0)
  3.   (setq data (nentselp "\n选择块内实体: ")
  4.         dataent  (cadddr data)
  5.         listcount (length dataent)
  6.   )
  7.   (if (>= listcount 2)
  8.     (progn
  9.       (setq dataX  (car dataent)
  10.             blocka (entget dataX)
  11.             bname  (cdr (assoc 2  blocka))
  12.             xscale (cdr (assoc 41 blocka))
  13.             yscale (cdr (assoc 42 blocka))
  14.             bton   (cdr (assoc 50 blocka))
  15.             pb     (getpoint "\n选择块复制位置:")
  16.       )
  17.       (command "INSERT" bname pb xscale yscale (/ (* bton 180) pi))
  18.     )
  19.     (princ "\n所选不是嵌套块:")
  20.     ;(progn
  21.       ;(setq objbz  (car data))
  22.       ;(command "NCOPY" objbz "" "" (pause))
  23.     ;)
  24.   )
  25.   (setvar "cmdecho" 1)
  26.   (princ)
  27. )


回复

使用道具 举报

发表于 2025-7-29 13:29:06 | 显示全部楼层
;  获取指定块儿内部的所有非块儿图元的图元名列表
; (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 弄的  参考下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-7-29 14:02:20 | 显示全部楼层
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的话就会复制在他所在的嵌套块里面,懵逼了
回复 支持 反对

使用道具 举报

发表于 2025-7-29 16:39:15 | 显示全部楼层
本帖最后由 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点取获取的第一个元素,也依然是最里层图块内的一个图元,永远不会返回图块。
回复 支持 反对

使用道具 举报

发表于 2025-7-29 13:24:24 | 显示全部楼层
本帖最后由 437271963 于 2025-7-29 13:25 编辑

(setq ent (nentsel "\n请选择对象"))
(setq ent (car ent));此图元为选中图元,不是块。
用法查看nentsel帮助
回复 支持 反对

使用道具 举报

发表于 2025-7-29 13:32:51 | 显示全部楼层
本帖最后由 kozmosovia 于 2025-7-29 13:34 编辑

直接用VLDCL-AQX的NCBLK命令即可:https://www.yuque.com/kozjonoyeoh/vldcl/xa0nfu7hhrzggdgn

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-7-29 14:03:25 | 显示全部楼层
kozmosovia 发表于 2025-7-29 13:32
直接用VLDCL-AQX的NCBLK命令即可:https://www.yuque.com/kozjonoyeoh/vldcl/xa0nfu7hhrzggdgn

感觉好复杂啊
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-7-29 14:04:29 | 显示全部楼层
guosheyang 发表于 2025-7-29 13:29
;  获取指定块儿内部的所有非块儿图元的图元名列表
; (GetVLAEntities (setq blkref (car(entsel))))
(d ...

谢谢您,我试试
回复 支持 反对

使用道具 举报

发表于 2025-7-29 17:36:47 | 显示全部楼层
复制非块儿图元也是个根据节点等参数重新建一个, 比如直线 或者多段线图元,就获取其所有节点重构直线 多段线,如果是样条线就更复杂,也可以炸开,把不要的要素删掉
回复 支持 反对

使用道具 举报

发表于 2025-7-29 18:02:46 | 显示全部楼层
guosheyang 发表于 2025-7-29 17:36
复制非块儿图元也是个根据节点等参数重新建一个, 比如直线 或者多段线图元,就获取其所有节点重构直线 多 ...

块内嵌套的图元原位复制,需要根据图块嵌套层级进行矩阵转换,否则新生成的图元会跑位
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-11-29 12:56 , Processed in 0.177791 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表