Add material flow generator for the mechanical layout

Reads the CSV export of the plant objects (ILS 2.0) from SKEL_DATA and builds a
directed graph of the material flow, written as Graphviz DOT and optionally SVG
into SKEL_RESULTS.

Node model: one node per Gefaellestrecke and Strecke; a Kreisel becomes two
nodes (-L / -R) wired into a circle, since it is a carousel with one lane per
travel direction. Separators and scanners are no nodes of their own; they are
shown on the label of the object they are assigned to.

Edge direction is not in the CSV - the Nachbarn column is symmetric. It is
derived from geometry instead: a Gefaellestrecke runs downhill away from its
highest neighbour, a driven Strecke follows Antriebfahrtrichtung ("Auf" uphill,
"Ab" downhill). Connections that stay ambiguous, e.g. between two Kreisel at the
same height, are drawn as bidirectional edges and reported.

The lane suffix of a Kreisel is always stated in the *partner's* row, so both
viewpoints of a link are merged before orienting it.

Switches:
  --file   name of the CSV in SKEL_DATA, or a full path
  --tosvg  render the DOT via Graphviz
  --doc    write a Markdown documentation of the plant objects

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-30 13:13:01 +02:00
parent f8baaf536e
commit 4454af5165
3 changed files with 1140 additions and 0 deletions
+30
View File
@@ -0,0 +1,30 @@
@echo off
REM ================================================================
REM SPS_SKEL - Materialfluss-Graph erzeugen
REM ================================================================
REM Aufruf:
REM bin\material_flow.bat --file export.csv
REM bin\material_flow.bat --file export.csv --tosvg
REM
REM Die CSV-Datei wird in %SKEL_DATA% gesucht, DOT und SVG werden
REM in %SKEL_RESULTS% abgelegt.
REM ================================================================
setlocal
REM Umgebung setzen (SKEL_DATA, SKEL_RESULTS, SKEL_LIB, PYTHONPATH ...)
call "%~dp0setenv.bat" >nul
REM Virtuelle Umgebung nutzen, falls vorhanden
if exist "%SPS_SKEL%\.venv\Scripts\activate.bat" (
call "%SPS_SKEL%\.venv\Scripts\activate.bat"
)
REM Python-Interpreter bestimmen (py-Launcher bevorzugt, sonst python)
set "PY=py"
py --version >nul 2>&1 || set "PY=python"
"%PY%" "%SKEL_LIB%\material_flow.py" %*
set "RC=%ERRORLEVEL%"
endlocal & exit /b %RC%
+31
View File
@@ -0,0 +1,31 @@
#!/usr/bin/env bash
# ================================================================
# SPS_SKEL - Materialfluss-Graph erzeugen
# ================================================================
# Aufruf:
# bash bin/material_flow.sh --file export.csv
# bash bin/material_flow.sh --file export.csv --tosvg
#
# Die CSV-Datei wird in $SKEL_DATA gesucht, DOT und SVG werden
# in $SKEL_RESULTS abgelegt.
# ================================================================
set -eu
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# Umgebung setzen (SKEL_DATA, SKEL_RESULTS, SKEL_LIB, PYTHONPATH ...)
# shellcheck source=/dev/null
. "$SCRIPT_DIR/setenv.sh" >/dev/null
# Virtuelle Umgebung nutzen, falls vorhanden
if [ -f "$SPS_SKEL/.venv/bin/activate" ]; then
# shellcheck source=/dev/null
. "$SPS_SKEL/.venv/bin/activate"
fi
# Python-Interpreter bestimmen
PY="python3"
command -v python3 >/dev/null 2>&1 || PY="python"
exec "$PY" "$SKEL_LIB/material_flow.py" "$@"
+1079
View File
File diff suppressed because it is too large Load Diff