Implementing the Cut/Copy/Paste Behavior for Mechanical Design Features-实现机械建模器接口

摘要

本文讲解 CAAPriCutCopyPaste 示例。该示例以简化的凸台特征 CAAPriUserPad 为例,阐述如何实现 CATIMechanicalCCPCATIShapeFeatureProperties 接口,从而使机械设计特征具备剪切、复制与粘贴功能。
  • 本示例将使您掌握的内容
  • CAAPriCutCopyPaste 示例
    • CAAPriCutCopyPaste 实现的功能
    • 如何运行 CAAPriCutCopyPaste
    • 如何找到 CAAPriCutCopyPaste 代码
  • CATIMechanicalCCP 接口分步实现
  • CATIShapeFeatureProperties 接口分步实现
  • 简要总结
  • 参考文献

通过本示例您将学到的内容

本示例旨在帮助您使用剪切 / 复制 / 粘贴功能,并了解如何在简化的凸台特征上实现这些功能。

CAAPriCutCopyPaste 示例

CAAPriCutCopyPaste 是 CAAPartInterfaces.edu 框架下的一个使用示例,用于演示 PartInterfaces 框架的各项功能。

CAAPriCutCopyPaste 实现的功能

CAAPriCutCopyPaste 示例旨在演示如何在指定的形状特征 [1](即简化凸台)上实现 CATIMechanicalCCPCATIShapeFeatureProperties 接口。该简化凸台以启动对象(StartUp)的形式存在于 CAAPriFormFeature.CATfct 特征库中,其类型为 CAAPriUserPad[2]。这两个接口分别在以下类中实现:
  • CAAPriEMechanicalCCP:实现 CATIMechanicalCCP 接口,用于定义简化凸台特征的剪切 / 复制 / 粘贴行为。
  • CAAPriECCPProp:实现 CATIShapeFeatureProperties 接口,用于定义实体特征的常规行为。该接口已有标准实现;但如果您的特征所依赖的草图并非直接聚合,而是通过轮廓(profile)方式聚合,则需要自行实现该接口,本示例中的简化凸台便属于这种情况。
CAAPriCutCopyPasteMain.m 模块包含一个主程序,其执行流程为:创建一个零件文档,使用第一个草图实例化 CAAPriUserPad 启动对象,调用其 Build 方法并保存生成的零件文档。随后创建第二个草图,对该简化凸台执行复制 / 粘贴操作并应用到第二个草图上,最终将结果保存到第二个零件文档中。

图 1 为第一个零件文档中待复制的凸台特征,图 2 为第二个零件文档中保存的原始凸台与复制后的凸台特征。

图 1 待复制的凸台特征

图片

 图 2 已复制的凸台特征

图片

 

如何运行 CAAPriCutCopyPaste

要运行 CAAPriCutCopyPaste,您需要搭建编译环境,随后编译 CAAPriCutCopyPaste 及其依赖项,配置运行环境,最后执行该示例 [3]。

按如下方式启动示例:

在 Windows 系统下

e:>CAAPriCutCopyPasteMain outputDirectory\CAAUserPadCCP1.CATPart outputDirectory\CAAUserPadCCP2.CATPart

在 UNIX 系统下

$ CAAPriCutCopyPasteMain outputDirectory/CAAUserPadCCP1.CATPart outputDirectory/CAAUserPadCCP2.CATPart
其中:
    • outputDirectory:用于保存 CAAUserPadCCP1.CATPart 和 CAAUserPadCCP2.CATPart 文件的目录
    • CAAUserPadCCP1.CATPart:包含所创建凸台特征的文件
    • CAAUserPadCCP2.CATPart:包含执行复制 / 粘贴操作后两个凸台特征的文件

在哪里可以找到 CAAPriCutCopyPaste 代码

CAAPriCutCopyPaste 示例由 CAAPartInterfaces.edu 框架下的两个模块组成,分别为 CAAPriCutCopyPaste.mCAAPriCutCopyPasteMain.m
Windows 系统
InstallRootDirectory\CAAPartInterfaces.edu\CAAPriCutCopyPaste.m\
InstallRootDirectory\CAAPartInterfaces.edu\CAAPriCutCopyPasteMain.m\

Unix 系统

