Python向SolidWorks PDM COM对象传递自定义变量类型的问题求助
Python向SolidWorks PDM COM对象传递自定义变量类型的问题求助
嘿,我太懂你现在踩的这个坑了——SolidWorks PDM的COM API在处理这种需要输出数组参数的场景时,确实很容易因为类型匹配问题让人头大。让我帮你拆解问题,再给出能跑通的解决方案。
首先,你遇到的核心问题是:GetHistory方法需要的是一个可被填充的EdmHistoryItem类型数组的引用,而你之前手动构造的VARIANT类型标记太混乱,导致COM组件无法正确识别和写入数据。
先看修改后的完整代码,我会逐段解释:
import pythoncom import win32com.client # 替换成你的Vault名称 vault_name = "你的Vault名称" vault = win32com.client.dynamic.Dispatch('ConisioLib.EdmVault') vault.LoginAuto(vault_name, 0) # 简化GetFileFromPath的调用,不需要提前传入folder参数 file_path = 'C:\\PATH\\TO\\FILE\\FP_Child1.SLDPRT' file, folder = vault.GetFileFromPath(file_path) print(f"获取到文件: {file.Name}") # 创建历史记录工具(17对应EdmUtility.EdmUtil_History枚举值) history_util = vault.CreateUtility(17) history_util.AddFile(file.ID) # 关键:正确构造用于接收EdmHistoryItem数组的VARIANT # EdmHistoryItem是COM对象,对应VT_DISPATCH类型;我们需要一个BYREF的空数组来接收输出 # 1. 创建空的安全数组,元素类型为VT_DISPATCH empty_safe_array = pythoncom.SafeArrayCreateVector(pythoncom.VT_DISPATCH, 0, 0) # 2. 包装成带BYREF标记的VARIANT,让COM能往里面写入数据 history_array = win32com.client.VARIANT( pythoncom.VT_BYREF | pythoncom.VT_ARRAY | pythoncom.VT_DISPATCH, empty_safe_array ) # 调用GetHistory,第二个参数512对应EdmHistoryFlag.EdmHist_All(获取所有历史记录) history_util.GetHistory(history_array, 512) # 现在history_array里已经被填充了EdmHistoryItem对象,直接遍历即可 for item in history_array.value: print(f"版本号: {item.Version}, 操作类型: {item.Action}, 操作用户: {item.UserName}, 操作时间: {item.Date}")
为什么你的原代码会报错?
- 类型标记混乱:你混合了
VT_VARIANT、VT_SAFEARRAY、VT_CARRAY等多个标记,而GetHistory只需要VT_BYREF | VT_ARRAY | VT_DISPATCH这三个——因为EdmHistoryItem是COM对象,对应VT_DISPATCH类型,BYREF表示这是一个输出参数,数组用来接收结果。 - 不必要的参数传递:
GetFileFromPath方法会自动返回文件和对应的文件夹对象,不需要提前传入folder参数,这一步可以简化。
额外的小提示
如果想要更清晰的类型提示(避免记枚举值和类型标记),可以提前生成SolidWorks PDM的类型库包装:
# 生成PDM类型库的包装,GUID是SolidWorks PDM Professional的类型库ID win32com.client.gencache.EnsureModule('{78A51822-51F4-11D1-82DB-0060B0F159EF}', 0, 1, 0)
生成后你可以直接引用EdmUtility.EdmUtil_History、EdmHistoryFlag.EdmHist_All这些枚举值,不用再记数字,代码可读性会高很多。
备注:内容来源于stack exchange,提问作者swizzle
相关产品推荐
相关产品推荐

