目录
1、重要文档
SolidWorks API 帮助文档:在 SolidWorks 的安装路径下可以找到本地文件,如 ...\Program Files\SolidWorks Corp\SolidWorks\api\apihelp.chm 。
swcommands.py 及 swconst.py 文件:由 makepy.py 程序生成的 swcommands.py 及 swconst.py 文件。在 ...\Lib\site-packages\win32com\client 文件夹内找到 makepy.py ,用 IDE 打开并运行,选择SOLIDWORKS 201x Type library和SOLIDWORKS 201x Constant type library的文件,然后重命名为swcommands.py 及 swconst.py。
2、MSDN VARIANTS
typedef enum tagVARENUM
{
VT_EMPTY = 0x0000,
VT_NULL = 0x0001,
VT_I2 = 0x0002,
VT_I4 = 0x0003,
VT_R4 = 0x0004,
VT_R8 = 0x0005,
VT_CY = 0x0006,
VT_DATE = 0x0007,
VT_BSTR = 0x0008,
VT_DISPATCH = 0x0009,
VT_ERROR = 0x000A,
VT_BOOL = 0x000B,
VT_VARIANT = 0x000C,
VT_UNKNOWN = 0x000D,
VT_DECIMAL = 0x000E,
VT_I1 = 0x0010,
VT_UI1 = 0x0011,
VT_UI2 = 0x0012,
VT_UI4 = 0x0013,
VT_I8 = 0x0014,
VT_UI8 = 0x0015,
VT_INT = 0x0016,
VT_UINT = 0x0017,
VT_VOID = 0x0018,
VT_HRESULT = 0x0019,
VT_PTR = 0x001A,
VT_SAFEARRAY = 0x001B,
VT_CARRAY = 0x001C,
VT_USERDEFINED = 0x001D,
VT_LPSTR = 0x001E,
VT_LPWSTR = 0x001F,
VT_RECORD = 0x0024,
VT_INT_PTR = 0x0025,
VT_UINT_PTR = 0x0026,
VT_ARRAY = 0x2000,
VT_BYREF = 0x4000
} VARENUM;
3、错误排除实例
3.1 第一个例子
出错代码:
modelExt.SelectByID2("mysketch", "SKETCH", 0, 0, 0, False, 0, None, 0)
错误类型:
Traceback (most recent call last): File "", line 1, in File ">", line 2, in SelectByID2 pywintypes.com_error: (-2147352571, 'Type mismatch.', None, 8)
类型不匹配中的最后一个数字。 行指示导致问题的参数。 在这种情况下,它是 None ,这是第八个参数。 API 手册页说它需要一个“指向标注的指针”。 我们只想传递 None,但 None 没有被转换为正确的 COM 对象,所以我们必须手动进行转换。
函数定义:
def SelectByID2(self, Name=defaultNamedNotOptArg, Type=defaultNamedNotOptArg, X=defaultNamedNotOptArg, Y=defaultNamedNotOptArg
, Z=defaultNamedNotOptArg, Append=defaultNamedNotOptArg, Mark=defaultNamedNotOptArg, Callout=defaultNamedNotOptArg, SelectOption=defaultNamedNotOptArg):
'Select a specified entity'
return self._oleobj_.InvokeTypes(68, LCID, 1, (11, 0), ((8, 1), (8, 1), (5, 1), (5, 1), (5, 1), (11, 1), (3, 1), (9, 1), (3, 1)),Name
, Type, X, Y, Z, Append
, Mark, Callout, SelectOption)
元组列表( ((8,1), (8, 1), (5, 1), ...) 上面)包含有关每个参数的预期类型的信息。 第八个元组对应于有问题的第八个参数。 该元组是 (9, 1)。 现在在名为“VARIANT Type Constants”的 MSDN 网页中查找“9”(VT_DISPATCH = 0x0009,//十六进制的9),您会看到它与 VT_DISPATCH 匹配。 以下是如何手动生成正确对象的魔法:
arg1 = win32com.client.VARIANT(pythoncom.VT_DISPATCH, None)
modelExt.SelectByID2("Sketch1", "SKETCH", 0, 0, 0, False, 0, arg1, 0)
3.2 第二个例子
出错代码:
selMgr = model.SelectionManager
aSketch = selMgr.GetSelectedObject(1).GetSpecificFeature2
aSketch.GetReferenceEntity(0)
错误类型:
Traceback (most recent call last): File "", line 1, in File ">", line 2, in GetReferenceEntity pywintypes.com_error: (-2147352571, 'Type mismatch.', None, 1)
函数定义:
def GetReferenceEntity(self, LEntityType=defaultNamedNotOptArg):
'Get entity that this sketch is created on'
return self._ApplyTypes_(52, 1, (9, 0), ((16387, 3),), u'GetReferenceEntity', None,LEntityType
)
然后查看 VARIANT 网页,我们发现 16387 = pythoncom.VT_BYREF | pythoncom.VT_I4 所以 GetReferenceEntity 使用一个输出参数来返回实体类型。 我们可以构造一个类似于我们为 SelectByID2 所做的输出参数:
arg1 = win32com.client.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, -1)
refPlane = aSketch.GetReferenceEntity(arg1)
variant=win32com.client.VARIANT(16396, [1, 2, 3, 4, 5])
获取variant中的数据:variant.value
[1, 2, 3, 4, 5]
参考文献
1、Notion – The all-in-one workspace for your notes, tasks, wikis, and databases.