← 返回首页

CATIA V5 CAA 装配模块二次开发常用接口介绍

CATIA V5 CAA 装配模块二次开发常用接口介绍

作者:CATIA开发者指南
发布时间:2026年6月18日 22:21
原文链接:https://mp.weixin.qq.com/s?__biz=MzkxNTQ0MTY0NQ==&mid=2247486532&idx=1&sn=29f82f0ec446e9b58f5b2415b02a359a&chksm=c15e5ec6f629d7d09a1e303852747c559849a00b17cefa614f193d6011e9f10fc44c99203735&cur_album_id=2800898825187262468&scene=189#wechat_redirect


前面几篇文章已经分别讨论了自定义特征、命令/工作台接入、交互代理机、对象模型和零件设计接口。本文换到装配模块:在 CATProduct 里做二次开发时,经常需要打交道的是哪些接口?它们分别负责产品结构、引用/实例、位置、发布、连接器和约束的哪一层能力?

图片

装配开发和零件开发最大的区别在于:你操作的往往不是一个“几何对象本身”,而是某个产品实例上下文中的几何对象。相同的 CATPart 可以被实例化多次,每个实例有不同位置、不同父产品、不同约束上下文。因此装配二开不能只问“这个面是什么”,还要问“这个面属于哪个产品实例、处在哪个活动装配层级、约束应该建在哪个 reference product 下”。

可以先建立一条主线:

CATProduct 文档
  -> Root Product
    -> Reference Product / Instance Product
      -> Shape Representation / Work Mode
      -> Position / Move
      -> Publication
      -> Connector
      -> Constraint / Constraint Set

一句话:

ProductStructure 管装配树和产品实例,CATAssemblyInterfaces 管装配连接器和约束,ConstraintModelerInterfaces 管约束对象本身。

1. 接口分布总览

装配模块常用接口并不只在 Assembly 目录下。实际上,AssemblyCATAssemblyUI 更多是实现/UI framework,常用 C++ 原生 API 主要分布在下面几个 framework 中:

Framework 典型内容 作用
ProductStructure CATIProduct、CATIMovable、CATIPrdProperties、CATIPrdObjectPublisher、CATIProductInSession、CATPrsWorkModeServices 产品结构、引用/实例、位置、属性、发布、表示和工作模式
CATAssemblyInterfaces GetProductConnector、CreateConstraint、CATAsmConstraintServices、CATAsmConstraintSetServices、CATIAsmCstSetFeature 装配连接器、约束创建、约束集管理和装配设置
ConstraintModelerInterfaces CATICst、CATICstData 约束对象本身、约束类型、元素、数值和状态读写
ConstraintModeler CATIDegreesOfFreedom 等 约束求解、自由度分析等能力
ObjectModelerBase CATDocumentServices、CATSessionServices、CATInit、CATIDocRoots、CATILinkableObject 文档、Session、根对象和可链接对象基础设施
ObjectSpecsLegacy / ObjectSpecsModeler CATIConnector、CATISpecObject、LifeCycleObject 规格树对象、连接器对象和生命周期管理
MecModInterfaces CatConstraintType / CATConstraintType.h 装配约束类型枚举,如 Fix、Offset、Coincidence、Angle
KnowledgeInterfaces CATICkeParm 距离、角度等约束数值参数
Mathematics CATMathTransformation 产品位姿矩阵、移动和坐标变换
ProductStructureInterfaces CATIPrdReferenceDocStatus、CATIPrdHandleImpactsOnInstance、CATIPrdHandleImpactsOnReference、CATIPrdTransactionalEventMgt PDM/PLM、外部化、重命名影响和事务事件管理

2. Product 文档与 Root Product

装配二开的入口通常是一个 CATProduct 文档。批处理程序里常见流程是:创建/打开文档、取得根产品、再沿装配树遍历或修改。

2.1 创建或打开 CATProduct 文档

CATDocumentServices 是文档级入口:

方法 作用
CATDocumentServices::New("Product", doc) 创建新的 CATProduct 文档
CATDocumentServices::OpenDocument(path, doc) 打开已有文档
CATDocumentServices::GetDocumentInSession(name, doc) 从当前 Session 查找已加载文档
CATDocumentServices::SaveAs(doc, path) 另存文档
CATDocumentServices::Remove(doc) 从 Session 移除文档

批处理程序通常还需要显式创建和销毁 Session:

