Separatorliste wird in jedes json Attribut der ILS Strecke geschrieben, um die Liste der Ids in der richtigen Reihenfolge aus Bricscad direkt zu erhalten

This commit is contained in:
2026-09-10 11:30:40 +02:00
parent e147b8976c
commit 061a878346
+50
View File
@@ -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 "<strecke_id>#<lfdnr>"-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)