SolidWorks二次开发入门到实战:从宏录制到Addin插件开发与故障排查 📅 发布时间:2026/9/18 17:53:00 👁 浏览次数: 搞SolidWorks二次开发这几年也算从打开宏录制一脸懵到能给同事写点提效小工具走了一遭。零零散散踩了不少坑很多问题当时翻遍论坛才找到答案回头看看其实都是些规律性的东西。这篇算是这个系列的开篇重点聊聊我为什么选这条技术路线、解决过哪些实际问题以及怎么从零起步做第一个能用的插件。如果你正在做设计自动化、企业三维标准化或者单纯想让SolidWorks少干点重复活儿这篇应该能帮上忙。1. 做了三年SolidWorks二次开发我到底在解决什么问题1.1 自动化需求其实长得很像很多人一听二次开发就觉得高深说白了就是让SolidWorks按你写的代码去干活。我接触到的需求翻来覆去无非这几类第一类是批量处理。比如几百个零件要统一加物料号材质重量这种自定义属性手动一个个改属性框点几百次鼠标流程长还容易漏代码跑一遍几秒钟全搞定。第二类是参数化设计驱动。最典型的就是标准件选型通过Excel表格或界面上输入几个关键参数SolidWorks自动把模型重建出来配合设计表能省掉大量建模时间。第三类是流程集成把SolidWorks和企业的PDM、ERP系统接起来模型信息能自动同步到系统里不用人工录入。这三类需求会出现在几乎所有制造业企业里。机械设计部门、非标自动化公司、做产品配置的企业本质上都是在用不同形式重复这些工作。所以别管你做的是行星齿轮箱、机柜还是钣金件只要涉及大量重复性三维操作二次开发大概率能帮上忙。1.2 SolidWorks API的底子与NX、Creo横向比一比既然要做二次开发平台选型很关键。热词里能看到不少人在搜NX二次开发、Creo二次开发说明很多人也在纠结选哪个平台。我个人的感受是对比维度SolidWorksNXCreoAPI文档完整度文档齐全示例多强但上手门槛高中等资料要碰运气开发语言支持C#、C、VBA均可用主要C、Python、NXOpenC、VB、JavaJ-Link入门难度相对友好宏录制是神助攻对象模型复杂上手慢中等文档质量一般适合场景轻量自动化、快速交付、中小团队高端CAD/CAE一体化高端制造、大型装配开发社区资源相对丰富论坛资料多中等官方论坛为主相对较少如果你们公司主要用SolidWorks做产品设计那当然是最直接的切入点。API设计上SolidWorks走的是COM组件路线对象模型骨架清晰从顶层SldWorks对象到ModelDoc、Feature一层层下来C#配合Interop调用非常顺手。再加上宏录制这个作弊器很多功能不需要翻文档就能摸清对象层级我在实际开发里有接近一半的代码是先录宏、再翻译成C#的。2. 技术路线选型宏、插件还是独立程序2.1 三种开发方式的适用边界SolidWorks二次开发有几种典型做法不同方式应对的是不同粒度的问题VBA宏.swp最轻量在SolidWorks里直接录制、运行。适合临时处理、个人快速搞定一个小批量任务。缺点是没法脱离SolidWorks界面做交互管理复杂逻辑也比较痛苦。Addin插件COM组件以DLL形式注册到SolidWorks中启动时自动加载能自定义菜单栏、任务窗格适合做成团队内部长期使用的工具集。外部独立程序Standalone通过API启动SolidWorks并在外部进程控制它适合服务端批量处理、无人值守任务比如定时把三维模型转成中间格式、批量导出BOM。实际操作中我经常混用。临时改一批属性直接录个宏跑完就扔要给部门做持续使用的工具就用Addin要是公司有Web端选型需求需要在后台自动生成模型那就得写外部程序。2.2 我为什么最终锁定C# Addin我早期也用过VBA后来转到C#。原因是项目一旦进入要长期维护、要对接数据库、要多人协作的阶段VBA那套调试体验和代码组织能力确实顶不住了。C#有完整的IDE支持、断点调试比VBA舒服一个量级还能直接调用.NET生态里的第三方库对接SQL Server、WebAPI都方便。做Addin而不是外部程序主要考虑的是用户体验。工程师打开SolidWorks菜单栏多出个企业工具点一下就能弹窗执行操作这种集成感比外挂一个程序再让它去操作SolidWorks舒服很多。而且Addin可以注册事件回调比如文档保存时自动校验属性、打开模型时联动PDM查BOM这些主动触发逻辑外部程序要实现就很绕。注意Addin是以COM组件注册到系统里的开发机上装了新版本SolidWorks后一般要重新注册一次。开发调试时建议用附加到进程的方式把VS调试器挂到sldworks.exe上改代码不用反复重启SolidWorks。3. 环境搭建和第一个插件这部分坑最多3.1 开发环境与版本匹配做SolidWorks二次开发环境搭错会浪费大量时间。核心要搞明白三个东西Visual Studio版本、SolidWorks版本和API程序集的版本。SolidWorks从2017版左右开始官方推荐用Visual Studio 2017及以上版本配合.NET Framework 4.6.1以上开发Addin。我目前用的组合是Visual Studio 2022 SolidWorks 2022/2024整体比较稳。引用API程序集时不像普通NuGet包那样直接装就行。早期绑定方式需要手动添加以下引用SolidWorks.Interop.sldworks.dll SolidWorks.Interop.swconst.dll SolidWorks.Interop.swpublished.dll这些DLL一般在SolidWorks安装目录的api\redist子目录里或者单独装SOLIDWORKS API SDK。我建议直接建个本地文件夹统一放这几个dll引用时用浏览指定路径别让Visual Studio自动从全局搜索不然多版本共存时容易引用错。版本还有一个关键点API常量的枚举值不同版本可能有变化。比如swDocumentTypes_e.swDocPART在不同版本都是同一个数值但新版本可能会新增枚举项。如果你从旧版本迁移项目编译报错先检查枚举是否被标记了deprecated。3.2 第一个Addin从零写起要在SolidWorks里挂一个自己的插件核心是实现ISwAddin接口。下面是简化版的代码骨架using System; using System.Runtime.InteropServices; using SolidWorks.Interop.sldworks; using SolidWorks.Interop.swpublished; [Guid(A1B2C3D4-0000-0000-0000-000000000001)] [ComVisible(true)] public class MySwAddin : ISwAddin { private SldWorks swApp; private int addinCookie; public bool ConnectToSW(object ThisSW, int Cookie) { swApp (SldWorks)ThisSW; addinCookie Cookie; // 在这里添加菜单、命令管理器按钮 return true; } public bool DisconnectFromSW() { // 在这里清理菜单和资源 return true; } [ComRegisterFunction] public static void RegisterFunction(Type t) { // 写注册表注册命令ID } [ComUnregisterFunction] public static void UnregisterFunction(Type t) { // 清理注册表 } }用regasm.exe手工注册DLL的路径比较繁琐建议在项目后期处理事件里加一个Post-build命令$(ProgramFiles)\Microsoft Visual Studio\2022\Community\Common7\IDE\..\..\..\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\regasm.exe $(TargetPath) /codebase /tlb:$(TargetDir)\$(TargetName).tlb也可以直接用Visual Studio自带的工具 - 命令行 - 开发者命令提示跑regasm。注册成功后启动SolidWorks在插件对话框里勾上你的插件就能加载。3.3 对象模型速览SldWorks、ModelDoc2和特征树SolidWorks的对象模型新手最容易绕晕。我概括一下骨架SldWorks顶层应用对象控制SolidWorks本身打开文档、获取当前文档、退出等。ModelDoc2 / ModelDocEx当前打开的三维文档对象。关于它一个重要版本差异要记住新SDK更多推荐使用ModelDoc2但在遍历对象时经常要用到IModelDocExtension。它是很多高级操作的路口。PartDoc / AssemblyDoc / DrawingDoc分别对应零件、装配体、工程图继承自ModelDoc2提供各自模块的专属功能。Feature特征树上的节点。一切建模步骤、草图、基准面都是Feature。最直接的入门方式在SolidWorks里点工具 - 宏 - 录制手动操作一遍你希望自动化的步骤然后停止录制、查看生成的VBA代码——它会自动把调用的API函数按顺序列出来。这套代码几乎可以一比一翻译成C#。比如我做一个批量给零件加材料属性的工具录制宏会给出类似Part.CustomPropertyManager.Add3这种代码我再据此去查完整的方法签名和参数效率极高。4. 三个高频自动化场景实战4.1 批量修改自定义属性不多写一个属性框自定义属性在SolidWorks里承担着文件信息的重任BOM、工程图标题栏、PDM同步都靠它。批量改属性是我写过的使用频率最高的工具。核心代码大致是这样ModelDoc2 model (ModelDoc2)swApp.ActiveDoc; if (model null) return; CustomPropertyManager propMgr model.Extension.CustomPropertyManager(); string[] names null; object[] values null; object[] resolvedValues null; propMgr.GetAll3(ref names, ref values, ref resolvedValues); // 写入新的属性 bool ret propMgr.Add3(物料号, (int)swCustomInfoType_e.swCustomInfoText, ABC-001); bool ret2 propMgr.Add3(材质, (int)swCustomInfoType_e.swCustomInfoText, 铝合金6061);如果是从Excel读取驱动数据加上Microsoft.Office.Interop.Excel或者读CSV就行。这里有个容易踩的坑CustomPropertyManager()里的空白字符串不能省略。这个参数是配置文件名称传空字符串才代表自定义属性标签页。我见过很多人在这里卡了半天以为是API没生效其实是对应错配置页了。实操心得批量处理时先关闭SolidWorks的系统选项 - 性能 - 重建模型时提示保存之类弹窗避免处理到一半卡在对话框上。另外大批量文件处理时建议用后台打开文档的方式打开时不可见速度快很多。4.2 遍历特征树识别关键特征、找草图做模型自动检查、批量改特征的开发时遍历特征树是必备操作。核心是递归遍历FirstFeature()和GetNextFeature()同时注意子特征比如阵列的实例、草图里的每个线元素。private void TraverseFeatures(Feature feature, int depth 0) { while (feature ! null) { string featType feature.GetTypeName2(); string featName feature.Name; // 按类型过滤比如只处理草图、圆角、倒角 if (featType ProfileFeature || featType FilletFeature) { // 做业务处理 } // 遍历该特征下的子特征 Feature subFeature feature.GetFirstSubFeature(); if (subFeature ! null) TraverseFeatures(subFeature, depth 1); feature feature.GetNextFeature(); } }这块的关键经验是先看看你有没有选中的特征如果用户已经选中了某个特征处理范围应该优先基于选择集合而不是每次从特征树根部全量扫一遍。全量扫在复杂装配体里会卡到怀疑人生。还有一个常见坑遍历时千万不要试图在循环里删除特征。SolidWorks的对象模型对遍历中删除非常不友好轻则漏对象重则导致崩溃。如果要删除特征先把要删的收集到列表循环结束后再逐个删。4.3 工程图自动出图和BOM导出工程图自动化是二次开发里投入产出比很高的一块。自动创建视图、自动标注尺寸、自动插入BOM表都能通过API做。最简单的方式也是先录宏手动创建一个工程图、插入四个标准视图、插入BOM表然后回看录制代码基本就是完整的开发模板。关键代码一般包含这几步// 由3D模型创建工程图 DrawingDoc drawDoc (DrawingDoc)swApp.NewDocument(C:\ProgramData\SolidWorks\SolidWorks 2022\templates\工程图.drwdot, 0, sheetW, sheetH); // 插入标准三视图 drawDoc.Create3rdAngleViews(modelPath); // 获取当前视图并重命名 View view drawDoc.GetFirstView(); // 插入BOM表的基本思路使用DrawingDoc.InsertBOMTable drawDoc.InsertBOMTable( (int)swBOMConfigurationAnchorType_e.swBOMConfigurationAnchor_TopLeft, 0.1, 0.1, 0.01, 0.01, (int)swBomTableType_e.swBomTableType_PartsOnly, );导出BOM到Excel又是一个经典需求。最容易踩的坑是BOM表单元格数据可能不是实时同步的。代码切完视图或更新完模型后马上读BOM表内容很可能拿到的是旧数据。我一般会加一次drawDoc.ViewRebuild3()或者swApp.Refresh()再延时读数据。小技巧工程图模板的图层、字体、线条尽量提前在SolidWorks环境里维护好。二次开发会自动沿用模板样式模板丑代码写得再漂亮也没用。5. 高频故障排查从许可证到装不上5.1 启动报错无法获得许可 (-97,121,0)热词里不少人搜无法获得下列许可solidworks standard这是启动时的老问题。排查顺序一般是确认SolidWorks服务FlexNet服务有没有在运行。打开服务管理器找SolidWorks相关的服务确认状态是正在运行。确认许可证服务器的地址配置正确。在SolidWorks的许可管理工具里检查服务器指向对不对。检查防火墙。SolidWorks/FlexNet通信走的是固定端口Windows防火墙更新后经常把这个端口拦掉。可以让IT临时关防火墙试试能跑通再想白名单策略。确认网络环境。笔记本在多个网络切换后IP变了容易导致许可证无法续借注销登录重新获取一次即可。如果公司用的是网络浮动许可确认可用许可数量没被占满同事的会话没释放。排错时最烦的其实是能连上服务器但就是拿不到许可。这种情况多出现在笔记本系统休眠后网卡断网重连许可服务的连接状态假死了。重启SolidWorks没用重启FlexNet服务才有效。别问我怎么知道的。5.2 API开发过程中SolidWorks崩溃常见诱因二次开发时SolidWorks动不动崩溃是很多人想摔鼠标的根源。根据我的观察大部分崩溃不是SolidWorks本身的问题而是代码踩了几个雷空引用是最常见的。API返回的COM对象经常因为模型状态不对变成null你拿着null去调方法直接崩。开发时我给每个关键API返回值都做一次null检查不图别的就图能定位。轻化零件问题。装配体里零件处于轻化状态API拿到的是空壳数据。如果你操作轻化零件很容易遇到各种报错包括因为检测到轻化零件。解决办法是在操作前把零件切回完全还原状态IComponent2 comp ...; comp.SetLightweightState(false);事件回调里做耗时操作。SolidWorks的事件回调比如文档保存完成事件默认是在主线程上跑的。如果回调里去做打开新文档、长时间循环这类的操作轻则界面假死重则触发未处理异常导致进程崩溃。正确做法是回调里只做轻量标记用System.Threading.Tasks.Task或消息循环延后处理重活。实操心得写API代码一定开着调试 - 异常设置 - 勾选公共语言运行时异常。这样代码哪一步抛了异常Visual Studio会直接断住不至于整个SolidWorks陪葬后再去翻日志。5.3 版本卸载重装Clean Uninstall的正确姿势热词里有一条solidworks clean uninstall utility这戳中了太多人的痛处。SolidWorks卸载不干净往往导致新版本装不上。我的建议是不要把卸载按钮点完就不管了。SolidWorks安装程序虽然有卸载功能但注册表、服务、残留文件经常清理不干净。官方推荐用SolidWorks Rx里的卸载工具或者去官网下载独立的SolidWorks Clean Uninstall Utility。它会帮你把程序、注册表项、服务、安装目录都清一遍。按脚本走完后重启再装新版本许可问题和兼容性问题会少很多。如果重装后打开报无法获得许可且确认服务器没问题尝试用完整卸载工具再清一次注册表里的许可条目重新激活。另外提醒一下卸载前一定要做好三件事备份自定义模板、备份宏代码、备份Toolbox配置。这些往往是公司内部积累多年的资产丢了比软件装不上还麻烦。5.4 模型导入Unity3D的几个坑热词里还有一条solidworks模型导入unity3d虽然不是直接的二次开发但在我做的可视化项目里经常碰到。导出时最容易翻车的是单位和坐标轴。SolidWorks另存为STL时默认单位是毫米而Unity默认单位是米。导入后一个本来1米的零件会变成1000个单位长缩放比例全乱。解决办法是在导出对话框里把单位改为米或自定义比例0.001或者在Unity导入设置里统一调缩放系数。坐标系也要留意。SolidWorks的Z轴向上Unity的Y轴向上。两者默认坐标方向不同在SolidWorks里看着正常的装配体导入Unity后可能整个躺下来。应对办法要么在SolidWorks里整体旋转装配体的根节点要么在Unity里写个导入后自动旋转的编辑器脚本。我一般推荐后者不改模型数据只在引擎侧处理回头模型更新了不影响流程。另外一个容易被忽略的问题是模型精度。SolidWorks导出STL时三角面片的弦误差默认值是0.02mm左右。如果直接按默认值导出大装配体Unity里跑起来面数会爆炸。实际项目中我会根据展示精度要求把弦误差适当调大到0.1~0.5mm肉眼基本看不出来差异但性能能提升好几倍。这个也完全可以做成一个独立程序读取SolidWorks装配体自动导出并设定合理的参数。6. 新手上手路线与一点个人体会6.1 入门最快的两条腿如果你刚接触SolidWorks二次开发我建议先走两条路路径一从宏开始。把日常重复操作在SolidWorks里手工做一遍并录制宏然后打开VBA编辑器看代码尝试改参数、加判断。这个阶段不需要理解全部对象模型只需要照着改。很多实际能用的工具就是这么拼出来的。路径二从示例项目开始。去SOLIDWORKS API Help里找ApiHelp或官方示例下载几个C# Addin样例跑通一个能在菜单栏注册按钮的demo之后再往里填充业务逻辑。有了能跑的底子后面学得快很多。不要一上来就想读懂全部API文档。那本厚得像字典一样的帮助文件适合当查询手册不适合当教材。我当时就是边写边查写十个功能就基本建立起了对对象模型的整体认识。6.2 关于这个系列后面打算写什么这个系列我会持续记录一些实际操作中有价值的片段。计划里包括如何用C#写一个完整的工程图自动化工具、参数化设计表的高级玩法、如何把SolidWorks能力和Web系统打通、多版本API兼容的处理策略等等。每篇都会以实际能运行的代码片段和踩坑过程为主尽量不写PPT式的空话。如果你在做二次开发的过程中也有想吐槽的坑或者对某个功能的实现有疑问欢迎留言交流。技术这东西一个人踩坑叫倒霉一群人踩坑就叫经验库了。