← 返回首页

CATIA V5 CAA 常用代理机总览与场景选择指南

CATIA V5 CAA 常用代理机总览与场景选择指南

作者:CATIA开发者指南
发布时间:2026年6月5日 16:56
原文链接:https://mp.weixin.qq.com/s?__biz=MzkxNTQ0MTY0NQ==&mid=2247486509&idx=1&sn=3856e9b3c13682f78850d3fe397ed0b7&chksm=c15e5eaff629d7b9f22dbb19048a3737ae3347147975650b1c8dbf1f00902970982d02739a62&cur_album_id=2800898825187262468&scene=189#wechat_redirect


CAA 里常说的“代理机”到底有哪些?它们各自处理什么输入场景?写命令时应该怎么选?

在 CAA 交互命令里,代理机通常指 CATDialogAgent 及其派生类。它们不是业务对象,也不是命令按钮本身,而是状态机中的“输入采集器”。用户点鼠标、选择对象、点击对话框按钮、切换工具栏状态、进入其它工作台编辑对象,这些交互最终都要通过某种 agent 变成状态机能识别的输出。

可以先用一句话建立概念模型:

StateCommand 负责流程,DialogState 负责阶段,Agent 负责把用户交互翻译成输入。

1. 先看继承关系

CAA 中最常用的交互代理机大致可以按下面的层次理解:

CATCommand
  -> CATDialogAgent
       -> CATAcquisitionAgent
            -> CATPathElementAgent
                 -> CATOtherDocumentAgent
                 -> CATFeatureAgent
                      -> CATFeatureImportAgent
            -> CATIndicationAgent
       -> CATCmdSwitchAgent

CATStateCommand
  -> CATEditAgent

这里有两个细节容易误会。

第一,CATStateCommand 本身也继承自 CATDialogAgent,所以一个 state command 在某些高级场景中也可以作为另一个 state command 的 agent 使用。CATEditAgent 就是这类设计。

第二,安装目录里还有一些名字带 Agent 的接口或工具类,例如 CATISamImageAgentCATMSHSelectionTrapAgentCATISIMAgent 等。它们属于特定业务 framework,不是 DialogEngine 通用状态机代理机。本文重点讲 CAA 交互命令中最常用、最值得掌握的 agent。

2. 快速选择表

如果只想快速选型,可以先看这张表:

交互场景 推荐代理机 输出值
接收对话框按钮、控件通知、普通 notification CATDialogAgent notification valuation
选择 3D/2D 视图区或规格树中的对象 CATPathElementAgent CATPathElement 或 CATSO
在屏幕上点一个位置 CATIndicationAgent CATMathPoint2D
在其它已经打开的非活动文档中选择对象 CATOtherDocumentAgent CATPathElement 或 CATSO
机械建模中选择 feature、BRep、装配上下文几何 CATFeatureAgent 选择路径、可能 featurized 的对象
机械建模中选择外部 Part 几何并导入为外部引用 CATFeatureImportAgent 导入后的选择路径
在 toolbar 上提供多个可切换值 CATCmdSwitchAgent switch valuation
在命令中临时进入另一个 workbench 编辑对象 CATEditAgent 被编辑对象路径
写自定义采集过滤、理解预选/选中状态 CATAcquisitionAgent 派生类输出

实际项目中最常用的是前三个:

  • CATPathElementAgent:选对象。
  • CATIndicationAgent:点位置。
  • CATDialogAgent:接收对话框通知。

机械建模命令里再重点掌握 CATFeatureAgentCATFeatureImportAgent。多文档命令里再掌握 CATOtherDocumentAgent

3. CATDialogAgent:所有代理机的基础

CATDialogAgent 是状态机 agent 的基类。它的核心职责是:接收某个 notifier 发出的某类 notification,并在匹配时让 agent 变为 valued。

它适合处理不需要“鼠标下对象值”的普通交互,例如:

  • 对话框 OK、Cancel、Apply、Close;
  • 自定义控件通知;
  • 某个 command 发出的特定 notification;
  • 需要通过 Accept() 手动让 agent 变为输出状态的场景。

