Creating Volume Form Features-使用外形设计与零件设计工厂,创建基于体积的造型特征。
摘要
本文介绍 CAAGsiVolumeFormFeatures 示例。该示例讲解如何创建体积造型特征。
- 通过本示例您将学到的内容
- CAAGsiVolumeFormFeatures 示例
- CAAGsiVolumeFormFeatures 的功能
- 如何运行 CAAGsiVolumeFormFeatures
- CAAGsiVolumeFormFeatures 代码位置
- 分步实现
- 小结
- 参考文献
通过本示例您将学到的内容
本示例演示如何使用外形设计与零件设计工厂来创建体积特征。体积特征既可以在外形设计工厂中创建,也可以在零件设计工厂中创建。
注意:体积特征的创建需要 GSO 模块 的许可证支持。
- 外形设计:拉伸、旋转、多截面体积、扫掠体积
- 零件设计:闭合体积、加厚体积、拔模、拔模角度、反射线拔模、缝合体积、抽壳
CAAGsiVolumeFormFeatures 示例
CAAGsiVolumeFormFeatures 是 CAAGSMInterfaces.edu 框架下的一个示例,用于演示如何通过外形设计与零件设计工具创建各类体积特征(拉伸、旋转、加厚、闭合、多截面体积、扫掠等)。

CAAGsiVolumeFormFeatures 的功能
CAAGsiVolumeFormFeatures 的目的是演示如何使用外形设计工厂或零件设计工厂创建体积特征。
体积特征属于曲面类特征,它们在
CATMf3DBehavior 的 IsAShape() 方法中返回 TRUE,同时在 CATIMf3DBehavior2 的 IsAVolume() 方法中也返回 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 示例包含八个逻辑步骤:
- 初始化准备
- 创建拉伸体积特征
- 创建旋转体积特征
- 创建多截面体积
- 创建扫掠体积特征
- 创建闭合体积特征
- 创建加厚体积特征
- 保存并关闭会话
接下来我们将通过查看 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;
}
}
创建拉伸体积特征
使用 CATIGSMFactory 的 CreateExtrude 方法创建拉伸体积。
....
#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 );
...
创建旋转体积特征
使用 CATIGSMFactory 的 CreateRevol 方法创建旋转体积。
....
#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 );
...
创建多截面体积特征
使用 CATIGSMFactory 的 CreateLoft 方法创建多截面体积。
....
#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);
...
创建扫掠体积特征
使用 CATIGSMFactory 的 CreateSweep 方法创建扫掠体积。
....
#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);
...
创建加厚体积特征
使用 CATIPrtFactory 的 CreateVolumicOffset 方法创建加厚体积。
注意:在创建时,特征会自动插入到当前几何特征集的结构树中。
// 创建并插入到结构树的加厚体积特征
CATISpecObject_var SpecShape = ...
CATPrtOffsetSens iIsensOffset = NormalSide;
CATISpecObject_var spThick =
spPrtFact -> CreateVolumicOffset(SpecShape, iIsensOffset, 0.00, 10.00);
// 更新特征
CAAGsiObjectUpdate(spThick);
...
创建闭合体积特征
使用 CATIPrtFactory 的 CreateVolumicCloseSurface 方法创建闭合体积。
注意:创建时,特征会自动插入到当前几何特征集的结构树中。
// 创建并插入到结构树的闭合体积特征
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 |
希望和大家一起交流学习

浙公网安备 33010602011771号