CATIA V5 CAA CGM 模块常用接口介绍
- 作者: CATIA开发者指南
- 发布时间: 2026年7月6日 22:25
- 原文链接: https://mp.weixin.qq.com/s?__biz=MzkxNTQ0MTY0NQ==&mid=2247486586&idx=1&sn=cb3e7aadeb251d1dc23d9f16ab944e86&chksm=c15e5ef8f629d7eed45b1dfa1fa43d863fddd6c984ffa7d5f2d53c8c4fc472354e5268459ace&cur_album_id=2800898825187262468&scene=190#rd
前面几篇文章分别讨论了 Part Design、Assembly、Drafting、DMU 和交互命令。本文换到更底层的一层:CGM(Convergence Geometric Modeler)模块。很多 CAA 开发最终都会碰到 CGM:从选中面/边后解析 BRep,到做布尔、分割、投影、相交、偏移、圆角、封闭、质量属性、网格化,再到把结果封装回 Part Feature,底层都离不开 CGM 的几何和拓扑对象
CGM 和 Part Design 最大的区别是:CGM 不是规格树 feature API。CATIPad、CATIEdgeFillet、CATIGSMExtrude 这类接口面对的是 CATIA 特征;CATBody、CATFace、CATEdge、CATGeoFactory、CATICGMTopOperator 面对的是几何内核对象。前者能进入 Part 文档、参与更新链和参数化;后者更像一次几何算法计算中的精确 BRep 数据。实际项目中经常是两层配合:UI 和数据持久化放在 Feature 层,复杂几何计算放在 CGM 层。
可以先建立一条主线:
CGM Container / CATGeoFactory
-> Geometry:point、curve、surface、NURBS、law、cloud 等
-> Topology:CATBody
-> CATDomain:lump、shell、wire、loop 等连通边界域
-> CATCell:volume、face、edge、vertex
-> Operators:geometric operator / topological operator
-> Run()
-> GetResult()
-> Remove unused result
一句话概括:
GeometricObjects 管几何对象和工厂,GMModelInterfaces 管 BRep 拓扑模型,GMOperatorsInterfaces 管统一 operator 接口,TopologicalOperators/Light/AdvancedTopologicalOpe 管具体拓扑算法。
1. Framework 分布总览
在 B28 接口库中,CGM 相关接口分布较散,但可以按职责划分:
| Framework | 典型接口/头文件 | 作用 |
|---|---|---|
| GeometricObjects | CATGeoFactory 、CATICGMContainer、CATICGMObject、CATICGMOperator、CATPoint、CATCurve、CATSurface、CATNurbsCurve、CATNurbsSurface |
CGM 容器、几何工厂、基础几何对象、operator 基类 |
| GMModelInterfaces | CATBody 、CATTopology、CATCell、CATFace、CATEdge、CATVertex、CATDomain、CATTopData、CATICGMTopOperator |
BRep 拓扑模型、拓扑 operator 基类、拓扑操作参数 |
| GeometricOperators | CATCreateIntersection 、CATCreateProjection、CATCreateDistanceMin*、CATCreateInclusion*、CATCreateLocalAnalysis* |
曲线/曲面级几何计算,不一定生成完整拓扑体 |
| TopologicalOperatorsLight | CATCreateTopBoolean 、CATCreateTopSplit、CATCreateTopTrim、CATCreateTopBoundary、CATHybSplit、CATHybTrim 等 |
轻量拓扑操作:布尔、分割、修剪、投影、边界、混合体操作 |
| TopologicalOperators | CATTopPrism 、CATTopRevol、CATDynBoolean、CATDynFillet、CATSolidCuboid、CATSolidCylinder、CATBodyChecker |
体造型、动态拓扑操作、实体 primitive、检查工具 |
| BasicTopologicalOpe | CATTopPointOperator 、CATTopLineOperator、CATTopCurveOperator、CATTopSplineOperator、CATTopHelixOperator |
点、线、曲线、样条等基础拓扑生成操作 |
| AdvancedTopologicalOpe / AdvancedTopologicalOpeLight |
CATTopologicalBlend 、CATTopologicalFill、CATFrFTopologicalSweep、CATThickenOp、CATSkinExtrapolation |
高级曲面、填充、扫掠、倒圆过渡、加厚、外插等 |
| AdvancedMathematics / Mathematics |
CATMathPoint 、CATMathVector、CATMathPlane、CATMathTransformation、CATMathFunctionX |
数学对象、函数、变换和参数域,作为 CGM 算法输入 |
不要把这些 framework 简单理解成“建模功能菜单”的划分。CGM 的粒度更底层:同一个用户命令中的 Split、Trim、Boolean 可能分别使用 Hybrid operator、Topological operator 和几何相交 operator。
2. CGM 容器与工厂
2.1 CATGeoFactory 与 CATICGMContainer
CATGeoFactory 是 CGM 对象的主工厂。它创建几何对象,也创建拓扑体:
| 方法/宏 | 作用 |
|---|---|
| CreateBody() / CATGeoCreateBody(factory) |
创建 CATBody |
| CreatePoint*() | 创建点或依附在曲线/曲面上的点 |
| CreateLine() 、CreateCircle()、CreatePlane() |
创建解析曲线/曲面 |
| CreateNurbsCurve() 、CreateNurbsSurface() |
创建 NURBS 曲线/曲面 |
| Next(current, type) | 遍历 explicit CGM 对象 |
CATGeoFactory 继承/实现容器语义,实际删除对象时应通过 CATICGMContainer::Remove(),不要直接 delete CGM 对象:
CATICGMContainer_var spContainer = spGeoFactory;
spContainer->Remove(pResultBody, CATICGMContainer::RemoveDependancies);
RemoveDependancies 通常比默认的 KeepDependancies 更适合业务代码,因为它会清理不再被引用的 implicit 对象。需要注意:只删除自己创建并拥有的对象,不要删除参考平面等系统对象。
2.2 explicit 与 implicit 对象
CGM 容器里既有 explicit object,也有 implicit object。简单理解:
| 类型 | 说明 |
|---|---|
| explicit object | 由应用显式创建、可遍历、可作为业务结果持有的对象 |
| implicit object | 为支撑拓扑、参数曲线、依附关系、内部计算而产生的对象 |
例如一个 CATFace 背后可能有 CATSurface,边在面上的限制可能还有 CATPCurve。删除一个 Body 时如果依赖对象不再被引用,RemoveDependancies 可以帮你减少内存泄露和悬挂对象风险。
3. 几何对象层:Point、Curve、Surface
CGM 的几何对象由 CATGeometry 派生,常见类型包括:
| 类型族 | 典型类 | 说明 |
|---|---|---|
| 点 | CATPoint 、CATCartesianPoint、CATPointOnCurve、CATPointOnSurface、CATPointOnEdgeCurve |
绝对点或依附在曲线/曲面/边曲线上的点 |
| 曲线 | CATCurve 、CATLine、CATCircle、CATEllipse、CATNurbsCurve、CATSplineCurve、CATEdgeCurve |
3D 曲线、解析曲线、NURBS、拓扑边使用的边曲线 |
| 参数曲线 | CATPCurve 、CATPCircle、CATPLine、CATTrimmedPCurve |
曲面参数域中的 2D 曲线,常用于 edge-on-face 限制 |
| 曲面 | CATSurface 、CATPlane、CATCylinder、CATCone、CATSphere、CATTorus、CATNurbsSurface、CATOffsetSurface |
面的底层曲面或独立曲面对象 |
| 函数/规律 | CATLaw 、CATConstantLaw、CATLinearLaw、CATSplineLaw |
扫掠、变半径、渐变类算法中的 law 输入 |
几何对象本身不等同于拓扑。一个 CATPlane 只是无限平面;一个平面片需要 CATFace 加上边界环来限制。一个 CATCircle 是几何曲线;如果要作为 BRep 的一条边,还需要 CATEdge、端点 CATVertex、边在面上的参数曲线等拓扑关系。
4. 拓扑对象层:CATBody、CATDomain、CATCell
4.1 CATBody 是 cell-complex
CATBody 是 CGM 中最核心的拓扑对象。它不是简单的“实体”,而是一个 cell-complex:可以表示实体、壳、线框、点集,也可以表示非流形、非连通、混合维度拓扑。
CATBody 中最重要的三个概念:
| 概念 | 典型类 | 说明 |
|---|---|---|
| Body | CATBody | 拓扑体,拥有 cells 和 domains |
| Cell | CATVolume 、CATFace、CATEdge、CATVertex |
0 到 3 维拓扑单元 |
| Domain | CATLump 、CATShell、CATWire、CATLoop、CATVertexInFace、CATVertexInVolume |
同维连通 cell 集合,表达边界关系 |
CATBody 既是拓扑体,也是其内部 cell/domain 的工厂:
| 方法 | 作用 |
|---|---|
| CreateVolume() | 创建 3D cell |
| CreateFace() | 创建 2D cell |
| CreateEdge() | 创建 1D cell |
| CreateVertex() | 创建 0D cell |
| CreateLump() | 创建 volume domain |
| CreateShell(location) | 创建 face domain |
| CreateWire() | 创建 edge domain |
| CreateDomain(lowDim, highDim, location) | 创建通用 domain |
4.2 Cell 的维度、方向与物质侧
CATCell 表示一个有维度、有方向、有边界的拓扑单元:
| Cell | 维度 | 底层几何 |
|---|---|---|
| CATVertex | 0 | CATMacroPoint 或点相关几何 |
| CATEdge | 1 | CATEdgeCurve |
| CATFace | 2 | CATSurface |
| CATVolume | 3 | 3D space,不通过 SetGeometry() 设置 |
CATCell::SetGeometry() 用于把 cell 关联到几何对象,并指定 cell 相对几何的方向。边界关系通过 AddBoundingCell() 建立,同时带有 CATSideLeft、CATSideRight、CATSideFull 等物质侧信息。
这也是 CGM 比高层 feature API 难的地方:面、边、点不是孤立对象。一个边界方向错了,可能导致法向反、实体内外颠倒、split 选侧错误或 boolean 结果异常。
4.3 CATTopology 的遍历
CATBody、CATCell 等拓扑对象都属于 CATTopology 体系。常用遍历接口:
| 方法 | 作用 |
|---|---|
| GetAllCells(list, -1) | 获取所有维度 cell |
| GetAllCells(list, 0) | 获取所有顶点 |
| GetAllCells(list, 1) | 获取所有边 |
| GetAllCells(list, 2) | 获取所有面 |
| GetAllCells(list, 3) | 获取所有体 |
| GetCellNumbers() | 获取 vertex/edge/face/volume 数量 |
| GetAllDomains(lowDim, highDim, list) | 获取指定维度关系的 domain |
典型检查代码可以先统计 cell 数量,再根据业务筛选面或边:
int nbVertices = 0;
int nbEdges = 0;
int nbFaces = 0;
int nbVolumes = 0;
pBody->GetCellNumbers(&nbVertices, &nbEdges, &nbFaces, &nbVolumes);
CATLISTP(CATCell) faces;
pBody->GetAllCells(faces, 2);
5. Operator 统一使用模型
5.1 CATICGMOperator
CGM 算法基本遵循统一框架:
CreateXxx(...) -> SetXxx(...) -> Run() -> GetResult()/GetOutput() -> Release()
CATICGMOperator 是所有 CGM operator 的基类,公开约定非常明确:
| 方法 | 作用 |
|---|---|
| Run() | 执行算法 |
| GetFactory() | 获取输出对象所在 factory |
| GetOperatorId() / SetOperatorId() |
获取或设置 operator 标识 |
| Release() | 使用后释放 operator,本类析构受保护,不能直接 delete |
典型骨架:
CATICGMOperator *pOper = CATCreateXxx(...);
if (NULL != pOper)
{
constint rc = pOper->Run();
if (0 == rc)
{
// Read result here.
}
pOper->Release();
}
具体 operator 的返回码和错误处理要看对应头文件说明。有些 operator 失败时会抛 CATError,有些可以通过 failsafe 或 diagnosis 获取部分结果。
5.2 CATICGMTopOperator
拓扑 operator 继承自 CATICGMTopOperator。它有一个非常重要的约定:输入 body 不被直接修改,operator 会生成新的 result body,必要时与输入共享数据。
常用方法:
| 方法 | 作用 |
|---|---|
| GetResult() | 获取结果 CATBody |
| GetResult(journal) | 获取结果并填充 journal |
| SetFreezeMode() / GetFreezeMode() |
控制结果 body 是否冻结 |
| GetJournal() | 获取创建 operator 时绑定的 journal |
| SetFailsafeMode() | 尝试让支持该能力的 operator 在失败时返回部分结果 |
| GetFailsafeDiagnosis() | 获取 failsafe 诊断信息 |
典型骨架:
CATTopData topData(pConfig, pJournal);
CATICGMTopOperator *pTopOper = CATCGMCreateTopXxx(pFactory, &topData, pInputBody);
if (NULL != pTopOper)
{
pTopOper->Run();
CATBody *pResult = pTopOper->GetResult();
// Keep pResult only if it must become a feature result or feed another operation.
pTopOper->Release();
}
如果不保留 pResult,应通过 CATICGMContainer::Remove() 清理。GetResult() 取得的是 factory 中的对象,不是普通堆对象。
5.3 CATTopData、Configuration 与 Journal
大多数拓扑操作需要 CATTopData:
CATTopData topData(pSoftwareConfiguration, pJournalList);
| 对象 | 作用 |
|---|---|
| CATSoftwareConfiguration | 指定算法配置,是 CATTopData 必需输入 |
| CATCGMJournalList | 记录拓扑映射:Keep、Creation、Deletion、Subdivision 等 |
| CATTopData | 把 configuration 和 journal 传给拓扑 operator |
Journal 在工程化场景非常重要。例如你做 split 或 fillet 后,想知道原来的某个面变成了哪些新面,不能只靠几何位置猜测,应该优先看 journal 中的映射关系。高层特征更新、BRep 重选、下游引用维护都依赖类似机制。
6. 常见 CGM 算法族
6.1 几何计算:相交、投影、距离、包含
几何计算通常位于 GeometricOperators,处理曲线/曲面/点之间的数学关系:
| 需求 | 典型入口 |
|---|---|
| 曲线-曲线、曲线-曲面、曲面-曲面相交 | CATCreateIntersection 、CATICGMIntersectionCrvCrv、CATICGMIntersectionCrvSur、CATICGMIntersectionSurSur |
| 点投影到曲线/曲面、曲线投影到曲面 | CATCreateProjection 、CATICGMProjectionPtCrv、CATICGMProjectionPtSur、CATICGMProjectionCrvSur |
| 最小距离 | CATCreateDistanceMinCrvCrv 、CATCreateDistanceMinPtCrv、CATCreateDistanceMinPtSur |
| 点在曲线/曲面内外判断 | CATCreateInclusionPtCrv 、CATCreateInclusionPtSur |
| 曲线/曲面局部分析 | CATCreateLocalAnalysisD 、CATICGMLocalAnalysis1D、CATICGMLocalAnalysis2D |
这类 operator 不一定返回 CATBody,可能返回点、参数、距离、交线、诊断信息等。写代码时要按具体接口读取 output,不要套用 CATICGMTopOperator::GetResult() 的模式。
6.2 拓扑生成:点、线、曲线、拉伸、旋转、primitive
基础拓扑生成通常用于把几何对象包装成可参与 BRep 运算的 body:
| 需求 | 典型入口 |
|---|---|
| 点/线/曲线拓扑体 | CATTopPointOperator 、CATTopLineOperator、CATTopCurveOperator、CATTopSplineOperator |
| 螺旋线、测地线 | CATTopHelixOperator 、CATTopGeodesicLineOperator、CATTopGeodesicPtPt |
| 拉伸/旋转 | CATTopPrism 、CATTopRevol、CATTopExtrude |
| 实体 primitive | CATSolidCuboid 、CATSolidCylinder、CATSolidSphere、CATSolidTorus、CATSolidPyramid |
如果目标是创建用户可编辑的 Pad、Shaft 或 Cylinder 特征,优先使用 Part/GSM feature 工厂;如果目标是一次算法中构造临时 cutter body、support body 或计算体,CGM operator 更合适。
6.3 Hybrid 与拓扑布尔:Split、Trim、Boolean、Boundary
TopologicalOperatorsLight 提供大量 hybrid/topological 操作入口:
| 需求 | 典型入口 |
|---|---|
| Boolean | CATCreateTopBoolean 、CATHybBoolean |
| Split | CATCreateTopSplit 、CATCreateTopSplitOnSupport、CATHybSplit |
| Trim | CATCreateTopTrim 、CATCreateTopTrimOnSupport、CATHybTrim |
| Assemble | CATCreateTopAssemble 、CATHybAssemble |
| Boundary | CATCreateTopBoundary 、CATHybBoundary |
| Project / LayDown / Disconnect | CATCreateTopProject 、CATCreateTopLayDown、CATCreateTopDisconnect |
这些 operator 对输入 body 的结构通常有明确要求。以 split shell 为例,头文件说明中会要求被切 body 只包含一个 shell domain,切割 body 只包含一个 shell 或 wire domain。不要把任意 PartBody 直接丢进去碰运气,先检查 domain/cell 结构。
6.4 圆角、倒角、拔模、壳、厚度与动态操作
TopologicalOperators 中有一组 CATDyn* operator:
| 需求 | 典型入口 |
|---|---|
| 动态布尔 | CATDynBoolean |
| 动态圆角 | CATDynFillet |
| 动态倒角 | CATDynChamfer |
| 动态拔模 | CATDynDraft |
| 动态抽壳 | CATDynShell |
| 动态加厚/分割/变换 | CATDynThickness 、CATDynSplit、CATDynTransformation |
| 质量属性 | CATDynMassProperties3D 、CATICGMDynMassProperties1D |
这类接口更接近 Part Design 修饰特征背后的算法能力,但仍然不是 feature 本身。它们适合封装在自定义 feature 的 build/update 逻辑里,作为结果体计算的一部分。
6.5 高级曲面:Fill、Blend、Sweep、Thicken、Extrapolate
AdvancedTopologicalOpe 和 AdvancedTopologicalOpeLight 提供高级曲面能力:
| 需求 | 典型入口 |
|---|---|
| 拓扑填充 | CATTopologicalFill 、CATCGMCreateTopologicalFillOp、CATICGMTopologicalFill |
| 曲面/拓扑 blend | CATTopologicalBlend 、CATTopologicalBlendCurve、CATTopologicalFilletBlend |
| 自由形式拓扑扫掠 | CATFrFTopologicalSweep 、CATCGMCreateFrFTopologicalSweep |
| 加厚 | CATThickenOp 、CATICGMThickenOp、CATICGMThickPlus、CATICGMThickSurfacePlus |
| 外插与延伸 | CATSkinExtrapolation 、CATICGMSkinExtrapolation、CATExtrapolateBody |
| 匹配与优化 | CATTopologicalMatch 、CATGeometrySizeOptimization |
这些 operator 对边界连续性、方向、支撑面、参数域和容差非常敏感。工程中建议先用最小输入体做可重复测试,再接入复杂业务模型。
7. CGM 与 Part/GSM Feature 的关系
很多二开问题卡在“我已经有 CATBody,怎么让用户在 Part 里看到并编辑它”。需要区分三件事:
| 层级 | 对象 | 生命周期 |
|---|---|---|
| CGM 几何/拓扑结果 | CATBody 、CATFace、CATEdge |
属于 CGM factory/container,通常是 transient 或 feature build 结果 |
| Mechanical/GSM feature | CATISpecObject 、CATIGeometricalElement、自定义 feature implementation |
属于 Part 规格树,参与更新和持久化 |
| 可视化/选择对象 | BRep path、CATPathElement、CATIBRepAccess、CATIMfBRep | 用户选择和下游引用使用的上下文表示 |
典型做法:
- 在 feature 的 build/update 逻辑中取得输入 feature 的结果 body。
- 用 CGM operator 计算新的
CATBody。 - 把结果 body 设置为当前 feature 的结果,而不是让业务命令直接长期持有裸
CATBody。 - 通过 journal 或 BRep 访问接口维护输入拓扑到输出拓扑的映射。
- 更新失败时释放临时 body/operator,避免 factory 中残留对象。
如果只是创建普通 Pad、Pocket、Split、Join、Fill 等用户可编辑特征,优先使用 PartInterfaces 或 CATGSMUseItf。只有在高层接口无法表达算法、需要自定义特征结果、需要批量几何分析或需要操作临时拓扑体时,才直接下探到 CGM。
8. BRep 选择与 CGM 拓扑
交互命令中用户选中一个面/边时,通常拿到的是选择路径或机械 BRep 访问对象,而不是可以随意修改的 CATFace*。常见链路是:
CATPathElement / Selection
-> Mechanical feature context
-> CATIBRepAccess / CATIMfBRep
-> underlying CGM topology when needed
实际开发要注意:
| 场景 | 建议 |
|---|---|
| 只需要创建 Part/GSM 特征引用 | 保留 feature/path/BRep access,不要提前拆成裸 CGM 指针 |
| 需要几何算法计算 | 在算法局部取得 CATBody/CATCell,计算后尽快封装结果 |
| 装配上下文选择 | 必须保留产品实例路径,单独的 CGM face 不包含装配位姿 |
| 需要更新后追踪拓扑 | 使用 journal、featurization 或稳定的 BRep 引用机制 |
裸 CATFace*、CATEdge* 的稳定性通常不如 feature/path 引用。更新以后原 face 可能被分裂、删除或替换,如果没有 journal 或拓扑命名机制,下游引用很容易失效。
9. 容差、方向与检查
CGM 问题里最常见的三类隐患是容差、方向和非法拓扑。
9.1 容差
曲线相交、曲面相交、split/trim/boolean 都依赖模型容差。症状包括:
- 明明视觉上相交,operator 返回无交;
- split 结果丢面或多出微小边;
- boolean 后出现针尖面、小缝隙或非流形边;
- fill/blend 在边界附近失败。
处理建议:
| 问题 | 做法 |
|---|---|
| 输入几何尺度差异巨大 | 先检查模型单位、尺寸范围和 tolerance |
| cutter 没有完全切穿 | 使用支持 extrapolation 的 split/trim 模式 |
| 交线不稳定 | 先做几何相交诊断,再做拓扑 split |
| 微小边/短边导致失败 | 结合 clean/simplify/heal 类 operator 预处理 |
9.2 方向
方向包括:
- edge 自身方向;
- face 相对 surface 的方向;
- shell 内外方向;
- split/trim 中 positive/negative side 的选择;
- volume 中 face normal 指向内侧还是外侧。
不要把显示法向、曲面自然法向和实体外法向混为一谈。CATCell 中的 orientation 和 side 信息才是拓扑算法真正使用的语义。
9.3 检查与诊断
常用诊断入口包括:
| 工具 | 作用 |
|---|---|
| CATBodyChecker | 检查 body 拓扑/几何合法性 |
| CATICGMTopOperator::SetFailsafeMode() | 对支持的 operator 尝试返回部分结果 |
| GetFailsafeDiagnosis() | 获取 failsafe 诊断列表 |
| CATCGMJournalList | 分析操作前后拓扑变化 |
| GetCellNumbers() / GetAllCells() |
快速确认结果维度和 cell 数量 |
调 CGM 时不要只看屏幕显示。先统计结果 body 的 volume/face/edge/vertex 数量,再检查 domain 结构和 journal,通常比肉眼看模型可靠。
10. Imakefile 链接建议
不同 operator 所在 framework 不同,LINK_WITH 要按实际头文件来源补齐。常见组合:
LINK_WITH = \
JS0GROUP \
CATMathematics \
CATGeometricObjects \
CATGMModelInterfaces \
CATGeometricOperators \
CATTopologicalOperatorsLight \
CATTopologicalOperators \
CATBasicTopologicalOpe \
CATAdvancedTopologicalOpe
具体库名需要结合 B28 安装中的 module/IdentityCard 和编译报错调整。原则是:include 来自哪个 framework 的 PublicInterfaces,通常就要确认对应 runtime module 是否在 prerequisite 或 LINK_WITH 中。
如果同时封装成 Part/GSM feature,还需要加入 ObjectModelerBase、ObjectSpecsModeler、MecModInterfaces、PartInterfaces、CATGSMUseItf 等上层 framework。
11. 典型开发流程
11.1 临时计算型
适合距离分析、相交分析、临时 cutter、批处理检查:
取得 CGM factory/config
-> 创建或取得输入 geometry/body
-> 创建 operator
-> 设置参数
-> Run
-> 读取结果/诊断
-> 删除不保留的 result body
-> Release operator
11.2 自定义特征 build 型
适合公司自定义造型特征:
Feature inputs
-> 解析输入 feature 的当前 result body
-> 准备 CATTopData + journal
-> 用 CGM operator 计算 result body
-> 将 result body 交给 feature 结果机制
-> 保存输入/输出拓扑映射
-> 失败时清理临时 CGM 对象并报告诊断
11.3 交互命令型
适合用户选择面/边后执行算法:
CATFeatureAgent / CATPathElementAgent
-> 保留 selection path 和 mechanical context
-> 必要时从 BRep access 取得 CGM topology
-> operator 计算
-> 创建高层 feature 或展示临时预览
-> 不把裸 CGM 指针长期存在 command 成员中
12. 常见坑
| 问题 | 说明 | 建议 |
|---|---|---|
| 把 CATBody 当 PartBody feature | CATBody 是 CGM 拓扑对象,不是规格树节点 |
需要持久化时封装到 feature 结果中 |
| 直接 delete CGM 对象 | CGM 对象由 container/factory 管理 | 使用 CATICGMContainer::Remove() 或 operator Release() |
| 忘记释放 operator | operator 析构受保护 | 用完调用 Release() |
| 输入 body 被误以为会原地修改 | 拓扑 operator 通常生成新 result body | 用 GetResult() 获取新 body,按需删除旧临时对象 |
| 忽略 journal | 更新后拓扑会分裂/替换 | 用 CATCGMJournalList 追踪 Keep/Creation/Deletion/Subdivision |
| 不检查 domain 结构 | 很多 split/trim 要求单 shell、单 wire 等输入 | 操作前用 GetAllDomains()/GetAllCells() 检查 |
| 混淆曲面和面 | CATSurface 无限或未裁剪,CATFace 才有边界 |
需要参与 BRep 运算时构造成 face/body |
| 忽略装配上下文 | CGM 拓扑本身不带产品实例位姿 | 装配选择保留 CATPathElement 和产品路径 |
| 只看显示结果 | 显示正常不代表拓扑合法 | 用 checker、cell 统计、journal 诊断 |
13. 该从哪一层接口开始
可以按下面规则选型:
| 需求 | 优先接口层 |
|---|---|
| 创建用户可编辑的 Pad/Pocket/Fillet/Shell | PartInterfaces |
| 创建 Join/Split/Fill/Extract/Extrude 等 GSD 特征 | CATGSMUseItf |
| 自定义 feature 的底层结果计算 | CGM operator |
| 批量几何检查、距离、相交、投影 | GeometricOperators / CGM |
| 临时 cutter body、拓扑布尔、split/trim | TopologicalOperatorsLight / TopologicalOperators |
| 高级曲面算法、fill/blend/sweep/thicken | AdvancedTopologicalOpe |
| 用户选择面边并建立稳定引用 | CATFeatureAgent + CATIBRepAccess / CATIMfBRep |
最终经验是:能用高层 feature API 表达的业务,就不要急着下探 CGM;必须下探 CGM 时,要把对象生命周期、容差、方向、journal 和结果封装一起设计。CGM 很强,但它不替你管理规格树语义,也不自动维护用户引用。把这条边界想清楚,CGM 才会成为可靠的几何内核工具,而不是调不完的黑盒
评论