iCAx开思工具箱

标题: CAA求助 [打印本页]

作者: liuruixiao205    时间: 2005-9-22 17:51
标题: CAA求助
如图:里面的圆是圆柱与面的交。我已经得到这些cells,但不知怎么计算它的属性如直径、圆心。请高手帮着说一下思路。
作者: xyzhu    时间: 2005-9-22 20:11
从图上看,那些Intersetct.5等应该是CATIGSMIntersect,把它们QI到CATIGSMCircle就行了.
作者: saeba    时间: 2005-9-22 21:50
每个CATIGSMIntersect实际上有很多Circle,是不能QI到CATIGSMCircle的。(其实即使就算是只有一个,你也QI不到的,我认为)
(一个CATIGSMCircle对应的是一个circle的Feature,注意是Feature而不是BRep)
liuruixiao得到cells的做法是对的,关键是下一步怎么做:
这是非公开的,但是还是告诉你吧,
对每一个Cell, cout他的GetImpl()->IsA(),就象这样:
cout << myCell->GetImpl()->IsA() << endl;
你会得到这个Cell的implementation的名字,就是LateType.
有了LateType,到Object broswer中去查一下它都实现了什么Interface,
你一定会找到和circle相关的interface的

这是一个非常重要而且非常常用的技巧,但是尽量只用在debug的时候,在最终产品里不要出现。
因为这是非公开的,得不到保证.


作者: xyzhu    时间: 2005-9-22 23:41
我搞错了,CATIGSMIntersect可以QI到CATIMeasurableCurve,如果是单圆的话,CATIMeasurableCircle. 对多圆的话,这个CATIMeasurable没什么用.
如果是SpecObject的话,用GetType()也能得到Implementation吧.
作者: liuruixiao205    时间: 2005-9-23 09:24
非常感谢两位!我试一下
作者: saeba    时间: 2005-9-23 09:53
>如果是SpecObject的话,用GetType()也能得到Implementation吧.
是的,SpecObject(就是Feature)的情况下,可以用CATISpecObject::GetType()得到
但是仅仅局限于Feature,对BRep以及其他就没有办法了
而GetImpl()->IsA()对所有CATBaseUnknown都有效

>CATIGSMIntersect可以QI到CATIMeasurableCurve,如果是单圆的话,CATIMeasurableCircle
嗯。。。有点怀疑
下星期试一下再说
作者: xyzhu    时间: 2005-9-26 15:14
试试这个:
CATIGSMIntersect --> CATIGeometricalElement --> CATBody (with method GetBodyResult).
然后你可以取到CATBody中的CATDomain. 每个Domain是相互连接的同维的元素的集合,按照这个定义,每个CATDomain应该代表了一个相交圆. 现在的问题是如何求出直径和圆心. 用GetAllCells求出CATDomain中所有零维的元素,你可以得到两个点(CATVertex), 这两个点是圆直径上的端点!
如果用GetAllCells求出CATDomain中所有一维的元素,相信应该是两个半圆(CATEdge), 当然这对求圆心和直经没什么帮助.
Good luck!
作者: saeba    时间: 2005-9-26 16:06
CATCircle::GetRadius()
CATConic::GetOrigin()
作者: liuruixiao205    时间: 2005-9-27 10:00
非常感谢两位! 我是这样做的。从body直接得到所有的Cells,用saeba兄给的方法找到cell 的late type,从Object broswer 找到接口CATIMeasurableCircle ,然后用Cell[i]来qurrey  CATIMeasurableCircle ,再用CATIMeasurableCircle->GetRadius;   CATIMeasurableCircle->GetCenter;就可以得到圆心和半径。缺点是一个圆是两个cell,半径和圆心都有两个相同的值。
作者: saeba    时间: 2005-9-27 10:25
>缺点是一个圆是两个cell,半径和圆心都有两个相同的值。

这个可能无法避免,可以这么解决:
构造一个列表,每个表项是两个vertex
每得到一个圆弧cell, 再用一次GetAllCells(list, 0)来得到两个端点,
和列表中的表项比较,已存在的话丢弃该圆弧,
不存在的话,加入列表,处理圆弧
(提示,每个cell同时也是一个domain, 都继承于CATTopology,都有GetAllCells方法)
作者: huangsteve    时间: 2007-9-20 11:49
没看到图?




欢迎光临 iCAx开思工具箱 (https://t.icax.org/) Powered by Discuz! X3.3