InstallRootDirectory/CAAPartInterfaces.edu/CAAPriCutCopyPaste.m/
InstallRootDirectory/CAAPartInterfaces.edu/CAAPriCutCopyPasteMain.m/
其中 InstallRootDirectory 为 CAA 光盘的安装根目录。
这些模块包含的内容如下:
    • CAAPriCutCopyPaste.m:包含 CAAPriEMechanicalCCPCAAPriECCPProp 两个类,分别作为 CAAPriUserPad 特征的扩展类,实现 CATIMechanicalCCPCATIShapeFeatureProperties 接口。
    • CAAPriCutCopyPasteMain.m:执行复制 / 粘贴操作的主程序。

CATIMechanicalCCP 接口分步实现

CATIMechanicalCCP 接口通过名为 CAAPriEMechanicalCCP 的类实现,该类是延迟类型 CAAPriUserPad 的数据扩展。需要实现以下六个方法:
        • GiveMeYourFavoriteSpecifications
        • IsElementValidForPaste
        • GetAnchorPoint
        • GetReferenceNormal
        • CanBeDeleted
        • CanBeCopied
        接下来我们将逐一讲解这些方法。

GiveMeYourFavoriteSpecifications

GiveMeYourFavoriteSpecifications 是一个用于返回创建简化凸台所必需的特征列表的方法,该特征即为生成凸台所依赖的草图。
...
CATLISTV(CATISpecObject_var) CAAPriEMechanicalCCP::GiveMeYourFavoriteSpecifications() const
{
  // 获取用户自定义凸台特征的轮廓(Profile)属性
  //
 
  CATLISTV(CATISpecObject_var) listSpec;

  CATISpecObject *piUserPad = NULL;
  HRESULT rc = ((CATBaseUnknown*)this)->QueryInterface( IID_CATISpecObject ,
                                                        ( void** ) &piUserPad );
  if( FAILED(rc) )
    return listSpec;

  // 获取Profile属性对象
  CATISpecAttribute *piProfileAtt = piUserPad->GetAttribute("Profile");
  if(NULL != piProfileAtt)
  {
    CATISpecObject_var spProfile = piProfileAtt->GetSpecObject(1);
    piProfileAtt->Release();
    if(NULL_var != spProfile)
    {
      spProfile->Release();   // 递减引用计数

      // 获取与轮廓关联的草图
      // 将草图添加到返回列表中
      //
      CATIPrtProfile_var spPrtProfileOnProfile(spProfile);
      if (NULL_var != spPrtProfileOnProfile)
      {
        CATISpecObject_var spElt = NULL_var;
        spPrtProfileOnProfile->GetElement(1, spElt);
        if (NULL_var != spElt)
        {
          listSpec.Append(spElt);
        }
      }
    }
  }
  piUserPad->Release();
  return listSpec;
}
...
简化凸台的 “Profile”(轮廓)属性引用了轮廓对象,而该轮廓对象又引用了唯一的草图。我们通过 CATISpecObject 接口的 GetAttribute 方法获取该属性,再使用 CATIPrtProfile 接口的 GetElement 方法从轮廓中获取草图,并将草图加入返回的列表中。
需要注意,指向 CATISpecObject 的智能指针 spProfile 被显式释放了。通常智能指针在离开作用域时会自动释放,一般无需手动处理,但在这里必须这么做。原因是:GetSpecObject 返回一个接口指针,和所有返回接口指针的规范方法一样,它会对返回的指针执行 AddRef 操作。该指针紧接着在同一行语句中,通过智能指针类重写的赋值运算符创建智能指针,而这一过程同样会对新创建的智能指针执行 AddRef。因此引用计数被增加了两次,必须手动减少一次。由于原始返回指针无法直接管理,因此通过智能指针调用 Release 来减少引用计数。之后智能指针可正常使用,并在离开作用域时再次自动释放。

IsElementValidForPaste

