iCAx开思工具箱

标题: CAA:帮着看看程序有什么问题 [打印本页]

作者: liuruixiao205    时间: 2006-4-11 09:14
标题: CAA:帮着看看程序有什么问题
CATIFeaturize_var spFeaturize;
        spFeaturize=spSurface;(spSurface是CATISpecObject_var类型,鼠标选择的一个圆柱的端面)
        if(spFeaturize!=NULL_var)
                cout<<"spFeaturize!=NULL_var"<<endl;
    CATISpecObject_var spCurFeath=spFeaturize->FeaturizeF();
        CATIMfBRep_var spMfBrep=spCurFeath;
        if(NULL_var!=spMfBrep)
                cout<<"NULL_var!=spMfBrep"<<endl;
         CATLISTP(CATCell) List;
        List=spMfBrep->GetEdges();
        int num=List.Size();
        cout<<"num="<<num<<endl;
        CATEdge_var spEdge=List[1];
        CATEdgeCurve * pEdgeCur=spEdge->GetCurve();
        CATCurve* pCur=pEdgeCur->GetRefCurve();
        CATCurve_var spCur=pCur;
        if(NULL_var!=spCur)
                cout<<"NULL_var!=spCur"<<endl;
        CATPCircle_var spPCircle=spCur;
        if(NULL_var!=spPCircle)
                cout<<"NULL_var!=spPCircle"<<endl;
        CATSurParam ioCenter;
    spPCircle->GetCenter(ioCenter);
        CATGeoFactory* spGeoFac = ::CATCreateCGMContainer();
        if(NULL!=spGeoFac)
                cout<<"NULL_var!=spGeoFac"<<endl;       
        CATSurface_var spSurface1=spSurface;
        if(NULL_var!=spSurface1)
                cout<<"NULL_var!=spSurface1"<<endl;
        CATPointOnSurface * pPoint = spGeoFac->CreatePointOnSurface(ioCenter,spSurface1);(此句有错)
好像是参数输入错误。
请指教。
作者: saeba    时间: 2006-4-11 18:11
嗯,基本上是一团糟。

单说
CATSurface_var spSurface1=spSurface;
这还是在推轱辘。
我不相信你能从一个CATISpecObject直接其QI得到CATSurface.

还有,
CATGeoFactory* spGeoFac = ::CATCreateCGMContainer();
不知你对这句理不理解,这是凭空新作一个CGMContainer,而不是得到现在正在使用的CGMContainer,所以即使在下一句中(CreatePointOnSurface)你给的参数正确,恐怕也不会得到正确的结果。即使作出点了,以后恐怕也没法用。
你应该用常规方法老老实实的得到当前的CGMContainer,而不是凭空作出一个。

再说前面的
CATIFeaturize_var spFeaturize;
        spFeaturize=spSurface;(spSurface是CATISpecObject_var类型,鼠标选择的一个圆柱的端面)
不知你对CATIFeaturize作何理解,CATIFeaturize的作用就是把本来不是Feature的东西(subelement或叫BRep)
变成Feature(就是CATISpecObject,不应该这么说但这么说好懂)
而spSurface本来就已经是Feature(CATISpecObject),在对它QI CATIFeaturize毫无意义。

你用了那么多cout<<,难道没有一个输出吗?
作者: hick    时间: 2006-4-12 10:40
saeba分析的很对
1.spSurface既然已经是CATISpecObject_var类型,用CATIFeaturize多此一举
2.CATSurface_var spSurface1=spSurface;肯定是不对的,可以通过 body,cell来获得
3.CATGeoFactory* spGeoFac = ::CATCreateCGMContainer();也是不对的,必须使用现在的CGMContainer,可以使用当前Container QR获得
作者: liuruixiao205    时间: 2006-4-12 10:44
saeba兄,前面的cout全部输出了。没有空的指针。
还是说说我干什么吧。我就是想得到这个圆面的中心点。是体上的一个圆面。我本来想得到它的body,通过拓扑关系来得到边线在得到圆心的,可是在把这个面赋给CATIGeometricalElement_var时不能成功,如果是单独的面就没问题,体上面就不行。
我选了一个圆柱上的圆端面,想得到它的圆心,saeba兄给说说思路吧。我没办法最后是直接选边线,在把它赋给CATCircle得到的圆心,可是我还要用这个面,要再选一次面鼠标操作就太多了。
作者: hick    时间: 2006-4-12 11:04
唉,是这样啊,
看你agent如何写的, 怀疑你的spSurface不是CATISpecObject_var类型,用没CATFeatureImportAgent?
直接得到CATISpecObject
CATISpecObject-->CATBody-->CATFace-->CATSurface,

