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 安装光盘的安装根目录。

分步操作

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;
...

基准特征创建后会继承原特征的几何表现,因此必须删除原特征。该操作分为两步:
  1. 向模型分发删除事件(在交互会话中会触发可视化界面重绘)
  2. 若特征被聚合,则使用 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");
...

小结

posted @ 2026-04-03 14:53  Breadss  阅读(0)  评论(0)    收藏  举报