Creating a Geometrical Features Set-如何在零件文档中创建几何特征集

摘要

本文对开放几何体进行了介绍。CAAGsiUserTools 对象类说明了如何创建一个用于容纳外形设计特征的开放几何体特征。
  • 什么是开放几何体
  • CAAGsiUserTools 对象 —— 创建开放几何体
    • CAAGsiUserTools 的作用
    • 在哪里查找 CAAGsiUserTools 代码
  • 分步操作
  • 小结
  • 参考文献

什么是开放几何体

“开放几何体(Open Body)” 是机械建模器对象,在零件文档中,所有创成式外形设计(GSD)特征都必须以它作为父节点。
本文旨在帮助你迈出使用 CATIA 外形设计模块进行编程的第一步 [1],核心是通过实际操作说明开放几何体的创建方法。
在创建该开放几何体之前,你需要遍历 CATIA V5 的特征模型,找到可在零件特征下创建该开放几何体(也称为 GSMTool 对象)的相关对象。

CAAGsiUserTools 对象 —— 创建开放几何体

CAAGsiUserTools 是 CAAGSMInterfaces.edu 框架下 CAAGsiToolkit.m 模块中的一个实用类,用于演示 GSMInterfaces 框架对象的标准用法。
CAAGsiUserTools 是一个工具集对象,它封装了线框与外形设计模块中 CAA 开发的三个方面内容:
  • 创建开放几何体
  • 在开放几何体中插入线框与外形设计特征
  • 使用 GSMInterface 框架接口创建线框与外形设计特征
前两点是在 CATIA V5 框架中实例化 GSMInterfaces 任意 GSD 特征时可复用的通用操作逻辑。

本文将介绍第一方面内容。

 

CAAGsiUserTools 的作用

 

CAAGsiUserTools 对象的设计目的,是演示如何创建开放几何体特征—— 这是在零件文档中创建外形设计特征之前,必须完成的第一个通用步骤。我们对示例代码 CAAGsiUserTools.cpp(.h) 做了补充完善,并讲解了所有机械类应用模块共有的一些核心基础概念。

 

CAAGsiUserTools 被用于 CAAGsiNozzle 示例程序中。

在哪里可以找到 CAAGsiUserTools 代码

CAAGsiUserTools 对象由一个名为 CAAGsiUserTools 的单一类构成,该类位于 CAAGSMInterfaces.edu 框架下的 CAAGsiToolkit.m 模块中:
  • Windows 系统:
     
    InstallRootDirectory\CAAGSMInterfaces.edu\CAAGsiToolkit.m\
  • Unix 系统:
     
    InstallRootDirectory/CAAGSMInterfaces.edu/CAAGsiToolkit.m/
其中 InstallRootDirectory 为 CAA 安装光盘的安装根目录。

分步操作

在 CAAGsiUserTools 中,创建开放几何体共分为六个逻辑步骤:
  1. 初始化准备
  2. 获取零件容器特征
  3. 获取当前工具对象
  4. 将工具对象定位到零件特征之下
  5. 创建 GSMTool 特征实例
  6. 将创建好的工具对象设为当前对象
我们将首先在初始化准备环节讲解 CAAGsiUserTools::Init 方法中零件文档的创建与初始化,然后通过查看 CAAGsiUserTools::CreateGSMTool 方法的代码,逐一讲解上述每个步骤。

前置操作

我们首先创建了一个零件文档,通过_pDoc智能指针进行管理。我们在Init方法中将_pFact指针存储在CAAGsiUserTools类中,在对CAAGsiUserTools对象执行任何操作之前,都必须先调用该Init方法。
HRESULT CAAGsiUserTools::Init(char *& iSessionName) 
{
  HRESULT rc = S_OK;
  ...  // 创建CATPart零件文档
  CATInit_var spInit = _pDoc;
  spInit->Init(TRUE);

  CATIPrtContainer * piPartContainer = (CATIPrtContainer*) spInit->GetRootContainer("CATIPrtContainer");
  ... // 处理piPartContainer为空的情况
  rc = piPartContainer -> QueryInterface(IID_CATIGSMFactory, (void**)&_pFact);
  ... // 处理返回值为错误码的情况
}

零件文档创建完成后,必须通过CATInit接口的Init方法完成初始化。该方法会创建文档的根容器。随后,通过CATInit接口的GetRootContainer方法,获取指向CATIPrtContainer接口的根容器指针。该根容器同时实现了CATIGSMFactory接口。我们从根容器中获取CATIGSMFactory接口指针,并将其作为类的成员变量存储,供后续使用。

获取零件容器特征

