简介:这份资源面向CATIA二次开发初学者与CAA框架实践者,聚焦对话框代码的完整实现,帮助读者理解如何在CATIA环境下自定义用户界面、收集输入并反馈到模型中。压缩包共536个文件,约2.88MB,以365个h头文件、10个cpp源文件、10个catrsc资源文件、4个catdlg对话框定义及若干bmp位图、mk编译脚本、vcproj工程文件为主,覆盖从对话框模板设计、CDialog派生类实现到消息映射与数据绑定的完整链路。其中CatalogBrowser示例演示了目录浏览器对话框的构建方式,涉及CListCtrl层次数据展示、控件事件响应以及通过CAA API访问CATIA产品与部件对象等关键环节。已有219人学习,适合作为掌握CAA编程原理、积累自定义功能开发经验的入门参考。
1. 从一段能跑的 CATIA 对话框代码说起
如果你正在搜 CATIA 二次开发 对话框代码,大概率不是想听 CAA 架构科普,而是手里有个 V5 环境,想给重复操作套个界面:选文件、填参数、点确定,然后让 CATIA 自己跑。CATIA 二次开发里,对话框是最容易卡住新人的一环——不是逻辑难,而是入口太多:CAA 的 Dialog 框架、Automation 里的 VBA UserForm、再到用 C# 或 Python 通过 COM 调CATIA.Application,每条路能走通的前提完全不同。我见过太多人拿着一段 VBA 代码贴进 CAA 工程里编译报错,也见过有人用 CAA 写了个对话框,结果部署时 DS License Server 没配好,CATIA 直接起不来。这篇笔记围绕一份可复现的对话框代码资源展开,把选型、环境、代码结构、参数传递和常见翻车点拆开讲,适合已经能打开 CATIA、想用代码替代手工点击的工程师,也适合被 CAA 编译链折磨过、想换条路的人。
2. 先选对技术路线:CAA、VBA 还是 COM 调用
2.1 三条路线的能力边界与适用场景
CATIA 二次开发的对话框实现,本质上取决于你选哪套 API。CAA(Component Application Architecture)是达索官方的 C++ 框架,能力最全,能深度集成到 CATIA 界面、响应文档事件、操作特征树,但代价是编译链复杂、依赖 RADE、对 CATIA 版本和 DS License Server 极其敏感。VBA 走的是 Automation 接口,CATIA 内置编辑器,写个 UserForm 就能弹窗,适合快速做参数输入、批量改属性、导出数据这类轻量任务,缺点是界面风格受限、无法做复杂交互、部署依赖宏安全性设置。COM 调用则是用外部语言(C#、Python、VB.NET)通过CATIA.Application对象操作 CATIA,对话框用 WinForms 或 WPF 自己画,灵活度高,适合把 CATIA 当成一个后台服务来调度,但需要处理进程外 COM 的线程和释放问题。
选型时先问自己三个问题:这个工具是给一个人用还是一队人用?需不需要嵌进 CATIA 菜单?运行环境能不能统一?如果只是个人或小组内部提效,VBA 或 Python COM 足够;如果要发布给全部门、要出现在 CATIA 工具栏里、要跟 PDM 交互,那 CAA 绕不开。常见做法是先用 VBA 验证逻辑,跑通后再决定要不要迁到 CAA。
2.2 环境准备:版本、License 与编译链
CAA 路线对版本匹配要求苛刻。CATIA V5 的 CAA 开发必须用对应版本的 RADE(Rapid Application Development Environment),比如 V5R21 配 RADE V5R21,V5-6R2022 配同版本 RADE。装完 RADE 后,环境变量里要有CATInstallPath、CATDevelopmentStandalone等,编译前还要确认 DS License Server 里 CAA 相关 license 已授权。很多人遇到“CATIA 单击确定终止”或启动即崩,八成是 license 没配好或 RADE 与 CATIA 版本错位。
VBA 路线最简单:打开 CATIA,工具→宏→Visual Basic 编辑器,直接写。注意宏安全性要设为中或低,否则 UserForm 加载会被拦。COM 路线需要装与 CATIA 版本对应的 Automation 类型库,C# 里通过引用CATIA V5 Automation或Interop.CATIA来获得智能提示,Python 则用win32com.client.Dispatch("CATIA.Application")。
提示:不管哪条路,先确认 CATIA 能正常启动、能手动完成一次目标操作,再写代码。环境没通就调代码,等于在黑匣子里找路。
3. 对话框代码拆解:从界面到参数回传
3.1 VBA UserForm 的最小可运行结构
先给一段 VBA 里最实用的对话框骨架:一个窗体、一个文本框、一个确定按钮,点确定后把输入值写进 CATIA 当前零件的 PartNumber。这段代码在 CATIA V5 的 VBA 编辑器里可直接跑。
' 窗体代码:UserForm1 Private Sub CommandButton1_Click() Dim inputVal As String inputVal = TextBox1.Text If Len(inputVal) = 0 Then MsgBox "请输入零件编号" Exit Sub End If ' 回写到 CATIA 当前文档 Dim partDoc As Document Set partDoc = CATIA.ActiveDocument partDoc.Part.PartNumber = inputVal MsgBox "已更新为:" & inputVal Unload Me End Sub逻辑说明:CATIA.ActiveDocument拿到当前活动文档,Part.PartNumber是零件属性。参数说明:TextBox1.Text是用户输入,Len(inputVal) = 0做空值校验,Unload Me关闭窗体。这段代码的关键在于 CATIA 对象模型是进程内直接可用的,不需要额外引用。如果你在外部程序里写,就要先GetObject或CreateObject拿 Application。
3.2 CAA 对话框的入口与命令绑定
CAA 里对话框不是独立存在的,它挂在一个命令(Command)上,命令再挂到工具条或菜单。典型结构是:CATCommand派生类负责创建CATDlgDialog派生类,对话框类里用CATDlgFrame、CATDlgEditor、CATDlgPushButton拼界面。下面是一个对话框类的头文件片段,展示控件声明和回调绑定。
// MyDialog.h class MyDialog : public CATDlgDialog { CATDeclareClass; public: MyDialog(CATDialog* iParent, const CATString& iName); virtual ~MyDialog(); private: CATDlgEditor* _pEditor; CATDlgPushButton* _pOkBtn; void OnOk(CATCommand* iCmd, CATNotification* iNotif, CATCommandClientData iData); };逻辑说明:CATDlgEditor是输入框,CATDlgPushButton是按钮,OnOk是回调函数。参数说明:iParent是父窗口,iName是对话框资源名。CAA 的控件创建通常在构造函数里用new完成,回调通过AddAnalyseNotificationCB绑定。编译时需要CATDlg框架的模块依赖,链接阶段容易缺库,常见做法是照抄 RADE 自带 sample 的Imakefile.mk再改。
3.3 参数从界面到 CATIA 模型的传递路径
对话框收集的参数最终要落到模型上。VBA 路线直接操作ActiveDocument下的对象;CAA 路线则要通过CATISpecObject等接口拿到特征,再SetValue。COM 路线介于两者之间,用Document.Part.Bodies等属性逐层下钻。不管哪条路,参数传递的核心是类型匹配:CATIA 里长度是CATLength,角度是CATAngle,字符串是CATUnicodeString,直接塞 C++ 的double可能编译过但运行异常。VBA 里相对宽松,但也要注意单位,CATIA 内部长度单位是毫米,角度是弧度。
注意:CAA 里对话框控件值默认是
CATUnicodeString,转数值要用CATDlgEditor::GetValue配合CATStringToDouble之类的工具函数,别自己写atof,编码问题会让你调半天。
4. 避坑与排查:对话框代码最常见的五类翻车
4.1 现象:CAA 工程编译通过,但 CATIA 启动时崩溃
原因:RADE 与 CATIA 版本不匹配,或 DS License Server 未授权 CAA 开发 license。解决:核对 RADE 版本号与 CATIA 完全一致,在 License Server 管理工具里确认CAA相关条目已勾选。如果还是崩,把新建的对话框命令先注释掉,确认是代码问题还是环境问题。
4.2 现象:VBA UserForm 显示但按钮点击无反应
原因:宏安全性设置过高,或窗体控件事件没绑定。解决:工具→宏→安全性设为中,重启 CATIA;检查按钮的Click事件是否真的写了代码,而不是双击按钮生成了空事件。另一个常见原因是窗体用了Show而不是Show vbModal,导致焦点丢失。
4.3 现象:COM 调用时报“无法创建 ActiveX 组件”
原因:CATIA 未启动,或类型库未注册。解决:先手动启动 CATIA 再运行程序;C# 里确认引用了正确的 Interop 程序集,Python 里确认pywin32已安装且位数与 CATIA 一致(CATIA 是 64 位就装 64 位 Python)。
4.4 现象:对话框输入的中文变成乱码
原因:CAA 里CATUnicodeString与char*混用,或 VBA 里用了StrConv但编码不对。解决:CAA 统一用CATUnicodeString构造和取值,不要直接传char*;VBA 里从 TextBox 取到的就是 Unicode,写回 CATIA 一般没问题,乱码多出现在写文件时,加ADODB.Stream并指定Charset = "utf-8"。
4.5 现象:对话框关闭后 CATIA 进程残留
原因:COM 对象未释放,或 CAA 命令未正确RequestDelayedDestruction。解决:COM 路线在程序退出前显式Marshal.ReleaseComObject,Python 里del后调gc.collect();CAA 里确认对话框的Cancel和OK都走了销毁流程,别只delete指针。
5. 进阶:把对话框做成可复用工具条命令
5.1 用 CATIA 宏库管理多个对话框
VBA 路线做多个工具时,别把代码散在各处。建一个.CATScript库,把公共函数(比如获取当前 Part、单位转换、写日志)抽出来,各对话框只留界面和业务逻辑。这样改一处全局生效,也方便版本管理。我一般会在库开头定义Const APP_NAME = "MyTools",所有 MsgBox 标题统一,用户一看就知道是哪个工具弹的。
5.2 CAA 命令注册到工具条的三个关键点
CAA 命令要出现在 CATIA 工具栏,需要在CATCommandHeader里注册,并在CreateCommands中绑定。关键点:一是命令头名称不能与已有冲突,二是工具条资源文件(.CATRsc)里的图标路径要对,三是TIE_CATICommand宏别漏。常见做法是复制 RADE sample 里的CAADegCmd例子,改类名和资源 ID,比从零写稳。
5.3 验证对话框是否真的生效
写完别只看编译通过。验证步骤:启动 CATIA,新建 Part,手动触发命令,输入边界值(空、超长、特殊字符),观察模型是否按预期变化,再关闭 CATIA 看进程是否干净。CAA 路线还要在CATIA的Tools > Options > General > Parameters里确认命令已加载。我习惯在对话框确定按钮里加一行日志写临时文件,跑完检查日志,比弹 MsgBox 更不打扰。
# Python COM 验证片段:确认对话框回写成功 import win32com.client catia = win32com.client.Dispatch("CATIA.Application") doc = catia.ActiveDocument part = doc.Part print("当前零件号:", part.PartNumber) # 如果这里能打印出对话框输入的值,说明回写链路通了逻辑说明:Dispatch拿到 CATIA 实例,ActiveDocument拿当前文档,PartNumber读属性。参数说明:这段代码要在 CATIA 已打开且文档已激活时运行,否则ActiveDocument为None。验证通过后,再把这段逻辑嵌进你的正式工具里。
从那以后我每次写完对话框,都强制走一遍“空值、中文、超长、关闭进程”四步验证,不再相信编译通过就等于能用。希望帮到你。
本文还有配套的精品资源,点击获取