Files
platz/doc/dateiformate.md
Michael Stangl 9de80d2f2a Web-M1-Ausbau: JSON-Gaesteliste, GA-Verlauf, Python-Serversteuerung, tische.ini-Upload
- bestellung.xml -> bestellung.json: neuer JSONConfig (loest XMLConfig ab),
  alle work-Beispiele konvertiert, Doku (CLAUDE/README/dateiformate) umgestellt
- ga.py: Beobachtungsobjekt Entwicklung zeichnet den Loesungsverlauf auf,
  neuer Schalter --show-development erzeugt Entwicklung.svg (beste/mittlere/
  schlechteste Wertigkeit ueber die Zyklus-Aktionen)
- web/main.py: neuer Endpunkt /tische-datei (tische.ini-Upload, ast.literal_eval),
  Frontend kann jetzt eine tische.ini laden
- libs/webserver.py: plattformunabhaengige start/stop/status-Steuerung der
  Web-Testinstanz (ersetzt run_web_helper.ps1), raeumt auch verwaiste
  --reload-Prozessbaeume zuverlaessig auf
- Sicherheit/Modernisierung: eval() -> ast.literal_eval in Tische/Strafliste,
  sicherer Mini-Auswerter fuer die String-Ausdruecke in zyklus.cfg,
  defaultdict(set) in Plaetze
- SVG: Tischnummer fett zentriert im Tischkreis statt "Tisch x" darueber
- Tests: JSONConfig, Entwicklung und der Zyklus-Auswerter abgedeckt (9 Tests)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-11 12:49:42 +02:00

5.5 KiB

Dateiformate

Referenz fuer die Eingabe- und Ausgabedateien eines platz-Laufs, mit Beispielen aus work/test1/ und work/test2/.

Alle vier Dateien liegen unter dem mit --indir <dir> angegebenen Verzeichnis (z.B. work/test1/ oder work/test2/) unter festen Namen: tische.ini, bestellung.json als Eingabe, TischePersonen.txt und PersonenTische.csv als Ausgabe. Beispielaufruf:

bin/platz.sh --indir work/test1

Tischaufstellung: tische.ini

Ein INI-File mit einer Sektion pro Tisch. Sektionsname ist die Tisch-Id.

Schluessel Bedeutung
Nummer Anzeigenummer des Tisches
Hof Hof/Bereich, in dem der Tisch steht
Plaetze Anzahl der Sitzplaetze am Tisch
Nachbarliste Python-Liste der Ids benachbarter Tische
Koordinaten (x,y)-Tupel fuer die Position des Tisches

Beispiel aus work/test2/tische.ini (eine Reihe von fuenf Tischen, jeder mit seinen direkten Nachbarn verkettet):

[1]
Nummer=1
Hof=1
Plaetze=3
Nachbarliste=[2]
Koordinaten=(1,1)

[2]
Nummer=2
Hof=1
Plaetze=5
Nachbarliste=[1,3]
Koordinaten=(2,1)

[3]
Nummer=3
Hof=1
Plaetze=3
Nachbarliste=[2,4]
Koordinaten=(3,1)

[4]
Nummer=4
Hof=1
Plaetze=4
Nachbarliste=[3,5]
Koordinaten=(4,1)

[5]
Nummer=5
Hof=1
Plaetze=4
Nachbarliste=[4]
Koordinaten=(5,1)

Werte wie Nachbarliste und Koordinaten werden mit eval() geladen (siehe Tische.laden() in libs/Strukturdaten.py) — es steht also echter Python-Ausdruckscode im File, keine reine INI-Syntax.

Gaesteliste: bestellung.json

Ein JSON-Objekt mit dem Schluessel "gruppen", einer Liste von Gruppen-Objekten. Jede Gruppe enthaelt:

  • "personen": Liste von Personen-Objekten mit "vorname", "nachname" und optionalem "titel" (Pflicht: Vor- und Nachname)
  • optional "name": Anzeigename der Gruppe (z.B. "Familie Huber"); nur fuer Ausgabe und Web-Anzeige, nicht fuer die Optimierung relevant
  • optional "anzahl": N, um jede Person der Gruppe zu einer Sammelbuchung von N (gleichnamigen) Buchungen zu vervielfaeltigen — praktisch fuer anonyme Kontingente
  • optional "tisch": Tisch-Id, um die Gruppe als VIP-Gruppe fest an diesen Tisch zu binden (sie wird dann nicht vom GA platziert)

