Python SolidWorks 二次开发—SolidWorks中的事件实现

  • Post author:
  • Post category:python




Python SolidWorks 二次开发—SolidWorks中的事件实现





前言

事件是可以被控件识别的操作,如按下确定按钮,选择某个单选按钮或者复选框。每一种控件有自己可以识别的事件,如窗体的加载、单击、双击等事件,编辑框(文本框)的文本改变事件,等等。

SolidWorks中的事件有如下几种,分别为:

DAssemblyDocEvents(装配体),

DDrawingDocEvents(工程图),

DFeatMgrViewEvents(特征管理),

DModelViewEvents(模型视图),

DMouseEvents(鼠标),

DPartDocEvents(零件),

DSldWorksEvents(SolidWorks),

DTaskpaneViewEvents(任务查看)。




一、如何实现com事件

这里以excel为例,网上示例很多,这里简单给个示例,代码如下:

from win32com.client import DispatchWithEvents

class ExcelEvents:
    def OnNewWorkbook(self, wb):
        print('打开excel新文档')

def main():    
    excelApp = DispatchWithEvents("Excel.Application", ExcelEvents)
    excelApp.Visible = True
    book=excelApp.Workbooks.Add()

if __name__ == '__main__':
    main()

在excel中实现事件是用的DispatchWithEvents函数,提前定义好相关的事件类,并将类以参数的形式调用,类中定义的事件函数名需要查找帮助,并不是随其定义的,执行以上代码会在终端输出”打开excel新文档”的内容,说明事件功能已经实现



二、SolidWorks中如何实现com事件

在SolidWorks中如果使用DispatchWithEvents会报错,所以不能直接使用,以下是SolidWorks中调用事件的示例代码,代码如下:

import pythoncom
import win32com.client 
class SldEvents(win32com.client.getevents("SldWorks.Application")):
    def OnFileOpenNotify(self, FileName):
        print(f'打开的文件名为:{FileName}')
    def OnFileNewNotify(self, NewDoc=None, DocType=None):
        print('test',NewDoc,DocType)
def main():
    swApp=win32com.client.Dispatch('SldWorks.Application')
    swApp.CommandInProgress =True
    swModel=swApp.ActiveDoc
    events=SldEvents(swApp)
    errors=win32com.client.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, -1)
    warnings=win32com.client.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, -1)
    filename=r'C:\test\test.sldprt'
    swModel=swApp.OpenDoc6(filename, 1, 1, "", errors, warnings)

if __name__ == '__main__':
    main()

可以看到,在SolidWorks中使用事件和excel类似,都需要先定义事件类,并且在类中需要使用win32com.client.getevents定义是继承那个事件的基础类,在主函数中先实例化此事件类,完成后运行以上代码,会在终端提示“打开的文件名为:C:\test\test.sldprt”,需要将示例中的文件路径进行修改。

SolidWorks中其他事件和以上代码相同,都需要线定义对应的类事件,在事件出发前需要实例化,然后相应的事件就会触发。

大多数com事件使用DispatchWithEvents函数就可以,SolidWorks中事件的用法不太一样,按照以上示例代码使用即可实现。

事件的使用有时可能会降低效率,是否使用需结合实际使用环境决定。



版权声明:本文为Bluma原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。