CATSession *pSession = NULL;
HRESULT hr = ::Create_Session("MySession", pSession);

CATDocument *pDoc = NULL;
hr = CATDocumentServices::New("Product", pDoc);

// ... modify document ...

::Delete_Session("MySession");

在 CATIA 交互命令中,一般不需要自己创建 Session,而是从当前编辑器、当前文档或选择路径中拿上下文。

2.2 获取 Root Product 和 Container

新代码优先通过 CATInit::GetRootContainer() 获取文档根容器:

CATInit_var spInit = pDoc;
CATBaseUnknown *pRootUnknown = spInit->GetRootContainer("CATIContainer");

if (pRootUnknown != NULL)
{
  pRootUnknown->Release();
  pRootUnknown = NULL;
}

根装配可以使用 CATIDocRoots::GiveDocRoots()

CATIDocRoots_var spDocRoots = pDoc;
CATListValCATBaseUnknown_var *pRoots = spDocRoots->GiveDocRoots();
CATIProduct_var spRootProduct;
if (pRoots != NULL && pRoots->Size() > 0)
{
  spRootProduct = (*pRoots)[1];
}
delete pRoots;
pRoots = NULL;

CATIDocRoots 在产品结构导入和旧样例中经常出现,但头文件本身已经提示:获取文档根元素时应优先考虑 CATInit::GetRootContainer()

3. CATIProduct:装配树的核心接口

CATIProduct 是 Product Structure 最核心的 C++ 原生接口。它既可以出现在 reference product 上,也可以出现在 instance product 上。

3.1 Reference Product 与 Instance Product

装配开发中最容易混淆的是 reference 和 instance:

概念 含义 常用接口
Reference Product 产品定义本体,保存 part number、shape representation、publication 等定义信息 GetPartNumber()、SetPartNumber()、IsReference()
Instance Product 某个 reference 在父产品中的一次使用,保存实例名、父子关系和位置上下文 GetPrdInstanceName()、SetPrdInstanceName()、GetFatherProduct()
Instance -> Reference 从实例回到其定义 GetReferenceProduct()
Reference -> Instance 在指定产品上下文中查找该 reference 的实例 FindInstance(contextProduct)

典型判断写法:

CATIProduct_var spProduct = iObject;
if (!!spProduct)
{
  HRESULT isRef = spProduct->IsReference();
  CATIProduct_var spReference = spProduct->GetReferenceProduct();
}

经验规则:

PartNumber 属于 reference,InstanceName 属于 instance,Position 通常属于 instance。

3.2 遍历装配树

CATIProduct 提供父子结构访问能力:

方法 作用
GetFatherProduct() 获取父产品
GetChildrenCount() 获取直接子产品数量
GetChildren("CATIProduct") 获取直接子产品列表
GetAllChildren("CATIProduct") 获取递归子产品列表
RemoveProduct(instance) 从父产品下移除一个实例

遍历直接子产品的常见写法:

CATListValCATBaseUnknown_var *pChildren = spRootProduct->GetChildren("CATIProduct");
if (pChildren != NULL)
{
for (int i = 1; i <= pChildren->Size(); ++i)
  {
    CATIProduct_var spChild = (*pChildren)[i];
if (!!spChild)
    {
      CATUnicodeString name;
      spChild->GetPrdInstanceName(name);
    }
  }
delete pChildren;
  pChildren = NULL;
}

CAA 列表通常是 1-based index。由接口返回、需要调用方释放的列表,要按接口说明 delete,不要泄漏。

3.3 添加组件

CATIProduct 有两个常用 AddProduct 语义:

方法 作用
AddProduct(referenceProduct) 将同一文档中的已有 reference 实例化到当前产品下
AddProduct("PartNumber") 创建一个本地 reference product,并把其实例添加到当前产品下
AddProducts(list, cont, result) 批量添加多个 reference

示例:

CATUnicodeString partNumber("Bracket");
CATIProduct_var spNewInstance = spRootProduct->AddProduct(partNumber);
CATIProduct_var spNewReference = spNewInstance->GetReferenceProduct();

注意:CATIProduct::AddProduct(reference) 要求 reference 已经在同一文档中。导入外部 CATPart/CATProduct 是另一个问题,通常要通过 Product Structure 的外部组件导入服务或项目封装的 helper 完成,不要误以为 AddProduct() 会自动打开外部文件并保存外部文档。

