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

如何通过Python代码从Plaxis 2D提取PM4Sand自定义材料的“Ru, max”液化值并导出为Excel

如何通过Python代码从Plaxis 2D提取PM4Sand自定义材料的“Ru, max”液化值并导出为Excel

我完全理解你现在的痛点——要手动重复上千次模型运行和结果提取,效率太低了!接下来我会结合Plaxis Python API的逻辑,一步步教你自动化实现整个流程,包括目标区域结果提取、时间步数据获取和Excel导出。

先解决你之前的报错问题

你之前调用getresults时直接用ResultTypes.Soil.UserFeatures导致报错,核心原因是:UserFeatures是自定义材料结果的大类集合,不是单个可直接调用的结果类型。你需要指定其中具体的参数(也就是“PM4Sand ru,max”)才能正确获取结果。

第一步:确认自定义参数的正确名称

首先,我们可以先枚举所有可用的自定义材料结果,找到“PM4Sand ru,max”对应的内部名称。运行这段代码就能看到:

import pandas as pd
from plxscripting.easy import new_server

# 连接到Plaxis Output服务器(确保Plaxis软件已打开并加载模型)
s_o, g_o = new_server("localhost", 10001)

# 枚举所有自定义材料结果类型
print("所有自定义材料结果项:")
for idx, feature in enumerate(g_o.ResultTypes.Soil.UserFeatures):
    print(f"索引 {idx}: {feature}")

运行后你会看到类似这样的输出(具体名称取决于你的PM4Sand材料设置):

所有自定义材料结果项:
索引 0: PM4Sand ru,max
索引 1: PM4Sand e
...

记下“PM4Sand ru,max”这个名称(或者对应的索引),后续会用到。

第二步:自动化提取目标区域的Ru, max值

接下来我们要实现你手动操作的核心流程:筛选Y=26~36、X=1的目标区域节点,提取动态阶段每个时间步的Ru, max值,甚至直接计算极值。

完整代码示例

import pandas as pd
from plxscripting.easy import new_server

# ----------------------
# 1. 连接Plaxis服务器并初始化
# ----------------------
s_o, g_o = new_server("localhost", 10001)

# 获取动态阶段(这里假设是最后一个阶段,也可以用具体名称如g_o.Phase_Dynamic)
dynamic_phase = g_o.Phases[-1]

# 确认Ru, max的结果类型(替换成你第一步查到的名称)
ru_max_result = g_o.ResultTypes.Soil.UserFeatures['PM4Sand ru,max']

# ----------------------
# 2. 筛选目标区域的节点(X≈1,Y在26-36之间)
# ----------------------
target_nodes = []
for node in g_o.Nodes:
    # 用浮点数精度判断避免误差
    if abs(node.X - 1) < 1e-3 and 26 <= node.Y <= 36:
        target_nodes.append(node)

target_node_ids = [node.ID for node in target_nodes]
print(f"已筛选到目标区域节点数量:{len(target_node_ids)}")

# ----------------------
# 3. 提取每个时间步的Ru, max值并计算最大值
# ----------------------
# 获取动态阶段所有时间步的Ru, max结果(按节点)
# timesteps="all" 表示获取每一个时间步的数据
ru_all_steps = g_o.getresults(
    dynamic_phase, 
    ru_max_result, 
    "node",  # 结果基于节点,若需要单元结果可改为"element"
    timesteps="all"
)

# 整理每个时间步的最大Ru值
results_list = []
for timestep in ru_all_steps.Timesteps:
    # 获取当前时间步的所有节点结果
    step_data = ru_all_steps[timestep]
    # 筛选目标节点的Ru值
    target_ru_values = [step_data[node_id] for node_id in target_node_ids]
    # 计算当前时间步的最大值
    max_ru = max(target_ru_values) if target_ru_values else None
    
    results_list.append({
        "时间步": timestep,
        "当前步最大Ru值": max_ru
    })

# 计算整个动态阶段的极值(对应手动操作的"Extreme values")
overall_max = max(item["当前步最大Ru值"] for item in results_list if item["当前步最大Ru值"] is not None)
print(f"整个动态阶段的Ru, max极值:{overall_max:.3f}")

# ----------------------
# 4. 导出结果到Excel
# ----------------------
# 转换为DataFrame
df_results = pd.DataFrame(results_list)
# 添加极值行
df_extremes = pd.DataFrame({"指标": ["整个阶段最大Ru值"], "数值": [overall_max]})

# 导出到Excel,分两个sheet存储
with pd.ExcelWriter(f"Ru_Max_Results_{dynamic_phase.Name}.xlsx") as writer:
    df_results.to_excel(writer, sheet_name="各时间步结果", index=False)
    df_extremes.to_excel(writer, sheet_name="极值结果", index=False)

print("结果已成功导出到Excel!")

第三步:适配上千次模型运行的优化

如果你需要运行上千次模型,可以把上述代码封装成函数,每次模型运行完成后调用该函数提取结果,比如:

def extract_and_export_ru_max(model, output_path):
    # 这里的model是当前模型的g_o对象
    dynamic_phase = model.Phases[-1]
    ru_max_result = model.ResultTypes.Soil.UserFeatures['PM4Sand ru,max']
    
    # 重复上述筛选节点、提取结果、导出的逻辑...
    # 最后保存到output_path

这样每次模型运行完成后,只需调用这个函数即可自动导出结果。

关键注意事项

  1. 结果类型的确认:如果你的PM4Sand材料的Ru, max内部名称不同(比如ru_max),一定要替换成第一步查到的正确名称。
  2. 节点/单元选择:如果你的结果是基于单元的(手动操作时选的是单元而不是节点),把getresults的第三个参数从"node"改成"element"。
  3. 服务器连接:确保Plaxis Output服务器的端口号正确(默认是10001),且模型已运行完成再提取结果。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 11:15:27