【飞鸟集】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-3 07:07 编辑
很实用!已在论坛找到答案 谢谢大神分享,,很实用 很强大,谢谢分享 这个问题有晓东上讨论过了,实现方法差不多,但如果这个实体有关联反应器的时候,transformby会有问题 <p>晓东论坛上的方法我看见过了,不过我没测试过。因为我一时找不到里面的库函数。</p><p>我虽然思路大同小异,但是感觉到那个方法可能只能适合二维情况,不适合三维的UCS,(就是UCS的法线矢量不为(0,0,1)的情况).另外用了command,在某些情况下可能不利于效率的提高。</p><p>你说的反应器关联的问题,不妨请举个具体例子,我测试看看。</p> 看看附件中的图 <p>你的测试文件已看,我想,如果是带了反应器的话,可能相关函数也要做一定的调整。我拿自己的反应器例子再测试看看。 </p> 可能要改写反应器了 本帖最后由 作者 于 2008-4-16 9:27:27 编辑 <br /><br /> 我有一个好玩的想法,,先占位置,,,,,,,,,,,,,,<br/><br/>;;;唉,实在是不行了,速度比vla-GetBoundingBox竟然慢了十倍,估计算法有问题,等我什么时候学习改进后再贴出来~<br/> 下面的程序可以满足你的如下要求。
关于你说的第一种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
)