Python SolidWorks 二次开发—SolidWorks四种遍历零部件的方式(总结)
文章目录
- Python SolidWorks 二次开发---SolidWorks四种遍历零部件的方式(总结)
- 前言
- 一、四种遍历代码的原理实现
- 1 第一种遍历
- 2 第二种遍历
- 3 第三种遍历
- 4 第四种遍历
- 二、通过Python运行VBA宏
- 1 函数定义
- 2 函数参数说明
- 3 Python调用此函数示例
- 3 调用此函数目的
- 三、四种遍历方法的比较
前言
前面已经介绍四种SolidWorks自带的遍历方法,分别用VBA和Python两种代码实现的,这里就对这四种方法的实际使用效果进行总结,以下为四种遍历的链接
一、四种遍历代码的原理实现
1 第一种遍历
第一种遍历零部件的形式是通过先找到跟组件对象,然后对跟组件进行零部件遍历,当遍历到的是零件时,将零件的模型树名称显示出来,当遍历到的是装配体时,将装配体的模型树名称显示出来,同时递归子零部件,直到所有遍历完成,输出模型树名称;
2 第二种遍历
加粗样式第二种遍历零部件的形式是通过先找到跟组件对象,然后对跟组件的特征进行遍历,判断特征类型是否为“Reference”或者“ReferencePattern”,表示特征为零部件特征,然后将特征转换为组件,输出模型树显示名称,继续判断组件类型是否为装配体,是装配体时递归上面的步骤,直到所有遍历完成,输出模型树名称;
3 第三种遍历
第三种遍历零部件的形式和第二种有点类似,不同点是通过遍历零部件的node进行遍历的,其余过程和第二种遍历方式类似,只是判断条件有所区别;
4 第四种遍历
第四种遍历零部件的形式有别于以上几种,是通过SolidWorks提供的API直接获取到已经打开的所有文件的全路径名元组,然后将他们再循环显示出来即可
二、通过Python运行VBA宏
1 函数定义
Function RunMacro2( _
ByVal FilePathName As System.String, _
ByVal ModuleName As System.String, _
ByVal ProcedureName As System.String, _
ByVal Options As System.Integer, _
ByRef Error As System.Integer _
) As System.Boolean
2 函数参数说明
FilePathName : 宏全路径名
ModuleName 宏模块的名称
ProcedureName 宏模块中运行函数或过程的名称
Options 运行宏的选项
Error 运行宏后回产生的错误
3 Python调用此函数示例
import win32com.client
from swconst import constants
import pythoncom
def main():
sldver=2018
swApp=win32com.client.Dispatch(f'SldWorks.Application.{sldver-1992}')
swApp.CommandInProgress =True
swApp.Visible =True
runMacroError=win32com.client.VARIANT(pythoncom.VT_BYREF | pythoncom.VT_I4, -1)
boolstatus = swApp.RunMacro2("c:\test\RunMacroSub.swp", "RunMacroSub1", "main",
constants.swRunMacroUnloadAfterRun, runMacroError)
if __name__ == '__main__':
main()
3 调用此函数目的
调用此函数主要是为了比较各种递归遍历所用的时间
三、四种遍历方法的比较
为了测试四种方法所用时间,统一遍历有864个零部件的装配体,并都打印出来名称,所用时间如下表所示,所用时间是计算8次的平均值:
调用形式 | 所用时间(s) | 优点 | 缺点 |
VBA宏第一种方式 | 2.461551 | 耗时少,可直接操作组件名或配置名 | 无法保证模型树序列 |
VBA宏第二种方式 | 6.010254 | 可保持模型树序列 | 耗时稍长 |
VBA宏第三种方式 | 9.043458 | 可保持模型树序列,可直接操作node | 耗时最长 |
VBA宏第四种方式 | 0.88086 | 耗时最少 | 只能获取到零部件路径名,无法按模型树排序 |
Python调用 VBA宏第一种方式 | 1.00662 | 无法获得返回值到Python | |
Python调用 VBA宏第二种方式 | 2.29611 | 无法获得返回值到Python | |
Python调用 VBA宏第三种方式 | 8.887979 | 无法获得返回值到Python | |
Python调用 VBA宏第四种方式 | 0.302731 | 无法获得返回值到Python | |
Python第一种方式 | 3.902943 | 耗时少,可直接操作组件名或配置名 | 无法保证模型树序列 |
Python第二种方式 | 14.73471 | 保持模型树序列 | 耗时稍长 |
Python第三种方式 | 80 | 保持模型树序列 | 耗时最长 |
Python第四种方式 | 0.491186 | 耗时最少,可直接操作node | 只能获取到零部件路径名,无法按模型树排序 |
时间总结:
- Python的耗时普遍偏长,第四个除外,这也符合Python语言的特性;
- Python调用VBA宏用时最短是因为不需要打印零部件名称
- 所有调用方式第四种时间上是最优的,第三种都是比较耗时的
使用场景总结:
- 对于追求效率的遍历可才采用第四种方式
- 对于有模型树排序要求的可采用第二种方式
- 对于有node操作的可采用第三种方式,但此种效率很低,不是必须不建议用
- 第一种方式虽然耗时相对较少,但不能按模型树排序,有修改配置选项的可采用此种排序
- 对于批量改名,改属性的操作可直接用第四种方法实现,效率最高
- 对于需要按模型树序号形式导出BOM的第二种方法最实用
- Python调用 VBA宏的方式不适合有返回值的交互操作
- 具体如何使用,可根据实际使用需求选择,这里只是简单的做了耗时和功能说明