4. 产品属性、BOM 与发布

4.1 CATIPrdProperties

CATIProduct 自身提供了少量名称方法,但更完整的属性访问建议走 CATIPrdProperties

方法 作用
GetPartNumber() / SetPartNumber() reference 的零件号
GetRevision() / SetRevision() reference 版本
GetSource() / SetSource() source 属性
GetDefinition() / SetDefinition() definition 属性
GetNomenclature() / SetNomenclature() nomenclature 属性
GetDescriptionRef() / SetDescriptionRef() reference 描述
GetInstanceName() / SetInstanceName() instance 名称
GetDescriptionInst() / SetDescriptionInst() instance 描述
GetUserProperties() 获取用户属性集合
GetActivateBOM() / SetActivateBOM() BOM 激活状态

示例:

CATIPrdProperties_var spProps = spProduct;
if (!!spProps)
{
  CATUnicodeString revision;
  spProps->GetRevision(revision);
  spProps->SetDescriptionRef(CATUnicodeString("Created by CAA command"));
}

4.2 CATIPrdObjectPublisher

Publication 是装配设计里非常重要的稳定引用机制。与其让外部装配直接抓某个内部 BRep,不如让零件或子产品发布一个语义明确的对象,例如 MountPlaneAxis1HoleCenter

CATIPrdObjectPublisher 常用方法:

方法 作用
Publish(name, object) 创建 publication,可同时赋值
Unpublish(name) 删除 publication
Valuate(name, object) 给 publication 赋直接对象
Valuate(name, subPublisher, subName) 让 publication 指向另一个 publication
Unvaluate(name) 清除 publication 的赋值
GetFinalObject(name) 获取最终指向对象
GetDirectObject(name, objectOrSubPublisher, subName) 获取直接指向对象,区分直连和子发布
IsPublished(object, names) 查询对象被哪些 publication 发布
ListPublications(names) 列出当前 product 的所有 publication

典型写法:

CATIPrdObjectPublisher_var spPublisher = spReferenceProduct;
if (!!spPublisher)
{
CATUnicodeString pubName("MountPlane");
  spPublisher->Publish(pubName, spPlane);

  CATBaseUnknown *pPublished = spPublisher->GetFinalObject(pubName);
if (pPublished != NULL)
  {
// Use published object
    pPublished->Release();
    pPublished = NULL;
  }
}

在装配约束、替换组件和跨文档引用场景中,publication 通常比直接引用内部拓扑更稳定。

5. 表示、加载模式与工作模式

装配中的产品不一定总是处于 Design 模式。大装配经常以 Visualization、Product、BRep 或 Design 模式加载。很多几何访问、BRep 选择、约束创建问题,本质上是目标对象没有进入足够的工作模式。

5.1 Shape Representation

CATIProduct 管理产品的 shape representation:

方法 作用
AddShapeRepresentation(object, name, CATPrd3D) 添加几何表示
AddShapeRepresentation(type, path, name, CATPrd3D) 从外部文件路径添加表示
GetShapeRep(object, name, CATPrd3D, …, loadIfNecessary) 获取指定表示
ListShapeRep(names, CATPrd3D) 列出表示名称
RemoveShapeRep(name, CATPrd3D) 删除表示
GetRepresentation(name, rep, CATPrd3D) 获取 CATIPrdRepresentation

CATIPrdRepresentation 可进一步管理 representation 的模式、链接对象和可视化对象。

CATIProductInSession 继承自 CATIProduct,用于管理 session 中的临时表示状态,尤其是当前 active shape representation:

方法 作用
SetActiveShapeRep(name) 按名称激活某个表示
SetActiveShapeRep(linkableObject) 按对象激活某个表示
GetActiveShapeRep() 获取当前 active representation 对象
GetActiveShapeName(name) 获取当前 active representation 名称

如果产品有多个表示,同一个 reference 的持久表示列表和当前 session 里实际激活的表示不是一回事。前者看 CATIProduct,后者看 CATIProductInSession

5.2 Work Mode

CATPrsWorkModeServices 用于读写产品工作模式:

模式 含义
WM_VISUALIZATION 可视化模式,适合轻量显示
WM_PRODUCT 产品结构模式
WM_BREP Linkable BRep 模式
WM_DESIGN Design/Edit 模式

典型写法:

