From 00dffc59eb313197f6dcdfee902eccb0df1691ee Mon Sep 17 00:00:00 2001 From: Michael Stangl Date: Sat, 11 Jul 2026 10:21:45 +0200 Subject: [PATCH] Web-MVP (M1): FastAPI-API, Testoberflaeche, tische.ini-Upload, zwei neue Beispiele - web/main.py: Session-basierte REST-API um den GA-Kern (POST /sitzung, .../tische, .../tische-datei, .../personen, .../berechnen, GET .../ergebnis[.svg]); Sessions in-memory mit 24h-TTL - web/static/index.html: einfache Browser-Testoberflaeche (Tisch-Tabelle mit Presets, tische.ini-Upload, CSV-Gaesteliste, Kennzahlen, SVG) - bin/run_web.bat/.sh + run_web_helper.ps1: start/stop/status inkl. Aufraeumen verwaister uvicorn-Reload-Kindprozesse (Zombie-Sockets) - work/hochzeit: 120 Hochzeitsgaeste, Ehrentafel, Kindertisch/Teenager- Tisch fest gesetzt, Kinderalter normalverteilt, ~85% Auslastung - work/innenhoefe: 300 Gaeste in zwei trapezfoermigen Innenhoefen mit 4er-Tischen, 12 VIPs vor der Buehne, Umfeld.svg mit Tanzflaeche/Band - Roadmap: Konzeptentscheidungen 1-11 (Zielgruppe, Einmalzahlung, MoR, Hetzner, Zwei-Marken-Strategie Sitz&Platz/SeatWonder), Namensrecherche im Anhang, M1-Fortschritt und GA-Lasttest-Datenpunkt dokumentiert Co-Authored-By: Claude Fable 5 --- .gitignore | 1 + bin/run_web.bat | 76 + bin/run_web.sh | 95 + bin/run_web_helper.ps1 | 86 + .../sechs_tische_kreis_dreiergruppen.svg | 4 +- doc/roadmap.md | 32 +- requirements.txt | 11 +- web/main.py | 470 +++++ web/static/index.html | 329 ++++ work/hochzeit/PersonenTische.csv | 120 ++ work/hochzeit/Sitzplatzverteilung.svg | 158 ++ work/hochzeit/TischePersonen.txt | 154 ++ work/hochzeit/bestellung.xml | 549 ++++++ work/hochzeit/tische.ini | 118 ++ work/innenhoefe/PersonenTische.csv | 300 ++++ work/innenhoefe/Sitzplatzverteilung.svg | 480 +++++ work/innenhoefe/TischePersonen.txt | 476 +++++ work/innenhoefe/Umfeld.svg | 111 ++ work/innenhoefe/bestellung.xml | 1541 +++++++++++++++++ work/innenhoefe/tische.ini | 615 +++++++ 20 files changed, 5706 insertions(+), 20 deletions(-) create mode 100644 bin/run_web.bat create mode 100644 bin/run_web.sh create mode 100644 bin/run_web_helper.ps1 create mode 100644 web/main.py create mode 100644 web/static/index.html create mode 100644 work/hochzeit/PersonenTische.csv create mode 100644 work/hochzeit/Sitzplatzverteilung.svg create mode 100644 work/hochzeit/TischePersonen.txt create mode 100644 work/hochzeit/bestellung.xml create mode 100644 work/hochzeit/tische.ini create mode 100644 work/innenhoefe/PersonenTische.csv create mode 100644 work/innenhoefe/Sitzplatzverteilung.svg create mode 100644 work/innenhoefe/TischePersonen.txt create mode 100644 work/innenhoefe/Umfeld.svg create mode 100644 work/innenhoefe/bestellung.xml create mode 100644 work/innenhoefe/tische.ini diff --git a/.gitignore b/.gitignore index fcf5227..a1e941b 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ work/ausgabe.txt out/ .vscode/ *.swp +/log/ diff --git a/bin/run_web.bat b/bin/run_web.bat new file mode 100644 index 0000000..d05362d --- /dev/null +++ b/bin/run_web.bat @@ -0,0 +1,76 @@ +@echo off +REM ================================================================ +REM Verwaltet die lokale Web-Testinstanz (FastAPI/uvicorn, M1) +REM +REM run_web.bat start - startet den Server im Hintergrund +REM run_web.bat stop - beendet den Server (inkl. Reload-Kindprozesse) +REM run_web.bat status - zeigt ob und unter welcher PID er laeuft +REM run_web.bat - startet im Vordergrund (Strg+C zum Beenden) +REM +REM http://localhost:8000 Testoberflaeche +REM http://localhost:8000/docs interaktive API-Doku (Swagger) +REM +REM Die Prozess-/Portlogik liegt in run_web_helper.ps1 (cmd-Escaping +REM von mehrzeiligen PowerShell-Kommandos ist zu fehleranfaellig). +REM ================================================================ + +call "%~dp0setenv.bat" > nul + +set WEB_PORT=8000 +set HELFER=powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0run_web_helper.ps1" + +if /I "%~1"=="start" goto :start +if /I "%~1"=="stop" goto :stop +if /I "%~1"=="status" goto :status +if "%~1"=="" goto :vordergrund +echo Unbekannter Parameter "%~1" - erlaubt: start ^| stop ^| status +exit /b 1 + +REM ---------------------------------------------------------------- +:vordergrund +call :venv_pruefen || exit /b 1 +echo Starte Web-Testinstanz im Vordergrund (Strg+C zum Beenden) ... +python -m uvicorn main:app --reload --app-dir "%PLATZ%\web" --port %WEB_PORT% +exit /b %errorlevel% + +REM ---------------------------------------------------------------- +:start +call :venv_pruefen || exit /b 1 +%HELFER% check %WEB_PORT% +if not errorlevel 1 ( + echo Server laeuft bereits auf Port %WEB_PORT% - erst "run_web.bat stop". + exit /b 1 +) +if not exist "%PLATZ%\log" mkdir "%PLATZ%\log" +echo Starte Web-Testinstanz im Hintergrund ... +start "platz-web" /MIN cmd /c "call "%~dp0setenv.bat" > nul && call "%PLATZ%\.venv\Scripts\activate.bat" && python -m uvicorn main:app --reload --app-dir "%PLATZ%\web" --port %WEB_PORT% > "%PLATZ%\log\run_web.log" 2>&1" +REM kurz warten und pruefen, ob der Server wirklich hochkommt +REM (ping statt timeout: funktioniert auch ohne interaktive Konsole) +ping -n 4 127.0.0.1 > nul +%HELFER% check %WEB_PORT% +if errorlevel 1 ( + echo FEHLER: Server ist nicht gestartet - siehe %PLATZ%\log\run_web.log + exit /b 1 +) +echo Server laeuft: http://localhost:%WEB_PORT% ^(Logdatei: log\run_web.log^) +exit /b 0 + +REM ---------------------------------------------------------------- +:stop +echo Beende alle uvicorn-Prozesse dieses Projekts auf Port %WEB_PORT% ... +%HELFER% stop %WEB_PORT% +exit /b 0 + +REM ---------------------------------------------------------------- +:status +%HELFER% status %WEB_PORT% +exit /b %errorlevel% + +REM ---------------------------------------------------------------- +:venv_pruefen +if exist "%PLATZ%\.venv\Scripts\activate.bat" ( + call "%PLATZ%\.venv\Scripts\activate.bat" + exit /b 0 +) +echo FEHLER: kein .venv gefunden - bitte zuerst bin\install_py.bat ausfuehren +exit /b 1 diff --git a/bin/run_web.sh b/bin/run_web.sh new file mode 100644 index 0000000..3ef2f03 --- /dev/null +++ b/bin/run_web.sh @@ -0,0 +1,95 @@ +#!/bin/bash +# ================================================================ +# Verwaltet die lokale Web-Testinstanz (FastAPI/uvicorn, M1) +# +# run_web.sh start - startet den Server im Hintergrund +# run_web.sh stop - beendet den Server (inkl. Reload-Kindprozesse) +# run_web.sh status - zeigt ob und unter welcher PID er laeuft +# run_web.sh - startet im Vordergrund (Strg+C zum Beenden) +# +# http://localhost:8000 Testoberflaeche +# http://localhost:8000/docs interaktive API-Doku (Swagger) +# ================================================================ + +source "$(dirname "${BASH_SOURCE[0]}")/setenv.sh" > /dev/null + +WEB_PORT=8000 +PIDDATEI="$PLATZ/log/run_web.pid" +LOGDATEI="$PLATZ/log/run_web.log" + +venv_pruefen() { + if [ -f "$PLATZ/.venv/bin/activate" ]; then + source "$PLATZ/.venv/bin/activate" + else + echo "FEHLER: kein .venv gefunden - bitte zuerst bin/install_py.sh ausfuehren" + return 1 + fi +} + +lauft_pid() { + # gibt die PID des Servers aus, wenn er laeuft (Rueckgabe 0), sonst 1 + if [ -f "$PIDDATEI" ]; then + local pid + pid=$(cat "$PIDDATEI") + if kill -0 "$pid" 2> /dev/null; then + echo "$pid" + return 0 + fi + rm -f "$PIDDATEI" + fi + # Fallback: nach dem Prozess suchen (z.B. PID-Datei verloren) + pgrep -f "uvicorn main:app.*--port $WEB_PORT" | head -1 && return 0 + return 1 +} + +case "${1:-}" in + start) + venv_pruefen || exit 1 + if pid=$(lauft_pid); then + echo "Server laeuft bereits (PID $pid) - erst 'run_web.sh stop'." + exit 1 + fi + mkdir -p "$PLATZ/log" + echo "Starte Web-Testinstanz im Hintergrund ..." + nohup python -m uvicorn main:app --reload \ + --app-dir "$PLATZ/web" --port "$WEB_PORT" \ + > "$LOGDATEI" 2>&1 & + echo $! > "$PIDDATEI" + sleep 3 + if pid=$(lauft_pid); then + echo "Server laeuft: http://localhost:$WEB_PORT (PID $pid, Log: log/run_web.log)" + else + echo "FEHLER: Server ist nicht gestartet - siehe $LOGDATEI" + exit 1 + fi + ;; + stop) + gestoppt=0 + if pid=$(lauft_pid); then + # ganze Prozessgruppe beenden (uvicorn-Reloader + Kindprozesse) + pkill -TERM -P "$pid" 2> /dev/null && gestoppt=1 + kill "$pid" 2> /dev/null && gestoppt=1 + fi + # Nachzuegler, deren Elternprozess schon weg ist + pkill -f "uvicorn main:app.*--port $WEB_PORT" 2> /dev/null && gestoppt=1 + rm -f "$PIDDATEI" + if [ "$gestoppt" = "1" ]; then echo "Beendet."; else echo "Es lief nichts."; fi + ;; + status) + if pid=$(lauft_pid); then + echo "LAEUFT: http://localhost:$WEB_PORT (PID $pid)" + else + echo "GESTOPPT: kein Server auf Port $WEB_PORT" + fi + ;; + "") + venv_pruefen || exit 1 + echo "Starte Web-Testinstanz im Vordergrund (Strg+C zum Beenden) ..." + exec python -m uvicorn main:app --reload \ + --app-dir "$PLATZ/web" --port "$WEB_PORT" + ;; + *) + echo "Unbekannter Parameter '$1' - erlaubt: start | stop | status" + exit 1 + ;; +esac diff --git a/bin/run_web_helper.ps1 b/bin/run_web_helper.ps1 new file mode 100644 index 0000000..f66bb77 --- /dev/null +++ b/bin/run_web_helper.ps1 @@ -0,0 +1,86 @@ +# ================================================================ +# PowerShell-Helfer fuer run_web.bat (start/stop/status) +# Aufruf: powershell -NoProfile -ExecutionPolicy Bypass +# -File run_web_helper.ps1 +# +# "check" liefert nur den Exitcode (0 = Server lauscht, 1 = nicht) +# und keine Ausgabe - fuer die Pruefung nach dem Start. +# +# Verwaiste Socket-Eintraege (Listener, deren Prozess nicht mehr +# existiert - passiert nach abgestuerzten Reload-Kindprozessen) +# werden ueberall ignoriert. +# ================================================================ +param( + [Parameter(Mandatory = $true)][ValidateSet('status', 'stop', 'check')] + [string]$Aktion, + [int]$Port = 8000 +) + +function Lebende-Listener([int]$p) { + try { + Get-NetTCPConnection -LocalPort $p -State Listen -ErrorAction Stop | + Where-Object { Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue } + } catch { @() } +} + +function Uvicorn-Prozesse { + Get-CimInstance Win32_Process -Filter "Name like 'python%'" | + Where-Object { $_.CommandLine -match 'uvicorn main:app' } +} + +switch ($Aktion) { + + 'check' { + if (Lebende-Listener $Port) { exit 0 } else { exit 1 } + } + + 'status' { + $l = Lebende-Listener $Port | Select-Object -First 1 + if ($l) { + "LAEUFT: http://localhost:$Port (Listener-PID $($l.OwningProcess))" + foreach ($e in Uvicorn-Prozesse) { " uvicorn-Prozess: PID $($e.ProcessId)" } + exit 0 + } else { + "GESTOPPT: kein Server auf Port $Port" + exit 1 + } + } + + 'stop' { + $gefunden = $false + $alle = Get-CimInstance Win32_Process -Filter "Name like 'python%'" + $reloaderPids = @() + foreach ($e in ($alle | Where-Object { $_.CommandLine -match 'uvicorn main:app' })) { + $gefunden = $true + $reloaderPids += $e.ProcessId + # erst die Kindprozesse (Reload-Worker), dann den Reloader selbst + $alle | Where-Object { $_.ParentProcessId -eq $e.ProcessId } | ForEach-Object { + Stop-Process -Id $_.ProcessId -Force -Confirm:$false -ErrorAction SilentlyContinue + } + Stop-Process -Id $e.ProcessId -Force -Confirm:$false -ErrorAction SilentlyContinue + } + # Zombie-Jagd: uvicorn-Reload-Worker sind multiprocessing-Spawn-Kinder + # ("spawn_main(parent_pid=N, ...)"). Stirbt ihr Reloader unsanft, + # ueberleben sie MIT geerbtem Server-Socket und bedienen den Port + # unsichtbar weiter (weder "uvicorn" in der Kommandozeile noch + # Eintrag als Socket-Besitzer!). Erkennung: spawn_main-Prozess, + # dessen parent_pid tot oder ein eben beendeter Reloader ist. + foreach ($k in ($alle | Where-Object { $_.CommandLine -match 'multiprocessing.spawn.*spawn_main' })) { + if ($k.CommandLine -match 'parent_pid=(\d+)') { + $eltern = [int]$Matches[1] + $elternTot = -not (Get-Process -Id $eltern -ErrorAction SilentlyContinue) + if ($elternTot -or ($reloaderPids -contains $eltern)) { + $gefunden = $true + Stop-Process -Id $k.ProcessId -Force -Confirm:$false -ErrorAction SilentlyContinue + } + } + } + # Nachzuegler: alles Lebende, das den Port noch haelt + Lebende-Listener $Port | ForEach-Object { + $gefunden = $true + Stop-Process -Id $_.OwningProcess -Force -Confirm:$false -ErrorAction SilentlyContinue + } + if ($gefunden) { 'Beendet.' } else { 'Es lief nichts.' } + exit 0 + } +} diff --git a/doc/images/sechs_tische_kreis_dreiergruppen.svg b/doc/images/sechs_tische_kreis_dreiergruppen.svg index 16c7f92..6fafc60 100644 --- a/doc/images/sechs_tische_kreis_dreiergruppen.svg +++ b/doc/images/sechs_tische_kreis_dreiergruppen.svg @@ -15,8 +15,8 @@ Tisch 4 - - + + Tisch 5 diff --git a/doc/roadmap.md b/doc/roadmap.md index 89371f2..eaf96e7 100644 --- a/doc/roadmap.md +++ b/doc/roadmap.md @@ -186,17 +186,21 @@ Die folgenden Grundsatzfragen sind entschieden und gelten für alle Meilensteine **Ziel:** Eine Person kann übers Web eine Hochzeit planen, ohne Login. Ergebnis: PDF/SVG-Export. Session-basiert, nichts wird dauerhaft gespeichert (schont Datenschutz-Aufwand in dieser Phase). -- [ ] REST-API um den bestehenden Kern (FastAPI empfohlen: async, OpenAPI-Doku gratis, - gut für Traffic-Spitzen an Wochenenden) - - `POST /sitzung` — legt eine Arbeits-Session an (Tische + Personen) - - `POST /sitzung/{id}/tische` — Tisch-Layout (Ersatz für `tische.ini`) +- [x] REST-API um den bestehenden Kern (FastAPI) — umgesetzt in `web/main.py`, + Start per `bin/run_web.bat`/`.sh` (uvicorn --reload, Port 8000), Swagger unter `/docs` + - `POST /sitzung` — legt eine Arbeits-Session an (in-memory, TTL 24h) + - `POST /sitzung/{id}/tische` — Tisch-Layout als JSON (Ersatz für `tische.ini`); + Nachbarliste wird aus räumlicher Nähe der Koordinaten abgeleitet - `POST /sitzung/{id}/personen` — CSV-Upload (Ersatz für `bestellung.xml`) - - `POST /sitzung/{id}/berechnen` — startet die GA-Optimierung - - `GET /sitzung/{id}/ergebnis.svg` — liefert `alsSVG()`-Resultat -- [ ] **CSV-Format definieren und Parser bauen** (Analogon zu `XMLConfig`): - Spalten z.B. `Vorname;Nachname;Titel;Gruppe;Tisch(optional=VIP)` - → wird zu `Personen`/`Gruppen`/VIP-Map, exakt wie `XMLConfig.HandleBestellung()` - heute — reiner Adapter, kein Kernumbau. + - `POST /sitzung/{id}/berechnen` — startet die GA-Optimierung (jeder Aufruf = neue Variante) + - `GET /sitzung/{id}/ergebnis` + `GET /sitzung/{id}/ergebnis.svg` — Ergebnis als JSON/SVG +- [x] **CSV-Format definiert und Parser gebaut** — `libs/CSVConfig.py` (Adapter analog + `XMLConfig`): Spalten `Vorname;Nachname;Titel;Gruppe;Tisch;Anzahl`; `Tisch` = VIP- + Fixplatz, `Anzahl` = Sammelbuchungs-Expansion, leere `Gruppe` = Einzelgast; + `MagNicht`/`MagGern` werden akzeptiert aber noch ignoriert (Konzeptentscheidung Nr. 10) +- [x] Einfache Browser-Testoberfläche (`web/static/index.html`): Tisch-Tabelle mit + Presets, CSV-Textfeld/-Upload, Berechnen-Button, Kennzahlen + SVG-Anzeige — + Zwischenschritt, wird durch den Konva-Tisch-Editor (unten) abgelöst - [ ] **Interaktiver Tisch-Editor** (Frontend, React/Vue + SVG): Kreise per Drag & Drop platzieren, Kapazität einstellen, Nachbarschaft automatisch aus räumlicher Nähe ableiten (statt manueller `Nachbarliste`-Pflege in `tische.ini`) @@ -314,8 +318,12 @@ parallel anlaufen — eher ~4–4,5 Monate bis M4-Abschluss. 1. **Datenschutz wird unterschätzt** — sobald echte Gästelisten dauerhaft gespeichert werden (ab M3), ist das kein Nebenthema mehr. Frühzeitig Rechtsberatung einholen, nicht erst kurz vor Launch. -2. **GA-Performance bei großen Sälen** — noch nicht lastgetestet mit z.B. 300+ Personen - und vielen Tischen; ggf. Optimierungsbedarf vor M2. +2. **GA-Performance bei großen Sälen** — erster Datenpunkt (2026-07-11): das Beispiel + `work/innenhoefe` mit 300 Gästen an 88 Tischen rechnet mit dem Easy-Zyklus in ~0,4 s + durch — weit unter der 5-s-Schwelle, ab der M2 eine Job-Queue vorsieht. Offen bleibt + der Test mit größeren Zyklen (mehr Generationen für bessere Lösungsqualität bei + vielen Trennungen) — die Lösungsgüte bei 4er-Tischen mit großen Gruppen (Wertigkeit + −384) legt nahe, dass hier eher mehr GA-Iterationen nötig sind als bisher. 3. **Wettbewerb ist real und etabliert** — siehe Abschnitt "Marktübersicht" oben. PerfectTablePlan verfolgt seit Jahren denselben GA-Ansatz, allerdings als Desktop-Tool. Differenzierung muss über Web-nativ + DSGVO-Hosting + detailliertere Regeln diff --git a/requirements.txt b/requirements.txt index 8f9924e..9572702 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,7 @@ # Python-Abhaengigkeiten fuer platz # -# Aktuell werden nur Module aus der Standardbibliothek verwendet -# (configparser, xml.dom.minidom, random, ...). -# Keine externen Pakete erforderlich. -# -# Beispiel: -# requests==2.31.0 +# Der Kern (libs/) verwendet nur die Standardbibliothek. +# Die folgenden Pakete braucht nur die Web-API (web/main.py, Roadmap M1): +fastapi>=0.110 +uvicorn[standard]>=0.29 +python-multipart>=0.0.9 diff --git a/web/main.py b/web/main.py new file mode 100644 index 0000000..f322e3d --- /dev/null +++ b/web/main.py @@ -0,0 +1,470 @@ +""" +REST-API um den bestehenden Sitzplatz-Kern (Meilenstein 1 der Roadmap). + +Session-basiert, nichts wird dauerhaft gespeichert: jede Sitzung lebt +im Speicher des Servers und verfaellt nach 24 Stunden (TTL) — bewusst +ohne Accounts/DB, siehe Roadmap M1 ("schont Datenschutz-Aufwand"). + +Endpunkte (siehe auch /docs — interaktive Swagger-UI von FastAPI): + POST /sitzung — legt eine Arbeits-Session an + GET /sitzung/{id} — Status der Session + POST /sitzung/{id}/tische — Tisch-Layout als JSON (Ersatz tische.ini) + POST /sitzung/{id}/personen — Gaesteliste als CSV-Upload (Ersatz bestellung.xml) + POST /sitzung/{id}/berechnen — startet die GA-Optimierung + GET /sitzung/{id}/ergebnis — Ergebnis als JSON (Tische -> Personen) + GET /sitzung/{id}/ergebnis.svg — Ergebnis als SVG (alsSVG aus dem Kern) + +Start (lokale Testinstanz, siehe bin/run_web.bat / bin/run_web.sh): + python -m uvicorn main:app --reload --app-dir web +""" + +import ast +import math +import os +import sys +import tempfile +import threading +import time +import uuid + +# Projektwurzel und Pfade robust aus der eigenen Lage ableiten, damit der +# Server auch ohne vorheriges setenv laeuft (PLATZ_* hat Vorrang, falls gesetzt) +BASISDIR = os.path.dirname( os.path.dirname( os.path.abspath( __file__ ) ) ) +LIBSDIR = os.environ.get( 'PLATZ_LIBS', os.path.join( BASISDIR, 'libs' ) ) +CFGDIR = os.environ.get( 'PLATZ_CFG', os.path.join( BASISDIR, 'cfg' ) ) +if LIBSDIR not in sys.path: + sys.path.insert( 0, LIBSDIR ) + +from fastapi import FastAPI, File, HTTPException, UploadFile +from fastapi.responses import Response +from fastapi.staticfiles import StaticFiles +from pydantic import BaseModel, Field + +from ga import Farm, Zyklus +from CSVConfig import CSVConfig +from Strukturdaten import Sitzplatzverteilung, Strafliste, Tisch, Tische + +app = FastAPI( + title='Sitz & Platz — API', + description='Sitzplatz-Optimierung per genetischem Algorithmus ' + '(Meilenstein 1: Session-basiert, ohne Accounts)', + version='0.1.0' ) + +# ---------------------------------------------------------------- GA-Konfig +# Zyklus und Strafliste einmal beim Start laden (wie in libs/platz.py) +import configparser +_PlatzCfg = configparser.ConfigParser() +_PlatzCfg.read( os.path.join( CFGDIR, 'platz.cfg' ) ) +ZYKLUSDATEI = os.path.expandvars( os.path.normpath( + _PlatzCfg.get( 'Config', 'Zyklusdatei', + fallback=os.path.join( CFGDIR, 'zyklus.cfg' ) ) ) ) +ZYKLUSART = _PlatzCfg.get( 'Config', 'Zyklusart', fallback='Easy' ) +STRAFENDATEI = os.path.expandvars( os.path.normpath( + _PlatzCfg.get( 'Config', 'Strafendatei', + fallback=os.path.join( CFGDIR, 'strafen.cfg' ) ) ) ) +if not os.path.isfile( ZYKLUSDATEI ): + ZYKLUSDATEI = os.path.join( CFGDIR, 'zyklus.cfg' ) +if not os.path.isfile( STRAFENDATEI ): + STRAFENDATEI = os.path.join( CFGDIR, 'strafen.cfg' ) + +GAZyklus = Zyklus() +GAZyklus.laden( ZYKLUSDATEI, ZYKLUSART ) +Strafen = Strafliste() +Strafen.laden( STRAFENDATEI ) + +# ---------------------------------------------------------------- Sessions +SESSION_TTL_SEKUNDEN = 24 * 3600 +Sessions = {} +SessionsLock = threading.Lock() + + +def _SessionsAufraeumen(): + """Sessions loeschen, deren TTL abgelaufen ist (Datenschutz per Design)""" + Jetzt = time.time() + with SessionsLock: + Abgelaufen = [ Sid for Sid, S in Sessions.items() + if Jetzt - S['erzeugt'] > SESSION_TTL_SEKUNDEN ] + for Sid in Abgelaufen: + del Sessions[Sid] + + +def _GibSession(SitzungsId): + _SessionsAufraeumen() + with SessionsLock: + S = Sessions.get( SitzungsId ) + if S is None: + raise HTTPException( status_code=404, + detail='Sitzung nicht gefunden oder abgelaufen (TTL 24h)' ) + return S + + +# ------------------------------------------------------------ API-Modelle +class TischEingabe(BaseModel): + """ein Tisch aus dem Frontend (Ersatz fuer eine tische.ini-Section)""" + id: int | None = Field( default=None, description='Tisch-Id; leer = fortlaufend' ) + nummer: int | None = Field( default=None, description='Anzeigenummer; leer = wie Id' ) + hof: int = Field( default=1, description='Hof/Raum-Nummer' ) + plaetze: int = Field( gt=0, le=100, description='Anzahl Sitzplaetze' ) + x: float = Field( description='X-Koordinate im Raster' ) + y: float = Field( description='Y-Koordinate im Raster' ) + nachbarn: list[int] | None = Field( default=None, + description='explizite Nachbar-Tisch-Ids; leer = aus Naehe ableiten' ) + + +class TischLayout(BaseModel): + tische: list[TischEingabe] = Field( min_length=1 ) + nachbarRadius: float = Field( default=1.5, gt=0, + description='max. Rasterabstand, bis zu dem zwei Tische als ' + 'Nachbarn gelten (nur fuer Tische ohne explizite Liste)' ) + + +# --------------------------------------------------------------- Hilfen +def _NachbarnAbleiten(TischListe, Radius): + """Nachbarliste aus raeumlicher Naehe der Koordinaten ableiten + (Roadmap M1: Ersatz fuer manuelle Nachbarliste-Pflege). + Explizit angegebene Nachbarn bleiben erhalten und werden + beidseitig ergaenzt.""" + Nachbarn = { T.id: set( T.nachbarn or [] ) for T in TischListe } + for T1 in TischListe: + for T2 in TischListe: + if T1.id == T2.id: + continue + if T1.nachbarn is None or T2.nachbarn is None: + Abstand = math.dist( (T1.x, T1.y), (T2.x, T2.y) ) + if Abstand <= Radius: + Nachbarn[T1.id].add( T2.id ) + Nachbarn[T2.id].add( T1.id ) + # expliziten Angaben beidseitig machen + for Tid, Menge in Nachbarn.items(): + for NachbarId in Menge: + if NachbarId in Nachbarn: + Nachbarn[NachbarId].add( Tid ) + return { Tid: sorted(Menge) for Tid, Menge in Nachbarn.items() } + + +def _TischeBauen(S): + """baut aus dem gespeicherten Layout frische Tisch-Objekte + (pro Berechnung neu, damit keine Reste vorheriger Laeufe kleben)""" + TE = Tische( [] ) + for T in S['tische']: + TE.Tisch_dazu( Tisch( + T['id'], + Plaetze=T['plaetze'], + Koordinaten=( T['x'], T['y'] ), + Nachbarliste=T['nachbarn'], + Hof=T['hof'], + Nummer=T['nummer'] ) ) + return TE + + +def _ErgebnisJSON(S): + """baut die JSON-Darstellung des besten Ergebnisses einer Session""" + SV = S['ergebnis'] + GruppenNamen = S.get( 'gruppenNamen', {} ) + + def GruppeVonPerson(P): + try: + G = SV.Gruppen.GruppeVonPid( P.Id ) + return GruppenNamen.get( G.Id, 'Gruppe %s' % G.Id ) + except KeyError: + return 'VIP' + + TischListe = [] + for T in SV.Tische: + Personen = [ { + 'titel': P._Titel, + 'vorname': P._Vorname, + 'nachname': P._Name, + 'gruppe': GruppeVonPerson( P ), + } for P in T ] + Personen.sort( key=lambda p: (p['gruppe'], p['nachname'], p['vorname']) ) + TischListe.append( { + 'id': T.Id, + 'nummer': T.Nummer, + 'hof': T.Hof, + 'plaetze': T.Plaetze, + 'besetzt': T.besetztePlaetze(), + 'frei': T.freiePlaetze(), + 'wert': SV.TischWertGet( T ), + 'personen': Personen, + } ) + TischListe.sort( key=lambda t: t['id'] ) + + GruppenListe = [] + for G in SV.Gruppen: + GruppenListe.append( { + 'id': G.Id, + 'name': GruppenNamen.get( G.Id, 'Gruppe %s' % G.Id ), + 'anzahl': G.Anzahl(), + 'teilungen': SV.GruppenTeilungGet( G ), + 'wert': SV.GruppenWertGet( G ), + } ) + GruppenListe.sort( key=lambda g: g['id'] ) + + return { + 'wertigkeit': SV.value, + 'variante': S['varianten'], + 'tische': TischListe, + 'gruppen': GruppenListe, + } + + +# --------------------------------------------------------------- Endpunkte +@app.post( '/sitzung', status_code=201 ) +def SitzungAnlegen(): + """legt eine neue Arbeits-Session an (TTL 24h, nur im Speicher)""" + _SessionsAufraeumen() + SitzungsId = uuid.uuid4().hex + with SessionsLock: + Sessions[SitzungsId] = { + 'erzeugt': time.time(), + 'tische': None, + 'personen': None, + 'ergebnis': None, + 'varianten': 0, + } + return { 'id': SitzungsId, 'ttlStunden': SESSION_TTL_SEKUNDEN // 3600 } + + +@app.get( '/sitzung/{SitzungsId}' ) +def SitzungStatus(SitzungsId: str): + """Status: was ist schon da, was fehlt noch""" + S = _GibSession( SitzungsId ) + return { + 'id': SitzungsId, + 'tische': len( S['tische'] ) if S['tische'] else 0, + 'personen': S['personen']['nLeute'] if S['personen'] else 0, + 'vips': S['personen']['nVips'] if S['personen'] else 0, + 'berechnet': S['ergebnis'] is not None, + 'varianten': S['varianten'], + } + + +@app.post( '/sitzung/{SitzungsId}/tische' ) +def TischeSetzen(SitzungsId: str, Layout: TischLayout): + """Tisch-Layout uebernehmen (JSON-Ersatz fuer tische.ini); + Nachbarschaft wird aus raeumlicher Naehe abgeleitet""" + S = _GibSession( SitzungsId ) + + # Ids vergeben/pruefen + NaechsteId = 1 + Vergeben = set() + for T in Layout.tische: + if T.id is None: + while NaechsteId in Vergeben: + NaechsteId = NaechsteId + 1 + T.id = NaechsteId + if T.id in Vergeben: + raise HTTPException( status_code=400, + detail='Tisch-Id %d ist doppelt' % T.id ) + Vergeben.add( T.id ) + + Nachbarn = _NachbarnAbleiten( Layout.tische, Layout.nachbarRadius ) + + S['tische'] = [ { + 'id': T.id, + 'nummer': T.nummer if T.nummer is not None else T.id, + 'hof': T.hof, + 'plaetze': T.plaetze, + 'x': T.x, + 'y': T.y, + 'nachbarn': Nachbarn[T.id], + } for T in Layout.tische ] + S['ergebnis'] = None + S['varianten'] = 0 + + return { + 'tische': S['tische'], + 'plaetzeGesamt': sum( T['plaetze'] for T in S['tische'] ), + } + + +@app.post( '/sitzung/{SitzungsId}/tische-datei' ) +def TischDateiHochladen(SitzungsId: str, datei: UploadFile = File(...)): + """bestehende tische.ini hochladen (gleiches Format wie fuer die CLI, + z.B. work/hochzeit/tische.ini); die Nachbarliste aus der Datei + wird unveraendert uebernommen, nichts wird neu abgeleitet""" + S = _GibSession( SitzungsId ) + Rohdaten = datei.file.read() + try: + Text = Rohdaten.decode( 'utf-8-sig' ) + except UnicodeDecodeError: + Text = Rohdaten.decode( 'cp1252' ) + + config = configparser.ConfigParser() + try: + config.read_string( Text ) + except configparser.Error as Fehler: + raise HTTPException( status_code=400, + detail='tische.ini nicht lesbar: %s' % Fehler ) + if not config.sections(): + raise HTTPException( status_code=400, + detail='tische.ini enthaelt keine Tisch-Sektionen ([1], [2], ...)' ) + + # gleiche Feldsemantik wie Tische.laden() in Strukturdaten.py, + # aber mit ast.literal_eval statt eval (Upload = fremde Eingabe) + TischListe = [] + for Sektion in config.sections(): + try: + Tid = int( Sektion ) + Plaetze = int( ast.literal_eval( config.get( Sektion, 'Plaetze' ) ) ) + Koords = ast.literal_eval( config.get( Sektion, 'Koordinaten' ) ) + Nachbarn = list( ast.literal_eval( + config.get( Sektion, 'Nachbarliste' ) ) ) + Nummer = int( ast.literal_eval( + config.get( Sektion, 'Nummer', fallback=Sektion ) ) ) + Hof = int( ast.literal_eval( + config.get( Sektion, 'Hof', fallback='1' ) ) ) + except (ValueError, SyntaxError, configparser.Error) as Fehler: + raise HTTPException( status_code=400, + detail='tische.ini, Sektion [%s]: %s' % (Sektion, Fehler) ) + if Plaetze < 1: + raise HTTPException( status_code=400, + detail='tische.ini, Sektion [%s]: Plaetze muss >= 1 sein' + % Sektion ) + TischListe.append( { + 'id': Tid, + 'nummer': Nummer, + 'hof': Hof, + 'plaetze': Plaetze, + 'x': float( Koords[0] ), + 'y': float( Koords[1] ), + 'nachbarn': sorted( int(N) for N in Nachbarn ), + } ) + + Ids = [ T['id'] for T in TischListe ] + if len( Ids ) != len( set( Ids ) ): + raise HTTPException( status_code=400, + detail='tische.ini enthaelt doppelte Tisch-Ids' ) + + S['tische'] = TischListe + S['ergebnis'] = None + S['varianten'] = 0 + return { + 'tische': S['tische'], + 'plaetzeGesamt': sum( T['plaetze'] for T in S['tische'] ), + } + + +@app.post( '/sitzung/{SitzungsId}/personen' ) +def PersonenHochladen(SitzungsId: str, datei: UploadFile = File(...)): + """Gaesteliste als CSV hochladen (Ersatz fuer bestellung.xml); + Format siehe libs/CSVConfig.py""" + S = _GibSession( SitzungsId ) + Rohdaten = datei.file.read() + try: + Text = Rohdaten.decode( 'utf-8-sig' ) + except UnicodeDecodeError: + Text = Rohdaten.decode( 'cp1252' ) # Excel/Windows-Fallback + + try: + [ PN, GN, VIPGruppe, VipHash, GruppenNamen ] = \ + CSVConfig().HandleGaesteliste( Text ) + except ValueError as Fehler: + raise HTTPException( status_code=400, detail=str(Fehler) ) + + S['personen'] = { + 'PN': PN, + 'GN': GN, + 'VIPGruppe': VIPGruppe, + 'VipHash': VipHash, + 'nLeute': GN.NLeute, + 'nVips': VIPGruppe.Anzahl(), + } + S['gruppenNamen'] = GruppenNamen + S['ergebnis'] = None + S['varianten'] = 0 + + return { + 'personen': GN.NLeute, + 'vips': VIPGruppe.Anzahl(), + 'gruppen': [ { + 'id': G.Id, + 'name': GruppenNamen.get( G.Id, 'Gruppe %s' % G.Id ), + 'anzahl': G.Anzahl(), + } for G in GN ], + } + + +@app.post( '/sitzung/{SitzungsId}/berechnen' ) +def Berechnen(SitzungsId: str): + """startet die GA-Optimierung; jeder Aufruf erzeugt eine neue Variante""" + S = _GibSession( SitzungsId ) + if S['tische'] is None: + raise HTTPException( status_code=400, + detail='Erst das Tisch-Layout setzen (POST .../tische)' ) + if S['personen'] is None: + raise HTTPException( status_code=400, + detail='Erst die Gaesteliste hochladen (POST .../personen)' ) + + TE = _TischeBauen( S ) + P = S['personen'] + + # Vorab-Pruefungen mit klaren Fehlermeldungen (der Kern wirft sonst + # nur IndexError/AttributeError tief aus der Platzierung heraus) + GesamtLeute = P['nLeute'] + P['nVips'] + if GesamtLeute > TE.NStuehle: + raise HTTPException( status_code=400, + detail='Zu wenig Stuehle: %d Personen, aber nur %d Plaetze' + % (GesamtLeute, TE.NStuehle) ) + VIPsProTisch = {} + for Pid, Tid in P['VipHash'].items(): + VIPsProTisch[Tid] = VIPsProTisch.get( Tid, 0 ) + 1 + for Tid, AnzahlVIPs in VIPsProTisch.items(): + T = TE.vonId( Tid ) + if T is None: + raise HTTPException( status_code=400, + detail='VIP-Tisch %d existiert nicht im Layout' % Tid ) + if AnzahlVIPs > T.Plaetze: + raise HTTPException( status_code=400, + detail='Tisch %d hat %d Plaetze, aber %d VIPs sind ' + 'dort fest gesetzt' % (Tid, T.Plaetze, AnzahlVIPs) ) + + try: + GAFarm = Farm( GAZyklus, Sitzplatzverteilung, + Tische=TE, Gruppen=P['GN'], Strafen=Strafen, + VIPListe=P['VipHash'], VIPs=P['VIPGruppe'] ) + except IndexError as Fehler: + raise HTTPException( status_code=400, detail=str(Fehler) ) + + S['ergebnis'] = GAFarm.Bester() + S['varianten'] = S['varianten'] + 1 + return _ErgebnisJSON( S ) + + +@app.get( '/sitzung/{SitzungsId}/ergebnis' ) +def Ergebnis(SitzungsId: str): + """das beste bisher berechnete Ergebnis als JSON""" + S = _GibSession( SitzungsId ) + if S['ergebnis'] is None: + raise HTTPException( status_code=404, + detail='Noch nichts berechnet (POST .../berechnen)' ) + return _ErgebnisJSON( S ) + + +@app.get( '/sitzung/{SitzungsId}/ergebnis.svg' ) +def ErgebnisSVG(SitzungsId: str): + """das beste bisher berechnete Ergebnis als SVG (alsSVG aus dem Kern)""" + S = _GibSession( SitzungsId ) + if S['ergebnis'] is None: + raise HTTPException( status_code=404, + detail='Noch nichts berechnet (POST .../berechnen)' ) + + # alsSVG schreibt in eine Datei -> Tempdatei schreiben, lesen, loeschen + Handle, TempPfad = tempfile.mkstemp( suffix='.svg' ) + os.close( Handle ) + try: + S['ergebnis'].alsSVG( TempPfad ) + fsock = open( TempPfad, 'r' ) + SVG = fsock.read() + fsock.close() + finally: + os.remove( TempPfad ) + return Response( content=SVG, media_type='image/svg+xml' ) + + +# statisches Test-Frontend unter / (muss nach den API-Routen gemountet sein) +app.mount( '/', StaticFiles( + directory=os.path.join( os.path.dirname( os.path.abspath( __file__ ) ), + 'static' ), + html=True ), name='static' ) diff --git a/web/static/index.html b/web/static/index.html new file mode 100644 index 0000000..fde8556 --- /dev/null +++ b/web/static/index.html @@ -0,0 +1,329 @@ + + + + + +Sitz & Platz — Testoberfläche (M1) + + + +
+

