找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: XDSoft

[每日一码] (2)计算AcDbBlockReference准确的包围盒

  [复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-12-6 22:59:05 | 显示全部楼层
牢固 发表于 2014-12-6 22:55
也就是说, "allEntities"对象的包围盒的顶点变换到图块后再重新计算的包围盒与对象变换过来的包 ...

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-12-6 23:11:03 | 显示全部楼层
牢固 发表于 2014-12-6 22:55
也就是说, "allEntities"对象的包围盒的顶点变换到图块后再重新计算的包围盒与对象变换过来的包 ...

变换的虽然是点,如果你把这四个点画上 Pline 再变换有可能不对吗?

点评

不是说点不对,是根据变换后的点再计算出的盒子不对!比如一个图块由一个正方形的pline构成,且正方形45度放置,插入该图块,角度为45度,此时正方形就是水平了,看你的程序能得到正确的包围盒吗?  详情 回复 发表于 2014-12-6 23:23
不是说点不对,是根据变换后的点再计算出的盒子不对!比如一个图块由一个正方形的pline构成,且正方形45度放置,插入该图块,角度为45度,此时正方形就是水平了,看你的程序能得到正确的包围盒吗?  详情 回复 发表于 2014-12-6 23:22
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2014-12-6 23:12:08 | 显示全部楼层
本帖最后由 Highflybird 于 2014-12-6 23:18 编辑

我来贴一段代码:
  1. AcDbExtents CEntity::GetRefBoundingBox (AcDbBlockReference *pRef, const AcGeMatrix3d & mat)
  2. {
  3.         AcDbExtents ext;
  4.         AcDbExtents RetExt;
  5.         AcDbObjectId recId = pRef->blockTableRecord();
  6.         AcDbBlockTableRecordPointer block(recId,AcDb::kForRead);
  7.         Acad::ErrorStatus es = block.openStatus();
  8.         if (es == eOk)
  9.         {
  10.                 AcDbBlockTableRecordIterator *pItr = NULL;
  11.                 block->newIterator(pItr);
  12.                 AcDbObjectId id;
  13.                 AcDbEntity *pEnt = NULL;
  14.                 for (pItr->start();!pItr->done();pItr->step())
  15.                 {
  16.                         es = pItr->getEntity(pEnt,AcDb::kForWrite);
  17.                         if (es == eOk)
  18.                         {
  19.                                 pEnt->transformBy(mat);
  20.                                 if (pEnt->isKindOf(AcDbBlockReference::desc()))
  21.                                 {
  22.                                         AcGeMatrix3d blkmat=((AcDbBlockReference*)pEnt)->blockTransform();
  23.                                         ext = GetRefBoundingBox((AcDbBlockReference *)pEnt,blkmat);
  24.                                 }
  25.                                 else
  26.                                 {
  27.                                         pEnt->getGeomExtents(ext);
  28.                                 }
  29.                                 pEnt->transformBy(mat.inverse());
  30.                                 RetExt.addExt(ext);
  31.                                 pEnt->close();
  32.                         }
  33.                 }
  34.                 delete pItr;
  35.                 pItr = NULL;
  36.         }
  37.         return RetExt;
  38. }



譬如:
AcDbObjectPointer<AcDbBlockReference> blkref(id,AcDb::kForRead);     //id块参照的id
AcDbExtents  ext = CEntity::GetRefBoundingBox(blkref.object(),blkref->blockTransform());

这个代码得到的box跟geomExtentsBestFit是一致的。


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

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2014-12-6 23:22:53 | 显示全部楼层
st788796 发表于 2014-12-6 23:11
变换的虽然是点,如果你把这四个点画上 Pline 再变换有可能不对吗?

不是说点不对,是根据变换后的点再计算出的盒子不对!比如一个图块由一个正方形的pline构成,且正方形45度放置,插入该图块,角度为45度,此时正方形就是水平了,看你的程序能得到正确的包围盒吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2014-12-6 23:23:38 | 显示全部楼层
st788796 发表于 2014-12-6 23:11
变换的虽然是点,如果你把这四个点画上 Pline 再变换有可能不对吗?

不是说点不对,是根据变换后的点再计算出的盒子不对!比如一个图块由一个正方形的pline构成,且正方形45度放置,插入该图块,角度为45度,此时正方形就是水平了,看你的程序能得到正确的包围盒吗?

点评

这个简单,把四个点再构造表,min max 一次  详情 回复 发表于 2014-12-6 23:37
知道你的意思,那个程序本来计算的就不和当前轴平行的,是 BlockDef 原始Box的变换  详情 回复 发表于 2014-12-6 23:26
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-12-6 23:26:25 | 显示全部楼层
牢固 发表于 2014-12-6 23:23
不是说点不对,是根据变换后的点再计算出的盒子不对!比如一个图块由一个正方形的pline构成,且正方形45 ...

我知道你的意思,他那个程序本来计算的就不和当前轴平行的,是 BlockDef 原始Box的变换

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-12-6 23:29:36 | 显示全部楼层
Highflybird 发表于 2014-12-6 23:12
我来贴一段代码:

你这是转回去求!

点评

对,对块内的每个实体进行变换,变换矩阵为块参照的变换矩阵。然后再转回去。这样才能得到真实的box.  详情 回复 发表于 2014-12-6 23:38
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-12-6 23:36:13 | 显示全部楼层
Autodesk 给定的 geomExtents 就是平行 WCS 的,任何一个方向能包住的都是盒子
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-12-6 23:37:38 | 显示全部楼层
牢固 发表于 2014-12-6 23:23
不是说点不对,是根据变换后的点再计算出的盒子不对!比如一个图块由一个正方形的pline构成,且正方形45 ...

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

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2014-12-6 23:38:40 | 显示全部楼层
本帖最后由 Highflybird 于 2014-12-6 23:40 编辑
st788796 发表于 2014-12-6 23:29
你这是转回去求!

对,对块内的每个实体进行变换,变换矩阵为块参照的变换矩阵。然后再转回去。这样才能得到真实的box.
如果有嵌套块,则用递归方式实现。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2014-12-6 23:53:44 | 显示全部楼层
至于lisp中,对于块参照,其boundingbox也是getGeomExtents,而不是geomExtentsBestFit
其所以如果用LISP方法求,估计也要先变换块内实体,得到真正的box,然后把实体变换回去。

点评

非等比图块只能采用层层剥开插入后再炸开来计算!  详情 回复 发表于 2014-12-6 23:58
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2014-12-6 23:58:46 | 显示全部楼层
Highflybird 发表于 2014-12-6 23:53
至于lisp中,对于块参照,其boundingbox也是getGeomExtents,而不是geomExtentsBestFit
其所以如果用LISP ...

非等比图块只能采用层层剥开插入后再炸开来计算!

点评

按高大侠方法,1:1的转个角度求box的点(还要再转回去) 这些点非等比变换,不需要explode  详情 回复 发表于 2014-12-7 00:10
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 264个

财富等级: 日进斗金

发表于 2014-12-7 00:10:01 来自手机 | 显示全部楼层
牢固 发表于 2014-12-6 23:58
非等比图块只能采用层层剥开插入后再炸开来计算!

按高大侠方法,1:1的转个角度求box的点(还要再转回去) 这些点非等比变换,不需要explode
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 33个

财富等级: 招财进宝

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 09:25 , Processed in 0.463230 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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