This commit is contained in:
2026-09-04 15:21:19 +02:00
10 changed files with 593 additions and 648 deletions
+72 -21
View File
@@ -10,23 +10,30 @@ of Siemens SCL code** ("TRO" — Transfer Route Object — blocks for a conveyor
control system) that can be imported directly into TIA Portal.
The repository has moved past pure analysis: `lib/` now holds working Python tooling that
derives a material-flow graph and a TRO list from a CSV export (ILS 2.0) and can annotate a
copy of the BricsCAD drawing with the result. What does **not** exist yet is the actual
SCL-skeleton generator — the step that would emit TIA-Portal-importable SCL from a JSON
layout model. `tests/` and `examples/` are still empty scaffolding (see "Standard Programm
Template" below). What exists today is:
runs the **full DXF → JSON → SCL pipeline in a first version**. From a CSV export (ILS 2.0)
it derives a material-flow graph and a TRO list, annotates a copy of the BricsCAD drawing
with the result, reads the (possibly hand-edited) drawing back into a TRO-JSON, and emits an
`FB_Main` **SCL skeleton** from that JSON. The skeleton is deliberately not a running
program — every value that must come from the electrical planning is left as a visible
`TODO(E-Planung)` gap rather than guessed. What is **not** done yet is the fuller layout-JSON
schema (`doc/HundM/Json_Layout-Konzept.md`) as an intermediate format and the generation of
the other per-controller blocks (`FB_CallSensors`, `FC_Direction`/`FC_Call_Jams` as
standalone files); see "Roadmap" below. `tests/` and `examples/` are still empty scaffolding
(see "Standard Programm Template" below). What exists today is:
- `bin/` — environment/venv management scripts, plus one `.bat`/`.sh` wrapper pair per CLI
tool in `lib/` (see "Environment scripts" below)
- `lib/*.py` — CLI tools and libraries that turn a CSV export + BricsCAD DXF into a
material-flow graph, a derived TRO list/diagram, and an annotated copy of the drawing.
material-flow graph, a derived TRO list/diagram, an annotated copy of the drawing, a
TRO-JSON read back out of that drawing, and an `FB_Main` SCL skeleton.
See **`doc/Python_Scripts.md`** for what each script does and which switches it takes.
- `data/` — input CSV exports (gitignored, not committed)
- `cad/tro_types.lsp` — generated type list for the BricsCAD `TROEDIT` dialog (written by
`tro_annotate.py --emit-lisp`)
- `cfg/dxf_registration.json` — persisted, verified CSV↔DXF coordinate transform
- `cfg/dxf_registration.json` — persisted, verified CSV↔DXF coordinate transform;
`cfg/tro_overrides.ini` — hand-maintained corrections to the derived TROs (see `tro_overrides.py`)
- `doc/*.md` — analysis documents that reverse-engineer the SCL patterns and propose the
JSON schema / code-generation approach for the generator that's still to be written
fuller JSON layout schema for the parts of the pipeline still to be built out
Read `doc/` before writing any generator code — start with `doc/Python_Scripts.md` for the
existing tooling, then the domain-model documents below; together they contain the actual
@@ -81,9 +88,10 @@ routing, modeled around **TRO** (Transfer Route Object) blocks. Key documents, r
this order for onboarding:
0. **`doc/Python_Scripts.md`** — the existing CLI tooling (`lib/material_flow.py`,
`lib/tro_flow.py`, `lib/tro_annotate.py`, plus the `lib/tro_catalog.py` and
`lib/dxf_registration.py` libraries they share): what each script does, its switches,
inputs/outputs. This is working code, not a proposal — read it before touching `lib/`.
`lib/tro_flow.py`, `lib/tro_annotate.py`, `lib/tro_extract.py`, `lib/scl_skeleton.py`,
plus the `lib/tro_catalog.py`, `lib/dxf_registration.py` and `lib/tro_overrides.py`
libraries they share): what each script does, its switches, inputs/outputs. This is
working code, not a proposal — read it before touching `lib/`.
1. **`doc/HundM/Json_Layout-Konzept.md`** — the core proposal: a JSON file as single source
of truth (`plc`, `controlUnits`, `sensors[]`, `conveyors[]`, `tros[]`, `loadingBooms[]`,
`emptyCarrBuffers[]`, `routing`, `jamAreas[]`, `scanners[]`, `connections[]`,
@@ -114,9 +122,10 @@ this order for onboarding:
6. **`doc/HundM/suggestion.md`** — a follow-up proposal to collapse the 7 `FB_ILS_MTRO_*`
variants into a single `FB_ILS_MTRO` block driven by an array/config descriptor
instead of hand-duplicated numbered members (`...1`, `...2`, `Dir1..Dir4`). References
a not-yet-written `lib/create_skel.py` (`guess_fbtype()`) as the intended generator
entry point — this is still the planned shape of the SCL-emitting generator itself;
the current `lib/` tooling derives TROs from a layout but does not yet emit SCL.
a `lib/create_skel.py` (`guess_fbtype()`) as the intended generator entry point. That
specific module does not exist in this repo — it is the HundM Excel-based generator
sketch, a different input source (see "Roadmap" below). This repo's own SCL emitter is
`lib/scl_skeleton.py`, which already emits an `FB_Main` skeleton from the TRO-JSON.
7. **`doc/500573_Mubea/TRO_Identifikation_500573.md`** — the derivation rules
`lib/tro_flow.py` implements: how to infer a TRO's type from its separator's host
object (Gefällestrecke/Strecke/Kreisel) when no I/O list or `FB_Main` exists yet.
@@ -137,6 +146,48 @@ local, fully-vendored SCL source (`FB_ILS_MTRO_Vario_workStation`, `FB_EmptyCarr
`doc/TRO_Katalog/scl_templates/*.scl` as **read-only reference material** for pattern
extraction, not code to execute or modify.
## Roadmap: DXF → JSON → SCL (first version implemented)
The DXF → JSON → SCL pipeline now runs end-to-end in a first version. After `tro_annotate.py`
burns the TROs into a copy of the drawing, the user can hand-edit that DXF in BricsCAD (via
the `TRO_INSERT`/`TRO_EDIT` commands, see `doc/HundM/BricsCAD_TRO_Symbol.md`) — moving TROs,
adding new ones, changing a type — and two further `lib/` tools carry the drawing the rest of
the way to importable SCL:
1. **`lib/tro_extract.py`** (implemented) — reads the (possibly hand-edited) annotated DXF
**only** (not the CSV) and derives a TRO-JSON (`<drawing>_tro.json`): the TROs tagged with
XDATA, their `predecessors`/`successors` computed from the flow arrows, and plant
coordinates resolved through the persisted registration. See `doc/Python_Scripts.md` §5a.
2. **`lib/scl_skeleton.py`** (implemented) — reads that TRO-JSON and emits an `FB_Main` SCL
skeleton (`<source>_FB_Main.scl`): one `REGION` per TRO with the instance call and every
parameter line in the right order, plus inline `FC_Direction` calls for switch TROs.
Everything derivable from the layout is filled (REGION order, FB type, parameter-block
counts, destination list per switch exit, `nTo1Destinations` for single-switch TROs);
everything that must come from the electrical planning is a `TODO(E-Planung)` gap.
Switches `--json`, `--out`, `--start` (the last picks an entry point while the plant is a
closed loop with no loading/unloading station). See `doc/Python_Scripts.md` §5b.
What is **not** built out yet, relative to the original two-tool design:
- the fuller **layout-JSON schema** of `doc/HundM/Json_Layout-Konzept.md` (`plc`,
`controlUnits`, `sensors[]`, `conveyors[]`, `tros[]`, `loadingBooms[]`,
`emptyCarrBuffers[]`, `routing`, `jamAreas[]`, `scanners[]`, `connections[]`,
`destinations[]`) as the intermediate format — `tro_extract.py` currently emits a
TRO-focused JSON, not this full schema;
- the **other per-controller blocks** (`FB_CallSensors`, `FC_Direction`/`FC_Call_Jams` as
standalone files) — only `FB_Main` is generated today;
- **type-based timing defaults** from `doc/TRO_Typen.md` and the `OVERRIDE_TIMING_JSON` CAD
attribute (timings are emitted as `TODO(E-Planung): pruefen` placeholders for now);
- a **`--skip-json`** convenience path that would read DXF + CSV directly and emit SCL
without an intermediate JSON file.
Note the `create_skel.py` / `guess_fbtype()` generator sketched in `doc/HundM/suggestion.md`
and `doc/HundM/Json_Layout-Konzept.md` §14.5 is a **separate concept** and is not implemented
here: it is designed to derive its skeleton JSON from HundM's Excel I/O-list exports
(`*_TIA.xlsx`, `*_positions.json`, ...), a different input source than this repo's CSV+DXF
pipeline. The JSON *schema* it targets is the same (`doc/HundM/Json_Layout-Konzept.md`); only
the derivation source differs.
## Standard Programm Template
This project follows the user's standard Python project scaffold convention:
@@ -153,14 +204,14 @@ sps_skel/
examples/ example files — empty for now
lib/ Python source, importable via SKEL_LIB on PYTHONPATH — CLI tools and
libraries that derive material flow / TRO lists / CAD annotations from a
layout (see doc/Python_Scripts.md); the JSON-driven SCL generator itself
is not yet written
layout, read the TROs back into JSON, and emit an FB_Main SCL skeleton
(see doc/Python_Scripts.md)
log/ gitignored
results/ gitignored — CLI tool output (.dot/.svg/.md/.dxf)
results/ gitignored — CLI tool output (.dot/.svg/.md/.dxf/.scl/.json)
tests/ unit tests — empty for now
```
When adding the SCL generator, put it under `lib/` (importable via `SKEL_LIB` on
`PYTHONPATH`), add a `bin/<name>.bat`/`.sh` wrapper pair for it following the pattern of
`bin/tro_flow.bat`/`.sh` (see "Environment scripts" above), document its switches in
`doc/Python_Scripts.md`, and add tests under `tests/`.
When extending the pipeline (the remaining pieces in "Roadmap" above), put new modules under
`lib/` (importable via `SKEL_LIB` on `PYTHONPATH`), add a `bin/<name>.bat`/`.sh` wrapper pair
for each following the pattern of `bin/tro_flow.bat`/`.sh` (see "Environment scripts" above),
document its switches in `doc/Python_Scripts.md`, and add tests under `tests/`.
+121 -31
View File
@@ -1,30 +1,74 @@
# sps_skel
# sps_skel
> Das Programm erhält ein mechanische Layout von der Projektierung oder
> Angebotswesen zusammen mit dem elektronischen Layout mit der Liste aller
> Sensoren, Stopper, etc. Daraus erstellt es dann ein Skelett für die SPS
> Programmierung, welches direkt ins TIA Portal importiert werden kann.
> Das Programm erhält ein mechanisches Layout von der Projektierung oder dem
> Angebotswesen zusammen mit dem elektrischen Layout (Liste aller Sensoren,
> Stopper, Weichen, etc.). Daraus soll es ein Skelett für die SPS-Programmierung
> (Siemens SCL, TIA Portal) erzeugen — aufgebaut aus **TRO**-Bausteinen
> (Transfer Route Object), den wiederkehrenden Steuerungseinheiten einer
> Fördertechnik-Anlage.
## Stand des Projekts
Aus einem CSV-Export der mechanischen Planung (ILS 2.0) werden automatisch
- der **Materialfluss-Graph** der mechanischen Objekte (Strecken, Gefällestrecken,
Kreisel),
- die daraus abgeleitete **TRO-Liste** samt eigenem Flussdiagramm,
- eine **annotierte Kopie der BricsCAD-Zeichnung** mit einem Marker-Symbol pro
TRO (danach in BricsCAD von Hand nachbearbeitbar — TROs verschieben,
ergänzen, Typ ändern),
- daraus zurückgelesen ein **JSON-Modell der TROs** (liest nur die Zeichnung,
erfasst also auch von Hand vorgenommene Korrekturen), und
- daraus ein **SCL-Gerüst für `FB_Main`** — ein `REGION` pro TRO mit
Instanzaufruf und allen Parametern in der richtigen Reihenfolge, aber
bewusst nicht lauffähig: jeder Wert, der aus der E-Planung stammen muss
(Sensor-/Aktoradressen, Separator-/Weichennummern, Staubereiche, ungeprüfte
Zeiten), ist als `TODO(E-Planung)` markiert statt geraten.
Diese fünf Werkzeuge liegen als CLI-Tools in `lib/` und sind über
`bin/`-Wrapper aufrufbar (siehe unten). Details, Domänenmodell und die
verbleibende Roadmap stehen in `doc/`, allen voran `doc/Python_Scripts.md`.
## Roadmap
Offen ist vor allem die JSON-Layout-Datei nach dem in
`doc/HundM/Json_Layout-Konzept.md` beschriebenen Schema (`plc`,
`controlUnits`, `sensors[]`, `conveyors[]`, `tros[]`, `loadingBooms[]`,
`emptyCarrBuffers[]`, `routing`, `jamAreas[]`, `scanners[]`, `connections[]`,
`destinations[]`) als von Hand editierbares Zwischenformat vor der
SCL-Erzeugung, sowie die Generierung der übrigen Bausteine je Steuerung
(`FB_CallSensors`, `FC_Direction`, `FC_Call_Jams`) — `scl_skeleton.py` deckt
bisher nur `FB_Main` ab. Siehe `CLAUDE.md` (Abschnitt "Roadmap") für den
aktuellen Stand der Planung dazu.
## Projektstruktur
sps_skel/
bin/ Skripte zur Umgebungsverwaltung
setenv.bat/.sh Umgebungsvariablen setzen
install_py.bat/.sh venv erstellen + pip install
activate_venv.bat/.sh venv aktivieren
get_cmd.bat/.sh Shell mit Umgebung oeffnen
cfg/ Konfigurationsdateien (INI/JSON)
data/ Eingabedaten (nicht im Git)
doc/ Dokumentation
examples/ Beispieldateien
lib/ Python-Quellcode / Bibliothek
log/ Log-Dateien (nicht im Git)
results/ Ergebnisse / Ausgaben (nicht im Git)
tests/ Unit Tests
.gitignore
LICENSE
README.md
requirements.txt
```text
sps_skel/
bin/ Umgebungsskripte + ein .bat/.sh-Wrapper-Paar je CLI-Tool
setenv.bat/.sh Umgebungsvariablen setzen
install_py.bat/.sh venv erstellen + pip install
activate_venv.bat/.sh venv aktivieren
get_cmd.bat/.sh Shell mit Umgebung oeffnen
material_flow.bat/.sh Wrapper fuer lib/material_flow.py
tro_flow.bat/.sh Wrapper fuer lib/tro_flow.py
tro_annotate.bat/.sh Wrapper fuer lib/tro_annotate.py
tro_extract.bat/.sh Wrapper fuer lib/tro_extract.py
scl_skeleton.bat/.sh Wrapper fuer lib/scl_skeleton.py
cad/ generiertes BricsCAD-LISP (tro_types.lsp) fuer den TROEDIT-Dialog
cfg/ Konfigurationsdateien (INI/JSON); dxf_registration.json
data/ Eingabedaten - CSV-Exporte, DXF (nicht im Git)
doc/ Dokumentation, siehe doc/Python_Scripts.md
examples/ Beispieldateien
lib/ Python-Quellcode (CLI-Tools + Bibliotheken)
log/ Log-Dateien (nicht im Git)
results/ Ergebnisse der CLI-Tools (.dot/.svg/.md/.dxf, nicht im Git)
tests/ Unit Tests
.gitignore
LICENSE
README.md
requirements.txt
```
## Umgebungsvariablen
@@ -35,9 +79,11 @@
| `SKEL_LIB` | Python-Quellcode |
| `SKEL_CFG` | Konfigurationsdateien |
| `SKEL_DATA` | Eingabedaten |
| `SKEL_DOC` | Dokumentation |
| `SKEL_LOG` | Log-Dateien |
| `SKEL_RESULTS` | Ergebnisse |
| `SKEL_EXAMPLES` | Beispieldateien |
| `SKEL_TESTS` | Unit Tests |
| `PYTHONPATH` | Erweitert um `SKEL_LIB` |
## Installation
@@ -45,31 +91,75 @@
### Voraussetzungen
- Python 3.10 oder hoeher
- Graphviz (`dot`) auf `PATH` fuer `--tosvg`, optional aber empfohlen
- fuer `tro_annotate.py`: `ezdxf` (wird per `requirements.txt` installiert)
### Setup (Windows)
bin\install_py.bat
```bat
bin\install_py.bat
```
### Setup (Linux / macOS)
bash bin/install_py.sh
```sh
bash bin/install_py.sh
```
## Nutzung
### Umgebung setzen
bin\setenv.bat # Windows
source bin/setenv.sh # Linux / macOS
```bat
bin\setenv.bat # Windows
source bin/setenv.sh # Linux / macOS
```
### Shell mit gesetzten Variablen oeffnen
bin\get_cmd.bat # Windows
source bin/get_cmd.sh # Linux / macOS
```bat
bin\get_cmd.bat # Windows
source bin/get_cmd.sh # Linux / macOS
```
### venv aktivieren
bin\activate_venv.bat # Windows
source bin/activate_venv.sh # Linux / macOS
```bat
bin\activate_venv.bat # Windows
source bin/activate_venv.sh # Linux / macOS
```
### CLI-Tools ausführen
Jedes Tool wird über seinen `bin/<name>.bat`/`.sh`-Wrapper aufgerufen; dieser
setzt die Umgebung, aktiviert `.venv` und ruft dann das Python-Modul auf.
`--file`/`--dxf` akzeptieren entweder einen Dateinamen (wird gegen
`%SKEL_DATA%` aufgelöst) oder einen vollen Pfad; Ausgaben landen in
`%SKEL_RESULTS%`.
```bat
REM 1) Materialfluss der mechanischen Objekte
bin\material_flow.bat --file mubea.csv --tosvg --doc
REM 2) TRO-Liste + eigenes Flussdiagramm ableiten
bin\tro_flow.bat --file mubea.csv --tosvg --doc
REM 3) TROs als Marker-Symbole in eine Kopie der CAD-Zeichnung einbrennen
bin\tro_annotate.bat --file mubea.csv --dxf 500573_60_1.dxf --flow --fb --legend
REM (Zeichnung optional in BricsCAD von Hand nachbearbeiten)
REM 4) TROs aus der (ggf. bearbeiteten) Zeichnung zurueck in JSON lesen
bin\tro_extract.bat --dxf export_annotated.dxf
REM 5) FB_Main-SCL-Geruest aus dem JSON erzeugen
bin\scl_skeleton.bat --json export_tro.json --start TRO07
```
Alle Switches, Ausgabedateien und Exit-Codes der drei Tools sind in
[`doc/Python_Scripts.md`](doc/Python_Scripts.md) dokumentiert; das
Domänenmodell (TRO-Typen, geplantes JSON-Layout, I/O-Listen-Analyse) findet
sich in den übrigen Dokumenten unter `doc/`.
## Lizenz
+20
View File
@@ -24,6 +24,26 @@ REM Python-Interpreter bestimmen (py-Launcher bevorzugt, sonst python)
set "PY=py"
py --version >nul 2>&1 || set "PY=python"
REM Graphviz pruefen, wenn --tosvg SVG erzeugen soll (dot, bei --use-cords/
REM --use-coords neato) - nur ein frueher Hinweis; das eigentliche Skript
REM meldet denselben Fehler beim Rendern noch einmal im Detail.
set "GV_ENGINE=dot"
echo %*| findstr /i /c:"--use-cords" /c:"--use-coords" >nul && set "GV_ENGINE=neato"
echo %*| findstr /i /c:"--tosvg" >nul
if not errorlevel 1 (
where %GV_ENGINE%.exe >nul 2>&1
if errorlevel 1 (
set "GV_OK="
if /i "%GV_ENGINE%"=="dot" if defined GRAPHVIZ_DOT set "GV_OK=1"
if not defined GV_OK (
echo WARNUNG: Graphviz '%GV_ENGINE%' nicht im PATH gefunden - --tosvg wird vermutlich fehlschlagen.
echo Graphviz installieren ^(https://graphviz.org/download/^), den bin-Ordner
echo zum PATH hinzufuegen, oder GRAPHVIZ_DOT auf die dot.exe setzen ^(nur fuer 'dot'^).
echo.
)
)
)
"%PY%" "%SKEL_LIB%\material_flow.py" %*
set "RC=%ERRORLEVEL%"
+20
View File
@@ -28,4 +28,24 @@ fi
PY="python3"
command -v python3 >/dev/null 2>&1 || PY="python"
# Graphviz pruefen, wenn --tosvg SVG erzeugen soll (dot, bei --use-cords/
# --use-coords neato) - nur ein frueher Hinweis; das eigentliche Skript
# meldet denselben Fehler beim Rendern noch einmal im Detail.
case " $* " in
*" --tosvg "*)
GV_ENGINE="dot"
case " $* " in
*" --use-cords "*|*" --use-coords "*) GV_ENGINE="neato" ;;
esac
if ! command -v "$GV_ENGINE" >/dev/null 2>&1; then
if [ "$GV_ENGINE" != "dot" ] || [ -z "${GRAPHVIZ_DOT:-}" ]; then
echo "WARNUNG: Graphviz '$GV_ENGINE' nicht im PATH gefunden - --tosvg wird vermutlich fehlschlagen." >&2
echo " Graphviz installieren (https://graphviz.org/download/), PATH ergaenzen," >&2
echo " oder GRAPHVIZ_DOT auf die dot-Programmdatei setzen (nur fuer 'dot')." >&2
echo "" >&2
fi
fi
;;
esac
exec "$PY" "$SKEL_LIB/material_flow.py" "$@"
+20
View File
@@ -27,6 +27,26 @@ REM Python-Interpreter bestimmen (py-Launcher bevorzugt, sonst python)
set "PY=py"
py --version >nul 2>&1 || set "PY=python"
REM Graphviz pruefen, wenn --tosvg SVG erzeugen soll (dot, bei --use-cords/
REM --use-coords neato) - nur ein frueher Hinweis; das eigentliche Skript
REM meldet denselben Fehler beim Rendern noch einmal im Detail.
set "GV_ENGINE=dot"
echo %*| findstr /i /c:"--use-cords" /c:"--use-coords" >nul && set "GV_ENGINE=neato"
echo %*| findstr /i /c:"--tosvg" >nul
if not errorlevel 1 (
where %GV_ENGINE%.exe >nul 2>&1
if errorlevel 1 (
set "GV_OK="
if /i "%GV_ENGINE%"=="dot" if defined GRAPHVIZ_DOT set "GV_OK=1"
if not defined GV_OK (
echo WARNUNG: Graphviz '%GV_ENGINE%' nicht im PATH gefunden - --tosvg wird vermutlich fehlschlagen.
echo Graphviz installieren ^(https://graphviz.org/download/^), den bin-Ordner
echo zum PATH hinzufuegen, oder GRAPHVIZ_DOT auf die dot.exe setzen ^(nur fuer 'dot'^).
echo.
)
)
)
"%PY%" "%SKEL_LIB%\tro_flow.py" %*
set "RC=%ERRORLEVEL%"
+20
View File
@@ -31,4 +31,24 @@ fi
PY="python3"
command -v python3 >/dev/null 2>&1 || PY="python"
# Graphviz pruefen, wenn --tosvg SVG erzeugen soll (dot, bei --use-cords/
# --use-coords neato) - nur ein frueher Hinweis; das eigentliche Skript
# meldet denselben Fehler beim Rendern noch einmal im Detail.
case " $* " in
*" --tosvg "*)
GV_ENGINE="dot"
case " $* " in
*" --use-cords "*|*" --use-coords "*) GV_ENGINE="neato" ;;
esac
if ! command -v "$GV_ENGINE" >/dev/null 2>&1; then
if [ "$GV_ENGINE" != "dot" ] || [ -z "${GRAPHVIZ_DOT:-}" ]; then
echo "WARNUNG: Graphviz '$GV_ENGINE' nicht im PATH gefunden - --tosvg wird vermutlich fehlschlagen." >&2
echo " Graphviz installieren (https://graphviz.org/download/), PATH ergaenzen," >&2
echo " oder GRAPHVIZ_DOT auf die dot-Programmdatei setzen (nur fuer 'dot')." >&2
echo "" >&2
fi
fi
;;
esac
exec "$PY" "$SKEL_LIB/tro_flow.py" "$@"
+119 -534
View File
@@ -4,634 +4,219 @@
<!-- Generated by graphviz version 15.1.0 (20260618.0150)
-->
<!-- Title: Materialfluss Pages: 1 -->
<svg width="2928pt" height="5734pt"
viewBox="0.00 0.00 2928.00 5734.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 5730.07)">
<svg width="2940pt" height="5743pt"
viewBox="0.00 0.00 2940.00 5743.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 5739.44)">
<title>Materialfluss</title>
<polygon fill="white" stroke="none" points="-4,4 -4,-5730.07 2924.07,-5730.07 2924.07,4 -4,4"/>
<text xml:space="preserve" text-anchor="middle" x="1460.04" y="-5711.62" font-family="Segoe UI" font-size="11.00">Materialfluss &#45; export.csv</text>
<polygon fill="white" stroke="none" points="-4,4 -4,-5739.44 2936.07,-5739.44 2936.07,4 -4,4"/>
<text xml:space="preserve" text-anchor="middle" x="1466.04" y="-5720.99" font-family="Segoe UI" font-size="11.00">Materialfluss &#45; mubea.csv</text>
<!-- 0001&#45;L -->
<g id="node1" class="node">
<title>0001&#45;L</title>
<path fill="#2f5597" stroke="#1f3864" d="M1241.32,-981.25C1241.32,-981.25 1182.57,-981.25 1182.57,-981.25 1176.57,-981.25 1170.57,-975.25 1170.57,-969.25 1170.57,-969.25 1170.57,-947 1170.57,-947 1170.57,-941 1176.57,-935 1182.57,-935 1182.57,-935 1241.32,-935 1241.32,-935 1247.32,-935 1253.32,-941 1253.32,-947 1253.32,-947 1253.32,-969.25 1253.32,-969.25 1253.32,-975.25 1247.32,-981.25 1241.32,-981.25"/>
<text xml:space="preserve" text-anchor="middle" x="1211.95" y="-968.7" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Kreisel1 &#160;[0001&#45;L]</text>
<text xml:space="preserve" text-anchor="middle" x="1211.95" y="-955.95" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Bahn L (links)</text>
<text xml:space="preserve" text-anchor="middle" x="1211.95" y="-943.2" font-family="Segoe UI" font-size="9.00" fill="#ffffff">h = 1.470 m</text>
<path fill="#2f5597" stroke="#1f3864" d="M1253.32,-990.62C1253.32,-990.62 1194.57,-990.62 1194.57,-990.62 1188.57,-990.62 1182.57,-984.62 1182.57,-978.62 1182.57,-978.62 1182.57,-956.38 1182.57,-956.38 1182.57,-950.38 1188.57,-944.38 1194.57,-944.38 1194.57,-944.38 1253.32,-944.38 1253.32,-944.38 1259.32,-944.38 1265.32,-950.38 1265.32,-956.38 1265.32,-956.38 1265.32,-978.62 1265.32,-978.62 1265.32,-984.62 1259.32,-990.62 1253.32,-990.62"/>
<text xml:space="preserve" text-anchor="middle" x="1223.94" y="-978.08" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Kreisel1 &#160;[0001&#45;L]</text>
<text xml:space="preserve" text-anchor="middle" x="1223.94" y="-965.33" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Bahn L (links)</text>
<text xml:space="preserve" text-anchor="middle" x="1223.94" y="-952.58" font-family="Segoe UI" font-size="9.00" fill="#ffffff">h = 1.470 m</text>
</g>
<!-- 0002&#45;R -->
<g id="node4" class="node">
<title>0002&#45;R</title>
<path fill="#2f5597" stroke="#1f3864" d="M416.69,-3308.13C416.69,-3308.13 357.19,-3308.13 357.19,-3308.13 351.19,-3308.13 345.19,-3302.13 345.19,-3296.13 345.19,-3296.13 345.19,-3273.88 345.19,-3273.88 345.19,-3267.88 351.19,-3261.88 357.19,-3261.88 357.19,-3261.88 416.69,-3261.88 416.69,-3261.88 422.69,-3261.88 428.69,-3267.88 428.69,-3273.88 428.69,-3273.88 428.69,-3296.13 428.69,-3296.13 428.69,-3302.13 422.69,-3308.13 416.69,-3308.13"/>
<text xml:space="preserve" text-anchor="middle" x="386.94" y="-3295.58" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Kreisel2 &#160;[0002&#45;R]</text>
<text xml:space="preserve" text-anchor="middle" x="386.94" y="-3282.83" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Bahn R (rechts)</text>
<text xml:space="preserve" text-anchor="middle" x="386.94" y="-3270.08" font-family="Segoe UI" font-size="9.00" fill="#ffffff">h = 1.470 m</text>
<path fill="#2f5597" stroke="#1f3864" d="M428.69,-3317.51C428.69,-3317.51 369.19,-3317.51 369.19,-3317.51 363.19,-3317.51 357.19,-3311.51 357.19,-3305.51 357.19,-3305.51 357.19,-3283.26 357.19,-3283.26 357.19,-3277.26 363.19,-3271.26 369.19,-3271.26 369.19,-3271.26 428.69,-3271.26 428.69,-3271.26 434.69,-3271.26 440.69,-3277.26 440.69,-3283.26 440.69,-3283.26 440.69,-3305.51 440.69,-3305.51 440.69,-3311.51 434.69,-3317.51 428.69,-3317.51"/>
<text xml:space="preserve" text-anchor="middle" x="398.94" y="-3304.95" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Kreisel2 &#160;[0002&#45;R]</text>
<text xml:space="preserve" text-anchor="middle" x="398.94" y="-3292.2" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Bahn R (rechts)</text>
<text xml:space="preserve" text-anchor="middle" x="398.94" y="-3279.45" font-family="Segoe UI" font-size="9.00" fill="#ffffff">h = 1.470 m</text>
</g>
<!-- 0001&#45;L&#45;&gt;0002&#45;R -->
<g id="edge1" class="edge">
<title>0001&#45;L&#45;&gt;0002&#45;R</title>
<g id="a_edge1"><a xlink:title="Richtung Weiche">
<path fill="none" stroke="#bf8f00" stroke-width="1.2" stroke-dasharray="5,2" d="M1200.43,-990.59C1108.22,-1250.68 490.75,-2992.22 398.47,-3252.49"/>
<polygon fill="#bf8f00" stroke="#bf8f00" stroke-width="1.2" points="1203,-991.72 1203.04,-983.24 1197.73,-989.85 1203,-991.72"/>
<polygon fill="#bf8f00" stroke="#bf8f00" stroke-width="1.2" points="395.94,-3251.27 395.9,-3259.74 401.21,-3253.14 395.94,-3251.27"/>
<path fill="none" stroke="#bf8f00" stroke-width="1.2" stroke-dasharray="5,2" d="M1212.43,-999.97C1120.22,-1260.06 502.75,-3001.59 410.47,-3261.86"/>
<polygon fill="#bf8f00" stroke="#bf8f00" stroke-width="1.2" points="1215,-1001.1 1215.04,-992.62 1209.73,-999.22 1215,-1001.1"/>
<polygon fill="#bf8f00" stroke="#bf8f00" stroke-width="1.2" points="407.94,-3260.64 407.9,-3269.12 413.21,-3262.51 407.94,-3260.64"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="786.11" y="-2124.76" font-family="Segoe UI" font-size="8.00" fill="#cc8800">Weiche</text>
<text xml:space="preserve" text-anchor="middle" x="798.11" y="-2134.13" font-family="Segoe UI" font-size="8.00" fill="#cc8800">Weiche</text>
</g>
<!-- 0001&#45;R -->
<g id="node2" class="node">
<title>0001&#45;R</title>
<path fill="#2f5597" stroke="#1f3864" d="M1244.32,-812.62C1244.32,-812.62 1179.57,-812.62 1179.57,-812.62 1173.57,-812.62 1167.57,-806.62 1167.57,-800.62 1167.57,-800.62 1167.57,-765.62 1167.57,-765.62 1167.57,-759.62 1173.57,-753.62 1179.57,-753.62 1179.57,-753.62 1244.32,-753.62 1244.32,-753.62 1250.32,-753.62 1256.32,-759.62 1256.32,-765.62 1256.32,-765.62 1256.32,-800.62 1256.32,-800.62 1256.32,-806.62 1250.32,-812.62 1244.32,-812.62"/>
<text xml:space="preserve" text-anchor="middle" x="1211.95" y="-800.08" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Kreisel1 &#160;[0001&#45;R]</text>
<text xml:space="preserve" text-anchor="middle" x="1211.95" y="-787.33" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Bahn R (rechts)</text>
<text xml:space="preserve" text-anchor="middle" x="1211.95" y="-774.58" font-family="Segoe UI" font-size="9.00" fill="#ffffff">h = 1.470 m</text>
<text xml:space="preserve" text-anchor="middle" x="1211.95" y="-761.83" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Separator (1): 0061</text>
<path fill="#2f5597" stroke="#1f3864" d="M1256.32,-822C1256.32,-822 1191.57,-822 1191.57,-822 1185.57,-822 1179.57,-816 1179.57,-810 1179.57,-810 1179.57,-775 1179.57,-775 1179.57,-769 1185.57,-763 1191.57,-763 1191.57,-763 1256.32,-763 1256.32,-763 1262.32,-763 1268.32,-769 1268.32,-775 1268.32,-775 1268.32,-810 1268.32,-810 1268.32,-816 1262.32,-822 1256.32,-822"/>
<text xml:space="preserve" text-anchor="middle" x="1223.94" y="-809.45" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Kreisel1 &#160;[0001&#45;R]</text>
<text xml:space="preserve" text-anchor="middle" x="1223.94" y="-796.7" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Bahn R (rechts)</text>
<text xml:space="preserve" text-anchor="middle" x="1223.94" y="-783.95" font-family="Segoe UI" font-size="9.00" fill="#ffffff">h = 1.470 m</text>
<text xml:space="preserve" text-anchor="middle" x="1223.94" y="-771.2" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Separator (1): 0061</text>
</g>
<!-- 0001&#45;R&#45;&gt;0001&#45;L -->
<g id="edge5" class="edge">
<g id="edge3" class="edge">
<title>0001&#45;R&#45;&gt;0001&#45;L</title>
<g id="a_edge5"><a xlink:title="Kreisel&#45;Umlauf UZS">
<path fill="none" stroke="#8ea9db" stroke-width="1.2" stroke-dasharray="5,2" d="M1211.95,-812.81C1211.95,-843.6 1211.95,-891.69 1211.95,-924.02"/>
<polygon fill="#8ea9db" stroke="#8ea9db" stroke-width="1.2" points="1208.8,-923.93 1211.95,-932.93 1215.1,-923.93 1208.8,-923.93"/>
<g id="a_edge3"><a xlink:title="Kreisel&#45;Umlauf UZS">
<path fill="none" stroke="#8ea9db" stroke-width="1.2" stroke-dasharray="5,2" d="M1223.94,-822.19C1223.94,-852.98 1223.94,-901.06 1223.94,-933.4"/>
<polygon fill="#8ea9db" stroke="#8ea9db" stroke-width="1.2" points="1220.8,-933.31 1223.95,-942.31 1227.1,-933.31 1220.8,-933.31"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="1204.82" y="-877.56" font-family="Segoe UI" font-size="8.00" fill="#5b7fc7">UZS</text>
<text xml:space="preserve" text-anchor="middle" x="1216.82" y="-886.93" font-family="Segoe UI" font-size="8.00" fill="#5b7fc7">UZS</text>
</g>
<!-- 0001&#45;R&#45;&gt;0002&#45;R -->
<g id="edge2" class="edge">
<title>0001&#45;R&#45;&gt;0002&#45;R</title>
<g id="a_edge2"><a xlink:title="Richtung Weiche">
<path fill="none" stroke="#bf8f00" stroke-width="1.2" stroke-dasharray="5,2" d="M1199.1,-822.08C1102.18,-1116.01 487.19,-2981.01 397.78,-3252.15"/>
<polygon fill="#bf8f00" stroke="#bf8f00" stroke-width="1.2" points="1201.69,-823.16 1201.54,-814.69 1196.37,-821.41 1201.69,-823.16"/>
<polygon fill="#bf8f00" stroke="#bf8f00" stroke-width="1.2" points="395.12,-3251.26 395.28,-3259.74 400.44,-3253.02 395.12,-3251.26"/>
<path fill="none" stroke="#bf8f00" stroke-width="1.2" stroke-dasharray="5,2" d="M1211.1,-831.46C1114.18,-1125.38 499.19,-2990.39 409.78,-3261.52"/>
<polygon fill="#bf8f00" stroke="#bf8f00" stroke-width="1.2" points="1213.69,-832.54 1213.54,-824.07 1208.37,-830.79 1213.69,-832.54"/>
<polygon fill="#bf8f00" stroke="#bf8f00" stroke-width="1.2" points="407.12,-3260.64 407.28,-3269.11 412.44,-3262.39 407.12,-3260.64"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="782.11" y="-2049.34" font-family="Segoe UI" font-size="8.00" fill="#cc8800">Weiche</text>
<text xml:space="preserve" text-anchor="middle" x="794.11" y="-2058.71" font-family="Segoe UI" font-size="8.00" fill="#cc8800">Weiche</text>
</g>
<!-- 0002&#45;L -->
<g id="node3" class="node">
<title>0002&#45;L</title>
<path fill="#2f5597" stroke="#1f3864" d="M441.82,-3495.88C441.82,-3495.88 332.07,-3495.88 332.07,-3495.88 326.07,-3495.88 320.07,-3489.88 320.07,-3483.88 320.07,-3483.88 320.07,-3436.13 320.07,-3436.13 320.07,-3430.13 326.07,-3424.13 332.07,-3424.13 332.07,-3424.13 441.82,-3424.13 441.82,-3424.13 447.82,-3424.13 453.82,-3430.13 453.82,-3436.13 453.82,-3436.13 453.82,-3483.88 453.82,-3483.88 453.82,-3489.88 447.82,-3495.88 441.82,-3495.88"/>
<text xml:space="preserve" text-anchor="middle" x="386.94" y="-3483.33" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Kreisel2 &#160;[0002&#45;L]</text>
<text xml:space="preserve" text-anchor="middle" x="386.94" y="-3470.58" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Bahn L (links)</text>
<text xml:space="preserve" text-anchor="middle" x="386.94" y="-3457.83" font-family="Segoe UI" font-size="9.00" fill="#ffffff">h = 1.470 m</text>
<text xml:space="preserve" text-anchor="middle" x="386.94" y="-3445.08" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Separator (3): 0003, 0011, 0012</text>
<text xml:space="preserve" text-anchor="middle" x="386.94" y="-3432.33" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Scanner (3): 0004, 0007, 0009</text>
<path fill="#2f5597" stroke="#1f3864" d="M453.82,-3505.26C453.82,-3505.26 344.07,-3505.26 344.07,-3505.26 338.07,-3505.26 332.07,-3499.26 332.07,-3493.26 332.07,-3493.26 332.07,-3445.51 332.07,-3445.51 332.07,-3439.51 338.07,-3433.51 344.07,-3433.51 344.07,-3433.51 453.82,-3433.51 453.82,-3433.51 459.82,-3433.51 465.82,-3439.51 465.82,-3445.51 465.82,-3445.51 465.82,-3493.26 465.82,-3493.26 465.82,-3499.26 459.82,-3505.26 453.82,-3505.26"/>
<text xml:space="preserve" text-anchor="middle" x="398.94" y="-3492.7" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Kreisel2 &#160;[0002&#45;L]</text>
<text xml:space="preserve" text-anchor="middle" x="398.94" y="-3479.95" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Bahn L (links)</text>
<text xml:space="preserve" text-anchor="middle" x="398.94" y="-3467.2" font-family="Segoe UI" font-size="9.00" fill="#ffffff">h = 1.470 m</text>
<text xml:space="preserve" text-anchor="middle" x="398.94" y="-3454.45" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Separator (3): 0003, 0011, 0012</text>
<text xml:space="preserve" text-anchor="middle" x="398.94" y="-3441.7" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Scanner (3): 0004, 0007, 0009</text>
</g>
<!-- 0016 -->
<g id="node9" class="node">
<title>0016</title>
<path fill="#e2f0d9" stroke="#548235" d="M279.12,-3816.49C279.12,-3816.49 179.13,-3816.49 179.13,-3816.49 173.13,-3816.49 167.13,-3810.49 167.13,-3804.49 167.13,-3804.49 167.13,-3743.99 167.13,-3743.99 167.13,-3737.99 173.13,-3731.99 179.13,-3731.99 179.13,-3731.99 279.12,-3731.99 279.12,-3731.99 285.12,-3731.99 291.12,-3737.99 291.12,-3743.99 291.12,-3743.99 291.12,-3804.49 291.12,-3804.49 291.12,-3810.49 285.12,-3816.49 279.12,-3816.49"/>
<text xml:space="preserve" text-anchor="middle" x="229.13" y="-3803.94" font-family="Segoe UI" font-size="9.00" fill="#375623">VarioFoerderer :1 &#160;[0016]</text>
<text xml:space="preserve" text-anchor="middle" x="229.13" y="-3791.19" font-family="Segoe UI" font-size="9.00" fill="#375623">Strecke</text>
<text xml:space="preserve" text-anchor="middle" x="229.13" y="-3778.44" font-family="Segoe UI" font-size="9.00" fill="#375623">h = 0.000 m</text>
<text xml:space="preserve" text-anchor="middle" x="229.13" y="-3765.69" font-family="Segoe UI" font-size="9.00" fill="#375623">0 &#45;&gt; 0 mm (+0) = aufwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="229.13" y="-3752.94" font-family="Segoe UI" font-size="9.00" fill="#375623">Separator (2): 0058, 0059</text>
<text xml:space="preserve" text-anchor="middle" x="229.13" y="-3740.19" font-family="Segoe UI" font-size="9.00" fill="#375623">Scanner (1): 0060</text>
<path fill="#e2f0d9" stroke="#548235" d="M291.12,-3825.87C291.12,-3825.87 191.12,-3825.87 191.12,-3825.87 185.12,-3825.87 179.12,-3819.87 179.12,-3813.87 179.12,-3813.87 179.12,-3753.37 179.12,-3753.37 179.12,-3747.37 185.12,-3741.37 191.12,-3741.37 191.12,-3741.37 291.12,-3741.37 291.12,-3741.37 297.12,-3741.37 303.12,-3747.37 303.12,-3753.37 303.12,-3753.37 303.12,-3813.87 303.12,-3813.87 303.12,-3819.87 297.12,-3825.87 291.12,-3825.87"/>
<text xml:space="preserve" text-anchor="middle" x="241.12" y="-3813.32" font-family="Segoe UI" font-size="9.00" fill="#375623">VarioFoerderer :1 &#160;[0016]</text>
<text xml:space="preserve" text-anchor="middle" x="241.12" y="-3800.57" font-family="Segoe UI" font-size="9.00" fill="#375623">Strecke</text>
<text xml:space="preserve" text-anchor="middle" x="241.12" y="-3787.82" font-family="Segoe UI" font-size="9.00" fill="#375623">h = 0.000 m</text>
<text xml:space="preserve" text-anchor="middle" x="241.12" y="-3775.07" font-family="Segoe UI" font-size="9.00" fill="#375623">0 &#45;&gt; 0 mm (+0) = aufwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="241.12" y="-3762.32" font-family="Segoe UI" font-size="9.00" fill="#375623">Separator (2): 0058, 0059</text>
<text xml:space="preserve" text-anchor="middle" x="241.12" y="-3749.57" font-family="Segoe UI" font-size="9.00" fill="#375623">Scanner (1): 0060</text>
</g>
<!-- 0002&#45;L&#45;&gt;0016 -->
<g id="edge46" class="edge">
<g id="edge8" class="edge">
<title>0002&#45;L&#45;&gt;0016</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M368.69,-3496.36C340.63,-3552.22 286.83,-3659.35 254.84,-3723.04"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="252.38,-3721.7 251.29,-3730.1 257.39,-3724.21 252.38,-3721.7"/>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M380.69,-3505.73C352.63,-3561.59 298.83,-3668.72 266.84,-3732.41"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="264.38,-3731.07 263.29,-3739.48 269.39,-3733.59 264.38,-3731.07"/>
</g>
<!-- 0002&#45;R&#45;&gt;0002&#45;L -->
<g id="edge4" class="edge">
<title>0002&#45;R&#45;&gt;0002&#45;L</title>
<g id="a_edge4"><a xlink:title="Kreisel&#45;Umlauf UZS">
<path fill="none" stroke="#8ea9db" stroke-width="1.2" stroke-dasharray="5,2" d="M386.94,-3308.61C386.94,-3335.29 386.94,-3379.42 386.94,-3413.16"/>
<polygon fill="#8ea9db" stroke="#8ea9db" stroke-width="1.2" points="383.8,-3412.9 386.95,-3421.9 390.1,-3412.9 383.8,-3412.9"/>
<path fill="none" stroke="#8ea9db" stroke-width="1.2" stroke-dasharray="5,2" d="M398.94,-3317.98C398.94,-3344.67 398.94,-3388.79 398.94,-3422.54"/>
<polygon fill="#8ea9db" stroke="#8ea9db" stroke-width="1.2" points="395.8,-3422.28 398.95,-3431.28 402.1,-3422.28 395.8,-3422.28"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="379.82" y="-3369.77" font-family="Segoe UI" font-size="8.00" fill="#5b7fc7">UZS</text>
<text xml:space="preserve" text-anchor="middle" x="391.82" y="-3379.15" font-family="Segoe UI" font-size="8.00" fill="#5b7fc7">UZS</text>
</g>
<!-- 0013 -->
<g id="node7" class="node">
<title>0013</title>
<path fill="#e2f0d9" stroke="#548235" d="M1681.56,-5703.07C1681.56,-5703.07 1563.56,-5703.07 1563.56,-5703.07 1557.56,-5703.07 1551.56,-5697.07 1551.56,-5691.07 1551.56,-5691.07 1551.56,-5643.32 1551.56,-5643.32 1551.56,-5637.32 1557.56,-5631.32 1563.56,-5631.32 1563.56,-5631.32 1681.56,-5631.32 1681.56,-5631.32 1687.56,-5631.32 1693.56,-5637.32 1693.56,-5643.32 1693.56,-5643.32 1693.56,-5691.07 1693.56,-5691.07 1693.56,-5697.07 1687.56,-5703.07 1681.56,-5703.07"/>
<text xml:space="preserve" text-anchor="middle" x="1622.56" y="-5690.52" font-family="Segoe UI" font-size="9.00" fill="#375623">VarioFoerderer :3 &#160;[0013]</text>
<text xml:space="preserve" text-anchor="middle" x="1622.56" y="-5677.77" font-family="Segoe UI" font-size="9.00" fill="#375623">Strecke</text>
<text xml:space="preserve" text-anchor="middle" x="1622.56" y="-5665.02" font-family="Segoe UI" font-size="9.00" fill="#375623">h = 0.237 m</text>
<text xml:space="preserve" text-anchor="middle" x="1622.56" y="-5652.27" font-family="Segoe UI" font-size="9.00" fill="#375623">0 &#45;&gt; 474 mm (+474) = aufwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1622.56" y="-5639.52" font-family="Segoe UI" font-size="9.00" fill="#375623">Separator (2): 0015, 0062</text>
<path fill="#e2f0d9" stroke="#548235" d="M1693.56,-5712.44C1693.56,-5712.44 1575.56,-5712.44 1575.56,-5712.44 1569.56,-5712.44 1563.56,-5706.44 1563.56,-5700.44 1563.56,-5700.44 1563.56,-5652.69 1563.56,-5652.69 1563.56,-5646.69 1569.56,-5640.69 1575.56,-5640.69 1575.56,-5640.69 1693.56,-5640.69 1693.56,-5640.69 1699.56,-5640.69 1705.56,-5646.69 1705.56,-5652.69 1705.56,-5652.69 1705.56,-5700.44 1705.56,-5700.44 1705.56,-5706.44 1699.56,-5712.44 1693.56,-5712.44"/>
<text xml:space="preserve" text-anchor="middle" x="1634.56" y="-5699.89" font-family="Segoe UI" font-size="9.00" fill="#375623">VarioFoerderer :3 &#160;[0013]</text>
<text xml:space="preserve" text-anchor="middle" x="1634.56" y="-5687.14" font-family="Segoe UI" font-size="9.00" fill="#375623">Strecke</text>
<text xml:space="preserve" text-anchor="middle" x="1634.56" y="-5674.39" font-family="Segoe UI" font-size="9.00" fill="#375623">h = 0.237 m</text>
<text xml:space="preserve" text-anchor="middle" x="1634.56" y="-5661.64" font-family="Segoe UI" font-size="9.00" fill="#375623">0 &#45;&gt; 474 mm (+474) = aufwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1634.56" y="-5648.89" font-family="Segoe UI" font-size="9.00" fill="#375623">Separator (2): 0015, 0062</text>
</g>
<!-- 0002&#45;R&#45;&gt;0013 -->
<g id="edge50" class="edge">
<g id="edge12" class="edge">
<title>0002&#45;R&#45;&gt;0013</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M399.2,-3308.48C413.29,-3335.48 437.1,-3381.15 457.52,-3420.43 918.48,-4307.16 1480.01,-5391.79 1599.53,-5622.68"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1596.92,-5623.73 1603.08,-5629.55 1601.89,-5621.16 1596.92,-5623.73"/>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M411.2,-3317.86C425.29,-3344.86 449.1,-3390.52 469.52,-3429.81 930.48,-4316.54 1492.01,-5401.17 1611.53,-5632.06"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1608.92,-5633.11 1615.08,-5638.93 1613.89,-5630.53 1608.92,-5633.11"/>
</g>
<!-- 0014 -->
<g id="node8" class="node">
<title>0014</title>
<path fill="#e2f0d9" stroke="#548235" d="M1681.56,-1146.19C1681.56,-1146.19 1563.56,-1146.19 1563.56,-1146.19 1557.56,-1146.19 1551.56,-1140.19 1551.56,-1134.19 1551.56,-1134.19 1551.56,-1073.69 1551.56,-1073.69 1551.56,-1067.69 1557.56,-1061.69 1563.56,-1061.69 1563.56,-1061.69 1681.56,-1061.69 1681.56,-1061.69 1687.56,-1061.69 1693.56,-1067.69 1693.56,-1073.69 1693.56,-1073.69 1693.56,-1134.19 1693.56,-1134.19 1693.56,-1140.19 1687.56,-1146.19 1681.56,-1146.19"/>
<text xml:space="preserve" text-anchor="middle" x="1622.56" y="-1133.64" font-family="Segoe UI" font-size="9.00" fill="#375623">VarioFoerderer :2 &#160;[0014]</text>
<text xml:space="preserve" text-anchor="middle" x="1622.56" y="-1120.89" font-family="Segoe UI" font-size="9.00" fill="#375623">Strecke</text>
<text xml:space="preserve" text-anchor="middle" x="1622.56" y="-1108.14" font-family="Segoe UI" font-size="9.00" fill="#375623">h = 0.237 m</text>
<text xml:space="preserve" text-anchor="middle" x="1622.56" y="-1095.39" font-family="Segoe UI" font-size="9.00" fill="#375623">0 &#45;&gt; 474 mm (+474) = aufwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1622.56" y="-1082.64" font-family="Segoe UI" font-size="9.00" fill="#375623">Separator (2): 0057, 0065</text>
<text xml:space="preserve" text-anchor="middle" x="1622.56" y="-1069.89" font-family="Segoe UI" font-size="9.00" fill="#375623">Scanner (1): 0006</text>
<path fill="#e2f0d9" stroke="#548235" d="M1693.56,-1155.57C1693.56,-1155.57 1575.56,-1155.57 1575.56,-1155.57 1569.56,-1155.57 1563.56,-1149.57 1563.56,-1143.57 1563.56,-1143.57 1563.56,-1083.07 1563.56,-1083.07 1563.56,-1077.07 1569.56,-1071.07 1575.56,-1071.07 1575.56,-1071.07 1693.56,-1071.07 1693.56,-1071.07 1699.56,-1071.07 1705.56,-1077.07 1705.56,-1083.07 1705.56,-1083.07 1705.56,-1143.57 1705.56,-1143.57 1705.56,-1149.57 1699.56,-1155.57 1693.56,-1155.57"/>
<text xml:space="preserve" text-anchor="middle" x="1634.56" y="-1143.02" font-family="Segoe UI" font-size="9.00" fill="#375623">VarioFoerderer :2 &#160;[0014]</text>
<text xml:space="preserve" text-anchor="middle" x="1634.56" y="-1130.27" font-family="Segoe UI" font-size="9.00" fill="#375623">Strecke</text>
<text xml:space="preserve" text-anchor="middle" x="1634.56" y="-1117.52" font-family="Segoe UI" font-size="9.00" fill="#375623">h = 0.237 m</text>
<text xml:space="preserve" text-anchor="middle" x="1634.56" y="-1104.77" font-family="Segoe UI" font-size="9.00" fill="#375623">0 &#45;&gt; 474 mm (+474) = aufwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1634.56" y="-1092.02" font-family="Segoe UI" font-size="9.00" fill="#375623">Separator (2): 0057, 0065</text>
<text xml:space="preserve" text-anchor="middle" x="1634.56" y="-1079.27" font-family="Segoe UI" font-size="9.00" fill="#375623">Scanner (1): 0006</text>
</g>
<!-- 0002&#45;R&#45;&gt;0014 -->
<g id="edge48" class="edge">
<g id="edge10" class="edge">
<title>0002&#45;R&#45;&gt;0014</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M400.19,-3261.62C520.3,-3049.62 1420.55,-1460.54 1593.78,-1154.76"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1596.05,-1156.43 1597.55,-1148.09 1591.18,-1153.67 1596.05,-1156.43"/>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M412.19,-3271C532.3,-3058.99 1432.55,-1469.91 1605.78,-1164.14"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1608.05,-1165.81 1609.55,-1157.47 1603.18,-1163.05 1608.05,-1165.81"/>
</g>
<!-- 0010&#45;L -->
<g id="node5" class="node">
<title>0010&#45;L</title>
<path fill="#2f5597" stroke="#1f3864" d="M2893.82,-3483.13C2893.82,-3483.13 2835.07,-3483.13 2835.07,-3483.13 2829.07,-3483.13 2823.07,-3477.13 2823.07,-3471.13 2823.07,-3471.13 2823.07,-3448.88 2823.07,-3448.88 2823.07,-3442.88 2829.07,-3436.88 2835.07,-3436.88 2835.07,-3436.88 2893.82,-3436.88 2893.82,-3436.88 2899.82,-3436.88 2905.82,-3442.88 2905.82,-3448.88 2905.82,-3448.88 2905.82,-3471.13 2905.82,-3471.13 2905.82,-3477.13 2899.82,-3483.13 2893.82,-3483.13"/>
<text xml:space="preserve" text-anchor="middle" x="2864.44" y="-3470.58" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Kreisel3 &#160;[0010&#45;L]</text>
<text xml:space="preserve" text-anchor="middle" x="2864.44" y="-3457.83" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Bahn L (links)</text>
<text xml:space="preserve" text-anchor="middle" x="2864.44" y="-3445.08" font-family="Segoe UI" font-size="9.00" fill="#ffffff">h = 1.940 m</text>
<path fill="#2f5597" stroke="#1f3864" d="M2905.82,-3492.51C2905.82,-3492.51 2847.07,-3492.51 2847.07,-3492.51 2841.07,-3492.51 2835.07,-3486.51 2835.07,-3480.51 2835.07,-3480.51 2835.07,-3458.26 2835.07,-3458.26 2835.07,-3452.26 2841.07,-3446.26 2847.07,-3446.26 2847.07,-3446.26 2905.82,-3446.26 2905.82,-3446.26 2911.82,-3446.26 2917.82,-3452.26 2917.82,-3458.26 2917.82,-3458.26 2917.82,-3480.51 2917.82,-3480.51 2917.82,-3486.51 2911.82,-3492.51 2905.82,-3492.51"/>
<text xml:space="preserve" text-anchor="middle" x="2876.45" y="-3479.95" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Kreisel3 &#160;[0010&#45;L]</text>
<text xml:space="preserve" text-anchor="middle" x="2876.45" y="-3467.2" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Bahn L (links)</text>
<text xml:space="preserve" text-anchor="middle" x="2876.45" y="-3454.45" font-family="Segoe UI" font-size="9.00" fill="#ffffff">h = 1.940 m</text>
</g>
<!-- 0017 -->
<!-- grp_0017 -->
<g id="node10" class="node">
<title>0017</title>
<path fill="#fbe5d6" stroke="#c55a11" d="M1693.98,-5327.64C1693.98,-5327.64 1563.23,-5327.64 1563.23,-5327.64 1557.23,-5327.64 1551.23,-5321.64 1551.23,-5315.64 1551.23,-5315.64 1551.23,-5267.89 1551.23,-5267.89 1551.23,-5261.89 1557.23,-5255.89 1563.23,-5255.89 1563.23,-5255.89 1693.98,-5255.89 1693.98,-5255.89 1699.98,-5255.89 1705.98,-5261.89 1705.98,-5267.89 1705.98,-5267.89 1705.98,-5315.64 1705.98,-5315.64 1705.98,-5321.64 1699.98,-5327.64 1693.98,-5327.64"/>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-5315.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke :20 &#160;[0017]</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-5302.34" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-5289.59" font-family="Segoe UI" font-size="9.00" fill="#833c00">h = 1.941 m</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-5276.84" font-family="Segoe UI" font-size="9.00" fill="#833c00">1941 &#45;&gt; 1466 mm (&#45;475) = abwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-5264.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Separator (1): 0037</text>
<title>grp_0017</title>
<path fill="#fbe5d6" stroke="#c55a11" d="M1705.98,-3443.39C1705.98,-3443.39 1575.23,-3443.39 1575.23,-3443.39 1569.23,-3443.39 1563.23,-3437.39 1563.23,-3431.39 1563.23,-3431.39 1563.23,-3370.89 1563.23,-3370.89 1563.23,-3364.89 1569.23,-3358.89 1575.23,-3358.89 1575.23,-3358.89 1705.98,-3358.89 1705.98,-3358.89 1711.98,-3358.89 1717.98,-3364.89 1717.98,-3370.89 1717.98,-3370.89 1717.98,-3431.39 1717.98,-3431.39 1717.98,-3437.39 1711.98,-3443.39 1705.98,-3443.39"/>
<path fill="none" stroke="#c55a11" d="M1709.98,-3447.39C1709.98,-3447.39 1571.23,-3447.39 1571.23,-3447.39 1565.23,-3447.39 1559.23,-3441.39 1559.23,-3435.39 1559.23,-3435.39 1559.23,-3366.89 1559.23,-3366.89 1559.23,-3360.89 1565.23,-3354.89 1571.23,-3354.89 1571.23,-3354.89 1709.98,-3354.89 1709.98,-3354.89 1715.98,-3354.89 1721.98,-3360.89 1721.98,-3366.89 1721.98,-3366.89 1721.98,-3435.39 1721.98,-3435.39 1721.98,-3441.39 1715.98,-3447.39 1709.98,-3447.39"/>
<text xml:space="preserve" text-anchor="middle" x="1640.61" y="-3430.84" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke 0017 &#45;&gt; 0036 (20x)</text>
<text xml:space="preserve" text-anchor="middle" x="1640.61" y="-3418.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gruppe paralleler Schwerkraftlinien</text>
<text xml:space="preserve" text-anchor="middle" x="1640.61" y="-3405.34" font-family="Segoe UI" font-size="9.00" fill="#833c00">h = 1.941 m</text>
<text xml:space="preserve" text-anchor="middle" x="1640.61" y="-3392.59" font-family="Segoe UI" font-size="9.00" fill="#833c00">1941 &#45;&gt; 1466 mm (&#45;475) = abwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1640.61" y="-3379.84" font-family="Segoe UI" font-size="9.00" fill="#833c00">Separator (21): 0005 &#45; 0056</text>
<text xml:space="preserve" text-anchor="middle" x="1640.61" y="-3367.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Scanner (1): 0066</text>
</g>
<!-- 0010&#45;L&#45;&gt;0017 -->
<g id="edge44" class="edge">
<title>0010&#45;L&#45;&gt;0017</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M2848.59,-3483.5C2718.91,-3675.72 1832.79,-4989.12 1658.37,-5247.64"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1656.12,-5245.98 1653.96,-5254.18 1660.76,-5249.11 1656.12,-5245.98"/>
</g>
<!-- 0018 -->
<g id="node11" class="node">
<title>0018</title>
<path fill="#fbe5d6" stroke="#c55a11" d="M1693.98,-5127.64C1693.98,-5127.64 1563.23,-5127.64 1563.23,-5127.64 1557.23,-5127.64 1551.23,-5121.64 1551.23,-5115.64 1551.23,-5115.64 1551.23,-5067.89 1551.23,-5067.89 1551.23,-5061.89 1557.23,-5055.89 1563.23,-5055.89 1563.23,-5055.89 1693.98,-5055.89 1693.98,-5055.89 1699.98,-5055.89 1705.98,-5061.89 1705.98,-5067.89 1705.98,-5067.89 1705.98,-5115.64 1705.98,-5115.64 1705.98,-5121.64 1699.98,-5127.64 1693.98,-5127.64"/>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-5115.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke :19 &#160;[0018]</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-5102.34" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-5089.59" font-family="Segoe UI" font-size="9.00" fill="#833c00">h = 1.941 m</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-5076.84" font-family="Segoe UI" font-size="9.00" fill="#833c00">1941 &#45;&gt; 1466 mm (&#45;475) = abwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-5064.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Separator (1): 0038</text>
</g>
<!-- 0010&#45;L&#45;&gt;0018 -->
<g id="edge42" class="edge">
<title>0010&#45;L&#45;&gt;0018</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M2846.74,-3483.39C2711.56,-3661.86 1843.31,-4808.27 1661.83,-5047.9"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1659.61,-5046.19 1657.01,-5054.26 1664.07,-5049.57 1659.61,-5046.19"/>
</g>
<!-- 0019 -->
<g id="node12" class="node">
<title>0019</title>
<path fill="#fbe5d6" stroke="#c55a11" d="M1693.98,-4927.64C1693.98,-4927.64 1563.23,-4927.64 1563.23,-4927.64 1557.23,-4927.64 1551.23,-4921.64 1551.23,-4915.64 1551.23,-4915.64 1551.23,-4867.89 1551.23,-4867.89 1551.23,-4861.89 1557.23,-4855.89 1563.23,-4855.89 1563.23,-4855.89 1693.98,-4855.89 1693.98,-4855.89 1699.98,-4855.89 1705.98,-4861.89 1705.98,-4867.89 1705.98,-4867.89 1705.98,-4915.64 1705.98,-4915.64 1705.98,-4921.64 1699.98,-4927.64 1693.98,-4927.64"/>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4915.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke :18 &#160;[0019]</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4902.34" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4889.59" font-family="Segoe UI" font-size="9.00" fill="#833c00">h = 1.941 m</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4876.84" font-family="Segoe UI" font-size="9.00" fill="#833c00">1941 &#45;&gt; 1466 mm (&#45;475) = abwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4864.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Separator (1): 0039</text>
</g>
<!-- 0010&#45;L&#45;&gt;0019 -->
<g id="edge40" class="edge">
<title>0010&#45;L&#45;&gt;0019</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M2844.28,-3483.37C2702.46,-3647.67 1855.06,-4629.41 1665.99,-4848.45"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1664.1,-4846.36 1660.99,-4854.24 1668.34,-4850.02 1664.1,-4846.36"/>
</g>
<!-- 0020 -->
<g id="node13" class="node">
<title>0020</title>
<path fill="#fbe5d6" stroke="#c55a11" d="M1693.98,-4727.64C1693.98,-4727.64 1563.23,-4727.64 1563.23,-4727.64 1557.23,-4727.64 1551.23,-4721.64 1551.23,-4715.64 1551.23,-4715.64 1551.23,-4667.89 1551.23,-4667.89 1551.23,-4661.89 1557.23,-4655.89 1563.23,-4655.89 1563.23,-4655.89 1693.98,-4655.89 1693.98,-4655.89 1699.98,-4655.89 1705.98,-4661.89 1705.98,-4667.89 1705.98,-4667.89 1705.98,-4715.64 1705.98,-4715.64 1705.98,-4721.64 1699.98,-4727.64 1693.98,-4727.64"/>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4715.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke :17 &#160;[0020]</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4702.34" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4689.59" font-family="Segoe UI" font-size="9.00" fill="#833c00">h = 1.941 m</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4676.84" font-family="Segoe UI" font-size="9.00" fill="#833c00">1941 &#45;&gt; 1466 mm (&#45;475) = abwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4664.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Separator (1): 0040</text>
</g>
<!-- 0010&#45;L&#45;&gt;0020 -->
<g id="edge38" class="edge">
<title>0010&#45;L&#45;&gt;0020</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M2840.86,-3483.51C2690.89,-3632.99 1870.17,-4451 1671.79,-4648.73"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1669.97,-4646.58 1666.28,-4654.21 1673.92,-4650.55 1669.97,-4646.58"/>
</g>
<!-- 0021 -->
<g id="node14" class="node">
<title>0021</title>
<path fill="#fbe5d6" stroke="#c55a11" d="M1693.98,-4527.64C1693.98,-4527.64 1563.23,-4527.64 1563.23,-4527.64 1557.23,-4527.64 1551.23,-4521.64 1551.23,-4515.64 1551.23,-4515.64 1551.23,-4467.89 1551.23,-4467.89 1551.23,-4461.89 1557.23,-4455.89 1563.23,-4455.89 1563.23,-4455.89 1693.98,-4455.89 1693.98,-4455.89 1699.98,-4455.89 1705.98,-4461.89 1705.98,-4467.89 1705.98,-4467.89 1705.98,-4515.64 1705.98,-4515.64 1705.98,-4521.64 1699.98,-4527.64 1693.98,-4527.64"/>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4515.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke :16 &#160;[0021]</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4502.34" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4489.59" font-family="Segoe UI" font-size="9.00" fill="#833c00">h = 1.941 m</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4476.84" font-family="Segoe UI" font-size="9.00" fill="#833c00">1941 &#45;&gt; 1466 mm (&#45;475) = abwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4464.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Separator (1): 0041</text>
</g>
<!-- 0010&#45;L&#45;&gt;0021 -->
<g id="edge36" class="edge">
<title>0010&#45;L&#45;&gt;0021</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M2836.31,-3483.49C2677.05,-3616.46 1888.32,-4274.94 1679.44,-4449.33"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1677.7,-4447.13 1673.36,-4454.4 1681.29,-4451.43 1677.7,-4447.13"/>
</g>
<!-- 0022 -->
<g id="node15" class="node">
<title>0022</title>
<path fill="#fbe5d6" stroke="#c55a11" d="M1693.98,-4327.64C1693.98,-4327.64 1563.23,-4327.64 1563.23,-4327.64 1557.23,-4327.64 1551.23,-4321.64 1551.23,-4315.64 1551.23,-4315.64 1551.23,-4267.89 1551.23,-4267.89 1551.23,-4261.89 1557.23,-4255.89 1563.23,-4255.89 1563.23,-4255.89 1693.98,-4255.89 1693.98,-4255.89 1699.98,-4255.89 1705.98,-4261.89 1705.98,-4267.89 1705.98,-4267.89 1705.98,-4315.64 1705.98,-4315.64 1705.98,-4321.64 1699.98,-4327.64 1693.98,-4327.64"/>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4315.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke :15 &#160;[0022]</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4302.34" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4289.59" font-family="Segoe UI" font-size="9.00" fill="#833c00">h = 1.941 m</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4276.84" font-family="Segoe UI" font-size="9.00" fill="#833c00">1941 &#45;&gt; 1466 mm (&#45;475) = abwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4264.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Separator (1): 0042</text>
</g>
<!-- 0010&#45;L&#45;&gt;0022 -->
<g id="edge34" class="edge">
<title>0010&#45;L&#45;&gt;0022</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M2829.45,-3483.56C2658.63,-3598.53 1911.67,-4101.25 1690.51,-4250.1"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1689.13,-4247.65 1684.06,-4254.44 1692.26,-4252.3 1689.13,-4247.65"/>
</g>
<!-- 0023 -->
<g id="node16" class="node">
<title>0023</title>
<path fill="#fbe5d6" stroke="#c55a11" d="M1693.98,-4127.64C1693.98,-4127.64 1563.23,-4127.64 1563.23,-4127.64 1557.23,-4127.64 1551.23,-4121.64 1551.23,-4115.64 1551.23,-4115.64 1551.23,-4067.89 1551.23,-4067.89 1551.23,-4061.89 1557.23,-4055.89 1563.23,-4055.89 1563.23,-4055.89 1693.98,-4055.89 1693.98,-4055.89 1699.98,-4055.89 1705.98,-4061.89 1705.98,-4067.89 1705.98,-4067.89 1705.98,-4115.64 1705.98,-4115.64 1705.98,-4121.64 1699.98,-4127.64 1693.98,-4127.64"/>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4115.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke :14 &#160;[0023]</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4102.34" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4089.59" font-family="Segoe UI" font-size="9.00" fill="#833c00">h = 1.941 m</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4076.84" font-family="Segoe UI" font-size="9.00" fill="#833c00">1941 &#45;&gt; 1466 mm (&#45;475) = abwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-4064.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Separator (1): 0043</text>
</g>
<!-- 0010&#45;L&#45;&gt;0023 -->
<g id="edge32" class="edge">
<title>0010&#45;L&#45;&gt;0023</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M2822.62,-3481.39C2644.26,-3572.56 1945.55,-3929.74 1708.09,-4051.13"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1706.97,-4048.56 1701.12,-4054.7 1709.52,-4053.55 1706.97,-4048.56"/>
</g>
<!-- 0024 -->
<g id="node17" class="node">
<title>0024</title>
<path fill="#fbe5d6" stroke="#c55a11" d="M1693.98,-3927.64C1693.98,-3927.64 1563.23,-3927.64 1563.23,-3927.64 1557.23,-3927.64 1551.23,-3921.64 1551.23,-3915.64 1551.23,-3915.64 1551.23,-3867.89 1551.23,-3867.89 1551.23,-3861.89 1557.23,-3855.89 1563.23,-3855.89 1563.23,-3855.89 1693.98,-3855.89 1693.98,-3855.89 1699.98,-3855.89 1705.98,-3861.89 1705.98,-3867.89 1705.98,-3867.89 1705.98,-3915.64 1705.98,-3915.64 1705.98,-3921.64 1699.98,-3927.64 1693.98,-3927.64"/>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3915.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke :13 &#160;[0024]</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3902.34" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3889.59" font-family="Segoe UI" font-size="9.00" fill="#833c00">h = 1.941 m</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3876.84" font-family="Segoe UI" font-size="9.00" fill="#833c00">1941 &#45;&gt; 1466 mm (&#45;475) = abwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3864.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Separator (1): 0044</text>
</g>
<!-- 0010&#45;L&#45;&gt;0024 -->
<g id="edge30" class="edge">
<title>0010&#45;L&#45;&gt;0024</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M2822.62,-3474.62C2646.11,-3536.28 1960.05,-3775.97 1715.66,-3861.35"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1714.8,-3858.69 1708.17,-3863.97 1716.64,-3863.97 1714.8,-3858.69"/>
</g>
<!-- 0025 -->
<g id="node18" class="node">
<title>0025</title>
<path fill="#fbe5d6" stroke="#c55a11" d="M1693.98,-3727.64C1693.98,-3727.64 1563.23,-3727.64 1563.23,-3727.64 1557.23,-3727.64 1551.23,-3721.64 1551.23,-3715.64 1551.23,-3715.64 1551.23,-3667.89 1551.23,-3667.89 1551.23,-3661.89 1557.23,-3655.89 1563.23,-3655.89 1563.23,-3655.89 1693.98,-3655.89 1693.98,-3655.89 1699.98,-3655.89 1705.98,-3661.89 1705.98,-3667.89 1705.98,-3667.89 1705.98,-3715.64 1705.98,-3715.64 1705.98,-3721.64 1699.98,-3727.64 1693.98,-3727.64"/>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3715.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke :12 &#160;[0025]</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3702.34" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3689.59" font-family="Segoe UI" font-size="9.00" fill="#833c00">h = 1.941 m</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3676.84" font-family="Segoe UI" font-size="9.00" fill="#833c00">1941 &#45;&gt; 1466 mm (&#45;475) = abwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3664.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Separator (1): 0045</text>
</g>
<!-- 0010&#45;L&#45;&gt;0025 -->
<g id="edge28" class="edge">
<title>0010&#45;L&#45;&gt;0025</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M2822.62,-3467.85C2646.2,-3500.93 1960.73,-3629.48 1716.02,-3675.37"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1715.59,-3672.6 1708.24,-3676.83 1716.62,-3678.11 1715.59,-3672.6"/>
</g>
<!-- 0026 -->
<g id="node19" class="node">
<title>0026</title>
<path fill="#fbe5d6" stroke="#c55a11" d="M1693.98,-3527.64C1693.98,-3527.64 1563.23,-3527.64 1563.23,-3527.64 1557.23,-3527.64 1551.23,-3521.64 1551.23,-3515.64 1551.23,-3515.64 1551.23,-3467.89 1551.23,-3467.89 1551.23,-3461.89 1557.23,-3455.89 1563.23,-3455.89 1563.23,-3455.89 1693.98,-3455.89 1693.98,-3455.89 1699.98,-3455.89 1705.98,-3461.89 1705.98,-3467.89 1705.98,-3467.89 1705.98,-3515.64 1705.98,-3515.64 1705.98,-3521.64 1699.98,-3527.64 1693.98,-3527.64"/>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3515.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke :11 &#160;[0026]</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3502.34" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3489.59" font-family="Segoe UI" font-size="9.00" fill="#833c00">h = 1.941 m</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3476.84" font-family="Segoe UI" font-size="9.00" fill="#833c00">1941 &#45;&gt; 1466 mm (&#45;475) = abwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3464.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Separator (1): 0046</text>
</g>
<!-- 0010&#45;L&#45;&gt;0026 -->
<g id="edge26" class="edge">
<title>0010&#45;L&#45;&gt;0026</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M2822.62,-3461.08C2646.2,-3465.61 1960.73,-3483.23 1716.02,-3489.52"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1716.19,-3486.71 1708.27,-3489.72 1716.34,-3492.31 1716.19,-3486.71"/>
</g>
<!-- 0027 -->
<g id="node20" class="node">
<title>0027</title>
<path fill="#fbe5d6" stroke="#c55a11" d="M1693.98,-3327.64C1693.98,-3327.64 1563.23,-3327.64 1563.23,-3327.64 1557.23,-3327.64 1551.23,-3321.64 1551.23,-3315.64 1551.23,-3315.64 1551.23,-3267.89 1551.23,-3267.89 1551.23,-3261.89 1557.23,-3255.89 1563.23,-3255.89 1563.23,-3255.89 1693.98,-3255.89 1693.98,-3255.89 1699.98,-3255.89 1705.98,-3261.89 1705.98,-3267.89 1705.98,-3267.89 1705.98,-3315.64 1705.98,-3315.64 1705.98,-3321.64 1699.98,-3327.64 1693.98,-3327.64"/>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3315.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke :10 &#160;[0027]</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3302.34" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3289.59" font-family="Segoe UI" font-size="9.00" fill="#833c00">h = 1.941 m</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3276.84" font-family="Segoe UI" font-size="9.00" fill="#833c00">1941 &#45;&gt; 1466 mm (&#45;475) = abwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3264.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Separator (1): 0047</text>
</g>
<!-- 0010&#45;L&#45;&gt;0027 -->
<g id="edge24" class="edge">
<title>0010&#45;L&#45;&gt;0027</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M2822.62,-3454.31C2646.2,-3430.29 1960.73,-3336.98 1716.02,-3303.67"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1716.56,-3300.91 1708.25,-3302.61 1715.8,-3306.46 1716.56,-3300.91"/>
</g>
<!-- 0028 -->
<g id="node21" class="node">
<title>0028</title>
<path fill="#fbe5d6" stroke="#c55a11" d="M1693.98,-3127.64C1693.98,-3127.64 1563.23,-3127.64 1563.23,-3127.64 1557.23,-3127.64 1551.23,-3121.64 1551.23,-3115.64 1551.23,-3115.64 1551.23,-3067.89 1551.23,-3067.89 1551.23,-3061.89 1557.23,-3055.89 1563.23,-3055.89 1563.23,-3055.89 1693.98,-3055.89 1693.98,-3055.89 1699.98,-3055.89 1705.98,-3061.89 1705.98,-3067.89 1705.98,-3067.89 1705.98,-3115.64 1705.98,-3115.64 1705.98,-3121.64 1699.98,-3127.64 1693.98,-3127.64"/>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3115.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke :9 &#160;[0028]</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3102.34" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3089.59" font-family="Segoe UI" font-size="9.00" fill="#833c00">h = 1.941 m</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3076.84" font-family="Segoe UI" font-size="9.00" fill="#833c00">1941 &#45;&gt; 1466 mm (&#45;475) = abwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-3064.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Separator (1): 0048</text>
</g>
<!-- 0010&#45;L&#45;&gt;0028 -->
<g id="edge22" class="edge">
<title>0010&#45;L&#45;&gt;0028</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M2822.62,-3447.54C2646.11,-3394.95 1960.05,-3190.52 1715.66,-3117.7"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1716.66,-3115.08 1708.19,-3115.48 1715.06,-3120.45 1716.66,-3115.08"/>
</g>
<!-- 0029 -->
<g id="node22" class="node">
<title>0029</title>
<path fill="#fbe5d6" stroke="#c55a11" d="M1693.98,-2927.64C1693.98,-2927.64 1563.23,-2927.64 1563.23,-2927.64 1557.23,-2927.64 1551.23,-2921.64 1551.23,-2915.64 1551.23,-2915.64 1551.23,-2867.89 1551.23,-2867.89 1551.23,-2861.89 1557.23,-2855.89 1563.23,-2855.89 1563.23,-2855.89 1693.98,-2855.89 1693.98,-2855.89 1699.98,-2855.89 1705.98,-2861.89 1705.98,-2867.89 1705.98,-2867.89 1705.98,-2915.64 1705.98,-2915.64 1705.98,-2921.64 1699.98,-2927.64 1693.98,-2927.64"/>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2915.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke :8 &#160;[0029]</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2902.34" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2889.59" font-family="Segoe UI" font-size="9.00" fill="#833c00">h = 1.941 m</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2876.84" font-family="Segoe UI" font-size="9.00" fill="#833c00">1941 &#45;&gt; 1466 mm (&#45;475) = abwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2864.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Separator (1): 0049</text>
</g>
<!-- 0010&#45;L&#45;&gt;0029 -->
<g id="edge20" class="edge">
<title>0010&#45;L&#45;&gt;0029</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M2822.62,-3440.77C2646.03,-3359.58 1959.37,-3043.85 1715.3,-2931.63"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1716.54,-2929.12 1708.1,-2928.32 1714.2,-2934.2 1716.54,-2929.12"/>
</g>
<!-- 0030 -->
<g id="node23" class="node">
<title>0030</title>
<path fill="#fbe5d6" stroke="#c55a11" d="M1693.98,-2727.64C1693.98,-2727.64 1563.23,-2727.64 1563.23,-2727.64 1557.23,-2727.64 1551.23,-2721.64 1551.23,-2715.64 1551.23,-2715.64 1551.23,-2667.89 1551.23,-2667.89 1551.23,-2661.89 1557.23,-2655.89 1563.23,-2655.89 1563.23,-2655.89 1693.98,-2655.89 1693.98,-2655.89 1699.98,-2655.89 1705.98,-2661.89 1705.98,-2667.89 1705.98,-2667.89 1705.98,-2715.64 1705.98,-2715.64 1705.98,-2721.64 1699.98,-2727.64 1693.98,-2727.64"/>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2715.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke :7 &#160;[0030]</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2702.34" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2689.59" font-family="Segoe UI" font-size="9.00" fill="#833c00">h = 1.941 m</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2676.84" font-family="Segoe UI" font-size="9.00" fill="#833c00">1941 &#45;&gt; 1466 mm (&#45;475) = abwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2664.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Separator (1): 0050</text>
</g>
<!-- 0010&#45;L&#45;&gt;0030 -->
<g id="edge18" class="edge">
<title>0010&#45;L&#45;&gt;0030</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M2826.44,-3436.38C2651.2,-3327.44 1920.01,-2872.91 1694.88,-2732.96"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1696.58,-2730.72 1688.31,-2728.88 1693.62,-2735.48 1696.58,-2730.72"/>
</g>
<!-- 0031 -->
<g id="node24" class="node">
<title>0031</title>
<path fill="#fbe5d6" stroke="#c55a11" d="M1693.98,-2527.64C1693.98,-2527.64 1563.23,-2527.64 1563.23,-2527.64 1557.23,-2527.64 1551.23,-2521.64 1551.23,-2515.64 1551.23,-2515.64 1551.23,-2467.89 1551.23,-2467.89 1551.23,-2461.89 1557.23,-2455.89 1563.23,-2455.89 1563.23,-2455.89 1693.98,-2455.89 1693.98,-2455.89 1699.98,-2455.89 1705.98,-2461.89 1705.98,-2467.89 1705.98,-2467.89 1705.98,-2515.64 1705.98,-2515.64 1705.98,-2521.64 1699.98,-2527.64 1693.98,-2527.64"/>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2515.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke :6 &#160;[0031]</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2502.34" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2489.59" font-family="Segoe UI" font-size="9.00" fill="#833c00">h = 1.941 m</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2476.84" font-family="Segoe UI" font-size="9.00" fill="#833c00">1941 &#45;&gt; 1466 mm (&#45;475) = abwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2464.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Separator (1): 0051</text>
</g>
<!-- 0010&#45;L&#45;&gt;0031 -->
<g id="edge16" class="edge">
<title>0010&#45;L&#45;&gt;0031</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M2834.51,-3436.55C2672.02,-3309.25 1895.48,-2700.85 1682.65,-2534.11"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1684.47,-2531.98 1676.45,-2529.25 1681.02,-2536.39 1684.47,-2531.98"/>
</g>
<!-- 0032 -->
<g id="node25" class="node">
<title>0032</title>
<path fill="#fbe5d6" stroke="#c55a11" d="M1693.98,-2327.64C1693.98,-2327.64 1563.23,-2327.64 1563.23,-2327.64 1557.23,-2327.64 1551.23,-2321.64 1551.23,-2315.64 1551.23,-2315.64 1551.23,-2267.89 1551.23,-2267.89 1551.23,-2261.89 1557.23,-2255.89 1563.23,-2255.89 1563.23,-2255.89 1693.98,-2255.89 1693.98,-2255.89 1699.98,-2255.89 1705.98,-2261.89 1705.98,-2267.89 1705.98,-2267.89 1705.98,-2315.64 1705.98,-2315.64 1705.98,-2321.64 1699.98,-2327.64 1693.98,-2327.64"/>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2315.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke :5 &#160;[0032]</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2302.34" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2289.59" font-family="Segoe UI" font-size="9.00" fill="#833c00">h = 1.941 m</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2276.84" font-family="Segoe UI" font-size="9.00" fill="#833c00">1941 &#45;&gt; 1466 mm (&#45;475) = abwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2264.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Separator (1): 0052</text>
</g>
<!-- 0010&#45;L&#45;&gt;0032 -->
<g id="edge14" class="edge">
<title>0010&#45;L&#45;&gt;0032</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M2839.48,-3436.4C2686.46,-3291.75 1875.24,-2524.91 1673.87,-2334.56"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1676.03,-2332.74 1668.29,-2329.28 1672.18,-2336.81 1676.03,-2332.74"/>
</g>
<!-- 0033 -->
<g id="node26" class="node">
<title>0033</title>
<path fill="#fbe5d6" stroke="#c55a11" d="M1693.98,-2127.64C1693.98,-2127.64 1563.23,-2127.64 1563.23,-2127.64 1557.23,-2127.64 1551.23,-2121.64 1551.23,-2115.64 1551.23,-2115.64 1551.23,-2067.89 1551.23,-2067.89 1551.23,-2061.89 1557.23,-2055.89 1563.23,-2055.89 1563.23,-2055.89 1693.98,-2055.89 1693.98,-2055.89 1699.98,-2055.89 1705.98,-2061.89 1705.98,-2067.89 1705.98,-2067.89 1705.98,-2115.64 1705.98,-2115.64 1705.98,-2121.64 1699.98,-2127.64 1693.98,-2127.64"/>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2115.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke :4 &#160;[0033]</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2102.34" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2089.59" font-family="Segoe UI" font-size="9.00" fill="#833c00">h = 1.941 m</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2076.84" font-family="Segoe UI" font-size="9.00" fill="#833c00">1941 &#45;&gt; 1466 mm (&#45;475) = abwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-2064.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Separator (1): 0053</text>
</g>
<!-- 0010&#45;L&#45;&gt;0033 -->
<g id="edge12" class="edge">
<title>0010&#45;L&#45;&gt;0033</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M2843.25,-3436.54C2698.93,-3276.76 1860.49,-2348.49 1667.99,-2135.37"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1670.07,-2133.5 1662.63,-2129.44 1665.92,-2137.25 1670.07,-2133.5"/>
</g>
<!-- 0034 -->
<g id="node27" class="node">
<title>0034</title>
<path fill="#fbe5d6" stroke="#c55a11" d="M1693.98,-1927.64C1693.98,-1927.64 1563.23,-1927.64 1563.23,-1927.64 1557.23,-1927.64 1551.23,-1921.64 1551.23,-1915.64 1551.23,-1915.64 1551.23,-1867.89 1551.23,-1867.89 1551.23,-1861.89 1557.23,-1855.89 1563.23,-1855.89 1563.23,-1855.89 1693.98,-1855.89 1693.98,-1855.89 1699.98,-1855.89 1705.98,-1861.89 1705.98,-1867.89 1705.98,-1867.89 1705.98,-1915.64 1705.98,-1915.64 1705.98,-1921.64 1699.98,-1927.64 1693.98,-1927.64"/>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-1915.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke :3 &#160;[0034]</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-1902.34" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-1889.59" font-family="Segoe UI" font-size="9.00" fill="#833c00">h = 1.941 m</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-1876.84" font-family="Segoe UI" font-size="9.00" fill="#833c00">1941 &#45;&gt; 1466 mm (&#45;475) = abwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-1864.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Separator (1): 0054</text>
</g>
<!-- 0010&#45;L&#45;&gt;0034 -->
<g id="edge10" class="edge">
<title>0010&#45;L&#45;&gt;0034</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M2846.02,-3436.62C2708.85,-3262.56 1847.34,-2169.33 1663.21,-1935.68"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1665.47,-1934.03 1658.32,-1929.48 1661.08,-1937.49 1665.47,-1934.03"/>
</g>
<!-- 0035 -->
<g id="node28" class="node">
<title>0035</title>
<path fill="#fbe5d6" stroke="#c55a11" d="M1693.98,-1727.64C1693.98,-1727.64 1563.23,-1727.64 1563.23,-1727.64 1557.23,-1727.64 1551.23,-1721.64 1551.23,-1715.64 1551.23,-1715.64 1551.23,-1667.89 1551.23,-1667.89 1551.23,-1661.89 1557.23,-1655.89 1563.23,-1655.89 1563.23,-1655.89 1693.98,-1655.89 1693.98,-1655.89 1699.98,-1655.89 1705.98,-1661.89 1705.98,-1667.89 1705.98,-1667.89 1705.98,-1715.64 1705.98,-1715.64 1705.98,-1721.64 1699.98,-1727.64 1693.98,-1727.64"/>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-1715.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke :2 &#160;[0035]</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-1702.34" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-1689.59" font-family="Segoe UI" font-size="9.00" fill="#833c00">h = 1.941 m</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-1676.84" font-family="Segoe UI" font-size="9.00" fill="#833c00">1941 &#45;&gt; 1466 mm (&#45;475) = abwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-1664.09" font-family="Segoe UI" font-size="9.00" fill="#833c00">Separator (1): 0055</text>
</g>
<!-- 0010&#45;L&#45;&gt;0035 -->
<g id="edge8" class="edge">
<title>0010&#45;L&#45;&gt;0035</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M2848.14,-3436.67C2717.11,-3249.2 1836.18,-1988.76 1659.44,-1735.89"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1661.86,-1734.45 1654.98,-1729.5 1657.27,-1737.66 1661.86,-1734.45"/>
</g>
<!-- 0036 -->
<g id="node29" class="node">
<title>0036</title>
<path fill="#fbe5d6" stroke="#c55a11" d="M1693.98,-1534.01C1693.98,-1534.01 1563.23,-1534.01 1563.23,-1534.01 1557.23,-1534.01 1551.23,-1528.01 1551.23,-1522.01 1551.23,-1522.01 1551.23,-1461.51 1551.23,-1461.51 1551.23,-1455.51 1557.23,-1449.51 1563.23,-1449.51 1563.23,-1449.51 1693.98,-1449.51 1693.98,-1449.51 1699.98,-1449.51 1705.98,-1455.51 1705.98,-1461.51 1705.98,-1461.51 1705.98,-1522.01 1705.98,-1522.01 1705.98,-1528.01 1699.98,-1534.01 1693.98,-1534.01"/>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-1521.46" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke :1 &#160;[0036]</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-1508.71" font-family="Segoe UI" font-size="9.00" fill="#833c00">Gefaellestrecke</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-1495.96" font-family="Segoe UI" font-size="9.00" fill="#833c00">h = 1.941 m</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-1483.21" font-family="Segoe UI" font-size="9.00" fill="#833c00">1941 &#45;&gt; 1466 mm (&#45;475) = abwaerts</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-1470.46" font-family="Segoe UI" font-size="9.00" fill="#833c00">Separator (2): 0005, 0056</text>
<text xml:space="preserve" text-anchor="middle" x="1628.61" y="-1457.71" font-family="Segoe UI" font-size="9.00" fill="#833c00">Scanner (1): 0066</text>
</g>
<!-- 0010&#45;L&#45;&gt;0036 -->
<!-- 0010&#45;L&#45;&gt;grp_0017 -->
<g id="edge6" class="edge">
<title>0010&#45;L&#45;&gt;0036</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M2849.7,-3436.53C2724.51,-3237.14 1839.69,-1827.95 1660.29,-1542.22"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1662.78,-1540.93 1656.15,-1535.64 1658.04,-1543.9 1662.78,-1540.93"/>
<title>0010&#45;L&#45;&gt;grp_0017</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M2834.62,-3467.07C2659.14,-3457.38 1979.99,-3419.88 1731.96,-3406.18"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="1732.2,-3403.39 1724.06,-3405.75 1731.89,-3408.99 1732.2,-3403.39"/>
</g>
<!-- 0010&#45;R -->
<g id="node6" class="node">
<title>0010&#45;R</title>
<path fill="#2f5597" stroke="#1f3864" d="M2908.07,-3314.51C2908.07,-3314.51 2820.82,-3314.51 2820.82,-3314.51 2814.82,-3314.51 2808.82,-3308.51 2808.82,-3302.51 2808.82,-3302.51 2808.82,-3267.51 2808.82,-3267.51 2808.82,-3261.51 2814.82,-3255.51 2820.82,-3255.51 2820.82,-3255.51 2908.07,-3255.51 2908.07,-3255.51 2914.07,-3255.51 2920.07,-3261.51 2920.07,-3267.51 2920.07,-3267.51 2920.07,-3302.51 2920.07,-3302.51 2920.07,-3308.51 2914.07,-3314.51 2908.07,-3314.51"/>
<text xml:space="preserve" text-anchor="middle" x="2864.44" y="-3301.95" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Kreisel3 &#160;[0010&#45;R]</text>
<text xml:space="preserve" text-anchor="middle" x="2864.44" y="-3289.2" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Bahn R (rechts)</text>
<text xml:space="preserve" text-anchor="middle" x="2864.44" y="-3276.45" font-family="Segoe UI" font-size="9.00" fill="#ffffff">h = 1.940 m</text>
<text xml:space="preserve" text-anchor="middle" x="2864.44" y="-3263.7" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Separator (2): 0063, 0064</text>
<path fill="#2f5597" stroke="#1f3864" d="M2920.07,-3323.88C2920.07,-3323.88 2832.82,-3323.88 2832.82,-3323.88 2826.82,-3323.88 2820.82,-3317.88 2820.82,-3311.88 2820.82,-3311.88 2820.82,-3276.88 2820.82,-3276.88 2820.82,-3270.88 2826.82,-3264.88 2832.82,-3264.88 2832.82,-3264.88 2920.07,-3264.88 2920.07,-3264.88 2926.07,-3264.88 2932.07,-3270.88 2932.07,-3276.88 2932.07,-3276.88 2932.07,-3311.88 2932.07,-3311.88 2932.07,-3317.88 2926.07,-3323.88 2920.07,-3323.88"/>
<text xml:space="preserve" text-anchor="middle" x="2876.45" y="-3311.33" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Kreisel3 &#160;[0010&#45;R]</text>
<text xml:space="preserve" text-anchor="middle" x="2876.45" y="-3298.58" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Bahn R (rechts)</text>
<text xml:space="preserve" text-anchor="middle" x="2876.45" y="-3285.83" font-family="Segoe UI" font-size="9.00" fill="#ffffff">h = 1.940 m</text>
<text xml:space="preserve" text-anchor="middle" x="2876.45" y="-3273.08" font-family="Segoe UI" font-size="9.00" fill="#ffffff">Separator (2): 0063, 0064</text>
</g>
<!-- 0010&#45;R&#45;&gt;0010&#45;L -->
<g id="edge3" class="edge">
<g id="edge5" class="edge">
<title>0010&#45;R&#45;&gt;0010&#45;L</title>
<g id="a_edge3"><a xlink:title="Kreisel&#45;Umlauf UZS">
<path fill="none" stroke="#8ea9db" stroke-width="1.2" stroke-dasharray="5,2" d="M2864.44,-3314.69C2864.44,-3345.48 2864.44,-3393.57 2864.44,-3425.9"/>
<polygon fill="#8ea9db" stroke="#8ea9db" stroke-width="1.2" points="2861.3,-3425.81 2864.45,-3434.81 2867.6,-3425.81 2861.3,-3425.81"/>
<g id="a_edge5"><a xlink:title="Kreisel&#45;Umlauf UZS">
<path fill="none" stroke="#8ea9db" stroke-width="1.2" stroke-dasharray="5,2" d="M2876.45,-3324.07C2876.45,-3354.86 2876.45,-3402.94 2876.45,-3435.28"/>
<polygon fill="#8ea9db" stroke="#8ea9db" stroke-width="1.2" points="2873.3,-3435.19 2876.45,-3444.19 2879.6,-3435.19 2873.3,-3435.19"/>
</a>
</g>
<text xml:space="preserve" text-anchor="middle" x="2857.32" y="-3379.44" font-family="Segoe UI" font-size="8.00" fill="#5b7fc7">UZS</text>
<text xml:space="preserve" text-anchor="middle" x="2869.32" y="-3388.81" font-family="Segoe UI" font-size="8.00" fill="#5b7fc7">UZS</text>
</g>
<!-- 0013&#45;&gt;0010&#45;L -->
<g id="edge51" class="edge">
<g id="edge13" class="edge">
<title>0013&#45;&gt;0010&#45;L</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1642.83,-5631.18C1791.09,-5367.68 2706.66,-3740.44 2846.53,-3491.85"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="2848.8,-3493.52 2850.29,-3485.17 2843.92,-3490.77 2848.8,-3493.52"/>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1654.83,-5640.56C1803.09,-5377.06 2718.66,-3749.82 2858.53,-3501.22"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="2860.8,-3502.89 2862.29,-3494.55 2855.92,-3500.15 2860.8,-3502.89"/>
</g>
<!-- 0014&#45;&gt;0010&#45;L -->
<g id="edge49" class="edge">
<g id="edge11" class="edge">
<title>0014&#45;&gt;0010&#45;L</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1645.05,-1146.6C1800.36,-1441.25 2711.82,-3170.45 2847.55,-3427.95"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="2844.99,-3429.1 2851.2,-3434.87 2849.94,-3426.49 2844.99,-3429.1"/>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1657.05,-1155.97C1812.36,-1450.62 2723.82,-3179.82 2859.55,-3437.32"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="2856.99,-3438.48 2863.2,-3444.25 2861.94,-3435.87 2856.99,-3438.48"/>
</g>
<!-- 0016&#45;&gt;0002&#45;R -->
<g id="edge47" class="edge">
<title>0016&#45;&gt;0002&#45;R</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M236.24,-3731.59C248.24,-3664.1 275.3,-3529.18 316.37,-3420.43 330.4,-3383.28 352.17,-3343.24 367.83,-3316.41"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="370.1,-3318.06 371.75,-3309.75 365.28,-3315.22 370.1,-3318.06"/>
</g>
<!-- 0017&#45;&gt;0002&#45;R -->
<g id="edge45" class="edge">
<title>0017&#45;&gt;0002&#45;R</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1606.26,-5255.65C1452.33,-5006.88 550.95,-3550.07 406.48,-3316.57"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="409.02,-3315.35 402.43,-3310.02 404.25,-3318.3 409.02,-3315.35"/>
</g>
<!-- 0018&#45;&gt;0002&#45;R -->
<g id="edge43" class="edge">
<title>0018&#45;&gt;0002&#45;R</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1603.8,-5055.67C1443.76,-4822.8 558.75,-3535 408.6,-3316.51"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="411.04,-3315.12 404.2,-3310.11 406.42,-3318.29 411.04,-3315.12"/>
</g>
<!-- 0019&#45;&gt;0002&#45;R -->
<g id="edge41" class="edge">
<title>0019&#45;&gt;0002&#45;R</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1600.63,-4855.57C1433.32,-4639.06 566.89,-3517.86 410.99,-3316.12"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="413.34,-3314.58 406.23,-3309.97 408.91,-3318.01 413.34,-3314.58"/>
</g>
<!-- 0020&#45;&gt;0002&#45;R -->
<g id="edge39" class="edge">
<title>0020&#45;&gt;0002&#45;R</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1596.66,-4655.58C1421.17,-4456.74 576.18,-3499.4 413.92,-3315.57"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="416.17,-3313.88 408.78,-3309.74 411.97,-3317.59 416.17,-3313.88"/>
</g>
<!-- 0021&#45;&gt;0002&#45;R -->
<g id="edge37" class="edge">
<title>0021&#45;&gt;0002&#45;R</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1591.44,-4455.65C1406.47,-4275.87 587.15,-3479.59 417.68,-3314.88"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="419.78,-3313.01 412.09,-3309.44 415.88,-3317.03 419.78,-3313.01"/>
</g>
<!-- 0022&#45;&gt;0002&#45;R -->
<g id="edge35" class="edge">
<title>0022&#45;&gt;0002&#45;R</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1584.05,-4255.64C1387.82,-4096.53 602.5,-3459.78 423.42,-3314.58"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="425.23,-3312.44 417.25,-3309.58 421.7,-3316.79 425.23,-3312.44"/>
</g>
<!-- 0023&#45;&gt;0002&#45;R -->
<g id="edge33" class="edge">
<title>0023&#45;&gt;0002&#45;R</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1572.84,-4055.53C1362.67,-3918.98 620.79,-3436.94 431.28,-3313.81"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="432.95,-3311.56 424.72,-3309.55 429.9,-3316.26 432.95,-3311.56"/>
</g>
<!-- 0024&#45;&gt;0002&#45;R -->
<g id="edge31" class="edge">
<title>0024&#45;&gt;0002&#45;R</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1554.19,-3855.4C1324.63,-3743.22 631.34,-3404.43 437.68,-3309.8"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="439.16,-3307.4 430.74,-3306.41 436.7,-3312.43 439.16,-3307.4"/>
</g>
<!-- 0025&#45;&gt;0002&#45;R -->
<g id="edge29" class="edge">
<title>0025&#45;&gt;0002&#45;R</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1550.93,-3666.32C1318.35,-3590.13 631.64,-3365.17 438.19,-3301.79"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="439.28,-3299.2 430.81,-3299.38 437.54,-3304.53 439.28,-3299.2"/>
</g>
<!-- 0026&#45;&gt;0002&#45;R -->
<g id="edge27" class="edge">
<title>0026&#45;&gt;0002&#45;R</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1550.93,-3478.83C1318.58,-3440.14 633,-3325.98 438.77,-3293.63"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="439.23,-3290.87 430.88,-3292.32 438.31,-3296.4 439.23,-3290.87"/>
</g>
<!-- 0027&#45;&gt;0002&#45;R -->
<g id="edge25" class="edge">
<title>0027&#45;&gt;0002&#45;R</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1550.93,-3291.34C1318.58,-3290.08 633,-3286.34 438.77,-3285.29"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="438.92,-3282.49 430.9,-3285.24 438.89,-3288.09 438.92,-3282.49"/>
</g>
<!-- 0028&#45;&gt;0002&#45;R -->
<g id="edge23" class="edge">
<title>0028&#45;&gt;0002&#45;R</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1550.93,-3103.85C1318.58,-3140.01 633,-3246.71 438.77,-3276.94"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="438.35,-3274.17 430.88,-3278.17 439.21,-3279.7 438.35,-3274.17"/>
</g>
<!-- 0029&#45;&gt;0002&#45;R -->
<g id="edge21" class="edge">
<title>0029&#45;&gt;0002&#45;R</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1550.93,-2916.36C1318.35,-2990.02 631.64,-3207.51 438.19,-3268.78"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="437.6,-3266.03 430.82,-3271.11 439.29,-3271.36 437.6,-3266.03"/>
</g>
<!-- 0030&#45;&gt;0002&#45;R -->
<g id="edge19" class="edge">
<title>0030&#45;&gt;0002&#45;R</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1552.8,-2727.98C1321.9,-2838.3 631.24,-3168.29 437.8,-3260.71"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="436.62,-3258.17 430.61,-3264.14 439.03,-3263.22 436.62,-3258.17"/>
</g>
<!-- 0031&#45;&gt;0002&#45;R -->
<g id="edge17" class="edge">
<title>0031&#45;&gt;0002&#45;R</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1572.03,-2527.91C1360.96,-2662.75 621.93,-3134.88 431.81,-3256.34"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="430.47,-3253.88 425.23,-3260.54 433.48,-3258.6 430.47,-3253.88"/>
</g>
<!-- 0032&#45;&gt;0002&#45;R -->
<g id="edge15" class="edge">
<title>0032&#45;&gt;0002&#45;R</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1583.31,-2328C1386.05,-2485.79 603.75,-3111.57 423.93,-3255.42"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="422.23,-3253.19 417.73,-3260.38 425.73,-3257.57 422.23,-3253.19"/>
</g>
<!-- 0033&#45;&gt;0002&#45;R -->
<g id="edge13" class="edge">
<title>0033&#45;&gt;0002&#45;R</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1590.77,-2128.13C1404.65,-2306.98 588.5,-3091.31 418.17,-3255"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="416.37,-3252.84 412.54,-3260.41 420.25,-3256.88 416.37,-3252.84"/>
</g>
<!-- 0034&#45;&gt;0002&#45;R -->
<g id="edge11" class="edge">
<title>0034&#45;&gt;0002&#45;R</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1596.35,-1927.96C1420.24,-2125.57 576.89,-3071.87 414.16,-3254.47"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="412.23,-3252.43 408.99,-3260.27 416.41,-3256.16 412.23,-3252.43"/>
</g>
<!-- 0035&#45;&gt;0002&#45;R -->
<g id="edge9" class="edge">
<title>0035&#45;&gt;0002&#45;R</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1600.34,-1728.04C1432.38,-1943.55 567.62,-3053.17 411.21,-3253.87"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="409.15,-3251.96 406.44,-3259.99 413.57,-3255.4 409.15,-3251.96"/>
<title>0016&#45;&gt;0002&#45;R</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M248.24,-3740.97C260.24,-3673.48 287.3,-3538.56 328.37,-3429.81 342.4,-3392.65 364.17,-3352.61 379.83,-3325.78"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="382.1,-3327.44 383.75,-3319.12 377.28,-3324.59 382.1,-3327.44"/>
</g>
<!-- 0036&#45;&gt;0002&#45;R -->
<!-- grp_0017&#45;&gt;0002&#45;R -->
<g id="edge7" class="edge">
<title>0036&#45;&gt;0002&#45;R</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1599.14,-1534.32C1427.36,-1782.41 557.72,-3038.36 408.69,-3253.6"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="406.4,-3252 404.14,-3260.17 411,-3255.18 406.4,-3252"/>
<title>grp_0017&#45;&gt;0002&#45;R</title>
<path fill="none" stroke="#2f5597" stroke-width="1.2" d="M1559.14,-3394.14C1323.15,-3373.84 643.65,-3315.42 450.64,-3298.82"/>
<polygon fill="#2f5597" stroke="#2f5597" stroke-width="1.2" points="451.03,-3296.05 442.82,-3298.15 450.55,-3301.63 451.03,-3296.05"/>
</g>
<!-- legende -->
<g id="node30" class="node">
<g id="node11" class="node">
<title>legende</title>
<text xml:space="preserve" text-anchor="start" x="12" y="-48.5" font-family="Segoe UI" font-size="9.00">durchgezogen</text>
<text xml:space="preserve" text-anchor="start" x="78.75" y="-48.5" font-family="Segoe UI" font-size="9.00">Materialfluss</text>
<text xml:space="preserve" text-anchor="start" x="12" y="-29.75" font-family="Segoe UI" font-size="9.00" fill="#8ea9db">gestrichelt blau</text>
<text xml:space="preserve" text-anchor="start" x="78.75" y="-29.75" font-family="Segoe UI" font-size="9.00">Kreisel&#45;Umlauf, Richtung aus Drehrichtung (UZS = rechts nach links, GUZ = links nach rechts)</text>
<text xml:space="preserve" text-anchor="start" x="12" y="-11" font-family="Segoe UI" font-size="9.00" fill="#bf8f00">gestrichelt gelb</text>
<text xml:space="preserve" text-anchor="start" x="78.75" y="-11" font-family="Segoe UI" font-size="9.00">Richtung nicht bestimmbar</text>
<text xml:space="preserve" text-anchor="start" x="12" y="-67.25" font-family="Segoe UI" font-size="9.00">durchgezogen</text>
<text xml:space="preserve" text-anchor="start" x="102.75" y="-67.25" font-family="Segoe UI" font-size="9.00">Materialfluss</text>
<text xml:space="preserve" text-anchor="start" x="12" y="-48.5" font-family="Segoe UI" font-size="9.00" fill="#8ea9db">gestrichelt blau</text>
<text xml:space="preserve" text-anchor="start" x="102.75" y="-48.5" font-family="Segoe UI" font-size="9.00">Kreisel&#45;Umlauf, Richtung aus Drehrichtung (UZS = rechts nach links, GUZ = links nach rechts)</text>
<text xml:space="preserve" text-anchor="start" x="12" y="-29.75" font-family="Segoe UI" font-size="9.00" fill="#bf8f00">gestrichelt gelb</text>
<text xml:space="preserve" text-anchor="start" x="102.75" y="-29.75" font-family="Segoe UI" font-size="9.00">Richtung nicht bestimmbar</text>
<text xml:space="preserve" text-anchor="start" x="12" y="-11" font-family="Segoe UI" font-size="9.00">doppelte Umrandung</text>
<text xml:space="preserve" text-anchor="start" x="102.75" y="-11" font-family="Segoe UI" font-size="9.00">Gruppe paralleler Gefaellestrecken (gleicher Zu&#45;/Ablauf, gleiche Steigung)</text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 21 KiB

@@ -1,8 +1,8 @@
<!-- erzeugt von lib/material_flow.py -->
# Materialfluss - export.csv
# Materialfluss - mubea.csv
**Erzeugt:** 2026-08-07 13:20 von `lib/material_flow.py`
**Quelle:** `C:\develop\sps_skel\data\export.csv`
**Erzeugt:** 2026-08-21 11:53 von `lib/material_flow.py`
**Quelle:** `C:\10-Develop\gitrepos\sps_skel\data\mubea.csv`
> Materialfluss der mechanischen Objekte. Die daraus abgeleiteten Steuerungsobjekte (TROs) dokumentiert `lib/tro_flow.py --doc`.
@@ -15,7 +15,7 @@
| Anbauteile | Scanner: 6, Separator: 33 |
| Plausibilitaetshinweise | 7 |
Graph: [`export_material_flow.dot`](export_material_flow.dot) - [`export_material_flow.svg`](export_material_flow.svg)
Graph: [`mubea_material_flow.dot`](mubea_material_flow.dot) - [`mubea_material_flow.svg`](mubea_material_flow.svg)
Ein **Kreisel** ist ein Umlauf und wird als zwei Knoten modelliert - eine Bahn je Fahrtrichtung (`-L` links, `-R` rechts), die zu einem Kreis verbunden sind.
@@ -67,55 +67,55 @@ Hoehe: bei Kreiseln aus dem Merkmal `Höhe in m`, bei Gefaellestrecke und Streck
|---|---|---|
| `0001-L` | `0002-R` | Richtung unbestimmt (Weiche) |
| `0001-R` | `0002-R` | Richtung unbestimmt (Weiche) |
| `0010-R` | `0010-L` | Kreisel-Umlauf (UZS) |
| `0002-R` | `0002-L` | Kreisel-Umlauf (UZS) |
| `0001-R` | `0001-L` | Kreisel-Umlauf (UZS) |
| `0010-L` | `0036` | Materialfluss |
| `0036` | `0002-R` | Materialfluss |
| `0010-L` | `0035` | Materialfluss |
| `0035` | `0002-R` | Materialfluss |
| `0010-L` | `0034` | Materialfluss |
| `0034` | `0002-R` | Materialfluss |
| `0010-L` | `0033` | Materialfluss |
| `0033` | `0002-R` | Materialfluss |
| `0010-L` | `0032` | Materialfluss |
| `0032` | `0002-R` | Materialfluss |
| `0010-L` | `0031` | Materialfluss |
| `0031` | `0002-R` | Materialfluss |
| `0010-L` | `0030` | Materialfluss |
| `0030` | `0002-R` | Materialfluss |
| `0010-L` | `0029` | Materialfluss |
| `0029` | `0002-R` | Materialfluss |
| `0010-L` | `0028` | Materialfluss |
| `0028` | `0002-R` | Materialfluss |
| `0010-L` | `0027` | Materialfluss |
| `0027` | `0002-R` | Materialfluss |
| `0010-L` | `0026` | Materialfluss |
| `0026` | `0002-R` | Materialfluss |
| `0010-L` | `0025` | Materialfluss |
| `0025` | `0002-R` | Materialfluss |
| `0010-L` | `0024` | Materialfluss |
| `0024` | `0002-R` | Materialfluss |
| `0010-L` | `0023` | Materialfluss |
| `0023` | `0002-R` | Materialfluss |
| `0010-L` | `0022` | Materialfluss |
| `0022` | `0002-R` | Materialfluss |
| `0010-L` | `0021` | Materialfluss |
| `0021` | `0002-R` | Materialfluss |
| `0010-L` | `0020` | Materialfluss |
| `0020` | `0002-R` | Materialfluss |
| `0010-L` | `0019` | Materialfluss |
| `0019` | `0002-R` | Materialfluss |
| `0010-L` | `0018` | Materialfluss |
| `0018` | `0002-R` | Materialfluss |
| `0010-L` | `0017` | Materialfluss |
| `0017` | `0002-R` | Materialfluss |
| `0002-L` | `0016` | Materialfluss |
| `0016` | `0002-R` | Materialfluss |
| `0002-R` | `0014` | Materialfluss |
| `0014` | `0010-L` | Materialfluss |
| `0002-R` | `0013` | Materialfluss |
| `0013` | `0010-L` | Materialfluss |
| `0002-R` | `0002-L` | Kreisel-Umlauf (UZS) |
| `0010-R` | `0010-L` | Kreisel-Umlauf (UZS) |
| `0010-L` | `0036` | Materialfluss (Ausschleusung) |
| `0036` | `0002-R` | Materialfluss (Einschleusung) |
| `0010-L` | `0035` | Materialfluss (Ausschleusung) |
| `0035` | `0002-R` | Materialfluss (Einschleusung) |
| `0010-L` | `0034` | Materialfluss (Ausschleusung) |
| `0034` | `0002-R` | Materialfluss (Einschleusung) |
| `0010-L` | `0033` | Materialfluss (Ausschleusung) |
| `0033` | `0002-R` | Materialfluss (Einschleusung) |
| `0010-L` | `0032` | Materialfluss (Ausschleusung) |
| `0032` | `0002-R` | Materialfluss (Einschleusung) |
| `0010-L` | `0031` | Materialfluss (Ausschleusung) |
| `0031` | `0002-R` | Materialfluss (Einschleusung) |
| `0010-L` | `0030` | Materialfluss (Ausschleusung) |
| `0030` | `0002-R` | Materialfluss (Einschleusung) |
| `0010-L` | `0029` | Materialfluss (Ausschleusung) |
| `0029` | `0002-R` | Materialfluss (Einschleusung) |
| `0010-L` | `0028` | Materialfluss (Ausschleusung) |
| `0028` | `0002-R` | Materialfluss (Einschleusung) |
| `0010-L` | `0027` | Materialfluss (Ausschleusung) |
| `0027` | `0002-R` | Materialfluss (Einschleusung) |
| `0010-L` | `0026` | Materialfluss (Ausschleusung) |
| `0026` | `0002-R` | Materialfluss (Einschleusung) |
| `0010-L` | `0025` | Materialfluss (Ausschleusung) |
| `0025` | `0002-R` | Materialfluss (Einschleusung) |
| `0010-L` | `0024` | Materialfluss (Ausschleusung) |
| `0024` | `0002-R` | Materialfluss (Einschleusung) |
| `0010-L` | `0023` | Materialfluss (Ausschleusung) |
| `0023` | `0002-R` | Materialfluss (Einschleusung) |
| `0010-L` | `0022` | Materialfluss (Ausschleusung) |
| `0022` | `0002-R` | Materialfluss (Einschleusung) |
| `0010-L` | `0021` | Materialfluss (Ausschleusung) |
| `0021` | `0002-R` | Materialfluss (Einschleusung) |
| `0010-L` | `0020` | Materialfluss (Ausschleusung) |
| `0020` | `0002-R` | Materialfluss (Einschleusung) |
| `0010-L` | `0019` | Materialfluss (Ausschleusung) |
| `0019` | `0002-R` | Materialfluss (Einschleusung) |
| `0010-L` | `0018` | Materialfluss (Ausschleusung) |
| `0018` | `0002-R` | Materialfluss (Einschleusung) |
| `0010-L` | `0017` | Materialfluss (Ausschleusung) |
| `0017` | `0002-R` | Materialfluss (Einschleusung) |
| `0002-L` | `0016` | Materialfluss (Ausschleusung) |
| `0016` | `0002-R` | Materialfluss (Einschleusung) |
| `0002-R` | `0014` | Materialfluss (Ausschleusung) |
| `0014` | `0010-L` | Materialfluss (Einschleusung) |
| `0002-R` | `0013` | Materialfluss (Ausschleusung) |
| `0013` | `0010-L` | Materialfluss (Einschleusung) |
Die Richtung innerhalb eines Kreisels kommt aus dem Merkmal `Drehrichtung`: **UZS** (im Uhrzeigersinn) laesst das Material rechts nach links laufen, **GUZ** (gegen den Uhrzeigersinn) links nach rechts.
@@ -133,7 +133,7 @@ Abweichungen zwischen den Merkmalen des CSV-Exports und den tatsaechlich vorhand
## 5. Warnungen des Laufs
- Zeile 52 (Strecke 0016 'VarioFoerderer :1'): alle Nachbarn auf gleicher Hoehe (1.470 m) - Richtung nicht bestimmbar
- Zeile 17 (Strecke 0016 'VarioFoerderer :1'): alle Nachbarn auf gleicher Hoehe (1.470 m) - Richtung nicht bestimmbar
- Verbindung 0001-L <-> 0002-R: Richtung nicht bestimmbar (kein Transportobjekt beteiligt) - beidseitig gezeichnet
- Verbindung 0001-R <-> 0002-R: Richtung nicht bestimmbar (kein Transportobjekt beteiligt) - beidseitig gezeichnet
- Verbindung 0002-L <-> 0016: Richtung nicht bestimmbar (kein Transportobjekt beteiligt) - beidseitig gezeichnet
+32 -8
View File
@@ -1,12 +1,13 @@
# Python Scripts — CLI Tooling Overview
**As of:** 2026-08-03
**As of:** 2026-08-20
`lib/` currently holds five Python modules (three of them runnable CLI tools,
two supporting libraries), plus one documentation-generator script that lives
`lib/` currently holds eight Python modules (five of them runnable CLI tools,
three supporting libraries), plus one documentation-generator script that lives
under `doc/TRO_Katalog/tro_graphs/`. Together the CLI tools turn a CSV export
of the mechanical layout (ILS 2.0) into a material-flow graph, a derived TRO
list/diagram, and an annotated copy of the BricsCAD drawing.
list/diagram, an annotated copy of the BricsCAD drawing, a TRO-JSON read back
out of that drawing, and an `FB_Main` SCL skeleton generated from that JSON.
This document is the practical "what does each script do and which switches
does it take" reference. For the underlying domain model (TRO types, JSON
@@ -27,8 +28,14 @@ tro_flow.py ──► <name>_tro_flow.dot / .svg, _tro_doc.md, _tro_error
│ (derives TROs, using the type catalog in tro_catalog.py)
tro_annotate.py ──► <name>_annotated.dxf, <name>_registration.json
(also needs the BricsCAD DXF; uses dxf_registration.py for the CSV↔DXF
coordinate offset and tro_catalog.py for marker shape/color per TRO type)
(also needs the BricsCAD DXF; uses dxf_registration.py for the CSV↔DXF
coordinate offset and tro_catalog.py for marker shape/color per TRO type)
▼ (drawing may be hand-edited in BricsCAD before the next step)
tro_extract.py ──► <drawing>_tro.json
│ (reads only the drawing; resolves plant coords via the registration)
scl_skeleton.py ──► <source>_FB_Main.scl
(one REGION per TRO; E-planning values left as TODO(E-Planung) gaps)
```
- `material_flow.py` models the material flow of the **mechanical** objects only
@@ -47,6 +54,9 @@ Supporting libraries (no CLI of their own, imported by the tools above):
- **`lib/dxf_registration.py`** — derives, verifies and persists the rigid
(rotation + offset) transform between the CSV export's coordinate system and
the DXF drawing's.
- **`lib/tro_overrides.py`** — reads the hand-maintained
`%SKEL_CFG%\tro_overrides.ini` (type corrections, open points, TRO merges)
that survive re-runs of `tro_flow.py`. See §6a.
Separate, documentation-only tool (not part of the generator pipeline):
@@ -74,7 +84,7 @@ bin\tro_annotate.bat --file mubea.csv --dxf 500573_60_1.dxf --flow --fb --legend
(`--use-cords` lays both graphs out at the real plant coordinates; drop it for
Graphviz's computed left-to-right arrangement.)
Conventions shared by all three tools:
Conventions shared by the CLI tools:
- `--file` / `--dxf` accept either a bare filename — resolved against
`%SKEL_DATA%` — or a full path.
@@ -88,7 +98,11 @@ Conventions shared by all three tools:
`ezdxf>=1.4.0` for `tro_annotate.py` only) — run `bin\install_py.bat` once.
- `--tosvg` needs Graphviz's `dot` (or `neato`, for `tro_flow.py
--use-cords`) on `PATH`, or the `GRAPHVIZ_DOT` environment variable pointing
at the `dot` executable.
at the `dot` executable. `bin/material_flow.bat`/`.sh` and `bin/tro_flow.bat`/`.sh`
check for the right engine up front when `--tosvg` is passed and print an early
`WARNUNG` if it's missing (`GRAPHVIZ_DOT` only covers `dot`, not `neato`) — this
is just a heads-up before the CSV is even parsed; the Python script still runs
and reports the same failure in detail (exit code `2`) if the SVG step is reached.
## 3. `material_flow.py` — material-flow graph of the mechanical layout
@@ -122,6 +136,16 @@ Reads the CSV export and builds a directed graph of the mechanical objects:
> will contain the 61 conveyor items but **no** BTMT rows, so no entry/exit nodes
> appear. The recognition above is ready for when BTMT rows are present.
In the rendered graph, **parallel Gefällestrecken between the same two Kreisel
lanes with the same slope** (`Hoehe_Von_mm`/`Hoehe_Bis_mm`) — a typical
line-storage bank — are drawn as a **single** Gefällestrecke-styled box with a
double border (`peripheries=2`) instead of one box per line. Its label states
the id range and count of the merged lines plus the combined Separator/Scanner
id ranges, e.g. `Gefaellestrecke 0017 - 0036 (20x)` / `Separator (20): 0037 -
0056`. This is purely a rendering simplification (`_group_parallel_gefaelle`
in `lib/material_flow.py`) — the underlying graph, `--doc` report and
`--connect` output are unaffected and still list every line individually.
Flow direction between conveyor segments is derived from height change
(`Hoehe_Von_mm`/`Hoehe_Bis_mm`) or, failing that, from `Antriebfahrtrichtung`
("Auf"/"Ab"); connections whose direction can't be determined are drawn
+116 -1
View File
@@ -138,6 +138,12 @@ NODE_STYLES = {
}
DEFAULT_NODE_STYLE = dict(fillcolor="#f2f2f2", fontcolor="#404040", color="#808080")
# Ab dieser Anzahl paralleler Gefaellestrecken zwischen denselben zwei
# Kreisel-Bahnen (gleicher Zulauf, gleicher Ablauf, gleiche Steigung) werden
# sie im Materialfluss-Diagramm zu einem Block zusammengefasst - sonst wird
# eine grosse Linienbank (Speicher) unlesbar breit.
MIN_GEFAELLE_GROUP = 2
# ---------------------------------------------------------------------------
# Datenmodell
@@ -1011,6 +1017,78 @@ def _pos_attr(node: "Node", use_coords: bool) -> str:
return f', pos="{xy[0] * COORD_SCALE:.2f},{xy[1] * COORD_SCALE:.2f}"'
def _flow_neighbours(node_id: str, edges: list[Edge]) -> tuple[str, str] | None:
"""
(Vorgaenger, Nachfolger) eines Knotens im Materialfluss.
None, wenn der Knoten nicht genau einen ankommenden und einen abgehenden
EDGE_FLOW hat - dann ist er kein einfacher Durchlaufknoten zwischen zwei
festen Nachbarn.
"""
incoming = {e.src for e in edges if e.dst == node_id and e.kind == EDGE_FLOW}
outgoing = {e.dst for e in edges if e.src == node_id and e.kind == EDGE_FLOW}
if len(incoming) != 1 or len(outgoing) != 1:
return None
return next(iter(incoming)), next(iter(outgoing))
def _group_parallel_gefaelle(graph: Graph) -> list[list[Node]]:
"""
Parallele Gefaellestrecken zwischen denselben zwei Kreisel-Bahnen zu
Gruppen zusammenfassen (z. B. eine Bank aus Schwerkraftlinien).
Kriterium: gleicher Zulauf- und Ablauf-Knoten (jeweils eine Kreisel-Bahn)
und gleiche Steigung (Hoehe_Von/Hoehe_Bis) - "gleich lang und gleiche
Steigung" laesst sich aus dem Export nur ueber die Hoehenangabe pruefen,
die Laenge ergibt sich daraus, dass beide Enden an denselben zwei Knoten
haengen. Rein fuer die Darstellung; Graph-Knoten/-Kanten bleiben unveraendert.
"""
groups: dict[tuple, list[Node]] = {}
for node_id in sorted(graph.nodes):
node = graph.nodes[node_id]
if node.kind != "Gefaellestrecke":
continue
neighbours = _flow_neighbours(node_id, graph.edges)
if neighbours is None:
continue
before, after = neighbours
if graph.nodes[before].kind != "Kreisel" or graph.nodes[after].kind != "Kreisel":
continue
element = node.element
key = (before, after, element.height_from, element.height_to)
groups.setdefault(key, []).append(node)
return [members for members in groups.values() if len(members) >= MIN_GEFAELLE_GROUP]
def _id_range(ids: list[str]) -> str:
"""Sortierte Ids als Bereich, z. B. ['0037', '0056'] -> '0037 - 0056'."""
ids = sorted(ids)
return ids[0] if len(ids) == 1 else f"{ids[0]} - {ids[-1]}"
def _gefaelle_group_label(members: list[Node]) -> str:
"""Sammel-Label einer Gefaellestrecken-Gruppe: Bereich der Linien-Ids,
gemeinsame Steigung, zusammengefasste Separatoren/Scanner."""
element = members[0].element
ids = sorted(m.node_id for m in members)
lines = [
f"Gefaellestrecke {ids[0]} -> {ids[-1]} ({len(ids)}x)",
"Gruppe paralleler Schwerkraftlinien",
]
if element.height is not None:
lines.append(f"h = {element.height:.3f} m")
if element.rise is not None:
uphill = drive_uphill(element)[0]
arrow = {True: "aufwaerts", False: "abwaerts", None: "Richtung offen"}[uphill]
lines.append(f"{element.height_from:.0f} -> {element.height_to:.0f} mm "
f"({element.rise:+.0f}) = {arrow}")
for kind in DEVICE_KINDS:
ids_dev = sorted({d for m in members for d in m.devices.get(kind, [])})
if ids_dev:
lines.append(f"{kind} ({len(ids_dev)}): {_id_range(ids_dev)}")
return _dot_label(lines)
def render_dot(graph: Graph, use_coords: bool = False) -> str:
out: list[str] = []
add = out.append
@@ -1059,14 +1137,48 @@ def render_dot(graph: Graph, use_coords: bool = False) -> str:
add(" }")
add("")
# Parallele Gefaellestrecken (gleicher Zu-/Ablauf, gleiche Steigung) zu
# je einem Block zusammenfassen, damit eine Linienbank nicht als N
# einzelne Kaesten gezeichnet wird.
gefaelle_groups = _group_parallel_gefaelle(graph)
group_of: dict[str, str] = {}
for members in gefaelle_groups:
group_id = f"grp_{members[0].node_id}"
for member in members:
group_of[member.node_id] = group_id
grouped_ids = set(group_of)
for node in plain:
if node.node_id in grouped_ids:
continue
style = NODE_STYLES.get(node.kind, DEFAULT_NODE_STYLE)
attrs = ", ".join(f'{key}="{value}"' for key, value in style.items())
add(f' "{node.node_id}" [label="{_node_label(node)}", {attrs}'
f'{_pos_attr(node, use_coords)}];')
for members in gefaelle_groups:
group_id = f"grp_{members[0].node_id}"
style = NODE_STYLES.get("Gefaellestrecke", DEFAULT_NODE_STYLE)
attrs = ", ".join(f'{key}="{value}"' for key, value in style.items())
pos = ""
if use_coords:
xs = [xy[0] for m in members if (xy := _node_xy(m))]
ys = [xy[1] for m in members if (xy := _node_xy(m))]
if xs and ys:
pos = (f', pos="{sum(xs) / len(xs) * COORD_SCALE:.2f},'
f'{sum(ys) / len(ys) * COORD_SCALE:.2f}"')
add(f' "{group_id}" [label="{_gefaelle_group_label(members)}", {attrs}, '
f'peripheries=2{pos}];')
add("")
seen_group_edges: set[tuple[str, str]] = set()
for edge in graph.edges:
src = group_of.get(edge.src, edge.src)
dst = group_of.get(edge.dst, edge.dst)
if edge.src in grouped_ids or edge.dst in grouped_ids:
if src == dst or (src, dst) in seen_group_edges:
continue
seen_group_edges.add((src, dst))
if edge.kind == EDGE_CIRCLE:
# Richtung kommt aus der Drehrichtung und steht als Label an der Kante
label = f', xlabel="{_dot_escape(edge.note)}"' if edge.note else ""
@@ -1082,7 +1194,7 @@ def render_dot(graph: Graph, use_coords: bool = False) -> str:
'fontcolor="#cc8800", tooltip="Weiche (Kreisel-Uebergang)"]')
else:
attrs = "[]"
add(f' "{edge.src}" -> "{edge.dst}" {attrs};')
add(f' "{src}" -> "{dst}" {attrs};')
add("")
legend_pos = ""
@@ -1106,6 +1218,9 @@ def render_dot(graph: Graph, use_coords: bool = False) -> str:
f'{ROTATION_CCW} = {ROTATION_FLOW[ROTATION_CCW]})</td></tr>'
'<tr><td align="left"><font color="#bf8f00">gestrichelt gelb</font></td>'
'<td align="left">Richtung nicht bestimmbar</td></tr>'
'<tr><td align="left">doppelte Umrandung</td>'
'<td align="left">Gruppe paralleler Gefaellestrecken (gleicher Zu-/Ablauf, '
"gleiche Steigung)</td></tr>"
"</table>>];")
add(" }")
add("}")