iCAx开思工具箱

标题: 如何求得一个曲面的重心点 [打印本页]

作者: leihaizhe    时间: 2012-11-19 08:56
标题: 如何求得一个曲面的重心点
  我想获取一个曲面的重心,这功能在CATIA中有相关的功能。同时我录制了一个宏,但是里面没有显示相关的取重心的接口函数,所以在进行CAA二次开发的时候,到底能不能直接调用一个函数获取曲面重心呢?

麻烦了解这方面的大神们给点建议,急救啊!!!

作者: linlily0925    时间: 2012-11-19 09:07
CATDynMassProperties3D->GetCenterOfGravity()方法~~
作者: linlily0925    时间: 2012-11-19 09:09


if(spSpecFill == NULL_var)
{
cout<<"Error in spSpecFill"<<endl;
return FALSE;
}   
  spSpecFill->Update();

       CATIGeometricalElement_var spGeoFill = spSpecFill;//spFill为CATISpecObject_var类型的面片
        CATBody_var spBody = spGeoFill ->GetBodyResult();
        CATDynMassProperties3D* cMassProperties3D;
        CATTopData(cFillTopData);
        cMassProperties3D=CATDynCreateMassProperties3D(&cFillTopData,spBody );
       if(NULL==cMassProperties3D)
        {
                cout<<"Error in cMassProperties3D !"<<endl;
                return FALSE;
        }
CATMathPoint pGravity=cMassProperties3D ->GetCenterOfGravity();
        double Gx,Gy,Gz;
        Gx=pGravity.GetX();
        Gy=pGravity.GetY();
        Gz=pGravity.GetZ();
      

作者: leihaizhe    时间: 2012-11-19 09:28
linlily0925 发表于 2012-11-19 09:09
CATIGeometricalElement_var spRefFillofGE=spFill;//spFill为面片
        CATBody_var spRefFil ...

请问你这些代码是自己编写的还是 实例中有的?如果是实例,请问是哪个教学实例中的?谢谢啊
作者: linlily0925    时间: 2012-11-19 10:25
自己写的哦~~~不知道实例中可有~~你只要知道CATDynCreateMassProperties3D就可以了~~
作者: leihaizhe    时间: 2012-11-19 10:53
linlily0925 发表于 2012-11-19 10:25
自己写的哦~~~不知道实例中可有~~你只要知道CATDynCreateMassProperties3D就可以了~~

spFill是个什么类型呢?我用CATSurface和CATISpecObject_var的类型带进去,报错了。。。
作者: zsong22    时间: 2012-11-19 11:37
有相同问题   学习学习一下.
作者: linlily0925    时间: 2012-11-19 13:22
leihaizhe 发表于 2012-11-19 10:53
spFill是个什么类型呢?我用CATSurface和CATISpecObject_var的类型带进去,报错了。。。

CATISpecObject_var类型,转换之前先update
作者: zsong22    时间: 2012-11-19 14:26
貌似 还是类型转换问题  或者 拓扑与几何图形间的问题   vs里面没报错  我做了下调试时 在catia里面报这个错  C:\1.jpg
作者: zsong22    时间: 2012-11-19 14:27
报错 提示框
作者: zsong22    时间: 2012-11-19 14:33
_pPoint2Agent -> AddOrderedElementType("CATSurface");




//选择CATSurface面
CATBoolean NIxiangjiaohe::SurfaceSelected(void *iData)
{               
        CATBaseUnknown *ppSelection=NULL;
        ppSelection= _pPoint2Agent->GetElementValue(_pPoint2Agent->GetValue());//捕获CATSurface类型面
        spSpecObject2 = ppSelection;       

        if (spSpecObject2 == NULL_var)         //特征化操作
        {       
                CATIFeaturize_var spToFeaturize = ppSelection;       
                spSpecObject2 = spToFeaturize->FeaturizeR(MfPermanentBody |MfLastFeatureSupport |MfRelimitedFeaturization);
        }       

        CATUnicodeString FeatNamep = spSpecObject2->GetDisplayName();
        _PanelH->SetName(2,FeatNamep,0);
        cout<<"执行函数SurfaceSelected"<<endl;
        _pPoint2Agent -> InitializeAcquisition();//重用代理
        return FALSE;

}





