直播演示代码整理如下:
from abaqus import *
from abaqusConstants import *
from textRepr import *
import odbAccess
import numpy as np
import os
import sys, os.path
work_dir = "C:\\04_zhuangpeiti"
input_odb = os.path.join(work_dir, "Job-1.odb")
myOdb = odbAccess.openOdb(input_odb, readOnly=False)
#print(len(myOdb))
#myFrames = myOdb.steps["Step-1"].frames
#rootAssembly
myrootAssembly = myOdb.rootAssembly
#print(myrootAssembly)
##{' ALL ELEMENTS': 'OdbSet object', 'WarnElemDistorted': 'OdbSet object'}
#######################################################instances#######################################################
#element_data = myrootAssembly.instances.Partinstances.elements
instances_data = myrootAssembly.instances
#instances_data = list(instances_data)
keys_list = list(instances_data.keys())
#获取装配体PART列表;
muliti_part_instances = keys_list[:2]
#print(muliti_part_instances[0])
#######################################################PART#######################################################
#单元节点均在part下边, 循环获取各part里面的单元和节点;
#muliti_part_instance = muliti_part_instances[1]
#PART_data = myrootAssembly.instances[muliti_part_instance]
#定义装配体描述每个part节点数和单元数的列表,最后输出到txt中;
part_label_node_count = []
#定义装配体节点合并列表,用于合并所有part节点列表,并写入txt
data_0_mergeds = []
k = 0
#利用while循环获取装配体中每个part中的节点
while k < len(muliti_part_instances):
muliti_part_instance = muliti_part_instances[k]
PART_data = myrootAssembly.instances[muliti_part_instance]
elements_data = PART_data.elements
#print("TWOBLOCK:", k, len(elements_data))
#获取PART-1-1中节点数据,nodes_data为节点对象集合,里面包含节点编号、节点坐标等一系列数据;
nodes_data = PART_data.nodes
#print(len(nodes_data))
part_label_node_count.append((muliti_part_instances[k],"elements_count:", len(elements_data),"nodes_count:", len(nodes_data)))
#print(nodes_data[0])
#获取节点坐标
i = 0
#定义节点坐标列表;
node_xyz_coordinates = []
#定义节点编号列表
node_labels = []
while i < len(nodes_data):
#获取节点坐标
node_xyz_coordinate = nodes_data[i].coordinates
#获取节点编号
node_label = nodes_data[i].label
#判断如果节点坐标不为空,则将坐标添加到列表node_xyz_coordinates中
if node_xyz_coordinates is not None:
node_xyz_coordinates.append(node_xyz_coordinate)
#类似判断节点label如果不为空则添加到列表node_labels中
if node_label is not None:
node_labels.append(node_label)
i +=1
## 使用列表推导式将每个元素转换为列表
node_xyz_coordinates_as_list = [list(node) for node in node_xyz_coordinates]
#>>>
#合并节点编号和节点坐标两个列表, node_labels node_xyz_coordinates_as_list ;
data = list(zip(node_labels, node_xyz_coordinates_as_list))
#将 data 元组中的每个元素合并为一个长度为4的一维NumPy数组
#data_0_mergeds = []
j = 0
while j < len(data):
data_0_merged = np.concatenate((np.array([data[j][0]]), data[j][2]))
data_0_mergeds.append(data_0_merged)
j +=1
k +=1
#列表转数组,为了利用 shap 获取列数量;
data_0_mergeds = np.array(data_0_mergeds)
#print(len(data_0_mergeds))
# shape 可获取数组列数;
#第1列(int) 第2列(float) 第3列(float) 第4列(float)
#节点编号 X Y Z
#######################################################输出节点id和坐标#######################################################
np.savetxt(r"C:\\04_zhuangpeiti\\multi_part__nodes_out.txt", data_0_mergeds, fmt=("%d",) + ("%.10f",)*(data_0_mergeds.shape[1]-1))
#data_0_mergeds.shape[1]为列数4, 减去1代表剩下的三列数为浮点;
input_multi_part__nodes_out = os.path.join(work_dir, "multi_part__nodes_out.txt")
# 打开文件
#part_label_node_count = [('TWOBLOCK-1-1', 'elements_count:', 1000, 'nodes_count', 1331), ('TWOBLOCK-2-1', 'elements_count:', 700, 'nodes_count', 968)]
results_formatted = ["%s %s %d %s %d" % result[0:5] for result in part_label_node_count]
#将"TWOBLOCK-1-1 elements_count: 1000 nodes_count: 1331, TWOBLOCK-2-1 elements_count: 700 nodes_count: 968"插入到第一行
with open(input_multi_part__nodes_out, "r+") as f:
# 读取原文件内容
content = f.read()
# 将列表转换成字符串
my_string = ', '.join(results_formatted)
# 在文件开头插入新的内容
f.seek(0, 0)
f.write(my_string + '\n' + content)
有问题,私信;