Geladen wird das File von JSONConfig in libs/Strukturdaten.py (Nachfolger des frueheren XMLConfig; das alte bestellung.xml-Format wurde vollstaendig durch JSON abgeloest). Die Datei sollte UTF-8 sein; ein evtl. vorhandenes BOM (Excel) wird geschluckt.

Minimalbeispiel mit Sammelbuchungen, aus work/test1/bestellung.json:

{
  "gruppen": [
    {
      "anzahl": 10,
      "personen": [
        { "vorname": "A", "nachname": "AA", "titel": "Dipl. Ing." }
      ]
    },
    {
      "anzahl": 4,
      "personen": [
        { "vorname": "B", "nachname": "BB", "titel": "Prof." }
      ]
    },
    {
      "anzahl": 5,
      "personen": [
        { "vorname": "C", "nachname": "CC", "titel": "Dr." }
      ]
    }
  ]
}

Umfangreicheres Beispiel mit benannten Gruppen und einer VIP-Gruppe, aus work/test2/bestellung.json:

{
  "gruppen": [
    {
      "name": "einfache Gruppe aus drei Personen mit festem Wunsch fuer einen Tisch",
      "tisch": 1,
      "personen": [
        { "vorname": "Michael", "nachname": "Stangl", "titel": "Dipl. Ing." },
        { "vorname": "Magnus", "nachname": "Mueller", "titel": "Professor" },
        { "vorname": "Bernd Robert", "nachname": "Hoehn", "titel": "Professor" }
      ]
    },
    {
      "name": "einfache Gruppe aus zwei Personen",
      "personen": [
        { "vorname": "Heinz", "nachname": "Bruegge" },
        { "vorname": "Hubert", "nachname": "K" }
      ]
    },
    {
      "name": "Gruppe aus drei anonymen Personen",
      "anzahl": 3,
      "personen": [
        { "vorname": "Bestelli", "nachname": "Bloedkopf" }
      ]
    }
  ]
}

Die erste Gruppe hier ist per "tisch": 1 fest an Tisch 1 gebunden (VIP-Gruppe); die letzte Gruppe erzeugt ueber "anzahl": 3 drei gleichnamige "Bestelli Bloedkopf" Buchungen.

Fuer den Web-Weg (Meilenstein 1) gibt es zusaetzlich einen CSV-Import (libs/CSVConfig.py, Spalten Vorname;Nachname;Titel;Gruppe;Tisch;Anzahl) — inhaltlich aequivalent, nur flach statt verschachtelt.

Ausgabe: TischePersonen.txt

Eine Sektion pro Tisch ([Tischid]), darunter eine Zeile pro Sitzplatz:

[1]
Dipl. Ing. A AA = Hof 1, Tisch 1, Nummer 1
Dipl. Ing. A AA = Hof 1, Tisch 1, Nummer 2
Dipl. Ing. A AA = Hof 1, Tisch 1, Nummer 3
Dipl. Ing. A AA = Hof 1, Tisch 1, Nummer 4
Dipl. Ing. A AA = Hof 1, Tisch 1, Nummer 5

[2]
Dipl. Ing. A AA = Hof 1, Tisch 2, Nummer 1
...

Format je Zeile: Titel Vorname Nachname = Hof <Hof>, Tisch <Nummer>, Nummer <Platznummer>.

Ausgabe: PersonenTische.csv

Dieselben Sitzplatzdaten, aber eine Zeile pro Person statt pro Tisch, alphabetisch nach Nachname sortiert:

AA, A, Dipl. Ing. = Hof 1, Tisch 1, Nummer 2
AA, A, Dipl. Ing. = Hof 1, Tisch 1, Nummer 3
...
BB, B, Prof. = Hof 1, Tisch 3, Nummer 2
...
CC, C, Dr. = Hof 1, Tisch 4, Nummer 2
...

Format je Zeile: Nachname, Vorname, Titel = Hof <Hof>, Tisch <Nummer>, Nummer <Platznummer>.

Zyklus- und Strafenkonfiguration

Siehe cfg/zyklus.cfg und cfg/strafen.cfg sowie die Beschreibung in CLAUDE.md / README.md fuer das Format der GA-Ablaufsteuerung (Abfolge/Anzahl) und der Strafpunkte-Tabelle.