Python SolidWorks 二次开发—SolidWorks属性页面的创建及控件事件实现
文章目录
前言
一直想写一个属性页面的创建过程,但是之前项目事比较多,没顾上,最近有点时间,把用Python如何创建属性页面并进行简单的交互进行了总结,这里记录一下,有需要的朋友也可以参考,更多的功能可以参考SolidWorks API中的说明,知道流程后其实都很简单。也可以参考API帮助文件中的Create PropertyManager Page Example (VBA)。以下代码都是在虚拟机上刚装的SolidWorks2022上测试完成的,其他的版本需修改相应的版本号。
第一步,创建com接口
Python创建com接口其实非常简单,以下为一个简单是示例
- reg_clsid 是随机生成的
- reg_progid 是自己定义的名称
- public_methods 是需要公开的方法
其中_reg_clsid_ 可以使用print(pythoncom.CreateGuid())随机生成。
将以下代码拷贝到PropertyManagerPageHandler.py文件中,直接运行后就完成了com的注册,注册时需要管理员身份,否则后期可能无法调用。注册执行一次就可以了,后面可直接修改此文件即可,不用重复注册。
#PropertyManagerPageHandler.py
# 创建com接口
class PropertyManagerPageHandler:
_public_methods_ = ["testfun"]
_reg_clsid_ = "{2B4F7E81-64FE-44E4-8035-53E4538534AB}"
_reg_progid_ = "mycom.sldpagehandler"
def testfun(self,arg):
print('com测试')
print(f'com测试,{arg}')
if __name__=="__main__":
# 注册接口
import win32com.server.register
win32com.server.register.UseCommandLine(PropertyManagerPageHandler)
第二步,com接口测试
新建main.py文件,拷贝以下代码后,运行,即可在终端看到运行后的结果。
pagehandler=win32com.client.Dispatch("mycom.sldpagehandler")
pagehandler.testfun('我是第一个参数')
运行以上代码终端显示的结果,可以看到com的函数已经成功运行,并传递了参数,实现了我们想要的结果
第三步,关联com接口和属性页
上面第二步只是测试了接口是否正常,接力来将逐步实现属性的各项功能,先删除main.py中的代码,将以下代码拷贝到main.py中
#main.py
import win32com.client
import pythoncom
from swconst import constants
def main():
# SolidWorks年份版本
sldver=2022
# 建立com连接,如只有一个版本,可以只写"SldWorks.Application"
swApp=win32com.client.Dispatch(f'SldWorks.Application.{
sldver-1992}')
# 提升API交互效率
swApp.CommandInProgress =True
# 显示SolidWorks界面
swApp.Visible =True
# 获取接口对象
pagehandler=win32com.client.Dispatch("mycom.sldpagehandler")
errors=win32com.client.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, -1)
# 创建属性页
page =swApp.CreatePropertyManagerPage('我的第一个属性页',
constants.swPropertyManagerOptions_OkayButton,
pagehandler,
errors)
# 显示属性页
page.Show
if __name__=="__main__":
main()
第四步,显示属性页
运行第三步中的代码,将会在SolidWorks中看到以下最基础的界面,这是一个只有确认的最基础的界面,点击确认可关闭页面
第五步,在页面中增加按钮
在#main.py中增加代码如下,注意AddTab、AddGroupBox、AddControl2函数的第一个参数为在页面的ID,必须是唯一的正整数
- 增加Tab控件
#main.py
# 添加控件到PropertyManager页
tab = page.AddTab(10,"第一个切换页面", "", 0)
- 增加box控件
#main.py
group = tab.AddGroupBox(1,"控件容器",
constants.swGroupBoxOptions_Expanded+
constants.swGroupBoxOptions_Visible)
- 增加button控件
#main.py
# 添加按钮
button =group.AddControl2(11,
constants.swControlType_Button,
"第一个按钮",
constants.swControlAlign_LeftEdge,
constants.swControlOptions_Visible+
constants.swControlOptions_Enabled,
"点击试试") # 使用SOLIDWORKS宏的常量值
运行后的界面如下图所示,可以看到tab和groupbox都创建出来了,但是缺少了button,这是因为button需要在交互中显示,我们运行完程序就结束了,没有交互,所以按钮没有显示出来,需要继续添加代码将button显示出来
第六步,在页面中显示按钮
上面第五步已经将button添加进去了,但是没有显示出来,在main函数的最后面增加如下代码,此时运行main.py后程序会阻塞,就能看到button按钮了
#main.py
while True:
pythoncom.PumpWaitingMessages()
再次运行后的结果如下图所示
第七步,给按钮增加事件
第六步中虽然按钮已经出现,但是此时点击按钮是没有任何反应的,因为我们还没有添加事件,接下来我们给按钮添加事件,
添加按钮事件需要修改PropertyManagerPageHandler.py文件,增加如下内容
- 增加IPropertyManagerPage2Handler9接口的引用
#PropertyManagerPageHandler.py
from win32com import universal
#"{C71C31CD-898C-11D4-AEF6-00C04F603FAF}"是swpublished的clsid,"IPropertyManagerPage2Handler9"为属性页面接口
universal.RegisterInterfaces("{C71C31CD-898C-11D4-AEF6-00C04F603FAF}", 0, 30,0, ["IPropertyManagerPage2Handler9"])
- 增加IPropertyManagerPage2Handler9接口
#PropertyManagerPageHandler.py
_com_interfaces_ = ["IPropertyManagerPage2Handler9"]
- 增加按钮事件
#PropertyManagerPageHandler.py
def OnButtonPress(self, Id):
if Id==11:
print('我是第一个按钮')
完成的代码如下:
#PropertyManagerPageHandler.py
from win32com import universal
#"{C71C31CD-898C-11D4-AEF6-00C04F603FAF}"是swpublished的clsid,"IPropertyManagerPage2Handler9"为属性页面接口
universal.RegisterInterfaces("{C71C31CD-898C-11D4-AEF6-00C04F603FAF}", 0, 30,0, ["IPropertyManagerPage2Handler9"])
# 创建com接口
class PropertyManagerPageHandler:
_com_interfaces_ = ["IPropertyManagerPage2Handler9"]
_public_methods_ = ["testfun"]
_reg_clsid_ = "{2B4F7E81-64FE-44E4-8035-53E4538534AB}"
_reg_progid_ = "mycom.sldpagehandler"
def testfun(self,arg):
print('com测试')
print(f'com测试,{arg}')
def OnButtonPress(self, Id):
if Id==11:
print('我是第一个按钮')
if __name__=="__main__":
# 注册接口
import win32com.server.register
win32com.server.register.UseCommandLine(PropertyManagerPageHandler)
以上代码增加完成后就可以直接运行main.py文件,看到的界面和步骤六中是一样的,此时再点击按钮,则会在终端看到如下输出,代表事件已经添加成功。
第八步,增加确认按钮的事件
确认按钮其实就是关闭按钮,也需要增加事件,事件代码如下
def OnClose(self, Reason):
if Reason==1:
print("页面关闭了")
def AfterClose(self):
pass
此时再点击确认按钮就会在终端看到如下输出
总结:至此用Python创建的一个简单的交互属性页面就完成了,可以在此基础上增加自己想要的功能。以下为两个文件的源码。
- PropertyManagerPageHandler.py文件源码
#PropertyManagerPageHandler.py
from win32com import universal
#"{C71C31CD-898C-11D4-AEF6-00C04F603FAF}"是swpublished的clsid,"IPropertyManagerPage2Handler9"为属性页面接口
universal.RegisterInterfaces("{C71C31CD-898C-11D4-AEF6-00C04F603FAF}", 0, 30,0, ["IPropertyManagerPage2Handler9"])
# 创建com接口
class PropertyManagerPageHandler:
_com_interfaces_ = ["IPropertyManagerPage2Handler9"]
_public_methods_ = ["testfun"]
_reg_clsid_ = "{2B4F7E81-64FE-44E4-8035-53E4538534AB}"
_reg_progid_ = "mycom.sldpagehandler"
def testfun(self,arg):
print('com测试')
print(f'com测试,{arg}')
def OnButtonPress(self, Id):
if Id==11:
print('我是第一个按钮')
def OnClose(self, Reason):
if Reason==1:
print("页面关闭了")
def AfterClose(self):
pass
if __name__=="__main__":
# 注册接口
import win32com.server.register
win32com.server.register.UseCommandLine(PropertyManagerPageHandler)
- main.py文件源码
#main.py
import win32com.client
import pythoncom
from swconst import constants
def main():
# SolidWorks年份版本
sldver=2022
# 建立com连接,如只有一个版本,可以只写"SldWorks.Application"
swApp=win32com.client.Dispatch(f'SldWorks.Application.{
sldver-1992}')
# 提升API交互效率
swApp.CommandInProgress =True
# 显示SolidWorks界面
swApp.Visible =True
# 获取接口对象
pagehandler=win32com.client.Dispatch("mycom.sldpagehandler")
errors=win32com.client.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, -1)
# 创建属性页
page =swApp.CreatePropertyManagerPage('我的第一个属性页',
constants.swPropertyManagerOptions_OkayButton,
pagehandler,
errors)
# 显示属性页
page.Show
if __name__=="__main__":
main()