如何修改Abaqus Python代码以仅提取指定节点集的坐标?
提取Abaqus ODB中特定节点集的坐标
我已经能通过脚本从.odb文件提取全部节点坐标,但需要仅提取名为"NS-1"的特定节点集坐标,现有方案都没奏效,求修改代码。
原代码:
import sketch import visualization import xyPlot import displayGroupOdbToolset as dgo import connectorBehavior import shutil import os import sys from odbAccess import openOdb from odbAccess import openOdb # 重复导入 for ODBname in os.listdir("D:/AbaqusWorking/Coordtest"): ODBnamefull = "D:/AbaqusWorking/Coordtest/Job-1.odb" # 循环未用到ODBname,固定处理单个文件 odb = openOdb(path=ODBnamefull) assembly = odb.rootAssembly modelname = "Test" session.viewports['Viewport: 1'].odbDisplay.setFrame(step=0, frame=1) numNodes = 0 f = open("D:/AbaqusWorking/Coordtest/Testing.csv", "w") for name, instance in assembly.instances.items(): n = len(instance.nodes) print 'Number of nodes of instance %s: %d' % (name, n) numNodes = numNodes + n f.write("Name,Node,X,Y,Z" + "\n") # 每个实例都写表头,会重复 if instance.embeddedSpace == THREE_D: for node in instance.nodes: f.write(str(modelname) + "," ) f.write(str(node.label) + "," ) f.write(str(node.coordinates[0]) + "," + str(node.coordinates[1]) + "," + str(node.coordinates[2]) + "\n") else: for node in instance.nodes: f.write( str(node.label) + ";" ) f.write(str(node.coordinates[0]) + "," + str(node.coordinates[1]) + "," + str(node.coordinates[2]) + "\n") f.write( "*End Part" ) print 'Write to file complete' f.close()
修改后的代码(提取指定节点集"NS-1")
import os import sys from odbAccess import openOdb # 目标ODB文件路径 odb_path = "D:/AbaqusWorking/Coordtest/Job-1.odb" # 要提取的节点集名称 target_node_set = "NS-1" # 输出CSV路径 output_csv = "D:/AbaqusWorking/Coordtest/NS-1_Coordinates.csv" # 打开ODB文件 odb = openOdb(path=odb_path) assembly = odb.rootAssembly # 获取目标节点集 # 优先检查装配体层级的节点集,若不存在则遍历实例查找 node_set = None if target_node_set in assembly.nodeSets: node_set = assembly.nodeSets[target_node_set] else: # 遍历所有实例查找节点集 for inst_name, instance in assembly.instances.items(): if target_node_set in instance.nodeSets: node_set = instance.nodeSets[target_node_set] print(f"在实例{inst_name}中找到节点集{target_node_set}") break if not node_set: print(f"未找到节点集{target_node_set}") odb.close() sys.exit(1) # 写入CSV文件 with open(output_csv, "w") as f: # 写入表头 f.write("ModelName,NodeLabel,X,Y,Z\n") model_name = "Test" # 遍历节点集中的所有节点 for node in node_set.nodes: coords = node.coordinates # 处理2D/3D坐标,确保Z值存在(2D时补0) x = coords[0] y = coords[1] z = coords[2] if len(coords) == 3 else 0.0 # 写入一行数据 f.write(f"{model_name},{node.label},{x},{y},{z}\n") print(f"节点集{target_node_set}的坐标已成功写入{output_csv}") odb.close()
关键修改说明
- 移除冗余导入:删掉了和节点坐标提取无关的模块(如sketch、visualization等),简化代码
- 定位目标节点集:先检查装配体层级的nodeSets,若不存在则遍历实例查找,覆盖两种节点集定义场景
- 遍历节点集节点:直接从目标nodeSet中获取nodes,而非遍历所有实例的全部节点
- 优化CSV写入:只写一次表头,统一处理2D/3D坐标(2D时Z轴补0),避免格式混乱
- 修复无效逻辑:去掉了原代码中未实际使用的os.listdir循环,直接指定目标ODB文件路径
内容的提问来源于stack exchange,提问作者oddubcoder
相关产品推荐
相关产品推荐