Sitz & Platz — Testoberfläche (Meilenstein 1)

+

Session-basiert, nichts wird dauerhaft gespeichert (TTL 24 h). Sitzung: wird angelegt…

+
+
+ +
+

1. Tische definieren

+

Koordinaten sind Rasterpositionen (wie in tische.ini). Tische, die + näher als der Nachbar-Radius (1,5 Rastereinheiten) beieinander liegen, gelten + automatisch als Nachbarn — Gruppen, die geteilt werden müssen, kommen bevorzugt + an Nachbartische.

+ + + + + +
Tisch-Nr.PlätzeXY
+ + + +
+ + + +
+ +
+
+ +
+

2. Gästeliste (CSV)

+

Spalten: Vorname;Nachname;Titel;Gruppe;Tisch;Anzahl — + Gruppe hält Personen zusammen (leer = Einzelgast), + Tisch setzt VIPs fest (z. B. Brautpaar an Tisch 1), + Anzahl expandiert eine Zeile in mehrere Buchungen + (anonyme Sammelbuchung). Datei hochladen oder direkt hier bearbeiten:

+ +
+ +
+ +
+
+
+ +
+

3. Sitzordnung berechnen

+

Jeder Klick startet den genetischen Algorithmus neu und liefert + eine neue Variante — die Wertigkeit (0 = perfekt, negativer = schlechter) + macht Varianten vergleichbar.

