#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ export_planquadrat.py - Berechnet das Planquadrat eines Blocks aus x/y-Koordinate. Liest die aktive Planquadrat-Konfiguration aus cfg/export.cfg ([Planquadrate] -> section=, z.B. Planquadrate_AN) und rundet die x/y-Koordinate eines Blocks (mm, wie im Roh-JSON von export.lsp) je Achse auf die konfigurierte Schrittweite (in Metern) herunter. Nur von export_csv.py genutzt (EXPORTCSV), nicht von export_sivas.py. """ import configparser from export_blockpatterns import cfg_path_from_env def load_planquadrat_config(cfg_path=None): """Liest die aktive Planquadrat-Konfiguration aus export.cfg. Rueckgabe: dict mit x_step_mm, x_alpha, y_step_mm, y_alpha, format, oder None, wenn [Planquadrate] bzw. die referenzierte Sub-Sektion fehlt. """ if cfg_path is None: cfg_path = cfg_path_from_env() # inline_comment_prefixes noetig, da export.cfg Werte wie # "numerisch # zahlen, von links nach rechts, 2m pro Spalte" nutzt. parser = configparser.ConfigParser(inline_comment_prefixes=("#",)) parser.read(cfg_path, encoding="utf-8") if not parser.has_section("Planquadrate"): return None section_name = parser.get("Planquadrate", "section", fallback=None) if not section_name or not parser.has_section(section_name): return None sec = parser[section_name] return { "x_step_mm": float(sec.get("x_step", "1")) * 1000.0, "x_alpha": sec.get("x_description", "numerisch").strip().lower().startswith("alpha"), "y_step_mm": float(sec.get("y_step", "1")) * 1000.0, "y_alpha": sec.get("y_description", "numerisch").strip().lower().startswith("alpha"), "format": sec.get("format", "{x}/{y}").strip(), } def _index_to_alpha(n): """Wandelt einen 1-basierten Index in eine Buchstaben-Bezeichnung um. 1=A, 26=Z, 27=AA, 28=AB, ... (wie Excel-Spaltennamen). """ result = "" while n > 0: n, remainder = divmod(n - 1, 26) result = chr(65 + remainder) + result return result def _index_for(coord_mm, step_mm): """1-basierter Planquadrat-Index einer Koordinate fuer eine Schrittweite.""" return int(coord_mm // step_mm) + 1 def compute_planquadrat(x_mm, y_mm, cfg): """Berechnet die Planquadrat-Bezeichnung fuer eine x/y-Koordinate (mm).""" x_idx = _index_for(x_mm, cfg["x_step_mm"]) y_idx = _index_for(y_mm, cfg["y_step_mm"]) x_label = _index_to_alpha(x_idx) if cfg["x_alpha"] else str(x_idx) y_label = _index_to_alpha(y_idx) if cfg["y_alpha"] else str(y_idx) return cfg["format"].format(x=x_label, y=y_label)