Python SolidWorks 二次开发---SolidWorks属性页面的创建及控件事件实现

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显示出来
在这里插入图片描述

扫描二维码关注公众号,回复: 16732114 查看本文章

第六步,在页面中显示按钮

上面第五步已经将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()

猜你喜欢

转载自blog.csdn.net/Bluma/article/details/132804859
今日推荐