然后随便做什么
作者: liuruixiao205    时间: 2006-4-12 16:14
我用的是CATFeatureImportAgent,你说的步骤我试过,但得不到Body,用鼠标得到的对象转换为CATIGeometricalElement_var类型时没成功。
选择:    _ElementAgent=new CATFeatureImportAgent("surface");
         _ElementAgent->SetOrderedElementType("CATIMfBiDimResult");
     _ElementAgent->AddOrderedElementType("CATSurface");
     _ElementAgent->AddOrderedElementType("CATFace");
     _ElementAgent->SetBehavior      ( CATDlgEngWithPrevaluation | CATDlgEngWithCSO     | CATDlgEngOneShot         );
     _ElementAgent->SetAgentBehavior ( MfPermanentBody | MfLastFeatureSupport | MfRelimitedFeaturization );
         AddCSOClient(_ElementAgent);
得到Body:       
CATBody_var spBody = NULL_var;
        do {
                if( !ispFeature )(ispFeature 是我选择的面的CATISpecObject_var类型)
                {
                        break;
                }
                CATIGeometricalElement_var spGeometricalElementOnFeature = ispFeature;

                if(spGeometricalElementOnFeature!=NULL_var )
                {
                        spBody = spGeometricalElementOnFeature->GetBodyResult();  
                }
                else
                {
                        cout<<"spGeometricalElementOnFeature==NULL_var" <<endl;
                }
                } while(FALSE);
程序的结果就是spGeometricalElementOnFeature==NULL_var。是不是体上面和单独的面有不同。
作者: acoka    时间: 2006-4-12 17:02
CATBody_var ???::GetBodyFromFeature( const CATISpecObject_var& ispFeature )
{
        CATBody_var spBody = NULL_var;
        do {
                if( !ispFeature ) {
                        break;
                }
                CATIMfBRep_var spBRepOnFeature = ispFeature;
                if( !!spBRepOnFeature ) {
                        spBody = spBRepOnFeature->GetBody();
                }
                else {
                        CATIGeometricalElement_var spGeometricalElementOnFeature = ispFeature;
                        if( !spGeometricalElementOnFeature ) {
                                break;
                        }
                        spBody = spGeometricalElementOnFeature->GetBodyResult();
                }
                if( !spBody ) {
                        break;
                }
        } while(FALSE);
        return spBody;
}

是不是体上面和单独的面有不同。  <- 对
作者: saeba    时间: 2006-4-12 17:48
有点儿时间,回答一下。。。

哦,原来使用的CATFeatureImportAgent,怪不得。
首先,
>我不相信你能从一个CATISpecObject直接其QI得到CATSurface.
这句话我应该收回,因为并不是所有的CATISpecObject都QI不到CATSurface。
具体地说,属于GS/OGS的面feature应该能QI到CATSurface。
而仅仅是有“体上面”的feature(Form feature)是QI不到CATSurface的。(当然了!)

---------[这一段说了个稀里糊涂]---------

作者: saeba    时间: 2006-4-12 18:14
>是不是体上面和单独的面有不同。
当然不同。
“单独的面“是一个Feature,是一个单独的GeometricalElement,可以直接QI到CATISpecObject,甚至CATSuerface.
“体上面”是“体”这个Feature/单独的GeometricalElement的一个subElement,QI不到CATISpecObject,但是可以QI到CATSuerface。
(从另一方面来说,这也可以解释为什么你的那个ispFeature虽然已经"是"CATISpecObject,却
得不到CATIGeometricalElement。因为它是从subelemnet Featurize来的,并不是原本的Feature)

再回到我曾经写的那个并不那么可笑的比喻,
“单独的面“就像一个单独的车轮子,你可以推着它跑。
而“体上面”则是汽车上的一个轮子,你推它是推不动的,不仅仅是因为汽车的重量。
如果这一点你能真正理解,也就不枉费我打这么多字了。
作者: liuruixiao205    时间: 2006-4-13 09:21
非常感谢saeba兄!
作者: liuruixiao205    时间: 2006-4-13 10:01
呵呵,成功了!再次感谢三位斑竹老兄的帮助。
作者: liuruixiao205    时间: 2006-4-13 10:09
解决了,没经过培训,还是对CATIA里面的接口含义理解错误。多谢三位斑竹的帮助。




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