def get_longest_flow_area_by_pipes(flow_areas: List[FlowArea]) -> Optional[FlowArea]:
"""
Получает самый протяженный участок карты течения по количеству pipesIds
"""
if not flow_areas:
return None
try:
return max(flow_areas, key=lambda flow_area: len(flow_area.pipesIds or []))
except (TypeError, ValueError, AttributeError):
return None
def filter_flow_areas_with_available_flow(flow_areas: List[FlowArea]) -> List[FlowArea]:
"""
Оставляет только участки карты течения с доступным течением
"""
return [flow_area for flow_area in flow_areas if getattr(flow_area, "isFlowAvailable", False)]
def get_diagnostic_area_base_ids() -> list[int]:
"""
Возвращает список id базовых диагностических участков из константы DIAGNOSTIC_AREA_BASE_IDS
"""
return [pair[0] for pair in TestConst.DIAGNOSTIC_AREA_BASE_IDS.values()]
def diagnostic_area_title(du_id: int) -> str:
"""
Возвращает строковое представление ДУ: id и название из DIAGNOSTIC_AREA_BASE_IDS
"""
for name, pair in TestConst.DIAGNOSTIC_AREA_BASE_IDS.items():
if pair[0] == du_id:
return f"{du_id} ({name})"
return str(du_id)
def determine_stationary_status_by_majority(statuses: list[StationaryStatus]) -> Optional[StationaryStatus]:
"""
Определяет общий режим МТ по правилу большинства ДУ в одном статусе.
При равенстве количества выбирается статус с максимальным значением enum.
"""
if not statuses:
return None
counts = Counter(statuses)
max_count = max(counts.values())
candidates = [status for status, count in counts.items() if count == max_count]
return max(candidates, key=lambda status: status.value)
def collect_mt_modes_from_output_signals(
controlled_site_signals: list,
) -> list[tuple[SiteKpKp, StationaryStatus]]:
"""
Собирает режимы МТ (SignalType.REGLU) по всем участкам КП-КП из OutputSignalsInfo
"""
all_signals_dict = extract_signal_on_site_and_segment(controlled_site_signals)
site_modes = []
for site in SiteKpKp:
mt_mode = get_signal_value(all_signals_dict, site.site_key, SignalType.REGLU)
if mt_mode is not None:
site_modes.append((site, mt_mode))
return site_modes