Inserting Shape Design Features into Different Geometrical Feature Sets-创建不同类型的几何特征集并插入外形设计特征

摘要

本文介绍 CAAGsiBodyGSAndOGS 示例。该示例讲解如何创建不同类型的几何图形集,并在其中实例化特征。
  • 通过本示例您将学到的内容
  • CAAGsiBodyGSAndOGS 示例
    • CAAGsiBodyGSAndOGS 的功能
    • 如何运行 CAAGsiBodyGSAndOGS
    • 在哪里可以找到 CAAGsiBodyGSAndOGS 代码
  • 分步实现
  • 小结
  • 参考文献

通过本示例您将学到的内容

本示例旨在演示如何创建不同类型的几何特征集,包括几何体、几何图形集(GS)和有序几何图形集(OGS)。
同时还将演示:根据当前特征集或目标特征集,在结构树中插入各类外形设计特征的方法。

CAAGsiBodyGSAndOGS 示例

CAAGsiBodyGSAndOGS 是 CAAGSMInterfaces.edu 框架下的一个示例,用于演示如何在结构树中插入外形设计特征以及插入的位置,该示例使用了 GSMInterfaces 框架和 MechanicalModeler 框架的相关功能。

图片

 

CAAGsiBodyGSAndOGS 的功能

该示例用于创建不同类型的特征集,并在其中插入各类特征。

如何运行 CAAGsiBodyGSAndOGS

要运行 CAAGsiBodyGSAndOGS,您需要配置编译环境,编译 CAAGsiBodyGSAndOGS 及其依赖组件,再配置运行环境,然后执行该示例程序 [1]。
CAAGsiBodyGSAndOGS 示例中使用了 CAAGsiUserTools API。
按如下方式运行示例:
在 Windows 系统下e:>CAAGsiBodyGSAndOGS 输出目录\CAAGsiBodyGSAndOGS.CATPart
在 UNIX 系统下$ CAAGsiBodyGSAndOGS 输出目录/CAAGsiBodyGSAndOGS.CATPart
其中:
  • outputDirectory:保存 CAAGsiBodyGSAndOGS.CATPart 文件的目录
  • CAAGsiBodyGSAndOGS.CATPart:包含喷嘴形状结果的零件文件

CAAGsiBodyGSAndOGS 代码位置

CAAGsiBodyGSAndOGS 示例的主程序位于 CAAGSMInterfaces.edu 框架下的 CAAGsiBodyGSAndOGS.m 模块中:
  • Windows 路径  InstallRootDirectory\CAAGSMInterfaces.edu\CAAGsiBodyGSAndOGS.m\
  • Unix 路径  InstallRootDirectory/CAAGSMInterfaces.edu/CAAGsiBodyGSAndOGS.m/
    其中 InstallRootDirectory 为 CATIA CAA 安装光盘的安装根目录。

分步实现

CAAGsiBodyGSAndOGS 示例包含六个逻辑步骤:
  • 初始化准备
  • 创建不同类型的几何特征集
  • 在几何体、几何图形集和有序几何图形集中插入外形设计特征
  • 保存并关闭会话
接下来我们将通过查看 CAAGsiBodyGSAndOGS 文件主方法的代码,对以上各个部分进行讲解说明。

 

初始化准备

CAAGsiBodyGSAndOGS 示例首先创建会话并打开输入的 CATPart 文件。

注意:下面这段代码的关键之处在于,必须调用 CATPrtContainer 接口的 GetPart() 方法。该方法用于在会话中加载零件的各类容器。

...
// 创建会话
char *pSessionName = "SampleSession";
CATSession *pSession = NULL; 
rc = Create_Session(pSessionName, pSession); 
if (NULL == pSession ) {
   cout<<" (CAAGsiBodyGSAndOGS) 错误: Create_Session" << endl ;
   TestCaseError = 1 ;
}

// 加载并初始化文档
cout<<"输入文档 " << InputName << " 已打开" << endl ;
CATDocument *pDoc = NULL; 
rc = CATDocumentServices::OpenDocument(InputName, pDoc) ;

if (NULL == pDoc ) {
   cout<<" (CAAGsiBodyGSAndOGS) 错误 CATDocumentServices::OpenDocument" << endl ;
   TestCaseError = 2 ;
}

// 零件容器
CATIPrtContainer *piPartContainer = NULL ; 
CATIPrtPart_var spPrtPart; 