IsElementValidForPaste 方法用于返回校验结果:返回 1 表示允许粘贴,返回 0 表示禁止粘贴。
...
int CAAPriEMechanicalCCP::IsElementValidForPaste(CATPathElement* ispPath) const 
{
  //
  // 返回值:初始默认为粘贴无效
  //
  int valid = 0;

  //
  // 检查路径元素中是否包含草图
  //
  CATBaseUnknown *spiSketchOnElt = ispPath->FindElement(IID_CATISketch);
  if( NULL != spiSketchOnElt )
  {
    spiSketchOnElt->Release();
    valid = 1;
  }
  return valid;
}
...
输入参数是用户意图将剪切 / 复制对象粘贴到的目标对象,它是一个 CATPathElement 实例,包含了用户的完整选择内容。
对于本简化凸台而言,设计意图是:只有当目标对象是草图时,才允许执行粘贴操作,该草图将替换凸台当前使用的草图。
代码中通过向 FindElement 方法传入 CATISketch 接口 ID,在输入的路径元素中查找是否存在草图。如果找到草图,则说明可以执行粘贴,方法返回 1。

GetAnchorPoint

GetAnchorPoint 用于获取被复制对象的绝对定位点
...
CATMathPoint CAAPriEMechanicalCCP::GetAnchorPoint() const 
{
  // 获取用户自定义凸台特征的轮廓(Profile)属性
  //
 
  CATMathPoint anchorPoint;
  
  CATISpecObject * piUserPad = NULL;
  HRESULT rc = ((CATBaseUnknown*)this)->QueryInterface( IID_CATISpecObject ,
                                                        ( void** ) &piUserPad );
  if( FAILED(rc) )
    return anchorPoint;
 
  CATISpecAttribute *piProfileAtt = piUserPad->GetAttribute("Profile");
  if(NULL != piProfileAtt)
  {
    CATISpecObject_var spProfile = piProfileAtt->GetSpecObject(1);
    piProfileAtt->Release();
    if(NULL_var != spProfile)
    {
      spProfile->Release();
   
      // 获取与轮廓关联的草图
      // 将草图添加到返回列表中
      //
      CATIPrtProfile_var spPrtProfileOnProfile(spProfile);
      if (NULL_var != spPrtProfileOnProfile)
      {
        int nbElt = spPrtProfileOnProfile->GetElementCount();
        if (1 == nbElt)
        {
          // 获取轮廓所关联的草图
          //
          CATISpecObject_var spElt;
          spPrtProfileOnProfile->GetElement(1, spElt);
          CATIMechanicalCCP_var spCCPOnElt(spElt);
          if (NULL_var != spCCPOnElt)
          {
            // 将获取锚点的调用委托给草图自身处理
            //
            anchorPoint = spCCPOnElt->GetAnchorPoint();
          }
        }
      }
    }
  }
  piUserPad->Release();
  return anchorPoint;
}
...
对于简化凸台而言,锚点就是其关联草图的锚点。代码获取草图的方式与 GiveMeYourFavoriteSpecifications 方法完全一致。该方法的核心逻辑是:找到凸台引用的草图,然后将 GetAnchorPoint 调用委托给草图对象执行。

GetReferenceNormal

GetReferenceNormal 用于获取特征生成结果的绝对法向。
...
CATMathDirection CAAPriEMechanicalCCP::GetReferenceNormal() const
{
  // 获取用户凸台特征的轮廓(Profile)属性
  //
 
  CATMathDirection normal;
  
  CATISpecObject *piUserPad = NULL;
  HRESULT rc = ((CATBaseUnknown*)this)->QueryInterface( IID_CATISpecObject , ( void** ) &piUserPad );
  if( FAILED(rc) )
    return normal;  
 
  CATISpecAttribute *piProfileAtt = piUserPad->GetAttribute("Profile");
  if(NULL != piProfileAtt)
  {
    CATISpecObject_var spProfile = piProfileAtt->GetSpecObject(1);
    piProfileAtt->Release();
    if(NULL_var != spProfile)
    {
      spProfile->Release();
   
      // 获取与轮廓关联的草图
      //
      CATIPrtProfile_var spPrtProfileOnProfile(spProfile);
      if (NULL_var != spPrtProfileOnProfile)
      {
        int nbElt = spPrtProfileOnProfile->GetElementCount();
        if (1 == nbElt)
        {
          CATISpecObject_var spElt;
          spPrtProfileOnProfile->GetElement(1, spElt);
          CATIMechanicalCCP_var spCCPOnElt(spElt);
          if (spCCPOnElt != NULL_var)
          {
            // 将获取参考法向的调用委托给草图
            //
            normal = spCCPOnElt->GetReferenceNormal();
          }
        }
      }
    }
  }
  piUserPad->Release();
  return normal;
}
...
对于简化凸台,其法向即为草图的法向。获取草图的方式与 GiveMeYourFavoriteSpecifications 方法中一致。
整体逻辑为:找到被引用的草图,并将该方法调用委托给草图对象执行。