CATPrsWorkModeServices::WorkMode mode;
HRESULT hr = CATPrsWorkModeServices::GetWorkMode(spProduct, mode);

hr = CATPrsWorkModeServices::SetWorkMode(
  spProduct,
  CATPrsWorkModeServices::WM_DESIGN);

如果命令需要访问零件内部几何、创建约束连接器或读取精确拓扑,先确认目标产品是否已加载到合适模式。

6. 产品位置与移动

6.1 CATIMovable

CATIMovable 负责产品实例的位姿读写。常用方法:

方法 作用
GetPosition(context) 获取相对指定 context 的位置
SetPosition(transfo, context) 设置相对指定 context 的位置
GetAbsPosition(transfo) 获取全局绝对位置
SetAbsPosition(transfo) 设置全局绝对位置
ApplyTransformation(transfo, context) 在 context 坐标系中叠加变换

CATMathTransformation 是位姿矩阵对象。一个简单平移可以这样构造:

double matrix[12] = {0.0};
matrix[0] = 1.0;
matrix[4] = 1.0;
matrix[8] = 1.0;
matrix[9] = 100.0;
matrix[10] = 0.0;
matrix[11] = 0.0;

CATMathTransformation transfo(matrix);

CATIMovable_var spMovable = spInstanceProduct;
if (!!spMovable)
{
  spMovable->SetPosition(transfo, NULL_var);
}

NULL_var context 表示默认上下文。嵌套装配里要特别注意 context:一个零件实例在根产品下的位置,和它在局部子装配 reference 下的位置,不一定是同一个对象语义。

6.2 嵌套实例中的 FindInstance

当同一个 reference 出现在不同上下文中时,先用 FindInstance() 找到目标上下文里的实例,再取 CATIMovable

// spPartReference 是目标零件的 reference product
CATIProduct_var spLocalReference = spLocalAssemblyInstance->GetReferenceProduct();
CATIProduct_var spPartInLocalContext = spPartReference->FindInstance(spLocalReference);

CATIMovable_var spMovable = spPartInLocalContext;

经验规则:

修改位置时,先确认你拿到的是 instance,不是 reference;再确认这个 instance 属于预期上下文。

7. 装配连接器与约束创建

装配约束不是直接把两个几何对象丢给 solver。CAA 里通常先把“产品实例上下文中的几何”封装为 connector,再用 connector 创建 constraint。

典型流程:

几何对象 + 所属实例产品 + 活动产品
  -> GetProductConnector
  -> CATIConnector
  -> CreateConstraint
  -> CATICst

7.1 创建或查找 Connector

GetProductConnector() 位于 CATAsmConnectorServices.h

CATIConnector *pConnector = NULL;
int created = 0;

HRESULT hr = ::GetProductConnector(
  pGeometry,            // CATILinkableObject*: 被约束几何
  pInstanceComponent,   // CATIProduct*: 几何所属产品实例
  pActiveComponent,     // CATIProduct*: 活动装配层级
0,                    // 0=找不到则创建,1=只查找已有,2=只查找 published
  pConnector,
  created,
0);                   // 0=static resolution, 1=dynamic resolution

几个参数非常关键:

参数 说明
iGeometry 被引用的几何,通常需要 CATILinkableObject
iInstanceComponent 该几何所在的产品实例,必须是 iActiveComponent 的后代
iActiveComponent 活动装配层级,用来识别工作文档和约束上下文
iSearchType 0 创建或查找;1 只查找已有;2 只查找 published connector
iResolutionMode 0 静态解析;1 动态解析

在交互命令中,选择代理机通常能给出 CATPathElement。不要只保存叶子几何对象,还应保存产品路径或实例上下文,否则后续创建 connector 时容易丢失装配语义。

7.2 创建 Constraint

CreateConstraint() 位于 CATAsmConstraintServices.h

CATLISTV(CATBaseUnknown_var) connectors;
connectors.Append(pConnector);

CATICst *pConstraint = NULL;
HRESULT hr = ::CreateConstraint(
  catCstTypeReference,
  connectors,
NULL,
  pActiveComponent,
  &pConstraint);

常用 CatConstraintType

