From 5ffe81b3701637e67c55c05d671008d6229baef3 Mon Sep 17 00:00:00 2001 From: Michael Stangl Date: Thu, 23 Jul 2026 13:05:01 +0200 Subject: [PATCH] Sivas-Export: Geruestoption fuer Einzelmodul in allen ILS-Elementen ergaenzt Kreisel, Eckrad, Gefaellestrecke und VarioFoerderer schreiben jetzt neben "Geruest fuer Einzelmodul" auch die gewaehlte Geruestoption (GERUEST_TYP) in die Merkmale. Eckrad bekommt dafuer erstmals eine eigene Gruppierung nach Geruest-Signatur (bisher immer eine gemeinsame Zeile ohne Details); Kreisel/Gefaellestrecke gruppieren nun ebenfalls nach Geruestoption, damit unterschiedliche Optionen nicht mehr in einer Zeile verschwinden. --- lib/export_sivas.py | 64 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 51 insertions(+), 13 deletions(-) diff --git a/lib/export_sivas.py b/lib/export_sivas.py index b50826a..2b1b416 100644 --- a/lib/export_sivas.py +++ b/lib/export_sivas.py @@ -109,14 +109,17 @@ def build_gefaellestrecke_details(block): "Anzahl der Separatoren": attribs.get("ANZAHL_SEPARATOR", "0"), "Anzahl der Scanner": attribs.get("ANZAHL_SCANNER", "0"), "Typ": attribs.get("TYP", "Gefaellestrecke"), + "Geruest fuer Einzelmodul": attribs.get("GERUEST_EINZELMODUL", "0") == "1", + "Geruestoption fuer Einzelmodul": attribs.get("GERUEST_TYP", "Schoenenberger Geruest"), } def kreisel_signature(block): """ Schluessel zur Gruppierung gleichartiger Kreisel: Kreiselart, Abstand, - Anzahl der Separatoren, Anzahl der Scanner und Anzahl der Rampen - entscheiden, ob Kreisel in derselben Sivas-Zeile summiert werden. + Anzahl der Separatoren, Anzahl der Scanner, Anzahl der Rampen sowie + Geruest fuer Einzelmodul/Geruestoption entscheiden, ob Kreisel in + derselben Sivas-Zeile summiert werden. """ attribs = block.get("attribs", {}) return ( @@ -126,14 +129,29 @@ def kreisel_signature(block): attribs.get("ANZAHL_SCANNER", attribs.get("N_SCANNER", "0")), attribs.get("ANZAHL_RAMPEN", attribs.get("N_RAMPEN", "0")), attribs.get("GERUEST_EINZELMODUL", "0"), + attribs.get("GERUEST_TYP", "Schoenenberger Geruest"), + ) + + +def eckrad_signature(block): + """ + Schluessel zur Gruppierung gleichartiger Eckraeder: Geruest fuer + Einzelmodul/Geruestoption entscheiden, ob Eckraeder in derselben + Sivas-Zeile summiert werden. + """ + attribs = block.get("attribs", {}) + return ( + attribs.get("GERUEST_EINZELMODUL", "0"), + attribs.get("GERUEST_TYP", "Schoenenberger Geruest"), ) def gefaellestrecke_signature(block): """ Schluessel zur Gruppierung gleichartiger Gefaellestrecken: Bloecke mit - identischen Massen (Hoehe, Laenge, Winkel, Separatoren, Scanner, Typ) - landen in derselben Sivas-Zeile - nur IDs/Bezeichnung unterscheiden sich. + identischen Massen (Hoehe, Laenge, Winkel, Separatoren, Scanner, Typ, + Geruest fuer Einzelmodul/Geruestoption) landen in derselben Sivas-Zeile - + nur IDs/Bezeichnung unterscheiden sich. """ attribs = block.get("attribs", {}) return ( @@ -144,6 +162,8 @@ def gefaellestrecke_signature(block): attribs.get("ANZAHL_SEPARATOR", "0"), attribs.get("ANZAHL_SCANNER", "0"), attribs.get("TYP", "Gefaellestrecke"), + attribs.get("GERUEST_EINZELMODUL", "0"), + attribs.get("GERUEST_TYP", "Schoenenberger Geruest"), ) @@ -206,6 +226,8 @@ def build_variofoerderer_details(block): }, "Anzahl der Separatoren": to_int("ANZAHL_SEPARATOR"), "Anzahl der Scanner": to_int("ANZAHL_SCANNER"), + "Geruest fuer Einzelmodul": attribs.get("GERUEST_EINZELMODUL", "0") == "1", + "Geruestoption fuer Einzelmodul": attribs.get("GERUEST_TYP", "Schoenenberger Geruest"), } @@ -222,6 +244,16 @@ def build_kreisel_details(block): "Anzahl der Scanner": attribs.get("ANZAHL_SCANNER", attribs.get("N_SCANNER", "0")), "Anzahl der Rampen": attribs.get("ANZAHL_RAMPEN", attribs.get("N_RAMPEN", "0")), "Geruest fuer Einzelmodul": attribs.get("GERUEST_EINZELMODUL", "0") == "1", + "Geruestoption fuer Einzelmodul": attribs.get("GERUEST_TYP", "Schoenenberger Geruest"), + } + + +def build_eckrad_details(block): + """Merkmale-Dict fuer ein ILS Eckrad.""" + attribs = block.get("attribs", {}) + return { + "Geruest fuer Einzelmodul": attribs.get("GERUEST_EINZELMODUL", "0") == "1", + "Geruestoption fuer Einzelmodul": attribs.get("GERUEST_TYP", "Schoenenberger Geruest"), } @@ -260,8 +292,7 @@ def process_blocks(blocks, lookup): # Gerade: artinr_str -> {anzahl, laenge_mm_total, ids} gerade_groups = {} kreisel_list = [] # Liste von blocks - eckrad_ids = [] # IDs aller Eckrad-Bloecke - eckrad_bezeichnungen = [] # Bezeichnung-Attribut aller Eckrad-Bloecke + eckrad_groups = {} # eckrad_signature(block) -> {"ids", "bezeichnungen", "block"} strecke_ids = [] # IDs loser Strecke-Elemente (Vario/Staustrecke ausserhalb VF_N) strecke_bezeichnungen = [] # Bezeichnung-Attribut loser Strecke-Elemente vario_list = [] # Liste von VarioFoerderer-Compound-Bloecken (VF_N), je einer Zeile @@ -356,8 +387,12 @@ def process_blocks(blocks, lookup): # ECKRAD_* mit ein, pattern_eckrad ist die praezisere Teilmenge) --- if matches_any(bname, BLOCKPATTERNS.get("pattern_eckrad", [])): counters["anzahl_eckraeder"] += 1 - eckrad_ids.append(get_id(block)) - eckrad_bezeichnungen.append(block.get("attribs", {}).get("Bezeichnung", "")) + sig = eckrad_signature(block) + if sig not in eckrad_groups: + eckrad_groups[sig] = {"ids": [], "bezeichnungen": [], "block": block} + eckrad_groups[sig]["ids"].append(get_id(block)) + eckrad_groups[sig]["bezeichnungen"].append( + block.get("attribs", {}).get("Bezeichnung", "")) continue # --- ILS Kreisel --- @@ -489,19 +524,22 @@ def process_blocks(blocks, lookup): }) nr += 1 - if counters["anzahl_eckraeder"] > 0: + # Gleichartige Eckraeder (gleiches Geruest fuer Einzelmodul/Geruestoption) + # zu einer Zeile zusammenfassen - nur IDs/Bezeichnung bleiben je Block + # unterschiedlich. + for group in eckrad_groups.values(): sivasnr, teileart = ILS_SIVASNR["eckrad"] items.append({ "nr": nr, "teileart": teileart, "sivasnr": sivasnr, "sivasnr_quoted": True, - "bezeichnung": ", ".join(b for b in eckrad_bezeichnungen if b), + "bezeichnung": ", ".join(b for b in group["bezeichnungen"] if b), "dispgruppe": 20, - "anzahl": counters["anzahl_eckraeder"], + "anzahl": len(group["ids"]), "laenge_mm": "", - "ids": eckrad_ids, - "details": {}, + "ids": group["ids"], + "details": build_eckrad_details(group["block"]), }) nr += 1