ABAQUS-Python读取ODB节点数据导出为后处理文件的方法求助
无额外依赖的csv/txt/dat格式导出
该方案使用Python内置的文件操作函数,无需给ABAQUS Python环境安装额外库,直接可运行。以下代码会将X方向节点集的节点编号、X坐标、Y坐标、Z坐标、Z向位移合并输出到同一文件,避免数据对应错误。
from odbAccess import * from numpy import array # -------------原有读取ODB的代码不变------------- odb = openOdb(path='Test_3.odb') lastFrame = odb.steps['Step-1'].frames[1] displacement = lastFrame.fieldOutputs['U'] coords=lastFrame.fieldOutputs['COORD'] NodeSet_x = odb.rootAssembly.instances['CFRP_SKIN_TS-1'].nodeSets['NODE_SET_X_AXIS'] NodeSet_y = odb.rootAssembly.instances['CFRP_SKIN_TS-1'].nodeSets['NODE_SET_Y_AXIS'] centerDisplacement_x = displacement.getSubset(region=NodeSet_x) NodeCoord_x = coords.getSubset(region=NodeSet_x) centerDisplacement_y = displacement.getSubset(region=NodeSet_y) NodeCoord_y = coords.getSubset(region=NodeSet_y) # --------------------------------------------- # 构建节点编号到位移的映射,避免坐标和位移顺序不匹配的问题 disp_dict = {v.nodeLabel: v.data[2] for v in centerDisplacement_x.values} # 导出为csv格式,修改后缀名为.txt或.dat即可导出对应格式 with open('node_x_output.csv', 'w') as f: # 写入表头,可根据需要修改 f.write('节点编号,X坐标,Y坐标,Z坐标,Z向位移\n') for c in NodeCoord_x.values: node_label = c.nodeLabel x, y, z = c.data[0], c.data[1], c.data[2] uz = disp_dict.get(node_label, 0) # 取不到位移时默认填0 # 写csv用逗号分隔,写txt/dat可以改成用制表符\t或者空格分隔 f.write(f'{node_label},{x},{y},{z},{uz}\n') # 如果需要导出Y方向节点集的数据,复用上面的逻辑修改变量名即可 # disp_dict_y = {v.nodeLabel: v.data[2] for v in centerDisplacement_y.values} # with open('node_y_output.csv', 'w') as f: # f.write('节点编号,X坐标,Y坐标,Z坐标,Z向位移\n') # for c in NodeCoord_y.values: # node_label = c.nodeLabel # x, y, z = c.data[0], c.data[1], c.data[2] # uz = disp_dict_y.get(node_label, 0) # f.write(f'{node_label},{x},{y},{z},{uz}\n') odb.close()
格式调整说明
- 把文件后缀名从
.csv改成.txt或者.dat,分隔符从逗号改成\t(制表符),就可以导出txt和dat格式的文件 - 输出路径如果写绝对路径(比如
r'C:\Users\xxx\Desktop\node_x_output.csv'),可以直接把文件输出到指定位置,不用去ABAQUS工作目录查找
导出为xlsx格式
该方案需要先给ABAQUS对应的Python环境安装pandas和openpyxl库,适合需要多Sheet存储、后续用Excel处理的场景。
from odbAccess import * from numpy import array import pandas as pd # -------------原有读取ODB的代码不变------------- odb = openOdb(path='Test_3.odb') lastFrame = odb.steps['Step-1'].frames[1] displacement = lastFrame.fieldOutputs['U'] coords=lastFrame.fieldOutputs['COORD'] NodeSet_x = odb.rootAssembly.instances['CFRP_SKIN_TS-1'].nodeSets['NODE_SET_X_AXIS'] NodeSet_y = odb.rootAssembly.instances['CFRP_SKIN_TS-1'].nodeSets['NODE_SET_Y_AXIS'] centerDisplacement_x = displacement.getSubset(region=NodeSet_x) NodeCoord_x = coords.getSubset(region=NodeSet_x) centerDisplacement_y = displacement.getSubset(region=NodeSet_y) NodeCoord_y = coords.getSubset(region=NodeSet_y) # --------------------------------------------- # 处理X方向节点集数据 output_data_x = [] disp_dict_x = {v.nodeLabel: v.data[2] for v in centerDisplacement_x.values} for c in NodeCoord_x.values: node_label = c.nodeLabel x, y, z = c.data[0], c.data[1], c.data[2] uz = disp_dict_x.get(node_label, 0) output_data_x.append([node_label, x, y, z, uz]) df_x = pd.DataFrame(output_data_x, columns=['节点编号','X坐标','Y坐标','Z坐标','Z向位移']) # 处理Y方向节点集数据 output_data_y = [] disp_dict_y = {v.nodeLabel: v.data[2] for v in centerDisplacement_y.values} for c in NodeCoord_y.values: node_label = c.nodeLabel x, y, z = c.data[0], c.data[1], c.data[2] uz = disp_dict_y.get(node_label, 0) output_data_y.append([node_label, x, y, z, uz]) df_y = pd.DataFrame(output_data_y, columns=['节点编号','X坐标','Y坐标','Z坐标','Z向位移']) # 写入Excel,两个节点集数据分别存两个Sheet with pd.ExcelWriter('node_output.xlsx') as writer: df_x.to_excel(writer, sheet_name='X方向节点集', index=False) df_y.to_excel(writer, sheet_name='Y方向节点集', index=False) odb.close()
依赖安装说明
找到ABAQUS安装目录下的python.exe路径,用该路径下的pip执行安装命令即可,示例:D:\SIMULIA\CAE\2021\win_b64\tools\SMApy\python2.7\python -m pip install pandas openpyxl,注意对应自己的ABAQUS版本和Python版本。
内容的提问来源于stack exchange,提问作者knight0fcake
相关产品推荐
相关产品推荐

