ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Polyworks脚本开发入门:环境搭建与第一个自动化宏

Polyworks脚本开发入门:环境搭建与第一个自动化宏 做三维测量的朋友应该都有过这种经历来了一批新零件要挨个加载CAD模型、对齐基准坐标系、跑一遍检测路径、再导出一份PDF报告整套手动操作下来快则十分钟慢则半小时批量件一多一天大半时间都耗在重复点击上了。Polyworks的脚本开发说白了就是把这套重复流程打包成一段能自动执行的动作序列点一下按钮Polyworks自己替你把活干完。这篇文章是这套学习笔记的第一篇我先把最基础的脚本开发环境讲透——包括宏编辑器在哪、脚本文件怎么组织、Polyworks的对象模型大概是什么结构以及怎么让第一段脚本真正跑起来。内容不深但保证每一步都是我在实际配置环境中踩过、验证过的。如果你是刚接触Polyworks脚本开发或者之前只听说过polyworks宏这个概念但不知道从哪下手这篇笔记应该能帮你省掉不少摸索时间。1. 为什么在Polyworks里动手写脚本测量流程自动化的第一公里很多用Polyworks的人第一反应都是我手工操作已经很熟了学脚本有什么用。这话没错手工操作确实灵活遇到异常情况随时能停下来处理。但问题在于检测工作里真正耗费时间的往往不是需要临场判断的那部分而是大量不需要动脑子的机械操作。1.1 手工流程里哪些活最值得自动化我按日常检测场景梳理了一下大概可以分成四类操作类型手工耗时单个零件典型频率自动化收益加载数据CAD模型、扫描点云1~3分钟每个零件/批次高且很容易出错对齐基准RPS、最佳拟合等3~10分钟每个零件最高直接费人工执行检测路径/特征测量2~5分钟每个零件高可批量串联导出报告PDF、CSV1~2分钟每个零件中但纯机械这四类操作加起来占了单个零件检测时间的一大半。更关键的是这些操作模式固定、参数可提前定义天然适合用脚本固化。这就是Polyworks脚本开发最直接的价值入口。1.2 Polyworks脚本的技术底子VBScript和COM对象模型Polyworks里提到的宏Macro底层用的是VBScript语言运行在微软的COM/Automation组件体系上。直白点说Polyworks把自己内部的很多功能模块包装成了对象暴露给脚本调用脚本通过这套接口操作软件和你在界面上点鼠标的效果是一样的但速度更快、不会疲劳、不会点错。这个技术选型带来的好处非常实际不需要装开发环境。Polyworks装了之后脚本用系统自带的记事本或者VSCode就能写不需要额外安装编译器。不需要编译。.vbs文件改完直接运行改个参数马上能看效果调试成本极低。和Windows脚本体系天然兼容。系统VBScript引擎直接解析运行可以被其他自动化任务调度。当然这套方案也有它的老派之处比如对象调用有时不够直观、报错信息比较晦涩这些我在后面专门讲。1.3 和易语言大漠这类Windows界面自动化脚本有什么本质不同有朋友问过我Polyworks脚本开发和易语言大漠脚本开发这类Windows界面自动化是不是一回事。这个区别一定要搞清楚否则方向就偏了。易语言配合大漠插件走的是窗口句柄坐标定位键鼠模拟的路线脚本在屏幕层面模拟人的操作点击某个坐标、发送按键、识别屏幕区域。这种方式的好处是通用什么软件都能模拟缺点是稳定性受环境干扰大——窗口位置变了、分辨率改了、界面卡顿一下脚本可能就乱了。Polyworks的宏走的是另一条路Polyworks主动提供了COM接口脚本直接调用软件内部功能对象相当于在软件内部开了一个后门通道。不依赖屏幕坐标不需要模拟鼠标即使窗口被遮挡、最小化脚本照样能执行。这也是测量自动化场景里必须用软件原生脚本而不是界面模拟的根本原因。2. 搭好脚本开发的工作台宏编辑器、宏文件与安全设置很多人以为写Polyworks脚本前要先装一堆工具其实不用。Polyworks本身已经把宏的入口做进了软件里你要做的只是把它找出来、配置好。2.1 宏编辑器和宏录制器在哪里找以我手头常用的Polyworks版本为例打开Polyworks Inspector不同版本叫法略有差异Modeler、View等模块界面也类似在菜单栏找到 Tools工具菜单下面通常有 Macro宏这一项点开会有Macro Commands宏命令执行已保存的宏文件Record a Macro录制宏一边操作界面一边生成脚本Play a Macro播放宏运行指定脚本Open Macro Editor打开宏编辑器直接查看和编辑脚本内容不同版本菜单的英文名称可能不完全一样比如有的版本把宏功能统称为 Macros有的版本放在 Automation 下的子菜单里。判断的办法很直接在菜单栏里找带Macro或Record关键词的入口一般就是。2.2 从录制宏开始而不是从写代码开始新手最容易踩的坑是上来就想纯手写代码。我对所有刚入门的同事都建议同一句话先用录制宏功能做一遍你熟悉的操作然后去看录出来的代码。举个例子。我想录一段加载一个STL网格模型的操作流程是在Polyworks里点 Tools Macro Record a Macro给宏起个名字比如 LoadMesh按平时的方式执行操作File Import 选择STL文件 确认导入参数操作完成后点 Tools Macro Stop Recording保存宏文件打开宏编辑器查看生成的代码录出来的代码往往很长有很多界面操作对应的参数设置但它把最关键的对象调用方式原原本本展示给了你哪个对象负责导入、哪个方法处理文件路径、哪个参数控制坐标系。这些信息在帮助文档里翻半天可能都找不到但录一遍宏答案全在眼前。2.3 脚本文件的保存、编码与统一管理Polyworks的宏文件本质上就是纯文本VBScript文件扩展名一般用 .vbs也可以用 .txt 保存后手动指定解释方式。保存时有一个必须注意的坑编码问题。如果脚本里有中文注释、中文弹窗内容建议用系统默认的ANSI中文Windows下即GB2312/GBK编码保存用UTF-8编码保存时某些Polyworks版本或旧版Windows脚本宿主解析中文会乱码甚至直接报语法错误。不同版本表现不一样我不能一概而论但如果你遇到了脚本第一行莫名报错注释乱码这类问题先去看文件编码。另外宏文件的管理建议单独建一个目录比如D:\Polyworks_Scripts\按功能分类存放。不要放在Polyworks的安装目录里——重装软件、更新版本时容易误删放独立目录更安全。2.4 Windows侧的准备确认VBScript可用Polyworks脚本依赖Windows自带的VBScript运行环境绝大多数Windows系统默认就是可用的。如果你双击.vbs文件没反应或者运行时报无法找到脚本引擎一般需要检查两件事系统是否被安全软件禁用了脚本宿主Windows功能里VBScript相关组件是否被关闭确认的办法很简单写一行MsgBox test存成 .vbs双击运行。如果弹出对话框说明脚本宿主正常。这一步最好在装脚本环境的第一天就做掉免得后面误判是Polyworks的问题。3. 理解Polyworks对象模型脚本能摸到的那些对象VBScript本身不神奇真正让Polyworks脚本有力量的是它背后的对象模型。这部分我尽量讲得通俗因为你理解了多少对象模型基本决定了你能写出多复杂的脚本。3.1 核心对象的分层结构Application到Mesh把Polyworks的对象模型想象成一家公司的层级Application应用对象相当于整个公司是脚本的入口。脚本要先获取到Application对象才能进一步做事。Module模块对象相当于具体的业务部门比如检测模块、建模模块。每个模块负责一类具体功能。Study/Document项目/文档对象相当于当前正在处理的一个业务合同对应你在Polyworks里打开的一个测量项目文件。Objects对象集合相当于这份合同里涉及的所有资产清单网格、特征、坐标系、尺寸标注都在这个集合里。Mesh、Feature等具体对象相当于清单里的每一条具体资产比如一个三角网格模型、一个平面特征。脚本的调用路径通常就是沿着这条链往下走先拿到Application再从Application拿到当前Module再从Module拿到Objects集合最后操作集合里的具体对象。3.2 从录制宏反推对象调用逻辑最快的入门方法还是说回录制宏。录一段操作后你会发现代码经常长这样这是模拟示意具体对象名以你录出来的为准Set gApp CreateObject(Polyworks.Application) gApp.Connect Set gModule gApp.GetActiveModule Set gObjects gModule.Objects gObjects.ImportFile D:\demo.stl看到没有录制宏把App → Module → Objects这条调用路径完整展现出来了。你不需要去背对象模型文档只需要多录几种操作——导入模型、手动对齐、执行检测、导出报告——然后把这些代码放在一起对比很快就能总结出Polyworks对象调用的套路。我个人的经验是前两周时间不要急着写代码就是反复录制→阅读→改参数→运行把常见操作对应到代码上。等你录像录够了自然就能脱离录制直接手写脚本了。3.3 连接Polyworks应用Connect的时机和位置所有Polyworks脚本里几乎都有一个固定的开场动作——连接应用Dim gApp Set gApp CreateObject(Polyworks.Application) gApp.Connect这里有两个非常关键的细节新手经常在此翻车第一必须用Set关键字。VBScript里对象赋值和普通变量赋值不一样普通变量用直接赋值对象必须用Set。第二Polyworks必须已经启动而且在Connect之前不能是未打开任何模块的空状态。有几次我图省事先开了Polyworks但没进任何模块直接跑脚本结果Connect报错或者后面取Module时拿到的是Nothing。所以实际跑脚本前先把Polyworks打开并且进入对应的工作模块比如Inspector模块让软件处于正常待操作状态再运行脚本成功率最高。4. 第一个能跑的脚本连接Polyworks、读取工作区信息环境准备到位对象模型脑子里有点概念了就该上手写第一个脚本了。我的建议是第一段脚本不要追求功能先验证环境通不通。4.1 环境验证脚本连接与弹窗打开记事本或VSCode新建一个文件输入以下内容保存为HelloPolyworks.vbs Polyworks脚本开发学习笔记 - 环境验证脚本 Dim gApp Set gApp CreateObject(Polyworks.Application) gApp.Connect MsgBox Polyworks连接成功运行方式有两种在Polyworks的宏编辑器里直接打开这个文件然后执行在Windows资源管理器里直接双击 .vbs 文件如果一切正常屏幕上会弹出一个Polyworks连接成功的对话框。这一步通过说明你的VBScript运行环境、Polyworks COM接口、脚本文件编码全部正常可以进入下一步了。4.2 让脚本看见当前模块和里面的对象连接成功之后我们可以写一段稍微有点实际用途的脚本读取当前模块里对象的数量和名称。Dim gApp Dim gModule Dim gObj Dim i Set gApp CreateObject(Polyworks.Application) gApp.Connect 获取当前激活的模块 Set gModule gApp.GetActiveModule If gModule Is Nothing Then MsgBox 没有获取到当前模块请先进入任一Polyworks工作模块 WScript.Quit End If MsgBox 当前模块名称: gModule.Name 对象数量: gModule.Objects.Count 遍历输出每个对象的名称 For i 1 To gModule.Objects.Count Set gObj gModule.Objects(i) MsgBox 第 i 个对象: gObj.Name Next这段脚本的意义在于让你直观感受到对象模型的存在gModule.Name是当前模块的名字gModule.Objects.Count是对象数量循环里的gModule.Objects(i)能按索引逐条取到每个对象并打印名字。4.3 常见报错类型不匹配和Set到底是怎么回事新手跑这段脚本时最常见的报错就是Microsoft VBScript runtime error: Object required或Type mismatch。原因十有八九是把对象赋值当成普通赋值写了少写了Set。 错误写法 gApp CreateObject(Polyworks.Application) 正确写法 Set gApp CreateObject(Polyworks.Application)VBScript里CreateObject返回的是一个对象引用引用必须用Set赋给变量。没写Set脚本就把这个对象当成普通值处理自然报对象必需或类型不匹配。还有种情况是gModule拿到了Nothing——比如Polyworks没有打开任何模块。所以代码里我用If gModule Is Nothing Then做了个保护判断。这算是我踩了多次坑以后养成的习惯和外部软件交互的每一环都可能因为当前状态不对而失败写好空值判断能让调试过程少掉一半头发。5. 调试脚本的三个实用手段MsgBox断点、Err捕获、日志文件脚本这东西写的时候谁都觉得自己是对的跑起来才发现软件压根不这么想。Polyworks脚本的调试手段比较原始没有VS Code里那种花哨的断点调试但够用。5.1 MsgBox当临时断点最笨也最有效的调试方法就是脚本里到处塞MsgBox在关键步骤后弹出当前变量的值确认程序执行到了哪里、变量是不是预期值。比如你怀疑gModule.Objects.Count取到的数量不对就在它后面加一句MsgBox 当前对象总数 gModule.Objects.Count弹窗显示的数字和实际不符说明问题出在上游比如连接错了对象、模块没切换对数字正确但后续处理出错说明问题出在下游。这种分而治之的排查思路比盯着代码干想快得多。5.2 On Error Resume Next 与 Err对象配合Polyworks脚本跑自动化批次时最怕的是运行到一半遇到一个异常脚本直接中断后面的对象全没处理。这时候可以用On Error Resume Next让脚本在出错时不中断再配合Err对象记录错误信息On Error Resume Next For i 1 To gModule.Objects.Count Set gObj gModule.Objects(i) gObj.DoSomeOperation If Err.Number 0 Then MsgBox 处理对象 gObj.Name 时出错: Err.Description Err.Clear End If Next On Error GoTo 0Err.Clear很重要处理完一次错误要把错误码清掉否则下个对象没出错也会被误判。这个模式在批量处理场景里几乎是标配但要记住这属于容忍错误继续跑的思路跑完一定要人工检查日志或结果不能完全当甩手掌柜。5.3 用日志文件定位批量处理中的错误批量处理几十个零件时靠MsgBox弹窗不现实——你不能在工位上盯着一路点确定。我的做法是写日志。简单的日志函数可以在脚本里自己拼Sub WriteLog(strMessage) Dim fso, logFile Set fso CreateObject(Scripting.FileSystemObject) Set logFile fso.OpenTextFile D:\Polyworks_Scripts\run_log.txt, 8, True logFile.WriteLine Now - strMessage logFile.Close End Sub脚本关键步骤后面都调用WriteLog比如开始加载零件1零件1对齐完成零件1报告已导出以及任何错误信息。跑完整个批次后打开日志文件扫一遍谁成功谁失败一目了然。这个习惯强烈建议从写第一个正式脚本时就养成。5.4 一张表看懂几个高频报错报错提示常见原因处理方向Object required没写Set或对象是Nothing检查赋值语句加空值判断Type mismatch把对象当字符串/数字用确认变量类型检查下标ActiveX component cant create objectCOM组件注册异常确认Polyworks安装完整尝试重新安装/修复Permission denied文件被占用或路径无权限检查日志文件是否被Excel等程序占用中文乱码或第一行语法报错脚本文件编码问题改用ANSI/GBK编码保存6. 给后续学习铺路录制—改造—封装以及其他建议第一篇环境篇的最后我想聊聊学习节奏。Polyworks脚本开发说难不难但很多人学着学着就放弃了原因是目标定得太高一上来就想写一个全自动检测脚本。我给自己的节奏是录制—改造—封装三步走你可以参考。6.1 以录制为核心的学习闭环第一步永远是录制无论你想实现什么功能先手动操作一遍把宏录下来。录制可能生成几十行代码没关系先让它跑通。第二步是改造。把录出来的代码里写死的路径、名称提取成变量用参数代替。比如原来导入的是D:\demo.stl改成接收一个文件路径参数这样它就能处理任意零件。第三步是封装。把一段功能独立成一个函数或子程序输入输出标准化。比如写一个LoadAndAlign cadPath, scanPath的子程序以后每次检测直接调用不用重复贴代码。6.2 第一批值得实现自动化的小场景如果你不确定从哪里开始练手我建议从这五个小场景选一个批量导入模型遍历一个文件夹下所有STL文件全部导入Polyworks自动对齐对一个零件执行固定的RPS对齐流程输出对齐后的偏差值报告导出把当前项目的检测结果导出为PDF并自动命名保存数据整理将多个零件的检测结果汇总输出到一个CSV文件批量批处理一串零件按固定流程跑完导入-对齐-检测-导出全程每个场景都不复杂但做完之后你会对对象模型和API有非常扎实的理解后面再学新功能就是顺水推舟。6.3 环境搭建时我的三个个人建议最后说几条我实际踩过坑后整理出来的建议都属于没有人告诉过你但很有用那种第一脚本目录里放一个_Template.vbs模板文件。把连接Application、获取当前模块、写日志函数、错误处理框架都写好每次新写脚本都从这个模板复制能省掉大量重复劳动。第二Polyworks的宏编辑器虽然能用但写代码体验一般。我习惯在VSCode里写好脚本然后到Polyworks里运行。VSCode装一个VBScript语法高亮插件看代码舒服很多不容易犯低级语法错误。第三运行前先看一眼Polyworks窗口的状态。有没有打开项目当前激活的是不是你要操作的模块这些环境状态问题占了我早期脚本报错原因的很大比例。脚本不会看你的软件开在哪一步它只会按代码逻辑去拿对象拿不到就报错。我在实际配置环境时最有感慨的时刻是第一次绕过界面手动操作、用脚本一口气跑完一整批零件的时候。那种终于解放双手的轻松感和之前熬夜看进度条的心情完全两样。当然环境搭建只是Polyworks脚本开发的第一课接下来的学习方法应该是带着你手头最痛的一个重复性操作去录制、去改造、去封装把这套工具真正用起来。
返回列表