if ( NULL != pDoc ) { 
   // 查询文档以获取根容器
   CATInit *pDocAsInit = NULL; 
   pDoc->QueryInterface(IID_CATInit, (void**)&pDocAsInit) ; 
   if ( NULL != pDocAsInit ) {

    // 从文档中提取零件引用至 hPartAsRequest
   piPartContainer = 
      (CATIPrtContainer*)pDocAsInit->GetRootContainer("CATIPrtContainer");
   pDocAsInit->Release(); pDocAsInit = NULL ;

   if( NULL != piPartContainer ) {
      CATISpecObject_var spPart = piPartContainer->GetPart() ; 
      spPrtPart = spPart ;
   } 
} 
...

在初始化阶段,还会获取线框与外形设计工厂、零件设计工厂以及零件设计布尔运算工厂。

...
// 获取创成式外形设计工厂接口
CATIPrtFactory_var spPrtFact; 
CATIPrtBooleanFactory_var spBoolPrtFact; 
CATIGSMFactory_var spGsmFact; 
if ( NULL != piPartContainer ) { 
   CATIGSMFactory * _pFact =NULL; 
   rc = piPartContainer -> QueryInterface(IID_CATIGSMFactory ,(void**)&_pFact);
   if (SUCCEEDED(rc) ) {
     spGsmFact = _pFact;
     if (_pFact) _pFact -> Release(); _pFact = NULL; 
  }

  // 获取零件设计工厂接口
   CATIPrtFactory * _pPrtFact =NULL; 
   rc = piPartContainer -> QueryInterface(IID_CATIPrtFactory ,(void**)&_pPrtFact);
   if (SUCCEEDED(rc) ) {
       spPrtFact = _pPrtFact;
       if (_pPrtFact) _pPrtFact -> Release();
       _pPrtFact = NULL;
       }
    }
   CATIPrtBooleanFactory * _pBoolPrtFact =NULL; 
   rc = piPartContainer -> QueryInterface(IID_CATIPrtBooleanFactory ,(void**)&_pBoolPrtFact);
   if (SUCCEEDED(rc) ) {
        spBoolPrtFact =  _pBoolPrtFact;
        if (_pBoolPrtFact) _pBoolPrtFact -> Release(); _pBoolPrtFact = NULL; 
    }
}
....

创建不同类型的几何特征集

示例中会将工作对象的类型作为输入参数。
可用于存放外形设计特征的几何特征集共有三种类型:
  • Body(几何体):机械特征对象,可聚合实体零件设计特征,以及点、线、曲面等外形设计特征。
  • Geometrical Set(几何图形集,GS):可插入点、线、面、体积等外形设计特征,为无序集,集内元素无创建顺序约束。
  • Ordered Geometrical Set(有序几何图形集,OGS):可插入点、线、面、体积等外形设计特征,元素按顺序排列,并可根据特征关联规则被吸收(需实现 MecmodInterfaces 框架的 CATIInputDescription 接口,例如 “分割” 特征为修改型特征,其主输入会被吸收)。
本示例使用通用工具 CAAGsiCreateGeometricFeatureSets 来创建特征集,该工具位于:
  • Windows:InstallRootDirectory\CAAGSMInterfaces.edu\CAAGsiServices.m\
  • Unix:InstallRootDirectory/CAAGSMInterfaces.edu/CAAGsiServices.m/

其中 InstallRootDirectory 为 CATIA CAA 安装光盘的根目录。

...
// 创建几何特征集
//---------------------------------------------------------------
int Diag = -1 ;
CATISpecObject_var spSpecTool ;
CATISpecObject_var spParentTool ;
CATUnicodeString iName ;
iName="";

// 示例中可创建三种类型的特征集
// -  TYPE_GeometricalSet
// -  TYPE_OrderedGeometricalSet
// -  TYPE_Body
iTypeOfTool = TYPE_GeometricalSet ;
spParentTool = NULL_var ;
rc = CAAGsiCreateGeometricFeatureSets (spCont, iName , spParentTool , spSpecTool , Diag , UNDER_Part , iTypeOfTool);
if (FAILED(rc)) {
   cout << "(CAAGsiBodyGSAndOGS) ERROR CAAGsiCreateGeometricFeatureSets = " << Diag << endl << flush;
   RetCode = 3 ;
}
...

下面详细讲解通用创建服务 CAAGsiCreateGeometricFeatureSets(CAAGsiServices.m 模块)的实现逻辑。

