From ca8543cca35af80bb676550cf10cd3807b6187a5 Mon Sep 17 00:00:00 2001 From: Michael Stangl Date: Thu, 2 Jul 2026 14:02:06 +0200 Subject: [PATCH] =?UTF-8?q?omniflo=20SumZeile=20jetzt=20nur=20=C3=BCber=20?= =?UTF-8?q?Python=20erzeugt.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cfg/export.cfg | 26 ++++++++++++ lib/export_csv.py | 101 +++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 122 insertions(+), 5 deletions(-) create mode 100644 cfg/export.cfg diff --git a/cfg/export.cfg b/cfg/export.cfg new file mode 100644 index 0000000..7758098 --- /dev/null +++ b/cfg/export.cfg @@ -0,0 +1,26 @@ +# ============================================================ +# export.cfg - Konfiguration fuer Lisp/export.lsp +# +# Format: INI-Style +# [ABSCHNITT] +# Key = Wert (einzelner Wert) +# Key = Wert1, Wert2, Wert3 (Musterliste fuer wcmatch, kommagetrennt) +# +# Zeilen mit # sind Kommentare. Leerzeilen werden ignoriert. +# ============================================================ + +[blockpattern] +pattern_kreisel= KR_*, KREISEL_*, ECKRAD_* +pattern_gerade= AP110*, AP_110* +pattern_strecke= Vario*, Staustrecke*, AUS_Element*, EIN_Element*, VF_*, GF_* +pattern_numerisch= #* +pattern_ks_subblocks= KS_EIN, KS_AUS, K1, K2, K3, K4 + + +[filenames] +raw_json_datei= export_raw.json +python_exe= python +sivas_script= export_sivas.py +sivas_csv= export_sivas.csv +csv_script= export_csv.py +csv_csv= export.csv diff --git a/lib/export_csv.py b/lib/export_csv.py index c67cc1c..f682310 100644 --- a/lib/export_csv.py +++ b/lib/export_csv.py @@ -1,7 +1,11 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ -export_csv.py - Erzeugt eine einfache Item-Liste als CSV (ohne Summierung). +export_csv.py - Erzeugt eine einfache Item-Liste als CSV. + +Fuer Omniflo-Elemente (Bogen/Weiche/Gerade) wird am Ende zusaetzlich eine +"Omniflo Sum"-Zeile mit Anzahl Boegen/Weichentypen und Gesamtlaenge AP110/AP60 +angehaengt (siehe build_omni_sum_merkmale). Aufruf: python export_csv.py @@ -98,19 +102,74 @@ def build_variofoerderer_merkmale(block): } +def get_laenge_mm(block): + """Liest LAENGE (oder A) aus Block-Attributen. Fallback: 2000mm.""" + attribs = block.get("attribs", {}) + laenge = attribs.get("LAENGE") or attribs.get("A") + try: + return float(laenge) + except (TypeError, ValueError): + return 2000.0 + + def build_gerade_merkmale(block): + laenge_mm = get_laenge_mm(block) + hoehe = get_hoehe(block) return { "Anzahl der Separatoren": "0", - "Länge in Meter": "2", + "Länge in Meter": f"{laenge_mm / 1000.0:.2f}", "Winkel": "0", "Anzahl der Scanner": 0, - "Höhe oben": "2000", - "Höhe unten": "2000", - "Drehung": block.get("rotation", 0.0), + "Höhe oben": hoehe, + "Höhe unten": hoehe, + "Drehung": get_drehung(block), "SivasNummer": "" } +# --------------------------------------------------------------------------- +# Omniflo Sum-Zeile (Anzahl Boegen/Weichentypen, Gesamtlaenge AP110/AP60) +# --------------------------------------------------------------------------- + +WEICHE_SUBTYP_MAP = { + "Einzelweiche": "einzelweiche", + "Doppelweiche": "doppelweiche", + "Dreiwegeweiche": "doppelweiche", + "Deltaweiche": "deltaweiche", + "Dreifachweiche": "deltaweiche", + "Sternweiche": "sternweiche", +} + + +def weichensubtyp(block, eintrag): + """Bestimmt den Weichen-Subtyp fuer die Omniflo-Sum-Zaehlung.""" + beschr = (block.get("attribs", {}).get("BESCHR") or "").upper() + if "WEICHENK" in beschr: + return "weichenkoerper" + subtyp = WEICHE_SUBTYP_MAP.get(eintrag.get("WeichenTyp", "")) + if subtyp: + return subtyp + if "DELTA" in beschr: + return "deltaweiche" + if "STAR" in beschr: + return "sternweiche" + return "einzelweiche" + + +def build_omni_sum_merkmale(cnt_boegen, cnt_wk, cnt_einzel, cnt_delta, cnt_doppel, cnt_stern, + len_ap110_mm, len_ap60_mm): + return { + "Anzahl Bögen": cnt_boegen, + "Anzahl Weichengrundkörper": cnt_wk, + "Anzahl Einwegweichen": cnt_einzel, + "Anzahl Deltaweichen": cnt_delta, + "Anzahl Doppelweichen und Dreiwegeweichen": cnt_doppel, + "Anzahl Sternweichen": cnt_stern, + "Gesamtlänge AP110": round(len_ap110_mm, 1), + "Gesamtlänge AP60": round(len_ap60_mm, 1), + } + + def build_kreisel_merkmale(block): attribs = block.get("attribs", {}) abstand_mm = attribs.get("ABSTAND", "2300") @@ -156,6 +215,12 @@ def process_blocks(blocks, lookup): kreisel_count = 0 vf_count = 0 + # Zaehlung fuer die Omniflo-Sum-Zeile (nur Bogen/Weiche/Gerade) + cnt_wk = cnt_einzel = cnt_delta = cnt_doppel = cnt_stern = 0 + len_ap110_mm = 0.0 + len_ap60_mm = 0.0 + has_omniflo = False + for block in blocks: bname = block.get("block_name", "") @@ -167,6 +232,7 @@ def process_blocks(blocks, lookup): typ, eintrag = lookup[bname] elem_nr += 1 shape_id = block.get("attribs", {}).get("ID", "0000") + has_omniflo = True if typ == "bogen": bogen_count += 1 @@ -188,12 +254,24 @@ def process_blocks(blocks, lookup): "bezeichnung": f"OFWeiche :{weiche_count[wt]}", "merkmale": build_weiche_merkmale(block, eintrag), }) + subtyp = weichensubtyp(block, eintrag) + if subtyp == "weichenkoerper": + cnt_wk += 1 + elif subtyp == "deltaweiche": + cnt_delta += 1 + elif subtyp == "sternweiche": + cnt_stern += 1 + elif subtyp == "doppelweiche": + cnt_doppel += 1 + else: + cnt_einzel += 1 continue # Omniflo Gerade (AP110) if "AP110" in bname.upper() or "AP_110" in bname.upper(): elem_nr += 1 gerade_count += 1 + has_omniflo = True items.append({ "nr": elem_nr, "teileart": "Omniflo Gerade", @@ -201,6 +279,7 @@ def process_blocks(blocks, lookup): "bezeichnung": f"OFGerade :{gerade_count}", "merkmale": build_gerade_merkmale(block), }) + len_ap110_mm += get_laenge_mm(block) continue # VarioFoerderer Compound-Block (VF_N) @@ -229,6 +308,18 @@ def process_blocks(blocks, lookup): }) continue + if has_omniflo: + elem_nr += 1 + items.append({ + "nr": elem_nr, + "teileart": "Omniflo Sum", + "teileid": "autogenerated_of_json", + "bezeichnung": "Omniflo sum", + "merkmale": build_omni_sum_merkmale( + bogen_count, cnt_wk, cnt_einzel, cnt_delta, cnt_doppel, cnt_stern, + len_ap110_mm, len_ap60_mm), + }) + return items