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

如何用Python从ANSYS .inp文件中正确提取并修改节点坐标

如何用Python从ANSYS .inp文件中正确提取并修改节点坐标

我完全懂你现在的困扰——这种ANSYS .inp文件的节点格式真的很反人类,X坐标和前面的0粘在一起,Y和Z坐标之间连个空格都没有,常规的按空格分割或者转CSV完全不管用。不过别担心,用Python的正则表达式就能精准解决这个问题,我给你一步步梳理清楚:

首先先拆解下你给出的节点行格式:
每行实际是「节点ID + 一个0 + X坐标 + Y坐标 + Z坐标」,但坑点在于:

  • X坐标前面多了个冗余的0,和坐标的正负号直接连在一起(比如0-3.31E-02实际是-3.31E-02)
  • Y坐标结尾直接跟Z坐标的正负号,没有空格分隔(比如4.50E-02-1.22E-01实际是4.50E-02和-1.22E-01)

步骤1:定位节点数据块

ANSYS的.inp文件里,节点数据一般从*NODE关键字开始,到下一个以*开头的关键字(比如*ELEMENT)结束。我们需要先锁定这个区间,避免处理无关内容。

步骤2:用正则表达式精准提取字段

针对这种粘连的格式,我们可以写一个正则表达式来匹配每个字段,把藏在粘连字符里的坐标值揪出来:

import re
# 匹配节点行的正则,专门处理粘连问题
node_pattern = re.compile(r'^(\d+)\s+0\s+0?([+-]?\d+\.\d+E[+-]\d{3})\s+(\d+\.\d+E[+-]\d{3})([+-]?\d+\.\d+E[+-]\d{3})$')

这个正则的作用:

  • ^(\d+):匹配开头的节点ID(纯数字)
  • \s+0\s+:匹配中间固定的那个0(前后带空格)
  • 0?([+-]?\d+\.\d+E[+-]\d{3}):匹配X坐标,自动忽略前面冗余的0,提取科学计数法的数值
  • \s+(\d+\.\d+E[+-]\d{3}):匹配Y坐标(如果你的数据里Y也可能是负数,把这里改成[+-]?\d+...即可)
  • ([+-]?\d+\.\d+E[+-]\d{3}):匹配和Y粘连的Z坐标,直接提取带符号的科学计数法数值

步骤3:完整的处理代码

下面是包含「读取-提取-修改-写入」全流程的Python代码,直接就能用:

import re

def process_ansys_inp(input_file, output_file, z_scale=1.5):
    # 正则匹配节点行
    node_pattern = re.compile(r'^(\d+)\s+0\s+0?([+-]?\d+\.\d+E[+-]\d{3})\s+(\d+\.\d+E[+-]\d{3})([+-]?\d+\.\d+E[+-]\d{3})$')
    in_node_section = False
    modified_lines = []

    with open(input_file, 'r') as f:
        for line in f:
            stripped_line = line.strip()
            # 进入节点数据区
            if stripped_line.startswith('*NODE'):
                in_node_section = True
                modified_lines.append(line)
                continue
            # 离开节点数据区(遇到下一个*开头的关键字)
            if in_node_section and stripped_line.startswith('*'):
                in_node_section = False
                modified_lines.append(line)
                continue
            # 处理节点行
            if in_node_section and stripped_line:
                match = node_pattern.match(stripped_line)
                if match:
                    node_id = match.group(1)
                    x = float(match.group(2))
                    y = float(match.group(3))
                    z = float(match.group(4)) * z_scale  # 这里修改Z坐标,可按需调整

                    # 按清晰格式写入修改后的数据,避免再出现粘连问题
                    modified_line = f"{node_id} 0 {x:.13E} {y:.13E} {z:.13E}\n"
                    modified_lines.append(modified_line)
                else:
                    # 匹配失败时保留原行,防止遗漏特殊格式的内容
                    modified_lines.append(line)
            else:
                # 非节点区的内容直接保留
                modified_lines.append(line)

    # 写入修改后的文件
    with open(output_file, 'w') as f:
        f.writelines(modified_lines)

# 使用示例:替换成你的输入输出文件路径
if __name__ == "__main__":
    process_ansys_inp('input.inp', 'modified_output.inp', z_scale=1.5)

代码说明

  1. 精准定位节点区:通过*NODE和后续的*关键字,确保只处理节点数据,不影响文件其他内容
  2. 容错处理:如果遇到正则匹配失败的行,会直接保留原内容,避免数据丢失
  3. 格式优化:修改后的节点行用空格清晰分隔每个字段,彻底解决原文件的粘连问题
  4. 灵活修改:默认是把Z坐标乘以1.5,你可以直接修改代码里的坐标处理逻辑(比如修改X或Y)

测试你的示例数据

用你给出的三行测试数据运行代码后,输出的节点行会变成:

1 0 -3.3131786040000E-02 4.5036802300000E-02 -1.8344630160000E-01
2 0 -2.7267243100000E-02 3.7109654860000E-02 -1.8656611470000E-01
3 0 -2.0034116490000E-02 3.0278565420000E-02 -1.8931694370000E-01

这样就完美解决了提取和修改的问题~

备注:内容来源于stack exchange,提问作者Thasmia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:55:29