ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CATIA二次开发必备:用Search方法实现VBA批量选择与自动化

CATIA二次开发必备:用Search方法实现VBA批量选择与自动化 做CATIA二次开发的都知道你真正开始写自己的脚本时第一件想撞墙的事情往往不是写不出逻辑而是找不到要怎么选中那一堆元素。手动点几十下鼠标选目标再回代码敲一个固定名字的字符串这种办法在小零件上还能忍碰到装配体或者几千个特征的零件时效率直接崩盘。而CATIA自带的一个“老古董”功能——Search恰恰是所有批量选择问题的最优解。我最早是在做风扇叶片的批量特征清理时被逼着用起来的后来发现VBA和VBS脚本里各种批量改名、批量删特征、批量导出数据的活都是围着Search在转。这篇东西适合两类人看一类是刚接触CATIA VBA连宏录出来都磕磕绊绊的新手另一类是已经能用Selection.Add写点自动化但始终没把“搜索”这块吃透、每次都在找特征上耗费大量时间的开发者。我会把Search的原理、语法、实战场景和踩坑经验全部揉在一起讲尽量不说废话代码都是可以直接拿来跑的。1. 为什么用VBA搞CATIA二次开发一个老工程师的入坑路径1.1 CATIA VBA/VBS开发的基本盘CATIA V5从很早的版本开始就内置了一套自动化接口叫做CAA VBA说白了就是允许你用编程的方式去操作CATIA里几乎所有对象。你不用装任何额外的SDK只要电脑里有CATIA打开VBA编辑器就能开始写脚本。这套接口在CATIA里可以通过两种方式使用一种是在CATIA内部打开宏编辑器直接跑VBA宏另一种是用外部的VBScript脚本文件通过COM方式连接CATIA进程运行。无论是哪种方式核心对象模型几乎没有差别无非是一个在进程内跑一个通过GetObject去外层连。我自己的感觉是对于多数工程师来说VBA已经足够应付日常工作。你不需要理解类工厂、接口继承这种底层概念只需要记住几个核心对象的层级关系ApplicationCATIA程序→Documents所有打开的文档→Document当前文档→Selection当前选择集→ 各种几何对象Part、Sketch、HybridShape等等。当你脑子里面把这棵对象树理清楚写脚本时就不会满头问号为什么我给这个对象取不到名字为什么这个Selection不能直接Add进去原因基本都是你挂错了层级。1.2 弄清VBA和VBS的差别再动手很多人一开始容易把VBA和VBS搞混以为是同一个东西换了个后缀。VBA是内嵌在CATIA环境下的宏代码它需要打开CATIA的宏编辑器来运行可以调用CATIA自身的API也可以引用Excel等COM组件调试非常方便逐行执行、看变量值都很顺手。VBS则是纯文本脚本文件.vbs通过cscript或wscript执行它不依附于CATIA内部环境但同样能通过COM连上CATIA。对只做内部自动化的人来说我建议先掌握VBA因为调试真的舒服太多等你写好了VBA其实大部分逻辑可以直接转成VBS发布给其他人用方便之处在于客户不需要打开宏编辑器双击脚本就能跑。举个例子同样是连接CATIAVBA里你通常直接就在CATIA的宏环境里不需要写连接代码但VBS脚本里你得先确保外面有一个CATIA进程在跑然后写Dim CATIA On Error Resume Next Set CATIA GetObject(, CATIA.Application) If CATIA Is Nothing Then MsgBox 请先打开CATIA再运行本脚本 WScript.Quit End If这一小段“检测CATIA是否存在”的代码放在VBS里是铁打的前缀但在VBA内部你完全可以忽略这一步因为宏本身就是CATIA在跑。经验之谈不要一上来就学VBS。先在VBA环境里把逻辑调试好调通后再考虑要不要导出成VBS给别人用。省下的时间足够你多写三个功能模块。1.3 从宏录制开始让CATIA替你先写好代码每个第一次接触CATIA VBA的人我都推荐先干一件事打开宏录制手动操作一遍你想自动化的流程然后看CATIA给你生成了什么代码。这一步对新手来说价值极高比看十遍语法文档都有用。具体操作在CATIA的菜单栏找到“工具”→“宏”→“开始录制”选择录制语言为VBA然后手动做一遍操作比如选中某个特征、改个名字、再新建一个几何体完毕后停止录制宏编辑器会弹出一段录制代码。你会惊讶地发现CATIA把每一个鼠标点击都翻译成了对应的对象调用。虽然录出来的代码往往又长又机械比如选择元素时它会硬编码Selection.Add并指定具体对象名很难直接复用但它是你理解CATIA对象模型最好的“翻译机”。我早期很多脚本的框架都是从录制代码改出来的——保留其中的结构把固定的对象名换成变量把重复的步骤套进循环。当你做到这个程度就会自然遇到一个瓶颈录制出来的代码只能处理“当前已经选中的东西”或者只能按固定名字找元素。这时候Search就该出场了。2. Search方法到底是什么一次讲清原理和语法2.1 Search在CATIA自动化对象里的位置CATIA提供了两种跟“搜索”相关的入口用的时候很多人会混淆一个叫Selection.Search作用是把符合搜索条件的元素直接加入当前选择集。也就是说执行完它CATIA界面里那些元素就真的被“选中”了你会看到它们高亮显示。这也是最贴合“批量选择”需求的方法。另一个叫Document.Search它返回一个搜索结果的集合对象适合你不需要改变界面选中的状态、只想在后台拿到符合条件的元素列表做进一步处理的情况。这个返回值往往没有录制宏里那么直观用的时候需要去遍历结果集。实际写脚本时如果你的目的就是“让某些元素在界面上被选中之后人工处理”直接用Selection.Search最省事如果你要让程序自己拿到这些元素然后继续循环改名、删除、导出建议这两种方法配合或者干脆用Selection.Search选中后再通过Selection对象一个接一个取出来。我下面讲的批量操作核心就用Selection.Search因为它把“搜索”和“选中”两个动作合并了代码最简短。2.2 Search的查询语法Name、Type、颜色、层Search的核心是那个查询字符串。CATIA内部有一个类似数据库检索的语法你可以在手动执行“编辑”→“查找”时看到同样的规则。常用的条件大概有这几种按名称搜索Name*零件*支持通配符*代表任意一串字符?代表单个字符。比如NameSketch*能搜索所有以Sketch开头的元素。按类型搜索TypeSketch可以限定只搜索某个类型的对象比如草图、平面、点、曲线、曲面。需要注意的是CATIA里的类型名有时和我们习惯叫法不太一样最好的办法是先手动选中一个元素用VBA把它的Type打印出来看看。按颜色搜索Color255,0,0可以让满足颜色条件的元素全被选中这在清理图纸、查找错误提示标记时特别好用。按图层搜索Layer1适合有绘图标准、图档图层规划清晰的团队。组合条件在实际项目中用得最多的是组合条件比如Name*孔* And TypeSketch含义是查找名称中含有“孔”且类型为Sketch的元素。组合条件的语法在不同CATIA版本里稍有差异有的版本对And、Or支持得很好有的则需要用分号或者其他分隔符。遇到不确定的情况建议先在“查找”对话框里手动验证一次再搬到代码里。一个我反复跟身边同事强调的点Search条件永远用精确中带通配不要图省事直接搜Name*。因为遍历全部元素得到的结果非常庞杂很多内部辅助几何体、隐藏元素也会被搜进来一旦Selection里混入奇怪的东西后续批量操作轻则报错重则误删。2.3 Search与Selection的关系搜索是一回事选中是另一回事写脚本的人最容易迷糊的就是搞不清Search和Selection之间的关系。简单记一句话Search是过滤器Selection是结果集。Search负责按照你给的条件把元素筛出来而筛出来的元素具体怎么用、怎么进入你的选择列表则取决于你用的是哪个方法。如果你调用的是Selection.Search xxx那CATIA会直接把这个搜索条件作用到当前文档上把命中对象全部选进当前Selection。这时候Selection.Count的值会变成命中元素的数量你可以马上遍历处理。如果你调用的是Document.Search那你得到的是一个独立的结果对象界面上的高亮选择状态完全不改变。这种后台模式在处理装配体里成百上千个零件时尤其有优势因为界面没有被选择集拖累渲染也不卡。这里给个小建议不需要批量高亮展示的时候能不用Selection.Search就不用。因为一旦搜索到上万个对象CATIA界面会疯狂刷新高亮脚本执行速度会肉眼可见地降低。后台搜索集合处理完之后一次性提交会快得多。3. 实战用Search批量选择并处理零部件的完整流程3.1 准备环境连接一个正在运行的CATIA会话正式写代码之前先把环境准备好。在CATIA内部打开宏编辑器工具→宏→宏...→创建选择语言VBA新建一个模块。如果你要在模块里写VBA通常可以直接引用CATIA这个全局对象也可以稳妥一点用显式连接的方式Dim oCATIA As Object On Error Resume Next Set oCATIA GetObject(, CATIA.Application) If oCATIA Is Nothing Then Set oCATIA CreateObject(CATIA.Application) oCATIA.Visible True End If On Error GoTo 0注意GetObject拿到的是已经打开的CATIA进程CreateObject是在没有进程时新建一个。我通常倾向于优先Get因为新Create的CATIA是个空壳你还要自己手动去打开文件反而不方便。对于要跑的零件先用CATIA打开它再运行脚本即可。连接好之后获取当前激活文档和选择集Dim oDoc As Document Set oDoc oCATIA.ActiveDocument Dim oSel As Selection Set oSel oDoc.Selection这里有个隐藏的坑如果CATIA当前激活的不是零件文档Part而是图纸或装配体就会导致后续搜索范围不对。所以最好先判断一下文档类型If oDoc.Type Part Then MsgBox 请先激活一个零件文档 Exit Sub End If3.2 按名称批量选择一行代码代替手工点击假设场景一个风扇叶片的零件里有好几个名字带“叶片”的曲面或实体你想一次性把它们全选出来手动点要半天而且名字可能带编号一个个找很容易漏。换成Search一行就搞定oSel.Clear oSel.Search Name*叶片* MsgBox 选中的元素数量 oSel.Count执行完CATIA界面里所有名字含“叶片”的元素都会被高亮选中。这时候你可以直接手动在界面上处理也可以在代码里继续往下走。如果要选中的是某类特定名称的草图可以把条件组合一下oSel.Search Name*叶片* And TypeSketch我实测下来这种“名称类型”的组合条件命中率最准能过滤掉不少名字类似但根本不是目标的干扰元素。另外提醒一句Search匹配名字时是大小写敏感的如果你不确定目标名称的准确大小写先手动在特征树里看一遍或者用多一个Or条件兜底。3.3 按类型批量选择几秒挑出所有草图、平面或参考点更多时候你其实不需要知道名称只需要按类型把元素全部捞出来。比如一个复杂的曲面零件里几十个草图零散分布在各处你想全部选中然后一起隐藏。这时候按类型搜索是最无脑的oSel.Clear oSel.Search TypeSketch如果只想选平面oSel.Clear oSel.Search TypePlane这儿需要注意一个问题CATIA中的“平面”分很多种来源有基准平面也有基于坐标系的偏移平面还有拉伸体表面。Type搜索抓取的可能是不同类型不一定每个都是你想要的平面。我的经验是先跑一次类型搜索然后再配合名称或颜色条件二次过滤。比如oSel.Clear oSel.Search TypePlane And Color255,255,0这样能最大程度避免把乱七八糟的东西都选进来。3.4 把搜索结果交给Selection并批量改名Search选中的元素最终是要被程序拿去用的。最常见的批量操作之一就是批量改名。举个例子一个夹具零件里面有几十个名为“Point.1”“Point.2”之类的参考点你想统一改成“定位点_1”“定位点_2”这种规范命名手工改半个小时脚本跑起来却只需要几秒。核心逻辑分三步第一步用Search把目标点全选进Selection第二步遍历Selection里的每个元素通过Reference或者Name取到对象第三步用Object.Name赋值改名。这里给出一个简化的VBA示例Public Sub RenamePointsBySearch() Dim oCATIA As Object Set oCATIA GetObject(, CATIA.Application) If oCATIA Is Nothing Then Exit Sub Dim oDoc As Document Set oDoc oCATIA.ActiveDocument If oDoc Is Nothing Then Exit Sub Dim oSel As Selection Set oSel oDoc.Selection oSel.Clear oSel.Search TypePoint Dim i As Integer Dim oItem As Object For i 1 To oSel.Count Set oItem oSel.Item(i) If InStr(oItem.Name, Point) 0 Then oItem.Name 定位点_ i End If Next MsgBox 完成共改名 oSel.Count 个元素 End Sub这段代码里最值得留意的是InStr判断。你直接用Search把Point抓进来里面可能混着不少辅助点、圆心点、交点直接全部改名会把名字改得乱七八糟。加一个名称判断只处理名字里含有“Point”特征的点其他地方改名时留个心眼。对命名规范要求高的团队我还建议在批量改名后加个日志输出把“老名字→新名字”的对应关系记录到Excel或者文本里方便溯源和审计。3.5 一个小优化用SelectElement2做交互确认有些场景下你不想让程序一次性把所有元素全选而是希望弹出类似“是否选中该元素”的交互确认这时候可以用Selection.SelectElement2方法它能弹出一个自定义提示框让用户在当前文档中手动点选目标元素然后返回是否成功。这个适合做一些半自动化的批量处理流程比如你搜索出候选清单然后让操作人员决定点哪一个。不过要说句实在话SelectElement2的效率远没有Search高能用Search批量处理就别用交互式点选。它适合的是那些搜索条件实在写不出来、必须靠人工判断的场景属于保底方案。4. 踩坑记录和排查思路含速查表4.1 最常见的五个麻烦这些坑我基本都踩过每次都是花大把时间在调试上。整理成速查表方便你对照着查现象常见原因解决思路Search执行后一个元素都没选中查询条件太严格或写错先用“查找”对话框验证语法逐步放宽条件Search报类型不匹配文档不是零件文档或当前激活文档不对判断文档类型切换到Part文档再执行选中了一堆奇怪的对象通配符太宽或没有加类型过滤增加Type条件再加颜色/图层二次过滤Selection.Count为0但界面高亮正常在后台模式使用了Document.Search改用Selection.Search或者从返回集合里取Count循环处理时Selection状态变掉了处理过程中调用了会清空Selection的命令先把搜索出来的对象引用存到数组里再统一处理4.2 搜索语法写错了怎么办Search的语法不像SQL那么统一不同CATIA版本之间也有细微差别最常见的问题就是用了全角符号或者把And写成了AND、漏了空格。遇到搜索无效时我的排查顺序是手动打开“工具”→“查找”对话框把Search的字符串原样粘贴进去看能不能查出东西。查不出来就说明语法或者条件本身有问题。用VBA写个调试脚本把当前文档里所有元素的Name和Type打印到文本文件看看你目标元素的真实名称和类型到底是什么。这一步90%能解决“以为名字是A实际名字是B”的问题。检查串里的空格。CATIA的搜索条件一般是条件值等号两边不需要空格但如果你用And拼接多个条件And前后要有空格否则会被当成名字的一部分。调试小技巧用Selection.Search搜索后马上在CATIA界面看一眼选中的内容能直观判断是不是自己想要的。如果搜出来东西但很奇怪立即Selection.Clear清空再换条件试不要继续往下处理。4.3 在装配体里搜索零件要注意引用链Search在单个Part文档里很好用一旦跑到装配体Product里就会遇到一个经典麻烦你通常不能直接在一个ProductDocument的Selection上搜索到下一级零件内部的特征。这是因为装配体里的特征是挂在Part文档下的名称和路径都和顶层文档隔了一层。解决的思路有两种。第一种是遍历装配体下的Products逐个取得它的ReferenceProduct或者Part然后对每个Part执行搜索。代码结构大致是Dim oProductDocument As ProductDocument Set oProductDocument oCATIA.ActiveDocument Dim oProduct As Product Set oProduct oProductDocument.Product Dim oChildProduct As Product For i 1 To oProduct.Products.Count Set oChildProduct oProduct.Products.Item(i) Dim oPart As Part Set oPart oChildProduct.ReferenceProduct.Parent 这里的取法要根据实际对象树调整 对 oPart 执行 Search 或遍历 Next第二种方式更适合一个链条稳定的场景直接用Selection.Search配合CATIA的“跨装配搜索”选项但跨装配搜索能否顺利取决于CATIA配置和文档关联方式并不是总能成功。稳妥起见我建议走遍历Products的路线虽然代码写起来繁琐但对各种装配体结构的兼容性是最好的。4.4 超实用调试技巧把搜索结果写到文本文件里调试Search条件时最好的帮手不是弹窗提示而是把结果明细写到文本文件。这个方法能让你看到一个搜索条件下到底选中了什么避免被界面高亮误导。可以用VBA内置的Open For Output语句也可以引用Scripting.FileSystemObject来写文件。下面这段代码会把当前Selection里所有元素的名字和类型写到C:\SearchResult.txtDim fso As Object Set fso CreateObject(Scripting.FileSystemObject) Dim ts As Object Set ts fso.CreateTextFile(C:\SearchResult.txt, True) Dim i As Integer For i 1 To oSel.Count ts.WriteLine 名称: oSel.Item(i).Name | 类型: oSel.Item(i).Type Next ts.Close这种输出非常适合批量处理前的“侦察”你先跑一遍看看Search抓进来的元素有哪些、是不是纯净、有没有混入奇怪的东西。确认无误后再继续写后续的批量改名、删除或导出逻辑。我后来甚至把它封装成了一个公共函数任何脚本需要确认搜索结果时都调它一次省下来大量排查时间。5. 再往前一步Search还能配合哪些玩法5.1 批量删除杂乱草图和构造线拿到别人交过来的三维模型最烦的就是特征树里堆了一堆无名草图和隐藏构造线。这些元素不影响实体但会让模型体积变大、后期修改时眼花缭乱。这时候用Search批量清理非常爽oSel.Clear oSel.Search TypeSketch And Name*草图* 确认筛选结果无误后遍历并删除 Do While oSel.Count 0 Set oItem oSel.Item(1) Set oRef oDoc.Part.CreateReferenceFromObject(oItem) oDoc.Part.HybridBodies.Item(1).Remove oRef 实际删除API需按你的对象层级调整 oSel.Remove 1 Loop当然这个删除操作危险性很高务必做好备份先跑一轮“只计数不删除”的版本验证搜索结果。5.2 结合颜色搜索做图纸清理CATIA里颜色不仅是显示设置更是很多团队管理状态的标识。比如图纸中所有红色标注表示待修改黄色表示问题绿色表示已完成。用Search按颜色筛选把这些元素全部选出来然后根据状态批量修改属性自动化程度直接拉满。我做过一个实际案例来自其他供应商的三维模型里有大量非标准颜色的面导致BOM导出后外观识别很混乱。我用Search把颜色不是标准灰色的面全部搜索出来然后批量改成标准颜色。以前人工处理需要一下午的工作量脚本处理不到一分钟。5.3 结合参数和测量做质量检查Search不仅能搜几何元素还能配合参数和测量做质量检查。比如你怀疑某个零件里包含一批直径过小的孔想快速定位出来可以把所有孔特征通过Search选中然后遍历它们的Diameter参数把小于标准值的孔筛选出来生成报告。这种方式不改变模型纯粹在后台做数据体检非常适合交接模型前的最后把关。实现时核心是Search选中元素 → 遍历每个元素的Parameters集合 → 查找Diameter参数或调用测量接口获取数值 → 判断并输出异常。这里有个提高效率的技巧不要频繁调动CATIA测量命令因为测量命令调用一次就是上百毫秒上千个元素跑下来非常慢。能直接读取参数数值的尽量读取参数只有读取不到时才兜底用测量。5.4 批量导出元素数据配合FSO导出CSVSearch最实用的远程联动玩法是把选中的元素信息导出成CSV或Excel汇总表。比如我要统计一个装配体里所有紧固件的名称、数量、材质、重量就可以先用Search按名称关键字把所有紧固件选出来然后逐一遍历把属性数据写入CSV。配合前文说的FileSystemObject导出整个过程完全自动化还能定期跑一遍用来监控设计变更。代码的大致套路是Search出目标元素 → 遍历获取属性 → 拼装字符串 → 写入CSV。这个套路和写日志文件很像只是输出格式更规整。要注意的是大批量写入时最好先攒在字符串变量里一次性写入而不是每写一行打开一次文件不然速度会被文件IO拖垮。在我个人看来Search这个功能最大的价值不是“能搜东西”而是它帮你打破了手工逐个选择的思维定式。以前你想批量处理元素第一反应是“我该怎么循环选中它”现在有了Search你的第一反应变成了“我怎么描述我要处理的这批元素”。一旦切换到后者很多自动化需求立刻变得简单起来。希望这篇东西能让你少走几个弯路也欢迎在实际项目里多去挖一挖Search的潜力——它远比看起来那点搜索功能能做的事情多得多。
返回列表