找回密码 注册 QQ登录
一站式解决方案

iCAx开思网

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

[求助] 如何求得一个曲面的重心点

[复制链接]
11
发表于 2012-11-19 14:33:15 | 只看该作者
_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();
12
发表于 2012-11-19 15:15:02 | 只看该作者
zsong22 发表于 2012-11-19 14:27
报错 提示框

程序里面检查一下吧~~~你哪个句柄为空了~~~
13
发表于 2012-11-19 16:46:36 | 只看该作者
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;

}



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

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

如果你是通过拓扑选择的,比如说你选择体的某一个面,你得先将这个面转化为CATISpecObject类型,我只做过将选择的面的一条边转化为CATISpecObject类型,不过方法应该是一样的,我把代码待会贴上去,你按照那个方法试试哈~~
15
发表于 2012-11-19 16:56:42 | 只看该作者
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;
    }
16
发表于 2012-11-19 20:40:19 | 只看该作者
linlily0925 发表于 2012-11-19 09:09
if(spSpecFill == NULL_var)
{
cout

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

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

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

我给你发送消息了~~你查收一下哈~~
20
发表于 2012-11-20 10:19:55 | 只看该作者
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即可~~
代码我这边测试过了,木有问题~~~

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

GMT+8, 2024-12-27 14:27 , Processed in 0.034993 second(s), 10 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2024 www.iCAx.org

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