diff --git a/lib/export_csv.py b/lib/export_csv.py index aa030b9..db520a5 100644 --- a/lib/export_csv.py +++ b/lib/export_csv.py @@ -233,6 +233,12 @@ def build_variofoerderer_merkmale(block): ohne Suffix werden per Fallback weiter gelesen, damit aeltere export_raw.json-Dateien (z.B. tests/reference/export_raw.json) und noch nicht neu aufgebaute Bloecke in der Zeichnung weiterhin Werte liefern. + + Das Merkmal "Separatorlist" (Reihenfolge der Separator-TeileIds entlang + der Strecke) steht hier NICHT drin - es kommt erst nach der sepliste- + Aufloesung dazu (siehe write_separatorliste_merkmale in process_blocks), + weil an dieser Stelle die x/y-Koordinaten aus der sepliste-XDATA noch + nicht auf reale Separator-TeileIds aufgeloest sind. """ attribs = block.get("attribs", {}) @@ -819,6 +825,46 @@ def resolve_umlauf_und_sepliste_nachbarn(items, kreisel_umlauf, sep_kette, item["nachbarn"] = ", ".join(nachbarn) +def write_separatorliste_merkmale(items, sep_kette_by_key, dbg=None): + """Traegt in jede Strecke (VF_n/GF_n mit "sepliste") das Merkmal + "Separatorlist" ein: die TeileIds ihrer Separatoren in Baureihenfolge, + kommagetrennt (analog zu "Zuordnung"/"Nachbarn"), z.B. "0052, 0053, 0054". + + Quelle ist die rohe "sepliste" des Items (AS/SEP/ES mit x/y, bereits in + Baureihenfolge - siehe compute_sep_kette) statt sep_kette selbst: dessen + dict-Reihenfolge ist nicht garantiert, die sepliste-Liste dagegen schon. + Nur "SEP"-Eintraege zaehlen als Separator, AS/ES sind die Schleus-Enden + der Kette (siehe build_strecke_schleus_items), keine Separatoren. + + Der eigentliche Separator wurde bereits von map_separator_kette_items ueber + die sepliste-Koordinate (x/y) auf sein reales Separator-Item (TeileId) + aufgeloest und unter demselben "#"-Schluessel in + sep_kette_by_key eingetragen - hier wird dieser Schluessel nur noch je + Strecke eingesammelt. Muss darum NACH map_separator_kette_items laufen. + """ + for item in items: + if item.get("teileart", "") not in GF_VF_TEILEARTEN: + continue + sepliste = item.get("sepliste") + if not sepliste: + continue + sid = item.get("teileid", "") + separator_ids = [] + for entry in sepliste: + if entry.get("typ") != "SEP": + continue + key = f"{sid}#{entry.get('lfdnr')}" + sep_item = sep_kette_by_key.get(key) + if sep_item is None: + if dbg: + dbg(f" Separatorlist {key}: kein aufgeloestes Separator-Item " + f"- uebersprungen") + continue + separator_ids.append(sep_item.get("teileid", "")) + if separator_ids: + item["merkmale"]["Separatorlist"] = ", ".join(separator_ids) + + def process_blocks(blocks, lookup, dbg=None): # x_origin_mm/y_origin_mm einmalig fuer diesen Exportlauf aufloesen (siehe # export_planquadrat.resolve_origins): automatisch aus den Bloecken, falls @@ -1216,6 +1262,10 @@ def process_blocks(blocks, lookup, dbg=None): map_separator_kette_items( items, sep_kette, sep_kette_by_key=sep_kette_by_key, dbg=dbg) + # Merkmal "Separatorlist" je Strecke (Reihenfolge der SEP-TeileIds aus der + # sepliste, x/y bereits oben auf das reale Separator-Item aufgeloest). + write_separatorliste_merkmale(items, sep_kette_by_key, dbg=dbg) + resolve_umlauf_und_sepliste_nachbarn( items, kreisel_umlauf, sep_kette, sep_kette_by_key, weiche_by_key)