diff --git a/doc/track.md b/doc/track.md new file mode 100644 index 0000000..06d9490 --- /dev/null +++ b/doc/track.md @@ -0,0 +1,79 @@ +# Bahnzusammenhang-Graph (`--track`) + +`material_flow.py --track` erzeugt neben dem groben Materialfluss-Graphen einen +**feineren Bahnzusammenhang-Graphen** (`_track.dot`, mit `--tosvg` auch +`_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`). + +## 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 | Weiche | Ellipse | Ein-/Ausgang, BTMT | gestrichelter Rand | Bahn-Platzhalter |