Files
Michael StanglandClaude Opus 4.8 117cd8914b Materialfluss: VF/GF-Richtung, Stations-Bahn und Eingang/Ausgang-Merge
- _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>
2026-09-17 12:54:44 +02:00

92 lines
5.1 KiB
Markdown
Raw Permalink 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`). 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) |