找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4268|回复: 7

[求助] 如何获取一个块内的所有实体

[复制链接]

已领礼包: 4个

财富等级: 恭喜发财

发表于 2017-3-21 15:44:19 | 显示全部楼层 |阅读模式

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

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

×
已知获得了一个 AcDbBlockReference* 。请问如何获取这个AcDbBlockReference内的所有实体呢?我想要修改这个块中包含的实体的坐标。
谢谢大家~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-3-21 19:24:36 | 显示全部楼层

你理解有误,块实体(INSERT)下面没有实体(有也是属性ATTRIB),INSERT引用的是块定义(AcDbBlockTableRecord ),块定义里面的实体是你要修改的, 你修改了这个里面的实体, 所有引用这个块定义的INSERT都跟着改变.

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

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2017-3-21 17:22:06 | 显示全部楼层
用迭代器

  1.         AcDbBlockTableRecordIterator *pIter;
  2.         Acad::ErrorStatus es=pBlk->newIterator(pIter);
  3.         if (es!=eOk)
  4.                 return kFalse;
  5.         for (;!pIter->done();pIter->step())
  6.         {
  7.                 AcDbEntity *pEnt;
  8.                 AcDbBlockReference *pBlkRef;
  9.                 if (pIter->getEntity(pEnt,kForRead)==eOk)
  10.                 {
  11.                         ..............................//插入你的代码
  12.                         pEnt->close();
  13.                 }
  14.         }
  15.         delete pIter;

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

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

 楼主| 发表于 2017-3-21 19:20:14 | 显示全部楼层

不是指块表。
我想获取一个块,也就是一个:AcDbBlockReference 实体类所包含的所有实体。
你代码中的pBlk应该是指:AcDbBlockTableRecord。不是AcDbBlockReference 。
请问怎么获取一个块实体内的所有实体?谢谢了~
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-3-21 19:35:46 | 显示全部楼层

你双击图块,进入块编辑器,这个时候你能编辑的实体他们的父实体是块定义,AcDbBlockTableRecord , 模型空间的实体(比如INSERT)是在模型空间(Model_Space)块表记录容器内。 而块(INSERT)实体内的实体是在AcDbBlockTableRecord 块表记录容器内。

你可以想象,一个图作为引用插入到另外到图内,那么那个图的模型空间就变成了这个图的一个块定义。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-3-21 21:07:30 | 显示全部楼层
如果你想获得INSERT内的实体(非块定义),那么只有属性实体,获得同样是用迭代器

  1. AcDbObjectIterator *Iter=pBlkRef->attributeIterator();
  2. for(;!Iter->done();Iter->step())
  3. {
  4.         AcDbObjectId id=Iter->objectId();
  5.         ......//插入你的代码
  6. }

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

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

 楼主| 发表于 2017-3-22 13:14:34 | 显示全部楼层

我试了下这个方法,但是获得的遍历器中不包含内容,也就是说下面for语句刚开始,就结束了,无法遍历其中的元素。请问这个是我程序的问题吗?谢谢你们的帮助。。。


  1. //获得了一个实体,这个实体是:AcDbBlockReference
  2. AcDbBlockReference* pBlockReference = NULL;
  3. if (NULL == (pBlockReference = AcDbBlockReference::cast(pEnt)))
  4. {
  5.         acutPrintf(_T("cuolecuole\n"));
  6.         pEnt->close();
  7.         delete pBTRI;
  8.         return;
  9. }

  10. AcDbObjectIterator *pIter = NULL;
  11. if (NULL == (pIter=pBlockReference->attributeIterator()))
  12. {
  13.         acutPrintf(_T("nononono!\n"));
  14.         pBlockReference->close();
  15.         delete pBTRI;
  16.         return;
  17. }
  18. for (pIter->start();!pIter->done();pIter->step())
  19. {
  20.         //无法进入这里,遍历器包含的元素应该为0
  21.         ......
  22. }



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

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

 楼主| 发表于 2017-3-22 13:24:35 | 显示全部楼层

谢谢你们的指点!十分感谢!
我还有点不明白的地方,那是不是可以理解为 AcDbBlockReference 中的实体是存储在 AcDbBlockTableRecord 中的?那么我该如何获取这个 AcDbBlockTableRecord 从而可以读取并且修改块里面的实体呢?
我试了下 ACDB_MODEL_SPACE 的 AcDbBlockTableRecord ,在只有一个块的图纸中,使用 AcDbBlockTableRecordIterator 只能找到一个 AcDbBlockReference ,也就是说这个块的实体不是存储在 ACDB_MODEL_SPACE 的 AcDbBlockTableRecord 里的。
还请前辈多多指点,谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 20:35 , Processed in 0.189200 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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