Source code for opsparser._manager._LoadManager
from ._BaseHandler import BaseHandler
from typing import Any, Optional
[docs]
class LoadManager(BaseHandler):
[docs]
def __init__(self):
self.patterns = {} # 荷载模式: tag -> {type, tsTag, ...}
self.node_loads = {} # 节点荷载: (patternTag, nodeTag) -> values
self.ele_loads = {} # 单元荷载: (patternTag, eleTag) -> values
self.current_pattern = None # 当前荷载模式
[docs]
def handles(self):
return ["pattern", "load", "eleLoad"]
[docs]
def handle(self, func_name: str, arg_map: dict[str, Any]):
if func_name == "pattern":
self._handle_pattern(arg_map)
elif func_name == "load":
self._handle_load(arg_map)
elif func_name == "eleLoad":
self._handle_eleLoad(arg_map)
def _handle_pattern(self, arg_map: dict[str, Any]):
"""处理荷载模式命令"""
# pattern patternType? patternTag tsTag <-factor factor>?
pattern_type = arg_map.get("typeName", "")
tag = arg_map.get("tag", 0)
args = arg_map.get("args", [])
if not pattern_type or tag == 0 or not args:
return
# 第一个参数通常是时程标签
ts_tag = int(args[0])
pattern_info = {"type": pattern_type, "tsTag": ts_tag}
# 检查是否有factor选项
if "-factor" in args and args.index("-factor") + 1 < len(args):
factor_idx = args.index("-factor") + 1
pattern_info["factor"] = float(args[factor_idx])
self.patterns[tag] = pattern_info
# 更新当前荷载模式
self.current_pattern = tag
def _handle_load(self, arg_map: dict[str, Any]):
"""处理节点荷载命令"""
# load nodeTag? <Fx Fy Fz Mx My Mz>?
tag = arg_map.get("tag") # 节点标签
args = arg_map.get("args", []) # 荷载分量
if tag is None or not args:
return
# 使用当前荷载模式
pattern_tag = self.current_pattern
if pattern_tag is None:
return
# 存储节点荷载,键为(荷载模式标签, 节点标签)元组
load_key = (pattern_tag, tag)
self.node_loads[load_key] = args
def _handle_eleLoad(self, arg_map: dict[str, Any]):
"""处理单元荷载命令"""
# eleLoad -ele eleTag1 eleTag2 ... -type -beamUniform Wy <Wz> ...
# 或 eleLoad -range startEleTag endEleTag -type -beamUniform ...
args = arg_map.get("args", [])
# 获取荷载类型
load_type = ""
if "-type" in args and args.index("-type") + 1 < len(args):
type_idx = args.index("-type") + 1
load_type = args[type_idx]
# 提取单元标签列表
ele_tags = []
# 检查是否有-ele选项
if "-ele" in args:
ele_idx = args.index("-ele") + 1
while ele_idx < len(args) and not args[ele_idx].startswith("-"):
try:
ele_tags.append(int(args[ele_idx]))
ele_idx += 1
except (ValueError, TypeError):
break
# 检查是否有-range选项
if "-range" in args and args.index("-range") + 2 < len(args):
range_idx = args.index("-range")
start_tag = int(args[range_idx + 1])
end_tag = int(args[range_idx + 2])
ele_tags.extend(range(start_tag, end_tag + 1))
# 提取荷载分量值
load_values = []
# 对于-beamUniform类型的荷载
if load_type == "-beamUniform" and "-beamUniform" in args:
beam_idx = args.index("-beamUniform") + 1
while beam_idx < len(args) and not args[beam_idx].startswith("-"):
try:
load_values.append(float(args[beam_idx]))
beam_idx += 1
except (ValueError, TypeError):
break
# 使用当前荷载模式
pattern_tag = self.current_pattern
if pattern_tag is None:
return
# 存储每个单元的荷载
for ele_tag in ele_tags:
load_key = (pattern_tag, ele_tag)
self.ele_loads[load_key] = {"type": load_type, "values": load_values}
[docs]
def get_pattern(self, tag: int) -> Optional[dict]:
"""获取指定标签的荷载模式"""
return self.patterns.get(tag)
[docs]
def get_node_load(self, pattern_tag: int, node_tag: int) -> list[float]:
"""获取指定荷载模式下节点的荷载"""
return self.node_loads.get((pattern_tag, node_tag), [])
[docs]
def get_ele_load(self, pattern_tag: int, ele_tag: int) -> dict:
"""获取指定荷载模式下单元的荷载"""
return self.ele_loads.get((pattern_tag, ele_tag), {})
[docs]
def get_patterns_by_time_series(self, ts_tag: int) -> list[int]:
"""获取使用特定时程的所有荷载模式"""
return [tag for tag, info in self.patterns.items() if info.get("tsTag") == ts_tag]
[docs]
def clear(self):
"""清除所有数据"""
self.patterns.clear()
self.node_loads.clear()
self.ele_loads.clear()
self.current_pattern = None