new project structure
This commit is contained in:
0
rfg_adc_plotter/utils/__init__.py
Normal file
0
rfg_adc_plotter/utils/__init__.py
Normal file
50
rfg_adc_plotter/utils/formatting.py
Normal file
50
rfg_adc_plotter/utils/formatting.py
Normal file
@ -0,0 +1,50 @@
|
||||
"""
|
||||
Утилиты для форматирования данных и парсинга параметров.
|
||||
"""
|
||||
|
||||
from typing import Any, Mapping, Optional, Tuple
|
||||
|
||||
import numpy as np
|
||||
|
||||
|
||||
def format_status_kv(data: Mapping[str, Any]) -> str:
|
||||
"""Преобразовать словарь метрик в одну строку 'k:v'."""
|
||||
|
||||
def _fmt(v: Any) -> str:
|
||||
if v is None:
|
||||
return "NA"
|
||||
try:
|
||||
fv = float(v)
|
||||
except Exception:
|
||||
return str(v)
|
||||
if not np.isfinite(fv):
|
||||
return "nan"
|
||||
# Достаточно компактно для статус-строки.
|
||||
if abs(fv) >= 1000 or (0 < abs(fv) < 0.01):
|
||||
return f"{fv:.3g}"
|
||||
return f"{fv:.3f}".rstrip("0").rstrip(".")
|
||||
|
||||
parts = [f"{k}:{_fmt(v)}" for k, v in data.items()]
|
||||
return " ".join(parts)
|
||||
|
||||
|
||||
def parse_spec_clip(spec: Optional[str]) -> Optional[Tuple[float, float]]:
|
||||
"""Разобрать строку вида "low,high" процентов для контрастного отображения водопада спектров.
|
||||
|
||||
Возвращает пару (low, high) или None для отключения. Допустимы значения 0..100, low < high.
|
||||
Ключевые слова отключения: "off", "none", "no".
|
||||
"""
|
||||
if not spec:
|
||||
return None
|
||||
s = str(spec).strip().lower()
|
||||
if s in ("off", "none", "no"):
|
||||
return None
|
||||
try:
|
||||
p0, p1 = s.replace(";", ",").split(",")
|
||||
low = float(p0)
|
||||
high = float(p1)
|
||||
if not (0.0 <= low < high <= 100.0):
|
||||
return None
|
||||
return (low, high)
|
||||
except Exception:
|
||||
return None
|
||||
Reference in New Issue
Block a user