找回密码 注册 QQ登录
开思网工业级高精度在线3D打印服务

iCAx开思网

CAD/CAM/CAE/设计/模具 高清视频【积分说明】如何快速获得积分?快速3D打印 手板模型CNC加工服务在线3D打印服务,上传模型,自动报价
查看: 21803|回复: 11
打印 上一主题 下一主题

CAA:帮着看看程序有什么问题

[复制链接]
跳转到指定楼层
1
发表于 2006-4-11 09:14:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多同行朋友,交流,分享,学习。

您需要 登录 才可以下载或查看,没有帐号?注册

x
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);(此句有错)
好像是参数输入错误。
请指教。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 赞一下!赞一下!
2
发表于 2006-4-11 18:11:28 | 只看该作者
嗯,基本上是一团糟。

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

然后随便做什么
6
发表于 2006-4-12 16:14:51 | 只看该作者
我用的是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。是不是体上面和单独的面有不同。
7
发表于 2006-4-12 17:02:25 | 只看该作者
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;
}

是不是体上面和单独的面有不同。  <- 对
8
发表于 2006-4-12 17:48:10 | 只看该作者
有点儿时间,回答一下。。。

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

---------[这一段说了个稀里糊涂]---------
具体到你的例子,你显然选取的是一个“体上面”,按理来说是得不到CATSurface的(因为这个
面仅仅是个subelement),但是CATSurface_var spSurface1=spSurface;为什么却没有返回NULL呢?
原因就是你用了这个CATFeatureImportAgent,这个agent的作用是,当你选取subelement
时,自动把它Featurize,就是把它变成feature,这样就可以QI到CATSurface。

--------[应该是这样]------------------------
具体到你的例子,你显然选取的是一个“体上面”,按理来说是得不到CATISpecObject的(因为这个
面仅仅是个subelement),因此spSurface本身就没有意义(NULL_var),但是CATSurface_var spSurface1=spSurface;
为什么却没有返回NULL呢?
原因就是你用了这个CATFeatureImportAgent,这个agent的作用是,当你选取subelement
时,自动把它Featurize,就是把它变成feature,这样就可以QI到CATISpecObject,(这样spSurface才不是NULL_var)
而这个Featurize后的“体上面”因为原本就是个surface subelement, 所以可以QI到CATSurface。


既然已经得到了CATSurface,就不必再费劲儿找CATBody了,应该直接就可以用
CreatePointOnSurface来做面上点了。因此只要你用正常的方法得到当前的CGMContainer(而
不是用CATCreateCGMContainer!),就应该可以了。
再说说为什么不能用CATCreateCGMContainer,前面说过,这个函数是凭空做一个
CGMContainer,而CreatePointOnSurface这样的CATGeoFactory方法,要求提供的参考面必须
和即将生成的object(点)在同一个CGMContainer之内(即当前的CGMContainer),你现在这样
提供两个毫不相关的CGMContainer,当然会出错。(你的出错信息恐怕就是"different container").

总之,虽然你的source里有一堆没用的东西,但只要给对了CGMContainer,恐怕还是能出结果的。

[ 本帖最后由 saeba 于 2006-4-13 21:53 编辑 ]
9
发表于 2006-4-12 18:14:26 | 只看该作者
>是不是体上面和单独的面有不同。
当然不同。
“单独的面“是一个Feature,是一个单独的GeometricalElement,可以直接QI到CATISpecObject,甚至CATSuerface.
“体上面”是“体”这个Feature/单独的GeometricalElement的一个subElement,QI不到CATISpecObject,但是可以QI到CATSuerface。
(从另一方面来说,这也可以解释为什么你的那个ispFeature虽然已经"是"CATISpecObject,却
得不到CATIGeometricalElement。因为它是从subelemnet Featurize来的,并不是原本的Feature)

再回到我曾经写的那个并不那么可笑的比喻,
“单独的面“就像一个单独的车轮子,你可以推着它跑。
而“体上面”则是汽车上的一个轮子,你推它是推不动的,不仅仅是因为汽车的重量。
如果这一点你能真正理解,也就不枉费我打这么多字了。
10
发表于 2006-4-13 09:21:15 | 只看该作者
非常感谢saeba兄!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3D打印手板模型快速制作服务,在线报价下单!

QQ 咨询|手机版|联系我们|iCAx开思网  

GMT+8, 2024-12-24 02:00 , Processed in 0.028149 second(s), 11 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2024 www.iCAx.org

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