找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: XDSoft

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

  [复制链接]

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-12-5 16:24:18 来自手机 | 显示全部楼层
Arx中不少窟窿,但这是桌子最底层的,需要自己发现并解决,反倒是桌子自己包装的把窟窿悄悄堵上了,比如comman activex c#
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2014-12-5 16:33:42 | 显示全部楼层
st788796 发表于 2014-12-5 16:15
哪些实体有影响?

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-12-5 16:38:55 来自手机 | 显示全部楼层
Highflybird 发表于 2014-12-5 16:33
不是实体问题。

版主看看这个思路,当然这个不是平行轴的
(defun c:tt (/ e el pts mat)
  (if (setq e (car (xdrx_entsel "\nPick Insert: " '((0 . "insert")))))
    (progn
      (setq el        (xdrx_getpropertyvalue
                  (cadr (xdrx_getpropertyvalue e "blockTableRecord"));_取出块定义
                  "allEntities"
                )
            mat        (xdrx_getpropertyvalue e "blocktransform");_insert 的变换矩阵
            pts        (apply 'append (mapcar 'xdrx_entity_box el));_块定义单个实体的 box 构造一个点集
            pts        (apply 'xdrx_points_box pts);_对点集找一个 Box
            pts (xdrx_points_transform pts mat);_对这个点集BOX变换到 Insert 位置
      )
      (apply 'xdrx_polyline_make (cons t pts))
    )
  )
  (princ)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-12-5 16:39:54 来自手机 | 显示全部楼层
Highflybird 发表于 2014-12-5 16:33
不是实体问题。

版主看看这个思路,当然这个不是平行轴的
(defun c:tt (/ e el pts mat)
  (if (setq e (car (xdrx_entsel "\nPick Insert: " '((0 . "insert")))))
    (progn
      (setq el        (xdrx_getpropertyvalue
                  (cadr (xdrx_getpropertyvalue e "blockTableRecord"));_取出块定义
                  "allEntities"
                )
            mat        (xdrx_getpropertyvalue e "blocktransform");_insert 的变换矩阵
            pts        (apply 'append (mapcar 'xdrx_entity_box el));_块定义单个实体的 box 构造一个点集
            pts        (apply 'xdrx_points_box pts);_对点集找一个 Box
            pts (xdrx_points_transform pts mat);_对这个点集BOX变换到 Insert 位置
      )
      (apply 'xdrx_polyline_make (cons t pts))
    )
  )
  (princ)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2014-12-5 17:13:12 | 显示全部楼层
Highflybird 发表于 2014-12-5 15:54
测试了一下,geomExtents的确存在问题,得不到真实的box.

AcDbBlockReference::geomExtentsBestFit Function
Acad::ErrorStatus
geomExtentsBestFit(
AcDbExtents& extents,
const AcGeMatrix3d& parentXform = AcGeMatrix3d::kIdentity) const;
extentsOutput the WCS extents of the block reference
parentXformInput the transformation to be applied to the block reference抯 geometry
When working in non-WCS coordinate systems, the extents returned from AcDbBlockReference::geomExtents() can be somewhat larger that the actual geometry because AcDbBlockReference::geomExtents() transforms the contained entities' precomputed extents by the block reference抯 transformation matrix rather than transforming the entities and computing a new box for the transformed entity set. This results in non-world aligned extent boxes for the entities. This is fast, but will provide an "exaggerated" enclosing extents box.
AcDbBlockReference::geomExtentsBestFit() avoids this problem by getting copies of all the entities in the referenced block table record, applying parentXform to them, and then calculating the extents on the resulting entity set. This is slower than the process used by AcDbBlockReference::geomExtents(), but will result in the tightest fitting AcDbExtents for the enclosed geometry.
This method works recursively for nested block references. When this method is called on the outermost block reference (the normal case for ARX applications), parentXform should be the identity matrix. For calls on nested block references, parentXform should be the cumulative transformation from the outermost block reference down to the block reference that is referencing the block table record that owns the block reference on which this method is being called.
This method uses the AcDbBlockReference::explode() method to get copies of the entities. Since the AcDbBlockReference::explode() does not currently support nonuniform transformations, if the block reference on which this method is called, or any nested block references have nonuniform transformations, then this method cannot succeed and will return Acad::eInvalidInput.
Returns Acad::eOk if successful.


帮助文件里面已经说的清楚了。

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-12-5 17:41:55 来自手机 | 显示全部楼层
XDSoft 发表于 2014-12-5 17:13
AcDbBlockReference::geomExtentsBestFit Function
Acad::ErrorStatusgeomExtentsBestFit(AcDbExtents& ...

找到个汉化
extents

输出块参考的WCS范围

parentXform

输入应用至块参考几何体的变换

当在非WCS坐标系统中工作时,从AcDbBlockReference::geomExtents()返回的范围可比实际上的几何体更大一些,因为AcDbBlockReference::geomExtents()通过块参考的变换矩阵而不是通过变换实体及计算一个变换的实体集的一个新的边框来变换包含的实体预计算的范围。这导致实体的范围长方体与非世界坐标对齐。这是一个快速的但不提供一个“过大”的包围范围的长方体的方法。

AcDbBlockReference::geomExtentsBestFit()通过取得被参考的块表记录中的所有实体,对它们应用parentXform,并在结果实体集上计算范围的拷贝来避免这个问题。这比使用AcDbBlockReference::geomExtents()处理更慢,但将导致最紧密地匹配封闭的几何体。

此方法递归地作用于嵌套的块参考。当此方法在最外层的块参考上调用时(ARX应用程序的标准情况),parentXform应为从最外层块参考至参考拥有调用此方法的块参考的块表记录的块参考的累积变换。

此方法使用AcDbBlockReference::explode()方法取得实体的拷贝。因为AcDbBlockReference::explode()目前不支持不一致的变换,所以如果调用此方法的块参考或任何嵌套的块参考有不一致的变换,则此方法不成功且将返回Acad::eInvalidInput。

如果成功返回Acad::eOk。

点评

感兴趣的是你拿手机怎么发的这大段文字  详情 回复 发表于 2014-12-5 18:02
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2014-12-5 18:02:58 | 显示全部楼层
st788796 发表于 2014-12-5 17:41
找到个汉化
extents

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-12-5 18:08:58 来自手机 | 显示全部楼层
XDSoft 发表于 2014-12-5 18:02
感兴趣的是你拿手机怎么发的这大段文字

哈哈,这个手册存在手机里,还好文件不大,手机还能打开这个chm,闲暇时就打开看看
大段文字可以复制/粘贴:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

 楼主| 发表于 2014-12-5 19:55:27 | 显示全部楼层
Highflybird 发表于 2014-12-5 15:54
测试了一下,geomExtents的确存在问题,得不到真实的box.

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

使用道具 举报

已领礼包: 3532个

财富等级: 富可敌国

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

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2014-12-6 22:22:45 | 显示全部楼层
测试:geomExtentsBestFit ,不支持非均匀比例变换的图块。

点评

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-12-6 22:34:01 | 显示全部楼层
Highflybird 发表于 2014-12-6 22:22
测试:geomExtentsBestFit ,不支持非均匀比例变换的图块。

19楼的ST代码比较完美。

点评

19楼的代码是错误的!物体盒子旋转一个角度后得到的盒子和物体旋转一个角度后得到的盒子并不是同一个盒子!  详情 回复 发表于 2014-12-6 22:43
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2014-12-6 22:43:55 | 显示全部楼层
newer 发表于 2014-12-6 22:34
19楼的ST代码比较完美。

19楼的代码是错误的!物体盒子旋转一个角度后得到的盒子和物体旋转一个角度后得到的盒子并不是同一个盒子!

点评

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-12-6 22:46:51 | 显示全部楼层
牢固 发表于 2014-12-6 22:43
19楼的代码是错误的!物体盒子旋转一个角度后得到的盒子和物体旋转一个角度后得到的盒子并不是同一个盒子 ...

你这句话不好理解{:soso_e128:}

点评

也就是说, "allEntities"对象的包围盒的顶点变换到图块后再重新计算的包围盒与对象变换过来的包围盒不是同一个包围盒![/backcolor]  详情 回复 发表于 2014-12-6 22:55
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2014-12-6 22:55:17 | 显示全部楼层
newer 发表于 2014-12-6 22:46
你这句话不好理解

        也就是说, "allEntities"对象的包围盒的顶点变换到图块后再重新计算的包围盒与对象变换过来的包围盒不是同一个包围盒!

点评

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 00:00 , Processed in 0.743273 second(s), 64 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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