典型写法:

_okAgent = newCATDialogAgent("OkAgentId");
_okAgent->AcceptOnNotify(_dialog, _dialog->GetDiaOKNotification());

CATDialogState *state = GetInitialState("stPanelId");
state->AddDialogAgent(_okAgent);

AddTransition(
  state,
NULL,
IsOutputSetCondition(_okAgent),
Action((ActionMethod)&MyCommand::OnOk));

如果你写的是带面板的命令,CATDialogAgent 会非常常见。按钮回调里不要直接把整个业务流程做完,更推荐让按钮通知 value 对应 agent,然后由状态机 transition 执行 action。这样流程集中在 BuildGraph 里,后期维护会轻松很多。

常用方法:

方法 作用
AcceptOnNotify 指定 agent 等待哪个 notifier 的哪类 notification
IgnoreOnNotify 取消之前设置的通知匹配
Accept 手动让 agent valued
InitializeAcquisition 清空输出,让 agent 可复用
IsOutputSet 判断 agent 是否已有输出
SetBehavior / GetBehavior 设置或读取 agent 行为

选择建议:

只关心“某个事件发生了”,不关心鼠标下是什么对象,用 CATDialogAgent。

4. CATAcquisitionAgent:采集类代理机的抽象基类

CATAcquisitionAgent 继承自 CATDialogAgent,是“采集鼠标下内容”的抽象基类。它比普通 CATDialogAgent 多了 value 的概念。

CAA 文档里明确说它不要直接实例化,应该使用它的派生类:

  • CATPathElementAgent
  • CATIndicationAgent

它真正值得理解的是 valuation state:

状态 含义
NotValuated 没有输出,也没有预输出
Transient 收到了通知,正在判断是否接受
PreValuated 预选状态,例如鼠标移动到对象上但还没点击
Valuated 已经正式选中或采集完成

这解释了为什么有时 GetValue() 会拿到“预选值”:当 agent 行为启用了 prevaluation,并且当前状态是 PreValuated 时,GetValue() 返回的是 prevalue,而不是最后正式选中的 value。

常用相关能力:

  • SetFilter:给采集结果加自定义过滤器;
  • GetValuationState:判断当前是预选还是正式选中;
  • SetValuation:程序动态赋值后,让 agent 接受这个值;
  • GetContextualMenu:右键上下文通知场景使用。

选择建议:

不要直接 new CATAcquisitionAgent。把它当成理解 PathElementAgent 和 IndicationAgent 的共同基础。

5. CATPathElementAgent:选择对象

CATPathElementAgent 是 CAA 交互命令里最常见的选择代理机。它用于从 3D/2D viewer 或规格树中选择对象,输出的是 CATPathElement

典型场景:

  • 选择一个 point、line、plane、face、edge、feature;
  • 从规格树里选择某个业务对象;
  • 支持预选高亮;
  • 支持多选;
  • 支持深度选择;
  • 从选择路径中截取第一个符合接口类型的对象。

最小写法:

_selectionAgent = newCATPathElementAgent("SelectionId");
_selectionAgent->AddElementType(IID_CATISpecObject);
_selectionAgent->SetBehavior(
  CATDlgEngWithPSOHSO |
  CATDlgEngWithPrevaluation |
  CATDlgEngRepeat |
  CATDlgEngNewHSOManager);

CATDialogState *state = GetInitialState("stSelectId");
state->AddDialogAgent(_selectionAgent);

AddTransition(
  state,
NULL,
IsOutputSetCondition(_selectionAgent),
Action((ActionMethod)&MyCommand::UseSelection));

读取单选结果:

CATPathElement *path = _selectionAgent->GetValue();
if (NULL != path && 0 != path->GetSize())
{
  CATBaseUnknown *leaf = (*path)[path->GetSize() - 1];
}

读取多选结果:

CATSO *list = _selectionAgent->GetListOfValues();

CATPathElementAgent 的类型过滤基于接口,而不是 C++ 类名。常见写法是:

