CATIA V5 CAA 零件设计常用接口介绍
作者:CATIA开发者指南
发布时间:2026年6月17日 21:05
原文链接:https://mp.weixin.qq.com/s?__biz=MzkxNTQ0MTY0NQ==&mid=2247486527&idx=1&sn=c71e0277b77c7ecc6fc90803e9310ed4&chksm=c15e5ebdf629d7ab4ff6b6d561530abad1337e33631a54830ea597bfd148cf065a7fa24c81bd&cur_album_id=2800898825187262468&scene=189#wechat_redirect
前面几篇文章已经分别讨论了自定义特征、命令/工作台接入、交互状态机和常用代理机。本文换一个更贴近业务的角度:在零件设计(Part Design)模块做二次开发时,经常需要打交道的是哪些接口?它们分别负责什么能力?写命令时应该怎么找到正确的接口?
在 CAA 的 Part Design 开发中,大部分操作都不是直接修改几何数据,而是通过接口操纵 feature。一个 Pad 是一个 feature,一个 Fillet 也是一个 feature;PartBody 是一个容器,GeometricalSet 是另一个容器;选择 BRep 边、面、顶点时,拿到的是拓扑访问接口。理解这些接口的分类和层级,可以大幅降低查文档和试错的时间。
可以先建立一条主线:
Part 容器 -> Body/GeometricalSet 容器 -> Feature(草图、修饰、变换特征等)
-> Sketch(2D/3D 草图)
-> BRep 访问(面、边、顶点)
1. 接口分布总览
Part Design 相关的核心接口主要分布在三个 framework 中:
| Framework | 典型内容 | 作用 |
|---|---|---|
| PartInterfaces | CATIPad、CATIPocket、CATIFillet、CATIChamfer、CATIShaft、CATIPrtPattern 等 | 具体造型特征的 C++ 原生接口,提供特征参数读写能力 |
| MecModInterfaces | CATIPrtPart、CATIPrtContainer、CATIMechanicalTool、CATIMfBRep、CATIBRepAccess、CATIGeometricalElement 等 | 零件容器、MechanicalTool/Body、BRep 拓扑访问、几何元素等基础设施接口 |
| MechanicalModelerUI | CATFeatureAgent、CATFeatureImportAgent 等 | 机械建模 UI 侧的选择代理机和交互工具 |
此外,草图相关接口在 SketcherInterfaces,GSM 线框/曲面工厂在 CATGSMUseItf,这两者在 Part Design 命令中也经常配合使用。
2. 零件容器与 Body 体系
2.1 零件根容器:CATIPrtPart、CATIPrtContainer 与 CATIPartRequest
CATIPrtPart 是零件根 feature(MechanicalPart)的原生接口。通过 CATIPrtContainer 可以从文档 spec container 拿到它:
CATIPrtContainer_var spPrtContainer = spSpecContainer;
CATISpecObject_var spPartSpec = spPrtContainer->GetPart();
CATIPrtPart_var spPrtPart = spPartSpec;
CATIPrtPart 提供对 Part 内核心结构的访问:
| 方法 | 作用 |
|---|---|
| GetMainTool() | 获取主 Body(PartBody),返回 CATIBasicTool_var |
| GetCurrentTool() | 获取当前激活的 Body/GeometricalSet |
| GetFeatureSolid() | 获取 PartBody 的 result feature |
| GetCurrentFeature() | 获取当前工作对象 |
| SetCurrentFeature() | 设置当前工作对象(等价于 Define In Work Object) |
| GetReferencePlanes() | 获取 XY/YZ/ZX 三个参考平面 |
CATIPartRequest 负责遍历 Part 下的所有 Body 和 GeometricalSet:
| 方法 | 作用 |
|---|---|
| GetSolidBodies() | 获取 Part 级别下所有根 Body(MechanicalTool) |
| GetSurfBodies() | 获取所有根级几何图形集(含 OGS 和 GS) |
| GetMainBody() | 获取主 Body(PartBody) |
2.2 Body 与 GeometricalSet
在原生 CAA 中,Body 和 GeometricalSet 是两种不同的 MechanicalTool/GSMTool startup feature。核心区别:
| Startup | 对应接口 | 说明 |
|---|---|---|
| MechanicalTool | CATIMechanicalTool | PartBody 或用户创建的 Body,可聚合实体特征 |
| GSMTool (type=0) | CATIMmiNonOrderedGeometricalSet | GeometricalSet,可聚合线框/曲面/GSM 特征 |
| GSMTool (type=1) | CATIMmiOrderedGeometricalSet | OrderedGeometricalSet,特征有序,吸附规则更严格 |
| 通用鉴别 | CATIMmiGeometricalSet | GS/OGS 的共同基接口,Body 不实现此接口 |
创建新 Body 和 GeometricalSet 通过 CATIMechanicalRootFactory:
CATIMechanicalRootFactory_var spRootFactory = spSpecContainer;
// 创建新 Body(MechanicalTool)
CATIMechanicalTool_var spNewBody = spRootFactory->CreatePRTTool("MyBody");
// 创建 GeometricalSet
CATISpecObject_var spGS = spRootFactory->CreateGeometricalSet("MyGS");
// 创建 OrderedGeometricalSet
CATISpecObject_var spOGS = spRootFactory->CreateOrderedGeometricalSet("MyOGS");
当前工作对象切换的典型写法:
CATIPrtPart_var spPrtPart = spPartSpec;
spPrtPart->SetCurrentFeature(spNewBody); // 后续创建的特征进入此 Body
2.3 特征容器归属
创建特征时,工厂默认将特征放入 GetCurrentTool() 对应的容器。如果需要精确控制插入位置,可先切换当前工具或使用特定工厂重载:
CATIPrtFactory_var spPrtFactory = spPrtPart;
// 特征自动进入当前激活的 Body/GS
CATISpecObject_var spPad = spPrtFactory->CreatePad(spSketch);
一句话:
CATIPrtContainer 拿 Part,CATIPrtPart 管当前工具,CATIMechanicalRootFactory 创建容器,CATIPartRequest 遍历容器。
3. 草图体系
3.1 草图本身
草图是 Part Design 中绝大多数成形特征的前提输入。常用接口:
| 接口 | 作用 |
|---|---|
| CATISketch | 草图核心接口,提供几何元素创建、约束、求解等能力 |
| CATI2DWFFactory | 2D 线框工厂,在草图中创建点、线、圆、样条等 |
| CATISketchFactory | 草图级别的工厂,管理草图打开/关闭/求解 |
典型获取草图并创建几何的写法:
CATISketch_var spSketch = spSketchFeature;
CATI2DWFFactory_var sp2DFactory = spSketch;
sp2DFactory->CreateLine(pt1, pt2);
spSketch->CloseEdition();
3.2 草图与特征的关联
在原生 CAA 中,草图与成形特征的关联是双向的。以 CATIPrism(Pad/Pocket 的基接口)为例:
// 从特征获取其剖面草图
CATIPrism_var spPrism = spPad;
CATISpecObject_var spSketchFeature;
spPrism->GetProfile(&spSketchFeature);
// 替换特征的剖面草图
spPrism->ModifyProfile(spNewSketch);
CATIPrism::ModifyProfile() 和 GetProfile() 是原生接口中管理草图关联的标准方式。Rib/Slot 等通过各自的 CATIRib/CATISlot 接口提供类似的 Profile/CenterCurve 读写方法。
草图特征在规格树中是特征的子节点,但逻辑上它独立存在,可以被多个特征引用。
4. 草图基成形特征(Sketch-Based Features)
这是 Part Design 中最核心的特征族,均通过 CATIPrtFactory 创建,返回 CATISpecObject_var。
4.1 拉伸类
| 接口 | 继承自 | 特征 | 关键参数 |
|---|---|---|---|
| CATIPad | CATIPrism | 凸台 | 限制类型、长度、方向、镜像拉伸 |
| CATIPocket | CATIPrism | 凹槽 | 同 Pad,方向为材料去除 |
| CATIShaft | CATIPrism | 旋转体 | 旋转角度、方向 |
| CATIGroove | CATIPrism | 旋转槽 | 同 Shaft,方向为材料去除 |
| CATIRib | CATIShape | 筋 | 中心曲线、剖面、轮廓控制方式 |
| CATISlot | CATIShape | 开槽 | 同 Rib,方向为材料去除 |
CATIPrism 是 Pad/Pocket/Shaft/Groove 的基接口,提供:
| 方法 | 作用 |
|---|---|
| ModifyProfile(sketch) | 设置剖面草图 |
| ModifySym(int) | 设置对称拉伸 |
| ModifyDirection(dir) | 设置拉伸方向 |
| GetProfile(sketch) | 获取剖面草图 |
Pad 典型用法:
CATIPrtFactory_var spPrtFactory = spPrtPart;
CATISpecObject_var spPad = spPrtFactory->CreatePad(spSketch);
CATIPrism_var spPrism = spPad;
spPrism->ModifyDirection(dir);
spPrism->ModifySym(1);
// 更新 Part
CATIPrtPart_var spPrtPart = spPartSpec;
spPrtPart->Update();
4.2 扫描类
| 接口 | 特征 | 说明 |
|---|---|---|
| CATISweep | 扫掠 | 显式扫掠(轮廓 + 引导线) |
| CATIPrism | 棱柱(Pad/Pocket) | 沿单一方向拉伸闭合轮廓 |
| CATIRib | 筋 | 轮廓沿中心曲线扫掠 |
4.3 多截面、筋与加厚
| 创建方式 | 特征 | 说明 |
|---|---|---|
| CATIPrtFactory::CreateLoft() | 多截面实体 | 返回 CATISpecObject,多个截面 + 引导线 |
| CATIPrtFactory::CreateRemovedLoft() | 移除多截面实体 | 材料去除版 |
| CATIPrtFactory::CreateStiffener(sketch) | 加强筋 | 返回 CATIStiffener 接口可读写参数 |
| CATIPrtFactory::CreateRib(sketch, centerCrv) | 筋 | 返回 CATIRib 接口 |
4.4 草图特征通用接口继承链
所有草图成形特征共享以下 C++ 原生继承链:
CATBaseUnknown
-> CATISpecObject // 规格对象通用能力
-> CATIShape // 形状通用能力(SetDefaultValue、BuildShape 等)
-> CATIPrism // 拉伸基类(ModifyProfile、ModifyDirection)
-> CATIPad / CATIPocket
-> CATIShaft / CATIGroove
-> CATIRib / CATISlot / CATIStiffener / CATISweep
5. 修饰特征(Dress-Up Features)
修饰特征不创建新的整体形状,而是对已有实体进行局部修改。
| 接口 | 继承自 | 特征 | 关键参数 |
|---|---|---|---|
| CATIFillet | CATIShape | 倒圆角基类 | 修剪支撑面、过渡角、分模线 |
| CATIEdgeFillet | CATIFillet | 边倒圆角 | ModifyRadius()、ModifyRadiusOnVertex()、ModifyPropagation() |
| CATIFaceFillet | CATIFillet | 面倒圆角 | 两个面组 + 半径 |
| CATITritangentFillet | CATIFillet | 三切线倒圆角 | 两个面 + 一个移除面 |
| CATIChamfer | CATIShape | 倒角 | ModifyLength1()、ModifyLength2()、ModifyPropagation() |
| CATIDraft | CATIShape | 拔模 | ModifyAngle()、ModifyNeutral()、AddSupportToDraft() |
| CATIShell | CATIShape | 抽壳 | ModifyIntOffset()、ModifyExtOffset()、AddFaceToRemove() |
| CATIThick | CATIShape | 加厚 | 选择面 + 偏移方向 |
| CATIThread | CATIShape | 螺纹 | 圆柱面 + 标准参数 |
创建 EdgeFillet 的典型写法:
CATIPrtFactory_var spPrtFactory = spPrtPart;
// CreateSolidFillet 创建实体边倒圆角
CATLISTV(CATISpecObject_var) listEdges;
listEdges.Append(spEdge);
CATISpecObject_var spFillet = spPrtFactory->CreateSolidFillet(
&listEdges, TANGENCY, 5.0);
// 调整参数
CATIEdgeFillet_var spEdgeFillet = spFillet;
spEdgeFillet->ModifyPropagation(MINIMAL);
CATIPrtPart_var spPrtPart = spPartSpec;
spPrtPart->Update();
一句话选型:
局部修改用 Dress-Up 特征,新建形状用 Sketch-Based 特征,面操作用 Surface-Based 特征。
6. 变换特征(Transformation Features)
变换特征对已有实体进行空间变换。原生 C++ 接口中,以下特征有独立的 CATI* 头文件:
| 接口 | 继承自 | 特征 | 关键方法 |
|---|---|---|---|
| CATIMirror | CATIShape | 镜像 | ModifyMirrorPlane()、AddMirrorObject()、SetDesignIntent() |
镜像的典型写法:
CATIPrtFactory_var spPrtFactory = spPrtPart;
CATISpecObject_var spMirror = spPrtFactory->CreateMirror(spFeature, spPlane);
CATIMirror_var spMirrorIntf = spMirror;
spMirrorIntf->AddMirrorObject(spAnotherFeature);
CATIPrtPart_var spPrtPart = spPartSpec;
spPrtPart->Update();
7. 阵列特征(Pattern Features)
| 接口 | 继承自 | 特征 | 关键方法 |
|---|---|---|---|
| CATIPrtPattern | CATIShape | 阵列基类 | GetItem()、GetItemList()、GetTransfo() |
| CATIRectPatt | CATIPrtPattern | 矩形阵列 | GetStep1()、GetStep2()、GetNb1()、GetNb2() |
| CATICircPatt | CATIPrtPattern | 圆周阵列 | GetDir()、GetPto()、GetNbr()、GetNba() |
| CATIUserPatt | CATIPrtPattern | 用户阵列 | 自定义位置点 |
典型圆周阵列写法:
CATIPrtFactory_var spPrtFactory = spPrtPart;
CATISpecObject_var spPattern = spPrtFactory->CreateCircPattern(
spFeatureToRepeat, spAxis, 6, 60.0, 1, 10.0);
CATICircPatt_var spCircPatt = spPattern;
int nbr = spCircPatt->GetNbr();
int nba = spCircPatt->GetNba();
8. 布尔运算(Boolean Operations)
布尔运算通过 CATIPrtBooleanFactory 创建,返回的布尔运算 feature 可通过 CATIPrtBooleanOperation 接口查询运算信息:
| 工厂方法 | 运算类型 | 说明 |
|---|---|---|
| CreateAssemble(iFirst, iSecond) | Assemble | 保留材料侧信息,有极性感知 |
| CreateAdd(iFirst, iSecond) | Add | 无条件合并 |
| CreateRemove(iFirst, iSecond) | Remove | 从目标 Body 减去工具 Body |
| CreateIntersect(iFirst, iSecond) | Intersect | 保留两个 Body 的交集 |
此外 CATIPrtTrimFactory 提供 Trim 运算(CreateUnionTrim / CreateRemoveTrim)。
CATIPrtBooleanOperation 的常用查询方法:
| 方法 | 作用 |
|---|---|
| GetTool() | 返回被操作的工具 Body |
| GetFirstOperand() | 返回第一运算体的 CATBody |
| GetSecondOperand() | 返回第二运算体的 CATBody |
典型流程:
// 1. 创建独立工具 Body
CATIMechanicalRootFactory_var spRootFactory = spSpecContainer;
CATIMechanicalTool_var spToolBody = spRootFactory->CreatePRTTool("ToolBody");
// 2. 设为当前,在其中创建特征
CATIPrtPart_var spPrtPart = spPartSpec;
spPrtPart->SetCurrentFeature(spToolBody);
CATIPrtFactory_var spPrtFactory = spPrtPart;
spPrtFactory->CreatePad(spSketch);
// 3. 切回目标 Body,执行布尔运算
spPrtPart->SetCurrentFeature(spTargetBody);
CATIPrtBooleanFactory_var spBoolFactory = spPrtPart;
CATISpecObject_var spBoolOp = spBoolFactory->CreateRemove(spTargetBody, spToolBody);
spPrtPart->Update();
执行布尔运算后,工具 Body 会被吸收到目标 Body 中,在规格树中显示为 Assemble.1、Add.1、Remove.1 等节点。
9. 曲面基特征(Surface-Based Features)
这类特征将曲面几何转换为实体:
| 接口 | 继承自 | 特征 | 说明 |
|---|---|---|---|
| CATISplit | CATISuSplit | 分割 | 用曲面切割实体,SetExtrapolationType() 控制传播模式 |
| CATISewing | CATIShape | 缝合 | 将多个曲面缝合为实体 |
| CATIClose | CATIShape | 封闭曲面 | 将封闭曲面转为实体 |
Split 典型写法:
CATIPrtFactory_var spPrtFactory = spPrtPart;
CATISpecObject_var spSplit = spPrtFactory->CreateSplit(spBody, spSplitSurface);
CATISplit_var spSplitIntf = spSplit;
CATPrtExtrapolationType mode = CATPrtExtrapolation_Tangent;
spSplitIntf->SetExtrapolationType(mode);
10. 零件工厂:CATIPrtFactory
CATIPrtFactory 是 Part Design 开发中最常用的原生工厂接口,几乎所有特征都通过它创建。通过 CATIPrtPart 获取:
CATIPrtFactory_var spPrtFactory = spPrtPart;
常用工厂方法速查(均返回 CATISpecObject_var):
| 方法 | 创建的特征 | 对应原生接口 |
|---|---|---|
| CreatePad(sketch) | 凸台 | CATIPad → CATIPrism |
| CreatePocket(sketch) | 凹槽 | CATIPocket → CATIPrism |
| CreateShaft(sketch) | 旋转体 | CATIShaft → CATIPrism |
| CreateGroove(sketch) | 旋转槽 | CATIGroove → CATIPrism |
| CreateRib(sketch, centerCrv) | 筋 | CATIRib |
| CreateSlot(sketch, centerCrv) | 开槽 | CATISlot |
| CreateStiffener(sketch) | 加强筋 | CATIStiffener |
| CreateLoft() | 多截面实体 | CATISpecObject |
| CreateSolidFillet(edges, propMode, radius) | 实体边倒圆角 | CATIEdgeFillet |
| CreateSolidFillet(rsur1, rsur2, removeRsur) | 三切线倒圆角 | CATITritangentFillet |
| CreateChamfer(…) | 倒角 | CATIChamfer |
| CreateDraft(…) | 拔模 | CATIDraft |
| CreateShell(faces, intOff, extOff) | 抽壳 | CATIShell |
| CreateHole(support, direction) | 孔 | CATINewHole |
| CreateMirror(feature, plane) | 镜像 | CATIMirror |
| CreateRectPattern(…) | 矩形阵列 | CATIRectPatt |
| CreateCircPattern(…) | 圆周阵列 | CATICircPatt |
| CreateSplit(body, surface) | 分割 | CATISplit |
| CreateThickSurface(surface, offset) | 加厚曲面 | CATISpecObject |
特征默认放入 CATIPrtPart::GetCurrentTool() 对应的当前容器中。可通过 SetCurrentFeature() 切换后再创建。
11. BRep 访问体系
在 Part Design 命令中,用户经常选择面、边、顶点。程序拿到选择路径后,需要通过 BRep 访问接口来理解选到的到底是什么。
| 接口 | 访问哪种拓扑 | 典型来源 |
|---|---|---|
| CATIMfBRep | BRep feature 的主入口 | feature 的 QueryInterface(IID_CATIMfBRep) |
| CATIBRepAccess | 单个 BRep 子元素(面、边、顶点) | 选择路径的 leaf |
| CATIMfFsur / CATIRSur | Face(面) | CATIBRepAccess 的子对象 |
| CATIMfRedge / CATIREdge | Edge(边) | CATIBRepAccess 的子对象 |
| CATIMfFvertex / CATIFVertex | Vertex(顶点) | CATIBRepAccess 的子对象 |
典型选择后的解析链路:
CATPathElement *pPathElem = _selectionAgent->GetValue();
CATBaseUnknown *pLeaf = NULL;
pPathElem->GetFinalLeaf(&pLeaf);
CATIBRepAccess_var spBRepAccess = pLeaf;
if (!!spBRepAccess)
{
CATIMfFsur_var spFace = spBRepAccess;
if (!!spFace)
{
// 用户选中的是一个面
}
}
CATIMfBRep 是读取和写入 BRep 几何数据的主要接口:
CATIMfBRep_var spMfBRep = spFeature;
CATLISTV(CATIBRepAccess) listResult;
spMfBRep->GetResults(CATIBRepAccess::ClassId(), listResult);
12. 机械特征通用接口
除了具体特征接口,还有一些横跨所有机械特征的通用接口:
| 接口 | 作用 |
|---|---|
| CATIMechanicalFeature | 机械特征的基接口,提供 Parent/Children 遍历 |
| CATIShape | 形状通用能力 |
| CATIShapeFeatureBody | 获取形状特征的 result body |
| CATIShapeFeatureProperties | 形状特征属性查询 |
| CATIMechanicalProperties | 材质、密度、惯性等物理属性 |
| CATIFeaturize | 将 BRep 子元素转为可引用的 feature |
其中 CATIMechanicalFeature 常用于特征树遍历:
CATIMechanicalFeature_var spMechFeat = spFeature;
CATLISTV(CATISpecObject) children;
spMechFeat->GetAllChildren(children);
13. 开发速查路线
以下是根据典型开发场景整理的接口查找路线(全部使用原生 C++ 接口):
场景:创建草图拉伸特征
-> CATIPrtContainer::GetPart() (拿到 Part feature)
-> CATIPrtPart::GetCurrentTool() (确认当前容器)
-> CATIPrtFactory (创建工厂)
-> CATISketch (获取/创建草图)
-> CATI2DWFFactory (在草图中画线)
-> CATIPrtFactory::CreatePad(sketch) (创建凸台)
-> CATIPrism::ModifyDirection() (调整拉伸方向参数)
-> CATIPrtPart::Update() (更新)
场景:创建边倒圆角
-> CATPathElementAgent (选择边)
-> CATIBRepAccess / CATIMfRedge (解析选择结果)
-> CATIPrtFactory::CreateSolidFillet(&edges, TANGENCY, 5.0)
-> CATIEdgeFillet::ModifyRadius() (修改半径)
-> CATIPrtPart::Update()
场景:遍历 Part 中所有 Body
-> CATIPartRequest::GetSolidBodies() (遍历根 Body)
-> CATIMechanicalFeature::GetAllChildren() (遍历每个 Body 内的特征)
场景:布尔运算
-> CATIMechanicalRootFactory::CreatePRTTool("ToolBody")
-> CATIPrtPart::SetCurrentFeature(toolBody)
-> CATIPrtFactory::CreatePad(...)
-> CATIPrtPart::SetCurrentFeature(targetBody)
-> CATIPrtBooleanFactory::CreateRemove(target, tool)
-> CATIPrtPart::Update()
14. 小结
Part Design 二次开发的原生 C++ 接口虽然数量多,但结构清晰。把握几条主线就能快速定位:
- 容器线:
CATIPrtContainer→CATIPrtPart→CATIMechanicalTool/CATIMmiGeometricalSet→CATIMechanicalRootFactory(创建) /CATIPartRequest(遍历) - 工厂线:
CATIPrtFactory(创建特征)、CATIPrtBooleanFactory(布尔运算)、CATIPrtTrimFactory(Trim 运算) - 特征线:
- 选择线:
CATPathElementAgent→CATIBRepAccess→CATIMfFsur/CATIMfRedge/CATIMfFvertex - 通用线:
CATIMechanicalFeature(遍历)、CATISpecObject(统一引用)、CATIMfBRep(BRep 读写)、CATIShape(形状基类)
实际开发中,建议先把 PartInterfaces 和 MecModInterfaces 的 PublicInterfaces 目录浏览一遍,结合本文的分类表格,遇到陌生接口时能快速判断它属于哪一层的哪个场景。
评论