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 模块)的实现逻辑。
根据
TopLevel 和 spParentForTool 参数,可分为三种创建场景:- 在零件下创建特征集
- 在指定特征集下创建子特征集
- 在当前特征下创建特征集
步骤 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);
...
使用了通用工具 CAAGsiInsertInProceduralView 和 CAAGsiObjectUpdate(位于 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)的多种方案与功能,并根据对象类型提供了不同的插入特征解决方案。
希望和大家一起交流学习

浙公网安备 33010602011771号