_selectionAgent->AddElementType(IID_CATIxxx);

也可以设置有序类型列表:

CATListOfCATString types;
types.Append("CATITypeA");
types.Append("CATITypeB");
_selectionAgent->SetOrderedTypeList(types);

有序列表和 AddElementType 的差别很重要:

方式 查找优先级
AddElementType 先看选择路径中的对象位置,从 leaf 往 root 找第一个满足任一接口的对象
SetOrderedTypeList 先看接口顺序,对每个接口从 leaf 往 root 查找

选择建议:

只要用户要“选模型对象”,第一反应就是 CATPathElementAgent。

6. CATIndicationAgent:点屏幕位置

CATIndicationAgent 用于采集鼠标左键点击得到的 2D 点,输出是 CATMathPoint2D

典型场景:

  • 创建点;
  • 指定线的起点/终点;
  • 指定圆心;
  • 鼠标拖动或移动时做 rubber band 预览;
  • 在 3D viewer 中把屏幕点击投影到某个工作平面。

最小写法:

_pointAgent = newCATIndicationAgent("PointId");
_pointAgent->SetBehavior(CATDlgEngWithUndo);

CATDialogState *state = GetInitialState("stPointId");
state->AddDialogAgent(_pointAgent);

AddTransition(
  state,
NULL,
IsOutputSetCondition(_pointAgent),
Action((ActionMethod)&MyCommand::CreatePoint));

读取点击值:

CATMathPoint2D p2d = _pointAgent->GetValue();

在 3D viewer 中,屏幕点击本身不能直接确定一个 3D 点。CATIndicationAgent 会使用投影平面。你可以显式设置:

CATMathPlane plane(origin, normal);
_pointAgent->SetMathPlane(plane);

然后把 2D 点投影成 3D 点:

CATMathPoint2D p2d = _pointAgent->GetValue();
CATMathPlane plane = _pointAgent->GetMathPlane();

CATMathPoint p3d;
plane.EvalPoint(p2d.GetX(), p2d.GetY(), p3d);

如果没有设置投影平面,CAA 会使用一个和当前视线相关的默认平面。对简单演示可以接受,但真实建模命令里最好明确使用哪个平面,否则不同视角下用户点出来的结果可能不符合业务预期。

选择建议:

用户不是选已有对象,而是在视图区“点一个位置”,用 CATIndicationAgent。

7. CATOtherDocumentAgent:其它打开文档中的选择

CATOtherDocumentAgentCATPathElementAgent 的特殊派生类,用于在其它已经打开的非活动文档中选择对象。

典型场景:

  • 当前 Part 中创建对象,但参考另一个已打开 Part 的几何;
  • 多文档命令中需要从非活动 editor 获取选择;
  • 主命令保持在当前文档,选择动作临时代理到其它文档。

最小写法:

_otherDocAgent = newCATOtherDocumentAgent(
"OtherDocSelectionId",
"CATBasicMultiDocumentCommand",
"CATDialogEngine");

_otherDocAgent->AddElementType(IID_CATISpecObject);
_otherDocAgent->SetBehavior(CATDlgEngWithPSOHSO | CATDlgEngWithPrevaluation);

它的机制是:

主命令中的 CATOtherDocumentAgent 激活
  -> 在其它非活动文档 editor 中启动 CATMultiDocumentCommand 派生命令
  -> 用户在其它文档中选择
  -> 代理命令调用 ReturnValue / ReturnListOfValues
  -> 主命令里的 CATOtherDocumentAgent 被赋值

如果只是简单选择,可以直接使用 CATBasicMultiDocumentCommand。如果需要复杂选择逻辑,则写自己的 CATMultiDocumentCommand 派生命令。

选择建议:

用户要到另一个已经打开的文档窗口中点对象,用 CATOtherDocumentAgent。

不要把它理解成文件读取 API。它不会打开未加载文件,也不负责持久化跨文档引用。

8. CATFeatureAgent:机械建模上下文选择

