摘要
特征已经在某个容器内实例化。当此持久化结构由建模器引擎创建时,它被称为容器 ;当它由应用程序(DS或CAA)创建时,则称为应用容器。本文的目标是提供所有必要信息,以帮助您在实例化CAA特征时选择正确的容器,如何创建应用容器,以及如何管理容器(无论是否为应用容器)。
前言
本章包含有关容器的有用信息。
容器定义
容器是流内的一种结构,如下图所示:

图1 流与容器
PLM 表达参考 [1](#1) 存储在底层数据库(保险库服务器)中。这个特定的PLM对象聚合了一个存储在存储服务器(也称为文件服务器)中的结构。该结构不可访问,其中包含流,只有名为"主流"的流包含容器。其他流称为辅助流,CAA无法访问,因此不在本文讨论范围内。主流可以是例如3D形状、工程图、Word文档、txt文件等...
容器是一种结构,用于保存任何实现了持久性协议(未公开)的对象。通常容器包含特征。机械容器 CATPrtCont 包含机械特征,而几何容器 CGMGeom 包含几何对象(这些对象不是特征)。
在[图.1]中,您可以看到有两种容器:
- 容器(或建模器容器)
这些是由建模器管理的容器,通常是流的责任方。- 3DShape[1](#1):三个建模器容器:CATPrtCont, CGMGeom, CATMFBRP
- Drawing:一个容器
- 其他情况请参阅您的建模器文档。
- 应用容器
应用容器是不由流责任方建模器管理的容器。这些容器由使用建模器的应用程序创建。这些应用程序可以是DS或CAA。DS应用容器的一个例子是电气容器。
作为CAA合作伙伴或CAA客户,您也可以创建自己的应用容器。但它只能是用于存储特征的容器。在接下来的章节中,您将获得创建、使用和管理您自己的应用特征容器所需的所有信息。
容器加载
当PLM表达在会话中加载时,根据其加载模式,主流可能存在也可能不存在。但如果加载模式是"编辑",则所有特征容器都会被加载。您可以安全地使用特征建模器API。
警告:
- 访问或创建容器仅当PLM表达参考处于编辑模式时才有可能。
- 所有修改数据模型的特征建模器API都要求流的所有特征容器都已加载。
用于实例化目的的容器选择
您刚刚设计完[2](#2)新的CAA特征,现在的问题是:我将把从新启动项(Startup)创建的特征存储在哪里?
我们建议遵守以下规则:
- 如果您的CAA 启动项直接或间接派生自达索启动项 ,则实例化必须在达索容器内完成,即管理此类特征的容器。
- 如果您的CAA特征是特征扩展 [3](#3),则实例化必须在由您的应用程序管理的应用容器内完成。
- 其他情况下,实例化也必须在应用容器内完成。
如果您处于第二种和第三种情况,本文完全适用。在第一种情况下,只有下一章的容器访问和容器自省部分相关。
管理容器
本节涉及基本功能:创建、检索和自省容器。
警告: 在深入细节之前,您应该了解所有操作(创建/检索/扫描)只有在主流[图1]加载到会话中时才可能进行。换句话说,PLM表达参考[图1]必须处于编辑模式。您可以在PLM表达参考文章[4](#4)中找到关于PLM加载模式的所有信息。
应用容器创建
在现有PLM产品表达参考中创建应用容器的方法是使用CATFmContainerServices类。该类包含以下CreateApplicativeContainer方法:
cpp
HRESULT CreateApplicativeContainer(const CATFmCredentials & iAccreditations,
CATBaseUnknown * iContext,
const CATUnicodeString & iContainerType,
const CATUnicodeString & iContainerName,
CATFmContainerFacade & oContainerFacade) = 0
让我们看看每个参数:
| 参数 | 含义 |
|---|---|
iAccreditations |
需要此凭证^[5](#参数 含义 iAccreditations 需要此凭证5来检索PartnerId(由CATFmCredentials类的RegisterAsApplicationBasedOn方法定义)。此标识符将用于许可证测试。 iContext 可以是: • PLM表达参考指针:新容器将在其主流中创建 • 容器:新容器将在包含输入容器的同一流中创建 • 特征:新容器将在包含该特征(包含该特征的容器)的同一流中创建 iContainerType 它代表容器的延迟类型。您将在此延迟类型上实现接口,如CATInit,以及用于为容器创建元素的工厂。如果不想指定延迟类型,请使用字符串"CATFeatCont"。 iContainerName 它代表容器的名称。此字符串不能为空。同一流中可以共存两个相同类型的容器,但它们的名称必须不同。该名称将用于检索容器,请参见下一节。 oContainerFacade 对新创建容器的外观。与此外观关联的凭证不会被创建方法使用和修改。返回的外观所需的认证必须与外观的后续使用兼容。)^来检索PartnerId(由CATFmCredentials类的RegisterAsApplicationBasedOn方法定义)。此标识符将用于许可证测试。 |
iContext |
可以是: • PLM表达参考指针:新容器将在其主流中创建 • 容器:新容器将在包含输入容器的同一流中创建 • 特征:新容器将在包含该特征(包含该特征的容器)的同一流中创建 |
iContainerType |
它代表容器的延迟类型。您将在此延迟类型上实现接口,如CATInit,以及用于为容器创建元素的工厂。如果不想指定延迟类型,请使用字符串"CATFeatCont"。 |
iContainerName |
它代表容器的名称。此字符串不能为空。同一流中可以共存两个相同类型的容器,但它们的名称必须不同。该名称将用于检索容器,请参见下一节。 |
oContainerFacade |
对新创建容器的外观。与此外观关联的凭证不会被创建方法使用和修改。返回的外观所需的认证必须与外观的后续使用兼容。 |
通常您像这样创建一个应用容器:
cpp
...
CATFmCredentials MyAccreditation;
CATUnicodeString PartnerId="....";
MyAccreditation.RegisterAsApplicationBasedOn(CATFmFeatureModelerID,PartnerId)
...
CATBaseUnknown *pIRepRef = .... ;
CATFmContainerFacade MyNewContainerAsFacade ;
CATFmContainerServices::CreateApplicativeContainer( MyAccreditation, pIRepRef, "MyContainerType","MyContainerType", MyNewContainerAsFacade );
...
如果您需要新容器的智能指针:
cpp
...
CATBaseUnknown_var MyContainerAsSp = MyNewContainerAsFacade.GetContainer();
...
如果您需要容器上的接口指针:
cpp
...
MyInterface * pInterfaceOnMyContainer = NULL ;
MyNewContainerAsFacade.QueryInterfaceOnContainer(IID_MyInterface,(void **) & pInterfaceOnMyContainer ) ;
...
但是,如果您想将容器用于实例化目的,请在CreateApplicativeContainer调用之前考虑添加正确的凭证[5](#5):
cpp
...
CATBaseUnknown *pIRepRef = .... ;
CATFmCredentials mycredential ....
CATFmContainerFacade MyNewContainerAsFacade(mycredential) ;
CATFmContainerServices::CreateApplicativeContainer( mycredential, pIRepRef, "MyContainerType","MyContainerType", MyNewContainerAsFacade );
...
用例"使用应用容器工作"[6](#6)是创建过程的一个示例。
注意: 上面的只是一个理论示例。通常,您会在整个应用程序中使用相同的凭证,因此您会为所有外观使用相同的凭证。
容器和特征扩展
特征扩展总是存储在您在定义扩展时声明的应用容器中[3](#3)。这种构建时声明使您可以绕过容器创建。当您在基础特征上使用添加扩展的方法(CATFmFeatureFacade的AddExtension)时,特征建模器会管理容器的创建。如果流已经包含所需的容器,则不会创建它,否则会自动完成创建。因此,对于扩展来说,CreateApplicativeContainer不是必需的,尽管如此,您仍然可以使用它。在这种情况下,CreateApplicativeContainer的参数与OSM声明之间的联系如下:
cpp
metadata metadata_identifier {
ContType = "ContainerType"
Container = "ContainerName"
Extends = [ "StartUp1",...]
IsLocal = true | false
}
其中:
iContainerType= 用于"ContType"值的字符串。iContainerName= 用于"Container"值的字符串。
技术表达与容器
没有初始应用容器就无法创建PLM产品技术表达。因此,用于创建此类PLM对象的API除了创建该PLM对象所需的参数外,还具有与为现有PLM表达参考创建应用容器相同的参数。只是上下文没有用。
在以下两个方法中,第一个创建独立的PLM技术表达,而第二个则创建并实例化它,您可以看到检索到了与为现有PLM表达参考创建应用容器相同的信息:凭证、容器类型及其名称。
cpp
...
CATIPrdExtRepresentationReferenceFactory::CreateTechnologicalRepReference(CATIAdpEnvironment* ipEnv, CATListValCATICkeParm_var & iPrdRepAttributesValues,
const CATFmCredentials & iAccreditations, const CATUnicodeString & iContainerType, const CATUnicodeString & iContainerName,
CATIPsiRepresentationReference *& opRepReference) = 0;
...
CATIPrdExtAggregatedRepresentations::AddTechnologicalRepresentation(CATIAdpEnvironment* ipEnv, CATListValCATICkeParm_var & iPrdRepAttributesValues,
const CATFmCredentials & iAccreditations, const CATUnicodeString & iContainerType, const CATUnicodeString & iContainerName,
CATIPsiRepresentationReference *& opRepReference) = 0;
这两个接口是ProductStructureExtItf框架的一部分。
容器访问
可以通过CATIPLMNavRepReference接口(CATPLMComponentInterfaces框架)的RetrieveApplicativeContainer方法,使用其名称从PLM表达参考中检索容器(无论是应用容器还是其他容器):
cpp
HRESULT RetrieveApplicativeContainer( const CATUnicodeString& iContainerName,
const IID& iInterfaceId,
void** oApplicativeContainer) = 0
该接口必须由负责容器的应用程序或建模器提供;没有处理容器的通用API。
特征容器自省
可以通过使用CATFmContainerFacade类来扫描特征容器。通常,这只适用于CAA应用容器,因为DS不提供扫描其容器的凭证。如果需要,DS将通过特定的CAA API公开。
下面我们使用了ScanRootFeatures方法来检索没有父项的特征。您也可以使用ScanFeatures来检索聚合和非聚合特征。
cpp
CATFmContainerFacade MyContainerFacade(MyCredentials);
CATFmFeatureIterator Iterator ;
MyContainerFacade.ScanRootFeatures(Iterator);
但是,根据您的凭证,您可能会获得更多或更少的特征。这在"理解凭证"文章[5](#5)的"容器外观凭证"章节中有详细解释。
标准DS行为集成
通过创建您自己的应用容器,您可以受益于所有特征建模器的功能:持久性、自省、有时自动加载以及其他便利。但是流的责任方建模器[图1]不知道您的应用容器的内容,因此它无法像您所希望的那样公开数据。因此,对于一些需要了解应用容器内容的DS行为(主要是交互式行为),建模器会将容器自省委托给一个特殊的对象。这个特殊对象是提供者管理器。每个希望为DS行为被调用的应用容器,都必须事先向此管理器声明。
这些可能性对产品建模器[7](#7)和机械建模器[8](#8)有效。在参考文章中,您将找到支持哪些行为以及如何处理提供者管理器。
对于其他建模器,请参阅其CAA文档。
应用容器加载与激活
为了可用,应用容器必须首先被加载 到会话中或刚刚创建 ,然后被激活。激活包括"将控制权交给"容器,以便执行一些初始化操作。让我们阐述不同的情况。
创建与激活
当应用容器被显式(CATFmContainerServices::CreateApplicativContainer)或隐式(CATFmFeaturefacade::AddExtension)[3](#3)创建时,它也会被激活。
加载与激活
DS管理其自己的容器,因此当PLM表达参考以编辑模式加载(或切换)[4](#4)时,其有用的容器会被加载和激活。但是,包含在PLM表达参考流中的CAA应用容器会发生什么?
对于您的CAA应用容器:
- 所有包含特征扩展 [3](#3)的应用容器总是被加载和激活。
- 其他情况(即不包含至少一个特征扩展的应用容器),这取决于建模器:
- 对于产品,所有应用容器都会被加载和激活。
- 其他情况:请参阅您领域的CAA文档。
激活原理
激活是通过CATInit接口的Init方法完成的。此接口在您应用容器的延迟类型上实现,即创建方法的第二个参数。此激活针对每个应用容器实例进行。考虑这个例子:

图2 激活
两个流各自包含一个延迟类型为"Appl. Container 2"的应用容器的实例。在流A中,容器包含2个特征,在流B中包含另外3个特征。当请求激活这些容器时,将为每个容器调用CATInit接口的Init方法。
让我们解释激活包括什么,根据您的应用程序,您可以决定是否实现CATInit接口。
Init方法的内容
此方法的内容通常包含以下两个步骤,并且按此顺序:
- 声明必要的提供者(参见标准DS行为集成部分)
- 使用
CATIModelEvents将容器的每个特征连接到"事件"模型树
您在参考的产品[9](#9)和机械建模器[10](#10)用例中有几个示例。
GetRootContainer方法的内容
这取决于您的应用容器的内容。如果容器包含一个唯一的且代表根的特征,此方法可以返回它,否则实现可以返回NULL。
简而言之
在本文中,我们描述了什么是应用容器,如何创建、自省和激活它。
历史记录
版本:1 [2007年10月] 文档创建