Implementing the Cut/Copy/Paste Behavior for Mechanical Design Features-实现机械建模器接口
摘要
本文讲解 CAAPriCutCopyPaste 示例。该示例以简化的凸台特征 CAAPriUserPad 为例,阐述如何实现 CATIMechanicalCCP 与 CATIShapeFeatureProperties 接口,从而使机械设计特征具备剪切、复制与粘贴功能。
- 本示例将使您掌握的内容
- CAAPriCutCopyPaste 示例
- CAAPriCutCopyPaste 实现的功能
- 如何运行 CAAPriCutCopyPaste
- 如何找到 CAAPriCutCopyPaste 代码
- CATIMechanicalCCP 接口分步实现
- CATIShapeFeatureProperties 接口分步实现
- 简要总结
- 参考文献
通过本示例您将学到的内容
本示例旨在帮助您使用剪切 / 复制 / 粘贴功能,并了解如何在简化的凸台特征上实现这些功能。
CAAPriCutCopyPaste 示例
CAAPriCutCopyPaste 是 CAAPartInterfaces.edu 框架下的一个使用示例,用于演示 PartInterfaces 框架的各项功能。
CAAPriCutCopyPaste 实现的功能
CAAPriCutCopyPaste 示例旨在演示如何在指定的形状特征 [1](即简化凸台)上实现 CATIMechanicalCCP 和 CATIShapeFeatureProperties 接口。该简化凸台以启动对象(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.m 和 CAAPriCutCopyPasteMain.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:包含 CAAPriEMechanicalCCP 和 CAAPriECCPProp 两个类,分别作为 CAAPriUserPad 特征的扩展类,实现 CATIMechanicalCCP 与 CATIShapeFeatureProperties 接口。
- 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 方法中一致。整体逻辑为:找到被引用的草图,并将该方法调用委托给草图对象执行。
如果可以剪切,应返回 1,否则返回 0。
CanBeDeleted
CanBeDeleted 用于判断特征是否可以被剪切。...
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 特征实现 CATIMechanicalCCP 和 CATIShapeFeatureProperties 接口即可完成该功能。
对于直接聚合草图的特征,仅实现 CATIMechanicalCCP 就足够了。如果不满足这种情况,则还必须实现 CATIShapeFeatureProperties。这两个接口均在对应特征延迟类型的数据扩展类中实现。
希望和大家一起交流学习

浙公网安备 33010602011771号