Creating Volume Form Features-使用外形设计与零件设计工厂,创建基于体积的造型特征。

摘要

本文介绍 CAAGsiVolumeFormFeatures 示例。该示例讲解如何创建体积造型特征。
  • 通过本示例您将学到的内容
  • CAAGsiVolumeFormFeatures 示例
    • CAAGsiVolumeFormFeatures 的功能
    • 如何运行 CAAGsiVolumeFormFeatures
    • CAAGsiVolumeFormFeatures 代码位置
  • 分步实现
  • 小结
  • 参考文献
 

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

本示例演示如何使用外形设计零件设计工厂来创建体积特征。体积特征既可以在外形设计工厂中创建,也可以在零件设计工厂中创建。
注意:体积特征的创建需要 GSO 模块 的许可证支持。
  • 外形设计:拉伸、旋转、多截面体积、扫掠体积
  • 零件设计:闭合体积、加厚体积、拔模、拔模角度、反射线拔模、缝合体积、抽壳

CAAGsiVolumeFormFeatures 示例

CAAGsiVolumeFormFeatures 是 CAAGSMInterfaces.edu 框架下的一个示例,用于演示如何通过外形设计与零件设计工具创建各类体积特征(拉伸、旋转、加厚、闭合、多截面体积、扫掠等)。

图片

 

CAAGsiVolumeFormFeatures 的功能

CAAGsiVolumeFormFeatures 的目的是演示如何使用外形设计工厂或零件设计工厂创建体积特征
体积特征属于曲面类特征,它们在 CATMf3DBehaviorIsAShape() 方法中返回 TRUE,同时在 CATIMf3DBehavior2IsAVolume() 方法中也返回 TRUE
体积特征 ** 只能插入到结构树中的几何图形集(GS)或有序几何图形集(OGS)** 中。

使用外形设计工厂(CATIGSMFactory)创建体积

  • 由外形设计工厂创建的体积是对应曲面特征的扩展形式,创建方法与曲面一致。CAA 用户只需通过对应特征接口的 SetContext 方法,指定结果为曲面类型或体积类型即可。
  • 体积创建要求:输入必须是闭合轮廓线(如拉伸截面)或曲面(如拉伸成形曲面),否则体积更新时会报错。
  • 体积创建完成后,必须通过 CATIGSMProceduralView 接口插入到结构树。如果当前工作对象是几何体(Body),系统会自动在 Body 内创建一个 OGS,用于存放该体积特征。

使用零件设计工厂(CATIPrtFactory 或 CATIPrtBooleanFactory)创建体积

  • 零件设计工厂提供专门创建体积特征的方法(例如 CreateVolumicCloseSurface)。
  • 零件设计工厂的体积方法在创建时会自动将结果特征插入结构树,只需后续执行更新即可。如果当前工作对象是 Body,系统同样会自动在 Body 内创建 OGS 并将体积插入其中。可使用 CAAGsiObjectUpdate 服务完成更新。

如何运行 CAAGsiVolumeFormFeatures

要运行 CAAGsiVolumeFormFeatures,您需要先配置编译环境,然后编译 CAAGsiVolumeFormFeatures 及其依赖组件,再配置运行环境,最后执行该示例程序 [1]。
请按以下方式运行示例:
在 Windows 系统下  e:\CAAGsiVolumeFormFeatures InstallDir\CAAGSMInterfaces.edu\Data.d\CAAGsiStartVolume.CATPart outputDirectory\CAAGsiVolumeFormFeatures.CATPart
在 UNIX 系统下  ./CAAGsiVolumeFormFeatures InstallDir/CAAGSMInterfaces.edu/Data.d/CAAGsiStartVolume.CATPart outputDirectory/CAAGsiVolumeFormFeatures.CATPart
参数说明:
    • inputDirectory:  存放 CAAGsiStartVolume.CATPart 文件的目录
    • outputDirectory:  保存生成的 CAAGsiVolumeFormFeatures.CATPart 文件的目录
    • CAAGsiVolumeFormFeatures.CATPart:包含使用基准曲面创建的零件文件

CAAGsiVolumeFormFeatures 代码位置

CAAGsiVolumeFormFeatures 示例的主程序位于 CAAGSMInterfaces.edu 框架下的 CAAGsiVolumeFormFeatures.m 模块中:
  • Windows 路径
     
    InstallRootDirectory\CAAGSMInterfaces.edu\CAAGsiVolumeFormFeatures.m\
  • Unix 路径
     
    InstallRootDirectory/CAAGSMInterfaces.edu/CAAGsiVolumeFormFeatures.m/