枚举 装配约束
catCstTypeReference Fix Constraint
catCstTypeDistance Offset Constraint
catCstTypeOn Coincidence Constraint
catCstTypeAngle Angle Constraint
catCstTypePlanarAngle Planar Angle Constraint
catCstTypeParallelism Parallelism Constraint
catCstTypePerpendicularity Perpendicularity Constraint
catCstTypeSurfContact Surface Contact Constraint
catCstTypeLinContact Line Contact Constraint
catCstTypePoncContact Point Contact Constraint
catCstTypeAnnulContact Annular Contact Constraint

距离、角度等约束需要 CATICkeParm 数值参数;Fix、Coincidence 等场景通常可以传 NULL

CATAsmConstraintServices 还提供约束管理服务:

方法 作用
ListConstraints(product, list) 列出 reference product 下的约束
RemoveConstraint(cst) 删除 reference constraint
RefreshConstraint(cst) 刷新单个约束状态
RefreshConstraintsInProduct(product) 刷新某个 product 下约束状态

ListConstraints() 要求传入 reference product。很多“找不到约束”的问题,是把 instance product 当成 reference product 传入导致的。

8. CATICst:约束对象本身

CreateConstraint() 返回的是 CATICst。约束创建之后,后续读取、修改、诊断状态主要通过 CATICst 完成。

常用方法:

方法 作用
GetCstType() 获取约束类型
ListCstAttr() 列出约束属性参数
GetCstAttrValue(attr) 读取枚举型属性值
SetCstAttrValue(attr, value) 设置枚举型属性值
GetCstAttrRealValue(attr) 读取 double 型属性值
SetCstAttrRealValue(attr, value) 设置 double 型属性值
GetElement(index) 获取第 1~3 个约束元素
SetElement(index, elem) 替换第 1~3 个约束元素
GetRealValue(index) 获取第 index 个数值
SetRealValue(index, value) 设置第 index 个数值
ReadStatus() 读取约束求解状态
ReadDistance(index) / ReadAngle(index) 读取测得距离/角度
ChangeSector(sector) / ReadSector() 修改或读取角度 sector

例如把 Fix 约束设置成相对 reference:

CATICst_var spCst = pConstraint;
if (!!spCst)
{
  spCst->SetCstAttrValue(
    CATCstAttr_Reference,
    CATCstVal_Reference_Relative);
}

CATICst 中有不少 V5R15 前后的 deprecated 方法。新代码优先使用:

GetElement(i) / SetElement(i)
GetRealValue(i) / SetRealValue(i)
GetCstAttrValue(attr) / SetCstAttrValue(attr, value)

不要优先使用 GetElement1()GetElement2()GetValue()SetValue() 这类旧方法。

9. 约束集 Constraint Set

装配树中约束通常显示在 Constraints 节点下,并可以被整理到不同 constraint set 中。相关接口在 CATAssemblyInterfaces

9.1 CATAsmConstraintSetServices

优先使用 service class,而不是旧 factory:

方法 作用
GetRootSet(product, rootSet, create) 获取或创建某个 product 的 Constraints 根节点
AddNewSetChild(parentSet, newSet, previousSet) 在已有 set 下创建子 set

示例:

CATIAsmCstSetFeature_var spRootSet;
HRESULT hr = CATAsmConstraintSetServices::GetRootSet(
  spReferenceProduct,
  spRootSet,
  TRUE);

CATIAsmCstSetFeature_var spChildSet;
hr = CATAsmConstraintSetServices::AddNewSetChild(spRootSet, spChildSet);

CATIAsmCstSetFeatFactory 已标注 deprecated,新代码不要优先使用。

9.2 CATIAsmCstSetFeature

CATIAsmCstSetFeature 用来操作 set 内容:

方法 作用
ListSetChildren(list) 列出子 set
RemoveSetChild(child) 移除子 set,并把其内容移到父 set
GetFatherSet(father) 获取父 set
MoveSetFrom(fromSet, setToMove, previous) 在 set 之间移动子 set
ListCstChildren(list) 列出当前 set 内约束
MoveConstraintsFrom(fromSets, csts, previous) 在 set 之间移动约束

注意:RemoveSetChild() 只是移除 set 节点并迁移其子约束;如果要删除 set 及其所有内容,要走生命周期删除语义,不能把两者混为一谈。

10. 装配选择与产品路径

在 Part Design 命令里,选择一个面通常可以较快转到 feature 或 BRep。装配命令更复杂:用户选中的可能是“某个实例路径下的某个零件面”。

