CATIA V6 CAA零件模块二次开发常用接口库介绍
作者:CATIA开发者指南
发布时间:2026年6月23日 11:05
原文链接:https://mp.weixin.qq.com/s?__biz=MzkxNTQ0MTY0NQ==&mid=2247486551&idx=1&sn=e6026644b2b4c74739c6aa23769a9313&chksm=c15e5ed5f629d7c3dfe60c45bd091c1d18133128b4a846a822285be7064d2ba1ddb2c66b3472&cur_album_id=2800898825187262468&scene=189#wechat_redirect
本文目的把 V6 零件模块二次开发最常遇到的接口库分层讲清楚:从 3D Shape 里取得 MechanicalPart,管理 Body / GS / OGS,创建 Sketch、Pad、Pocket、Hole、Fillet、Boolean、GSM 线框曲面,再处理 BRep、参数、更新、删除和自定义特征扩展。
1. 先说结论
V6 零件模块二开不要一上来就找某个“Part 对象万能接口”。更稳的路线是按职责拆开:
- 用
CATMecModUseItf/CATMecModLiveUseItf找到MechanicalPart、Body、GS、OGS 和 BRep。 - 用
CATSketcherUseItf创建或编辑 Sketch,作为 Pad / Pocket / Shaft / Rib / Slot 的 profile。 - 用
CATPartUseItf里的CATIPdgUsePrtFactory和一组CATIPdgUse*接口创建、读取、修改 Part Design 特征。 - 用
CATGSMUseItf创建线框和曲面特征,并明确插入到 GS / OGS / Body。 - 用
KnowledgeInterfaces处理长度、角度、半径等参数对象。 - 用
DataCommonProtocolUse和CATIMmiUseUpdateError做更新、删除和失败诊断。 - 如果要给零件追加业务语义,不要硬改 OOTB Part schema,优先走
FeatureModelerExt的自定义 feature 或 feature extension。
可以把它理解成一句话:
V6 零件开发的主线是“MechanicalPart 定位上下文,PartUse 创建实体特征,MecMod 管结构和 BRep,GSM 管线框曲面,DataCommonProtocol 管生命周期”。
2. 先把核心对象关系说清楚
V6 的零件模块通常围绕 3D Shape 中的 MechanicalPart 展开。规格树上看到的 Part、PartBody、Body、Geometrical Set、Ordered Geometrical Set,在 CAA 侧不是一个接口能全部解决。
3D Shape / Representation
-> Specification Container: CATPrtCont
-> MechanicalPart: Part
-> MechanicalTool: PartBody / Body
-> Sketch
-> Pad / Pocket / Hole / Fillet / Boolean / Pattern / Split ...
-> GSMTool: Geometrical Set / Ordered Geometrical Set
-> Point / Line / Plane / Curve / Surface / GSM operation ...
-> BRep selecting objects: RSur / REdge / FVertex ...
这里最容易混淆的是:
MechanicalPart是零件模块的根业务对象。MechanicalTool对应实体 Body,例如PartBody和用户 Body。GSMTool对应线框/曲面容器,包括 GS 和 OGS。CATIPdgUse*创建的是 Part Design 特征,不负责解释整个 Part 结构。CATIMmiUseBRep*管的是稳定选择对象和 generic naming,不建议直接拿裸拓扑当业务引用。
3. V6 相比旧式写法的关键变化
在当前 B426 头文件中,零件模块大量接口已经是 Use 风格命名,例如:
CATIPdgUsePrtFactoryCATIPdgUsePrismCATIPdgUseEdgeFilletCATIMmiUsePrtPartCATIMmiUseSetFactoryCATIGSMUseFactoryCATISktUseSketchFactory
因此写 V6 零件二开时,建议先确认目标 framework 的 V6 UseItf 接口,而不是直接照搬 V5 示例里的旧接口名。
另一个重要变化是更新边界。B426 的 CATIMmiUsePrtPart 主要负责 In Work Object、参考平面、当前 set 等管理,并不像很多旧示例那样把 Update() 当成默认入口。V6 下更应结合:
DataCommonProtocolServices::IsUpToDate()DataCommonProtocolServices::Update()CATIUpdateProviderCATIMmiUseUpdateError- 自定义 feature 的
CATIFmFeatureBehaviorCustomization::Build()
不要假设每个 Part 入口都有传统 Part.Update() 语义。
4. 常用接口库总览
| 需求 | Framework | 常用接口 |
|---|---|---|
| 取得 MechanicalPart、几何容器 | CATMecModUseItf | CATIMmiPrtContainer |
| 管理 In Work Object、参考平面、当前 set | CATMecModLiveUseItf | CATIMmiUsePrtPart |
| 查询 Body / GS / OGS | CATMecModLiveUseItf | CATIPartRequest, CATIBodyRequest, CATIBasicTool |
| 创建 Body / GS / OGS | CATMecModUseItf | CATIMmiUseSetFactory |
| 实体特征插入和重排 | CATMecModUseItf | CATIMmiUseSolidInsertion, CATIMmiUseBasicInsertion |
| BRep 选择对象和 generic naming | CATMecModUseItf | CATIMmiUseBRepAccess, CATIMmiUseBRep, CATIMmiUseMfBRep, CATIMmiBRepFactory |
| Part Design 特征创建 | CATPartUseItf | CATIPdgUsePrtFactory |
| Pad / Pocket / Shaft / Groove 等规格 | CATPartUseItf | CATIPdgUsePrism, CATIPdgUseRevol, CATIPdgUseRib, CATIPdgUseSlot |
| Hole / Fillet / Chamfer / Shell / Draft | CATPartUseItf | CATIPdgUseNewHole, CATIPdgUseEdgeFillet, CATIPdgUseChamfer, CATIPdgUseShell, CATIPdgUseDraft |
| Body 布尔 | CATPartUseItf | CATIPdgUsePrtBooleanFactory, CATIPdgUsePrtBooleanOperation |
| Sketch 创建和编辑 | CATSketcherUseItf | CATISktUseSketchFactory, CATISktUseSketchEditor, CATISktUse2DWFFactory, CATISktUseSketchPositioning |
| GSM 线框曲面 | CATGSMUseItf | CATIGSMUseFactory, CATIGSMUseProceduralView |
| 参数、公式、尺寸值 | KnowledgeInterfaces | CATICkeParm, CATICkeParmFactory |
| 更新、删除、替换协议 | DataCommonProtocolUse | CATIUseEntity, DataCommonProtocolServices, CATIUpdateProvider, CATIReplace |
| 自定义 feature 与属性 | FeatureModelerExt | CATFmStartUpFacade, CATFmFeatureFacade, CATFmContainerFacade, CATIFmFeatureBehaviorCustomization |
5. 从 3D Shape 取得 MechanicalPart
当前 B426 中,CATMecModUseItf/PublicInterfaces/CATIMmiPrtContainer.h 明确说明:CATIMmiPrtContainer 由 3D Shape 的 specification container CATPrtCont 实现,用来取得 MechanicalPart 和几何容器。
典型链路是:
CATIMmiPrtContainer_var spPrtContainer = spSpecContainer;
if (NULL_var == spPrtContainer)
return E_FAIL;
CATIMmiMechanicalFeature_var spPart;
HRESULT hr = spPrtContainer->GetMechanicalPart(spPart);
if (FAILED(hr) || NULL_var == spPart)
return hr;
CATIMmiUsePrtPart_var spUsePart = spPart;
CATIPartRequest_var spPartRequest = spPart;
这里有几个要点:
GetMechanicalPart()取得的是规格树里的Part。- 之后通过
CATIMmiUsePrtPart管 In Work Object 和参考平面。 - 通过
CATIPartRequest查询 Body、GS、OGS。 - 如果入口来自 PLM representation reference,应先取得对应 applicative container,再转换到
CATIMmiPrtContainer。
6. 管理 In Work Object 和参考平面
CATMecModLiveUseItf/PublicInterfaces/CATIMmiUsePrtPart.h 是 MechanicalPart 上的重要接口。
常用能力包括:
| 方法 | 作用 |
|---|---|
| GetInWorkObject() | 获取当前 In Work Object |
| SetInWorkObject() | 等价于交互中的 Define In Work Object |
| GetInWorkObjectTool() | 获取当前 set,可能是 Body、GS 或 OGS |
| RetrieveReferencePlanes() | 获取 XY / YZ / ZX 三个参考平面 |
| RetrieveImportedBodies() | 获取导入 Body |
| RetrieveBodyForExternalReferences() | 获取 contextual part 的外部引用 Body |
创建特征前先确认 In Work Object 很重要。否则新特征可能进入错误 Body,或者插入顺序与用户当前规格树状态不一致。
7. 查询和创建 Body / GS / OGS
7.1 查询已有结构
CATMecModLiveUseItf/PublicInterfaces/CATIPartRequest.h 用于查询零件中的几何特征集。
常用方法:
| 方法 | 作用 |
|---|---|
| GetMainBody() | 获取唯一主 Body,也就是当前默认 PartBody |
| GetSolidBodies() | 获取根级 Body,不包含被布尔操作消费的 operated body |
| GetSurfBodies() | 获取 GS 和根级 OGS |
| GetAllBodies() | 获取 Body + GS + OGS |
| GetDirectBodies() | 获取 Part 直属的根几何特征集 |
这些方法都要求 view context。普通 3D 零件通常使用:
CATUnicodeString viewContext("MfDefault3DView");
7.2 创建新的 Body / GS / OGS
CATMecModUseItf/PublicInterfaces/CATIMmiUseSetFactory.h 是创建 MechanicalTool 和 GSMTool 的入口。
常用方法:
| 方法 | 创建对象 | 说明 |
|---|---|---|
| CreatePRTTool() | MechanicalTool | 创建 Body,只能聚合在 MechanicalPart 下 |
| CreateGeometricalSet() | GS | 可放在 Part、Body 或 GS 下,需遵守聚合规则 |
| CreateOrderedGeometricalSet() | OGS | 有顺序语义,聚合规则比 GS 更严格 |
注意两点:
- 违规创建 Body / GS / OGS 可能抛异常,不只是返回
E_FAIL。 - 创建容器和插入特征是两件事,实体特征还要关注
CATIMmiUseSolidInsertion。
8. 实体特征插入:不要只创建,不插入
CATMecModUseItf/PublicInterfaces/CATIMmiUseSolidInsertion.h 用于把 solid feature 插入 procedural body,或者重排已有 solid feature。
常用方法:
| 方法 | 作用 |
|---|---|
| InsertFeature(iDestination) | 把新 solid feature 插入 Body / Solid Body |
| ReorderFeature(iDestination) | 重排已有 solid feature |
iDestination 的含义取决于对象类型:
- 如果是 Body / Solid Body,新特征插到该 Body 的第一个位置。
- 如果是 solid feature,新特征插到该 feature 后面。
- 如果是
NULL_var,系统尝试使用当前 In Work Object。
因此推荐流程是:
- 明确目标 Body。
- 设置或确认 In Work Object。
- 创建 Part Design feature。
- 用
CATIMmiUseSolidInsertion插入到目标位置。 - 触发受控 update。
9. Sketcher 接口:大多数成形特征的输入层
Pad、Pocket、Shaft、Groove、Rib、Slot 这类特征通常依赖 Sketch。
常用接口:
| 接口 | 作用 |
|---|---|
| CATISktUseSketchFactory | 创建 Sketch |
| CATISktUseSketchEditor | 打开、关闭、求解 Sketch 编辑状态 |
| CATISktUse2DWFFactory | 创建 2D 点、线、圆、曲线等 |
| CATISktUseSketchPositioning | 管理 Sketch 支撑面、原点和方向 |
一个最小化链路是:
CATISktUseSketchFactory_var spSketchFactory = spSpecContainer;
CATIMmiMechanicalFeature_var spSketch = spSketchFactory->CreateSketch(spSupportPlane);
CATISktUseSketchEditor_var spSketchEditor = spSketch;
// 打开 sketch edition,创建 2D 几何,求解并关闭。
实战建议:
- 先定位 Sketch 的支撑面和方向,再画二维几何。
- Sketch 关闭并求解后,再交给
CATIPdgUsePrtFactory。 - 旋转类特征的 Sketch 必须包含旋转轴。
- Rib / Slot 还需要中心曲线,通常也是 Sketch 或 GSM 曲线。
10. CATIPdgUsePrtFactory:Part Design 主工厂
CATPartUseItf/PublicInterfaces/CATIPdgUsePrtFactory.h 是零件实体特征最常用的工厂接口。
它的角色是“从最少参数创建特征”,创建后再用特征自己的接口补规格。
常用创建方法可以按类型理解:
| 类别 | 方法 | 后续常用接口 |
|---|---|---|
| 拉伸成形 | CreatePad(), CreatePocket() | CATIPdgUsePrism, CATIPdgUsePad, CATIPdgUsePocket |
| 旋转成形 | CreateShaft(), CreateGroove() | CATIPdgUseRevol, CATIPdgUseShaft, CATIPdgUseGroove |
| 扫掠成形 | CreateRib(), CreateSlot() | CATIPdgUseRib, CATIPdgUseSlot, CATIPdgUseSweep |
| 多截面 | CreateLoft(), CreateRemovedLoft() | 返回 mechanical feature 后继续按规格接口处理 |
| 孔 | CreateHole() | CATIPdgUseNewHole |
| 修饰 | CreateSolidFillet(), CreateChamfer(), CreateDraft(), CreateShell() | CATIPdgUseEdgeFillet, CATIPdgUseChamfer, CATIPdgUseDraft, CATIPdgUseShell |
| 变换/阵列 | CreateMirror(), CreateRectPattern(), CreateCircPattern() | CATIPdgUseMirror, CATIPdgUsePrtPattern |
| 曲面基实体 | CreateSplit(), CreateThickSurface(), CreateCloseSurface() | CATIPdgUseSplit, CATIPdgUseThick, CATIPdgUseClose |
核心规则是:
- 工厂返回值多是
CATIMmiMechanicalFeature_var。 - 不要停留在返回值,要继续
QueryInterface到具体CATIPdgUse*接口补参数。 - 涉及面、边、顶点的输入时,通常需要 BRep feature,而不是裸
CATCell。
11. Pad / Pocket:优先理解 CATIPdgUsePrism
CATPartUseItf/PublicInterfaces/CATIPdgUsePrism.h 是 Pad 和 Pocket 的共同规格接口。
常用方法:
| 方法 | 作用 |
|---|---|
| ModifyProfile() | 设置 profile,通常是 Sketch |
| ModifyDirection() | 设置拉伸方向,可传数学方向或方向对象 |
| ReverseDirection() | 反转方向 |
| ModifySym() | 设置对称拉伸 |
| ModifyEndType() / ModifyStartType() | 设置第一/第二限制类型 |
| ModifyEndOffset() / ModifyStartOffset() | 设置 offset limit 的距离 |
| ModifyEndInit() / ModifyStartInit() | 设置 UpToPlane / UpToSurface 的限制对象 |
| GetProfile() / GetDirection() / GetEndLimit() | 读取已有规格 |
创建 Pad 的典型结构:
CATIPdgUsePrtFactory_var spPrtFactory = spPart;
CATIMmiMechanicalFeature_var spPadFeat = spPrtFactory->CreatePad(spSketch);
CATIPdgUsePrism_var spPrism = spPadFeat;
if (NULL_var != spPrism)
{
spPrism->ModifyEndType(catOffsetLimit);
spPrism->ModifyEndOffset(0.02); // 按接口语义确认单位
}
这里要特别注意:
catUpToPlaneLimit要求限制对象是 plane feature 或 planar FSur。catUpToSurfaceLimit要区分曲面 FSur 和实体 RSur。- 读取
GetEndLimit()、GetAxis()、GetProfile()这类内部组件时,可能触发懒解析或暴露已有 update 问题,巡检工具应记录读取前后的 update 状态。
12. Shaft / Groove / Rib / Slot:不要只看 profile
旋转和扫掠类特征除了 profile,还需要轴线或中心曲线。
| 特征 | 典型输入 | 说明 |
|---|---|---|
| Shaft | profile sketch + axis | 加料旋转体 |
| Groove | profile sketch + axis | 减料旋转槽 |
| Rib | profile + center curve | 沿路径加料 |
| Slot | profile + center curve | 沿路径减料 |
常用接口包括:
CATIPdgUseRevolCATIPdgUseShaftCATIPdgUseGrooveCATIPdgUseRibCATIPdgUseSlotCATIPdgUsePrtProfileCATIPdgUsePrtCenterCurve
实战建议:
- Shaft / Groove 的 Sketch 内部旋转轴必须明确。
- Rib / Slot 的 profile 和 center curve 最好分开管理,便于后续修改。
- 如果中心曲线来自 GSM 特征,要先确认它已经插入并更新。
13. Hole、Fillet、Chamfer、Shell、Draft:修饰特征的入口
这些特征通常依赖已有实体上的面、边或方向,因此更依赖 BRep 稳定性。
| 特征 | 接口 | 常见输入 |
|---|---|---|
| Hole | CATIPdgUseNewHole | 支撑面、方向、定位点、直径、深度、类型 |
| Edge Fillet | CATIPdgUseEdgeFillet | REdge / RSur 列表、半径、传播模式 |
| Chamfer | CATIPdgUseChamfer | 边或面、长度、角度、传播模式 |
| Shell | CATIPdgUseShell | 要移除的面、内外偏移 |
| Draft | CATIPdgUseDraft | 拔模面、中性面、方向、角度 |
CATPartUseItf/PublicInterfaces/CATIPdgUseEdgeFillet.h 中可以看到一个典型要求:参与倒圆的边或面应是由 BRep factory 创建的 REdge / RSur feature,并且属于同一个 mechanical body。
这类接口的通用建议是:
- 不要把交互选择返回的 UI 节点直接传给造型接口。
- 先解析成稳定 BRep feature,再调用修饰接口。
- 创建前确认目标 feature 和 BRep 属于同一个 Body。
- 变半径倒圆要先
AddObject(),再设置半径/顶点对。
14. Body 布尔:先满足前置条件
CATPartUseItf/PublicInterfaces/CATIPdgUsePrtBooleanFactory.h 管 Body 布尔。
常用方法:
| 方法 | 作用 |
|---|---|
| CreateAdd() | Add |
| CreateRemove() | Remove |
| CreateIntersect() | Intersect |
| CreateAssemble() | Assemble |
| CreateVolumicAdd() | volume add |
| CreateVolumicRemove() | volume remove |
| CreateVolumicIntersect() | volume intersect |
布尔操作的前置条件比普通特征更严格:
- 第一 Body 应设为 current body。
- 两个 Body 都应处于已更新状态。
- 第二 Body 不能与第一 Body 形成 specification loop。
- 如果第二 Body 要聚合到第一 Body 下,明确
AggregateSecondOperand的取值。
推荐流程:
创建工具 Body
-> 在工具 Body 中创建并更新工具几何
-> 切回目标 Body / 设置 In Work Object
-> 调用 CATIPdgUsePrtBooleanFactory
-> 更新并检查结果
15. BRep 接口:把“选择”变成可复用引用
Part 修饰、UpToSurface、边倒圆、倒角、抽壳等场景都离不开 BRep。V6 中建议围绕 CATMecModUseItf 的 BRep 访问接口处理。
常用接口:
| 接口 | 作用 |
|---|---|
| CATIMmiUseBRepAccess | 管理 selecting object,读取类型、有效性、初始 feature、最后 feature 等 |
| CATIMmiUseBRep | BRep feature 的通用接口 |
| CATIMmiUseMfBRep | mechanical BRep 相关访问 |
| CATIMmiBRepFactory | 创建 RSur / REdge / FVertex / PointOnEdge 等 BRep feature |
| CATIMmiUseTopoAccess | 需要时访问拓扑层信息 |
CATMecModUseItf/PublicInterfaces/CATIMmiUseBRepAccess.h 提供了 IsBRepValid()、GetBRepElementType()、GetBRepInitialFeature()、GetBRepLastFeature() 等能力。
建议封装一层自己的 BRep 服务:
HRESULT ResolveSelectedBRep(CATBaseUnknown_var iSelected,
CATIMmiUseBRepAccess_var& oBRepAccess)
{
oBRepAccess = iSelected;
if (NULL_var == oBRepAccess)
return E_INVALIDARG;
CATBoolean isValid = FALSE;
HRESULT hr = oBRepAccess->IsBRepValid(isValid);
if (FAILED(hr) || FALSE == isValid)
return E_FAIL;
return S_OK;
}
这样业务层只处理“已验证的 BRep 引用”,不会把 UI 选择、拓扑 cell 和规格 feature 混在一起。
16. GSM 线框曲面:创建后必须插入
CATGSMUseItf/PublicInterfaces/CATIGSMUseFactory.h 是 GSD/GSM 主工厂,用于创建点、线、面、圆、样条、投影、拉伸、旋转、放样、填充、偏移、分割、修剪、变换等特征。
但它有一个非常关键的规则:
CATIGSMUseFactory 创建的 feature 不会自动 aggregate。要显示在 3D 和规格树中,必须插入到 GSMTool,也就是 Body、GS 或 OGS。
推荐方式是:
- 创建 GS / OGS:用
CATIMmiUseSetFactory。 - 创建 GSM feature:用
CATIGSMUseFactory。 - 插入 procedural view:优先用
CATIGSMUseProceduralView。 - 如果插入 Body 或 OGS,要遵守线性依赖顺序。
- 插入后再 update。
这和很多实体特征的工厂体验不一样,不能只调用 CreatePoint()、CreateLine()、CreateExtrude() 就以为对象已经进入模型。
17. Knowledge 参数:单位和持久性要分清
KnowledgeInterfaces 中的 CATICkeParm 和 CATICkeParmFactory 常用于长度、角度、半径、布尔、字符串等参数。
CATICkeParmFactory.h 说明了两个常见来源:
- 从 feature container 取得 factory,创建持久参数。
- 使用 volatile factory,创建临时参数。
需要特别注意单位:
CreateLength()这类 Knowledge 参数通常按 MKS 体系处理。CreateAngle()通常是弧度语义。- 但具体 Part 接口不一定统一,例如部分 Draft 相关接口文档会明确使用 degree。
因此写工程代码时不要把“所有长度是毫米、所有角度是度”写死。应逐接口确认单位,并在自己的业务入口统一转换。
18. 更新、删除和错误诊断
V6 零件模块里,更新和删除不建议散落到各个业务函数里。推荐封装成统一生命周期服务。
18.1 更新
DataCommonProtocolServices::Update() 的语义是:
- 先调用
IsUpToDate()。 - 如果对象不是最新,才触发实际 update。
- 如果对象已是最新,返回
S_FALSE,不会调用更新代码。 - 如果失败,模型可能已经被部分修改。
因此推荐包装:
HRESULT SafeUpdate(CATIUseEntity_var spEntity)
{
if (NULL_var == spEntity)
return E_INVALIDARG;
CATBoolean upToDate = FALSE;
HRESULT hr = DataCommonProtocolServices::IsUpToDate(spEntity, upToDate);
if (FAILED(hr))
return hr;
if (TRUE == upToDate)
return S_FALSE;
return DataCommonProtocolServices::Update(spEntity);
}
18.2 删除
删除应优先走通用协议:
CATBoolean deletable = FALSE;
HRESULT hr = DataCommonProtocolServices::CanDelete(spEntity, deletable);
if (SUCCEEDED(hr) && TRUE == deletable)
hr = DataCommonProtocolServices::Delete(spEntity);
不要为了“像 UI 一样”就默认调用交互 Delete 命令。批处理和插件命令都更适合走模型协议。
18.3 错误诊断
CATIMmiUseUpdateError 可用于查询 mechanical feature 的 update error、diagnostic 和 sick features。建议在失败时记录:
- 当前 feature 名称和类型。
- 所在 Body / GS / OGS。
- 输入 profile、support、BRep、limit 对象。
- update 前后的状态。
CATIMmiUseUpdateError返回的诊断信息。
19. 自定义业务能力:不要硬塞进 OOTB Part
如果你的目标是“给零件加一棵业务节点”“给 Pad 增加企业属性”“保存检查结果”“根据零件特征生成业务报告”,不建议直接修改 OOTB Part Design feature 的内部结构。
推荐路线有两种:
19.1 自定义 base feature
适合创建独立业务对象,例如:
PartBusinessCont
PartCheckRoot
PartCheckItem
PartCheckItem
实现方式:
- 用 OSM 定义 StartUp。
- 用
CATfctEditorAssistant生成或更新 CATfct。 - 用
CATFmStartUpFacade实例化 feature。 - 用
CATFmFeatureFacade读写属性。 - 用
CATIFmFeatureBehaviorCustomization::Build()实现业务更新。 - 用导航接口把对象显示到零件规格树合适位置。
19.2 Feature extension
适合给已有 Part feature 追加属性或行为,例如给某个 Hole、Pad、Fillet 挂业务信息。
典型链路:
CATFmFeatureFacade baseFacade(*credentials, spBaseFeature);
CATFmFeatureFacade extensionFacade(*credentials);
HRESULT hr = baseFacade.AddExtension("`MyPartFeatureExtension`@`MyCatalog.CATfct`",
extensionFacade);
关键点:
- 先验证目标 OOTB feature 是否适合被 extension 扩展。
- OSM 中
Extends、Container、ContType要配置正确。 - 删除扩展时用
RemoveExtension()或通用删除协议,不要手工断内部关系。
20. 推荐的开发顺序
如果要写一个稳定的 V6 零件二开命令,建议按这个顺序推进:
- 明确入口:当前 editor、当前选择、PLM representation,还是批处理打开的 3D Shape。
- 取得 specification container 和
CATIMmiPrtContainer。 - 取得
MechanicalPart,再取得CATIMmiUsePrtPart和CATIPartRequest。 - 确认目标 Body / GS / OGS 和 In Work Object。
- 如果需要 profile,先创建或找到 Sketch。
- 通过
CATIPdgUsePrtFactory或CATIGSMUseFactory创建特征。 - 用具体接口补规格参数。
- 插入到正确 procedural body / GS / OGS。
- 执行受控 update,并读取错误诊断。
- 如需保存业务语义,用 FeatureModelerExt 自定义 feature 或 extension。
21. 常见坑
21.1 创建了 GSM feature,但规格树里看不到
原因通常是只调用了 CATIGSMUseFactory,没有把 feature 插入 GSMTool。解决方式是插入 GS / OGS / Body,推荐走 CATIGSMUseProceduralView。
21.2 Pad / Pocket 创建成功,但进了错误 Body
通常是 In Work Object 或目标 Body 没处理好。创建前先用 CATIMmiUsePrtPart::GetInWorkObject() 检查,必要时用 SetInWorkObject() 显式切换。
21.3 倒圆角、倒角、抽壳找不到对象或更新失败
常见原因是传入的不是合法 BRep feature,或者 BRep 不属于同一个 Body。先用 CATIMmiUseBRepAccess::IsBRepValid() 检查,再确认 initial feature / last feature。
21.4 布尔操作后结构树不符合预期
先确认第一 Body 是否 current body、第二 Body 是否已更新、是否产生 specification loop,以及 AggregateSecondOperand 是否符合预期。
21.5 读取 Get 接口导致模型状态变化
Part Design 中一些 Get 会触发懒解析、内部参数实体化或暴露已有 update 问题。巡检工具要记录读取前后的 update 状态,不要把所有“读取后报红”都简单归因于接口修改模型。
22. 验证清单
开发完一个零件模块能力后,至少验证下面几类数据:
- 空白 3D Shape:能否取得 MechanicalPart、主 Body 和参考平面。
- 多 Body 零件:能否正确识别 main body、root bodies、operated bodies。
- GS / OGS 混合零件:GSM feature 是否插入正确位置。
- 带 Sketch 的零件:profile 修改后 Pad / Pocket 是否稳定更新。
- 带修饰特征的零件:Fillet / Chamfer / Shell 是否能从 BRep 恢复输入对象。
- 带布尔的零件:Add / Remove / Intersect 后结构树是否符合预期。
- 失败模型:
CATIMmiUseUpdateError是否能给出可记录诊断。 - 关闭不保存场景:只读巡检是否不会留下不必要修改。
23. 最小接口记忆表
如果只记一张表,可以先记下面这些:
| 场景 | 优先接口 |
|---|---|
| 进入零件上下文 | CATIMmiPrtContainer |
| 管 Part 当前对象 | CATIMmiUsePrtPart |
| 查 Body / GS / OGS | CATIPartRequest |
| 建 Body / GS / OGS | CATIMmiUseSetFactory |
| 建 Pad / Pocket / Hole / Fillet | CATIPdgUsePrtFactory |
| 改 Pad / Pocket | CATIPdgUsePrism |
| 插入实体特征 | CATIMmiUseSolidInsertion |
| 解析选择面边点 | CATIMmiUseBRepAccess / CATIMmiBRepFactory |
| 建线框曲面 | CATIGSMUseFactory |
| 插入 GSM 特征 | CATIGSMUseProceduralView |
| 管参数 | CATICkeParm / CATICkeParmFactory |
| 更新/删除 | DataCommonProtocolServices |
| 自定义业务特征 | FeatureModelerExt |
评论