输入文件 CAAGsiStartVolume.CATPart 位于 CAAGSMInterfaces.edu 的 Data.d 目录下:

  • Windows 路径
     
    InstallRootDirectory\CAAGSMInterfaces.edu\Data.d\CAAGsiStartVolume.CATPart
  • Unix 路径
     
    InstallRootDirectory/CAAGSMInterfaces.edu/Data.d/CAAGsiStartVolume.CATPart

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

步实现

CAAGsiVolumeFormFeatures 示例包含八个逻辑步骤:
  1. 初始化准备
  2. 创建拉伸体积特征
  3. 创建旋转体积特征
  4. 创建多截面体积
  5. 创建扫掠体积特征
  6. 创建闭合体积特征
  7. 创建加厚体积特征
  8. 保存并关闭会话
接下来我们将通过查看 CAAGsiVolumeFormFeatures 文件主方法的代码,对以上各个部分进行讲解说明。

初始化

CAAGsiVolumeFormFeatures 示例首先创建会话并打开输入的 CATPart 文件。
注意:下面这段代码的关键之处在于,必须调用 CATPrtContainer 接口的 GetPart() 方法。该方法用于在会话中加载零件的各类容器。
// 创建会话
char *pSessionName = "SampleSession";
CATSession *pSession = NULL; 
rc = Create_Session(pSessionName, pSession); 
if (NULL == pSession ) {
   cout << "(CAAGsiVolumeFormFeatures) 错误: Create_Session" << endl;
   TestCaseError = 1;
}

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

if (NULL == pDoc ) {
   cout << "(CAAGsiVolumeFormFeatures) 错误 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 ) {

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

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

随后在初始化阶段,获取线框与外形设计工厂、零件设计工厂接口。

// 获取创成式外形设计工厂接口
CATIPrtFactory_var spPrtFact; 
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;
   } 
}

创建拉伸体积特征

使用 CATIGSMFactoryCreateExtrude 方法创建拉伸体积。

....
#include "CATGSMContextDef.h"
....
// 创建拉伸体积
CATISpecObject_var SpecSkethToExtrude = ...;
CATISpecObject_var SpecPlaneRef1 = ...;

CATICkeParm_var spCkeLgStart ;
spCkeLgStart = spCkeFact -> CreateLength( "Start" , 0.0/1000. );
if (NULL_var == spCkeLgStart) {
     cout << "创建长度参数错误" << endl;
}

CATICkeParm_var spCkeLgEnd ;
spCkeLgEnd = spCkeFact -> CreateLength( "End" , 100.0/1000. );
if (NULL_var == spCkeLgEnd) {
   cout << "创建长度参数错误" << endl;
}

DirRef = spGsmFact -> CreateDirection( SpecPlaneRef1 );

// 创建拉伸特征
CATIGSMExtrude_var spExtrude1 = spGsmFact -> CreateExtrude(
    SpecSkethToExtrude,
    DirRef,
    spCkeLgStart,
    spCkeLgEnd,
    TRUE
);

// 初始化体积上下文
spExtrude1 -> SetContext( CATGSMVolumeCtxt );

// 插入结构树并更新
CATISpecObject_var spSpecExtr1 = spExtrude1 ;
if (NULL_var != spSpecExtr1) {
   CATIGSMProceduralView_var ispProcView = spSpecExtr1;
   if (NULL_var != ispProcView ) {
      rc = ispProcView -> InsertInProceduralView();
   }
}

CAAGsiObjectUpdate( spSpecExtr1 );
...

创建旋转体积特征

使用 CATIGSMFactoryCreateRevol 方法创建旋转体积。
....
#include "CATGSMContextDef.h"
....
// 创建旋转体积
CATISpecObject_var SpecSkethToRevol = ...;
CATISpecObject_var SpecLineRef1 = ...;

CATICkeParm_var spCkeAngStart ;
spCkeAngStart = spCkeFact -> CreateLength( "Ang1" , (180.0/180.0)*CATPI );
if (NULL_var == spCkeAngStart) {
       cout << "创建角度参数出错" << endl ;
}

CATICkeParm_var spCkeAngEnd;
spCkeAngEnd = spCkeFact -> CreateLength( "Ang2" , (180.0/180.)*CATPI );
if (NULL_var == spCkeAngEnd) {
       cout << "创建角度参数出错" << endl ;
}

CATIGSMRevol_var spRevol1 =
       spGsmFact -> CreateRevol( SpecSkethToRevol, SpecLineRef1 , spCkeAngStart, spCkeAngEnd , FALSE );

// 初始化体积上下文
spRevol1 -> SetContext( CATGSMVolumeCtxt );