推荐习惯:

  • CATPathElementAgent 获取选择路径,而不是只取叶子对象。
  • 从路径中识别 active product、instance product 和 leaf geometry。
  • 创建约束时,用 leaf geometry 作为 CATILinkableObject,用 instance product 作为 iInstanceComponent,用当前装配层级作为 iActiveComponent
  • 如果约束应基于 publication,优先通过 CATIPrdObjectPublisher 找到 published object,再创建 connector。

可以把选择链理解成:

CATPathElement
  -> Product occurrence path
  -> Leaf geometry / feature
  -> CATILinkableObject
  -> Connector
  -> Constraint

如果只保存 CATBaseUnknown_var spSelected = agent-&gt;GetElementValue();,后面很可能知道“选了什么面”,但不知道“这是哪个产品实例里的面”。

11. 装配设置与 Drafting 属性

装配模块还有一些全局设置接口,适合做工具命令、批处理或环境检查。

11.1 General Setting

CATAsmGeneralSettingServices 可取得 CATIAsmGeneralSettingAtt 控制器,常见能力包括:

方法 作用
GetAutoUpdateMode() / SetAutoUpdateMode() 自动更新模式
GetAutoSwitchToDesignMode() / SetAutoSwitchToDesignMode() 自动切换到 Design mode
GetComputeExactUpdateStatus() / SetComputeExactUpdateStatus() 精确更新状态相关设置

11.2 Constraint Setting

CATAsmConstraintSettingServices 可取得 CATIAsmConstraintSettingAtt 控制器,常见能力包括:

方法 作用
GetConstraintCreationMode() / SetConstraintCreationMode() 约束创建模式
GetQuickConstraintMode() / SetQuickConstraintMode() 快速约束模式
GetQuickConstraintOrderedList() / SetQuickConstraintOrderedList() 快速约束优先顺序

11.3 Drafting Properties

CATIProdDraftingProperties 用于控制产品在工程图中的投影/剖切等行为:

方法 作用
GetCutStatus() / SetCutStatus() 是否参与剖切
GetUseStatus() / SetUseStatus() 工程图使用状态
GetHiddenLineMode() / SetHiddenLineMode() 隐藏线模式

这些接口不属于创建装配树的主流程,但在企业定制规范、工程图自动化和装配检查命令中很常见。

12. PDM/PLM 与影响管理接口

ProductStructureInterfaces 下的 C++ 接口更多面向 PDM/PLM、外部化和影响传播,不是每个装配命令都会用到,但一旦涉及重命名、替换、引用文档状态,就很重要。

接口 作用
CATIPrdReferenceDocStatus 查询 reference 文档状态、外部化 reference
CATIPrdHandleImpactsOnInstance 处理实例重命名对 session 中关联对象的影响
CATIPrdHandleImpactsOnReference 处理 publication 重命名等 reference 级影响
CATIPrdTransactionalEventMgt 批量移动时开启/结束事务,减少中间事件和刷新
CATICustoIconProduct 定制产品图标显示

这类接口通常和企业 PDM 集成、链接重连、批量结构调整有关。普通创建约束或遍历装配树时,不要过早引入这些复杂接口。

13. 常见开发任务与接口组合

13.1 遍历装配树并读取属性

CATDocumentServices / CATInit
  -> CATIProduct(root)
  -> GetChildren / GetAllChildren
  -> CATIPrdProperties

适合 BOM 检查、命名规范检查、统计产品结构。

13.2 插入本地子产品并定位

CATIProduct::AddProduct("PartNumber")
  -> GetReferenceProduct
  -> CATIMovable::SetPosition

适合创建临时装配结构、局部装配模板、内部 reference。

13.3 移动已有组件

CATIProduct(instance)
  -> CATIMovable
  -> CATMathTransformation
  -> SetPosition / ApplyTransformation

先确认对象是 instance,再确认 context。

13.4 基于选择创建约束

CATPathElementAgent
  -> instance product + leaf geometry
  -> GetProductConnector
  -> CreateConstraint
  -> CATICst
  -> CATAsmConstraintServices::RefreshConstraint

这是装配交互命令最常见的链路。

13.5 整理约束到 Constraint Set

CATAsmConstraintSetServices::GetRootSet
  -> AddNewSetChild
  -> CATIAsmCstSetFeature::MoveConstraintsFrom

适合自动创建约束后,按模块、功能或工艺阶段整理到不同 set。

