iCAx开思工具箱

标题: CAA 如何获取split的分割面的边界 并将其投影到草图 [打印本页]

作者: duobeCAT    时间: 2013-11-13 09:34
标题: CAA 如何获取split的分割面的边界 并将其投影到草图
CATI2DWFFactory_var sp2DWFactory=spSketch;
CATListValCATI2DWFGeometry_var sp2DGeometries;
CATISpecObject_var spProjection = sp2DWFactory->ProjectGeometry(spSpecBoundary,sp2DGeometries);
想通过上面的代码将split的分割面的边界投影到草图上,但是不知道如何才能获取到split的分割面的边界,哪位能帮个忙

作者: 湖泊的话    时间: 2013-11-30 15:04


CATIGSMBoundary_var CreateBoundary( [td]const CATISpecObject_var [td]iElem,
const CATISpecObject_var [td]iSupport,
CATIGSMBoundaryPropag [td]iPropagationType [td]= BOUNDARY_TANGENT_PROPAG,
const CATISpecObject_var [td]iFrom [td]= NULL_var,
const CATISpecObject_var [td]iTo [td]= NULL_var,
CATGSMOrientation [td]iOrientationFrom [td]= CATGSMSameOrientation,
CATGSMOrientation [td]iOrientationTo [td]= CATGSMSameOrientation) = 0
抽取面的边界
作者: cati_fuel    时间: 2013-12-2 21:36
湖泊的话 发表于 2013-11-30 15:04
抽取面的边界

好长时间都没有人回答,自己琢磨了很久已经实现了。
具体方法如下:
先是获取Split特征的CATISplit接口,接口指针取名为 pSplit

    //设置当前工作对象为PartBody(零件文档中的“零件几何体”)
    pIPrtPart -> SetCurrentFeature(spSpecPartBody);

    //创建草图
    CATListValCATISpecObject_var spRefencePlanes = pIPrtPart->GetReferencePlanes();//1、2、3分别对应xy、yz、zx平面
    CATISketchFactory_var spSketchFactory = pSpecContainer;//pSpecContainer通过GetSpecContainer()获取
    CATISketch_var spSketch = spSketchFactory -> CreateSketch(spRefencePlanes[1]);
    CATISketchEditor_var spSketchEd = spSketch;
    CATI2DWFFactory_var sketch2DFactory = spSketch;

    //获取分割面BRep
    CATIMfGeometryAccess *pSplitAsGeomAccess = NULL;
    HRESULT hr = pSplit -> QueryInterface(IID_CATIMfGeometryAccess,(void**)&pSplitAsGeomAccess);
    CATLISTV(CATBaseUnknown_var) SplitBReps;
    if(SUCCEEDED(hr))
    {
        pSplitAsGeomAccess -> GetBReps(SplitBReps);
    }
    CATIBRepAccess *pSplitSurAccess = NULL;
    SplitBReps[1] -> QueryInterface(IID_CATIBRepAccess,(void**)&pSplitSurAccess);
    CATLISTV(CATBaseUnknown_var) FaceBrep = pSplitSurAccess -> GetBReps(2);

    //将边界投影到草图
    spSketchEd -> OpenEdition();
    CATListValCATI2DWFGeometry_var spList2D;
    CATISpecObject_var spProjection = sketch2DFactory -> ProjectGeometry(FaceBrep[1],spList2D);

    spSketchEd -> SaveEdition();
    spSketchEd -> CloseEdition();
    spSpecPart -> Update();


作者: cati_fuel    时间: 2013-12-2 22:02
cati_fuel 发表于 2013-12-2 21:36
好长时间都没有人回答,自己琢磨了很久已经实现了。
具体方法如下:
先是获取Split特征的CATISplit接口 ...

才发现自己注册了两个号


作者: 湖泊的话    时间: 2013-12-4 10:24
cati_fuel 发表于 2013-12-2 21:36
好长时间都没有人回答,自己琢磨了很久已经实现了。
具体方法如下:
先是获取Split特征的CATISplit接口 ...

方法不错,不过在如下代码中:
if(SUCCEEDED(hr))
    {
        pSplitAsGeomAccess -> GetBReps(SplitBReps);
    }
    CATIBRepAccess *pSplitSurAccess = NULL;
    SplitBReps[1] -> QueryInterface(IID_CATIBRepAccess,(void**)&pSplitSurAccess);
如果获取SplitBReps失败,运行至“ SplitBReps[1] -> QueryInterface”处你的程序会崩掉的~
作者: cati_fuel    时间: 2013-12-9 18:21
湖泊的话 发表于 2013-12-4 10:24
方法不错,不过在如下代码中:
if(SUCCEEDED(hr))
    {

我做的是针对零件文档Part Design下的一个Addin,测试的时候,用函数GetBReps(SplitBReps)可以获取到唯一的一个BRep;为防止程序崩掉,可以先判断GetBReps()成功与否以及SplitBReps中是否有元素,然后再执行SplitBReps[1] -> QueryInterface()。





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