找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2678|回复: 14

[研讨] 已知在嵌套块一个图元的图元名为变量en,如何获得内含该对象的所有块参照的图元名

[复制链接]

已领礼包: 590个

财富等级: 财运亨通

发表于 2014-3-30 19:09:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 namezg 于 2014-3-30 19:21 编辑

已知在嵌套块一个图元的图元名为变量en,如何获得内含该对象的所有块参照的图元名

当然我知道用
(setq endata (nentsel))
(setq en (car endata))
(setq blockEnamelist (last endata))
可以实现。

但我想知道的是,我现在不知道endata,只知道图元名en,有没有办法获得blockEnamelist


本来以为可以用下面的代码获得,后来发现得到的不是块参照,而是BLOCK_RECORD 符号表条目
(setq AcadDocument (vla-get-ActiveDocument (vlax-get-acad-object)))
(setq OwnerID (vla-get-OwnerID obj));取得拥有者(上级)对象的对象识别码(ID)
(setq OwnerObj (vla-ObjectIDToObject AcadDocument OwnerID));现在从取得的标识码(ID)对应的对象

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-3-30 19:20:03 来自手机 | 显示全部楼层
(mapcar '(lambda(x) (cdr (assoc 2 (entget x)))) blocknamelist)

点评

有个笔误,不是blocknamelist应该是blockEnameList 也就是说是其所有块参照的图元名,而不是块名,因为知道块名并确定不下来是哪个块参照。而且我想知道的得到的是所在嵌套块的块参照图元名列表  详情 回复 发表于 2014-3-30 19:27
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 590个

财富等级: 财运亨通

 楼主| 发表于 2014-3-30 19:27:36 | 显示全部楼层
本帖最后由 namezg 于 2014-3-30 19:29 编辑
st788796 发表于 2014-3-30 19:20
(mapcar '(lambda(x) (cdr (assoc 2 (entget x)))) blocknamelist)

有个笔误,不是blocknamelist应该是blockEnameList也就是说是其所有块参照的图元名,而不是块名,因为知道块名并确定不下来是哪个块参照。而且我想知道的得到的是所在嵌套块的块参照图元名列表


注意:已知条件只有块参照中的一个图元名en,其它的不知道。

点评

楼主对块的理解有误!块参照是对块定义的引用,所以所有同名的块参照通过nentsel取得的图元名都是块定义的图元名,和块参照本身没有任何关系!自然楼主的想法是完全错误的!  详情 回复 发表于 2014-3-31 22:57
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-3-30 20:50:29 来自手机 | 显示全部楼层
namezg 发表于 2014-3-30 19:27
有个笔误,不是blocknamelist应该是blockEnameList也就是说是其所有块参照的图元名,而不是块名,因为知 ...

好好看看DXF说明!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-3-31 01:02:46 | 显示全部楼层
(defun c:tt (/ e)
  (if (setq e (car (xdrx_entsel "\nPick Insert: " '((0 . "Insert")))))
    (mapcar
      '(lambda (a)
         (car (xdrx_getpropertyvalue a "BlockTableRecord"))
       )
      (vl-remove-if
        '(lambda (x)
           (/= (xdrx_getpropertyvalue x "IsA") "AcDbBlockReference")
         )
        (xdrx_getpropertyvalue
          (cadr
            (xdrx_getpropertyvalue e "BlockTableRecord")
          )
          "AllEntities"
        )
      )
    )
  )
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2014-3-31 22:57:16 | 显示全部楼层
namezg 发表于 2014-3-30 19:27
有个笔误,不是blocknamelist应该是blockEnameList也就是说是其所有块参照的图元名,而不是块名,因为知 ...

楼主对块的理解有误!块参照是对块定义的引用,所以所有同名的块参照通过nentsel取得的图元名都是同一个块定义的图元名,和块参照本身没有任何关系!自然楼主的想法是完全错误的!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 590个

财富等级: 财运亨通

 楼主| 发表于 2014-3-31 23:28:59 | 显示全部楼层
本帖最后由 namezg 于 2014-3-31 23:43 编辑

我明白了,块参照中的是块定义图元,我原来以为块参照中的还是块参照图元呢。
;块参照中包含的所有块定义图元名列表
;(<图元名: 7eeeae40> <图元名: 7eeeae90> <图元名: 7eeeaf50>)
(defun c:ZG_GetBlkRefEnameListNested (/ en)
        (if (setq en (car (xdrx_entsel "\n拾取块: " '((0 . "Insert")))))
                (vl-remove-if
                        '(lambda (x) (/= (xdrx_getpropertyvalue x "IsA") "AcDbBlockReference"))
                        (xdrx_getpropertyvalue
                                (cadr
                                        (xdrx_getpropertyvalue en "BlockTableRecord");("A$C413C7908" <图元名: 7eeeac98>)
                                )
                                "AllEntities"
                        );块内的所有图元名列表
                )
        )
)
我说的只能通过(last (nentsel))

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 590个

财富等级: 财运亨通

 楼主| 发表于 2014-3-31 23:49:33 | 显示全部楼层
(setq en (car (xdrx_entsel "\n拾取块: " '((0 . "Insert")))));<图元名: 7ed18048>
(setq lst
        (vl-remove-if
                '(lambda (x) (/= (xdrx_getpropertyvalue x "IsA") "AcDbBlockReference"))
                (xdrx_getpropertyvalue
                        (cadr
                                (xdrx_getpropertyvalue en "BlockTableRecord");("A$C413C7908" <图元名: 7eeeac98>)
                        )
                        "AllEntities"
                );块内的所有图元名列表
        )
);(<图元名: 7eeeae40> <图元名: 7eeeae90> <图元名: 7eeeaf50>)
(setq dxf (entget (car lst)))
;|
((-1 . <图元名: 7eeeae40>) (0 . "INSERT") (330 . <图元名: 7eeead80>) (5 . "4E0") (100
. "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbBlockReference") (2 .
"A$C413C7908") (10 3.11869 -165.142 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 .
0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0))
|;

(0 . "INSERT")说明<图元名: 7eeeae40>是块参照啊,不是块定义图元啊,又晕了?

G版能给解释一下吗?

点评

和line/arc等图元一样, 块参照当然也可以是块定义的子图元啊!有啥可奇怪的!  详情 回复 发表于 2014-4-1 09:10
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2014-4-1 09:10:21 | 显示全部楼层
本帖最后由 牢固 于 2014-4-1 09:11 编辑
namezg 发表于 2014-3-31 23:49
(setq en (car (xdrx_entsel "\n拾取块: " '((0 . "Insert")))));
(setq lst
        (vl-remove-if

和line/arc等图元一样, 块参照当然也可以是块定义的子图元啊!有啥可奇怪的!块定义中包含块参照子图元,那就是所谓的嵌套块啦!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 590个

财富等级: 财运亨通

 楼主| 发表于 2014-4-1 20:39:14 | 显示全部楼层
本帖最后由 namezg 于 2014-4-1 21:45 编辑

看来G版没明白我的意思,我是意思是一个图元en包含在块参照A中,块参照A包含在块参照B中,块参照B包含在块参照C中,现在我只知道图元名en,我想得到的就是'(A B C),A->C是由里到外。
当然我知道用
(setq endata (nentsel))
(setq en (car endata))
(setq blockEnamelist (last endata))
可以得到 blockEnamelist 即'(A B C)
可这是通过拾取的方法nentsel。

我想知道的是,比如我只知道en,还不知道endata,有没有办法获得endata从而获得blockEnamelist 即'(A B C)
或都由en通过别的方法获得blockEnamelist 即'(A B C)。

当然有人会问en不是拾取得到的,是怎么得到的,我的问题是不用管我怎么得到en这个变量的,有没有方法通过en而获得blockEnamelist 即'(A B C),如果不可能就算了,呵呵。

也就是我想编写的函数
;功能:已知在嵌套块一个图元的图元名为变量en,获得内含该对象的所有块参照的图元名列表
;en--嵌套块参照中的一个图元名
(defun zg-GetOwnerIntsertEnameList (en)

)

点评

你从哪获取的这个 en ?  详情 回复 发表于 2014-4-1 22:11
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-4-1 22:11:30 | 显示全部楼层
namezg 发表于 2014-4-1 20:39
看来G版没明白我的意思,我是意思是一个图元en包含在块参照A中,块参照A包含在块参照B中,块参照B包含在块 ...

你从哪获取的这个 en ?

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2014-4-2 00:05:59 来自手机 | 显示全部楼层
你还是没搞懂图块的概念!我已经很明确的告诉你了,不能从子图元反推出块参照,二者没有任何关系!但是可以根据块参照逐级向内列出其嵌嵌套的图块名称,也就是只能从外向内推,而不能从内向外推!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-4-2 00:27:43 | 显示全部楼层
本帖最后由 st788796 于 2014-4-2 07:02 编辑

ARX Owner 可以反推,但只能上推一层,再找嵌套就要遍历循环了

块定义内的实体其Owner是Blockdef,Blockdef的Owner是Document,ActiveX模型是这样

点评

Owner 即对应图元的330组码,块参照 内子图元的Owner 是块定义而非块参照!所以,可以由块参照可以得到块内子图元,实际上是块定义的子图元,而并不能由块内子图元得到块参照!  详情 回复 发表于 2014-4-2 08:13
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2014-4-2 08:13:52 | 显示全部楼层
本帖最后由 牢固 于 2014-4-2 08:15 编辑
st788796 发表于 2014-4-2 00:27
ARX Owner 可以反推,但只能上推一层,再找嵌套就要遍历循环了

块定义内的实体其Owner是Blockdef,Block ...

Owner 即对应图元的330组码,块参照 内子图元的Owner 是块定义而非块参照!所以,由块参照可以得到块内子图元,但这实际上是块定义的子图元,而并不能由块内子图元得到块参照!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 590个

财富等级: 财运亨通

 楼主| 发表于 2014-4-5 08:55:39 | 显示全部楼层
谢谢各位和我自己得到的结论一样,看来只能通过nentsel或nentselp了.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-14 21:48 , Processed in 0.634121 second(s), 68 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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