- _apply_transfers liest die andockende Strecke auch aus dem Merkmal "Foerderer"/"Förderer" (nicht nur "Strecke"), damit VF/GF gerichtet Kreisel->AS->..->ES->Kreisel gezeichnet werden (Ruecklauf = zwei Pfeile auf die beiden Kreisel-Bahnen) statt "unbestimmt". - _attach_stations haengt BTMT/Eingang/Ausgang an die Kreisel-Bahn, in deren TrackIds-Umlauf sie liegen (Bahn aus der Drehrichtung); Nachbarn, die keine Flussobjekte sind, werden uebersprungen - keine Station<->Station-Kanten mehr. - Eingang/Ausgang sind die generischen Symbole fuer Beladung/Entladung. Liegt ein Symbol deckungsgleich (<= STATION_MERGE_MM = 600 mm) ueber einer BTMT-Station gleicher Rolle, wird es verschluckt (_merge_station_symbols) - nur ein Knoten, in grobem Graph UND --track (dort auch aus den TrackIds gestrichen). Einzelne Symbole bleiben eigener gruener/roter Knoten. - drive_uphill: die Hoehe bestimmt die Richtung NUR bei einer reinen Gefaellestrecke (Schwerkraft, bergab). Ein Foerderer/gemischte Strecke kann hoch oder runter foerdern - dort zaehlt nur eine eindeutige Antriebfahrtrichtung, sonst kommt die Richtung aus AS/ES. Doku in doc/Python_Scripts.md und doc/track.md nachgezogen. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5.1 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). Ein generisches Eingang/Ausgang-Symbol, das deckungsgleich über einer konkreten BTMT-Station liegt (≤STATION_MERGE_MM), wird auch hier verschluckt (_merge_station_symbols) — sowohl aus der Knotenliste als auch aus denTrackIdsjedes Containers —, sonst liefe der Kreisel-Umlauf durch zwei nahezu identische Knoten. 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) |