摘要
本文详细介绍了将一个特征(称为基础特征)通过另一个特征(称为扩展特征)进行扩展的机制。
概念
一张解释概念的图片:
图.1 概念
但是扩展特征本身不能被扩展。基础特征不能是扩展特征。
扩展机制在于创建基础特征对扩展特征的聚合,而无需修改基础特征的StartUp。
CATFmFeatureFacade类提供了方法来:
- 从基础特征添加、移除或检索特征扩展
- 从扩展特征检索基础特征
用例 “Working with Feature Extensions”[1]是这些方法的一个示例。
现在进一步了解这个扩展特征。
什么是特征扩展?
首先它是一个特征,因此像任何其他特征一样,您使用OSM语言[2]来设计它。它的特殊性在于使用特定的标签声明为 “extension”。您将在下一节(设计特征扩展部分)看到实现细节。
一个扩展特征可以扩展多个基础特征。被扩展的特征(基础特征)也在 OSM 中声明,请参阅“声明用于管理特征扩展的信息”部分。但是反过来,对于给定的基础特征,扩展特征只能被实例化一次。
图.2 可行与不可行
在图2中可以看到特征扩展1扩展了两个基础特征,但是特征的被同一个扩展特征扩展两次(特征扩展2)是不可能的。此检查由CATFmFeatureFacade类的AddExtension方法确保。这是向基础特征添加扩展的唯一方法。
注意:扩展特征被设计为通过扩展协议由基础特征聚合,因此不要将此特殊特征聚合到另一个特征,因为该特征的某个属性将是组件。
从内部特征建模器特征派生的特征
我们之前说过扩展特征在OSM文件中使用特殊标签声明,因此通过这种方式你可以创建一个从特定特征派生的新StartUp。您不能直接访问派生特征的属性,但您可以受益于此派生特征实现的接口。您可以在“在特征扩展上需要实现的接口部分”找到详细信息。
生命周期
扩展特征由基础特征聚合,这意味着扩展特征的生命周期与其基础特征相关联。当基础特征被删除时其所有声明为组件属性的聚合元素都将被删除,例如其所有扩展特征。
当需要删除扩展特征时,您可以在基础特征上使用CATFmFeatureFacade接口的RemoveExtension方法,或者在扩展特征本身上使用同一类的DeleteSelf方法。在这两种情况下特征扩展都会被删除并从其基础特征中移除。也可以进行一些自定义像任何类型的特征一样,请参阅“在特征扩展上需要实现的接口部分”部分。
扩展特征如果没有被基础特征聚合就没有存在的理由。
基础特征实例化
想象一种情况基础特征已经包含一个扩展,而这个基础特征(一个实例)又被实例化。请参阅参考文献[3]中的实例/引用概念。您可以选择是否复制扩展特征。
图.3 局部或非局部特征扩展
在图3中基础特征(一个实例)是一个将被实例化的引用。如果您将扩展特征声明为“local”,它将在新的基础特征实例上不被实例化否则它也将被实例化。这种局部/非局部声明是通过OSM文件完成的,请参阅“声明用于管理特征扩展的信息”部分并且在运行时不可修改。
强烈推荐使用局部模式。
特征扩展外部命名
我们想告知读者关于扩展特征命名的一个小特点。这个特征像任何其他特征一样被处理,这意味着它的自动名称将包含一个增量数字。但是如果您阅读文章[4],您会看到该值是从聚合特征计算得出的。因此如果您不自己更改外部名称计算,您可能会为不同的扩展特征多次获得相同的外部名称[11]。
图.4 特征扩展命名
下面您可以看到产品结构用例[5]在扩展特征上实现CATIAlias之前的图片。您可以看到所有扩展都具有相同的外部名称:CAAPstINFRelimitedLine.1。这是因为扩展特征是它们各自基础特征聚合的第一个元素。您可以通过在扩展特征上实现CATIAlias接口来解决此用例中的问题[11]。
像其他特征一样的特征
此特征集成了撤销/重做机制。
何处存储特征扩展?
阅读文章“理解应用容器”[6]后,您了解到特征只能在容器内实例化。
当您使用CATFmFeatureFacade接口的AddExtension方法来扩展基础特征时,此方法最终会创建扩展特征的一个实例。但是如果您考虑此方法的签名,它只包含扩展的标识符。因此此方法需要一个额外的信息来检索容器。此信息将在定义特征扩展StartUp的OSM文件中检索。请参阅“声明用于管理特征扩展的信息”部分。
选择正确容器的一些建议:
哪种类型的容器?
必须遵守的强制性规则是:基础特征和扩展特征必须在同一个 PLM 表达参考[6]中。它们可以在同一个容器中,或者在两个不同的容器中,但它们必须在同一个PLM表达参考中。我可以使用基础特征容器吗?
如果这个容器是您的容器,那是可能的否则请创建另一个应用容器。您不能将您的特征插入到不属于您的容器中。我可以使用与包含我的应用特征相同的容器吗?
没有限制规定您的两种类型的特征(那些从头设计的特征和您的扩展特征)共享同一个容器。
开发特征扩展的主要步骤
现在我们已经了解了概念,我们可以展示实现细节。我们建议读者,要真正了解扩展特征的用法,可以参考实现该机制的不同用例:
- 特征建模器中的特征扩展[1][7]
- 扩展应用特征(在产品模型器中)[5]
- 扩展机械特征[8]
设计特征扩展
使用OSM 技术[2],您可以通过使用标签来设计扩展特征。
document `MyStartUpCatalogName.CATfct` { container RootCont #root { ... feature MyExtensionName #startup #extension { ... } ... } }注意#startup #extension,它将特征语句声明为特征扩展的StartUp。
我们加粗了需要自定义的参数:
- 第一个
MyStartUpCatalogName,是包含此OSM文件设计的所有StartUp的目录的名称。您可以更新现有目录或创建一个新目录以集成您的新扩展特征StartUp。 - 第二个
MyExtensionName,是扩展特征的标识符。(请遵守 CAA 命名规则[9])。此标识符用于:- 作为在您的特征扩展上实现接口的晚期类型
- 添加或检索扩展。
AddExtension和GetExtension方法需要此标识符作为输入。
在两个括号之间,您定义了扩展特征本身。
... feature MyExtensionName #startup #extension { #creation::parameter = metadata_identifier1 ... attribute 1 attribute 2 ... } ...像往常一样可以插入属性定义或许还有一些初始化。但最相关的信息是#creation::parameter行。对于特征扩展这一行是强制性的。只有当您的StartUp派生自另一个本身直接或间接拥有此声明的StartUp时,您才可以省略它。在这种情况下,您继承了派生 StartUp 的行为。有关派生示例,请参阅用例[7]。
metadata_identifier1是一个元数据语句的名称,该语句声明了用于管理特征扩展的信息:
document `MyStartUpCatalogName.CATfct` { container RootCont #root { ... feature MyExtensionName #startup #extension { #creation::parameter = metadata_identifier1 ... } ... } metadata metadata_identifier1 { ... } }元数据语句与容器语句位于同一级别。多个特征扩展可以共享同一个元数据块。
现在让我们详细说明这个特定元数据块的内容。
声明用于管理特征扩展的信息
与#creation::parameter方面关联的元数据块必须包含以下四行。每一行都必须添加但顺序无关紧要。
metadata metadata_identifier { `ContType` ="ContainerType" `Container` ="ContainerName" `Extends` =[ "StartUp1",...] `IsLocal` = true | false }请注意: 当更新osm文件时可以省略,但是当osm文件由CATFctEditorAssistant生成时将可见。
- 用于自动创建应用容器的信息。ContType参数是容器的晚期类型。如有必要请参阅“理解应用容器”文章[6]的创建部分。多亏了这行
AddExtension方法能够在当前 PLM 表达参考[6]的主流中自动创建容器(如果尚不存在)。此方法在创建后将通过调用CATInit接口的init方法来激活容器。
ContType="MyContainerType"- 要在其中实例化扩展特征的容器的标识符:将在其中创建扩展特征的容器的标识符。
Container="MyApplicativeContainerIdentifier"- 可扩展特征的列表:其中
MyBaseFeaturei是基础特征的标识符(Startup 标识符[4])。该列表当然必须至少包含一个元素。可扩展的StartUp列表由每个应用程序定义,请参阅其文档。
Extends=["MyBaseFeature1, MyBaseFeature2, MyBaseFeature3"]注意如果StartUp仅扩展一个特征,请不要忘记 [](典型错误)
Extends=["MyBaseFeature1"]- 局部或非局部
IsLocal= true or false值可以是 true(在基础特征实例化的情况下不实例化特征扩展)或 false(否则);强烈推荐 true。
关于应用容器
在“理解应用容器”文章[6]中,你将找到创建此容器并将其集成到标准达索系统行为中的所有细节。上述参考用例对于研究模型器之间的细微差异很有意义。
在此,我们将告知读者当应用容器包含扩展特征时的主要特点:
无论负责流的模型器是什么,当流在会话中加载时(换句话说,流在编辑模式下打开或切换到编辑模式[10]),所有应用容器都会自动加载(和初始化)。
在特征扩展上需要实现的接口
除了在任何特征上原生实现的 CATIRedrawEvents 之外,需要在每个扩展特征上实现的基本接口有:
| 接口名称 | 上下文 | 行为 |
|---|---|---|
| MyInterface | 所有 | 用于处理扩展特征属性的接口 |
| CATIModelEvents | UI | 能够更新查看器 |
| CATI3DGeoVisu/CATI2DGeoVisu | UI | 定义 2D/3D 可视化 |
| CATIVisProperties | UI | 能够通过属性命令修改图形属性 |
| CATISelectShow | UI | 能够隐藏/显示扩展特征(也必须实现 CATIVisProperties) |
| CATIEdit | UI | 编辑扩展特征 |
| CATIFmFeatureBehaviorCustomization | 所有 | 自定义删除[13],实现构建[14],但不要使用此接口来自定义 CCP 行为。 |
| CATINavigateObject (*) | UI | 为节点提供名称,并列出其子节点,以便在规范树中可视化。检查基础特征本身是否实现了 CATINavigateObject,以及其实现是否考虑了其可能的扩展。 |
| CATIAlias | 所有 | 提供 SetAlias 和 GetAlias |
| CATIUseEntity | 所有 | 请参阅参考文章[12]。 |
这是最通用的接口,然后根据定义基础特征的应用程序,可能存在一些其他接口。但在所有情况下,首先查看定义基础特征的应用程序的文档,您可以找到集成特征扩展所需的所有信息。
简而言之
本文解释了特征扩展机制是扩展任何类型特征(扩展特征除外)的方法,可以同时实现:
- 在数据和行为上。
- 在基础特征外部,无需修改基础特征。
该机制有许多便利之处:
- 扩展特征的生命周期与基础特征绑定,删除基础特征会导致其扩展被删除。
- 当需要时包含扩展的应用容器会自动打开和初始化。
- 通过在OSM文件中声明正确的信息,可以自动创建应用容器。
您应该:
- 交付包含扩展特征的StartUp目录文件。
- 可能需要创建和管理一个新的应用容器。
- 在新特征上实现接口。
参考资料
- 使用特征扩展
- 建模特征 StartUp
- 特征建模器概念
- 理解特征命名
- 扩展应用数据(产品上下文)
- 理解应用容器
- 定义特征扩展
- 机械建模器扩展概述
- CAA C++ 命名规则
- 理解表示加载模式
- 自定义特征命名
- 通用协议集成
- 理解删除协议自定义
- 构建/更新协议
历史
版本:1 [2007年10月] | 文档创建