//寻找面重心
        spSpecObject2->Update();
            CATIGeometricalElement_var spRefFillofGE=spSpecObject2;// 为面片
        CATBody_var spRefFillbodyofGE=spRefFillofGE->GetBodyResult();
        CATDynMassProperties3D* cFillDynCreateMassProperties3D;
        CATTopData(cFillTopData);
        cFillDynCreateMassProperties3D=CATDynCreateMassProperties3D(&cFillTopData,spRefFillbodyofGE); //这个地方有个类型转换CATBody转换为CATFace
       if(NULL==cFillDynCreateMassProperties3D)
        {
                cout<<"Failed in getting interface CATDynMassProperties3D !"<<endl;
        }
        CATMathPoint cGravity=cFillDynCreateMassProperties3D->GetCenterOfGravity();
        double GravCoords[3];
        GravCoords[0]=cGravity.GetX();
        GravCoords[1]=cGravity.GetY();
        GravCoords[2]=cGravity.GetZ();
作者: linlily0925    时间: 2012-11-19 15:15
zsong22 发表于 2012-11-19 14:27
报错 提示框

程序里面检查一下吧~~~你哪个句柄为空了~~~
作者: zsong22    时间: 2012-11-19 16:46
linlily0925  你好                  我这个面是通过手动选取而捕获的
_pPoint2Agent -> AddOrderedElementType("CATSurface");      //捕获面 限定为CATSurface

下面:为捕获面的响应函数
//选择CATSurface面
CATBoolean NIxiangjiaohe::SurfaceSelected(void *iData)
{               
        CATBaseUnknown *ppSelection=NULL;
        ppSelection= _pPoint2Agent->GetElementValue(_pPoint2Agent->GetValue());//捕获CATSurface类型面              
        spSpecObject2 = ppSelection;        //我怀疑 这里出了问题   

        if (spSpecObject2 == NULL_var)         //特征化操作
        {        
                CATIFeaturize_var spToFeaturize = ppSelection;        
                spSpecObject2 = spToFeaturize->FeaturizeR(MfPermanentBody |MfLastFeatureSupport |MfRelimitedFeaturization);
        }        

        CATUnicodeString FeatNamep = spSpecObject2->GetDisplayName();
        _PanelH->SetName(2,FeatNamep,0);
        cout<<"执行函数SurfaceSelected"<<endl;
        _pPoint2Agent -> InitializeAcquisition();//重用代理
        return FALSE;

}



我测试过   后面生成重心绝对没问题。     我用创建的一个球面  来生成重心已经成功了。 就是不知道 通过人工选取的面 为啥就出问题。     我通过选取面 对这个面的法线都能生成,  这重心就是出问题。


作者: linlily0925    时间: 2012-11-19 16:54
zsong22 发表于 2012-11-19 16:46
linlily0925  你好                  我这个面是通过手动选取而捕获的
_pPoint2Agent -> AddOrderedElemen ...

如果你是通过拓扑选择的,比如说你选择体的某一个面,你得先将这个面转化为CATISpecObject类型,我只做过将选择的面的一条边转化为CATISpecObject类型,不过方法应该是一样的,我把代码待会贴上去,你按照那个方法试试哈~~
作者: linlily0925    时间: 2012-11-19 16:56
zsong22 发表于 2012-11-19 16:46
linlily0925  你好                  我这个面是通过手动选取而捕获的
_pPoint2Agent -> AddOrderedElemen ...

    CATBaseUnknown *piUnknown1 = _Line2SelectAgent->GetElementValue();//为选择线条的Agent
    CATBaseUnknown_var spUnknown1;
    spUnknown1=piUnknown1;   

    _spLine2 = spUnknown1;
    if(_spLine2 != NULL_var)
    {
        _Panel->SetLine2Name(_spLine2);
        _Line2SelectAgent->InitializeAcquisition();

        _Panel->SetOKSensitivity(CATDlgEnable);

        return TRUE;
    }


    cout<<"Topo Begin"<<endl;
    CATIBRepAccess* pEdgeCurve = NULL;
    HRESULT hr = piUnknown1->QueryInterface(IID_CATIBRepAccess,(void**) &pEdgeCurve);
    if(pEdgeCurve == NULL)
    {
        cout<<"Error in pEdgeCurve"<<endl;
        _Line2SelectAgent->InitializeAcquisition();
        return FALSE;
    }

    CATIFeaturize * pIFeaturizeOnPlane = NULL ;
    HRESULT rc = pEdgeCurve->QueryInterface(IID_CATIFeaturize,(void **) &pIFeaturizeOnPlane);
    if(pIFeaturizeOnPlane == NULL)
    {
        cout<<"Error in pEdgeCurvepIFeaturizeOnPlane"<<endl;
        _Line2SelectAgent->InitializeAcquisition();
        return FALSE;
    }

    CATISpecObject_var spObjectFromCell = pIFeaturizeOnPlane->FeaturizeF();
    if(spObjectFromCell == NULL_var)
    {
        cout<<"Error in spObjectFromCell!"<<endl;
        _Line2SelectAgent->InitializeAcquisition();
        return FALSE;
    }