CATFeatureAgent 位于 MechanicalModelerUI framework,继承自 CATPathElementAgent。它是机械建模环境中更专业的选择代理机。

它比普通 CATPathElementAgent 多处理几件事:

  • 机械 feature 选择;
  • BRep featurization;
  • 装配上下文中的选择限制;
  • 是否允许选择当前 component 外部的几何;
  • 选中 Visu mode 文档元素时自动转 Design mode;
  • tooltip 和用户选择过滤默认行为更贴近机械建模。

典型场景:

  • Part Design、GSD、机械特征命令中选择 face、edge、wire、body;
  • 需要把拓扑选择转换成可稳定引用的 BRep feature;
  • 在 Product 装配环境中限制用户只能选择当前 Part 内部几何;
  • 判断选择发生在当前 Part 还是其它 Part。

构造函数大致包含:

CATFeatureAgent(
const CATString&          iId,
  CATClassId                iType       = NULL,
  CATDlgEngBehavior         iBehavior   = NULL,
  CATMfFeaturizeMode        iMode       = 0,
const CATBaseUnknown_var& iSupport    = NULL_var,
  CATFeatureAgentBehavior   iAgBehavior = NULL);

示意:

_featureAgent = newCATFeatureAgent(
"SupportFaceId",
  IID_CATIMfBRep,
  CATDlgEngWithPSOHSO | CATDlgEngWithPrevaluation,
  MfNoFeaturization);

如果需要允许装配上下文外部选择,可以设置:

_featureAgent->SetAgentBehavior(
  MfNoFeaturization,
  NULL_var,
  CATFAgAllowSelectionInContext);

注意:featurization 不是“越多越好”。如果创建了 BRep feature,要么正确聚合保存,让系统管理它的生命周期;要么删除它。不要把临时 featurized 对象留成孤儿。

选择建议:

普通对象选择用 CATPathElementAgent;机械建模里的 face/edge/BRep/装配上下文选择,优先考虑 CATFeatureAgent。

9. CATFeatureImportAgent:机械外部引用导入选择

CATFeatureImportAgent 继承自 CATFeatureAgent,用于机械装配上下文中选择其它 Part 的几何,并把选择导入到目标 Part 中。

典型场景:

  • 当前 Part 命令要引用另一个 Part 的几何;
  • 需要创建 External References;
  • 用户在 Product 环境中选外部几何,命令希望拿到导入后的对象路径;
  • 希望保留链接,并给导入对象设置 applicative id。

文档里说得很明确:它会把另一个 Part 中选到的对象导入到由 SetActiveObjectPath 指定的 Part 中,导入对象聚合在 Part 的 External References feature 下。GetValue() 对这个 agent 返回的是选择对象路径;发生导入时,路径指向导入后的对象。

示意:

_importAgent = newCATFeatureImportAgent(
"ExternalSupportId",
  IID_CATIMfBRep,
  CATDlgEngWithPSOHSO | CATDlgEngWithPrevaluation,
  MfRelimitedFeaturization);

_importAgent->SetActiveObjectPath(targetPartPath);

如果需要标识导入来源或后续追踪机械导入,可以使用:

_importAgent->SetImportApplicativeId(myGuid);

选择建议:

只是允许选外部几何,用 CATFeatureAgent;要把外部几何导入当前 Part 形成 External Reference,用 CATFeatureImportAgent。

10. CATCmdSwitchAgent:工具栏上的多值切换代理

CATCmdSwitchAgent 用于把一个 agent 显示在 toolbar 中,每个 valuation/switch 对应一个图标。它适合处理“命令运行期间用户从工具栏切换模式”的场景。

典型场景:

  • 命令中有多个输入模式:点、线、圆;
  • 命令中有多个操作模式:添加、删除、替换;
  • toolbar 上需要显示几个 mutually exclusive 的状态;
  • 用户切换后,状态机继续留在当前命令流程中。

