- _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>
92 lines
5.1 KiB
Markdown
92 lines
5.1 KiB
Markdown
# 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`). 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 den `TrackIds` jedes 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 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) |
|