在使用HyperMesh建模,使用Optistruct求解Adams中性文件时,可能会面临着分布载荷加载的问题。 如果需要在柔性体上加载模态力,那么需要先生成 xxx.loads 的载荷文件,再使用ADAMS Flex Toolkit将载荷文件写入mnf文件中,如果数据点较多,就需要编程完成载荷文件的自动生成,下面给出1种代码供参考。
这里有几个前提: 1 将需要加载分布载荷的节点建立SET集合; 2 节点集合的ID号需要是1-9的个位数,因为这里没有做格式的适配,默认为1; 3 将SET集合输出到FEM文件中。
# 弹出对话框输入文件路径,载荷方向及数值
# 打开FEM文件,读取包含所有要施加载荷的节点SET,获得所有节点信息
# 新建模态力载荷文件,并写入信息,关闭文件
import re
from tkinter import filedialog
from tkinter import messagebox
from tkinter.simpledialog import *
def makeAdamsLoadFile(filename, setnum, direction, force): # 定义函数
# 打开FEM文件
with open(filename, mode='r') as file: # 打开有限元文件
file.seek(0, 2) # 移动指针到文件末尾
eof = file.tell() # 文件包含的所有指针
file.seek(0, 0) # 重新将指针移动到文件开头
line = file.readline() # 读取一行
setStartLine = "SET " + str(setnum) + " GRID LIST " # 注意不要修改SET文件格式
setEndLine = '$' # 定义SET结束标志符
gridNum = [] # 初始化节点编号列表
while setStartLine not in line: # 判断是否找到需要的set语句
line = file.readline()
if file.tell() >= eof: # 判断是否到文件末尾
messagebox.showinfo('提示', '没有找到SET!') # 弹出对口框
break
else:
while setEndLine not in line: # 找到SET语句
line = file.readline() # 读取一行
gridLine = re.findall("\d+\.?\d*", line) # 获取行内节点号
if gridNum == []:
gridNum = list(map(int, gridLine)) # 创建节点编号列表
else:
gridNum = gridNum + list(map(int, gridLine)) # 节点编号列表增加数据
if file.tell() >= eof: # 判断是否到文件末尾
messagebox.showinfo('提示', '没有找到SET结束标识!') # 弹出对口框
break
else: # 写入文件
newline = []
newline.append('%C My first subcase') # 第一行需要写的内容,可以在生成的文件自己更改
for i in gridNum:
newline.append(str(i) + ' ' + direction + ' ' + str(force)) # 生成内容列表
newfilename = filename + '.loads' # 新文件名称
with open(newfilename, mode='w', encoding='utf-8') as newfile:
for content in newline: # 将新内容逐行写入
newfile.write(content + "\n")
newfile.close()
messagebox.showinfo('提示', '已生成loads文件!') # 弹出对口框
file.close()
# 运行脚本
if __name__ == '__main__':
# filename = "E:\\02_Work\\02 Project\\2023\\03 Adams\\230918\\Roller130.fem"
# setnum = 1
# direction = "FY"
# force = 1
filename = filedialog.askopenfilename(title="请选择包含SET的FEM文件")
setnum = askstring(title="", prompt="请输入SET编号", initialvalue="1")
direction = askstring(title="", prompt="请输入载荷方向", initialvalue="FY")
force = askstring(title="", prompt="请输入载荷数值", initialvalue="1")
makeAdamsLoadFile(filename, setnum, direction, force)