使用它时,不只是创建 agent,还需要让它在 toolbar 可见:

  • CATStateCommand 中创建 CATCmdSwitchAgent
  • 把 agent 加入命令的 SDO;
  • toolbar starter 使用 CATCommandHeaderWithSDOForAgent
  • 通过 CATICmdSwitchAgent 接口配置 switch。

概念示意:

_modeAgent = newCATCmdSwitchAgent("ModeAgentName", "ModeAgentResId");

// 后续通过 CATICmdSwitchAgent 添加多个 switch。
// 并通过 AddSDOElement 让 toolbar header 能看到这个 agent。

选择建议:

如果这个输入是“工具栏上的多个模式值”,而不是普通对话框按钮,用 CATCmdSwitchAgent。

一般 CAA 初学命令很少一上来就需要它。等命令界面复杂到要把状态放到 toolbar 上,再考虑。

11. CATEditAgent:在命令中进入其它 workbench 编辑对象

CATEditAgent 比普通 agent 更特殊。它本身继承自 CATStateCommand,用于在一个 state command 内部临时进入另一个 workbench 编辑某个对象。

典型场景:

  • 当前命令创建或修改一个对象,但中间需要进入 Sketcher 编辑草图;
  • 当前工作台和对象实际编辑工作台不同;
  • 命令流程暂停,让用户完成对象编辑;
  • 用户退出编辑工作台后,原命令状态图继续执行。

它的机制大致是:

原始 CATStateCommand 到达某个 state
  -> 激活 CATEditAgent
  -> CATEditAgent 调用 ElementProvider 获取要编辑的对象路径
  -> 切换到指定 workbench
  -> 用户编辑对象
  -> 用户点击 workbench exit
  -> 编辑对象放入 CSO
  -> 原命令状态图恢复

最小概念写法:

_editAgent = newCATEditAgent("EditSketchId");
_editAgent->SetElementProvider(
this,
  (CATEditAgent::ElementProvider)&MyCommand::ProvideSketchToEdit);
_editAgent->SetWorkbench("Sketcher");

CATDialogState *stEdit = AddDialogState("stEditSketchId");
stEdit->AddDialogAgent(_editAgent);

文档里有一个限制很重要:

作为另一个 state command 的 agent 使用时,CATEditAgent 必须是某个 state 中唯一的 agent。

选择建议:

需要在命令中临时进入另一个工作台编辑已有对象,用 CATEditAgent。

不要把它当成普通对象选择 agent。它处理的是“编辑会话”,不是一次点击。

12. CATCommandHeaderWithSDOForAgent 和 CATIAfrDialogForAgent

这两个名字也带 Agent,容易在搜索时看到,但它们不是状态机输入 agent。

CATCommandHeaderWithSDOForAgent 是 command header,用于让某个 dialog agent 在 toolbar 中可视化。它通常和 CATCmdSwitchAgent 配套使用。

CATIAfrDialogForAgent 是 ApplicationFrame 中用于 toolbar/dialog 表现的接口。CATCmdSwitchAgent 实现这个接口,从而能在工具栏中显示。

简单记:

CATCmdSwitchAgent 是输入代理;
CATCommandHeaderWithSDOForAgent / CATIAfrDialogForAgent 是让这个代理出现在 toolbar 上的 UI 接入机制。

13. 其它 framework 中名字带 Agent 的类

全库里还能看到一些特定业务 framework 的 agent 或接口,例如:

类/接口 所属 framework 说明
CATMSHSelectionTrapAgent AnalysisMeshingToolsItf 分析网格相关选择框/捕捉场景
CATISamImageAgent CATAnalysisVisuInterfaces 分析可视化图片 agent 接口
CATIStFeatureAndSupportAgent CAAFreeStyleItf FreeStyle 特征和支撑相关 agent 接口
CATISIMAgent SIMInterfaces Simulation 相关 agent 接口

这些不是通用 DialogEngine 教程里优先掌握的对象。遇到特定业务模块时,再按对应 framework 文档看它们的协议即可。

14. 常用 behavior 按场景理解

很多 agent 的差异不只在类名,也在 behavior。下面这些 facet 经常出现在选择代理里。

