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 <noreply@anthropic.com>
This commit is contained in:
Samer Ayadi
2026-10-01 15:29:18 +02:00
co-authored by Claude Opus 5.5
parent f9c9d88a08
commit 9ac6f88123
+17 -21
View File
@@ -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