Files
sps_skel/doc/track.md
T
Michael StanglandClaude Opus 4.8 516f30278b --track: Bahnzusammenhang aus der TrackIds-Spalte statt aus Nachbarn
build_track_graph baut die Fein-Adjazenz jetzt direkt aus der geordneten
TrackIds-Spalte je Container (Element.track_ids): Kreisel als zirkulaerer
Umlauf in Drehrichtung (Export-Sortierung), Strecke/Gefaelle als lineare
Kette AS -> SEP.. -> ES. Gemeinsame AS/ES-/Weiche-Knoten verketten die
Container automatisch - die Rueckmeldungs-/Rollen-Heuristik aus der
Nachbarn-Spalte (_transfer_kreisel_lane, _wire_weiche,
_orient_separator_links) entfaellt komplett.

_attach_track_symbols misst offene Bahnenden jetzt am feinen Graphen statt
am groben; das behebt die vereinzelten Falsch-Eingaenge an voll verketteten
Bahnen (HundM05: Bahn 0001-0004, 0006-R).

Doku in doc/Python_Scripts.md und doc/track.md nachgezogen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-09-17 09:59:09 +02:00

4.8 KiB
Raw Blame History

Bahnzusammenhang-Graph (--track)

material_flow.py --track erzeugt neben dem groben Materialfluss-Graphen einen feineren Bahnzusammenhang-Graphen (<name>_track.dot, mit --tosvg auch <name>_track.svg). Dort ist jedes einzelne Bahnelement ein eigener Knoten — Separator, Ausschleuselement, Einschleuselement, Weiche sowie die Ein-/ Ausgangspunkte (BTMT Be-/Entladung, Eingang/Ausgang) —, während sie im groben Graphen nur Kanten bzw. Zuordnungen an Kreisel/Strecke/Gefällestrecke liefern.

Datenquelle: die CSV-Spalte TrackIds

Die Reihenfolge der Elemente entlang einer Bahn wird nicht mehr aus der Nachbarn-Spalte rekonstruiert, sondern direkt aus der Spalte TrackIds gelesen (Element.track_ids, parse_track_ids). Jeder Container trägt dort die geordnete Liste der auf ihm liegenden Bahnelemente; der dxfmakros-Export berechnet sie bereits (siehe dxfmakros/doc/csv-export.md, Abschnitt „Die Spalte TrackIds"):

Container TrackIds-Inhalt Reihenfolge
Kreisel alle freien Punkte (Separator, BTMT, Eingang/Ausgang), AS/ES-Enden andockender Strecken, Kreisel-Kreisel-Weichen zirkulär, nach Winkel in Drehrichtung (UZS/GUZ), Start bei 0°
Strecke / Gefällestrecke AS → SEP… → ES lineare Baureihenfolge der Kette

Beispiel (mubea_export.csv):

Gefällestrecke 0016  trackIds = [0118(AS), 0059(SEP), 0119(ES)]
Strecke        0013  trackIds = [0124(AS), 0054, 0053, 0125(ES)]
Kreisel        0001  trackIds = [0040(Sep@0001-R), 0079(Weiche), 0036(Sep@0014)]

Aufbau des Graphen (build_track_graph)

  1. Strecke/Gefällestrecke — lineare Kette entlang track_ids. Die Richtung kommt aus den Kettenenden: Ausschleuselement = Anfang (Material verlässt den Kreisel), Einschleuselement = Ende. Steht das Einschleuselement vorn bzw. das Ausschleuselement hinten, wird die Liste umgedreht. Kanten-Notiz "Bahn".
  2. Kreisel — zirkulärer Umlauf entlang track_ids (bereits in Drehrichtung sortiert). Aufeinanderfolgende Einträge werden verbunden; bei bekannter Drehrichtung schließt das letzte Element zurück auf das erste (geschlossener Umlauf). Kanten-Notiz "Umlauf".
  3. Verwaiste Elemente — ein Bahnelement, das in keiner TrackIds-Liste steht (z. B. ein frei platzierter Separator ohne Kette, oder wenn die CSV gar keine TrackIds-Spalte hat), wird an einen gestrichelten Platzhalter für seine Zuordnung gehängt ("unbestimmt") und als Warnung gemeldet.
  4. Systemgrenzen — BTMT Be-/Entladung werden über den bereits im groben Graphen aufgelösten Anschluss angebunden (_attach_track_stations); offene Bahnenden ohne Station bekommen ein generisches Symbol Eingang/Ausgang (_attach_track_symbols). Wichtig: die Offenheit wird am feinen Graphen gemessen (ein reales Bahnelement ohne Vorgänger/Nachfolger in track.edges), nicht am groben. Der grobe Graph kann eine Bahn als offenes Ende führen, obwohl ihre AS/ES-Enden im Kreisel-Umlauf längst verkettet sind (die Richtung blieb dort nur „unbestimmt") — würde man ihn als Maßstab nehmen, entstünden vereinzelte Falsch-Eingänge an voll verketteten Bahnen (beobachtet an HundM05.csv: Bahn 0001–0004, 0006-R).

Warum das die Nachbarn-Heuristik ersetzt

Der entscheidende Punkt: ein Element, das in zwei Containern gelistet ist, ist derselbe Knoten und verkettet die Container automatisch.

  • Ein Ausschleus-/Einschleuselement steht sowohl in der TrackIds seiner Strecke als auch im Umlauf des angedockten Kreisels → Kreisel und Strecke sind über diesen gemeinsamen Knoten verbunden.
  • Eine Kreisel-Kreisel-Weiche steht in den TrackIds beider Kreisel → beide Umläufe treffen sich an diesem gemeinsamen Knoten.

Beispiel: 0118(AS) steht in Gefällestrecke 0016 und im Umlauf von Kreisel 0010; 0119(ES) steht in 0016 und in Kreisel 0002. Der Fluss Kreisel 0010 → 0118 → 0059 → 0119 → Kreisel 0002 ergibt sich damit von selbst.

Die frühere Rekonstruktion aus der Nachbarn-Spalte (Rückmeldungs-/Rollen- Heuristik, Separator-Separator-Orientierung, Höhen-Fallback) entfällt dadurch komplett — mit ihr die zahlreichen zugehörigen Warnungen.

Legende der Kanten-/Knotendarstellung

Darstellung Bedeutung
blau ("Bahn") Weiterfahrt auf derselben Strecke/Gefälle-Kette
hellblau ("Umlauf") Kreisel-Umlauf (Reihenfolge in Drehrichtung)
grün ("Station") Anbindung BTMT Be-/Entladung
gepunktet ("Symbol") offenes Bahnende ohne BTMT-Station
gestrichelt gelb ("unbestimmt") Element nicht in einer TrackIds-Kette
Raute (Knoten) Weiche
Ellipse (Knoten) Ein-/Ausgang, BTMT Be-/Entladung
gestrichelter Rand (Knoten) Bahn-Platzhalter (Reihenfolge/Position offen)