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

文章介绍了如何使用Python进行SolidWorks的二次开发,特别是如何实现COM事件。通过例子展示了在Excel中使用DispatchWithEvents函数处理事件的方法,然后详细解释了由于SolidWorks不支持DispatchWithEvents,因此需要创建自定义事件类并使用win32com.client.getevents来处理SolidWorks中的事件,例如文件打开和新建通知。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

### 使用Python进行SolidWorks二次开发 #### 建立PythonSolidWorks之间的关联 为了使Python能够控制和操作SolidWorks,需要建立两者间的连接。这通常涉及到使用COMComponent Object Model)技术来创建SolidWorks的应用程序对象实例[^2]。 ```python import win32com.client as win32 swApp = win32.Dispatch('SldWorks.Application') ``` 这段代码展示了如何利用`win32com.client`库启动并获取到SolidWorks应用的对象引用,从而为进一步的操作打下基础。 #### 创建简单的自动化脚本 一旦建立了上述链接之后,就可以编写一些基本的命令来执行诸如打开文件、保存文档等常见任务。下面是一个简单例子: ```python def open_and_save_solidworks_file(file_path, save_as=None): swDoc = None try: # 打开指定路径下的模型文件 swDoc = swApp.OpenDoc6( file_path, 1, 0, "", 0, 0) if not swDoc is None and isinstance(save_as, str): # 如果指定了新的保存位置,则另存为新文件 swDoc.SaveAs3(save_as, 0, False) finally: if not swDoc is None: swDoc.Close() ``` 此函数接收两个参数:一个是现有零件或装配体的位置;另一个可选参数用于指示是否要将该文件另存为其他名称。它会尝试加载给定路径中的文件,并在必要时将其重命名存储。 #### 添加自定义菜单项 除了直接调用API外,还可以扩展SolidWorks界面,在其中加入自己的功能按钮或者子菜单选项。这里给出了一种方法来向SolidWorks添加一个新的菜单条目[^3]: ```python from win32com.client import DispatchWithEvents class AddInHandler(object): def OnConnect(self, ThisAddInInst, ConnectMode): self.swApp = ThisAddInInst.Parent commandManager = self.swApp.GetCommandManager(0) newMenuId = commandManager.AddMenuItem(-1,"My Custom Menu", "Click Me!") print(f"Added menu item with ID {newMenuId}") addin_handler_instance = AddInHandler() DispatchWithEvents(ThisAddInInst, addin_handler_instance) ``` 以上代码片段实现了当插件被激活时自动注册一个名为"My Custom Menu"的新菜单入口,并为其分配了一个回调事件处理器以便后续处理用户的点击动作。 #### 遍历零部件结构树 对于复杂的装配体而言,可能还需要遍历内部组件的信息。以下是采用递归方式访问所有子节点的方法之一[^4]: ```python def traverse_components(component_system, indent_level=0): prefix = ' '*indent_level*4 comp_name = component_system.Name2 print(prefix + f"- Component Name: '{comp_name}'") sub_comps = component_system.GetChildren() for sc in sub_comps: traverse_components(sc, indent_level+1) active_doc = swApp.ActiveDoc if active_doc.GetType() == 3: # Check if it's an assembly document type (AssemblyDocumentType = 3) root_comp_sys = active_doc.ComponentSystem traverse_components(root_comp_sys) else: print("Current document isn't an Assembly.") ``` 这个过程从当前活动窗口所指向的那个顶层实体开始逐层深入打印出每一个组成部分的名字及其层次关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值