Behavior 常见 agent 场景
CATDlgEngWithPSOHSO CATPathElementAgent、CATFeatureAgent 预选/选中高亮
CATDlgEngWithPrevaluation 采集类 agent 鼠标悬停时就触发预览
CATDlgEngRepeat 多数可复用 agent 同一 agent 重复采集
CATDlgEngNewHSOManager 选择 agent 管理 HSO,让高亮更干净
CATDlgEngMultiAcquisition CATPathElementAgent 多选
CATDlgEngMultiAcquisitionCtrl CATPathElementAgent Ctrl 辅助多选
CATDlgEngWithDeepSel CATPathElementAgent 深度选择
CATDlgEngValuedFromCSO CATPathElementAgent state 激活时尝试从当前选择集取值
CATDlgEngWithUndo CATIndicationAgent 等 agent 输出参与 Undo
CATDlgEngWithContext 采集类 agent 右键上下文菜单
CATDlgEngWithDrag 采集类 agent 拖拽采集

行为设置要服务于命令设计,不要机械复制。比如:

  • 创建一个对象后命令结束,不一定需要 CATDlgEngRepeat
  • 只处理最终选择,不需要动态预览时,可以不用 CATDlgEngWithPrevaluation
  • 多选时要改用 GetListOfValues(),不能还只读 GetValue()
  • 启用 CSO 取值后,要小心命令一启动就被当前选择集触发。

15. 典型组合方式

选择一个对象后结束

_agent = newCATPathElementAgent("SelectObjectId");
_agent->AddElementType(IID_CATISpecObject);

CATDialogState *st = GetInitialState("stSelectObjectId");
st->AddDialogAgent(_agent);

AddTransition(
  st,
NULL,
IsOutputSetCondition(_agent),
Action((ActionMethod)&MyCommand::Apply));

先选对象,再点位置

stSelectSupport: CATPathElementAgent
  -> stPickPoint: CATIndicationAgent
  -> NULL

这种适合“先选支撑平面,再在平面上点一个点”。

同一阶段等待多个输入

stInput->AddDialogAgent(_lineAgent);
stInput->AddDialogAgent(_circleAgent);

AddTransition(
  stInput,
NULL,
AndCondition(
IsOutputSetCondition(_lineAgent),
IsOutputSetCondition(_circleAgent)),
Action((ActionMethod)&MyCommand::CreateObject));

适合输入顺序无关。

对话框 OK / Apply / Cancel

stPanel->AddDialogAgent(_okAgent);
stPanel->AddDialogAgent(_applyAgent);
stPanel->AddDialogAgent(_cancelAgent);

AddTransition(stPanel, NULL, IsOutputSetCondition(_okAgent),
Action((ActionMethod)&MyCommand::OnOk));

AddTransition(stPanel, stPanel, IsOutputSetCondition(_applyAgent),
Action((ActionMethod)&MyCommand::OnApply));

AddTransition(stPanel, NULL, IsOutputSetCondition(_cancelAgent),
Action((ActionMethod)&MyCommand::OnCancel));

机械外部引用选择

Product 环境中选其它 Part 的 face
  -> CATFeatureImportAgent 导入到当前 Part
  -> action 读取导入后的 path
  -> 创建依赖该 external reference 的特征

16. 新手最容易选错的地方

1. 用 CATPathElementAgent 点空间位置

如果用户点的是“空白位置”或“坐标点”,应该用 CATIndicationAgentCATPathElementAgent 要求鼠标下有可选择对象。

2. 用 CATDialogAgent 处理对象选择

CATDialogAgent 只能告诉你某个通知发生了,不能自动给出选择路径。选对象请用 CATPathElementAgent 或机械场景下的 CATFeatureAgent

3. 普通机械 BRep 选择仍用 CATPathElementAgent 硬扛

机械建模里如果涉及 face/edge 的稳定引用、featurization、装配上下文选择,优先看 CATFeatureAgent

4. 外部 Part 几何选择后直接保存原对象指针

