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中事件的用法不太一样,按照以上示例代码使用即可实现。
事件的使用有时可能会降低效率,是否使用需结合实际使用环境决定。