highflybir 发表于 2008-3-24 16:56:00

【飞鸟集】UCS下如何创建物体的包围框

<P>UCS下如何创建物体的包围框</P>
<P>我们知道如果要创建物体的包围框采用函数<BR>vla-GetBoundingBox函数,但这个函数创建的物体包围框永远是WCS的,也就是说无论你当前处于什么UCS状态,它得到的包围框总是跟WCS的X轴线,Y轴线,Z轴线平行的。<BR>那么如何在UCS下创建物体的包围框呢?</P>
<P></P>
<P>当然不能仅仅是直接用getboundingBox得到的点变换到UCS就可以了,还需要一个步骤。<BR>这个步骤是要首先把物体通过transformBy变换到WCS状态,然后得到这个时候的包围框,再把物体又变换回到UCS中,<BR>同时还要把得到的这个包围框也变换到UCS中。好了,有什么不明白的请看下面的程序。另外有什么更好的办法不妨到这里讨论。</P>
<P>下面我提供了一个程序可以创建物体的包围框,(仅仅平面的,如果是立体的,可以稍加修改)。</P>
<P>使用方法,输入命令: test,然后选择物体,就得到了物体的UCS底下的包围框。</P>
<P></P>
<P>没有加出错处理,譬如某些东西可能处于锁定的图层或者不能被修改。</P>

刘炎华 发表于 2021-7-2 19:00:28

本帖最后由 刘炎华 于 2021-7-3 07:07 编辑

很实用!已在论坛找到答案

yaojing38 发表于 2023-3-16 21:49:58

谢谢大神分享,,很实用

229096767 发表于 2022-8-29 22:03:22

很强大,谢谢分享

小菜123 发表于 2008-3-24 17:37:00

这个问题有晓东上讨论过了,实现方法差不多,但如果这个实体有关联反应器的时候,transformby会有问题

highflybir 发表于 2008-3-24 18:51:00

<p>晓东论坛上的方法我看见过了,不过我没测试过。因为我一时找不到里面的库函数。</p><p>我虽然思路大同小异,但是感觉到那个方法可能只能适合二维情况,不适合三维的UCS,(就是UCS的法线矢量不为(0,0,1)的情况).另外用了command,在某些情况下可能不利于效率的提高。</p><p>你说的反应器关联的问题,不妨请举个具体例子,我测试看看。</p>

小菜123 发表于 2008-3-26 08:55:00

看看附件中的图

highflybir 发表于 2008-3-26 09:25:00

<p>你的测试文件已看,我想,如果是带了反应器的话,可能相关函数也要做一定的调整。我拿自己的反应器例子再测试看看。 </p>

无痕 发表于 2008-3-26 13:08:00

可能要改写反应器了

xxsheng 发表于 2008-4-10 09:34:00

本帖最后由 作者 于 2008-4-16 9:27:27 编辑 <br /><br /> 我有一个好玩的想法,,先占位置,,,,,,,,,,,,,,<br/><br/>;;;唉,实在是不行了,速度比vla-GetBoundingBox竟然慢了十倍,估计算法有问题,等我什么时候学习改进后再贴出来~<br/>

liminnet 发表于 2008-11-11 17:46:00

liminnet 发表于 2009-7-10 17:53:00

highflybir 发表于 2009-7-14 22:24:00

下面的程序可以满足你的如下要求。

关于你说的第一种UCS处理不了,其实直接求boungdingBox就可以了啊,把那一行注释掉就可以了。
就是把关于变换的句子注释掉就可以了,如下面的三个句子

(and (or VTwist IsWCS) (vla-TransformBy obj revMat))    ; 反变换到WCS
...

(and (or IsWCS vtwist) (vla-TransformBy obj matrix))    ; 变换回到UCS或DCS
...

(or IsWCS vtwist)                                       ; 如是UCS或者ViewTwist话
(vla-TransformBy
   (vlax-ename->vla-object (entlast)) matrix             ; 变换边框到UCS或DCS
)
页: [1] 2 3
查看完整版本: 【飞鸟集】UCS下如何创建物体的包围框