我们需要获取一个指向零件容器特征CATIPrtPart 接口指针,以便获取当前工具特征。
CATIGSMTool_var CAAGsiUserTools::CreateGSMTool(const CATUnicodeString &iName, int iSetAsCurrent, int iTopLevel) { CATIContainer_var spCont = _pFact; CATIPrtContainer_var spPartCont = spCont; CATIPrtPart_var spPart = spPartCont -> GetPart(); ... CATIGSMTool_var CAAGsiUserTools::CreateGSMTool(const CATUnicodeString &iName, int iSetAsCurrent, int iTopLevel) { CATIContainer_var spCont = _pFact; CATIPrtContainer_var spPartCont = spCont; CATIPrtPart_var spPart = spPartCont -> GetPart(); ...
CATIGSMTool_var CAAGsiUserTools::CreateGSMTool(const CATUnicodeString &iName,
                                               int                    iSetAsCurrent,
                                               int                    iTopLevel)
{
  CATIContainer_var    spCont     = _pFact;
  CATIPrtContainer_var spPartCont = spCont;
  CATIPrtPart_var      spPart     = spPartCont -> GetPart();
...

我们首先从已存储的指针 _pFact 中获取指向 CATIPrtContainer 的智能指针,然后从零件容器中获取零件根特征,并用 CATIPrtPart 接口的智能指针进行接收。

获取当前工具

现在我们已经获取了零件特征,接下来可以获取当前工具,它可以是机械工具(MechanicalTool)或外形设计工具(GSMTool)。
GSMTool 只能创建在另一个 GSMTool 之下,或直接创建在零件根特征之下,不能创建在 MechanicalTool 之下。
...
CATIGSMTool_var spTool = NULL_var;
if ( NULL_var != spPart )
{
  CATIBasicTool_var spCurrentTool = spPart->GetCurrentTool();
...
CATIPrtPart 接口允许我们获取当前工具(该工具始终存在)。
随后,我们尝试从 spCurrentToolCATIBasicTool 智能指针)中获取 CATIGSMTool 智能指针。
在这一步,我们必须检查获取到的工具是否为专门用于存储外部引用(多模型链接)的开放几何体。如果是,则将 spTool 设置为 NULL_var,表示需要根据需求另行创建一个 GSMTool 特征。

将工具定位到零件特征之下

本节将演示如何通过 CATIDescendants 接口,获取特征在零件特征的子级列表中的位置。
...
int Position = 0;
CATISpecObject_var spCurrentFeat = spPart->GetCurrentFeature();
CATISpecObject_var spParentForGSMTool = spPart; 

if (spCurrentFeat != spCurrentTool && 0 == iTopLevel)	
{
  spParentForGSMTool  = spCurrentTool;
  CATISpecObject_var spExternalRef = spPart->GetBodyForExternalReferences();
  if (NULL_var != spExternalRef && spCurrentTool == spExternalRef)
  {
    spParentForGSMTool = spPart;
  }
  else 
  {
    CATIDescendants_var spRoot = spCurrentTool;
    Position = spRoot -> GetPosition( spCurrentFeat);
  }
}
...
我们再次通过 CATIPrtPart 接口获取当前特征,该特征可以是工具特征或机械类特征。创建 GSMTool 必须指定父对象,且父对象只能是零件本身或另一个 GSMTool。
spParentForGSMTool 初始化为零件特征,获取的位置 Position 初始为 0。
如果当前特征与当前工具不一致,且 iTopLevel 等于 0,则需要计算当前工具的位置,以便在过程视图中,将新工具创建在当前特征之后、当前工具之下。为了获取当前特征相对于当前工具的位置,我们使用当前工具 spRoot 所实现的 CATIDescendants 接口。
注意:在获取所需工具时,必须检查该几何体是否为装配环境下用于 “外部引用” 的专用几何体 —— 这类几何体是在选取当前零件以外的其他零件中的几何元素时自动生成的。

创建 GSMTool 特征实例

现在我们可以通过指定名称父级引用以及在父级下的位置,来创建一个新的 GSMTool 特征实例。
...
    if (NULL_var != spParentForGSMTool)
    {
      CATIMechanicalRootFactory_var spMechRoot = spCont;
      spTool = spMechRoot -> CreateGSMTool(iName,spParentForGSMTool,Position);
    }
...
我们从 spCont 智能指针获取 CATIMechanicalRootFactory 接口。创建 GSMTool 时需要传入其父级智能指针(即零件特征或 GSMTool 实例),以及新工具在父级下的位置。传入 0 时,该工具将直接创建在 spParentForGSMTool 之下。

将创建的工具设置为当前工具

现在我们已经创建了新的工具,如果希望后续自动在该开放几何体下创建曲面和线框特征,就需要将其设置为当前工具
...
    if (NULL_var != spTool && 0 != iSetAsCurrent)
    {
      CATIPrtManagement_var spPartManage = spPart;
      if (NULL_var != spPartManage)
        spPartManage->SetCurrentFeature(spTool);
    }
  }
  return spTool;
通过判断参数 iSetAsCurrent,来确认是否需要将 spTool 智能指针指向的对象设为当前工具。要将一个工具设为当前工具,需要先获取零件特征上的 CATIPrtManagement 接口,再以 spTool 为参数调用 SetCurrentFeature 方法。

小结

本文演示了在零件文档中创建开放几何体的方法。文中说明了如何使用零件特征上的一些管理接口,例如 CATIPrtPartCATIPrtManagementCATIMechanicalRootFactory。同时也展示了如何通过 CATIDescendants 接口获取特征在其父级子代列表中的位置。
posted @ 2026-04-03 11:32  Breadss  阅读(6)  评论(0)    收藏  举报