过去两个月我一直在折腾一件看起来有点“跨界”的事把OpenClaw这个开源智能体框架和SolidWorks的编程接口串成一条自动化流水线。目的很直接——不想再一遍遍地打开软件、点鼠标、重复画同一个形状而是让AI替我拆任务、算参数、跑脚本最后把画好的零件放到指定目录。这套流程跑通之后我最大的感受是CAD自动化真正的瓶颈从来不是“画图那一下”而是大量重复的、参数化的、跨系统的操作OpenClaw正好把这块短板补上了。这篇文章是完整的编程指南覆盖四块内容OpenClaw和SolidWorks各自解决什么问题、如何部署并让两边连通、SolidWorks API编程的核心逻辑、以及怎么把脚本封装成OpenClaw能调用的“技能”。还包含几个最容易让人翻车的稳定性问题和排查思路。适合三种人看会用SolidWorks但没写过代码的工程师、有Python基础但没碰过SolidWorks API的开发者、以及正在研究AI Agent落地场景的人。1. 为什么我要把OpenClaw和SolidWorks绑在一起1.1 CAD自动化一直存在但缺的不是“自动化”而是“意图理解”SolidWorks本身的自动化能力其实相当成熟。宏录制、VBA、C#插件、参数化设计表、方程式驱动的尺寸这些手段可以解决绝大部分“批量重复建模”的问题。但我在实际项目里发现一个很尴尬的断层传统自动化的前提是人已经把所有步骤拆得很细比如“选前视基准面、画一个圆心在原点的圆、直径设为200、拉伸18毫米”。一旦需求变成“给我生成一个DN100的法兰盘8个螺栓孔孔径按标准来”你就得先把这句话翻译成设计参数再手动把参数填进脚本里。这一层翻译工作恰恰是AI Agent最擅长的。OpenClaw作为一个开源智能体框架核心思路就是让语言模型通过“工具调用”去执行实际任务。你可以把它理解成一个带工具箱的车间主任收到“生成法兰盘”这种需求后它会自己拆解步骤、确定参数、调用我准备好的SolidWorks脚本再把结果整理成一句话告诉我。传统宏像是流水线工人只按固定工序干活OpenClaw更像管理者处理的是“需求到参数到动作”的整条链路。1.2 哪些场景真正值得把OpenClaw接进来我用下来感觉以下四类场景收益最大建议优先尝试标准件族批量生成法兰、轴承座、齿轮、型材连接板本质上都是“同一个模型、换一组参数”。以前的做法是在Excel里维护设计表现在可以直接用自然语言描述需求比如“把上次那个法兰改成DN80的外径其他不变”。批量格式转换比如把几十个SolidWorks模型统一导出成STEP、STL或中间格式供后续的烟道流场分析、有限元前处理或者Unity3D等可视化项目使用。这种工作没有任何设计含量但非常耗时AI来处理再合适不过。跨系统协同从BOM表、物料清单或者ERP导出的Excel里读取参数直接驱动SolidWorks生成模型。OpenClaw本身可以接入Teams、Obsidian这些工具相当于把CAD能力也变成了整个Agent体系里的一个普通技能。设计意图归档把AI生成的模型参数、建模步骤、材料信息自动整理成笔记或者文档后续改图时能快速知道当初是怎么画的。1.3 什么人能从这套方案里真正受益如果只是偶尔画一两个零件那没必要折腾这套流程手动画更快。但如果你是机械设计工程师、CAD/PLM系统管理员或者做非标自动化设备的几乎每天都要改图、出图、转格式那投入一个周末把这套东西跑通后面省下的时间会非常可观。对开发者来说这也是一个很好的AI Agent落地案例SolidWorks API边界清晰、调用结果可视化、反馈直接很适合用它来练习“如何让模型安全地调用真实世界的工具”。2. OpenClaw部署与环境连通先让两边能“对话”2.1 部署路径怎么选OpenClaw的部署方式比较灵活可以在Windows本机跑也可以部署在Linux服务器或者云主机上。它本身依赖Node.js运行时部署的基本动作就是拉取官方仓库的最新发布版安装依赖然后配置模型接入和工具目录。模型接入方面我既试过直接连云端模型也试过把qwen2.5-3b这类本地小模型挂进来。对于涉及产品设计数据的场景我更推荐本地模型——图纸信息不用出本机心里踏实。但这里有一个绕不开的现实SolidWorks是Windows桌面应用而且只能在Windows本机进程里通过COM接口被调用。如果你把OpenClaw部署在Linux服务器上它没有办法直接“碰”到SolidWorks。所以我的做法是加一个桥接层在装有SolidWorks的Windows机器上跑一个本地HTTP服务把常用的建模操作封装成REST接口OpenClaw那边注册一个“调用本地SolidWorks服务”的工具本质就是发HTTP请求。这样OpenClaw跑在哪里都无所谓只要网络能到这个Windows机器就行。2.2 Windows部署最容易卡住的WSL2校验问题如果你选择在Windows本机部署OpenClaw大概率会遇到一个很烦人的自检报错提示内容是“无法安全验证SL2环境请在PowerShell中运行 wsl -- status”。我第一次看到这个提示时一脸懵翻了半天资料才搞明白OpenClaw的Windows版本依赖WSL2来创建隔离的脚本执行环境自检时发现当前WSL状态不对就直接把整个启动流程拦住了。解决办法其实不复杂按下面几步来以管理员身份打开PowerShell先运行wsl --status看当前默认版本是什么。如果显示默认版本是1或者没有明确输出版本信息执行wsl --set-default-version 2把默认版本切到2。旧版本WSL内核也可能导致校验失败顺手执行wsl --update升级内核。关掉PowerShell窗口重开再运行一次wsl --status确认输出里明确写着“默认版本: 2”。这个校验通过之后OpenClaw才能正常启动。顺便说一句后面SolidWorks桥接脚本本身其实不需要WSL但OpenClaw整体跑不起来硅步就卡在起跑线上了。2.3 用FastAPI搭一个SolidWorks的本地桥接服务我选择的桥接工具是FastAPI理由很简单轻量、自带参数校验、接口文档自动生成。部署方式是在Windows机器上装好Python环境pip install fastapi uvicorn pywin32然后写一个服务脚本。下面是一个最小骨架用来验证“HTTP请求能从OpenClaw侧打到SolidWorks侧”from fastapi import FastAPI import win32com.client app FastAPI() def get_sw_app(): sw_app win32com.client.Dispatch(SldWorks.Application) sw_app.Visible True return sw_app app.get(/health) def health(): return {status: ok} app.post(/solidworks/new_part) def new_part(part_name: str): sw_app get_sw_app() sw_app.NewPart() model sw_app.ActiveDoc return {file: model.GetTitle(), status: created}启动后先访问/health确认服务通着再用Postman或者curl调一次/solidworks/new_part。如果SolidWorks真的弹出一个新零件窗口说明桥接成功。这个接口不必写得很全先跑通最小闭环再逐步加功能。注意这个HTTP服务建议只监听127.0.0.1不要暴露到公网。SolidWorks的操作能力等于直接控制你的建模环境宁可让OpenClaw通过本机访问也不要裸奔到外网上去。3. SolidWorks API编程的底层逻辑宏、对象模型和Python翻译3.1 对象模型先搞懂后面写代码全是查字典SolidWorks API是一个典型的COM对象模型从上到下大概是这样的层级SldWorks.Application应用对象控制软件的启动、退出、可见性。ModelDoc2也叫SldWorks.Document当前打开的文档可以是零件、装配体或工程图。SketchManager草图管理器负责创建和编辑草图实体。FeatureManager特征管理器负责拉伸、切除、阵列等特征操作。SelectionMgr选择管理器负责在模型中选面、选边、选基准面。你可以把Application想象成整个工厂ModelDoc是正在加工的一张图纸草图管理器是划线车间特征管理器是成型车间。API编程的本质就是在这些对象之间来回切换选一个基准面进入草图管理器画线回到特征管理器做拉伸然后再选中模型的某个面继续下一个特征。3.2 为什么我推荐从宏录制开始很多人第一次接触SolidWorks API上来就想直接写代码结果被FeatureExtrusion2那一长串参数劝退。我的建议是反过来先用宏录制功能“作弊”。具体做法是手动操作一遍目标功能比如新建一个零件、画一个圆、拉伸成一个圆柱然后点宏录制结束。SolidWorks会把刚才所有操作的API调用生成一段VBA代码这就是最真实、最准确的API使用说明书。举个例子手动画一个圆再拉伸录出来的VBA里可能包含CreateCircleByRadius(0, 0, 0, 0.05)和FeatureExtrusion2(...)这种调用。你不需要理解每一个参数的含义先把这段代码搬到Python里跑通然后一点一点改参数。看不懂的参数不要乱删很多都有默认值删了可能API就报错。3.3 Python操作SolidWorks的最小闭环用Python操作SolidWorks靠的是pywin32这个库它能把Windows的COM接口封装成Python对象。安装很简单pip install pywin32下面是新建零件、画草图、拉伸、保存的最小闭环代码我加了详细注释import win32com.client # 连接SolidWorks应用 sw_app win32com.client.Dispatch(SldWorks.Application) sw_app.Visible True # 新建零件并获取文档对象 sw_app.NewPart() model sw_app.ActiveDoc # 选择前视基准面并进入草图 model.Extension.SelectByID2(Front Plane, PLANE, 0, 0, 0, False, 0, None, 0) model.SketchManager.InsertSketch(True) # 画一个圆心在原点、半径为0.05m的圆 model.SketchManager.CreateCircleByRadius(0, 0, 0, 0.05) # 退出草图 model.SketchManager.InsertSketch(False) # 拉伸凸台这里参数复杂务必参考自己录制宏的结果 model.FeatureManager.FeatureExtrusion3(True, False, False, 0, 0, 0.02, 0, ...) # 保存文件 model.SaveAs3(D:/parts/test_part.SLDPRT, 0, 2)要提醒一点SolidWorks API里长度单位默认是米不是毫米。很多人第一次写脚本画出来的模型小得看不见就是单位搞错了。后面接OpenClaw时一定要在工具描述里写明单位否则模型很容易按毫米传进去按米画出来比例直接差1000倍。4. 把SolidWorks脚本变成OpenClaw可调用的工具技能注册与参数桥接4.1 技能机制的三个组成部分OpenClaw把可复用的能力称为“技能”Skill这和SolidWorks二次开发里的“插件”是两种思路。插件是给SolidWorks加的扩展技能是给Agent加的工具。一个完整的SolidWorks技能我认为至少包括三个部分技能描述用一段话说明这个技能能干什么、参数是什么、有什么约束。这段话不是给人看的是给模型看的模型根据这句话决定什么时候调用、传什么参数。参数定义以JSON Schema的形式声明每个参数的名称、类型、单位、默认值、取值范围。实现脚本真正执行SolidWorks操作的Python脚本从标准输入或命令行参数读取JSON参数。4.2 一个法兰盘技能长什么样在我的实际项目里技能目录是这样组织的skills/ solidworks_flange/ SKILL.md main.pySKILL.md里面写清楚用途和参数# 生成法兰盘 根据参数生成一个标准的法兰盘零件保存为SLDPRT文件。 ## 参数 - dn: 公称直径整数如100表示DN100 - outer_diameter: 外径单位mm必须大于inner_diameter - inner_diameter: 内径单位mm必须大于0 - thickness: 厚度单位mm - bolt_count: 螺栓孔数量整数通常为4或8 - bolt_diameter: 螺栓孔直径单位mm - bolt_circle_diameter: 螺栓孔分布圆直径单位mm ## 返回结果 JSON格式包含file_path、status、dimensions。main.py则是实现脚本从命令行接收参数对象并调用SolidWorks API。这里有一个很重要的设计原则每个技能只做一件事。不要写一个“全自动建模大师”然后传几十个参数进去那样模型很容易传错参数、难以调试。拆成“生成法兰盘”“生成轴承座”“导出STEP”这种单一职责技能OpenClaw的调用准确率会高很多。4.3 参数桥接的常见陷阱参数桥接是整个链路里最容易被忽略的一环。模型从自然语言里解析参数如果工具描述不严谨什么奇怪的事情都可能发生。我遇到过的问题包括模型把“8个螺栓孔”理解成了“螺栓孔直径8mm”。模型把bolt_circle_diameter误解为“法兰外径”导致螺栓孔全部跑到实体外面。模型没有保留单位把所有毫米值当成米传进去。解决的方法很机械但有效参数定义里把单位写进字段名比如outer_diameter_mm而不是outer_diameter描述里显式说明约束条件返回结果里带上实际的尺寸让模型能自己检查是否合理。另外一个技巧是在技能描述里给一个示例调用模型看到示例之后填参数的准确率明显提升。提示AI生成参数后脚本执行前一定要做一次参数校验。不要指望模型每次都给正确参数脚本里要有边界检查厚度小于等于0就直接拒绝执行并返回错误信息。4.4 安全边界AI可以画图但必须听话把SolidWorks交到一个AI Agent手里最需要想清楚的是安全边界。我的规则很简单但很严格路径白名单脚本只能保存到指定目录比如D:/parts/不允许通过../跳出目录。操作前备份如果技能是修改现有模型脚本先把原文件复制一份备份。禁止删除操作AI生成的技能不允许包含删除文件、覆盖原始模型的逻辑。人工审批凡是新写的技能先在测试模型上跑通确认没有危险动作之后才允许OpenClaw在生产环境调用。5. 实战让OpenClaw听懂“生成一个DN100法兰盘”5.1 需求解析结果当我在OpenClaw里输入“生成一个DN100法兰盘外径200内径110厚度188个螺栓孔孔分布圆直径170孔直径18”的时候OpenClaw生成的调用参数大致是下面这样{ dn: 100, outer_diameter_mm: 200.0, inner_diameter_mm: 110.0, thickness_mm: 18.0, bolt_count: 8, bolt_diameter_mm: 18.0, bolt_circle_diameter_mm: 170.0 }可以看到它准确地抓住了“DN100”这个公称直径概念也正确地把毫米单位放到了参数里。但请注意这只是理想的执行结果。实际使用中模型偶尔会把“孔分布圆直径”和“外径”搞混所以我反复强调工具描述里的字段命名和约束必须足够明确。5.2 桥接脚本的实现收到参数后桥接脚本开始干活。完整实现比较长我贴出核心流程细节以你自己的宏录制结果为准import win32com.client import json import sys params json.loads(sys.argv[1]) outer params[outer_diameter_mm] / 1000.0 inner params[inner_diameter_mm] / 1000.0 thickness params[thickness_mm] / 1000.0 sw_app win32com.client.Dispatch(SldWorks.Application) sw_app.Visible True sw_app.NewPart() model sw_app.ActiveDoc # 前视基准面画外圆 model.Extension.SelectByID2(Front Plane, PLANE, 0, 0, 0, False, 0, None, 0) model.SketchManager.InsertSketch(True) model.SketchManager.CreateCircleByRadius(0, 0, 0, outer) model.SketchManager.InsertSketch(False) # 拉伸成法兰主体 model.FeatureManager.FeatureExtrusion3(True, False, False, 0, 0, thickness, 0, ...) # 在上表面画内孔草图简化示意 top_face model.Extension.GetLastFeature() model.Extension.SelectByID2(top_face.Name, FACE, 0, 0, 0, False, 0, None, 0) model.SketchManager.InsertSketch(True) model.SketchManager.CreateCircleByRadius(0, 0, 0, inner) model.SketchManager.InsertSketch(False) # 切除内孔 model.FeatureManager.FeatureCut3(True, False, False, 0, 0, thickness, 0, ...) # 保存 file_path fD:/parts/flange_dn{params[dn]}.SLDPRT model.SaveAs3(file_path, 0, 2) # 返回结构化结果 result { status: ok, file_path: file_path, dimensions: params } print(json.dumps(result))这段代码里的FeatureExtrusion3参数并不完整实际使用中请先录一段“画圆拉伸再切除”的宏把宏里的参数对着抄进去。这不是偷懒而是SolidWorks API很多参数在不同版本里行为不一致宏永远是最准的参考。5.3 输出回读和验证脚本执行完之后OpenClaw不能只看一句“成功了”就结束。我习惯让脚本额外输出模型的体积和质量属性这样模型能自己验证结果是否合理。SolidWorks API里有现成的质量属性接口大致调用方式mass_props model.Extension.GetMassProperties2(0, 0, 0, 0) volume mass_props[1]OpenClaw拿到体积之后可以和理论值对比如果偏差太大它会判断“可能画错了”然后重新调整参数执行一次。这个闭环很有意思——AI不仅能执行操作还能通过结果反馈自我修正。5.4 批量导出场景从SolidWorks模型到Unity3D的流水线法兰盘只是小试牛刀。更实用的场景是批量把几十个模型导出成STEP或者STL格式供Unity3D、流场分析或者3D打印使用。我的做法是在桥接服务里加一个“遍历目录导出STEP”的技能import os import win32com.client src_dir D:/models_sld out_dir D:/models_step sw_app win32com.client.Dispatch(SldWorks.Application) sw_app.Visible False for fname in os.listdir(src_dir): if fname.lower().endswith(.sldprt): src os.path.join(src_dir, fname) dst os.path.join(out_dir, fname.replace(.sldprt, .STEP)) sw_app.OpenDoc6(src, 1, 0, , 0, 0) model sw_app.ActiveDoc model.SaveAs3(dst, 0, 2) sw_app.CloseDoc(model.GetTitle()) print(fexported: {dst})注意我这里用了Visible False后台模式批量导出不会弹一堆窗口把桌面搞乱。这个过程本身就是传统脚本完全可以做的但加上OpenClaw之后你可以用一句“把D盘models_sld里所有零件导出成STEP放到models_step”来完成甚至能根据文件名自动区分哪些要导出、哪些跳过。6. 自动化运行中最容易翻车的四个地方6.1 SolidWorks进程崩溃AI再聪明也白搭自动化脚本跑久了你会发现崩溃是常态。COM对象没释放、API调用顺序不对、长时间无人值守任何一个环节都可能让SolidWorks突然挂掉。我的应对策略是任务切小不要一个脚本跑几百个模型拆成每50个一批批与批之间重启一次进程。定时保存每处理完几个模型就调用一次model.Save()防止长任务中途崩溃导致前功尽弃。开自动恢复在SolidWorks设置里把自动恢复间隔调到5分钟。捕获异常Python脚本里每个大步骤用try/except包起来出错时至少记录日志而不是让整个服务挂掉。6.2 “可用的窗口资源极低”到底是怎么回事这个报错我第一看到也吓一跳以为是电脑内存不够。后来排查发现原因是GDI对象和窗口句柄泄漏。SolidWorks的COM操作每次新建文档、打开对话框、刷新视图都会产生窗口对象如果脚本里只不断调用API而不释放对象Windows句柄总量就会飙升到上限。解决方案有三个层面每个文档处理完先CloseDoc关闭文档再把模型变量置为None最后调用gc.collect()强制垃圾回收。循环过程中避免反复创建新的SldWorks.Application连接尽量复用同一个。批量任务无论跑得多顺每隔一段时间重启一次SolidWorks应用进程把积攒的句柄彻底清掉。6.3 许可被占自动化任务撞上人工使用无人值守的自动化脚本经常遇到一个尴尬的报错“无法获得SolidWorks Standard许可 监控”。原因通常是同时启动了多个SolidWorks进程比如人工打开软件画图后台脚本又去创建新的Application实例本地许可数量就超了。解决办法很朴素控制并发数脚本运行前先检测是否有其他进程占用许可。简单做法是在桥接服务里加一个“检查许可”的接口如果检测到已有SolidWorks进程正在被人工使用就排队等待而不是强行再拉一个实例。如果团队用的是网络浮动许可还要确认许可服务器配置了足够的增量。6.4 保存格式的坑旧版本格式需要订阅服务“保存到先前发行版本需要SolidWorks订阅服务如果您已购买或续订订阅服务请通知您的管理员……这个提示写得很死板我吃过亏。自动化脚本里如果调用SaveAs3把文件保存成旧版本SLDPRT格式SolidWorks会直接拒绝要求订阅服务。这个问题的本质是产品功能授权不是bug绕不过去。我的建议是自动化流程里不要保存成旧版本格式。如果对方确实用的是旧版本SolidWorks更稳妥的做法是导出STEP或IGES这种中性格式什么版本都能打开而且不会丢失几何体。顺便说一句批量导出前最好和协作方确认好格式不要等文件交出去才发现对方打不开。另外还有一个和WSL2相关的回归问题OpenClaw所在的Windows机器重启后WSL状态偶尔会失效导致Agent自检不通过。解决方法是把WSL相关服务设置成开机自启或者在OpenClaw的启动脚本里加一个“先检查WSL再拉起Agent”的守护逻辑避免机器重启后整个链路静默失效。最后说一点个人体会。我在实际项目中踩过的坑几乎都不是单独某个技术难点造成的而是“AI生成的参数不可信”和“SolidWorks API环境脆弱”两个问题叠加在一起。所以我的习惯是新加一个技能先给OpenClaw一个明显错误的参数看脚本能不能拦下来拦得住说明安全边界有用拦不住就继续加校验。把这条底线守好之后剩下的东西都是越用越顺的。
阅读完成 · 觉得有帮助?