CanBeDeleted

CanBeDeleted 用于判断特征是否可以被剪切。
如果可以剪切,应返回 1,否则返回 0
...
int CAAPriEMechanicalCCP::CanBeDeleted(CATListValCATISpecObject_var List) const 
{
  return 1;
}
...
该简化凸台始终允许被剪切

CanBeCopied

CanBeCopied 用于判断特征是否可以被复制。

如果可以复制,应返回 1,否则返回 0

...
int CAAPriEMechanicalCCP::CanBeCopied() const 
{
  return 1;
}
...
该简化凸台始终允许被复制

CATIShapeFeatureProperties 接口分步实现

CATIShapeFeatureProperties 接口通过名为 CAAPriECCPProp 的类实现,该类是延迟类型 CAAPriUserPad 的数据扩展。此类继承自适配器类 CATMmrShapeFeaturePropertiesAdapter,只需实现两个方法:
  • GetPolarity
  • GiveMeYourFavoriteSketches
CATIShapeFeatureProperties 还包含以下方法:
  • IsAContextualFeature:由 CATMmrShapeFeaturePropertiesAdapter 适配器类实现
  • IsAFreeFormFeature:由 CATMmrShapeFeaturePropertiesAdapter 适配器类实现

这两个方法已由适配器类 CATMmrShapeFeaturePropertiesAdapter 实现,您无需重写。

此外:
  • GiveMeYourBRepSpecifications:默认实现返回空列表
  • CanBePatterned:默认实现设置该特征不可阵列
这两个方法已有默认实现,因此 CAAPriECCPProp 类无需重写。
CATIShapeFeatureProperties 是一个可通过 BOA 机制实现的接口 [4]。下面是 CAAPriECCPProp 代码文件的开头部分:
...
CATImplementClass(CAAPriECCPProp, 
                  DataExtension, 
                  CATIShapeFeatureProperties, 
                  CAAPriUserPad);

CATImplementBOA(CATIShapeFeatureProperties, CAAPriECCPProp);
...
CATImplementClass 宏与类头文件中的 CATDeclareClass 宏配合使用,用于声明该类属于 CAA V5 对象模型组件的一部分。其各参数含义如下:
  • CAAPriECCPProp:类名
  • DataExtension:CAA V5 对象模型中的类类型
  • CATIShapeFeatureProperties:所实现的接口名称
  • CAAPriUserPad:被扩展组件的名称
CATImplementBOA 宏用于替代 TIE_CATIShapeFeatureProperties 宏。其参数分别为:通过 BOA 实现的接口名,以及扩展类的类名。

GetPolarity

GetPolarity 方法返回特征的极性,即该特征是添加材料还是移除材料。
...
CATUnicodeString CAAPriECCPProp::GetPolarity ( )
{
  CATUnicodeString PrtAdd("Add");
  return PrtAdd;
}
...
该简化凸台用于添加材料。

GiveMeYourFavoriteSketches

GiveMeYourFavoriteSketches 方法返回用于创建该特征的草图。对于本简化凸台,只存在一个草图,其获取方式与 GiveMeYourFavoriteSpecifications 方法一致。

简要总结

本示例演示了为简化凸台实现剪切 / 复制 / 粘贴功能的方法。通过使 CAAPriUserPad 特征实现 CATIMechanicalCCPCATIShapeFeatureProperties 接口即可完成该功能。
对于直接聚合草图的特征,仅实现 CATIMechanicalCCP 就足够了。如果不满足这种情况,则还必须实现 CATIShapeFeatureProperties。这两个接口均在对应特征延迟类型的数据扩展类中实现。

 

 
posted @ 2026-04-02 17:03  Breadss  阅读(1)  评论(0)    收藏  举报