如何通过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
这样每次模型运行完成后,只需调用这个函数即可自动导出结果。
关键注意事项
- 结果类型的确认:如果你的PM4Sand材料的Ru, max内部名称不同(比如
ru_max),一定要替换成第一步查到的正确名称。 - 节点/单元选择:如果你的结果是基于单元的(手动操作时选的是单元而不是节点),把
getresults的第三个参数从"node"改成"element"。 - 服务器连接:确保Plaxis Output服务器的端口号正确(默认是10001),且模型已运行完成再提取结果。
内容来源于stack exchange
相关产品推荐
相关产品推荐

