← 返回首页

CATIA V5 CAA CGM 模块常用接口介绍

CATIA V5 CAA CGM 模块常用接口介绍

图片

CGM 和 Part Design 最大的区别是:CGM 不是规格树 feature API。CATIPadCATIEdgeFilletCATIGSMExtrude 这类接口面对的是 CATIA 特征;CATBodyCATFaceCATEdgeCATGeoFactoryCATICGMTopOperator 面对的是几何内核对象。前者能进入 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() 建立,同时带有 CATSideLeftCATSideRightCATSideFull 等物质侧信息。

这也是 CGM 比高层 feature API 难的地方:面、边、点不是孤立对象。一个边界方向错了,可能导致法向反、实体内外颠倒、split 选侧错误或 boolean 结果异常。

4.3 CATTopology 的遍历

CATBodyCATCell 等拓扑对象都属于 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

AdvancedTopologicalOpeAdvancedTopologicalOpeLight 提供高级曲面能力:

需求 典型入口
拓扑填充 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 用户选择和下游引用使用的上下文表示

典型做法:

  1. 在 feature 的 build/update 逻辑中取得输入 feature 的结果 body。
  2. 用 CGM operator 计算新的 CATBody
  3. 把结果 body 设置为当前 feature 的结果,而不是让业务命令直接长期持有裸 CATBody
  4. 通过 journal 或 BRep 访问接口维护输入拓扑到输出拓扑的映射。
  5. 更新失败时释放临时 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,还需要加入 ObjectModelerBaseObjectSpecsModelerMecModInterfacesPartInterfacesCATGSMUseItf 等上层 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 才会成为可靠的几何内核工具,而不是调不完的黑盒

评论