本文摘要(由AI生成):
这篇文章主要介绍了如何使用 Python 的tkinter
库和pandas
库,根据csv
格式的载荷数据,自动快速创建载荷以及分析步,进行差速器壳体强度分析。文章提供了两个版本的代码,初级版和高级版,并对每个版本的代码进行了详细的解释和使用说明。同时,文章还介绍了SimLab 二次开发的基本思路和接口,以及如何确认 SimLab 支持的 Python 库。
注意:本文所有代码都基于 Altair SimLab™ 2020.1 经典界面。
1. 分析工况介绍
差速器强度分析时要考虑螺栓预紧力,另外针对不同档位有 37 个工况,每个工况中有 4 个载荷加载点,加载点上受力和转矩。
图1 差速器壳体模型
载荷数据来自实验或者前期的多体动力学分析,保存为 csv 格式,可使用 Python 中的 pandas.read_csv 工具读取数据。csv 文件中每一行表示一个工况,每个工况都有 4 个载荷加载点,每个加载点都受 3 个方向的集中力和 3 个方向的转矩。
图2 载荷表(点击图片可查看高清大图)
2. 代码最终效果
根据不同的需求,在文末下载链接中提供两个版本的代码:初级版和高级版。
初级版可以认为是代码初稿,逻辑结构简单,但刚好能实现所需功能。代码将所有载荷步放到一个 Solution 中,且载荷和分析步都是自动编号,工况识别不方便。
图3 初级版效果
高级版在初级版上经过一定的优化,考虑了更多可能存在的问题,结构逻辑相对更复杂,代码可将分析步名称自动设置为 csv 文件中对应的分析步名称,以便识别工况,并且自动根据工况分组创建 6 个 Solution。
图4 高级版效果
3. 代码使用方法
两个版本的代码都有 4 个修改点,使用代码前需先修改,然后将代码复 制到 SimLab 中的 Python 窗口,按回车即可运行。
注意,修改代码时请使用英文输入法,否则可能会报错。
修改点1
指定载荷数据 csv 文件绝对路径。Windows 系统默认是左斜杠,因此复 制路径后需使用转义字符 r 进行转义。
初级版:
loadcase_file=pd.read_csv(r'D:\technical document\SimLab\Automation\wechat_article\CH4_fastloadcase\force_moment_data.csv',encoding='gb18030')
高级版:
filepath = r'D:\technical document\SimLab\Automation\wechat_article\CH4_fastloadcase\force_moment_data.csv'
修改点2
指定载荷加载点节点编号,可指定任意多个加载点,若增加加载点,csv 文件中需指定相应的载荷数据列,每个加载点对应 6 列数据。
初级版:
nodeid = ['535410', '535409', '535406', '535405']
高级版:
nodeid = [535410,535409,535406,535405]
修改点3
指定载荷步数量,当前共 37 个工况,若增加工况数量,需增加 csv 文件行数,每个工况一行数据。
初级版:
loadcase_count = 37
高级版:
LoadcaseCount = 37
修改点4
设置预紧力大小,当前预紧力为1000N
初级版:
pretension('1000',32)
高级版:
pretension_force = 1000
初级版和高级版两个版本的代码都不到 300 行,4 个修改点在代码末尾有明确的注释。
注意:Python 中以 # 开头的行为注释行,# 后面的内容都是注释。
图5 初级版修改点
图6 高级版修改点
4. 代码撰写思路
SimLab 中做二次开发的基本思路为:
1)将需要实现的功能在 SimLab 界面中手动操作一遍,录制为宏代码;
2)修改宏代码,增强代码通用性。相当于 SimLab 提供了砖头,只需用 Python 语言将砖头按一定的结构叠在一起即可。
差速器强度分析需要用到创建 Solution、创建 loadcase、创建集中力和转矩、施加预紧力、关联预紧力工况等操作,撰写代码前需通过 Scripting - Record 工具录制好相应的宏代码。
录制好宏代码后,建议将每个功能对应的宏代码转换为函数,并对可能改变的对象进行替换,以备调用。
写代码时,建议开始位置导入需要使用的库,中间位置定义各种工具函数,末尾定义主函数调用前面定义的工具函数,即函数式编程,这种结构容易保证代码的逻辑清晰,可读性强。
下面是初级版代码中定义力/转矩的函数,调用函数时需指定节点编号数组 nodeid,节点载荷数组 force,以及载荷步编号 forceid 三个变量。
图7 载荷创建函数
SimLab 宏代码中所有对象都是字符串,其修改方法为 ’’’+variable+’’’,如载荷创建函数图中指定 Model 名称对应的代码,将模型名称由:
A_transmissional_housing_v31_SM.gda
修改为
'''+simlab.getModelName("FEM")+'''
simlab.getModelName(“FEM/CAD”) 为 SimLab 中获取模型名称的接口,若括号中为 “FEM” 则表示获取网格模型名称,若括号中为 “CAD” 则表示获取几何模型名称:
<Model>'''+simlab.getModelName("FEM")+'''</Model>
定义集中力对应的代码中,将X方向的载荷大小由具体数值修改为 '''+str(force[6*num+0])+''',读取 force 数组中的对象,并通过 str() 函数将其转换为字符串:
<Force-Fx Value="'''+str(force[6*num+0])+'''"/>
5. SimLab二次开发接口
SimLab 2020.1中提供了五十多个接口,涉及到 Group、Entity、Parameters 以及后处理等方面,打开 SimLab 后按 F1 键可打开帮助文档,其中有详细介绍,每个接口都有示例代码(Sample Script)与使用说明。
图8 SimLab接口
本文对应的代码中主要使用了三个接口:
▇ 1、获取模型名称
SimLab 中很多操作都和模型名称相关,可用该接口自动获取模型名称,从而提高模型通用性。
simlab.getModelName("FEM")
▇ 2、根据前后缀识别Body
该接口可用于识别螺栓体,SimLab 自动创建的螺栓名称都以 “Body” 开头,通过下面的代码可将所有螺栓 Body 名称保存到变量 BodyNameList 中。
modelname = simlab.getModelName("FEM")
substringlist = ['Bolt*']
BodyNameList = simlab.getBodiesWithSubString(modelname, substringlist)
▇ 3、得到整个模型最大节点编号之后的下一个节点编号
比如整个模型最大节点编号为 999,则下面代码得到的编号为 1000。该接口是 SimLab 2020.1 新功能,之前的版本中不支持该接口,在需要创建节点时使用该接口,可确保赋予的节点编号没有被占用。
simlab.getNextNodeID(modelname)
6.SimLab Python库支持
Python 有大量的标准库,另外还有丰富的第三方库。SimLab 已经支持了 Python 中大部分常用库,如本文代码中涉及到的 os、sys、numpy 以及 pandas 库。撰写代码之前如何确认想用的 Python 库是否已经被 SimLab 支持了呢?
有两种办法可以进行确认:
▇ 方法一:使用 import 方法直接导入库,若导入后不报错,即表示已经支持。
▇ 方法二:使用 help(“modules”) 查询,可输出 SimLab 支持的所有库,目前支持约 200 个库。