SVG-Farbprofile: --farben mit palette- und kategorien-Modus

Neues Modul libs/Farben.py mit Farbschema, das Gruppen Farben zuordnet,
gesteuert durch Profile aus cfg/farben.cfg. Zwei Modi: "palette" (Farbliste
zyklisch je Gruppe, Profil grosse_gruppen) und "kategorien" (Hochzeit:
Familie/Verein/VIP getrennt ueber Farbverlaeufe, Profil hochzeit).

Sitzplatzverteilung.alsSVG bekommt Parameter Farbschema; Farben werden nun
fest fuer die vollstaendige Gruppenliste (nach Id) vergeben statt lazy in
Zeichenreihenfolge, damit jede Gruppe variantenuebergreifend dieselbe Farbe
hat. platz.py bekommt Schalter --farben (Vorgabe grosse_gruppen).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Michael Stangl
2026-07-27 10:10:10 +02:00
parent d4844ded67
commit d19913a53d
4 changed files with 243 additions and 14 deletions
+21 -13
View File
@@ -608,7 +608,7 @@ class Sitzplatzverteilung:
'#dcbeff', '#9a6324', '#800000', '#aaffc3', '#000075' ]
def alsSVG(self, OutputSVG, PersonenRadius=12, Puffer=10, Verbindungen=True,
GruppenNamen=None):
GruppenNamen=None, Farbschema=None):
"""Zeichnet die Sitzplatzverteilung als SVG:
Tische werden als weisse Kreise dargestellt, Personen als
@@ -632,7 +632,7 @@ class Sitzplatzverteilung:
def GruppenName(G):
if G is None:
return 'VIP / feste Platzierung'
return 'fixiert'
return GruppenNamen.get( G.Id, 'Gruppe %s' % G.Id )
def PersonName(P):
@@ -685,20 +685,29 @@ class Sitzplatzverteilung:
except KeyError:
return None
GidZuFarbe = {}
# Feste Gruppenfarben: einmal fuer die vollstaendige Gruppenliste (nach
# Gruppen-Id) vergeben - NICHT lazy nach der Sitz-Reihenfolge. Da alle
# Varianten dieselbe Gruppenmenge mit denselben Ids teilen, hat so jede
# Gruppe in jeder Variante (und ueber Laeufe hinweg) dieselbe Farbe.
# Mit Farbschema (aus farben.cfg) kommen die Farben von dort (z.B. nach
# Familie/Verein/VIP getrennt); ohne dient die eingebaute Palette als
# Rueckfall (zyklisch je Gruppe).
if Farbschema is not None:
GidZuFarbe, VIPFarbe = Farbschema.farben( self.Gruppen )
else:
GidZuFarbe = {}
for Index, G in enumerate( sorted( self.Gruppen, key=lambda g: g.Id ) ):
GidZuFarbe[G.Id] = self.SVGGruppenFarben[
Index % len(self.SVGGruppenFarben) ]
VIPFarbe = '#888888'
def FarbeVonGruppe(G):
if G is None:
return '#888888'
if G.Id not in GidZuFarbe:
Index = len(GidZuFarbe) % len(self.SVGGruppenFarben)
GidZuFarbe[G.Id] = self.SVGGruppenFarben[Index]
return GidZuFarbe[G.Id]
return VIPFarbe # VIP / feste Platzierung (ohne GA-Gruppe)
return GidZuFarbe.get( G.Id, VIPFarbe )
# Fuer jede Gruppe pro Tisch den Mittelpunkt (Zentroid) ihrer
# an diesem Tisch sitzenden Personenkreise sammeln. Die Reihenfolge
# der Iteration (Tische, darin Personen) stimmt mit der spaeteren
# Zeichenschleife ueberein, damit die per FarbeVonGruppe() lazy
# vergebenen Farben konsistent sind.
# an diesem Tisch sitzenden Personenkreise sammeln (fuer die
# Verbindungslinien getrennter Gruppen).
GidZuTischZentroiden = {}
for T in self.Tische:
Mx, My = TischMitte(T)
@@ -713,7 +722,6 @@ class Sitzplatzverteilung:
G = GruppeVonPerson(P)
if G is None:
continue
FarbeVonGruppe(G) # Farbe frueh (aber in Zeichenreihenfolge) festlegen
sx, sy, cnt = GidZuSummen.get( G.Id, (0.0, 0.0, 0) )
GidZuSummen[G.Id] = (sx + Px, sy + Py, cnt + 1)
for Gid, (sx, sy, cnt) in GidZuSummen.items():