如果要在当前 Part 中形成外部引用,应该考虑 CATFeatureImportAgent 或相关 external reference 机制。普通选择只表示交互时选到了对象,不等于持久化链接已经安全建立。

5. 启用多选却还读 GetValue

多选用 GetListOfValues()GetElementValue() 在非单选行为下可能返回 NULL

6. 忽略 prevaluation 状态

启用 CATDlgEngWithPrevaluation 后,GetValue() 在预选阶段可能返回 prevalue。做最终创建时要确认当前 transition 确实由正式 valuation 触发。

7. 忘记 InitializeAcquisition

复用 agent 时,如果旧输出没有清空,下一状态可能立即满足 IsOutputSetCondition。必要时调用 InitializeAcquisition()

8. 把 CATEditAgent 当普通 agent 加到已有多输入状态里

CATEditAgent 作为 state command agent 使用时应是某个 state 的唯一 agent。

17. 推荐选型流程

写一个新命令时,可以按下面顺序选 agent:

1. 用户输入是不是来自对话框按钮/控件?
   是 -> CATDialogAgent

2. 用户是不是要选已有模型对象?
   是 -> 继续判断机械上下文

3. 是普通对象/规格树/一般 3D 选择?
   是 -> CATPathElementAgent

4. 是机械 feature、face、edge、BRep、装配上下文?
   是 -> CATFeatureAgent

5. 是外部 Part 几何并且要导入当前 Part?
   是 -> CATFeatureImportAgent

6. 用户是不是要点一个坐标位置?
   是 -> CATIndicationAgent

7. 用户是不是要在其它已打开文档中选择?
   是 -> CATOtherDocumentAgent

8. 输入是不是 toolbar 上的多个模式切换?
   是 -> CATCmdSwitchAgent

9. 命令中是否要临时进入另一个 workbench 编辑对象?
   是 -> CATEditAgent

这个流程不一定覆盖所有专业 framework,但足够覆盖大多数 CAA 交互命令。

18. 总结

CAA 代理机的核心不是“类名很多”,而是“输入来源不同”。

可以这样记:

要做什么 用什么
接通知 CATDialogAgent
选对象 CATPathElementAgent
点位置 CATIndicationAgent
其它文档选对象 CATOtherDocumentAgent
机械上下文选 feature/BRep CATFeatureAgent
机械外部引用导入 CATFeatureImportAgent
toolbar 多值切换 CATCmdSwitchAgent
临时进入其它 workbench 编辑 CATEditAgent

如果命令是一个状态机,那么 agent 就是每个状态的感官。选对 agent,状态机就会自然;选错 agent,后面就会出现一堆奇怪的过滤、回调和临时变量补丁。

实际开发里建议先用最普通的代理机把交互跑通:选对象用 CATPathElementAgent,点位置用 CATIndicationAgent,按钮通知用 CATDialogAgent。等需求明确进入机械 BRep、外部引用、跨文档、toolbar switch 或跨 workbench 编辑时,再换成对应的专用 agent。

参考位置

  • DialogEngine/PublicInterfaces/CATDialogAgent.h
  • DialogEngine/PublicInterfaces/CATAcquisitionAgent.h
  • DialogEngine/PublicInterfaces/CATPathElementAgent.h
  • DialogEngine/PublicInterfaces/CATIndicationAgent.h
  • DialogEngine/PublicInterfaces/CATOtherDocumentAgent.h
  • DialogEngine/PublicInterfaces/CATCmdSwitchAgent.h
  • DialogEngine/PublicInterfaces/CATEditAgent.h
  • DialogEngine/PublicInterfaces/CATDlgEngUtility.h
  • MechanicalModelerUI/PublicInterfaces/CATFeatureAgent.h
  • MechanicalModelerUI/PublicInterfaces/CATFeatureImportAgent.h
  • ApplicationFrame/PublicInterfaces/CATIAfrDialogForAgent.h
  • DialogEngine/PublicInterfaces/CATCommandHeaderWithSDOForAgent.h

评论