alles neu mit black formatiert. handler_context.py impl. um weniger Übergabeparameter zu haben
This commit is contained in:
@@ -0,0 +1,214 @@
|
||||
"""
|
||||
Handler Context für DXF-Elementgenerierung.
|
||||
Vereinfacht die Aufrufe der handle-Funktionen und bietet Debug-Unterstützung.
|
||||
"""
|
||||
|
||||
|
||||
class HandlerContext:
|
||||
"""
|
||||
Kontextobjekt für Handler-Funktionsaufrufe.
|
||||
|
||||
Speichert alle Parameter für handle-Funktionen und bietet:
|
||||
- Vereinfachte Aufrufe
|
||||
- Schöne String-Repräsentation für Debugging
|
||||
- Einfachen Zugriff auf alle Parameter
|
||||
"""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
msp,
|
||||
teileid,
|
||||
merkmale,
|
||||
x,
|
||||
y,
|
||||
doc,
|
||||
lib_doc,
|
||||
verbose=False,
|
||||
symbols=None,
|
||||
strecken_nachbarn=None,
|
||||
config=None,
|
||||
config_allgemein=None,
|
||||
):
|
||||
self.msp = msp
|
||||
self.teileid = teileid
|
||||
self.merkmale = merkmale if merkmale is not None else {}
|
||||
self.x = x
|
||||
self.y = y
|
||||
self.doc = doc
|
||||
self.lib_doc = lib_doc
|
||||
self.verbose = verbose
|
||||
self.symbols = symbols if symbols is not None else []
|
||||
self.strecken_nachbarn = (
|
||||
strecken_nachbarn if strecken_nachbarn is not None else []
|
||||
)
|
||||
self.config = config
|
||||
self.config_allgemein = config_allgemein
|
||||
|
||||
def call(self, handler_func):
|
||||
"""
|
||||
Ruft eine Handler-Funktion mit allen gespeicherten Parametern auf.
|
||||
|
||||
Args:
|
||||
handler_func: Die Handler-Funktion (z.B. handle_ils_2_0_kreisel)
|
||||
|
||||
Returns:
|
||||
Rückgabewert der Handler-Funktion
|
||||
"""
|
||||
return handler_func(
|
||||
self.msp,
|
||||
self.teileid,
|
||||
self.merkmale,
|
||||
self.x,
|
||||
self.y,
|
||||
self.doc,
|
||||
self.lib_doc,
|
||||
self.verbose,
|
||||
self.symbols,
|
||||
self.strecken_nachbarn,
|
||||
self.config,
|
||||
self.config_allgemein,
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
"""String-Repräsentation für Debugging."""
|
||||
lines = [
|
||||
"=" * 80,
|
||||
"HandlerContext:",
|
||||
"=" * 80,
|
||||
f"TeileId: {self.teileid}",
|
||||
f"Position: x={self.x:.2f}, y={self.y:.2f}",
|
||||
f"Verbose: {self.verbose}",
|
||||
"-" * 80,
|
||||
"Merkmale:",
|
||||
]
|
||||
|
||||
if self.merkmale:
|
||||
for key, value in self.merkmale.items():
|
||||
lines.append(f" {key:20s}: {value}")
|
||||
else:
|
||||
lines.append(" (keine)")
|
||||
|
||||
lines.append("-" * 80)
|
||||
lines.append(f"Symbols: {len(self.symbols)} Einträge")
|
||||
if self.symbols:
|
||||
for i, sym in enumerate(self.symbols, 1):
|
||||
lines.append(f" [{i}] {sym}")
|
||||
|
||||
lines.append("-" * 80)
|
||||
lines.append(f"Nachbarn: {len(self.strecken_nachbarn)} Einträge")
|
||||
|
||||
lines.append("-" * 80)
|
||||
lines.append(f"doc: {type(self.doc).__name__}")
|
||||
lines.append(
|
||||
f"lib_doc: {type(self.lib_doc).__name__ if self.lib_doc else 'None'}"
|
||||
)
|
||||
lines.append(f"msp: {type(self.msp).__name__}")
|
||||
lines.append(f"config: {'vorhanden' if self.config else 'None'}")
|
||||
lines.append(f"config_allg: {'vorhanden' if self.config_allgemein else 'None'}")
|
||||
lines.append("=" * 80)
|
||||
|
||||
return "\n".join(lines)
|
||||
|
||||
def __repr__(self):
|
||||
"""Kurze Repräsentation."""
|
||||
return (
|
||||
f"HandlerContext(teileid={self.teileid!r}, "
|
||||
f"x={self.x:.2f}, y={self.y:.2f}, "
|
||||
f"merkmale={len(self.merkmale)} items)"
|
||||
)
|
||||
|
||||
def to_dict(self):
|
||||
"""
|
||||
Gibt alle Parameter als Dictionary zurück (ohne Objekt-Referenzen).
|
||||
Nützlich für Logging oder Serialisierung.
|
||||
"""
|
||||
return {
|
||||
"teileid": self.teileid,
|
||||
"x": self.x,
|
||||
"y": self.y,
|
||||
"verbose": self.verbose,
|
||||
"merkmale": self.merkmale.copy(),
|
||||
"symbols_count": len(self.symbols),
|
||||
"symbols": self.symbols,
|
||||
"nachbarn_count": len(self.strecken_nachbarn),
|
||||
"has_config": self.config is not None,
|
||||
"has_config_allgemein": self.config_allgemein is not None,
|
||||
"has_lib_doc": self.lib_doc is not None,
|
||||
}
|
||||
|
||||
@property
|
||||
def position(self):
|
||||
"""Gibt Position als Tuple zurück."""
|
||||
return (self.x, self.y)
|
||||
|
||||
@property
|
||||
def has_library(self):
|
||||
"""Prüft, ob eine Bibliothek verfügbar ist."""
|
||||
return self.lib_doc is not None
|
||||
|
||||
def get_merkmal(self, key, default=None):
|
||||
"""
|
||||
Holt ein Merkmal mit Fallback-Wert.
|
||||
|
||||
Args:
|
||||
key: Merkmal-Schlüssel
|
||||
default: Standardwert, falls Merkmal nicht existiert
|
||||
|
||||
Returns:
|
||||
Merkmalwert oder default
|
||||
"""
|
||||
return self.merkmale.get(key, default)
|
||||
|
||||
|
||||
def create_context_from_row(
|
||||
row,
|
||||
msp,
|
||||
doc,
|
||||
lib_doc,
|
||||
strecken_nachbarn,
|
||||
config,
|
||||
config_allgemein,
|
||||
symbols=None,
|
||||
verbose=False,
|
||||
):
|
||||
"""
|
||||
Factory-Funktion: Erstellt HandlerContext aus einer CSV-Zeile.
|
||||
|
||||
Args:
|
||||
row: Dictionary mit CSV-Daten
|
||||
msp: Modelspace
|
||||
doc: DXF-Dokument
|
||||
lib_doc: Bibliotheks-Dokument
|
||||
strecken_nachbarn: Liste der Nachbarn
|
||||
config: Config-Parser
|
||||
config_allgemein: Allgemeine Config
|
||||
symbols: Symbol-Liste (optional)
|
||||
verbose: Debug-Modus (optional)
|
||||
|
||||
Returns:
|
||||
HandlerContext-Instanz
|
||||
"""
|
||||
from arbeiten_mit_csv import parse_merkmale, extract_coords
|
||||
|
||||
bezeichner = row["Bezeichnung"].strip()
|
||||
teileid = row["TeileId"].strip()
|
||||
planquadrat = row["Planquadrat"]
|
||||
merkmale = parse_merkmale(row.get("Merkmale", ""))
|
||||
merkmale["bezeichner"] = bezeichner
|
||||
|
||||
x, y = extract_coords(planquadrat)
|
||||
|
||||
return HandlerContext(
|
||||
msp=msp,
|
||||
teileid=teileid,
|
||||
merkmale=merkmale,
|
||||
x=x,
|
||||
y=y,
|
||||
doc=doc,
|
||||
lib_doc=lib_doc,
|
||||
verbose=verbose,
|
||||
symbols=symbols if symbols is not None else [],
|
||||
strecken_nachbarn=strecken_nachbarn,
|
||||
config=config,
|
||||
config_allgemein=config_allgemein,
|
||||
)
|
||||
Reference in New Issue
Block a user