基于COM的SolidWorks API中makepy实现及调用报错排查
解决SolidWorks API强类型调用的InvokeTypes错误
问题原因
直接实例化makepy生成的solidtypes.ISldWorks接口类(如sw_app = solidtypes.ISldWorks())是错误操作——这类接口类需要绑定到实际的SolidWorks COM实例才能正常工作,直接实例化会导致接口未关联有效COM对象,触发AttributeError: <unknown>.InvokeTypes。
正确实现步骤
1. 获取SolidWorks COM实例并绑定强类型接口
不要直接实例化接口类,先用win32com.client获取SolidWorks的COM实例,再转换为强类型接口以获得IntelliSense支持:
import win32com.client import solidtypes # 获取SolidWorks COM实例(自动启动或连接已运行的实例) sw_app_raw = win32com.client.gencache.EnsureDispatch("SldWorks.Application") # 转换为强类型接口 sw_app = solidtypes.ISldWorks(sw_app_raw) # 可选:显示SolidWorks窗口 sw_app.Visible = True
2. 严格匹配API参数类型
强类型调用对参数类型要求更严格,必须使用makepy生成的枚举常量,参数顺序和类型要完全匹配SolidWorks API文档:
示例:调用OpenDoc6打开零件
from solidtypes import swDocumentTypes_e, swOpenDocOptions_e # 零件路径(用原始字符串避免转义问题) part_path = r"C:\Your\Part\Path\example.sldprt" # 调用OpenDoc6,参数严格对应API定义 sw_model = sw_app.OpenDoc6( FileName=part_path, DocumentType=swDocumentTypes_e.swDocPART, Options=swOpenDocOptions_e.swOpenDocOptions_Silent, Configuration="", Errors=0, Warnings=0 )
示例:调用NewPart创建新零件
# 直接调用强类型方法,无需手动转换VARIANT sw_new_part = sw_app.NewPart()
3. 参数排查小技巧
- 所有枚举值必须使用
solidtypes中定义的枚举类(如swDocumentTypes_e),禁止直接传整数; - 字符串参数(如路径、配置名)用原始字符串
r""避免转义错误; - 输出参数(如Errors、Warnings)若无需接收具体值,传
0即可(强类型下会自动处理为VARIANT引用)。
内容的提问来源于stack exchange,提问作者Sean Yeatts
相关产品推荐
相关产品推荐

