You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 21:22:37