Converting a Shape Design Feature into a Datum -使用外形设计工厂将外形设计特征转换为基准
摘要
本文介绍 CAAGsiDatum 示例。该示例讲解如何将特征转换为基准。
- 通过本示例您将学到的内容
- CAAGsiDatum 示例
- CAAGsiDatum 的功能
- 如何运行 CAAGsiDatum
- 在哪里可以找到 CAAGsiDatum 代码
- 分步实现
- 小结
- 参考文献
通过本示例您将学到的内容
本示例演示如何将任意线框与外形设计特征转换为基准(Datum)。
待转换的线框和外形设计特征不能包含子特征,也就是说,它们不能聚合其他特征(例如:关联特征)。CAAGsiDatum 示例
CAAGsiDatum 是 CAAGSMInterfaces.edu 框架下的一个示例,用于演示 GSMInterfaces 框架中 CATIGSMFactory 接口的 ConvertToDatum 方法。
CAAGsiDatum 的功能
CAAGsiDatum 示例的目标是:取用 CAAGsiNozzle 示例生成的曲面特征结果,将其合并,并把合并后的特征转换为对应的基准特征(曲面表皮)。
如何运行 CAAGsiDatum
要运行 CAAGsiDatum,需先配置编译环境,编译 CAAGsiDatum 及其依赖项,再配置运行环境,最后执行该示例程序 [1]。
按如下方式运行示例:
在 Windows 系统下
e:>CAAGsiDatum 输入目录\CAAGsiNozzle.CATPart 输出目录\CAAGsiDatum.CATPart
在 UNIX 系统下
$ CAAGsiDatum 输入目录/CAAGsiNozzle.CATPart 输出目录/CAAGsiDatum.CATPart
其中:
- outputDirectory:保存 CAAGsiDatum.CATPart 文件的目录
- inputDirectory:存放 CAAGsiNozzle.CATPart 文件的目录
CAAGsiDatum.CATPart:包含已生成基准曲面的零件文件
在哪里可以找到 CAAGsiDatum 代码
CAAGsiDatum 示例程序的主程序位于 CAAGSMInterfaces.edu 框架下的 CAAGsiDatum.m 模块中:
- Windows 系统路径
InstallRootDirectory\CAAGSMInterfaces.edu\CAAGsiDatum.m\ - Unix 系统路径
InstallRootDirectory/CAAGSMInterfaces.edu/CAAGsiDatum.m/
作为输入文件的 CAAGsiNozzle.CATPart 位于 CAAGSMInterfaces.edu 框架的 Data.d 目录下:
-
- Windows 系统路径
InstallRootDirectory\CAAGSMInterfaces.edu\Data.d\CAAGsiNozzle.CATPart - Unix 系统路径
InstallRootDirectory/CAAGSMInterfaces.edu/Data.d/CAAGsiNozzle.CATPart
其中 InstallRootDirectory 为 CATIA CAA 安装光盘的安装根目录。
- Windows 系统路径
分步操作
CAAGsiDatum 包含四个逻辑步骤:
- 初始化准备
- 创建接合特征
- 将接合特征转换为基准
- 保存并关闭会话
接下来我们将通过查看 CAAGsiDatum 文件主方法的代码,对以上每个部分进行讲解说明。
初始化准备
CAAGsiDatum 示例首先创建一个会话并打开输入的 CATPart 文件。
注意:下述代码序列的关键之处在于,必须调用 CATPrtContainer 接口的 GetPart () 方法。
该方法可将会话中加载零件的各类容器(特征容器、几何容器等)加载至当前会话。
...
// 创建会话
char *pSessionName = "SampleSession";
CATSession *pSession = NULL;
rc = Create_Session(pSessionName, pSession);
if (NULL == pSession ) {
cout << "(CAAGsiDatum) ERROR: Create_Session" << endl;
TestCaseError = 1 ;
}
// 加载文档并初始化
cout << "The input document " << InputName << " is opened" << endl ;
CATDocument *pDoc = NULL;
rc = CATDocumentServices::OpenDocument(InputName, pDoc) ;
if (NULL == pDoc ) {
cout << "(CAAGsiDatum) ERROR 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 ;
}
}
...
最后,获取线框与创成式外形设计工厂。
....
// 获取创成式外形设计接口
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;
}
}
...
创建接合特征
使用接合(也称为装配)的标准创建方法,将扫掠和放样特征进行接合。
...
// 接合
// ------------------
CATLISTV(CATISpecObject_var) aObjectParametersAssemble;
aObjectParametersAssemble.Append(spSweep1);
aObjectParametersAssemble.Append(spLoft1);
aObjectParametersAssemble.Append(spSweep2);
aObjectParametersAssemble.Append(spLoft2);
// 创建特征
double MergingDistanceTol = 0.001 ;
CATBoolean iCheckConnexity = TRUE ;
CATICkeParm_var spParm;
CATICkeParmFactory_var spCkeFact = spGsmFact ;
if (!!spCkeFact) {
spParm = spCkeFact -> CreateLength("MergingDistance",MergingDistanceTol/1000.0);
}
CATIGSMAssemble_var spAssemble = spGsmFact -> CreateAssemble(aObjectParametersAssemble,spParm,iCheckConnexity);
aObjectParametersAssemble.RemoveAll();
// 插入到结构树
// ------------------
CATISpecObject_var spSpecTmp = spAssemble;
if (NULL_var != spSpecTmp) {
// 插入到结构树
CATIGSMProceduralView_var ispProcView = spSpecTmp;
if (NULL_var != ispProcView ) {
rc = ispProcView ->InsertInProceduralView();
}
}
// 更新
CAAGsiObjectUpdate(spSpecTmp);
...
随后,接合特征将完成以下操作:
- 通过 GSMInterfaces 框架中 CATIGSMProceduralView 接口的 InsertInProceduralView 方法,插入到结构树中
- 通过通用服务 CAAGsiObjectUpdate 完成特征更新
将接合特征转换为基准特征
验证待转换的特征尚未是基准
....
// 检查待转换的特征是否已经是基准
CATIMf3DBehavior_var ispBehave(ispSpec);
if(NULL_var != ispBehave ){
if ( FAILED( ispBehave -> IsADatum() ) ) {
....
}
}
...
使用 CATIGSMFactory 接口的 ConvertToDatum 方法
该方法仅适用于没有子特征(不聚合其他特征)的对象,参数
Verif 用于对此进行校验。对于多域特征,原始特征的每个域都会生成一个对应的基准特征。
....
CATListValCATISpecObject_var *ListDatum=NULL;
// 将规范特征转换为一个或多个基准特征
int iVerif =1 ; // 检查特征是否不含子特征
rc = ispGsmFact->ConvertToDatum(ispSpec, ListDatum,iVerif);
if (FAILED(rc)) return E_FAIL;
...
基准特征创建后会继承原特征的几何表现,因此必须删除原特征。该操作分为两步:
- 向模型分发删除事件(在交互会话中会触发可视化界面重绘)
- 若特征被聚合,则使用 CATIDescendant 接口的
RemoveChild删除;否则使用 LifeCycleObject 的Remove删除
....
// 删除结构树中的规范特征
// -- 发送模型事件以更新可视化显示
CATIModelEvents_var IME(ispSpec);
if(NULL_var != IME) {
CATDelete info(ispSpec->GetImpl());
IME->Dispatch(info);
}
// -- 删除特征本身
CATISpecObject_var ispFather = ispSpec->GetFather();
// 特征在结构树中被父对象聚合
if (NULL_var != ispFather) {
ispFather->Release();
CATIDescendants_var ispDes = ispFather;
ispDes->RemoveChild (ispSpec);
}
// 特征不在结构树中
else {
LifeCycleObject_var LCO = ispSpec;
LCO -> remove();
}
....
基准已创建、原特征已删除后,需要像其他外形设计特征(线、曲面、体积)一样,将基准插入结构树。
....
// 插入到结构树
int i;
int size = AllDatums.Size();
for(i=1;i<=size;i++) {
CATIGSMProceduralView_var curobj = AllDatums[i];
if (NULL_var != curobj ) {
rc = curobj->InsertInProceduralView();
if (FAILED(rc)) cout << " (CAAGsiDatum) 基准插入结构树失败" << endl ;
....
保存并关闭会话
保存零件并关闭会话
...
// 保存
if (NULL != OutputName ) {
rc = CATDocumentServices::SaveAs(*pDoc, OutputName );
if (SUCCEEDED(rc)) {
cout << " (CAAGsiDatum) 文档已保存 " << endl;
}
else {
cout << " 保存文档出错 " << endl ;
}
}
// 关闭文档
CATDocumentServices::Remove(*pDoc);
// 结束会话并释放文档
Delete_Session("SampleSession");
...
小结
本示例演示了将现有特征转换为基准特征的方法。
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号