
简介这份文档面向从事CATIA V5二次开发的技术人员与学习者聚焦于以Windows XP为平台、借助VC 6.0与CAA组件应用架构进行CATIA界面二次开发的完整思路。内容从CATIA的两种开发方式切入对比宏Macro自动化与CAA-RADE两条技术路线并重点讲解新建独立workbench、添加工具条与按钮、插入CATIA风格对话框、建立command响应等界面定制环节最后以五坐标数控机床运动仿真系统为实例展示开发成果对理解CAA架构与界面扩展流程有较强参考价值。资源包共1个doc文件约205KB为纯文档型技术资料适合按章节顺序阅读或作为开发时的查阅手册。目前已有6419人学习下载说明其在CATIA二次开发这一资料相对稀缺的领域具有一定认可度适合具备C基础、希望深入掌握CATIA界面定制与组件开发的中高级用户参考。1. 从一次“菜单找不到”说起这套 CATIA 二次开发资料到底能干什么如果你在 CATIA 里做过一点定制大概率遇到过这种场面宏录了一堆 VBScript跑起来挺顺可一旦要把它变成团队里人人能点的按钮、能填参数的对话框、能挂在开始菜单里的独立工作台就卡住了。宏是进程内的变量存不住界面也简陋稍微复杂一点的需求就撑不起来。这份资料解决的正是这个断层——它讲的是用 CAAComponent Application Architecture组件应用架构在 VC 环境里给 CATIA 做真正的界面级二次开发新建 workbench、挂工具条、加菜单、弹 CATIA 风格对话框最后用代码直接生成三维模型再往下延伸到五坐标数控机床的运动仿真。适合已经会用 CATIA 建模、想往定制开发走的人也适合手里有老项目要维护、需要看懂 CAA 那套宏和资源文件写法的开发者。坦白说CAA 这套东西资料一直不多能把界面开发链路讲完整的更少这份算是比较难得的入门底稿。2. 两条开发路线怎么选宏与 CAA 的边界在哪2.1 进程内与进程外先搞清楚你的代码跑在哪CATIA 的二次开发接口按进程关系分两类这个区分决定了你后面所有技术选型。进程内方式下脚本和 CATIA 跑在同一个进程地址空间里典型就是宏Macro。你在 CATIA 里点录制宏操作一遍它生成一段 VBScript 序列回放就能重复操作。优点是零门槛CATIA 环境里就能完成缺点是宏运行期间 CATIA 处于非激活状态宏调用之间存不住变量值交互能力也弱只能靠 InputBox 和 MsgBox 拿输入、给输出。进程外方式下外部程序和 CATIA 在不同进程地址空间运行。CATIA 开着外部进程通过接口去驾驭它创建、修改环境和几何数据、尺寸都行还支持 OLE 对象连接与嵌入。这条路能做的事多得多但工程复杂度也上来了。我一般会这样判断一次性、重复性的操作录宏改改就够要做成产品化的工具条、对话框、参数化建模流程必须走 CAA。2.2 宏方式的适用场景与天花板宏这条路的开发流程很直白录制操作 → 得到 VBScript → 手工改代码 → 关联图标放进 CATIA 显示框架。Automation API 具备与任何 OLE 兼容平台通讯的能力所以理论上你也能用 Visual Basic 定义更复杂的输入输出面板比 InputBox 体面一些。但它有个绕不过去的天花板宏本质是“操作回放 少量逻辑”它不擅长组织大型功能。你要做的是一个带参数校验、带模型生成、带错误处理的工具宏写到最后会变成一坨难以维护的脚本。这份资料把宏作为入门铺垫讲清楚重心其实压在 CAA 上这个取舍是对的。2.3 CAA-RADE基于 VC 的重型开发环境CAA 是达索产品扩展和客户二次开发的工具集配套的 RADERapid Application Development Environment是可视化集成开发环境以 Microsoft Visual C 6.0 为载体开发工具完全集成进 VC 里还提供一个 CAA 框架程序编译器——代价是限制了 VC 的部分功能。资料里明确写了这套环境跑在 Windows XP 上用 VC 6.0这个组合放到今天看很老但如果你维护的是存量 CAA 项目环境就是长这样绕不开。CAA 采用面向对象语言开发过程可以理解成组件对象的组合与扩展底层是 COM 和 OLE 技术。它提供的产品线包括 CAA RADE、CAA CATIA V5 API、CAA ENOVIA LCA V5 API、CAA DELMIA V5 API、CAA ENOVIA PORTAL V5 API。换句话说你写的代码不是“外挂”而是以组件形式嵌进达索这套体系里这也是它比宏强大得多的根本原因同时也是它复杂得多的原因。提示CAA 开发环境的版本和 CATIA 版本是绑定的换 CATIA 大版本时编译环境和 API 都要跟着核对别拿旧工程直接怼新版本。3. 界面开发全链路从新建 workbench 到对话框回调3.1 新建独立 workbench 的六个步骤CATIA V5 把一类交互命令的工具条分组显示在不同工作台workbench里你自己建一个 workbench就能把二次开发出来的一系列命令集中放进去和 CATIA 自带模块并列。资料给的步骤是六步创建工作台厂的接口interface、创建工作台厂、创建工作台描述类、创建响应命令的标题、创建工作台并排列图标按钮响应、提供图片及提示资源并把新工作台插入开始菜单最后创建工作台显示界面。这六步里真正容易翻车的是资源文件和接口声明——代码编译过了菜单里却看不到你的工作台十有八九是资源没挂上。我一般会先把一个空 workbench 跑通、能在开始菜单里看到再往里加东西别一上来就堆功能。3.2 工具条与按钮NewAccess 宏的用法拆解按钮和工具条的创建集中在一个派生自 CATBaseUnknown 的描述类里资料里叫 CAAAfrGeoCreationWkb。CATBaseUnknown 是创建用户界面并实现界面的基类所有接口都从 IUnknown/CATBaseUnknown 继承。这个类里有两个关键函数CreateWorkbench()负责顺序插入工具条、按钮图标和菜单CreateCommands()负责把按钮、菜单和响应函数关联起来。核心是 NewAccess 宏它创建一个“入口”。CATIA 的 workshop 或 workbench 可以看作入口的集合包用 SetAccessChild 和 SetAccessNext 把入口连起来。看这段创建工具条并加按钮的代码// 创建一个工具条容器 NewAccess(CATCmdContainer, pCAAAfrTB1EltTlb, CAAAfrTB1EltTlb); // 把工具条挂到工作台下 SetAccessChild(pCAAAfrGeoCreationWkb, pCAAAfrTB1EltTlb); // 创建按钮 cmd1响应宏指向 CAAAfrCmd1Hdr NewAccess(CATCmdStarter, pCAAAfrTTB1EltCmd1Str, CAAAfrTTB1EltCmd1Str); SetAccessCommand(pCAAAfrTTB1EltCmd1Str, CAAAfrCmd1Hdr); // 按钮加入工具条 SetAccessChild(pCAAAfrTB1EltTlb, pCAAAfrTTB1EltCmd1Str);参数说明一下NewAccess 的第一个参数是类类型可选 CATCmdContainer容器比如工具条、菜单、CATCmdWorkshop工作场、CATCmdSeparator分隔线、CATCmdStarter可点击的启动项比如按钮、菜单项第二个是变量名第三个是对象名后两个通常写成一样的字符串方便在资源文件里对应。SetAccessChild 建立父子关系SetAccessNext 建立同级顺序关系这两个宏决定了界面元素的层级和排列写反了按钮就会跑到别的地方去。3.3 图标与文案CATRsc 和 CATNls 资源文件代码里创建了按钮但按钮长什么样、叫什么名字是在资源文件里配的。图标在CAAAfrGeoCreationWkbHeader.CATRsc里关联CAAAfrGeoCreationWkbHeader.CAAAfrCmd1Hdr.Icon.Normal I_CAACmd1;标题和提示在CAAAfrGeoCreationWkbHeader.CATNls里设置CAAAfrGeoCreationWkbHeader.CAAAfrCmd1Hdr.Category Element; CAAAfrGeoCreationWkbHeader.CAAAfrCmd1Hdr.Title command1; CAAAfrGeoCreationWkbHeader.CAAAfrCmd1Hdr.ShortHelp new cmd1;这里的命名规则值得记一下资源文件名.响应宏名.属性。Title 是按钮上显示的文字ShortHelp 是鼠标悬停的提示Category 用于归类。图标资源名I_CAACmd1对应你放进资源目录的 bmp 文件。这套“代码里写逻辑、资源里写外观”的分离设计是 CAA 界面开发的固定套路改文案不用重新编译代码只改 CATNls 就行维护起来省事。3.4 菜单的挂载容器、分隔线与 SetAccessNext菜单的添加逻辑和按钮同构只是宏的参数和连接方式不同。看这段// 创建菜单容器 NewAccess(CATCmdContainer, pCAAAfrGeoCreationMbr, CAAAfrGeoCreationMbr); NewAccess(CATCmdContainer, pCATAfrInsertMnu, CATAfrInsertMnu); SetAccessChild(pCAAAfrGeoCreationMbr, pCATAfrInsertMnu); // 插入分隔线 NewAccess(CATCmdSeparator, pCAAAfrGeoCreationInsertSep, CAAAfrGeoCreationInsertSep); SetAccessChild(pCATAfrInsertMnu, pCAAAfrGeoCreationInsertSep); // 分隔线之后接子菜单 NewAccess(CATCmdContainer, pCAAAfrMeu1EltSnu, CAAAfrMeu1EltSnu); SetAccessNext(pCAAAfrGeoCreationInsertSep, pCAAAfrMeu1EltSnu); // 子菜单下挂菜单项响应同一个命令 NewAccess(CATCmdStarter, pCAAAfrMMeu1SubMn1Str, CAAAfrMMeu1SubMn1Str); SetAccessChild(pCAAAfrMeu1EltSnu, pCAAAfrMMeu1SubMn1Str); SetAccessCommand(pCAAAfrMMeu1SubMn1Str, CAAAfrCmd1Hdr);关键在 SetAccessNext它表示“在某个元素之后接下一个”用来排同级顺序分隔线之后接子菜单就是靠它。菜单文案同样在 CATNls 里配比如CAAAfrMeu1EltSnu.Title 新建菜单 1。注意菜单项和按钮可以指向同一个响应宏这样同一个功能既能从工具条点也能从菜单进不用写两遍逻辑。3.5 响应类三选一Basic、Statechart 与 Dialog-boxworkbench 框架搭好后要建响应command类它们都派生自 CATCommand。在 CAA Rade 的 Insert 菜单下选 CATIA Resource 里的 Command有三种类型可选Statechart command、dialog-box based command、Basic command。Basic command 创建一个空响应类你在Activate(CATCommand* iFromClient, CATNotification* iEvtDat)里写响应逻辑适合不需要界面的动作。dialog-box based command 在二次开发里用得最多运行时会直接弹出一个对话框你可以对这个对话框进行编辑。Statechart command 适合有状态流转的交互。我的经验是纯执行类操作用 Basic要用户填参数的一律用 dialog-box based别自己从零拼对话框CAA 自带的控件体系已经够用了。3.6 对话框布局与回调SetGridConstraints 和按钮激活对话框编辑界面里自带一批控件CATDlgFrame、CATDlgLabel、CATDlgEditor、CATDlgPushButton、CATDlgRadioButton 等。所有控件在Build()函数里列出位置靠SetGridConstraints(short int iTopRow, short int iLeftColumn, short int iRowSpan, unsigned int iJustification)来调本质是给控件指定在对话框矩阵里的行、列、跨行数和对齐方式。这个布局方式初看别扭习惯了其实比绝对坐标好维护改分辨率不容易错位。回调函数挂在控件上。以 CATDlgPushButton 为例它有 Creation、Visibility swap、Resizement、Button activation、Repetitive button activation 五种回调选 Button activation 就生成点击响应void CAAAfrDlg::OnPushButton004PushBActivateNotification( CATCommand* cmd, CATNotification* evt, CATCommandClientData data) { // 在这里读取编辑框参数、校验、调用建模逻辑 // 例如取半径、拉伸长度、角度然后生成拉伸体 }参数里 cmd 是触发命令evt 是通知事件data 是客户端数据。实际写的时候读取控件值、做参数校验、调用后面的建模接口都塞在这个函数里。校验一定要做用户输入负数半径或者零拉伸长度不拦的话后面建模接口会直接报错排查起来很费劲。4. 实例拆解参数化拉伸体与五坐标机床运动仿真4.1 参数化拉伸体从对话框输入到模型生成第一个实例是把前面的界面链路串起来点按钮弹出对话框输入截面圆半径、拉伸长度、拉伸方向与截面法向的夹角代码据此生成拉伸体还能改位置。这个例子虽小但覆盖了完整闭环——界面响应、参数获取、几何生成、结果显示。实现上对话框回调里拿到三个参数后调用 CATIA 的几何建模接口创建截面圆、沿指定方向拉伸。角度参数的处理要注意单位换算界面里用户填的是角度值底层接口多半吃弧度这里不转就会得到莫名其妙的形状。生成完把结果挂到当前文档、在主窗口刷新显示用户才能立刻看到。这个例子最大的价值是给你一个可复制的模板以后要做别的参数化零件换掉建模那几行界面和流程照抄。4.2 机床建模Part 到 CATProduct 的装配链路第二个实例是五坐标数控机床运动仿真规模大得多。做法是先建独立 workbench下面分两个模块机床模型建立模块和运动仿真模块各自配 Toolbar、对话框和响应函数方法就是前面那套。建模部分资料选择用二次开发代码生成机床数字化模型而不是手工在 CATIA 里建理由是便于后续对模型的操作和添加机床行程等约束参数。链路是用 CAA C 的 PartDesign 部分建立机床各部分的零件每个部分是独立的*.CATPart文件再用 3D PLM PPR 组件完成整机装配机床文件是*.CATProduct。这个“零件独立、装配统一”的结构后面做运动仿真时遍历部件会方便很多。4.3 运动仿真核心读 NC 文件、CATIMovable 与变换矩阵仿真部分是全篇技术含量最高的地方。流程是读取 NC 文件处理后提取移动方向和坐标值用 CATIDocRoots 接口找到机床模型的根产品Root Product遍历拿到要移动的对应机床部件取 CATIMovable 接口实现部件移动移动矩阵是 CATMathTransformation 类型。// 伪代码示意定位根产品并驱动部件移动 CATIDocRoots* pDocRoots NULL; // 通过文档拿到根产品遍历产品树找到目标部件 CATIMovable* pMovable NULL; // 对目标部件查询 CATIMovable 接口 CATMathTransformation transform; // 根据 NC 文件解析出的方向与坐标构造变换矩阵 pMovable-SetPosition(transform); // 驱动部件到新位置这段的关键在接口查询CATIA 的对象是组件化的你要操作某个部件得先 QueryInterface 拿到对应能力接口CATIMovable 就是“可移动”这个能力的入口。NC 文件解析出来的坐标是离散点逐点构造变换矩阵并驱动就形成了运动动画。刀具轨迹的生成和显示用了 CAA 的 GSM 和 Shape Design Styling支持直线、圆弧和样条曲线轨迹可以独立显示。注意NC 文件格式差异很大解析层一定要做容错遇到不认识的指令行跳过并记日志别让整个仿真因为一行脏数据崩掉。5. 避坑与排查CAA 界面开发里最容易翻车的几件事5.1 工作台编译通过但开始菜单里看不到现象代码编译链接都过了启动 CATIA 后开始菜单里找不到新建的 workbench。原因多半是资源没挂上——CATRsc 或 CATNls 文件没放进正确目录或者资源文件里的对象名和代码里的宏名对不上。解决先核对资源文件名.响应宏名.属性这条命名链逐字符比对再确认资源目录是否被 CATIA 的运行时路径覆盖。我一般会先只挂一个空 workbench 验证资源链路通了再加内容。5.2 按钮点了没反应回调不触发现象按钮显示正常点击后对话框不弹或者没任何动作。原因通常是 SetAccessCommand 里写的响应宏名和实际响应类不匹配或者响应类没在 CreateCommands() 里正确注册。解决检查 SetAccessCommand 第二个参数是否和响应类的头文件名一致再确认 CreateCommands() 里确实建立了关联。还有一种情况是回调函数签名写错CAA 对函数签名很敏感参数类型差一个都挂不上。5.3 对话框控件位置错乱或重叠现象对话框打开后控件挤在一起或者跑到框外。原因在 SetGridConstraints 的行列参数算错了尤其是跨行数iRowSpan和对齐方式iJustification没配对。解决把对话框想象成网格先规划好每个控件占几行几列再填参数改布局时一次只动一个控件改完立刻编译看效果别攒一堆一起改。5.4 几何生成接口报错或模型不显示现象参数输入正常但生成模型时接口返回失败或者模型生成了却看不到。原因可能是参数单位不对角度没转弧度、当前没有活动文档、或者生成的对象没挂到文档树上。解决在建模调用前先确认活动文档存在参数做边界校验和单位换算生成后显式把对象加入文档并刷新视图。这类问题日志里往往只有一句泛泛的失败得靠分段打日志定位到具体哪一步。5.5 运动仿真部件不动或整体乱飞现象仿真跑起来该动的部件不动或者所有部件一起乱移。原因通常是产品树遍历时找错了节点或者变换矩阵是相对坐标而非绝对坐标叠加后累积误差。解决遍历时打印每个部件的名称和层级确认目标部件唯一命中变换矩阵统一用绝对位置计算别在上一帧结果上反复叠加。NC 解析出来的坐标先做一次范围检查异常值直接丢弃。6. 二次开发改造思路把这份资料变成你自己的工具链拿到这份资料最忌讳的是照着例子原样敲一遍就完事。我的建议是先把它拆成三层来用界面层、命令层、建模层。界面层就是 workbench、工具条、菜单、对话框那套这部分是模板化的你做一个自己的“基础工作台”工程把资源文件、响应类骨架都备好以后新功能直接往里加不用每次从零建。命令层是响应类和回调负责参数收集与校验。建模层是真正调 CATIA 接口的部分也是最需要按业务改的部分。改造时有个具体技巧把建模逻辑从对话框回调里抽出来单独封装成函数或类回调只负责取参数、校验、调用。这样同一段建模逻辑既能被对话框触发也能被批处理脚本调用测试时还能脱离界面单独跑。资料里的拉伸体例子就适合这么改——把“根据半径、长度、角度生成拉伸体”抽成一个函数回调里三行调用完事。验证方法上我习惯分三段验先验界面工作台能出现、按钮能点、对话框能弹再验参数输入边界值看校验是否生效最后验结果模型几何是否正确、仿真运动是否符合预期。每段单独过出问题能快速定位在哪一层。下面这张表是我整理的各层改动点和验证方式层级主要改动点验证方式界面层workbench 结构、CATRsc/CATNls 资源开始菜单可见、按钮图标文案正确命令层响应类、回调函数、参数校验点击有响应、非法输入被拦截建模层PartDesign/装配/运动接口调用模型几何正确、部件按预期移动还有一点血泪经验CAA 工程的编译环境和 CATIA 版本强绑定团队里每个人的环境必须统一否则你这边编译过的工程到别人机器上就是一堆链接错误。我一般会在工程里放一份环境说明写清楚 VC 版本、CAA 版本、CATIA 版本和资源路径新人进来先照着重装环境再碰代码。从那以后我每次动 CAA 工程都强制先跑一遍“空工作台 一个按钮 一个对话框”的最小闭环确认环境没问题再往里加业务逻辑这个习惯帮我省掉了大量“到底是环境坏了还是我代码写错了”的排查时间。希望帮到你。本文还有配套的精品资源点击获取