// 插入结构树并更新
CATISpecObject_var spSpecRevol1 = spRevol1 ;
if (NULL_var != spSpecRevol1 ) {
   CATIGSMProceduralView_var ispProcView = spSpecRevol1 ;
   if (NULL_var != ispProcView ) {
      rc = ispProcView -> InsertInProceduralView();
    }
}

CAAGsiObjectUpdate( spSpecRevol1 );
...

创建多截面体积特征

使用 CATIGSMFactoryCreateLoft 方法创建多截面体积。
....
#include "CATGSMContextDef.h"
....
// 创建多截面体积
CATISpecObject_var SpecSection;
SpecSection = ... ;spListSections.Append(SpecSection);
SpecSection = ... ;spListSections.Append(SpecSection);
SpecSection = ... ;spListSections.Append(SpecSection);
SpecSection = ... ;spListSections.Append(SpecSection);

CATListValCATISpecObject_var	spListGuides;
CATISpecObject_var SpecGuide;
SpecGuide = ... ;spListGuides.Append(SpecGuide);
SpecGuide = ... ;spListGuides.Append(SpecGuide);
SpecGuide = ... ;spListGuides.Append(SpecGuide);
SpecGuide = ... ;spListGuides.Append(SpecGuide);


CATIGSMLoft_var spLoft1 =
spGsmFact -> CreateLoft(spListSections, spListGuides);

// 初始化体积上下文
spLoft1 -> SetContext(CATGSMVolumeCtxt);

// 插入结构树并更新
CATISpecObject_var spSpecLoft1 = spLoft1;
if (NULL_var != spSpecLoft1) {
   CATIGSMProceduralView_var ispProcView = spSpecLoft1;
   if (NULL_var != ispProcView) {
      rc = ispProcView -> InsertInProceduralView();
   }
}
CAAGsiObjectUpdate(spSpecLoft1);
...

创建扫掠体积特征

使用 CATIGSMFactoryCreateSweep 方法创建扫掠体积。
....
#include "CATGSMContextDef.h"
....
// 创建多截面体积
CATISpecObject_var SpecProfile = ...
CATISpecObject_var SpecGuideSw = ...
CATISpecObject_var SpecSpine = ....

CATIGSMSweepUnspec_var spExplSweep1 =
spGsmFact -> CreateExplicitSweep(SpecGuideSw, SpecProfile, SpecSpine, NULL_var, NULL_var);

// 初始化体积上下文
spExplSweep1 -> SetContext(CATGSMVolumeCtxt);

// 插入结构树并更新
CATISpecObject_var spSpecSweep1 = spExplSweep1;
if (NULL_var != spSpecSweep1) {
 CATIGSMProceduralView_var ispProcView = spSpecSweep1;
 if (NULL_var != ispProcView) {
 rc = ispProcView -> InsertInProceduralView();
 }
}
CAAGsiObjectUpdate(spSpecSweep1);
...

创建加厚体积特征

使用 CATIPrtFactoryCreateVolumicOffset 方法创建加厚体积。
注意:在创建时,特征会自动插入到当前几何特征集的结构树中。
// 创建并插入到结构树的加厚体积特征
CATISpecObject_var SpecShape = ...
CATPrtOffsetSens iIsensOffset = NormalSide;
CATISpecObject_var spThick =
spPrtFact -> CreateVolumicOffset(SpecShape, iIsensOffset, 0.00, 10.00);

// 更新特征
CAAGsiObjectUpdate(spThick);
...

创建闭合体积特征

使用 CATIPrtFactoryCreateVolumicCloseSurface 方法创建闭合体积。
注意:创建时,特征会自动插入到当前几何特征集的结构树中。
// 创建并插入到结构树的闭合体积特征
CATISpecObject_var SpecShapeToClose = ...
CATISpecObject_var spClose =
spPrtFact -> CreateVolumicCloseSurface(SpecShapeToClose);

// 更新特征
CAAGsiObjectUpdate(spClose);
...

存并关闭会话

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

// 结束会话并释放文档
Delete_Session("SampleSession");
...

小结

本示例演示了借助外形设计零件设计模块创建体积特征的方法。
本示例中创建的体积特征,均不以边界表示(BRep)特征作为输入。对于需要以 BRep 作为输入的特征(例如抽壳、体积缝合、拔模等,主要为零件设计类特征),其创建方式与参数获取方法和本示例所展示的逻辑基本一致。
注意:在交互命令中获取 BRep 特征,需通过选择子元素,并使用机械建模器代理 CATFeatureImportAgent 来实现。

References

[1] Building and Launching a CAA V5 Use Case
[2] About Generative Shape Design Features
[3] Inserting a Shape Design Feature in the procedural view
[4] Updating a shape Design feature
 
posted @ 2026-04-03 15:41  Breadss  阅读(2)  评论(0)    收藏  举报