理解应用容器【技术文章】

摘要

特征已经在某个容器内实例化。当此持久化结构由建模器引擎创建时,它被称为容器 ;当它由应用程序(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)。这种构建时声明使您可以绕过容器创建。当您在基础特征上使用添加扩展的方法(CATFmFeatureFacadeAddExtension)时,特征建模器会管理容器的创建。如果流已经包含所需的容器,则不会创建它,否则会自动完成创建。因此,对于扩展来说,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月] 文档创建


  1. PLM表达参考 ↩︎ ↩︎

  2. 建模特征StartUps ↩︎

  3. 特征扩展 ↩︎ ↩︎ ↩︎ ↩︎

  4. 理解表达加载模式 ↩︎ ↩︎

  5. 理解凭证 ↩︎ ↩︎ ↩︎

  6. 使用应用容器工作 ↩︎

  7. 理解应用容器集成 ↩︎

  8. 使用提供者工作 ↩︎

  9. 在运行时初始化应用容器 ↩︎

  10. 使用扩展特征和提供者扩展机械特征 ↩︎

相关推荐
y小川8 天前
操纵和拖拽移动三维表达【用例】
拖拽·caa·操纵器·三维表达
y小川16 天前
为自动化创建接口【技术文档】
自动化·接口·caa·对象建模器
三月枫火2 年前
Excel如何将单元格设为文本
excel·caa
疯狂学习GIS2 年前
Linux系统Ubuntu配置Docker详细流程
linux·ubuntu·docker·开发环境·docker engine·容器化平台·应用容器