根据 TopLevelspParentForTool 参数,可分为三种创建场景:
  • 在零件下创建特征集
  • 在指定特征集下创建子特征集
  • 在当前特征下创建特征集

步骤 1:检查并确定父对象(待创建几何特征集的父级)

 

...
// 引用零件
CATISpecObject_var spSpecPart = spPart;
CATISpecObject_var spParentForTool ;

// 在零件根节点下创建特征集
if (iTopLevel==1 ) {
     spParentForTool = spPart ;
}

// 在指定父特征集下创建
else if (iTopLevel==0 && spInputParentTool != NULL_var ) {
   CATIBasicTool_var spSpecBasicTool = spInputParentTool ; // 校验传入的父级是否为有效特征集
   if ( NULL_var != spSpecBasicTool ) {
          spParentForTool = spInputParentTool ;
     }
    ...
}

// 在零件当前对象之后创建
else if (iTopLevel==0 && spInputParentTool == NULL_var ) {
    // 获取当前特征集
    CATIBasicTool_var spCurrentTool = spPart -> GetCurrentTool();
    spParentForTool = spCurrentTool;

    // 读取当前特征:特征集需插入在当前特征之后
    CATISpecObject_var spCurrentFeat = spPart->GetCurrentFeature();

   // 设置在当前特征集中的插入位置
   // 若当前特征本身就是特征集,则位置=0,插入到特征集末尾
   if ( spCurrentFeat != spCurrentTool) {
      // 读取当前特征在特征集中的位置
      CATIDescendants_var spRoot = spCurrentTool;
      Position = spRoot -> GetPosition( spCurrentFeat);
   }
}
...

步骤 2:校验目标零件是否为待创建特征集的合法父级

当几何特征集需要插入到指定父级下方时(TopLevel == 0),必须校验目标类型与父级兼容。

例如:几何图形集(GS)不能插入到几何体(Body)下方。注:当父级为零件根节点(TopLevel == 1)时,可直接创建任意类型特征集。

