
简介这是一份聚焦CATIA二次开发的稀缺技术文档主要面向机械设计、数控仿真及CAD/CAM二次开发人员。内容围绕CATIA V5的CAA组件应用架构展开系统梳理了利用VC6.0环境进行界面定制的两种方式——宏Macro与CAA-RADE并重点演示了进程外应用程序的通信机制。其中以五坐标数控机床运动仿真系统为实例逐步讲解新建独立工作台、添加菜单与工具条、绑定按钮图标、生成命令响应、调用对话框以及通过代码直接创建三维模型并在CATIA主窗口显示的完整过程。资源为单个doc文档大小仅205KB篇幅精炼而信息密度高属于入门与进阶均适用的技术参考资料。该文档在平台上已有6405人学习长期保持较高关注度适合希望掌握CATIA界面二次开发框架、想快速上手CAA开发的工程技术人员下载研读。1. 从“用手画图”到“让CATIA自己画”CATIA二次开发到底在开发什么CATIA二次开发很少被人当成一项能直接给公司省出一半建模时间的技能来评估。实际上它解决的是同一类事把你在CATIA里反复点的菜单变成可以重复执行的脚本或程序。不管是批量改参数、自动出工程图、把三维模型数据落到企业数据库还是给设计规则写一个自动检查器本质上都是用API把CATIA内部的对象模型拿过来操作。这套操作比界面上点鼠标稳定得多也更适合无人值守的任务。适合做的人不只是程序员还有整天处理装配件、负责标准化模板、给仿真部门准备模型的人。你不需要先成为C高手但至少得知道三条API路线分别站在哪个门槛上。2. 先选路再说代码CAA、Automation、EKL到底分别适合谁如果你打开CATIA安装目录会发现里面同时塞了三套不同的接口它们不冲突但选错了会让整个项目翻车。CATIA二次开发最常见的分类是CAA、Automation和EKL。CAA是底层C框架编译成DLL能做原生特征和几何算法Automation是基于COM的脚本接口用VBScript、VBA或C#调用CATIA.ApplicationEKL是CATIA知识工程里内置的规则语言不编译、不弹窗主要用于参数约束和设计检查。2.1 三条路的核心区别先把话放这儿没有一套API是万能的。CAA能访问几乎所有CATIA对象甚至能自己创建新的特征类型但它要求开发者具备C、COM、CATIA对象生命周期三种知识。Automation只能调用CATIA已经暴露出来的对象优点是上手快缺点是很多内部拓扑操作做不了。EKL最接近业务规则适合做“如果某尺寸超差就亮红灯”这类逻辑但它不是通用编程语言。我一般会建议从Automation入手因为大多数日常需求都落在“打开文档、改参数、导出数据”这个区间。CAA留给那些要写新计算模块的团队EKL只用在知识模板里。另外很多网上流传的“CATIA插件”其实是外部程序包了一层Automation的壳真正用CAA做的插件数量比想象中少得多原因不是CAA不好而是维护成本太高。2.2 选型对比表这里列一张表帮你快速判断。注意“性能”指单次调用耗时CAA在复杂几何运算上明显胜出但脚本的开销在常规交互中可以忽略。开发方式语言运行方式可管范围学习曲线典型用途AutomationVBScript / VBA / C#解释执行 / COM调用CATIA已暴露对象低批量改参数、组件操作、文档管理CAAC编译DLL并加载进CATIA进程几乎全部CATIA对象高自定义特征、复杂几何算法、深度集成EKLCATIA内置规则语言知识引擎解释参数、约束、检查中设计规则、自动优化、参数联动这张表没法覆盖所有边界比如C#也能通过COM访问CATIA但绕不开授权、注册表依赖和位数匹配问题。如果你的环境是64位CATIA那所有通过COM启动的.NET程序都必须编译成x64否则一调用就崩这是很多人在第二步踩到的坑。表格里没提到的另一个维度是版本兼容性Automation的接口在V5 R19到V5-6R2022之间变化很小很多老脚本拿过来改个版本号就跑CAA则绑定具体版本和编译器R21的代码拿到V5-6R2022上连库目录都要重新配置。2.3 选型怎么落地按你的项目边界选先回答三个问题你的数据量多大需要用户交互吗允许重启CATIA吗如果只是定时批量处理几个零件Automation完全够。如果要做成插件在CATIA菜单里长期存在CAA更稳。如果只是给模板写规则EKL够了。举个例子我曾经帮工艺部门做过一个塑件卡扣批量检查工具。最初方案选了CAA因为理论上可以走底层的干涉检查但算下来工期要六周还要维护编译器环境。后来改成Automation调用CATIA自带的Interference分析命令脚本把分析结果写回Excel两周就交付了。虽然自动化做不到CAA那样细粒度控制但业务上没人关心底层对象只看结果。另一个反例是处理螺旋曲面扫掠Automation里找不到对应的特征重建接口最后还是用CAA写了一个小DLL从外部被脚本调用才解决。2.4 验证环境用一行VBScript确认Automation可用正式开发前先跑一遍探活脚本。它能帮你确认CATIA的COM接口有没有注册也能避免后面所有脚本都卡在同一个莫名其妙的环境问题上。Set catia GetObject(, CATIA.Application) If Err.Number 0 Then MsgBox catia.Version Else MsgBox 没有CATIA运行请先启动一次CATIA End If这段代码的逻辑很简单GetObject的第二个参数是ProgID第一个参数为空表示获取正在运行的实例。如果CATIA没启动Err.Number不为零说明没有活跃对象。常见现象是同样的脚本在一台机器上能跑换一台就报“ActiveX 组件无法创建对象”原因通常是新机器上的CATIA还从未启动过COM组件没有完成自注册。解决办法不是重装CATIA而是先手动打开一次CATIA再运行脚本。3. 用Automation跑通第一个CATIA脚本录制宏、改参数、批量执行这一章开始落地。我们不从空白写代码而是从录制宏开始因为录制出来的对象名和参数名都是CATIA真实生成的比自己凭记忆写少踩一半坑。录制宏的入口是Tools Macro Start Recording语言选VBScript名字随便起然后录制一个创建Part和拉伸的过程停止后打开宏编辑器你会看到类似下面的代码不同版本命名有差异。3.1 录制宏后先做“净身”把录制得到的代码里所有“InputBox”、“Selection.SelectElement”删掉只保留核心几何创建步骤。原因是录制宏录下来的是鼠标点击的UI动作包含大量选中前状态重放时这些选中步骤会根据环境失效。净身后的代码一般只剩下创建文档、设置参数、更新模型三部分。这个习惯能让脚本的重放稳定性提高一大截。不光是CATIACreo、NX等同类软件的批量自动化也适用这个思路。录制宏的价值不是提供最终代码而是告诉你CATIA内部用什么名字称呼一条边、一个拉伸厚度。3.2 最小可运行代码创建Part并加一个Pad下面这段是给CATIA内置VBA编辑器使用的运行时按AltF8选宏即可。如果你要用外部VBScript需要去掉所有“As Object”类型声明这里先用VBA风格保持可读性。Sub CreatePad() Dim oCATIA As Object Set oCATIA GetObject(, CATIA.Application) If oCATIA Is Nothing Then Exit Sub Dim oPartDoc As Object Set oPartDoc oCATIA.Documents.Add(Part) Dim oPart As Object Set oPart oPartDoc.Part Dim oBodies As Object Set oBodies oPart.Bodies Dim oBody As Object Set oBody oBodies.Item(PartBody) Dim oSketches As Object Set oSketches oBody.Sketches Dim oOrigin As Object Set oOrigin oPart.OriginElements.PlaneXY Dim oSketch As Object Set oSketch oSketches.Add(oOrigin) Dim oFactory2D As Object Set oFactory2D oSketch.OpenEdition() oFactory2D.CreateRectangle 0#, 0#, 100#, 50# oSketch.CloseEdition() oPart.Update() Dim oPad As Object Set oPad oBody.Shapes.Add(Pad) oPad.SetDimension FirstLimitLength, 20# oPart.Update() MsgBox Pad创建完成 End Sub这段代码的逻辑是先连接已经运行的CATIA新增一个Part文档取到Part对象然后拿到PartBody下的草图集合。重点在草图部分OpenEdition返回一个2D工厂CreateRectangle传入四个坐标分别是左下角X、Y和右上角X、Y关闭编辑后必须调用Part.Update否则后面Pad找不到草图的边界。脚本用20毫米作为拉伸高度通过SetDimension设置注意CATIA内部参数名是“FirstLimitLength”写错不会报语法错但会在Update时留下一个未约束的Pad。3.3 参数说明哪些地方需要改CreateRectangle的四个数字是坐标单位由当前Part文件的单位决定。SetDimension的20就是拉伸高度如果环境是英制单位需要换算。CATIA的Automation接口没有默认单位转换传进去的数字会按文档单位解释所以脚本开头建议先读取Part.InitialUnit类型再换算。这里有个常见的翻车点CATIA里面单位转换并不是简单乘以25.4因为有些参数是角度、密度甚至温度不同物理量单位映射机制不一样。如果只处理长度乘以25.4没问题一旦涉及权重就要用CATIA的Unit接口去查。大多数工程师用单单位模板这个问题不会出现但当你接手跨国项目时一定要检查。3.4 批量执行遍历文件夹里所有CATPart实际工程没人手动触发单个宏更多是丢一个文件夹进去自动处理。下面这个脚本把指定目录下所有.CATPart中名为“Length”的自定义参数改成50毫米然后另存到Output目录。注意文档里必须存在这个参数否则Item会报错所以前面加一个On Error判断。Sub BatchModifyParameters() Dim fso As Object Set fso CreateObject(Scripting.FileSystemObject) Dim folder As Object Set folder fso.GetFolder(D:\InputParts) Dim file As Object For Each file In folder.Files If LCase(fso.GetExtensionName(file.Name)) catpart Then Dim oCATIA As Object Set oCATIA GetObject(, CATIA.Application) Dim oDocs As Object Set oDocs oCATIA.Documents Dim oDoc As Object Set oDoc oDocs.Open(file.Path) Dim oPart As Object Set oPart oDoc.Part Dim oParams As Object Set oParams oPart.Parameters On Error Resume Next Dim oParam As Object Set oParam oParams.Item(Length) If Err.Number 0 Then oParam.Value 50 oPart.Update() oDoc.SaveAs D:\OutputParts\ file.Name End If ERR.Clear oDoc.Close() End If Next End Sub这一段要仔细看两个地方一是GetObject前面没有再创建CATIA对象表示脚本只处理已经在运行的实例如果系统里没有CATIA这里会崩。所以最好在循环前加一次探活探活机制参考上一章。二是On Error Resume Next不能乱用这里只是为了跳过没有“Length”参数的文件一旦改完参数要立刻清空错误状态否则后面所有文件都会被静默跳过。SaveAs路径必须提前建好CATIA不会自动创建Output目录。文件夹里如果有正在被其他进程打开的零件SaveAs也会失败建议配合尝试重试逻辑。4. 用CAA做真正意义上的二次开发RADE环境、编译与加载CAA不是简单一个SDK而是一整套基于C和COM的框架官方叫“CAAC Development Environment”平时大家都叫RADE。它与CATIA本体版本严格绑定比如V5 R21就要配同版本的RADE和对应Service Pack。安装顺序建议先装CATIA再装RADE最后配环境变量。装完启动RADE后需要能看到“CAA V5”菜单否则说明没装上。4.1 CAA和RADE为什么它需要独立编译器使用CAA期间你基本不会碰到CATIA原始程序而是面对一套叫“Framework”的代码结构。每个Framework是一组相关类的集合下面再分Module每个Module编译出一个DLL。这个组织方式和Visual Studio解决方案完全不同刚上手的人经常会找不到项目文件。另一个重点是编译器版本必须是CATIA官方支持的那个VC版本例如V5 R21时代是Visual Studio 2010到V5-6R2022就换成了较新的VC编译器。如果编译器不匹配CAA编译阶段会报一堆“CATIA.Mutex.h not found”之类的错这不是你代码的问题而是RADE没有正确识别编译器。网上很多“catia二次开发 rade重装”的提问一半都是这个原因。4.2 最小工作区命令创建Workspace和Framework需要命令行常用指令是mkmk。下面这段在Windows命令行或脚本里执行mkdir C:\CAAWorkspace cd /d C:\CAAWorkspace mkmk -amkmk是CAA环境提供的构建工具-a表示创建一个新的Workspace。执行完后目录里会出现EmptyWorkspace和Tools等文件夹。然后你需要创建一个Frameworkmkmk -f MyFirstFrame -c-c参数表示创建一个新框架MyFirstFrame就是框架名。接着在这个框架下创建Modulemkmk -m MyFirstModule -c-m指定模块名。这套命令式构建方式一开始不习惯但好处是编译和部署都可以写进批处理适合持续集成。CAA不推荐直接用Visual Studio打开项目因为RADE的属性页和构建步骤与VS原生体系是两套强插进去会丢失工程文件里的框架依赖信息。4.3 最小命令类骨架CAA程序的最小单元是命令类继承CATCommand。下面是一个空命令骨架可以在启动时被菜单触发// MyCommand.h #include CATCommand.h #include CATDeclare.h class MyCommand : public CATCommand { CATDeclareCommand(MyCommand); public: MyCommand(CATCommand *iParent, CATString iName); virtual ~MyCommand(); void Activate(CATCommand *iCommand, CATNotification *iNotification); }; // MyCommand.cpp #include MyCommand.h #include CATCommand.h #include CATMsgCatalog.h CATImplementCommand(MyCommand, MyCommand, CATCommand); MyCommand::MyCommand(CATCommand *iParent, CATString iName) : CATCommand(iParent, iName) { } MyCommand::~MyCommand() { } void MyCommand::Activate(CATCommand *iCommand, CATNotification *iNotification) { // 在这里写你的业务逻辑 }这个骨架包含了CAA命令类最容易被忽略的两个点构造函数里要调用CATDeclareCommand和CATImplementCommand宏来完成运行时类型注册Activate是每次点击菜单时的入口。如果只写构造函数没有实现ActivateCAA框架会报“命令没有处理者”。析构函数必须释放所有自己new出来的对象CATIA不会自动帮你回收否则长时间操作会越用越卡最后整个进程崩溃。4.4 从DLL到CATIA加载编译成功后会生成DLL但要让CATIA启动时找到它需要设置环境变量CNEXT和PATH。常见做法是创建一个启动批处理先加载RADE环境再启动CATIA。如果你没有系统环境变量修改权限可以把DLL放到CATIA安装目录下的code/bin里但我不推荐因为升级系统时会被覆盖。正确做法是维护一个自定义deployment目录用mkmk自带的部署脚本把DLL复制过去。设置好环境变量后启动CATIA在命令窗口输入“MyCommand”工具ID看它能否被识别。如果识别不了先检查DLL是否在CNEXT路径下再检查Framework是否激活。我见过不少开发者把DLL放到桌面上然后反复重启CATIA那是无用功。4.5 CAA和Automation怎么合作团队刚起步时不必在两者之间二选一。常见做法是主程序用Automation完成批量参数修改遇到Automation做不了的求交、约束、特征识别时再调用一个用CAA写的独立计算DLL。这个DLL像一个计算器通过标准输入输出或注册好的COM接口暴露给脚本比把所有业务都包在CAA里好维护得多。这样安排还有一个好处CAA的部分可以被多个项目复用而Automation的部分可以快速响应业务变化。比如你今天要把“遍历所有装配件里的紧固件”逻辑改一下只动脚本就行不用重编译C库。热词里经常看到“catia插件”这个词其实大部分工程场景需要的不是插件而是脚本再加上一两个CAA小工具的组合。5. 避坑CATIA二次开发最常见的5个翻车现场CATIA二次开发的坑很少写进教程因为它们只在自己动手时才会暴露。下面这几条是我踩过、也帮别人排查过的典型问题每条按现象、原因、解决三个角度写读起来可以直接对照排查。5.1 录制好的宏第二次运行就报错卡在Selection上现象录制宏时一切正常重新打开宏运行CATIA停在“HumanInterfaceSelection”那一行提示对象不存在或选择集为空。原因录制宏包含了点击实体作为输入的动作重放时界面没有任何预选中对象Selection对象自然失效。解决录制后手动删除所有选择操作改为在代码里硬编码对象路径比如直接用Bodies.Item(PartBody)。如果业务上确实需要用户选择就在脚本开头弹出一个对话框让用户Pick对象再把这个对象传给后续步骤而不是依赖宏录制的历史状态。5.2 外部VBScript报“ActiveX 组件无法创建对象”或“类型不匹配”现象脚本在公司电脑上运行正常换到另一台电脑就报错。原因目标机器上的CATIA从未启动过COM组件没有完成注册或者系统同时装了多个CATIA版本导致GetObject匹配到了错误对象。解决先手动启动一次CATIA确认能打开界面后再运行脚本。如果依然报错打开Windows注册表检查“CATIA.Application”的CLSID是否指向当前安装版本。多版本并存时可以通过DCOM配置指定优先调用的版本但最稳妥的办法是卸载不用的旧版本或者在产品安装路径下执行修复安装来重写COM注册。5.3 批量处理时CATIA内存暴涨越跑越慢最后无响应现象脚本循环打开几百个零件后任务管理器里CATIA内存占用接近2GB操作开始卡顿。原因Automation脚本中创建的对象没有被释放局部变量在VBA循环里不会自动结束生命周期且每次打开的文档没有及时关闭。解决在循环内部用Set obj Nothing显式释放用过的对象特别是Documents、Part、Parameters这几个大对象。同时用oDoc.Close加一个参数决定是否保存更改让文档对象在每次迭代后退出内存。还有一个辅助办法每处理50个文件就调用一次系统垃圾收集如果是VBScript就循环里加一句空集合操作强制GC虽然不优雅但能救急。5.4 RADE重装后环境变量失效CAA编译工具全部消失现象RADE重装完成后mkmk命令找不到或者CATIA启动时找不到之前部署的CAA模块。原因RADE安装过程会写入CNEXT、PATH等系统环境变量但重装时如果没先清理旧版本会导致环境变量指向旧目录或残留临时路径。解决重装前先手动清除所有环境变量里指向之前安装路径的项再卸载旧RADE并重启。安装完成后用命令“echo %CNEXT%”检查变量确认它指向新安装目录mkmk命令如果仍不可用找到RADE安装目录下的“Environment”文件夹运行其中的“CNextEnv”批处理重新加载环境。5.5 同一个脚本在CATIA V5 R21和V5-6R2022上结果尺寸不一致现象批量脚本升级版本后生成的模型尺寸出现少数偏移有时甚至Pad方向反了。原因版本变化导致部分Automation接口的默认参考坐标或参数计算方式改变最常见的是草图平面上方向矢量的手性定义。解决升级前先抽取一个小样本零件做回归测试不能直接拿生产数据跑。脚本里涉及方向、旋转、阵列的地方不要使用忽略参数的旧写法改为显式传入参考方向向量和原点坐标。如果版本跨度太大建议保留一台旧版本CATIA作为兼容性验证环境。这一点对于长期维护二次开发团队尤其重要因为重返旧版本后新的脚本不一定能反向兼容。6. 从“会写”到“可信”给二次开发脚本加上参数检查、日志和回归清单CAA和Automation代码跑通只是第一步。真正让工具被团队接受靠的是异常时能说清楚错在哪。6.1 用参数检查把硬编码数字变成可配脚本里不要直接写数值和路径。定义一个头部参数区集中管理输入文件目录、输出目录、目标长度、单位换算系数等。这样业务调整时只需要改几行常量不需要翻遍上百行代码。我习惯把这些配置放在一个名为“Config”的字典对象里脚本启动时读取一次后面所有函数都从Config取值。这样做的最直接收益是当工艺部门要求把默认拉伸高度从20改成25时你不需要重新发布整个脚本。6.2 给脚本加日志出错时还能复盘日志是很多工程师忽略的点。在关键步骤比如“打开文档”“修改参数”“保存文件”后输出一行带时间戳的文本到日志文件。出错时能够看到脚本卡在哪一个文件、哪一个操作。VBA里可以用简单的写入方式Dim fso, logFile Set fso CreateObject(Scripting.FileSystemObject) Set logFile fso.OpenTextFile(D:\AutoTask\log.txt, 8, True) logFile.WriteLine Now - file.Name - 修改Length完成 logFile.Close这段代码的思维是“记录但不中断”参数里的8表示追加写入True表示文件不存在时自动创建。日志里不要只写“成功”还要写当前处理的文件名和关键参数值否则第二天看日志时根本不知道这批数据对应哪版模型。把日志当成后悔药是我在工作中最深刻的教训。6.3 一张回归清单保你升级后不崩每次给脚本或CAA模块升级至少用下面几条做回归验证点通过条件参数修改范围修改后的模型尺寸与预期偏差小于0.001毫米单位换算英制模板下长度值正确保存兼容性另存的文件能被原始版本CATIA打开批量稳定性连续处理50个文件无内存增长版本差异在最低支持版本上运行结果一致我习惯把清单放在脚本同目录的README里每次升级时逐项勾选。很多二次开发项目最后失控都是因为“能跑”和“可信”之间没有一条验证线。说到底CATIA二次开发的门槛不在语法而在对CATIA对象模型的理解和对边界条件的敬畏。愿你少踩我踩过的坑希望帮到你。本文还有配套的精品资源点击获取