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

88 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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) |