...
// TopLevel == 0  // 特征集将插入到指定父特征集下
// 需要校验待创建特征集与目标父集兼容
if (iTopLevel==0) {
   CATIMmiNonOrderedGeometricalSet_var spNonOrderedGeomSet = spParentForTool ;
   CATIMmiOrderedGeometricalSet_var spOrderedGeomSet = spParentForTool ;
   CATIMechanicalTool_var spMechanicalSet = spParentForTool ;

   if (iType == 0 ) {
      if ( NULL_var != spNonOrderedGeomSet ) {
           oDiag = 0; // GS 可插入到 GS 内或 GS 内的特征下
      }
      else {
           cout<<" (CAAGsiCreateGeometricFeatureSets) 错误,GS 仅可插入到另一个 GS 下或直接在零件下"<< endl ;
           oDiag =1 ; // 试图将 GS 插入到 Body 或 OGS 下
      }
   }
   else if (iType == 1 || iType ==2 ) {
       if ( NULL_var != spOrderedGeomSet || NULL_var != spMechanicalSet ) {
           oDiag = 0; // Body 或 OGS 可插入到 Body 或 OGS 下
       }
      else {
           cout<<" (CAAGsiCreateGeometricFeatureSets) 错误,Body 或 OGS 仅可插入到另一个 Body/OGS 下或直接在零件下"<< endl ;
           oDiag =2 ; // 试图将 Body/OGS 插入到 GS 下
    }
}
...

步骤 3:创建特征集

创建几何体、几何图形集或有序几何图形集。
...
// 创建特征集
if (oDiag < 1) {
    // 阶段3:创建 GSM 特征集
    // ---------------------------------------------
    if (NULL_var != spParentForTool)
    {
       CATIMechanicalRootFactory_var spMechRoot = ispCont ;
       if (NULL_var != spMechRoot) {
       // 创建几何图形集 GS
       if (0 == iType ) {
          rc = spMechRoot -> CreateGeometricalSet(iName,spParentForTool,spSpecTool,Position);
       }
       // 创建有序几何图形集 OGS
       else  if (1 == iType ) {
         rc = spMechRoot -> CreateOrderedGeometricalSet(iName,spParentForTool,spSpecTool,Position);
       }
       // 创建几何体 Body
       else  if (2 == iType ) {
         spSpecTool  = spMechRoot -> CreatePRTTool(iName,spParentForTool,Position);
    }
}
...

在几何体、几何图形集和有序几何图形集中插入外形设计特征

创建的点、线或曲面可以插入到 ** 几何体(Body)、几何图形集(GS)、有序几何图形集(OGS)** 中的任意一种。
...
// 创建扫掠曲面
CATIGSMSweepUnspec_var spExplSweep1 = 
      spGsmFact -> CreateExplicitSweep(spSpecSpline1,spSpecPLine1,NULL_var , NULL_var , NULL_var );
CATISpecObject_var spSpecExplSweep1 = spExplSweep1 ;
CAAGsiInsertInProceduralView( spSpecExplSweep1 , NULL_var ) ; 
rc = CAAGsiObjectUpdate(spSpecExplSweep1) ;
spPrtPart -> SetCurrentFeature(spSpecExplSweep1);
  ...

使用了通用工具 CAAGsiInsertInProceduralViewCAAGsiObjectUpdate(位于 CAAGsiServices.m 模块):
  • 前者直接调用 GSMInterfaces 框架中 CATIGSMProceduralView 接口的 InsertInProceduralView 方法
  • 后者对特征执行更新,并执行有序几何图形集(OGS)和几何体(Body)所需的标准机械服务

注意:必须将创建的特征设置为当前特征。虽然这对插入几何图形集(GS)无影响,但对有序几何图形集(OGS)和几何体(Body)是必需的。

创建的外形设计特征 / 体积特征 ** 只能插入到几何图形集(GS)或有序几何图形集(OGS)** 中(创建体积特征需要 GSO 许可证)。

示例:如果特征集是几何体(Body),则仅能插入曲面拉伸特征,无法插入体积特征。

...
// 曲面或体积特征
// -------------------------------------------------------------

// --- 体积特征 / 仅可插入到 GS 或 OGS(曲面特征集)
CATGSMFeatureContextType GSDCreationContext ;

if ( TYPE_GeometricalSet == iTypeOfTool || TYPE_OrderedGeometricalSet == iTypeOfTool ) { 
       cout<<" (CAAGsiBodyGSAndOGS) 创建体积特征 / 当前特征集为 GS 或 OGS " << endl ;
       // -- 在体积上下文下创建特征
       // 支持的特征:GSD 拉伸/旋转/多截面曲面/扫掠
       // 注意:输入轮廓必须是闭合曲线或曲面(特征创建时会校验)
       GSDCreationContext= CATGSMVolumeCtxt; 
}

else if (TYPE_Body == iTypeOfTool) { 
       cout<<" (CAAGsiBodyGSAndOGS) 创建曲面特征 / 当前特征集为 Body - 无法插入体积特征 " << endl ;
       // -- 在标准 GSD 上下文(曲面)下创建特征
       GSDCreationContext= CATGSMSurfaceCtxt; 
}


// 拉伸特征1
spCkeStart= CreateLength ( spCkeFact, "Start", 0 );
spCkeEnd = CreateLength ( spCkeFact, "End" , 100.0);
CATIGSMDirection_var Dir1 =spGsmFact -> CreateDirection ( spListPlane[1]); 
CATIGSMExtrude_var spExtrude1 = spGsmFact -> CreateExtrude ( spSpecPLine , Dir1 , spCkeStart, spCkeEnd, TRUE) ;

// 初始化特征上下文
spExtrude1 -> SetContext(GSDCreationContext) ; 

CATISpecObject_var spSpecExtr1 = spExtrude1 ; 
CAAGsiInsertInProceduralView( spSpecExtr1 , NULL_var ) ;
CAAGsiObjectUpdate(spSpecExtr1) ;
spPrtPart -> SetCurrentFeature(spSpecExtr1);
...

 

保存并关闭会话

保存零件并关闭会话
... 
// 保存
if (NULL != OutputName )      {    
    rc = CATDocumentServices::SaveAs(*pDoc, OutputName );
    if (SUCCEEDED(rc))   {
            cout<<" (CAAGsiBodyGSAndOGS) 文档已保存 " << endl ;
     }
     else {
            cout<<"保存文档出错" << endl ;
     }
}    
// 关闭文档
CATDocumentServices::Remove(*pDoc);
   
// 结束会话并释放文档
Delete_Session("SampleSession");
...

小结

本示例演示了创建几何体(Body)、几何图形集(GS)和有序几何图形集(OGS)的多种方案与功能,并根据对象类型提供了不同的插入特征解决方案。
posted @ 2026-04-03 15:20  Breadss  阅读(2)  评论(0)    收藏  举报