Polyworks脚本开发学习笔记(十五)-用Python连接Polyworks的COM组件
用Polyworks脚本开发,没有高级语言的支持,功能难免单一,一些比较复杂的交互实现不了,界面和报告也很简单。
打开帮助中的SDK文档,发现支持开发的语言有VB.NET/Delphi/C++/C#/VBA,没有Python。
难免有些好奇,支持VBA都不支持Python吗?
VBA连接Polyworks
- VBA连接Polyworks:看看VBA的使用案例,使用的连接COM组件方式调用Inspector和Workspace,这个倒是比较方便,理论上Python也可以。
使用以下代码,VBA轻松的打开了Inspector项目。
Dim currentProjectV1 As IIMInspectProject
Dim currentProjectV2 As IIMInspectProject2
Dim iminspect As IMInspectLib.iminspect
Public Sub main()
Set iminspect = New IMInspectLib.iminspect
'get the basic project interface
iminspect.ProjectGetCurrent currentProjectV1
'ask for the second version of the project interface
Set currentProjectV2 = currentProjectV1
End Sub
Python连接Polyworks
- Python连接Polyworks:理论上使用COM组件的方式和VBA相同,但是由于VBA针对COM组件有调用界面,比Python简单的多。需要摸索一下这个过程。
- cmd界面下先升级Pip到最新: python -m pip install --upgrade pip
- cmd界面下安装win32com模块: python -m pip install pypiwin32
- cmd界面下python运行makepy.py文件。这一步非常关键,理论上所有COM组件在Python中都可以这么调用。
C:\Users\Administrator>python C:\Users\Administrator\AppData\Local\Programs\Python\Python38\Lib
site-packages\win32com\client\makepy.py
- 运行后,可以调出系统所有的COM组件,VBA的界面重现了。
- 选择OK,系统出现下面的生成提示。这是成功了。
网上说的,下载安装包之类的,都很麻烦,而且没这个靠谱。
感觉写的这么清楚真应该收费了_
- 获取生成的py接口文件
CMD界面提示,C:\Users\Administrator\AppData\Local\Temp\gen_py\3.8下面生成了一个py文件
5676F770-39A7-4507-8BDC-634B2407C5B0x0x1x0.py
打开看看,里面定义Polyworks的类接口,是一个调用的接口文件。
# -*- coding: mbcs -*-
# Created by makepy.py version 0.5.01
# By python version 3.8.0 (tags/v3.8.0:fa919fd, Oct 14 2019, 19:37:50) [MSC v.1916 64 bit (AMD64)]
# From type library '1'
# On Wed Mar 9 21:17:40 2022
'PolyWorks|Inspector 20XX (64-bit) Type Library'
makepy_version = '0.5.01'
python_version = 0x30800f0
import win32com.client.CLSIDToClass, pythoncom, pywintypes
import win32com.client.util
from pywintypes import IID
from win32com.client import Dispatch
The following 3 lines may need tweaking for the particular server
# Candidates are pythoncom.Missing, .Empty and .ArgNotFound
defaultNamedOptArg=pythoncom.Empty
defaultNamedNotOptArg=pythoncom.Empty
defaultUnnamedArg=pythoncom.Empty
CLSID = IID('{23E630FD-A4D5-47AD-A3B2-7D2779FFF888}')
MajorVersion = 1
MinorVersion = 0
LibraryFlags = 8
LCID = 0x0
-
如果出现pywintypes报错: 找不到pywintypes的解决方案
pywintypes38.dll安装在了…\Python38\Lib\site-packages\pywin32_system32目录,但是Python中用了虚拟环境的话找不到。
解决方案:将该目录pywin32_system32复制到虚拟环境目录(根据设置的虚拟环境而不同)
我的是C:\Users\Administrator\venv\Lib\site-packages。复制以后编译不再报错。 -
Python中开始启动COM组件,执行Polyworks脚本命令
Py接口文件的最后一个类(基类为CoClassBaseClass),通常包含则真正调用的dll文件的信息,同时也是最终使用的dll文件的类对象。
使用下列代码,可以从注册表中读取IMInspect的CLSID,并成功启动Polyworks。
获取到commandCenter以后就可以调用CommandExecute运行Polyworks中编好的脚本代码,组合出各种复杂的界面、操作和交互了。至此,Python连接Polyworks的COM组件顺利完成。
import sys
import win32api, win32con, comtypes
import comtypes.client
class IMInspectApp():
def __init__(self):
self.key = win32api.RegOpenKeyEx(win32con.HKEY_CLASSES_ROOT, 'InnovMetric.PolyWorks.IMInspect', 0,
win32con.KEY_READ)
self.clsid = win32api.RegQueryValue(self.key, 'CLSID')
self.path = "C:\\Program Files\\InnovMetric\\PolyWorks MS 2019\\bin\\iminspect.exe"
self.library = comtypes.client.GetModule(self.path)
self.init = comtypes.client.CreateObject(self.clsid)
self.interface = self.init.QueryInterface(self.library.IIMInspect)
self.get_project = self.interface.ProjectGetCurrent()
self.commandCenter = self.get_project.CommandCenterCreate()
if __name__ == "__main__":
IM_InspectApp = IMInspectApp()
if IM_InspectApp.commandCenter is None:
print("没有获取到commandCenter")
sys.exit(0)
IM_InspectApp.commandCenter.CommandExecute("MACRO PAUSE(\"提示\",\"Python启动Polyworks成功\")")
代码启动了一个PolyWorks暂停的提示框,正常显示: