1. 为什么选择Python进行SolidWorks二次开发?
SolidWorks作为工业设计领域的标杆软件,其原生支持C++和C#进行二次开发。但近年来,越来越多的工程师开始尝试用Python替代传统开发语言,原因很简单:Python能让你用20%的代码量完成80%的自动化需求。我曾在某次产线自动化改造项目中,用Python脚本批量处理了300多个钣金件的参数化设计,整个过程比传统开发方式节省了至少两周时间。
Python操作SolidWorks的核心在于COM接口技术。简单来说,COM就像是一个翻译官,让Python能和SolidWorks这个"外国人"顺畅交流。实际开发中,你可能会遇到几个典型场景:
- 批量修改工程图标注样式
- 自动生成标准件库
- 定制特殊加工工艺的建模流程
- 搭建设计-仿真-制造的一键式工作流
与C#相比,Python开发有三大优势:
- 调试便捷:REPL环境可以实时测试接口调用
- 生态丰富:可结合pandas处理BOM表,用matplotlib生成报告
- 学习曲线平缓:不需要掌握复杂的.NET框架
不过要注意,Python方案更适合轻量级自动化。如果是需要高性能计算或复杂UI的商业插件,还是建议使用C++/C#。我在实际项目中发现,当处理超过500个特征零件的装配体时,Python的执行效率会明显下降。
2. 开发环境搭建实战
2.1 基础软件准备
工欲善其事必先利其器,以下是经过我多次踩坑验证的稳定组合:
- SolidWorks 2022 SP5(版本太旧可能缺少API)
- Python 3.8.10(3.9+版本可能有兼容性问题)
- pywin32 300(COM支持库)
安装时有个容易忽略的细节:必须确保SolidWorks和Python都是32位或64位统一。我有次调试了半天才发现是32位Python调用了64位SolidWorks导致崩溃。验证方法很简单:
import struct print(struct.calcsize("P") * 8) # 输出64表示64位环境2.2 关键库安装
除了基本的pywin32,还需要几个辅助工具:
pip install comtypes # 替代pywin32的备用方案 pip install pythonnet # 处理.NET交互 pip install pyinstaller # 后期打包用特别提醒:安装pywin32后一定要执行post-install脚本:
python Scripts/pywin32_postinstall.py -install3. COM接口开发详解
3.1 创建基础接口框架
让我们从最简单的"Hello World"开始。新建sld_addin.py文件:
# sld_addin.py import win32com.server.register as comreg from win32com import universal # 注册SolidWorks专用接口 universal.RegisterInterfaces( "{C71C31CD-898C-11D4-AEF6-00C04F603FAF}", 0, 30, 0, ["ISwAddin"]) class SWAddin: _com_interfaces_ = ["ISwAddin"] _public_methods_ = ["ConnectToSW", "DisconnectFromSW"] _reg_clsid_ = "{你的GUID}" # 用pythoncom.CreateGuid()生成 _reg_progid_ = "MyCompany.SWAddin" def ConnectToSW(self, swApp, cookie): self.swApp = win32com.client.Dispatch(swApp) return True def DisconnectFromSW(self): return True if __name__ == "__main__": comreg.UseCommandLine(SWAddin)这里有几个关键点需要注意:
ConnectToSW是SolidWorks加载插件时的入口函数cookie参数用于标识插件实例- 必须将SW Application对象转换为可调用的Dispatch对象
3.2 接口注册的坑与解决方案
第一次注册时,你可能会遇到这些典型问题:
- 权限不足:必须以管理员身份运行注册脚本
- GUID冲突:每次开发新插件都要生成新GUID
- 注册表残留:卸载时用
UseCommandLine(SWAddin, register=False)
我建议在注册成功后,立即用以下代码验证:
import win32com.client try: obj = win32com.client.Dispatch("MyCompany.SWAddin") print("COM注册成功!") except Exception as e: print(f"注册失败:{str(e)}")4. 菜单系统集成实战
4.1 创建自定义菜单组
在ConnectToSW方法中添加菜单创建逻辑:
def ConnectToSW(self, swApp, cookie): self.swApp = win32com.client.Dispatch(swApp) self.cookie = cookie cmd_mgr = self.swApp.GetCommandManager(1) err = win32com.client.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, -1) # 创建顶级菜单组 self.cmd_group = cmd_mgr.CreateCommandGroup2( 1, "PyTools", "Python自动化工具", "", -1, True, err) # 添加菜单项 cmd_id = self.cmd_group.AddCommandItem2( "钣金展开", -1, "", "", 0, "UnfoldSheetMetal", "", 0, 1) self.cmd_group.Activate() return True菜单项的ToolTip和Hint参数很有讲究:
- ToolTip建议不超过15个字符
- Hint可以放详细说明,会显示在状态栏
- 图标索引设为-1表示使用默认图标
4.2 实现菜单响应
扩展SWAddin类,添加对应的响应方法:
class SWAddin: _public_methods_ = ["ConnectToSW", "DisconnectFromSW", "UnfoldSheetMetal"] def UnfoldSheetMetal(self): model = self.swApp.ActiveDoc if model and model.GetType() == 1: # 1表示零件文档 feat_mgr = model.FeatureManager feat_mgr.FeatureFlatten2(True, 0.01) # 展开公差0.01mm else: self.swApp.SendMsgToUser("请打开钣金零件!")这里用到的FeatureFlatten2是钣金展开的API,其他常用操作包括:
FeatureExtrude2:创建拉伸特征CreateCircle2:绘制圆形草图AddDimension2:添加尺寸标注
5. 插件调试与优化技巧
5.1 实时调试方案
开发过程中最头疼的就是调试,我总结出两种高效方案:
方案一:附加调试器
- 在代码中插入
import pdb; pdb.set_trace() - 在SolidWorks中触发插件功能
- 用VS Code或PyCharm附加到python.exe进程
方案二:日志追踪
import logging logging.basicConfig( filename='sw_addin.log', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') def UnfoldSheetMetal(self): try: logging.info("开始钣金展开操作") model = self.swApp.ActiveDoc # ...其余代码... except Exception as e: logging.error(f"操作失败:{str(e)}")5.2 性能优化建议
当处理复杂模型时,这些技巧可以显著提升速度:
- 禁用重建:操作前设置
swApp.FeatureManager.EnableFeatureTree = False - 批量操作:用
StartUndoMark/EndUndoMark包裹多个操作 - 内存管理:及时释放COM对象
del model
实测案例:某次批量导出工程图时,启用优化后耗时从45分钟降至8分钟。
6. 进阶功能开发
6.1 属性页集成
结合前文提到的属性页技术,可以创建交互式界面:
def ShowPropertyPage(self): from property_manager import SWPropertyPage page = SWPropertyPage(self.swApp) page.Show()属性页特别适合需要参数输入的场景,比如:
- 模具设计参数配置
- 标准件规格选择
- 加工余量设置
6.2 事件监听系统
实现设计变更的自动响应:
class SWEvent: def OnModelLoad(self, filename): print(f"文件加载:{filename}") def ConnectToSW(self, swApp, cookie): # ...原有代码... self.event_handler = win32com.client.DispatchWithEvents( swApp, SWEvent)常用事件包括:
OnFileOpen:文件打开时触发OnDimensionChange:尺寸修改时触发OnRebuild:模型重建时触发
7. 项目打包与部署
7.1 生成可执行文件
使用PyInstaller打包时,需要特殊配置:
pyinstaller --onefile --windowed --icon=sw_icon.ico sld_addin.py关键注意事项:
- 必须包含
win32com的hook文件 - 建议将COM注册代码单独做成.bat脚本
- 不同SolidWorks版本需要分别打包
7.2 企业部署方案
在大规模部署时,我推荐采用以下架构:
│── installer/ │ ├── setup.exe # 主安装程序 │ ├── prerequisites/ # 运行环境检测 │ └── scripts/ # 注册表操作脚本 └── src/ ├── core/ # 核心功能模块 ├── utils/ # 通用工具类 └── config.json # 用户配置这种结构既方便版本更新,又能兼容不同部门的定制需求。
8. 真实项目经验分享
在最近的一个汽车零部件项目中,我们使用Python插件实现了:
- 自动化BOM生成:读取模型属性→生成Excel报表→同步到ERP系统
- 智能检查工具:验证设计是否符合DFM准则
- 参数化模板库:快速生成系列化产品
其中遇到最棘手的问题是多线程操作COM对象,最终解决方案是:
from threading import Lock com_lock = Lock() def safe_com_call(func): def wrapper(*args): com_lock.acquire() try: return func(*args) finally: com_lock.release() return wrapper @safe_com_call def GetMassProperties(self): return self.model.GetMassProperties2()这种装饰器模式保证了线程安全,实测可支持10个并发任务。