13.6 用 Publication 提高引用稳定性

CATIPrdObjectPublisher::Publish
  -> Valuate
  -> GetFinalObject
  -> GetProductConnector(searchType=2)
  -> CreateConstraint

适合跨零件、跨子装配或未来可能替换组件的场景。

14. 编译依赖线索

装配二开模块的 IdentityCardImakefile.mk 需要按实际接口补依赖。常见 framework prerequisites 包括:

使用内容 常见 prerequisite
文档、Session、根对象 ObjectModelerBase
产品结构、位置、属性、发布 ProductStructure
装配连接器、约束、约束集 CATAssemblyInterfaces
约束对象 CATICst ConstraintModelerInterfaces
自由度分析 ConstraintModeler
约束数值参数 KnowledgeInterfaces
约束类型枚举、机械几何对象 MecModInterfaces
连接器、规格对象、生命周期 ObjectSpecsModeler / ObjectSpecsLegacy
矩阵变换 Mathematics

LINK_WITH 中常见模块名会随接口和安装级别略有差异,但经常会出现:

LINK_WITH = $(WIZARD_LINK_MODULES) \
            CATObjectModelerBase \
            CATObjectSpecsModeler \
            CATProductStructure1 \
            CATAssemblyInterfaces \
            CATConstraintModelerItf \
            CATConstraintModeler \
            KnowledgeItf \
            CATMecModInterfaces \
            CATMathematics

不要机械这段。更稳妥的做法是:

  1. 先根据 include 的头文件确认所属 framework。
  2. IdentityCard 中补 framework prerequisite。
  3. 在模块 Imakefile.mkLINK_WITH 中补实际链接模块。
  4. mkmk -u 刷新 build-time data,再编译。
  5. 对未解析外部符号,用 mkmk -showcmd 和符号所属模块反查,而不是盲目加库。

15. 常见误区

15.1 把 Automation 接口当成 C++ 接口

CATIAProduct.idlCATIAProducts.idlCATIAAssemblyFeatures.idl 这类文件是 Automation 层入口。CAA C++ 命令中优先使用 CATIProductCATIMovableCATIPrdObjectPublisherGetProductConnectorCreateConstraintCATICst 等原生接口。

15.2 混淆 reference 和 instance

  • GetPartNumber() 是 reference 语义。
  • GetPrdInstanceName() 是 instance 语义。
  • CATIMovable 通常应该在 instance 上取。
  • CATAsmConstraintServices::ListConstraints() 要求 reference product。
  • AddProduct(reference) 返回的是新 instance。

15.3 只保存几何对象,不保存产品上下文

装配约束需要知道几何来自哪个产品实例。交互选择时应保留 CATPathElement 或从路径中提取 instance product。只保存 leaf geometry 会导致 connector 创建失败或约束建到错误上下文。

15.4 在 Visualization 模式下访问精确几何

大装配默认可能只加载 CGR 或轻量表示。访问 BRep、创建精确约束前,应确认目标产品是否已经切到 WM_BREPWM_DESIGN

15.5 使用旧约束集 factory

CATIAsmCstSetFeatFactory 已经标注 deprecated。新代码优先用 CATAsmConstraintSetServices::GetRootSet()CATAsmConstraintSetServices::AddNewSetChild()

15.6 删除约束方式不统一

如果只是删除 reference constraint,优先考虑 CATAsmConstraintServices::RemoveConstraint()。直接走 LifeCycleObject::remove() 前要确认对象类型、上下文和 undo/redo 影响。

15.7 以为 AddProduct() 会导入外部文档

CATIProduct::AddProduct(reference) 面向同文档 reference 实例化。外部 CATPart/CATProduct 的导入、保存和 session 文档管理,需要额外的 Product Structure 导入服务或项目封装。

16. 推荐记忆图

最后可以把装配 CAA API 记成四条线:

结构线:CATDocumentServices -> CATIProduct -> CATIPrdProperties
位置线:CATIProduct(instance) -> CATIMovable -> CATMathTransformation
引用线:CATIPrdObjectPublisher -> published object -> CATILinkableObject
约束线:CATILinkableObject + instance product -> CATIConnector -> CATICst

实际项目中,最常用的组合不是单个接口,而是一组上下文完整的接口链。只要始终区分 reference、instance、active component 和 leaf geometry,装配二开的大多数 API 调用就不会跑偏。

评论