最近事情很多,写帖子的频率大幅度降低。
话不多说,这个帖子开源一些处理ODB文件的PYTHON代码,这些程序都不是我写的,是AI写的。对于处理ODB文件,我之前一直热衷于自己查文档、写程序,直到我尝试了用AI写代码,发现很好用,虽然AI编写的代码一般不会一次运行成功,但是不断的报错信息扔给AI,它总能给出正确的程序。
我甚至觉得,AI写代码的效率,取决于我们对问题描述的准确性,当你对问题有足够的了解,并且采用精准的语言描述问题和需求,AI写代码的效率的正确率大幅度提升。
这个函数输入一个参数:ODB文件的位置。输出所有的PART名称。
def get_all_parts(odb_path):
odb = openOdb(odb_path, readOnly=True)
parts = list(odb.rootAssembly.instances.keys())
odb.close()
return parts
这个函数输入的参数依次为:ODB文件路径和PART名称。输出当前PART的所有节点编号。
def get_part_node_labels(odb_path, part_name):
odb = openOdb(path=odb_path, readOnly=True)
nodes = []
for instance in odb.rootAssembly.instances.values():
if instance.name.startswith(part_name):
nodes.extend([node.label for node in instance.nodes])
odb.close()
return nodes
这个函数输入两个参数,分别为ODB文件的路径、分析步名称。输出当前分析步下的帧数目。
def get_step_frame_count(odb_path, step_name):
"""获取指定分析步的帧数"""
try:
odb = openOdb(odb_path, readOnly=True)
# 检查分析步是否存在
if step_name not in odb.steps:
print("错误:未找到以 '%s' 开头的部件实例" % step_name)
odb.close()
return None
# 获取分析步的帧数
step = odb.steps[step_name]
frame_count = len(step.frames)
odb.close()
return frame_count
except Exception as e:
print("错误:未找到以 '%s' 开头的部件实例" % e)
return None
这个函数输入参数依次为:ODB文件的路径、PART名称、节点编号、当前分析步名称和当前帧。输出指定节编号指定帧的U数据。
def get_node_displacement(odb_path, part_name, node_label, step_name, frame_id):
"""获取指定节点在特定帧的位移数据"""
try:
odb = openOdb(odb_path, readOnly=True)
# 获取部件实例(支持前缀匹配)
instance_names = list(odb.rootAssembly.instances.keys())
matching_instances = [name for name in instance_names if name.startswith(part_name)]
if not matching_instances:
print("错误:未找到以 '%s' 开头的部件实例" % part_name)
print("可用部件实例:", instance_names)
return None
instance = odb.rootAssembly.instances[matching_instances[0]]
# 通过遍历查找节点(兼容旧版API)
target_node = None
for node in instance.nodes:
if node.label == node_label:
target_node = node
break
if target_node is None:
print("错误:在部件 '%s' 中未找到节点 %d" % (matching_instances[0], node_label))
return None
# 获取位移场
step = odb.steps[step_name]
frame = step.frames[frame_id]
displacement = frame.fieldOutputs['U']
# 获取节点的位移值
node_disp = displacement.getSubset(region=target_node).values[0].data
odb.close()
return node_disp # 返回 (U1, U2, U3) 元组
except Exception as e:
print("获取位移数据时出错: %s" % e)
return None
这个函数的输入参数依次为:ODB文件路径、当前分析步名称、当前帧和PART名称。输出 当前PART所有节点指定帧的U数据。
def get_part_displacements(odb_path, step_name, frame_id, instance_name):
"""
获取指定部件所有节点在指定帧的位移数据
参数:
odb_path: ODB文件路径
step_name: 分析步名称
frame_id: 帧索引(从0开始)
instance_name: 部件实例名称
返回:
字典 {节点编号: [U1, U2, U3]}
"""
odb = openOdb(odb_path)
step = odb.steps[step_name]
frame = step.frames[frame_id]
instance = odb.rootAssembly.instances[instance_name]
displacement = frame.fieldOutputs['U']
results = {}
for value in displacement.getSubset(region=instance).values:
results[value.nodeLabel] = list(value.data)
odb.close()
return results
上面的程序,都是用AI编写的。除了PYTHON语言本身的计算速度不理想之外,我还没发现有什么缺点,ODB读取速度慢不该PYTHON背锅,当时用FORTRAN写下第一段ABACUS代码的博士,很难想到这个程序会活到后面的AI时代。更想不到AI会挑战数值仿真的地位 。
开源程序不是我的目的,上面的代码随便输入一些指令AI就能写出来。但这恰恰正是问题所在,随便输入一个指令就能写出来,那还要我 干啥?难道只要我输入指令?
目前遍地生花的AI工具不是AI发展的最终形态,也许最终形态这种说法本就不合理,因为事物总是出于动态发展之中的,若是AI只是停留在豆包、DeepSeek这个阶段,那只有一种可能:AI成为历史了。
人总要做一些超越机器的思考,而不是满足于对机器的灵活运用。