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 目录下。实际上,Assembly 和 CATAssemblyUI 更多是实现/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,不如让零件或子产品发布一个语义明确的对象,例如 MountPlane、Axis1、HoleCenter。
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->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. 编译依赖线索
装配二开模块的 IdentityCard 和 Imakefile.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
不要机械这段。更稳妥的做法是:
- 先根据 include 的头文件确认所属 framework。
- 在
IdentityCard中补 framework prerequisite。 - 在模块
Imakefile.mk的LINK_WITH中补实际链接模块。 - 用
mkmk -u刷新 build-time data,再编译。 - 对未解析外部符号,用
mkmk -showcmd和符号所属模块反查,而不是盲目加库。
15. 常见误区
15.1 把 Automation 接口当成 C++ 接口
CATIAProduct.idl、CATIAProducts.idl、CATIAAssemblyFeatures.idl 这类文件是 Automation 层入口。CAA C++ 命令中优先使用 CATIProduct、CATIMovable、CATIPrdObjectPublisher、GetProductConnector、CreateConstraint、CATICst 等原生接口。
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_BREP 或 WM_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 调用就不会跑偏。
评论