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>
4.8 KiB
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)
- 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". - 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". - Verwaiste Elemente — ein Bahnelement, das in keiner
TrackIds-Liste steht (z. B. ein frei platzierter Separator ohne Kette, oder wenn die CSV gar keineTrackIds-Spalte hat), wird an einen gestrichelten Platzhalter für seineZuordnunggehängt ("unbestimmt") und als Warnung gemeldet. - 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 intrack.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 anHundM05.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
TrackIdsseiner Strecke als auch im Umlauf des angedockten Kreisels → Kreisel und Strecke sind über diesen gemeinsamen Knoten verbunden. - Eine Kreisel-Kreisel-Weiche steht in den
TrackIdsbeider 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) |