作者: 歆韵    时间: 2012-11-19 20:40
linlily0925 发表于 2012-11-19 09:09
if(spSpecFill == NULL_var)
{
cout

这段代码看着很是熟悉,我们找了好久,终于确信是出自YY之手,很遗憾的告诉你,我们在你电脑上找到了高级培训的练习,自动生成部分是YY的用户名
作者: zsong22    时间: 2012-11-20 09:03
linlily0925 发表于 2012-11-19 16:54
如果你是通过拓扑选择的,比如说你选择体的某一个面,你得先将这个面转化为CATISpecObject类型,我只做过 ...

丽丽你好   昨天你给我的那个手动选取线的代码 我看了 跟我选取面的方法是一样的。      折腾了一晚上,还是没搞定,貌似还是类型啊,或者什么地方出了问题。  因为,我获取的面 在catia上面测试时都 能生成这个面对应的法线,但是这个面的重心就不行了。
更遗憾的是,因为我权限太低,更本无法给你留言或者发送信息。 无法私底下表示感谢。
不管怎样  非常感谢你对我的帮助。 Tanks  anyway!
作者: linlily0925    时间: 2012-11-20 09:19
zsong22 发表于 2012-11-20 09:03
丽丽你好   昨天你给我的那个手动选取线的代码 我看了 跟我选取面的方法是一样的。      折腾了一晚上,还 ...

嘿嘿  没事 我给你留言了  ~~~我今天有时间看一下你的那个问题~~~
作者: linlily0925    时间: 2012-11-20 09:20
zsong22 发表于 2012-11-20 09:03
丽丽你好   昨天你给我的那个手动选取线的代码 我看了 跟我选取面的方法是一样的。      折腾了一晚上,还 ...

我给你发送消息了~~你查收一下哈~~
作者: linlily0925    时间: 2012-11-20 10:19
zsong22 发表于 2012-11-20 09:03
丽丽你好   昨天你给我的那个手动选取线的代码 我看了 跟我选取面的方法是一样的。      折腾了一晚上,还 ...

//===============================选择面======================================//
CATBaseUnknown *piUnknown1 = _SurfaceSelectAgent->GetElementValue();//_SurfaceSelectAgent为选择面机制
    CATBaseUnknown_var spUnknown1;
    spUnknown1=piUnknown1;   

    _spSpecSurface = spUnknown1;
    if(_spSpecSurface != NULL_var)
    {
        _Panel->SetSurfaceName(_spSpecSurface);
        _SurfaceSelectAgent->InitializeAcquisition();
        _Panel->SetOKSensitivity(CATDlgEnable);
        return TRUE;
    }

    cout<<"Topo Begin"<<endl;
    CATIBRepAccess* pEdgeCurve = NULL;
    HRESULT hr = piUnknown1->QueryInterface(IID_CATIBRepAccess,(void**) &pEdgeCurve);
    if(pEdgeCurve == NULL)
    {
        cout<<"Error in pEdgeCurve"<<endl;
        _SurfaceSelectAgent->InitializeAcquisition();
        return FALSE;
    }

    CATBody_var spBodyTest = pEdgeCurve->CreateBody( );
    if(spBodyTest == NULL_var)
    {
        cout<<"Error in spBodyTest"<<endl;
        _SurfaceSelectAgent->InitializeAcquisition();
        return FALSE;
    }

//==================================求重心=====================================//
   CATDynMassProperties3D* cMassProperties3D;
    cMassProperties3D = CATDynCreateMassProperties3D(spBodyTest);
    if(NULL==cMassProperties3D)
    {
        cout<<"Error in cMassProperties3D !"<<endl;
        RequestDelayedDestruction();
        return FALSE;
    }
    CATMathPoint pGravity = cMassProperties3D ->GetCenterOfGravity();
    double Gx,Gy,Gz;
    Gx=pGravity.GetX();
    Gy=pGravity.GetY();
    Gz=pGravity.GetZ();
    cout<<"Gx   "<<Gx<<endl;
    cout<<"Gy   "<<Gy<<endl;
    cout<<"Gz   "<<Gz<<endl;
之前的代码错在将CATISpecObject转化为CATIGeometricalElement_var元素时出错~~其实如果只是为了求重心,木有必要转化为CATISpecObject类型,直接转化为CATBody即可~~
代码我这边测试过了,木有问题~~~


作者: zsong22    时间: 2012-11-20 11:33
非常 感谢!{:soso_e176:}




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