+ +
+
+
+ +
+ +
+ + + diff --git a/work/hochzeit/PersonenTische.csv b/work/hochzeit/PersonenTische.csv new file mode 100644 index 0000000..4b078bb --- /dev/null +++ b/work/hochzeit/PersonenTische.csv @@ -0,0 +1,120 @@ +Aksoy, Rainer, = Hof 1, Tisch 13, Nummer 7 +Aksoy, Renate, = Hof 1, Tisch 13, Nummer 2 +Aydin, Horst, = Hof 1, Tisch 14, Nummer 6 +Aydin, Ursula, = Hof 1, Tisch 14, Nummer 8 +Barth, Hannelore, = Hof 1, Tisch 9, Nummer 7 +Berger, Sergej, = Hof 1, Tisch 2, Nummer 5 +Brandt, Andreas, = Hof 1, Tisch 15, Nummer 2 +Brandt, Anja, = Hof 1, Tisch 15, Nummer 3 +Brandt, Anton, = Hof 1, Tisch 16, Nummer 14 +Brandt, Ben, = Hof 1, Tisch 17, Nummer 5 +Brandt, Daniel, = Hof 1, Tisch 11, Nummer 7 +Brandt, Felix, = Hof 1, Tisch 16, Nummer 13 +Brandt, Frieda, = Hof 1, Tisch 16, Nummer 8 +Brandt, Greta, = Hof 1, Tisch 16, Nummer 3 +Brandt, Helga, = Hof 1, Tisch 1, Nummer 2 +Brandt, Julia, = Hof 1, Tisch 1, Nummer 9 +Brandt, Kathrin, = Hof 1, Tisch 11, Nummer 4 +Brandt, Lena, = Hof 1, Tisch 15, Nummer 6 +Brandt, Milan, = Hof 1, Tisch 15, Nummer 5 +Brandt, Paul, = Hof 1, Tisch 17, Nummer 6 +Brandt, Sofia, = Hof 1, Tisch 15, Nummer 8 +Brandt, Theo, = Hof 1, Tisch 15, Nummer 4 +Brandt, Werner, = Hof 1, Tisch 1, Nummer 6 +Busch, Stefanie, = Hof 1, Tisch 2, Nummer 3 +Demir, Elif, = Hof 1, Tisch 10, Nummer 2 +Demir, Hannelore, = Hof 1, Tisch 14, Nummer 5 +Demir, Ingrid, = Hof 1, Tisch 14, Nummer 2 +Demir, Monika, = Hof 1, Tisch 14, Nummer 3 +Dietrich, Jennifer, = Hof 1, Tisch 2, Nummer 6 +Dietrich, Nicole, = Hof 1, Tisch 12, Nummer 2 +Erdem, Erika, = Hof 1, Tisch 15, Nummer 9 +Erdem, Gerhard, = Hof 1, Tisch 9, Nummer 2 +Erdem, Rainer, = Hof 1, Tisch 9, Nummer 3 +Esposito, Christian, = Hof 1, Tisch 12, Nummer 8 +Esposito, Gisela, = Hof 1, Tisch 9, Nummer 6 +Esposito, Julia, = Hof 1, Tisch 8, Nummer 4 +Fischer, Heinz, = Hof 1, Tisch 14, Nummer 4 +Fischer, Helga, = Hof 1, Tisch 14, Nummer 7 +Fischer, Nicole, = Hof 1, Tisch 12, Nummer 4 +Fischer, Sven, = Hof 1, Tisch 10, Nummer 3 +Frank, Erika, = Hof 1, Tisch 9, Nummer 8 +Frank, Nadine, = Hof 1, Tisch 11, Nummer 9 +Frank, Timo, = Hof 1, Tisch 10, Nummer 4 +Frank, Tobias, = Hof 1, Tisch 1, Nummer 11 +Franke, Brigitte, = Hof 1, Tisch 9, Nummer 9 +Hansen, Olga, = Hof 1, Tisch 11, Nummer 5 +Hansen, Wolfgang, = Hof 1, Tisch 9, Nummer 5 +Hoffmann, Lena, = Hof 1, Tisch 12, Nummer 7 +Horn, Daniel, = Hof 1, Tisch 11, Nummer 3 +Horn, Svenja, = Hof 1, Tisch 2, Nummer 2 +Klein, Stefan, = Hof 1, Tisch 10, Nummer 5 +Koch, Andreas, = Hof 1, Tisch 2, Nummer 7 +Koch, Giovanna, = Hof 1, Tisch 8, Nummer 2 +Kovac, Giovanna, = Hof 1, Tisch 8, Nummer 8 +Kraus, Dennis, = Hof 1, Tisch 4, Nummer 4 +Kraus, Matteo, = Hof 1, Tisch 16, Nummer 4 +Kraus, Melanie, = Hof 1, Tisch 4, Nummer 2 +Kuhn, Leni, = Hof 1, Tisch 16, Nummer 11 +Kuhn, Sarah, = Hof 1, Tisch 1, Nummer 10 +Kuhn, Stefan, = Hof 1, Tisch 2, Nummer 9 +Kuhn, Timo, = Hof 1, Tisch 1, Nummer 7 +Lange, Milan, = Hof 1, Tisch 11, Nummer 8 +Meyer, Anton, = Hof 1, Tisch 17, Nummer 7 +Meyer, Christian, = Hof 1, Tisch 2, Nummer 4 +Meyer, Ida, = Hof 1, Tisch 17, Nummer 4 +Meyer, Marco, = Hof 1, Tisch 12, Nummer 9 +Meyer, Mila, = Hof 1, Tisch 16, Nummer 10 +Meyer, Sandra, = Hof 1, Tisch 12, Nummer 6 +Meyer, Wolfgang, = Hof 1, Tisch 9, Nummer 4 +Musikverein, Gast, = Hof 1, Tisch 4, Nummer 3 +Musikverein, Gast, = Hof 1, Tisch 4, Nummer 5 +Musikverein, Gast, = Hof 1, Tisch 4, Nummer 6 +Musikverein, Gast, = Hof 1, Tisch 4, Nummer 7 +Musikverein, Gast, = Hof 1, Tisch 4, Nummer 8 +Musikverein, Gast, = Hof 1, Tisch 4, Nummer 9 +Musikverein, Gast, = Hof 1, Tisch 5, Nummer 2 +Musikverein, Gast, = Hof 1, Tisch 5, Nummer 3 +Musikverein, Gast, = Hof 1, Tisch 5, Nummer 4 +Musikverein, Gast, = Hof 1, Tisch 5, Nummer 5 +Musikverein, Gast, = Hof 1, Tisch 5, Nummer 6 +Musikverein, Gast, = Hof 1, Tisch 5, Nummer 7 +Musikverein, Gast, = Hof 1, Tisch 5, Nummer 8 +Peters, Melanie, = Hof 1, Tisch 8, Nummer 7 +Peters, Yusuf, = Hof 1, Tisch 8, Nummer 9 +Polat, Matthias, = Hof 1, Tisch 12, Nummer 3 +Roth, Stefanie, = Hof 1, Tisch 2, Nummer 8 +Schmidt, Dennis, = Hof 1, Tisch 8, Nummer 3 +Schmitt, Markus, = Hof 1, Tisch 11, Nummer 6 +Schwarz, Elias, = Hof 1, Tisch 16, Nummer 12 +Schwarz, Guenter, = Hof 1, Tisch 13, Nummer 5 +Schwarz, Liam, = Hof 1, Tisch 16, Nummer 6 +Schwarz, Sarah, = Hof 1, Tisch 13, Nummer 9 +Schwarz, Yusuf, = Hof 1, Tisch 13, Nummer 8 +Simon, Jennifer, = Hof 1, Tisch 10, Nummer 6 +Simon, Patrick, = Hof 1, Tisch 8, Nummer 6 +Simon, Stefanie, = Hof 1, Tisch 10, Nummer 9 +Sommer, Daniel, = Hof 1, Tisch 1, Nummer 12 +Sommer, Dennis, = Hof 1, Tisch 13, Nummer 3 +Sommer, Dennis, = Hof 1, Tisch 3, Nummer 4 +Sommer, Dieter, = Hof 1, Tisch 1, Nummer 4 +Sommer, Emil, = Hof 1, Tisch 16, Nummer 2 +Sommer, Ida, = Hof 1, Tisch 16, Nummer 9 +Sommer, Jennifer, = Hof 1, Tisch 13, Nummer 6 +Sommer, Lina, = Hof 1, Tisch 3, Nummer 2 +Sommer, Max, = Hof 1, Tisch 16, Nummer 7 +Sommer, Nicole, = Hof 1, Tisch 3, Nummer 3 +Sommer, Renate, = Hof 1, Tisch 1, Nummer 3 +Sommer, Theo, = Hof 1, Tisch 16, Nummer 5 +Stein, Andreas, = Hof 1, Tisch 10, Nummer 8 +Stein, Werner, = Hof 1, Tisch 13, Nummer 4 +Tran, Heinz, = Hof 1, Tisch 15, Nummer 7 +Vogel, Anton, = Hof 1, Tisch 17, Nummer 3 +Vogel, Max, = Hof 1, Tisch 17, Nummer 2 +Vogel, Sandra, = Hof 1, Tisch 1, Nummer 8 +Vogel, Svenja, = Hof 1, Tisch 8, Nummer 5 +Vogel, Yusuf, = Hof 1, Tisch 1, Nummer 5 +Wagner, Daniel, = Hof 1, Tisch 10, Nummer 7 +Wagner, Timo, = Hof 1, Tisch 12, Nummer 5 +Winkler, Sarah, = Hof 1, Tisch 1, Nummer 13 +Yilmaz, Olga, = Hof 1, Tisch 11, Nummer 2 diff --git a/work/hochzeit/Sitzplatzverteilung.svg b/work/hochzeit/Sitzplatzverteilung.svg new file mode 100644 index 0000000..6c6c961 --- /dev/null +++ b/work/hochzeit/Sitzplatzverteilung.svg @@ -0,0 +1,158 @@ + + + + +Tisch 6 + +Tisch 7 + +Tisch 3 + + + + +Tisch 17 + + + + + + + +Tisch 5 + + + + + + + + +Tisch 14 + + + + + + + + +Tisch 2 + + + + + + + + + +Tisch 4 + + + + + + + + + +Tisch 8 + + + + + + + + + +Tisch 9 + + + + + + + + + +Tisch 10 + + + + + + + + + +Tisch 11 + + + + + + + + + +Tisch 12 + + + + + + + + + +Tisch 13 + + + + + + + + + +Tisch 15 + + + + + + + + + +Tisch 1 + + + + + + + + + + + + + +Tisch 16 + + + + + + + + + + + + + + diff --git a/work/hochzeit/TischePersonen.txt b/work/hochzeit/TischePersonen.txt new file mode 100644 index 0000000..bf253d1 --- /dev/null +++ b/work/hochzeit/TischePersonen.txt @@ -0,0 +1,154 @@ +[1] + Helga Brandt = Hof 1, Tisch 1, Nummer 1 + Renate Sommer = Hof 1, Tisch 1, Nummer 2 + Dieter Sommer = Hof 1, Tisch 1, Nummer 3 + Yusuf Vogel = Hof 1, Tisch 1, Nummer 4 + Werner Brandt = Hof 1, Tisch 1, Nummer 5 + Timo Kuhn = Hof 1, Tisch 1, Nummer 6 + Sandra Vogel = Hof 1, Tisch 1, Nummer 7 + Julia Brandt = Hof 1, Tisch 1, Nummer 8 + Sarah Kuhn = Hof 1, Tisch 1, Nummer 9 + Tobias Frank = Hof 1, Tisch 1, Nummer 10 + Daniel Sommer = Hof 1, Tisch 1, Nummer 11 + Sarah Winkler = Hof 1, Tisch 1, Nummer 12 + +[2] + Svenja Horn = Hof 1, Tisch 2, Nummer 1 + Stefanie Busch = Hof 1, Tisch 2, Nummer 2 + Christian Meyer = Hof 1, Tisch 2, Nummer 3 + Sergej Berger = Hof 1, Tisch 2, Nummer 4 + Jennifer Dietrich = Hof 1, Tisch 2, Nummer 5 + Andreas Koch = Hof 1, Tisch 2, Nummer 6 + Stefanie Roth = Hof 1, Tisch 2, Nummer 7 + Stefan Kuhn = Hof 1, Tisch 2, Nummer 8 + +[3] + Lina Sommer = Hof 1, Tisch 3, Nummer 1 + Nicole Sommer = Hof 1, Tisch 3, Nummer 2 + Dennis Sommer = Hof 1, Tisch 3, Nummer 3 + +[4] + Melanie Kraus = Hof 1, Tisch 4, Nummer 1 + Gast Musikverein = Hof 1, Tisch 4, Nummer 2 + Dennis Kraus = Hof 1, Tisch 4, Nummer 3 + Gast Musikverein = Hof 1, Tisch 4, Nummer 4 + Gast Musikverein = Hof 1, Tisch 4, Nummer 5 + Gast Musikverein = Hof 1, Tisch 4, Nummer 6 + Gast Musikverein = Hof 1, Tisch 4, Nummer 7 + Gast Musikverein = Hof 1, Tisch 4, Nummer 8 + +[5] + Gast Musikverein = Hof 1, Tisch 5, Nummer 1 + Gast Musikverein = Hof 1, Tisch 5, Nummer 2 + Gast Musikverein = Hof 1, Tisch 5, Nummer 3 + Gast Musikverein = Hof 1, Tisch 5, Nummer 4 + Gast Musikverein = Hof 1, Tisch 5, Nummer 5 + Gast Musikverein = Hof 1, Tisch 5, Nummer 6 + Gast Musikverein = Hof 1, Tisch 5, Nummer 7 + +[6] + +[7] + +[8] + Giovanna Koch = Hof 1, Tisch 8, Nummer 1 + Dennis Schmidt = Hof 1, Tisch 8, Nummer 2 + Julia Esposito = Hof 1, Tisch 8, Nummer 3 + Svenja Vogel = Hof 1, Tisch 8, Nummer 4 + Patrick Simon = Hof 1, Tisch 8, Nummer 5 + Melanie Peters = Hof 1, Tisch 8, Nummer 6 + Giovanna Kovac = Hof 1, Tisch 8, Nummer 7 + Yusuf Peters = Hof 1, Tisch 8, Nummer 8 + +[9] + Gerhard Erdem = Hof 1, Tisch 9, Nummer 1 + Rainer Erdem = Hof 1, Tisch 9, Nummer 2 + Wolfgang Meyer = Hof 1, Tisch 9, Nummer 3 + Wolfgang Hansen = Hof 1, Tisch 9, Nummer 4 + Gisela Esposito = Hof 1, Tisch 9, Nummer 5 + Hannelore Barth = Hof 1, Tisch 9, Nummer 6 + Erika Frank = Hof 1, Tisch 9, Nummer 7 + Brigitte Franke = Hof 1, Tisch 9, Nummer 8 + +[10] + Elif Demir = Hof 1, Tisch 10, Nummer 1 + Sven Fischer = Hof 1, Tisch 10, Nummer 2 + Timo Frank = Hof 1, Tisch 10, Nummer 3 + Stefan Klein = Hof 1, Tisch 10, Nummer 4 + Jennifer Simon = Hof 1, Tisch 10, Nummer 5 + Daniel Wagner = Hof 1, Tisch 10, Nummer 6 + Andreas Stein = Hof 1, Tisch 10, Nummer 7 + Stefanie Simon = Hof 1, Tisch 10, Nummer 8 + +[11] + Olga Yilmaz = Hof 1, Tisch 11, Nummer 1 + Daniel Horn = Hof 1, Tisch 11, Nummer 2 + Kathrin Brandt = Hof 1, Tisch 11, Nummer 3 + Olga Hansen = Hof 1, Tisch 11, Nummer 4 + Markus Schmitt = Hof 1, Tisch 11, Nummer 5 + Daniel Brandt = Hof 1, Tisch 11, Nummer 6 + Milan Lange = Hof 1, Tisch 11, Nummer 7 + Nadine Frank = Hof 1, Tisch 11, Nummer 8 + +[12] + Nicole Dietrich = Hof 1, Tisch 12, Nummer 1 + Matthias Polat = Hof 1, Tisch 12, Nummer 2 + Nicole Fischer = Hof 1, Tisch 12, Nummer 3 + Timo Wagner = Hof 1, Tisch 12, Nummer 4 + Sandra Meyer = Hof 1, Tisch 12, Nummer 5 + Lena Hoffmann = Hof 1, Tisch 12, Nummer 6 + Christian Esposito = Hof 1, Tisch 12, Nummer 7 + Marco Meyer = Hof 1, Tisch 12, Nummer 8 + +[13] + Renate Aksoy = Hof 1, Tisch 13, Nummer 1 + Dennis Sommer = Hof 1, Tisch 13, Nummer 2 + Werner Stein = Hof 1, Tisch 13, Nummer 3 + Guenter Schwarz = Hof 1, Tisch 13, Nummer 4 + Jennifer Sommer = Hof 1, Tisch 13, Nummer 5 + Rainer Aksoy = Hof 1, Tisch 13, Nummer 6 + Yusuf Schwarz = Hof 1, Tisch 13, Nummer 7 + Sarah Schwarz = Hof 1, Tisch 13, Nummer 8 + +[14] + Ingrid Demir = Hof 1, Tisch 14, Nummer 1 + Monika Demir = Hof 1, Tisch 14, Nummer 2 + Heinz Fischer = Hof 1, Tisch 14, Nummer 3 + Hannelore Demir = Hof 1, Tisch 14, Nummer 4 + Horst Aydin = Hof 1, Tisch 14, Nummer 5 + Helga Fischer = Hof 1, Tisch 14, Nummer 6 + Ursula Aydin = Hof 1, Tisch 14, Nummer 7 + +[15] + Andreas Brandt = Hof 1, Tisch 15, Nummer 1 + Anja Brandt = Hof 1, Tisch 15, Nummer 2 + Theo Brandt = Hof 1, Tisch 15, Nummer 3 + Milan Brandt = Hof 1, Tisch 15, Nummer 4 + Lena Brandt = Hof 1, Tisch 15, Nummer 5 + Heinz Tran = Hof 1, Tisch 15, Nummer 6 + Sofia Brandt = Hof 1, Tisch 15, Nummer 7 + Erika Erdem = Hof 1, Tisch 15, Nummer 8 + +[16] + Emil Sommer = Hof 1, Tisch 16, Nummer 1 + Greta Brandt = Hof 1, Tisch 16, Nummer 2 + Matteo Kraus = Hof 1, Tisch 16, Nummer 3 + Theo Sommer = Hof 1, Tisch 16, Nummer 4 + Liam Schwarz = Hof 1, Tisch 16, Nummer 5 + Max Sommer = Hof 1, Tisch 16, Nummer 6 + Frieda Brandt = Hof 1, Tisch 16, Nummer 7 + Ida Sommer = Hof 1, Tisch 16, Nummer 8 + Mila Meyer = Hof 1, Tisch 16, Nummer 9 + Leni Kuhn = Hof 1, Tisch 16, Nummer 10 + Elias Schwarz = Hof 1, Tisch 16, Nummer 11 + Felix Brandt = Hof 1, Tisch 16, Nummer 12 + Anton Brandt = Hof 1, Tisch 16, Nummer 13 + +[17] + Max Vogel = Hof 1, Tisch 17, Nummer 1 + Anton Vogel = Hof 1, Tisch 17, Nummer 2 + Ida Meyer = Hof 1, Tisch 17, Nummer 3 + Ben Brandt = Hof 1, Tisch 17, Nummer 4 + Paul Brandt = Hof 1, Tisch 17, Nummer 5 + Anton Meyer = Hof 1, Tisch 17, Nummer 6 + diff --git a/work/hochzeit/bestellung.xml b/work/hochzeit/bestellung.xml new file mode 100644 index 0000000..79cd907 --- /dev/null +++ b/work/hochzeit/bestellung.xml @@ -0,0 +1,549 @@ + + + + + + + + Julia + Brandt + + + Daniel + Sommer + + + Werner + Brandt + + + Helga + Brandt + + + Dieter + Sommer + + + Renate + Sommer + + + Sarah + Winkler + + + Tobias + Frank + + 1 + + + + + + Yusuf + Peters + + + Melanie + Peters + + + + + + + Daniel + Brandt + + + Kathrin + Brandt + + + + + + + Dennis + Kraus + + + Melanie + Kraus + + + + + + + Andreas + Brandt + + + Lena + Brandt + + + Theo + Brandt + + + + + + + Marco + Meyer + + + Sandra + Meyer + + + + + + + Milan + Brandt + + + Anja + Brandt + + + Sofia + Brandt + + + + + + + Yusuf + Vogel + + + Sandra + Vogel + + + + + + + Dennis + Sommer + + + Nicole + Sommer + + + Lina + Sommer + + + + + + + Timo + Kuhn + + + Sarah + Kuhn + + + + + + + Dennis + Sommer + + + Jennifer + Sommer + + + + + + + Yusuf + Schwarz + + + Sarah + Schwarz + + + + + + + Horst + Aydin + + + Ursula + Aydin + + + + + + + Ingrid + Demir + + + Monika + Demir + + + Hannelore + Demir + + + + + + + Heinz + Fischer + + + Helga + Fischer + + + + + + + Heinz + Tran + + + Erika + Erdem + + + + + + + Nicole + Fischer + + + Matthias + Polat + + + Christian + Esposito + + + Lena + Hoffmann + + + Timo + Wagner + + + Nicole + Dietrich + + + + + + + Wolfgang + Hansen + + + Hannelore + Barth + + + Erika + Frank + + + Gerhard + Erdem + + + Rainer + Erdem + + + Gisela + Esposito + + + Brigitte + Franke + + + Wolfgang + Meyer + + + + + + + Elif + Demir + + + Jennifer + Simon + + + Andreas + Stein + + + Stefan + Klein + + + Timo + Frank + + + Daniel + Wagner + + + Stefanie + Simon + + + + + + + Nadine + Frank + + + Markus + Schmitt + + + Olga + Yilmaz + + + Olga + Hansen + + + Daniel + Horn + + + Milan + Lange + + + + + + + Guenter + Schwarz + + + Rainer + Aksoy + + + Renate + Aksoy + + + Werner + Stein + + + + + + + Sergej + Berger + + + Giovanna + Kovac + + + Dennis + Schmidt + + + Patrick + Simon + + + Stefanie + Busch + + + Andreas + Koch + + + Svenja + Vogel + + + Giovanna + Koch + + + Julia + Esposito + + + + + + + Jennifer + Dietrich + + + Christian + Meyer + + + Svenja + Horn + + + Stefanie + Roth + + + Stefan + Kuhn + + + + + + + Felix + Brandt + + + Matteo + Kraus + + + Anton + Brandt + + + Frieda + Brandt + + + Mila + Meyer + + + Greta + Brandt + + + Theo + Sommer + + + Max + Sommer + + + Leni + Kuhn + + + Emil + Sommer + + + Ida + Sommer + + + Liam + Schwarz + + + Elias + Schwarz + + 16 + + + + + + Ben + Brandt + + + Paul + Brandt + + + Anton + Meyer + + + Ida + Meyer + + + Anton + Vogel + + + Max + Vogel + + 17 + + + + + + Gast + Musikverein + + 13 + + + + + + Sven + Fischer + + + + diff --git a/work/hochzeit/tische.ini b/work/hochzeit/tische.ini new file mode 100644 index 0000000..6edf933 --- /dev/null +++ b/work/hochzeit/tische.ini @@ -0,0 +1,118 @@ +[1] +Nummer=1 +Hof=1 +Plaetze=12 +Nachbarliste=[3, 4, 5] +Koordinaten=(2,0) + +[2] +Nummer=2 +Hof=1 +Plaetze=8 +Nachbarliste=[3, 7, 8] +Koordinaten=(0,1) + +[3] +Nummer=3 +Hof=1 +Plaetze=8 +Nachbarliste=[1, 2, 4, 7, 8, 9] +Koordinaten=(1,1) + +[4] +Nummer=4 +Hof=1 +Plaetze=8 +Nachbarliste=[1, 3, 5, 8, 9, 10] +Koordinaten=(2,1) + +[5] +Nummer=5 +Hof=1 +Plaetze=8 +Nachbarliste=[1, 4, 6, 9, 10, 11] +Koordinaten=(3,1) + +[6] +Nummer=6 +Hof=1 +Plaetze=8 +Nachbarliste=[5, 10, 11, 16, 17] +Koordinaten=(4,1) + +[7] +Nummer=7 +Hof=1 +Plaetze=8 +Nachbarliste=[2, 3, 8, 12, 13] +Koordinaten=(0,2) + +[8] +Nummer=8 +Hof=1 +Plaetze=8 +Nachbarliste=[2, 3, 4, 7, 9, 12, 13, 14] +Koordinaten=(1,2) + +[9] +Nummer=9 +Hof=1 +Plaetze=8 +Nachbarliste=[3, 4, 5, 8, 10, 13, 14, 15] +Koordinaten=(2,2) + +[10] +Nummer=10 +Hof=1 +Plaetze=8 +Nachbarliste=[4, 5, 6, 9, 11, 14, 15] +Koordinaten=(3,2) + +[11] +Nummer=11 +Hof=1 +Plaetze=8 +Nachbarliste=[5, 6, 10, 15, 16, 17] +Koordinaten=(4,2) + +[12] +Nummer=12 +Hof=1 +Plaetze=8 +Nachbarliste=[7, 8, 13] +Koordinaten=(0,3) + +[13] +Nummer=13 +Hof=1 +Plaetze=8 +Nachbarliste=[7, 8, 9, 12, 14] +Koordinaten=(1,3) + +[14] +Nummer=14 +Hof=1 +Plaetze=8 +Nachbarliste=[8, 9, 10, 13, 15] +Koordinaten=(2,3) + +[15] +Nummer=15 +Hof=1 +Plaetze=8 +Nachbarliste=[9, 10, 11, 14] +Koordinaten=(3,3) + +[16] +Nummer=16 +Hof=1 +Plaetze=13 +Nachbarliste=[6, 11, 17] +Koordinaten=(5,1) + +[17] +Nummer=17 +Hof=1 +Plaetze=6 +Nachbarliste=[6, 11, 16] +Koordinaten=(5,2) diff --git a/work/innenhoefe/PersonenTische.csv b/work/innenhoefe/PersonenTische.csv new file mode 100644 index 0000000..588d148 --- /dev/null +++ b/work/innenhoefe/PersonenTische.csv @@ -0,0 +1,300 @@ +Aksoy, Luca, = Hof 1, Tisch 14, Nummer 3 +Aksoy, Marie, = Hof 1, Tisch 24, Nummer 5 +Aksoy, Marija, = Hof 2, Tisch 54, Nummer 5 +Aksoy, Michael, Dr. = Hof 2, Tisch 59, Nummer 4 +Aksoy, Nadine, = Hof 1, Tisch 14, Nummer 4 +Aksoy, Nicole, = Hof 1, Tisch 38, Nummer 5 +Aksoy, Sergej, = Hof 1, Tisch 14, Nummer 2 +Aksoy, Sofia, = Hof 1, Tisch 14, Nummer 5 +Aksoy, Thomas, = Hof 1, Tisch 24, Nummer 2 +Albrecht, Andreas, = Hof 1, Tisch 17, Nummer 5 +Albrecht, Emre, Prof. Dr. = Hof 2, Tisch 67, Nummer 2 +Albrecht, Sarah, = Hof 1, Tisch 17, Nummer 2 +Albrecht, Yusuf, Prof. Dr. = Hof 1, Tisch 18, Nummer 3 +Arnold, Christian, = Hof 2, Tisch 52, Nummer 3 +Arnold, Jennifer, = Hof 2, Tisch 53, Nummer 5 +Arnold, Jennifer, Dr. = Hof 2, Tisch 67, Nummer 4 +Arnold, Leni, = Hof 2, Tisch 52, Nummer 4 +Arnold, Mila, = Hof 2, Tisch 52, Nummer 2 +Arnold, Nadine, = Hof 1, Tisch 40, Nummer 4 +Arnold, Patrick, = Hof 2, Tisch 53, Nummer 4 +Barth, Lina, = Hof 2, Tisch 66, Nummer 5 +Barth, Markus, = Hof 1, Tisch 45, Nummer 2 +Barth, Nadine, = Hof 2, Tisch 66, Nummer 3 +Barth, Patrick, = Hof 2, Tisch 66, Nummer 2 +Barth, Timo, = Hof 2, Tisch 66, Nummer 4 +Bauer, Dragana, = Hof 1, Tisch 42, Nummer 2 +Bauer, Yusuf, = Hof 1, Tisch 2, Nummer 3 +Becker, Jan, = Hof 2, Tisch 50, Nummer 2 +Becker, Marija, = Hof 1, Tisch 26, Nummer 2 +Becker, Nicole, = Hof 2, Tisch 50, Nummer 4 +Becker, Sandra, = Hof 2, Tisch 50, Nummer 3 +Berger, Andreas, = Hof 1, Tisch 33, Nummer 2 +Berger, Anton, = Hof 1, Tisch 25, Nummer 2 +Berger, Jennifer, = Hof 1, Tisch 25, Nummer 3 +Berger, Layla, = Hof 1, Tisch 25, Nummer 4 +Berger, Nadine, Dr. = Hof 2, Tisch 77, Nummer 2 +Berger, Stefan, = Hof 1, Tisch 33, Nummer 4 +Berger, Svenja, = Hof 1, Tisch 33, Nummer 3 +Bianchi, Jan, Dr. = Hof 1, Tisch 1, Nummer 4 +Bianchi, Mia, = Hof 1, Tisch 21, Nummer 2 +Bianchi, Sandra, = Hof 1, Tisch 21, Nummer 3 +Bianchi, Thomas, = Hof 1, Tisch 21, Nummer 4 +Bianchi, Thomas, = Hof 2, Tisch 67, Nummer 5 +Braun, Christian, = Hof 1, Tisch 37, Nummer 2 +Braun, Dragana, = Hof 1, Tisch 36, Nummer 5 +Braun, Jan, = Hof 1, Tisch 36, Nummer 2 +Braun, Julia, = Hof 1, Tisch 37, Nummer 3 +Braun, Milan, = Hof 1, Tisch 37, Nummer 5 +Braun, Nadine, = Hof 1, Tisch 37, Nummer 4 +Busch, Emre, = Hof 1, Tisch 28, Nummer 2 +Busch, Marie, = Hof 1, Tisch 28, Nummer 5 +Busch, Michael, = Hof 1, Tisch 28, Nummer 4 +Busch, Olga, = Hof 1, Tisch 28, Nummer 3 +Busch, Patrick, = Hof 2, Tisch 49, Nummer 2 +Celik, Elif, = Hof 1, Tisch 19, Nummer 5 +Celik, Patrick, = Hof 1, Tisch 19, Nummer 4 +Dallmann, Charlotte, = Hof 1, Tisch 7, Nummer 5 +Dallmann, Heinrich, = Hof 1, Tisch 7, Nummer 4 +Dallmann, Margarete, = Hof 1, Tisch 7, Nummer 3 +Dallmann, Maximilian, = Hof 1, Tisch 7, Nummer 2 +Demir, Sandra, Dr. = Hof 1, Tisch 19, Nummer 2 +Dietrich, Dragana, Prof. Dr. = Hof 2, Tisch 59, Nummer 5 +Dietrich, Jennifer, = Hof 2, Tisch 78, Nummer 2 +Dietrich, Marco, = Hof 2, Tisch 78, Nummer 3 +Dietrich, Sofia, = Hof 2, Tisch 78, Nummer 4 +Engel, Anja, = Hof 1, Tisch 10, Nummer 4 +Engel, Anton, = Hof 1, Tisch 11, Nummer 4 +Engel, Julia, = Hof 1, Tisch 11, Nummer 2 +Engel, Nicole, = Hof 1, Tisch 11, Nummer 3 +Engel, Yusuf, = Hof 1, Tisch 10, Nummer 2 +Esposito, Jan, Dr. = Hof 1, Tisch 12, Nummer 3 +Esposito, Yusuf, Prof. Dr. = Hof 1, Tisch 26, Nummer 3 +Frank, Dennis, = Hof 1, Tisch 10, Nummer 5 +Frank, Finn, = Hof 1, Tisch 9, Nummer 4 +Frank, Lena, = Hof 1, Tisch 9, Nummer 3 +Frank, Marie, = Hof 1, Tisch 10, Nummer 3 +Frank, Nadine, = Hof 1, Tisch 9, Nummer 2 +Franke, Amira, = Hof 2, Tisch 73, Nummer 3 +Franke, Julia, = Hof 2, Tisch 81, Nummer 2 +Franke, Marco, = Hof 2, Tisch 81, Nummer 3 +Franke, Michael, = Hof 2, Tisch 73, Nummer 2 +Franke, Olga, = Hof 2, Tisch 81, Nummer 4 +Freifrau von Waldeck, Antonia, = Hof 1, Tisch 6, Nummer 4 +Freiherr von Waldeck, Konstantin, Dr. = Hof 1, Tisch 6, Nummer 2 +Grothe, Alexander, Dr. h.c. = Hof 1, Tisch 5, Nummer 5 +Grothe, Beate, = Hof 1, Tisch 5, Nummer 2 +Haas, Jennifer, Dr. = Hof 1, Tisch 45, Nummer 4 +Haas, Patrick, = Hof 1, Tisch 42, Nummer 4 +Hansen, Giovanna, = Hof 1, Tisch 30, Nummer 4 +Hansen, Markus, = Hof 1, Tisch 30, Nummer 3 +Hansen, Nicole, Dr. = Hof 1, Tisch 42, Nummer 3 +Hansen, Olga, = Hof 1, Tisch 30, Nummer 2 +Hansen, Thomas, = Hof 1, Tisch 12, Nummer 5 +Hartmann, Deniz, = Hof 2, Tisch 85, Nummer 4 +Hartmann, Marija, = Hof 2, Tisch 86, Nummer 3 +Hartmann, Nadine, = Hof 2, Tisch 86, Nummer 2 +Hartmann, Olga, = Hof 2, Tisch 85, Nummer 3 +Hartmann, Thomas, = Hof 2, Tisch 85, Nummer 2 +Hoffmann, Emre, = Hof 2, Tisch 49, Nummer 3 +Hoffmann, Patrick, Prof. Dr. = Hof 1, Tisch 40, Nummer 5 +Hoffmann, Thomas, Dr. = Hof 1, Tisch 32, Nummer 4 +Horn, Kathrin, = Hof 2, Tisch 84, Nummer 4 +Horn, Layla, = Hof 2, Tisch 84, Nummer 3 +Horn, Leon, = Hof 2, Tisch 84, Nummer 5 +Horn, Michael, = Hof 2, Tisch 84, Nummer 2 +Kaya, Christina, = Hof 1, Tisch 43, Nummer 4 +Kaya, Luca, = Hof 1, Tisch 43, Nummer 3 +Kaya, Nicole, = Hof 1, Tisch 43, Nummer 2 +Kaya, Patrick, Dr. = Hof 1, Tisch 1, Nummer 2 +Kaya, Timo, Prof. Dr. = Hof 1, Tisch 19, Nummer 3 +Kessler, Ferdinand, Dr. = Hof 1, Tisch 5, Nummer 4 +Kessler, Viktoria, = Hof 1, Tisch 5, Nummer 3 +Klein, Emre, = Hof 1, Tisch 2, Nummer 4 +Klein, Lina, = Hof 2, Tisch 63, Nummer 4 +Klein, Markus, = Hof 1, Tisch 38, Nummer 4 +Klein, Milan, = Hof 2, Tisch 63, Nummer 2 +Klein, Olga, Dr. = Hof 2, Tisch 57, Nummer 2 +Klein, Stefanie, = Hof 2, Tisch 63, Nummer 3 +Koch, Emil, = Hof 2, Tisch 48, Nummer 2 +Koch, Jan, = Hof 2, Tisch 48, Nummer 5 +Koch, Kathrin, Dr. = Hof 2, Tisch 68, Nummer 3 +Koch, Marie, = Hof 2, Tisch 48, Nummer 3 +Koch, Michael, = Hof 2, Tisch 49, Nummer 4 +Koch, Olga, = Hof 2, Tisch 48, Nummer 4 +Koch, Sarah, = Hof 2, Tisch 49, Nummer 5 +Kovac, Anja, = Hof 1, Tisch 15, Nummer 3 +Kovac, Henry, = Hof 1, Tisch 15, Nummer 2 +Kovac, Lena, = Hof 1, Tisch 15, Nummer 4 +Kovac, Luca, = Hof 2, Tisch 71, Nummer 2 +Kovac, Marco, = Hof 1, Tisch 15, Nummer 5 +Kovac, Marija, = Hof 1, Tisch 24, Nummer 4 +Kovac, Matthias, = Hof 1, Tisch 26, Nummer 4 +Kovac, Tobias, = Hof 1, Tisch 24, Nummer 3 +Kraus, Markus, = Hof 1, Tisch 3, Nummer 5 +Kraus, Patrick, Dr. = Hof 2, Tisch 57, Nummer 5 +Krause, Andreas, = Hof 2, Tisch 74, Nummer 5 +Krause, Arda, = Hof 2, Tisch 74, Nummer 4 +Krause, Christina, Dr. = Hof 1, Tisch 1, Nummer 3 +Krause, Daniel, = Hof 1, Tisch 38, Nummer 3 +Krause, Dragana, Dr. = Hof 2, Tisch 71, Nummer 3 +Krause, Emma, = Hof 2, Tisch 74, Nummer 2 +Krause, Julia, = Hof 2, Tisch 74, Nummer 3 +Krause, Matthias, = Hof 2, Tisch 58, Nummer 4 +Krause, Thomas, = Hof 1, Tisch 41, Nummer 2 +Kuhn, Julia, Dr. = Hof 2, Tisch 68, Nummer 4 +Lange, Dragana, = Hof 2, Tisch 72, Nummer 2 +Lange, Jan, = Hof 2, Tisch 73, Nummer 5 +Lange, Michael, = Hof 2, Tisch 72, Nummer 3 +Lange, Sergej, = Hof 2, Tisch 59, Nummer 3 +Lange, Sofia, = Hof 2, Tisch 72, Nummer 4 +Lange, Svenja, = Hof 2, Tisch 73, Nummer 4 +Lehmann, Giovanna, = Hof 1, Tisch 16, Nummer 2 +Lehmann, Layla, = Hof 1, Tisch 16, Nummer 5 +Lehmann, Markus, = Hof 1, Tisch 16, Nummer 4 +Lehmann, Milan, = Hof 1, Tisch 16, Nummer 3 +Lehmann, Nicole, = Hof 1, Tisch 17, Nummer 3 +Lehmann, Patrick, = Hof 2, Tisch 77, Nummer 4 +Lehmann, Thomas, = Hof 1, Tisch 17, Nummer 4 +Ludwig, Aylin, Dr. = Hof 2, Tisch 57, Nummer 4 +Ludwig, Elias, = Hof 2, Tisch 56, Nummer 3 +Ludwig, Elif, = Hof 2, Tisch 56, Nummer 4 +Ludwig, Emre, = Hof 2, Tisch 56, Nummer 2 +Ludwig, Emre, Prof. Dr. = Hof 1, Tisch 38, Nummer 2 +Ludwig, Giovanna, = Hof 2, Tisch 56, Nummer 5 +Maier, Arda, = Hof 2, Tisch 60, Nummer 2 +Maier, Christian, = Hof 2, Tisch 60, Nummer 4 +Maier, Olga, = Hof 2, Tisch 60, Nummer 3 +Maier, Sarah, = Hof 2, Tisch 60, Nummer 5 +Neumann, Jennifer, = Hof 2, Tisch 83, Nummer 4 +Neumann, Lina, = Hof 2, Tisch 83, Nummer 3 +Neumann, Matteo, = Hof 2, Tisch 83, Nummer 2 +Neumann, Thomas, = Hof 2, Tisch 83, Nummer 5 +Nguyen, Anja, = Hof 2, Tisch 51, Nummer 3 +Nguyen, Daniel, = Hof 2, Tisch 51, Nummer 4 +Nguyen, Julia, = Hof 1, Tisch 13, Nummer 4 +Nguyen, Sofia, = Hof 2, Tisch 51, Nummer 2 +Nowak, Aylin, = Hof 1, Tisch 36, Nummer 3 +Nowak, Felix, = Hof 1, Tisch 35, Nummer 2 +Nowak, Kathrin, = Hof 1, Tisch 36, Nummer 4 +Nowak, Lina, = Hof 1, Tisch 35, Nummer 4 +Nowak, Markus, = Hof 1, Tisch 35, Nummer 5 +Nowak, Noah, = Hof 1, Tisch 35, Nummer 3 +Ott, Daniel, = Hof 2, Tisch 86, Nummer 5 +Ott, Hannah, = Hof 2, Tisch 80, Nummer 3 +Ott, Luca, = Hof 2, Tisch 71, Nummer 4 +Ott, Matthias, = Hof 2, Tisch 80, Nummer 2 +Ott, Melanie, = Hof 2, Tisch 80, Nummer 4 +Ott, Olga, = Hof 2, Tisch 86, Nummer 4 +Ott, Sergej, Prof. Dr. = Hof 1, Tisch 42, Nummer 5 +Ott, Yusuf, Prof. Dr. = Hof 2, Tisch 77, Nummer 3 +Peters, Christian, = Hof 1, Tisch 3, Nummer 4 +Peters, Nicole, = Hof 1, Tisch 41, Nummer 3 +Petrov, Giovanna, = Hof 1, Tisch 3, Nummer 3 +Petrov, Kathrin, = Hof 1, Tisch 20, Nummer 4 +Petrov, Kathrin, Prof. Dr. = Hof 1, Tisch 4, Nummer 2 +Petrov, Matthias, = Hof 1, Tisch 45, Nummer 5 +Petrov, Milan, = Hof 1, Tisch 20, Nummer 5 +Petrov, Sergej, = Hof 2, Tisch 54, Nummer 3 +Pohl, Dragana, = Hof 2, Tisch 75, Nummer 4 +Pohl, Emre, = Hof 2, Tisch 75, Nummer 5 +Pohl, Mia, = Hof 2, Tisch 75, Nummer 2 +Pohl, Theo, = Hof 2, Tisch 75, Nummer 3 +Polat, Kathrin, = Hof 2, Tisch 54, Nummer 2 +Polat, Katrin, = Hof 2, Tisch 88, Nummer 3 +Polat, Marija, = Hof 1, Tisch 40, Nummer 2 +Polat, Markus, = Hof 2, Tisch 88, Nummer 2 +Polat, Sarah, = Hof 2, Tisch 53, Nummer 2 +Polat, Stefan, = Hof 2, Tisch 53, Nummer 3 +Polat, Stefanie, = Hof 2, Tisch 88, Nummer 4 +Popescu, Matthias, = Hof 1, Tisch 18, Nummer 5 +Richter, Anja, = Hof 1, Tisch 31, Nummer 5 +Richter, Anja, Prof. Dr. = Hof 2, Tisch 65, Nummer 3 +Richter, Anton, = Hof 1, Tisch 31, Nummer 4 +Richter, Greta, = Hof 1, Tisch 31, Nummer 3 +Richter, Julia, Prof. Dr. = Hof 1, Tisch 45, Nummer 3 +Richter, Marco, = Hof 1, Tisch 40, Nummer 3 +Richter, Matthias, = Hof 1, Tisch 31, Nummer 2 +Richter, Stefan, = Hof 2, Tisch 62, Nummer 3 +Rossi, Emilia, = Hof 1, Tisch 29, Nummer 4 +Rossi, Luca, = Hof 1, Tisch 29, Nummer 3 +Rossi, Melanie, = Hof 1, Tisch 29, Nummer 2 +Roth, Christian, = Hof 2, Tisch 64, Nummer 3 +Roth, Julia, Prof. Dr. = Hof 1, Tisch 13, Nummer 3 +Roth, Olga, = Hof 2, Tisch 67, Nummer 3 +Roth, Sarah, = Hof 2, Tisch 64, Nummer 2 +Roth, Sofia, = Hof 2, Tisch 64, Nummer 4 +Sahin, Kathrin, = Hof 2, Tisch 55, Nummer 2 +Sahin, Markus, = Hof 2, Tisch 55, Nummer 4 +Sahin, Nicole, = Hof 2, Tisch 55, Nummer 5 +Sahin, Patrick, = Hof 2, Tisch 55, Nummer 3 +Sahin, Thomas, = Hof 2, Tisch 65, Nummer 2 +Schmidt, Giovanna, = Hof 1, Tisch 44, Nummer 3 +Schmidt, Marie, = Hof 1, Tisch 44, Nummer 2 +Schmidt, Matthias, = Hof 1, Tisch 44, Nummer 5 +Schmidt, Nicole, = Hof 1, Tisch 12, Nummer 4 +Schmitt, Dennis, Prof. Dr. = Hof 2, Tisch 62, Nummer 4 +Schmitt, Markus, = Hof 1, Tisch 22, Nummer 5 +Schmitt, Markus, = Hof 1, Tisch 4, Nummer 3 +Schmitt, Sarah, = Hof 1, Tisch 22, Nummer 4 +Schmitt, Sofia, = Hof 1, Tisch 22, Nummer 2 +Schmitt, Stefan, Prof. Dr. = Hof 2, Tisch 69, Nummer 4 +Schwarz, Giovanna, = Hof 2, Tisch 58, Nummer 3 +Seidel, Anja, Dr. = Hof 1, Tisch 32, Nummer 5 +Seidel, Markus, Dr. = Hof 1, Tisch 3, Nummer 2 +Seidel, Yusuf, Prof. Dr. = Hof 1, Tisch 2, Nummer 5 +Seifert, Elif, = Hof 1, Tisch 23, Nummer 4 +Seifert, Leni, = Hof 1, Tisch 23, Nummer 3 +Seifert, Marco, Prof. Dr. = Hof 2, Tisch 57, Nummer 3 +Seifert, Nicole, = Hof 1, Tisch 22, Nummer 3 +Seifert, Stefanie, Dr. = Hof 1, Tisch 13, Nummer 2 +Seifert, Timo, = Hof 1, Tisch 23, Nummer 5 +Seifert, Yusuf, = Hof 1, Tisch 23, Nummer 2 +Simon, Andreas, = Hof 2, Tisch 61, Nummer 2 +Simon, Emma, = Hof 2, Tisch 61, Nummer 4 +Simon, Lena, = Hof 2, Tisch 61, Nummer 5 +Simon, Markus, = Hof 2, Tisch 61, Nummer 3 +Simon, Svenja, = Hof 1, Tisch 18, Nummer 2 +Stein, Ben, = Hof 2, Tisch 76, Nummer 5 +Stein, Emilia, = Hof 2, Tisch 76, Nummer 4 +Stein, Giovanna, = Hof 2, Tisch 76, Nummer 2 +Stein, Markus, Prof. Dr. = Hof 1, Tisch 18, Nummer 4 +Stein, Nadine, Dr. = Hof 1, Tisch 4, Nummer 4 +Stein, Thomas, = Hof 2, Tisch 76, Nummer 3 +Steinbach, Elisabeth, = Hof 1, Tisch 6, Nummer 3 +Steinbach, Georg, = Hof 1, Tisch 6, Nummer 5 +Thiel, Christina, = Hof 2, Tisch 82, Nummer 2 +Thiel, Jan, Dr. = Hof 2, Tisch 65, Nummer 4 +Thiel, Julia, = Hof 2, Tisch 82, Nummer 3 +Thiel, Yusuf, = Hof 2, Tisch 82, Nummer 4 +Tran, Marija, = Hof 2, Tisch 69, Nummer 2 +Tran, Olga, = Hof 1, Tisch 32, Nummer 2 +Tran, Thomas, Prof. Dr. = Hof 2, Tisch 54, Nummer 4 +Wagner, Henry, = Hof 2, Tisch 46, Nummer 3 +Wagner, Marco, = Hof 2, Tisch 46, Nummer 5 +Wagner, Nicole, = Hof 2, Tisch 46, Nummer 4 +Wagner, Sarah, = Hof 2, Tisch 46, Nummer 2 +Weber, Andreas, = Hof 1, Tisch 44, Nummer 4 +Weber, Julia, = Hof 1, Tisch 2, Nummer 2 +Weber, Katrin, = Hof 2, Tisch 68, Nummer 2 +Weber, Yusuf, = Hof 2, Tisch 58, Nummer 2 +Werner, Andreas, = Hof 1, Tisch 39, Nummer 4 +Werner, Dennis, Prof. Dr. = Hof 1, Tisch 32, Nummer 3 +Werner, Katrin, = Hof 2, Tisch 59, Nummer 2 +Werner, Luca, = Hof 2, Tisch 69, Nummer 3 +Werner, Marco, = Hof 1, Tisch 39, Nummer 3 +Werner, Nadine, = Hof 1, Tisch 39, Nummer 5 +Werner, Sandra, = Hof 1, Tisch 39, Nummer 2 +Winkler, Lena, = Hof 1, Tisch 20, Nummer 2 +Winkler, Marco, = Hof 1, Tisch 1, Nummer 5 +Winkler, Patrick, = Hof 1, Tisch 20, Nummer 3 +Winkler, Thomas, = Hof 1, Tisch 12, Nummer 2 +Wolf, Ben, = Hof 2, Tisch 79, Nummer 5 +Wolf, Emma, = Hof 2, Tisch 79, Nummer 4 +Wolf, Julia, = Hof 2, Tisch 79, Nummer 3 +Wolf, Thomas, = Hof 2, Tisch 79, Nummer 2 +Zimmermann, Jan, = Hof 2, Tisch 70, Nummer 2 +Zimmermann, Markus, = Hof 2, Tisch 70, Nummer 3 +Zimmermann, Mia, = Hof 2, Tisch 70, Nummer 4 +Zimmermann, Patrick, = Hof 2, Tisch 62, Nummer 2 +Zimmermann, Svenja, = Hof 2, Tisch 70, Nummer 5 diff --git a/work/innenhoefe/Sitzplatzverteilung.svg b/work/innenhoefe/Sitzplatzverteilung.svg new file mode 100644 index 0000000..8c8537a --- /dev/null +++ b/work/innenhoefe/Sitzplatzverteilung.svg @@ -0,0 +1,480 @@ + + + + +Tisch 8 + +Tisch 27 + +Tisch 34 + +Tisch 47 + +Tisch 87 + +Tisch 41 + + + +Tisch 4 + + + + +Tisch 9 + + + + +Tisch 11 + + + + +Tisch 13 + + + + +Tisch 21 + + + + +Tisch 25 + + + + +Tisch 26 + + + + +Tisch 29 + + + + +Tisch 30 + + + + +Tisch 33 + + + + +Tisch 43 + + + + +Tisch 50 + + + + +Tisch 51 + + + + +Tisch 52 + + + + +Tisch 58 + + + + +Tisch 62 + + + + +Tisch 63 + + + + +Tisch 64 + + + + +Tisch 65 + + + + +Tisch 68 + + + + +Tisch 69 + + + + +Tisch 71 + + + + +Tisch 72 + + + + +Tisch 77 + + + + +Tisch 78 + + + + +Tisch 80 + + + + +Tisch 81 + + + + +Tisch 82 + + + + +Tisch 85 + + + + +Tisch 88 + + + + +Tisch 1 + + + + + +Tisch 2 + + + + + +Tisch 3 + + + + + +Tisch 5 + + + + + +Tisch 6 + + + + + +Tisch 7 + + + + + +Tisch 10 + + + + + +Tisch 12 + + + + + +Tisch 14 + + + + + +Tisch 15 + + + + + +Tisch 16 + + + + + +Tisch 17 + + + + + +Tisch 18 + + + + + +Tisch 19 + + + + + +Tisch 20 + + + + + +Tisch 22 + + + + + +Tisch 23 + + + + + +Tisch 24 + + + + + +Tisch 28 + + + + + +Tisch 31 + + + + + +Tisch 32 + + + + + +Tisch 35 + + + + + +Tisch 36 + + + + + +Tisch 37 + + + + + +Tisch 38 + + + + + +Tisch 39 + + + + + +Tisch 40 + + + + + +Tisch 42 + + + + + +Tisch 44 + + + + + +Tisch 45 + + + + + +Tisch 46 + + + + + +Tisch 48 + + + + + +Tisch 49 + + + + + +Tisch 53 + + + + + +Tisch 54 + + + + + +Tisch 55 + + + + + +Tisch 56 + + + + + +Tisch 57 + + + + + +Tisch 59 + + + + + +Tisch 60 + + + + + +Tisch 61 + + + + + +Tisch 66 + + + + + +Tisch 67 + + + + + +Tisch 70 + + + + + +Tisch 73 + + + + + +Tisch 74 + + + + + +Tisch 75 + + + + + +Tisch 76 + + + + + +Tisch 79 + + + + + +Tisch 83 + + + + + +Tisch 84 + + + + + +Tisch 86 + + + + + diff --git a/work/innenhoefe/TischePersonen.txt b/work/innenhoefe/TischePersonen.txt new file mode 100644 index 0000000..aa66bc7 --- /dev/null +++ b/work/innenhoefe/TischePersonen.txt @@ -0,0 +1,476 @@ +[1] +Dr. Patrick Kaya = Hof 1, Tisch 1, Nummer 1 +Dr. Christina Krause = Hof 1, Tisch 1, Nummer 2 +Dr. Jan Bianchi = Hof 1, Tisch 1, Nummer 3 + Marco Winkler = Hof 1, Tisch 1, Nummer 4 + +[2] + Julia Weber = Hof 1, Tisch 2, Nummer 1 + Yusuf Bauer = Hof 1, Tisch 2, Nummer 2 + Emre Klein = Hof 1, Tisch 2, Nummer 3 +Prof. Dr. Yusuf Seidel = Hof 1, Tisch 2, Nummer 4 + +[3] +Dr. Markus Seidel = Hof 1, Tisch 3, Nummer 1 + Giovanna Petrov = Hof 1, Tisch 3, Nummer 2 + Christian Peters = Hof 1, Tisch 3, Nummer 3 + Markus Kraus = Hof 1, Tisch 3, Nummer 4 + +[4] +Prof. Dr. Kathrin Petrov = Hof 1, Tisch 4, Nummer 1 + Markus Schmitt = Hof 1, Tisch 4, Nummer 2 +Dr. Nadine Stein = Hof 1, Tisch 4, Nummer 3 + +[5] + Beate Grothe = Hof 1, Tisch 5, Nummer 1 + Viktoria Kessler = Hof 1, Tisch 5, Nummer 2 +Dr. Ferdinand Kessler = Hof 1, Tisch 5, Nummer 3 +Dr. h.c. Alexander Grothe = Hof 1, Tisch 5, Nummer 4 + +[6] +Dr. Konstantin Freiherr von Waldeck = Hof 1, Tisch 6, Nummer 1 + Elisabeth Steinbach = Hof 1, Tisch 6, Nummer 2 + Antonia Freifrau von Waldeck = Hof 1, Tisch 6, Nummer 3 + Georg Steinbach = Hof 1, Tisch 6, Nummer 4 + +[7] + Maximilian Dallmann = Hof 1, Tisch 7, Nummer 1 + Margarete Dallmann = Hof 1, Tisch 7, Nummer 2 + Heinrich Dallmann = Hof 1, Tisch 7, Nummer 3 + Charlotte Dallmann = Hof 1, Tisch 7, Nummer 4 + +[8] + +[9] + Nadine Frank = Hof 1, Tisch 9, Nummer 1 + Lena Frank = Hof 1, Tisch 9, Nummer 2 + Finn Frank = Hof 1, Tisch 9, Nummer 3 + +[10] + Yusuf Engel = Hof 1, Tisch 10, Nummer 1 + Marie Frank = Hof 1, Tisch 10, Nummer 2 + Anja Engel = Hof 1, Tisch 10, Nummer 3 + Dennis Frank = Hof 1, Tisch 10, Nummer 4 + +[11] + Julia Engel = Hof 1, Tisch 11, Nummer 1 + Nicole Engel = Hof 1, Tisch 11, Nummer 2 + Anton Engel = Hof 1, Tisch 11, Nummer 3 + +[12] + Thomas Winkler = Hof 1, Tisch 12, Nummer 1 +Dr. Jan Esposito = Hof 1, Tisch 12, Nummer 2 + Nicole Schmidt = Hof 1, Tisch 12, Nummer 3 + Thomas Hansen = Hof 1, Tisch 12, Nummer 4 + +[13] +Dr. Stefanie Seifert = Hof 1, Tisch 13, Nummer 1 +Prof. Dr. Julia Roth = Hof 1, Tisch 13, Nummer 2 + Julia Nguyen = Hof 1, Tisch 13, Nummer 3 + +[14] + Sergej Aksoy = Hof 1, Tisch 14, Nummer 1 + Luca Aksoy = Hof 1, Tisch 14, Nummer 2 + Nadine Aksoy = Hof 1, Tisch 14, Nummer 3 + Sofia Aksoy = Hof 1, Tisch 14, Nummer 4 + +[15] + Henry Kovac = Hof 1, Tisch 15, Nummer 1 + Anja Kovac = Hof 1, Tisch 15, Nummer 2 + Lena Kovac = Hof 1, Tisch 15, Nummer 3 + Marco Kovac = Hof 1, Tisch 15, Nummer 4 + +[16] + Giovanna Lehmann = Hof 1, Tisch 16, Nummer 1 + Milan Lehmann = Hof 1, Tisch 16, Nummer 2 + Markus Lehmann = Hof 1, Tisch 16, Nummer 3 + Layla Lehmann = Hof 1, Tisch 16, Nummer 4 + +[17] + Sarah Albrecht = Hof 1, Tisch 17, Nummer 1 + Nicole Lehmann = Hof 1, Tisch 17, Nummer 2 + Thomas Lehmann = Hof 1, Tisch 17, Nummer 3 + Andreas Albrecht = Hof 1, Tisch 17, Nummer 4 + +[18] + Svenja Simon = Hof 1, Tisch 18, Nummer 1 +Prof. Dr. Yusuf Albrecht = Hof 1, Tisch 18, Nummer 2 +Prof. Dr. Markus Stein = Hof 1, Tisch 18, Nummer 3 + Matthias Popescu = Hof 1, Tisch 18, Nummer 4 + +[19] +Dr. Sandra Demir = Hof 1, Tisch 19, Nummer 1 +Prof. Dr. Timo Kaya = Hof 1, Tisch 19, Nummer 2 + Patrick Celik = Hof 1, Tisch 19, Nummer 3 + Elif Celik = Hof 1, Tisch 19, Nummer 4 + +[20] + Lena Winkler = Hof 1, Tisch 20, Nummer 1 + Patrick Winkler = Hof 1, Tisch 20, Nummer 2 + Kathrin Petrov = Hof 1, Tisch 20, Nummer 3 + Milan Petrov = Hof 1, Tisch 20, Nummer 4 + +[21] + Mia Bianchi = Hof 1, Tisch 21, Nummer 1 + Sandra Bianchi = Hof 1, Tisch 21, Nummer 2 + Thomas Bianchi = Hof 1, Tisch 21, Nummer 3 + +[22] + Sofia Schmitt = Hof 1, Tisch 22, Nummer 1 + Nicole Seifert = Hof 1, Tisch 22, Nummer 2 + Sarah Schmitt = Hof 1, Tisch 22, Nummer 3 + Markus Schmitt = Hof 1, Tisch 22, Nummer 4 + +[23] + Yusuf Seifert = Hof 1, Tisch 23, Nummer 1 + Leni Seifert = Hof 1, Tisch 23, Nummer 2 + Elif Seifert = Hof 1, Tisch 23, Nummer 3 + Timo Seifert = Hof 1, Tisch 23, Nummer 4 + +[24] + Thomas Aksoy = Hof 1, Tisch 24, Nummer 1 + Tobias Kovac = Hof 1, Tisch 24, Nummer 2 + Marija Kovac = Hof 1, Tisch 24, Nummer 3 + Marie Aksoy = Hof 1, Tisch 24, Nummer 4 + +[25] + Anton Berger = Hof 1, Tisch 25, Nummer 1 + Jennifer Berger = Hof 1, Tisch 25, Nummer 2 + Layla Berger = Hof 1, Tisch 25, Nummer 3 + +[26] + Marija Becker = Hof 1, Tisch 26, Nummer 1 +Prof. Dr. Yusuf Esposito = Hof 1, Tisch 26, Nummer 2 + Matthias Kovac = Hof 1, Tisch 26, Nummer 3 + +[27] + +[28] + Emre Busch = Hof 1, Tisch 28, Nummer 1 + Olga Busch = Hof 1, Tisch 28, Nummer 2 + Michael Busch = Hof 1, Tisch 28, Nummer 3 + Marie Busch = Hof 1, Tisch 28, Nummer 4 + +[29] + Melanie Rossi = Hof 1, Tisch 29, Nummer 1 + Luca Rossi = Hof 1, Tisch 29, Nummer 2 + Emilia Rossi = Hof 1, Tisch 29, Nummer 3 + +[30] + Olga Hansen = Hof 1, Tisch 30, Nummer 1 + Markus Hansen = Hof 1, Tisch 30, Nummer 2 + Giovanna Hansen = Hof 1, Tisch 30, Nummer 3 + +[31] + Matthias Richter = Hof 1, Tisch 31, Nummer 1 + Greta Richter = Hof 1, Tisch 31, Nummer 2 + Anton Richter = Hof 1, Tisch 31, Nummer 3 + Anja Richter = Hof 1, Tisch 31, Nummer 4 + +[32] + Olga Tran = Hof 1, Tisch 32, Nummer 1 +Prof. Dr. Dennis Werner = Hof 1, Tisch 32, Nummer 2 +Dr. Thomas Hoffmann = Hof 1, Tisch 32, Nummer 3 +Dr. Anja Seidel = Hof 1, Tisch 32, Nummer 4 + +[33] + Andreas Berger = Hof 1, Tisch 33, Nummer 1 + Svenja Berger = Hof 1, Tisch 33, Nummer 2 + Stefan Berger = Hof 1, Tisch 33, Nummer 3 + +[34] + +[35] + Felix Nowak = Hof 1, Tisch 35, Nummer 1 + Noah Nowak = Hof 1, Tisch 35, Nummer 2 + Lina Nowak = Hof 1, Tisch 35, Nummer 3 + Markus Nowak = Hof 1, Tisch 35, Nummer 4 + +[36] + Jan Braun = Hof 1, Tisch 36, Nummer 1 + Aylin Nowak = Hof 1, Tisch 36, Nummer 2 + Kathrin Nowak = Hof 1, Tisch 36, Nummer 3 + Dragana Braun = Hof 1, Tisch 36, Nummer 4 + +[37] + Christian Braun = Hof 1, Tisch 37, Nummer 1 + Julia Braun = Hof 1, Tisch 37, Nummer 2 + Nadine Braun = Hof 1, Tisch 37, Nummer 3 + Milan Braun = Hof 1, Tisch 37, Nummer 4 + +[38] +Prof. Dr. Emre Ludwig = Hof 1, Tisch 38, Nummer 1 + Daniel Krause = Hof 1, Tisch 38, Nummer 2 + Markus Klein = Hof 1, Tisch 38, Nummer 3 + Nicole Aksoy = Hof 1, Tisch 38, Nummer 4 + +[39] + Sandra Werner = Hof 1, Tisch 39, Nummer 1 + Marco Werner = Hof 1, Tisch 39, Nummer 2 + Andreas Werner = Hof 1, Tisch 39, Nummer 3 + Nadine Werner = Hof 1, Tisch 39, Nummer 4 + +[40] + Marija Polat = Hof 1, Tisch 40, Nummer 1 + Marco Richter = Hof 1, Tisch 40, Nummer 2 + Nadine Arnold = Hof 1, Tisch 40, Nummer 3 +Prof. Dr. Patrick Hoffmann = Hof 1, Tisch 40, Nummer 4 + +[41] + Thomas Krause = Hof 1, Tisch 41, Nummer 1 + Nicole Peters = Hof 1, Tisch 41, Nummer 2 + +[42] + Dragana Bauer = Hof 1, Tisch 42, Nummer 1 +Dr. Nicole Hansen = Hof 1, Tisch 42, Nummer 2 + Patrick Haas = Hof 1, Tisch 42, Nummer 3 +Prof. Dr. Sergej Ott = Hof 1, Tisch 42, Nummer 4 + +[43] + Nicole Kaya = Hof 1, Tisch 43, Nummer 1 + Luca Kaya = Hof 1, Tisch 43, Nummer 2 + Christina Kaya = Hof 1, Tisch 43, Nummer 3 + +[44] + Marie Schmidt = Hof 1, Tisch 44, Nummer 1 + Giovanna Schmidt = Hof 1, Tisch 44, Nummer 2 + Andreas Weber = Hof 1, Tisch 44, Nummer 3 + Matthias Schmidt = Hof 1, Tisch 44, Nummer 4 + +[45] + Markus Barth = Hof 1, Tisch 45, Nummer 1 +Prof. Dr. Julia Richter = Hof 1, Tisch 45, Nummer 2 +Dr. Jennifer Haas = Hof 1, Tisch 45, Nummer 3 + Matthias Petrov = Hof 1, Tisch 45, Nummer 4 + +[46] + Sarah Wagner = Hof 2, Tisch 46, Nummer 1 + Henry Wagner = Hof 2, Tisch 46, Nummer 2 + Nicole Wagner = Hof 2, Tisch 46, Nummer 3 + Marco Wagner = Hof 2, Tisch 46, Nummer 4 + +[47] + +[48] + Emil Koch = Hof 2, Tisch 48, Nummer 1 + Marie Koch = Hof 2, Tisch 48, Nummer 2 + Olga Koch = Hof 2, Tisch 48, Nummer 3 + Jan Koch = Hof 2, Tisch 48, Nummer 4 + +[49] + Patrick Busch = Hof 2, Tisch 49, Nummer 1 + Emre Hoffmann = Hof 2, Tisch 49, Nummer 2 + Michael Koch = Hof 2, Tisch 49, Nummer 3 + Sarah Koch = Hof 2, Tisch 49, Nummer 4 + +[50] + Jan Becker = Hof 2, Tisch 50, Nummer 1 + Sandra Becker = Hof 2, Tisch 50, Nummer 2 + Nicole Becker = Hof 2, Tisch 50, Nummer 3 + +[51] + Sofia Nguyen = Hof 2, Tisch 51, Nummer 1 + Anja Nguyen = Hof 2, Tisch 51, Nummer 2 + Daniel Nguyen = Hof 2, Tisch 51, Nummer 3 + +[52] + Mila Arnold = Hof 2, Tisch 52, Nummer 1 + Christian Arnold = Hof 2, Tisch 52, Nummer 2 + Leni Arnold = Hof 2, Tisch 52, Nummer 3 + +[53] + Sarah Polat = Hof 2, Tisch 53, Nummer 1 + Stefan Polat = Hof 2, Tisch 53, Nummer 2 + Patrick Arnold = Hof 2, Tisch 53, Nummer 3 + Jennifer Arnold = Hof 2, Tisch 53, Nummer 4 + +[54] + Kathrin Polat = Hof 2, Tisch 54, Nummer 1 + Sergej Petrov = Hof 2, Tisch 54, Nummer 2 +Prof. Dr. Thomas Tran = Hof 2, Tisch 54, Nummer 3 + Marija Aksoy = Hof 2, Tisch 54, Nummer 4 + +[55] + Kathrin Sahin = Hof 2, Tisch 55, Nummer 1 + Patrick Sahin = Hof 2, Tisch 55, Nummer 2 + Markus Sahin = Hof 2, Tisch 55, Nummer 3 + Nicole Sahin = Hof 2, Tisch 55, Nummer 4 + +[56] + Emre Ludwig = Hof 2, Tisch 56, Nummer 1 + Elias Ludwig = Hof 2, Tisch 56, Nummer 2 + Elif Ludwig = Hof 2, Tisch 56, Nummer 3 + Giovanna Ludwig = Hof 2, Tisch 56, Nummer 4 + +[57] +Dr. Olga Klein = Hof 2, Tisch 57, Nummer 1 +Prof. Dr. Marco Seifert = Hof 2, Tisch 57, Nummer 2 +Dr. Aylin Ludwig = Hof 2, Tisch 57, Nummer 3 +Dr. Patrick Kraus = Hof 2, Tisch 57, Nummer 4 + +[58] + Yusuf Weber = Hof 2, Tisch 58, Nummer 1 + Giovanna Schwarz = Hof 2, Tisch 58, Nummer 2 + Matthias Krause = Hof 2, Tisch 58, Nummer 3 + +[59] + Katrin Werner = Hof 2, Tisch 59, Nummer 1 + Sergej Lange = Hof 2, Tisch 59, Nummer 2 +Dr. Michael Aksoy = Hof 2, Tisch 59, Nummer 3 +Prof. Dr. Dragana Dietrich = Hof 2, Tisch 59, Nummer 4 + +[60] + Arda Maier = Hof 2, Tisch 60, Nummer 1 + Olga Maier = Hof 2, Tisch 60, Nummer 2 + Christian Maier = Hof 2, Tisch 60, Nummer 3 + Sarah Maier = Hof 2, Tisch 60, Nummer 4 + +[61] + Andreas Simon = Hof 2, Tisch 61, Nummer 1 + Markus Simon = Hof 2, Tisch 61, Nummer 2 + Emma Simon = Hof 2, Tisch 61, Nummer 3 + Lena Simon = Hof 2, Tisch 61, Nummer 4 + +[62] + Patrick Zimmermann = Hof 2, Tisch 62, Nummer 1 + Stefan Richter = Hof 2, Tisch 62, Nummer 2 +Prof. Dr. Dennis Schmitt = Hof 2, Tisch 62, Nummer 3 + +[63] + Milan Klein = Hof 2, Tisch 63, Nummer 1 + Stefanie Klein = Hof 2, Tisch 63, Nummer 2 + Lina Klein = Hof 2, Tisch 63, Nummer 3 + +[64] + Sarah Roth = Hof 2, Tisch 64, Nummer 1 + Christian Roth = Hof 2, Tisch 64, Nummer 2 + Sofia Roth = Hof 2, Tisch 64, Nummer 3 + +[65] + Thomas Sahin = Hof 2, Tisch 65, Nummer 1 +Prof. Dr. Anja Richter = Hof 2, Tisch 65, Nummer 2 +Dr. Jan Thiel = Hof 2, Tisch 65, Nummer 3 + +[66] + Patrick Barth = Hof 2, Tisch 66, Nummer 1 + Nadine Barth = Hof 2, Tisch 66, Nummer 2 + Timo Barth = Hof 2, Tisch 66, Nummer 3 + Lina Barth = Hof 2, Tisch 66, Nummer 4 + +[67] +Prof. Dr. Emre Albrecht = Hof 2, Tisch 67, Nummer 1 + Olga Roth = Hof 2, Tisch 67, Nummer 2 +Dr. Jennifer Arnold = Hof 2, Tisch 67, Nummer 3 + Thomas Bianchi = Hof 2, Tisch 67, Nummer 4 + +[68] + Katrin Weber = Hof 2, Tisch 68, Nummer 1 +Dr. Kathrin Koch = Hof 2, Tisch 68, Nummer 2 +Dr. Julia Kuhn = Hof 2, Tisch 68, Nummer 3 + +[69] + Marija Tran = Hof 2, Tisch 69, Nummer 1 + Luca Werner = Hof 2, Tisch 69, Nummer 2 +Prof. Dr. Stefan Schmitt = Hof 2, Tisch 69, Nummer 3 + +[70] + Jan Zimmermann = Hof 2, Tisch 70, Nummer 1 + Markus Zimmermann = Hof 2, Tisch 70, Nummer 2 + Mia Zimmermann = Hof 2, Tisch 70, Nummer 3 + Svenja Zimmermann = Hof 2, Tisch 70, Nummer 4 + +[71] + Luca Kovac = Hof 2, Tisch 71, Nummer 1 +Dr. Dragana Krause = Hof 2, Tisch 71, Nummer 2 + Luca Ott = Hof 2, Tisch 71, Nummer 3 + +[72] + Dragana Lange = Hof 2, Tisch 72, Nummer 1 + Michael Lange = Hof 2, Tisch 72, Nummer 2 + Sofia Lange = Hof 2, Tisch 72, Nummer 3 + +[73] + Michael Franke = Hof 2, Tisch 73, Nummer 1 + Amira Franke = Hof 2, Tisch 73, Nummer 2 + Svenja Lange = Hof 2, Tisch 73, Nummer 3 + Jan Lange = Hof 2, Tisch 73, Nummer 4 + +[74] + Emma Krause = Hof 2, Tisch 74, Nummer 1 + Julia Krause = Hof 2, Tisch 74, Nummer 2 + Arda Krause = Hof 2, Tisch 74, Nummer 3 + Andreas Krause = Hof 2, Tisch 74, Nummer 4 + +[75] + Mia Pohl = Hof 2, Tisch 75, Nummer 1 + Theo Pohl = Hof 2, Tisch 75, Nummer 2 + Dragana Pohl = Hof 2, Tisch 75, Nummer 3 + Emre Pohl = Hof 2, Tisch 75, Nummer 4 + +[76] + Giovanna Stein = Hof 2, Tisch 76, Nummer 1 + Thomas Stein = Hof 2, Tisch 76, Nummer 2 + Emilia Stein = Hof 2, Tisch 76, Nummer 3 + Ben Stein = Hof 2, Tisch 76, Nummer 4 + +[77] +Dr. Nadine Berger = Hof 2, Tisch 77, Nummer 1 +Prof. Dr. Yusuf Ott = Hof 2, Tisch 77, Nummer 2 + Patrick Lehmann = Hof 2, Tisch 77, Nummer 3 + +[78] + Jennifer Dietrich = Hof 2, Tisch 78, Nummer 1 + Marco Dietrich = Hof 2, Tisch 78, Nummer 2 + Sofia Dietrich = Hof 2, Tisch 78, Nummer 3 + +[79] + Thomas Wolf = Hof 2, Tisch 79, Nummer 1 + Julia Wolf = Hof 2, Tisch 79, Nummer 2 + Emma Wolf = Hof 2, Tisch 79, Nummer 3 + Ben Wolf = Hof 2, Tisch 79, Nummer 4 + +[80] + Matthias Ott = Hof 2, Tisch 80, Nummer 1 + Hannah Ott = Hof 2, Tisch 80, Nummer 2 + Melanie Ott = Hof 2, Tisch 80, Nummer 3 + +[81] + Julia Franke = Hof 2, Tisch 81, Nummer 1 + Marco Franke = Hof 2, Tisch 81, Nummer 2 + Olga Franke = Hof 2, Tisch 81, Nummer 3 + +[82] + Christina Thiel = Hof 2, Tisch 82, Nummer 1 + Julia Thiel = Hof 2, Tisch 82, Nummer 2 + Yusuf Thiel = Hof 2, Tisch 82, Nummer 3 + +[83] + Matteo Neumann = Hof 2, Tisch 83, Nummer 1 + Lina Neumann = Hof 2, Tisch 83, Nummer 2 + Jennifer Neumann = Hof 2, Tisch 83, Nummer 3 + Thomas Neumann = Hof 2, Tisch 83, Nummer 4 + +[84] + Michael Horn = Hof 2, Tisch 84, Nummer 1 + Layla Horn = Hof 2, Tisch 84, Nummer 2 + Kathrin Horn = Hof 2, Tisch 84, Nummer 3 + Leon Horn = Hof 2, Tisch 84, Nummer 4 + +[85] + Thomas Hartmann = Hof 2, Tisch 85, Nummer 1 + Olga Hartmann = Hof 2, Tisch 85, Nummer 2 + Deniz Hartmann = Hof 2, Tisch 85, Nummer 3 + +[86] + Nadine Hartmann = Hof 2, Tisch 86, Nummer 1 + Marija Hartmann = Hof 2, Tisch 86, Nummer 2 + Olga Ott = Hof 2, Tisch 86, Nummer 3 + Daniel Ott = Hof 2, Tisch 86, Nummer 4 + +[87] + +[88] + Markus Polat = Hof 2, Tisch 88, Nummer 1 + Katrin Polat = Hof 2, Tisch 88, Nummer 2 + Stefanie Polat = Hof 2, Tisch 88, Nummer 3 + diff --git a/work/innenhoefe/Umfeld.svg b/work/innenhoefe/Umfeld.svg new file mode 100644 index 0000000..fb9a1e1 --- /dev/null +++ b/work/innenhoefe/Umfeld.svg @@ -0,0 +1,111 @@ + + + +Sommerfest — Umfeld/Grundriss: zwei trapezfoermige Innenhoefe (88 Vierertische, 300 Gaeste) + +Hof 1 (Tische 1-45) + +Hof 2 (Tische 46-88) + +Buehne — Band + +Tanzflaeche +Eingang West +Eingang Ost +Eingang Sued + + + + + + + + +VIP + +VIP + +VIP + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Umfeld.svg — Grundriss-Elemente (Buehne, Band, Tanzflaeche, Eingaenge) werden nicht mitoptimiert; VIP-Tische 5/6/7 vor der Buehne + \ No newline at end of file diff --git a/work/innenhoefe/bestellung.xml b/work/innenhoefe/bestellung.xml new file mode 100644 index 0000000..a08300b --- /dev/null +++ b/work/innenhoefe/bestellung.xml @@ -0,0 +1,1541 @@ + + + + + + + + Alexander + Grothe + Dr. h.c. + + + Beate + Grothe + + + Ferdinand + Kessler + Dr. + + + Viktoria + Kessler + + 5 + + + + + + Konstantin + Freiherr von Waldeck + Dr. + + + Antonia + Freifrau von Waldeck + + + Georg + Steinbach + + + Elisabeth + Steinbach + + 6 + + + + + + Heinrich + Dallmann + + + Margarete + Dallmann + + + Maximilian + Dallmann + + + Charlotte + Dallmann + + 7 + + + + + + Sandra + Bianchi + + + Thomas + Bianchi + + + Mia + Bianchi + + + + + + + Jennifer + Arnold + + + Patrick + Arnold + + + Leni + Arnold + + + Christian + Arnold + + + Mila + Arnold + + + + + + + Nicole + Seifert + + + Yusuf + Seifert + + + Leni + Seifert + + + Timo + Seifert + + + Elif + Seifert + + + + + + + Sarah + Albrecht + + + Andreas + Albrecht + + + + + + + Yusuf + Esposito + Prof. Dr. + + + Marija + Becker + + + Matthias + Kovac + + + + + + + Nicole + Kaya + + + Luca + Kaya + + + Christina + Kaya + + + + + + + Julia + Richter + Prof. Dr. + + + Jennifer + Haas + Dr. + + + Markus + Barth + + + Matthias + Petrov + + + Andreas + Weber + + + + + + + Giovanna + Schmidt + + + Matthias + Schmidt + + + Marie + Schmidt + + + + + + + Anja + Richter + + + Matthias + Richter + + + Greta + Richter + + + Anton + Richter + + + + + + + Emre + Albrecht + Prof. Dr. + + + Thomas + Bianchi + + + Olga + Roth + + + Olga + Klein + Dr. + + + Jennifer + Arnold + Dr. + + + + + + + Dennis + Werner + Prof. Dr. + + + Thomas + Hoffmann + Dr. + + + Olga + Tran + + + Anja + Seidel + Dr. + + + + + + + Markus + Stein + Prof. Dr. + + + Matthias + Popescu + + + + + + + Yusuf + Albrecht + Prof. Dr. + + + Svenja + Simon + + + + + + + Julia + Roth + Prof. Dr. + + + Thomas + Hansen + + + Nicole + Schmidt + + + Julia + Nguyen + + + Stefanie + Seifert + Dr. + + + Thomas + Winkler + + + Jan + Esposito + Dr. + + + + + + + Nicole + Becker + + + Jan + Becker + + + Sandra + Becker + + + + + + + Kathrin + Petrov + Prof. Dr. + + + Markus + Seidel + Dr. + + + Markus + Kraus + + + Giovanna + Petrov + + + Nadine + Stein + Dr. + + + Markus + Schmitt + + + Christian + Peters + + + + + + + Anja + Nguyen + + + Daniel + Nguyen + + + Sofia + Nguyen + + + + + + + Elif + Celik + + + Patrick + Celik + + + + + + + Stefanie + Klein + + + Milan + Klein + + + Lina + Klein + + + + + + + Olga + Busch + + + Emre + Busch + + + Marie + Busch + + + Michael + Busch + + + + + + + Stefan + Schmitt + Prof. Dr. + + + Marija + Tran + + + Kathrin + Koch + Dr. + + + Julia + Kuhn + Dr. + + + Katrin + Weber + + + Luca + Werner + + + + + + + Anja + Engel + + + Yusuf + Engel + + + Julia + Engel + + + Anton + Engel + + + Nicole + Engel + + + + + + + Emre + Ludwig + Prof. Dr. + + + Daniel + Krause + + + Nicole + Aksoy + + + Markus + Klein + + + + + + + Dennis + Schmitt + Prof. Dr. + + + Luca + Kovac + + + Dragana + Krause + Dr. + + + Luca + Ott + + + Patrick + Zimmermann + + + Stefan + Richter + + + + + + + Yusuf + Seidel + Prof. Dr. + + + Yusuf + Bauer + + + Jan + Bianchi + Dr. + + + Marco + Winkler + + + Emre + Klein + + + Patrick + Kaya + Dr. + + + Christina + Krause + Dr. + + + + + + + Nadine + Frank + + + Dennis + Frank + + + Marie + Frank + + + Finn + Frank + + + Lena + Frank + + + + + + + Sandra + Werner + + + Andreas + Werner + + + Nadine + Werner + + + Marco + Werner + + + + + + + Sarah + Roth + + + Christian + Roth + + + Sofia + Roth + + + + + + + Marco + Seifert + Prof. Dr. + + + Matthias + Krause + + + Giovanna + Schwarz + + + Yusuf + Weber + + + Patrick + Kraus + Dr. + + + Aylin + Ludwig + Dr. + + + + + + + Patrick + Hoffmann + Prof. Dr. + + + Marija + Polat + + + Nadine + Arnold + + + Marco + Richter + + + + + + + Dragana + Dietrich + Prof. Dr. + + + Michael + Aksoy + Dr. + + + Katrin + Werner + + + Patrick + Busch + + + Emre + Hoffmann + + + Sergej + Lange + + + + + + + Anja + Richter + Prof. Dr. + + + Jan + Thiel + Dr. + + + Thomas + Sahin + + + + + + + Sarah + Koch + + + Jan + Koch + + + Marie + Koch + + + Emil + Koch + + + Olga + Koch + + + Michael + Koch + + + + + + + Thomas + Tran + Prof. Dr. + + + Sergej + Petrov + + + Kathrin + Polat + + + Marija + Aksoy + + + + + + + Sergej + Ott + Prof. Dr. + + + Dragana + Bauer + + + Nicole + Peters + + + Nicole + Hansen + Dr. + + + Thomas + Krause + + + Patrick + Haas + + + + + + + Timo + Kaya + Prof. Dr. + + + Sandra + Demir + Dr. + + + + + + + Yusuf + Ott + Prof. Dr. + + + Nadine + Berger + Dr. + + + Patrick + Lehmann + + + + + + + Nicole + Wagner + + + Marco + Wagner + + + Sarah + Wagner + + + Henry + Wagner + + + + + + + Jennifer + Dietrich + + + Marco + Dietrich + + + Sofia + Dietrich + + + + + + + Julia + Thiel + + + Yusuf + Thiel + + + Christina + Thiel + + + + + + + Sarah + Schmitt + + + Markus + Schmitt + + + Sofia + Schmitt + + + + + + + Marija + Hartmann + + + Thomas + Hartmann + + + Olga + Hartmann + + + Deniz + Hartmann + + + Nadine + Hartmann + + + + + + + Melanie + Rossi + + + Luca + Rossi + + + Emilia + Rossi + + + + + + + Julia + Braun + + + Milan + Braun + + + Nadine + Braun + + + Jan + Braun + + + Dragana + Braun + + + Christian + Braun + + + + + + + Svenja + Zimmermann + + + Jan + Zimmermann + + + Mia + Zimmermann + + + Markus + Zimmermann + + + + + + + Julia + Krause + + + Andreas + Krause + + + Emma + Krause + + + Arda + Krause + + + + + + + Aylin + Nowak + + + Markus + Nowak + + + Lina + Nowak + + + Noah + Nowak + + + Kathrin + Nowak + + + Felix + Nowak + + + + + + + Kathrin + Horn + + + Michael + Horn + + + Layla + Horn + + + Leon + Horn + + + + + + + Melanie + Ott + + + Daniel + Ott + + + Olga + Ott + + + Matthias + Ott + + + Hannah + Ott + + + + + + + Jennifer + Neumann + + + Thomas + Neumann + + + Lina + Neumann + + + Matteo + Neumann + + + + + + + Julia + Wolf + + + Thomas + Wolf + + + Emma + Wolf + + + Ben + Wolf + + + + + + + Nadine + Aksoy + + + Thomas + Aksoy + + + Marie + Aksoy + + + Luca + Aksoy + + + Sofia + Aksoy + + + Sergej + Aksoy + + + + + + + Giovanna + Hansen + + + Markus + Hansen + + + Olga + Hansen + + + + + + + Stefanie + Polat + + + Stefan + Polat + + + Sarah + Polat + + + Markus + Polat + + + Katrin + Polat + + + + + + + Olga + Franke + + + Marco + Franke + + + Amira + Franke + + + Michael + Franke + + + Julia + Franke + + + + + + + Lena + Kovac + + + Tobias + Kovac + + + Marija + Kovac + + + Marco + Kovac + + + Anja + Kovac + + + Henry + Kovac + + + + + + + Lena + Winkler + + + Patrick + Winkler + + + + + + + Kathrin + Petrov + + + Milan + Petrov + + + + + + + Giovanna + Stein + + + Thomas + Stein + + + Emilia + Stein + + + Ben + Stein + + + + + + + Dragana + Pohl + + + Emre + Pohl + + + Mia + Pohl + + + Theo + Pohl + + + + + + + Svenja + Berger + + + Andreas + Berger + + + Jennifer + Berger + + + Anton + Berger + + + Layla + Berger + + + Stefan + Berger + + + + + + + Nadine + Barth + + + Timo + Barth + + + Lina + Barth + + + Patrick + Barth + + + + + + + Lena + Simon + + + Markus + Simon + + + Emma + Simon + + + Andreas + Simon + + + + + + + Dragana + Lange + + + Michael + Lange + + + Sofia + Lange + + + Jan + Lange + + + Svenja + Lange + + + + + + + Giovanna + Lehmann + + + Milan + Lehmann + + + Layla + Lehmann + + + Thomas + Lehmann + + + Nicole + Lehmann + + + Markus + Lehmann + + + + + + + Sarah + Maier + + + Christian + Maier + + + Olga + Maier + + + Arda + Maier + + + + + + + Nicole + Sahin + + + Markus + Sahin + + + Kathrin + Sahin + + + Patrick + Sahin + + + + + + + Giovanna + Ludwig + + + Emre + Ludwig + + + Elif + Ludwig + + + Elias + Ludwig + + + + + + + Julia + Weber + + + + diff --git a/work/innenhoefe/tische.ini b/work/innenhoefe/tische.ini new file mode 100644 index 0000000..c55f1dc --- /dev/null +++ b/work/innenhoefe/tische.ini @@ -0,0 +1,615 @@ +[1] +Nummer=1 +Hof=1 +Plaetze=4 +Nachbarliste=[2, 12] +Koordinaten=(0,0) + +[2] +Nummer=2 +Hof=1 +Plaetze=4 +Nachbarliste=[1, 3, 12, 13] +Koordinaten=(1,0) + +[3] +Nummer=3 +Hof=1 +Plaetze=4 +Nachbarliste=[2, 4, 13, 14] +Koordinaten=(2,0) + +[4] +Nummer=4 +Hof=1 +Plaetze=4 +Nachbarliste=[3, 5, 14, 15] +Koordinaten=(3,0) + +[5] +Nummer=5 +Hof=1 +Plaetze=4 +Nachbarliste=[4, 6, 15, 16] +Koordinaten=(4,0) + +[6] +Nummer=6 +Hof=1 +Plaetze=4 +Nachbarliste=[5, 7, 16, 17] +Koordinaten=(5,0) + +[7] +Nummer=7 +Hof=1 +Plaetze=4 +Nachbarliste=[6, 8, 17, 18] +Koordinaten=(6,0) + +[8] +Nummer=8 +Hof=1 +Plaetze=4 +Nachbarliste=[7, 9, 18, 19] +Koordinaten=(7,0) + +[9] +Nummer=9 +Hof=1 +Plaetze=4 +Nachbarliste=[8, 10, 19, 20] +Koordinaten=(8,0) + +[10] +Nummer=10 +Hof=1 +Plaetze=4 +Nachbarliste=[9, 11, 20, 21] +Koordinaten=(9,0) + +[11] +Nummer=11 +Hof=1 +Plaetze=4 +Nachbarliste=[10, 21] +Koordinaten=(10,0) + +[12] +Nummer=12 +Hof=1 +Plaetze=4 +Nachbarliste=[1, 2, 13, 22] +Koordinaten=(0.5,1) + +[13] +Nummer=13 +Hof=1 +Plaetze=4 +Nachbarliste=[2, 3, 12, 14, 22, 23] +Koordinaten=(1.5,1) + +[14] +Nummer=14 +Hof=1 +Plaetze=4 +Nachbarliste=[3, 4, 13, 15, 23, 24] +Koordinaten=(2.5,1) + +[15] +Nummer=15 +Hof=1 +Plaetze=4 +Nachbarliste=[4, 5, 14, 16, 24, 25] +Koordinaten=(3.5,1) + +[16] +Nummer=16 +Hof=1 +Plaetze=4 +Nachbarliste=[5, 6, 15, 17, 25, 26] +Koordinaten=(4.5,1) + +[17] +Nummer=17 +Hof=1 +Plaetze=4 +Nachbarliste=[6, 7, 16, 18, 26, 27] +Koordinaten=(5.5,1) + +[18] +Nummer=18 +Hof=1 +Plaetze=4 +Nachbarliste=[7, 8, 17, 19, 27, 28] +Koordinaten=(6.5,1) + +[19] +Nummer=19 +Hof=1 +Plaetze=4 +Nachbarliste=[8, 9, 18, 20, 28, 29] +Koordinaten=(7.5,1) + +[20] +Nummer=20 +Hof=1 +Plaetze=4 +Nachbarliste=[9, 10, 19, 21, 29, 30] +Koordinaten=(8.5,1) + +[21] +Nummer=21 +Hof=1 +Plaetze=4 +Nachbarliste=[10, 11, 20, 30] +Koordinaten=(9.5,1) + +[22] +Nummer=22 +Hof=1 +Plaetze=4 +Nachbarliste=[12, 13, 23, 31] +Koordinaten=(1,2) + +[23] +Nummer=23 +Hof=1 +Plaetze=4 +Nachbarliste=[13, 14, 22, 24, 31, 32] +Koordinaten=(2,2) + +[24] +Nummer=24 +Hof=1 +Plaetze=4 +Nachbarliste=[14, 15, 23, 25, 32, 33] +Koordinaten=(3,2) + +[25] +Nummer=25 +Hof=1 +Plaetze=4 +Nachbarliste=[15, 16, 24, 26, 33, 34] +Koordinaten=(4,2) + +[26] +Nummer=26 +Hof=1 +Plaetze=4 +Nachbarliste=[16, 17, 25, 27, 34, 35] +Koordinaten=(5,2) + +[27] +Nummer=27 +Hof=1 +Plaetze=4 +Nachbarliste=[17, 18, 26, 28, 35, 36] +Koordinaten=(6,2) + +[28] +Nummer=28 +Hof=1 +Plaetze=4 +Nachbarliste=[18, 19, 27, 29, 36, 37] +Koordinaten=(7,2) + +[29] +Nummer=29 +Hof=1 +Plaetze=4 +Nachbarliste=[19, 20, 28, 30, 37, 38] +Koordinaten=(8,2) + +[30] +Nummer=30 +Hof=1 +Plaetze=4 +Nachbarliste=[20, 21, 29, 38] +Koordinaten=(9,2) + +[31] +Nummer=31 +Hof=1 +Plaetze=4 +Nachbarliste=[22, 23, 32, 39] +Koordinaten=(1.5,3) + +[32] +Nummer=32 +Hof=1 +Plaetze=4 +Nachbarliste=[23, 24, 31, 33, 39, 40] +Koordinaten=(2.5,3) + +[33] +Nummer=33 +Hof=1 +Plaetze=4 +Nachbarliste=[24, 25, 32, 34, 40, 41] +Koordinaten=(3.5,3) + +[34] +Nummer=34 +Hof=1 +Plaetze=4 +Nachbarliste=[25, 26, 33, 35, 41, 42] +Koordinaten=(4.5,3) + +[35] +Nummer=35 +Hof=1 +Plaetze=4 +Nachbarliste=[26, 27, 34, 36, 42, 43] +Koordinaten=(5.5,3) + +[36] +Nummer=36 +Hof=1 +Plaetze=4 +Nachbarliste=[27, 28, 35, 37, 43, 44] +Koordinaten=(6.5,3) + +[37] +Nummer=37 +Hof=1 +Plaetze=4 +Nachbarliste=[28, 29, 36, 38, 44, 45] +Koordinaten=(7.5,3) + +[38] +Nummer=38 +Hof=1 +Plaetze=4 +Nachbarliste=[29, 30, 37, 45] +Koordinaten=(8.5,3) + +[39] +Nummer=39 +Hof=1 +Plaetze=4 +Nachbarliste=[31, 32, 40] +Koordinaten=(2,4) + +[40] +Nummer=40 +Hof=1 +Plaetze=4 +Nachbarliste=[32, 33, 39, 41] +Koordinaten=(3,4) + +[41] +Nummer=41 +Hof=1 +Plaetze=4 +Nachbarliste=[33, 34, 40, 42] +Koordinaten=(4,4) + +[42] +Nummer=42 +Hof=1 +Plaetze=4 +Nachbarliste=[34, 35, 41, 43] +Koordinaten=(5,4) + +[43] +Nummer=43 +Hof=1 +Plaetze=4 +Nachbarliste=[35, 36, 42, 44] +Koordinaten=(6,4) + +[44] +Nummer=44 +Hof=1 +Plaetze=4 +Nachbarliste=[36, 37, 43, 45] +Koordinaten=(7,4) + +[45] +Nummer=45 +Hof=1 +Plaetze=4 +Nachbarliste=[37, 38, 44] +Koordinaten=(8,4) + +[46] +Nummer=46 +Hof=2 +Plaetze=4 +Nachbarliste=[47, 57] +Koordinaten=(16,0) + +[47] +Nummer=47 +Hof=2 +Plaetze=4 +Nachbarliste=[46, 48, 57, 58] +Koordinaten=(17,0) + +[48] +Nummer=48 +Hof=2 +Plaetze=4 +Nachbarliste=[47, 49, 58, 59] +Koordinaten=(18,0) + +[49] +Nummer=49 +Hof=2 +Plaetze=4 +Nachbarliste=[48, 50, 59, 60] +Koordinaten=(19,0) + +[50] +Nummer=50 +Hof=2 +Plaetze=4 +Nachbarliste=[49, 51, 60, 61] +Koordinaten=(20,0) + +[51] +Nummer=51 +Hof=2 +Plaetze=4 +Nachbarliste=[50, 52, 61, 62] +Koordinaten=(21,0) + +[52] +Nummer=52 +Hof=2 +Plaetze=4 +Nachbarliste=[51, 53, 62, 63] +Koordinaten=(22,0) + +[53] +Nummer=53 +Hof=2 +Plaetze=4 +Nachbarliste=[52, 54, 63, 64] +Koordinaten=(23,0) + +[54] +Nummer=54 +Hof=2 +Plaetze=4 +Nachbarliste=[53, 55, 64, 65] +Koordinaten=(24,0) + +[55] +Nummer=55 +Hof=2 +Plaetze=4 +Nachbarliste=[54, 56, 65, 66] +Koordinaten=(25,0) + +[56] +Nummer=56 +Hof=2 +Plaetze=4 +Nachbarliste=[55, 66] +Koordinaten=(26,0) + +[57] +Nummer=57 +Hof=2 +Plaetze=4 +Nachbarliste=[46, 47, 58, 67] +Koordinaten=(16.5,1) + +[58] +Nummer=58 +Hof=2 +Plaetze=4 +Nachbarliste=[47, 48, 57, 59, 67, 68] +Koordinaten=(17.5,1) + +[59] +Nummer=59 +Hof=2 +Plaetze=4 +Nachbarliste=[48, 49, 58, 60, 68, 69] +Koordinaten=(18.5,1) + +[60] +Nummer=60 +Hof=2 +Plaetze=4 +Nachbarliste=[49, 50, 59, 61, 69, 70] +Koordinaten=(19.5,1) + +[61] +Nummer=61 +Hof=2 +Plaetze=4 +Nachbarliste=[50, 51, 60, 62, 70, 71] +Koordinaten=(20.5,1) + +[62] +Nummer=62 +Hof=2 +Plaetze=4 +Nachbarliste=[51, 52, 61, 63, 71, 72] +Koordinaten=(21.5,1) + +[63] +Nummer=63 +Hof=2 +Plaetze=4 +Nachbarliste=[52, 53, 62, 64, 72, 73] +Koordinaten=(22.5,1) + +[64] +Nummer=64 +Hof=2 +Plaetze=4 +Nachbarliste=[53, 54, 63, 65, 73, 74] +Koordinaten=(23.5,1) + +[65] +Nummer=65 +Hof=2 +Plaetze=4 +Nachbarliste=[54, 55, 64, 66, 74, 75] +Koordinaten=(24.5,1) + +[66] +Nummer=66 +Hof=2 +Plaetze=4 +Nachbarliste=[55, 56, 65, 75] +Koordinaten=(25.5,1) + +[67] +Nummer=67 +Hof=2 +Plaetze=4 +Nachbarliste=[57, 58, 68, 76] +Koordinaten=(17,2) + +[68] +Nummer=68 +Hof=2 +Plaetze=4 +Nachbarliste=[58, 59, 67, 69, 76, 77] +Koordinaten=(18,2) + +[69] +Nummer=69 +Hof=2 +Plaetze=4 +Nachbarliste=[59, 60, 68, 70, 77, 78] +Koordinaten=(19,2) + +[70] +Nummer=70 +Hof=2 +Plaetze=4 +Nachbarliste=[60, 61, 69, 71, 78, 79] +Koordinaten=(20,2) + +[71] +Nummer=71 +Hof=2 +Plaetze=4 +Nachbarliste=[61, 62, 70, 72, 79, 80] +Koordinaten=(21,2) + +[72] +Nummer=72 +Hof=2 +Plaetze=4 +Nachbarliste=[62, 63, 71, 73, 80, 81] +Koordinaten=(22,2) + +[73] +Nummer=73 +Hof=2 +Plaetze=4 +Nachbarliste=[63, 64, 72, 74, 81, 82] +Koordinaten=(23,2) + +[74] +Nummer=74 +Hof=2 +Plaetze=4 +Nachbarliste=[64, 65, 73, 75, 82, 83] +Koordinaten=(24,2) + +[75] +Nummer=75 +Hof=2 +Plaetze=4 +Nachbarliste=[65, 66, 74, 83] +Koordinaten=(25,2) + +[76] +Nummer=76 +Hof=2 +Plaetze=4 +Nachbarliste=[67, 68, 77] +Koordinaten=(17.5,3) + +[77] +Nummer=77 +Hof=2 +Plaetze=4 +Nachbarliste=[68, 69, 76, 78, 84] +Koordinaten=(18.5,3) + +[78] +Nummer=78 +Hof=2 +Plaetze=4 +Nachbarliste=[69, 70, 77, 79, 84, 85] +Koordinaten=(19.5,3) + +[79] +Nummer=79 +Hof=2 +Plaetze=4 +Nachbarliste=[70, 71, 78, 80, 85, 86] +Koordinaten=(20.5,3) + +[80] +Nummer=80 +Hof=2 +Plaetze=4 +Nachbarliste=[71, 72, 79, 81, 86, 87] +Koordinaten=(21.5,3) + +[81] +Nummer=81 +Hof=2 +Plaetze=4 +Nachbarliste=[72, 73, 80, 82, 87, 88] +Koordinaten=(22.5,3) + +[82] +Nummer=82 +Hof=2 +Plaetze=4 +Nachbarliste=[73, 74, 81, 83, 88] +Koordinaten=(23.5,3) + +[83] +Nummer=83 +Hof=2 +Plaetze=4 +Nachbarliste=[74, 75, 82] +Koordinaten=(24.5,3) + +[84] +Nummer=84 +Hof=2 +Plaetze=4 +Nachbarliste=[77, 78, 85] +Koordinaten=(19,4) + +[85] +Nummer=85 +Hof=2 +Plaetze=4 +Nachbarliste=[78, 79, 84, 86] +Koordinaten=(20,4) + +[86] +Nummer=86 +Hof=2 +Plaetze=4 +Nachbarliste=[79, 80, 85, 87] +Koordinaten=(21,4) + +[87] +Nummer=87 +Hof=2 +Plaetze=4 +Nachbarliste=[80, 81, 86, 88] +Koordinaten=(22,4) + +[88] +Nummer=88 +Hof=2 +Plaetze=4 +Nachbarliste=[81, 82, 87] +Koordinaten=(23,4)