From 9ac6f88123b3b62e4498d6bcc0b6e4c07c72e4b7 Mon Sep 17 00:00:00 2001 From: Samer Ayadi Date: Thu, 1 Oct 2026 15:29:18 +0200 Subject: [PATCH] TRO-Fluss: Linienspeicher liegt im Kreisel-Umlauf Die Ausschleuselemente der Speicherlinien zaehlen in der Umlaufkette als Glied des PinStore-TROs, die Einschleuselemente liefern - wie bei einer Vario-Strecke - den Ablauf zum naechsten Halt. Ersetzt die Regel "letzter Halt vor dem Speicher speist ihn" aus f9c9d88. Mubea Kreisel3: TRO05 -> TRO18 -> TRO07 (keine direkte Kante TRO05 -> TRO07 mehr, TRO05 bleibt 1Sep - kein ILS Ausschleuselement einer Strecke), TRO12 (VF_2 muendet direkt vor den Speicherlinien) -> TRO18, TRO18 -> TRO10 jetzt aus den Einschleuselementen auf Kreisel2. Im Review 2026-10-01 bestaetigt. HundM05 unveraendert (28), Mubea 26. Co-Authored-By: Claude Opus 5.5 --- lib/tro_flow.py | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/lib/tro_flow.py b/lib/tro_flow.py index 545d973..4d9d07e 100644 --- a/lib/tro_flow.py +++ b/lib/tro_flow.py @@ -1342,20 +1342,29 @@ def link_tros( if vario_id: einschleus_vario[el.teile_id] = vario_id - # Ausschleuselement-Id -> PinStore-TRO, dessen Schwerkraftlinie dort - # beginnt. Die Linien eines Speichers zweigen in der Umlaufkette eines - # Kreisels als Folge von Ausschleuselementen ab (Mubea Kreisel3: TRO05 -> - # 0060 -> 0122, 0119, ... 0065 -> TRO07); der TRO direkt davor speist den - # Speicher (Review 2026-10-01: TRO05 -> TRO18). + # Linienspeicher in der Umlaufkette. Seine Schwerkraftlinien beginnen als + # Folge von Ausschleuselementen auf dem einen Kreisel (Mubea Kreisel3: + # TRO05 -> 0122, 0119, ... 0065 -> TRO07) und enden als Folge von + # Einschleuselementen auf dem anderen (Kreisel2: 0067 ... 0124 -> TRO10). + # Die Ausschleuselemente zaehlen in der Kette als Glied des PinStore-TROs: + # der Speicher liegt IM Umlauf, TRO05 -> TRO18 -> TRO07 (TRO05 bleibt 1Sep, + # kein ILS Ausschleuselement einer Strecke - Review 2026-10-01). Die + # Einschleuselemente liefern - wie bei einer Vario-Strecke - den Ablauf + # zum naechsten Halt (TRO18 -> TRO10). store_by_host = {h: t.tro_id for t in tros if t.type_name == "PinStore_Auto" for h in t.hosts} speicher_ausschleus: dict[str, str] = {} for el in elements: - if el.kind != "Ausschleus": + if el.kind not in ("Ausschleus", "Einschleus"): continue strecke_id = str(_merkmal(el.merkmale, "Strecke", "Förderer") or "") - if strecke_id in store_by_host: + if strecke_id not in store_by_host: + continue + if el.kind == "Ausschleus": speicher_ausschleus[el.teile_id] = store_by_host[strecke_id] + else: + einschleus_vario[el.teile_id] = store_by_host[strecke_id] + ketten_owner = {**elem_owner, **speicher_ausschleus} for el in elements: if not el.is_circle or len(el.track_ids) < 2: @@ -1368,7 +1377,7 @@ def link_tros( # Einschleuselemente bewusst uebersprungen (unowned) - das beschreibt # den BYPASS fuer Verkehr, der NICHT abzweigt (z. B. TRO01 -> TRO03, # wenn dazwischen niemand abbiegt). - owned = [(i, elem_owner[tid]) for i, tid in enumerate(chain) if tid in elem_owner] + owned = [(i, ketten_owner[tid]) for i, tid in enumerate(chain) if tid in ketten_owner] for (_, a), (_, b) in zip(owned, owned[1:]): _add_chain_pair(a, b) if owned: @@ -1392,19 +1401,6 @@ def link_tros( if nxt is not None and nxt != vario_id: _add_chain_pair(vario_id, nxt) - # Speicher-Abzweig: letzter Halt VOR dem ersten Ausschleuselement einer - # Speicherlinie -> PinStore-TRO. Je Speicher nur einmal, auch wenn alle - # seine Linien hintereinander in der Kette stehen. - gespeist: set[str] = set() - for i, tid in enumerate(chain): - store_id = speicher_ausschleus.get(tid) - if store_id is None or store_id in gespeist: - continue - vorher = next((o for j, o in reversed(owned) if j < i), None) - if vorher is not None and vorher != store_id: - _add_chain_pair(vorher, store_id) - gespeist.add(store_id) - # Nur TROs, fuer die die Umlaufkette tatsaechlich einen praezisen # Nachfolger gefunden hat (precise_sources) - ein TRO ohne brauchbare # TrackIds-Abdeckung behaelt seine bisherigen (ungenaueren, aber nicht