简介:这份资源面向具备一定C++与COM基础的SolidWorks二次开发学习者,聚焦参数化建模这一核心场景,帮助读者理解如何通过程序接口驱动零件尺寸与特征,从而替代重复的手工建模操作。压缩包共95个文件,约4.33MB,以cpp与h源码为主体,配合bmp位图资源、sbr与obj编译中间文件、tlh类型库头文件以及dll、tlb、rgs等注册与组件文件,完整保留了VC6工程从源码到可注册插件的构建链路。资源中可见Dialog、Prop、Part、Zhou、PMPage等模块划分,涉及属性页、对话框交互与零件对象封装,便于读者梳理二次开发项目的目录组织与接口调用关系。目前已有622人学习下载,适合希望从示例工程入手、掌握参数化建模实现思路与插件注册流程的开发者参考。
1. 从重复劳动里抽身:Solidworks 二次开发到底能解决什么
如果你每天在 Solidworks 里干的是同一件事——打开模板、改几个尺寸、另存为新文件、再导出一份工程图——那你其实不是在设计,而是在当人肉参数搬运工。Solidworks 二次开发要解决的正是这类场景:把「参数化建模」的重复动作交给程序,让尺寸驱动、配置切换、批量出图变成一次点击。它适合三类人:需要批量生成系列化零件的机械工程师、想把设计规则固化下来的工艺人员、以及被重复建模拖慢交付节奏的小团队。核心工具通常是 Solidworks 自带的 API,配合 VBA、C# 或 Python 调用,不需要你从零写一个 CAD,只需要让 Solidworks 听你的话。
2. 动手前的底子:API 对象模型与开发环境怎么选
2.1 先搞懂 Solidworks API 的对象层级
Solidworks 的 API 不是一堆散装函数,而是一棵从应用往下扎的对象树。最顶层是SldWorks,它代表整个 Solidworks 进程;往下是ModelDoc2,代表当前打开的零件、装配体或工程图;再往下才是PartDoc、AssemblyDoc、DrawingDoc这些具体文档类型。你要改一个尺寸,路径通常是:拿到ModelDoc2,通过IPartDoc或直接遍历特征,找到Dimension对象,再改它的SystemValue。这个层级关系如果没理清,写出来的代码就会到处报「对象未设置」——这是新手最常见的翻车点。
我一般建议先用 VBA 宏录制功能跑一遍手动操作,然后看录出来的代码调用了哪些对象和方法。宏录制虽然啰嗦,但它能告诉你「改这个尺寸」在 API 里对应的是哪条路径。比如手动改一个拉伸深度,录出来的代码里会出现FeatureManager、Dimension、SetSystemValue3这些关键词,顺着这条线去查 API 帮助文档,比硬啃对象模型快得多。
2.2 开发环境选型:VBA、C# 还是 Python
三种常见路线各有边界。VBA 内嵌在 Solidworks 里,宏录制直接出代码,改完就能跑,适合快速验证和小工具,但工程化能力弱,复杂逻辑写起来痛苦。C# 通过 Solidworks 的 COM 接口调用,配合 Visual Studio 能建 WinForm 或 WPF 界面,适合做正式插件和批量工具,缺点是环境配置有门槛,版本对应关系要盯紧。Python 走pywin32调 COM,写起来快,适合数据处理和脚本化任务,但调试体验不如前两者,且对 Solidworks 版本变化比较敏感。
选型逻辑很简单:一次性小工具用 VBA,要交付给团队用的用 C#,自己写脚本来回跑的就用 Python。不要一上来就追求「最先进」的方案,能跑通、好维护才是第一位的。
2.3 连接 Solidworks 进程的最小可用代码
不管选哪种语言,第一步都是拿到 Solidworks 的应用对象。下面这段 Python 代码演示了如何连接到一个已经打开的 Solidworks 实例,并打印当前文档标题:
import win32com.client import pythoncom # 初始化 COM 库,避免多线程环境下报错 pythoncom.CoInitialize() # 尝试连接正在运行的 Solidworks 实例 try: sw_app = win32com.client.GetActiveObject("SldWorks.Application") except Exception: # 如果没有运行中的实例,则启动一个新的 sw_app = win32com.client.Dispatch("SldWorks.Application") sw_app.Visible = True # 获取当前活动文档 model = sw_app.ActiveDoc if model is None: print("当前没有打开的文档") else: # GetTitle 返回文档标题,GetPathName 返回完整路径 print("当前文档:", model.GetTitle()) print("文件路径:", model.GetPathName()) # 释放 COM 资源 pythoncom.CoUninitialize()这段代码的关键点有三个:CoInitialize是 COM 编程的入场券,不调用在多线程或某些环境下会直接抛异常;GetActiveObject和Dispatch的区别在于前者连接已有实例,后者新建实例,实际使用中建议先试连接再新建;ActiveDoc返回的是ModelDoc2接口,后续所有操作都从这个对象往下走。参数方面,SldWorks.Application是固定的 ProgID,不要改成其他字符串。
3. 参数化建模的核心:尺寸驱动与配置切换
3.1 用 API 改尺寸的完整流程
参数化建模的本质是「用外部输入驱动模型内部尺寸」。在 Solidworks API 里,改尺寸不是直接改数值,而是要先找到对应的Dimension对象。常见做法是通过Parameter方法按名称获取,或者遍历Feature下的所有尺寸。下面这段 C# 代码展示了如何按名称修改一个零件的尺寸:
using SolidWorks.Interop.sldworks; using SolidWorks.Interop.swconst; public void ModifyDimension(SldWorks swApp, string dimName, double newValue) { // 获取当前活动文档并转为 PartDoc ModelDoc2 model = (ModelDoc2)swApp.ActiveDoc; if (model == null) return; // 通过名称获取尺寸对象,第二个参数为配置名,空字符串表示当前配置 Dimension dim = (Dimension)model.Parameter(dimName); if (dim == null) { // 尺寸名不存在时直接返回,实际项目中应记录日志 return; } // SetSystemValue3 使用系统单位(米),newValue 需按米传入 // 第三个参数指定配置选项,此处用当前配置 dim.SetSystemValue3(newValue, (int)swSetValueInConfiguration_e.swSetValueInConfiguration_Current, null); // 重建模型使修改生效 model.EditRebuild3(); }逻辑说明:Parameter方法按尺寸名称查找,尺寸名称就是你在 Solidworks 里看到的「D1@草图1」这类名字,必须完全匹配。SetSystemValue3的第二个参数控制改哪个配置,如果模型有多个配置,这里选错就会改到别的配置上。EditRebuild3是必须的,不重建的话模型不会刷新。参数方面,newValue的单位是米,不是毫米,这是最容易踩的坑——你输入 10,模型会变成 10 米而不是 10 毫米。
3.2 配置切换与批量生成系列零件
系列化零件的典型需求是:一份模型,多个配置,每个配置对应一组尺寸。用 API 批量生成时,思路是先切换到目标配置,再改该配置下的尺寸,最后另存为独立文件。下面这段 VBA 代码演示了遍历配置并导出每个配置为单独零件的过程:
Dim swApp As SldWorks.SldWorks Dim swModel As SldWorks.ModelDoc2 Dim swConfig As SldWorks.Configuration Dim configNames As Variant Dim i As Integer Set swApp = Application.SldWorks Set swModel = swApp.ActiveDoc ' 获取所有配置名称 configNames = swModel.GetConfigurationNames() For i = 0 To UBound(configNames) ' 切换到当前配置 swModel.ShowConfiguration2 configNames(i) ' 在这里可以修改该配置下的尺寸 ' 例如:swModel.Parameter("D1@草图1").SetSystemValue3 0.05, 0, Nothing ' 重建并另存为新文件 swModel.EditRebuild3 swModel.SaveAs3 "D:\output\" & configNames(i) & ".SLDPRT", 0, 0 Next i这段代码的核心是ShowConfiguration2和SaveAs3的配合。ShowConfiguration2切换当前激活的配置,后续的尺寸修改和重建都作用于这个配置。SaveAs3的前两个参数是版本号和选项,一般填 0 即可。需要注意的是,SaveAs3会改变当前文档的关联路径,如果后续还要继续操作原模型,记得先保存或另存回去。批量生成时建议把输出目录先建好,否则SaveAs3会直接报错。
3.3 尺寸名称的稳定性问题
用名称查找尺寸看起来方便,但有个隐患:尺寸名称在模型修改后可能变化。比如你删掉一个特征再重新加回来,尺寸名可能从「D1@草图1」变成「D1@草图2」。更稳妥的做法是用尺寸的持久 ID 或者通过特征树遍历来定位。常见做法是给关键尺寸加一个自定义属性,用属性名来查找,这样即使尺寸名变了,属性还在。另一种方案是把尺寸名在建模时就规范好,比如统一用「关键尺寸_长度」这种命名,后续维护会省很多事。
4. 避坑与排查:那些让我加班到凌晨的报错
4.1 「对象未设置」——空引用从哪来
现象:代码运行到某一行突然报「对象未设置」或「NullReferenceException」。原因通常是上一步操作没有返回预期对象,比如ActiveDoc返回了null,或者Parameter没找到对应尺寸。解决方法是每一步都加判空,并且在关键节点打印日志。我一般会在获取ModelDoc2之后立刻检查是否为null,在Parameter返回后也检查一次,宁可多写几行判断,也不要让程序在不可控的地方崩掉。
4.2 单位换算——米和毫米的玄学
现象:改了尺寸但模型大小完全不对,要么巨大要么极小。原因:Solidworks API 内部使用米作为长度单位,而界面显示的是毫米。你从界面读到的 100 毫米,在 API 里是 0.1 米。解决方法是在所有涉及长度的输入输出处统一换算,建议在代码里定义一个常量MM_TO_M = 0.001,所有用户输入乘以这个系数再传给 API,从 API 读出的值除以这个系数再显示。
4.3 重建失败——模型报错但代码不报
现象:尺寸改了,EditRebuild3也调用了,但模型显示异常或工程图没更新。原因可能是尺寸值超出了几何约束范围,导致重建失败,但 API 不会抛异常,只会让模型进入错误状态。解决方法是重建后检查model.GetFeatureCount()或遍历特征看是否有错误标记,也可以调用model.ForceRebuild3强制重建。更稳妥的做法是在改尺寸前先做范围校验,比如孔径不能大于板宽,这类业务规则要在代码里写死。
4.4 版本兼容性——换台电脑就跑不起来
现象:在自己机器上跑得好好的代码,换到同事电脑上就报 COM 组件找不到。原因通常是 Solidworks 版本不同,或者引用的 Interop 程序集版本不匹配。解决方法是尽量用后期绑定(Dispatch)而不是早期绑定,或者在项目里把 Interop 程序集设为「嵌入互操作类型」并复制到输出目录。如果团队里 Solidworks 版本不统一,建议在代码启动时先读取版本号,对不同版本走不同分支。
4.5 性能问题——批量处理时越跑越慢
现象:批量处理几十个文件时,前几个很快,后面越来越慢,甚至卡死。原因通常是 Solidworks 进程没有及时释放资源,或者每次操作都触发了界面刷新。解决方法是在批量任务开始前设置swApp.Visible = False并关闭swApp.UserControl,处理完再恢复。另外,每处理完一个文件后调用swApp.CloseDoc关闭文档,避免内存堆积。如果还是慢,可以考虑把批量任务拆成多个进程,每个进程处理一批,用命令行参数控制。
5. 进阶技巧:用属性驱动和事件监听把工具做稳
5.1 用自定义属性做参数入口
直接改尺寸适合内部工具,但如果要让别人用,最好把参数入口做成自定义属性。Solidworks 的CustomPropertyManager可以读写文档的自定义属性,你可以在模型里预置几个属性,比如「长度」「宽度」「孔径」,然后代码只读这些属性,不直接碰尺寸名。这样做的好处是模型改版后只要属性还在,代码就不用动。下面这段 C# 代码演示了如何读取和写入自定义属性:
public void SetCustomProperty(ModelDoc2 model, string propName, string propValue) { // 获取自定义属性管理器,第二个参数指定配置,空字符串表示所有配置 CustomPropertyManager propMgr = model.Extension.CustomPropertyManager[""]; // 添加或修改属性,第三个参数为类型,此处用文本 propMgr.Add3(propName, (int)swCustomInfoType_e.swCustomInfoText, propValue, (int)swCustomPropertyAddOption_e.swCustomPropertyReplaceValue); } public string GetCustomProperty(ModelDoc2 model, string propName) { CustomPropertyManager propMgr = model.Extension.CustomPropertyManager[""]; string val = ""; string resolvedVal = ""; // 第三个参数返回解析后的值,第四个参数返回原始值 propMgr.Get5(propName, false, out val, out resolvedVal, false); return resolvedVal; }逻辑说明:CustomPropertyManager[""]中的空字符串表示操作文档级属性,如果要操作特定配置的属性,传入配置名。Add3的第三个参数是属性类型,文本用swCustomInfoText,数值用swCustomInfoNumber。Get5的第二个参数控制是否解析为当前配置的值,一般传false拿原始值。参数方面,属性名不要用中文或特殊字符,避免 COM 接口解析出问题。
5.2 事件监听:让工具在保存时自动干活
Solidworks API 支持事件监听,比如文档保存前、保存后、新建时触发。用事件可以把工具做成「无感」的——用户正常操作,后台自动执行校验或同步。下面这段 VBA 演示了如何监听FileSavePostNotify事件:
' 在类模块中声明事件 Public WithEvents swEvents As SldWorks.SldWorks Private Sub swEvents_FileSavePostNotify(ByVal saveType As Long, ByVal fileName As String) ' 文件保存后触发,fileName 是保存的完整路径 ' 在这里可以执行导出、校验或同步操作 Debug.Print "文件已保存: " & fileName End Sub事件监听的关键是WithEvents声明和正确的回调签名。FileSavePostNotify在文件保存完成后触发,saveType表示保存类型(普通保存、另存为等)。需要注意的是,事件回调里不要做太耗时的操作,否则会阻塞 Solidworks 主线程。如果确实需要处理大量数据,建议在回调里只做标记,另起线程或定时器来处理。
5.3 一个验证习惯:每次改完代码先跑回归用例
我自己的习惯是,每次修改核心逻辑后,先拿三个典型模型跑一遍:一个单配置简单零件、一个多配置系列零件、一个带工程图的装配体。这三个用例能覆盖大部分边界情况。跑完之后检查输出文件的尺寸、配置名、工程图视图是否都正确。这个习惯帮我省了很多次「改一个 bug 引入两个新 bug」的后悔药。从那以后我每次提交代码前都强制走一遍这个回归流程,希望帮到你。
本文还有配套的精品资源,点击获取