feat: HW Planung - Symbole erzeugen, Nummerierung, Ausgabeziel-Dialog
- Symbole erzeugen (HW_SYMBOLE, Einzelbefehle HW_SYM_*): Bauteile nach cfg/io_regeln.json (reduzierte Kopie aus kabellaengen), Symbole aus cfg/hw_symbole.json katalog-identisch nachgebaut (lib/hw_symbole.py), REALE_POSITION mit x auf dem Bauteil, Paare uebereinander, Ausweichen in y ohne Ueberlappung - Symbole nummerieren (HW_NUMMERIEREN): lib/create_numbers.py samt error_collector.py und cfg/enumerate.cfg aus kabellaengen uebernommen - Ausgabeziel per Dialog dcl/hw_ausgabe.dcl: aktuelle Zeichnung, bestehende Datei ergaenzen oder neue Datei - Materialfluss mit XDATA SSG_HW_MF, ergaenzt vorhandene Datei - Doku doc/hw_planung.md Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
d2729140ff
commit
8abb6b3c65
20 files changed
+4176
-183
No files matched your search
@@ -0,0 +1,121 @@
|
||||
"""
|
||||
ErrorCollector - Gemeinsame Klasse zum Sammeln von Fehlern und Warnungen
|
||||
|
||||
Diese Klasse wird von getpositions.py und drawdxf.py verwendet, um Fehler
|
||||
und Warnungen während der Verarbeitung zu sammeln und zu verwalten.
|
||||
"""
|
||||
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
class ErrorCollector:
|
||||
"""Sammelt alle Fehler und Warnungen während der Verarbeitung."""
|
||||
|
||||
def __init__(self):
|
||||
self.errors = {}
|
||||
self.warnings = {}
|
||||
|
||||
def add_errors(self, error_dict):
|
||||
"""Fügt Fehler aus einem Dictionary hinzu."""
|
||||
for key, value in error_dict.items():
|
||||
if key in self.errors:
|
||||
# Key existiert bereits - Verhalten hängt vom Typ ab
|
||||
existing = self.errors[key]
|
||||
|
||||
if isinstance(existing, dict) and isinstance(value, dict):
|
||||
# Beide sind Dictionaries → Merge/Update
|
||||
existing.update(value)
|
||||
elif isinstance(existing, list):
|
||||
# Existierender Wert ist Liste
|
||||
if isinstance(value, list):
|
||||
existing.extend(value)
|
||||
else:
|
||||
existing.append(value)
|
||||
else:
|
||||
# Existierender Wert ist weder dict noch list → Mache Liste daraus
|
||||
if isinstance(value, list):
|
||||
self.errors[key] = [existing] + value
|
||||
else:
|
||||
self.errors[key] = [existing, value]
|
||||
else:
|
||||
# Neuer Key - behalte Typ des Wertes
|
||||
if isinstance(value, (dict, list)):
|
||||
# Dictionary oder Liste → direkt speichern
|
||||
self.errors[key] = value
|
||||
else:
|
||||
# Primitiver Wert (String, etc.) → als Liste speichern
|
||||
self.errors[key] = [value]
|
||||
|
||||
def add_warnings(self, warning_dict):
|
||||
"""Fügt Warnungen aus einem Dictionary hinzu."""
|
||||
for key, value in warning_dict.items():
|
||||
if key in self.warnings:
|
||||
# Key existiert bereits - Verhalten hängt vom Typ ab
|
||||
existing = self.warnings[key]
|
||||
|
||||
if isinstance(existing, dict) and isinstance(value, dict):
|
||||
# Beide sind Dictionaries → Merge/Update
|
||||
existing.update(value)
|
||||
elif isinstance(existing, list):
|
||||
# Existierender Wert ist Liste
|
||||
if isinstance(value, list):
|
||||
existing.extend(value)
|
||||
else:
|
||||
existing.append(value)
|
||||
else:
|
||||
# Existierender Wert ist weder dict noch list → Mache Liste daraus
|
||||
if isinstance(value, list):
|
||||
self.warnings[key] = [existing] + value
|
||||
else:
|
||||
self.warnings[key] = [existing, value]
|
||||
else:
|
||||
# Neuer Key - behalte Typ des Wertes
|
||||
if isinstance(value, (dict, list)):
|
||||
# Dictionary oder Liste → direkt speichern
|
||||
self.warnings[key] = value
|
||||
else:
|
||||
# Primitiver Wert (String, etc.) → als Liste speichern
|
||||
self.warnings[key] = [value]
|
||||
|
||||
def has_errors_or_warnings(self):
|
||||
"""Prüft ob Fehler oder Warnungen vorhanden sind."""
|
||||
return bool(self.errors) or bool(self.warnings)
|
||||
|
||||
def has_errors(self):
|
||||
"""Prüft ob Fehler vorhanden sind."""
|
||||
return bool(self.errors)
|
||||
|
||||
def get_all_issues(self):
|
||||
"""Gibt alle Fehler und Warnungen als Dictionary zurück."""
|
||||
result = {}
|
||||
if self.errors:
|
||||
result["errors"] = self.errors
|
||||
if self.warnings:
|
||||
result["warnings"] = self.warnings
|
||||
return result
|
||||
|
||||
def write_errorfile(self, work_dir: Path, filename: str):
|
||||
"""Schreibt Fehlerdatei nur wenn Fehler oder Warnungen vorhanden sind."""
|
||||
if self.has_errors():
|
||||
print("Fehler gefunden. Schreibe Error-Datei.")
|
||||
all_issues = self.get_all_issues()
|
||||
write_json_file(all_issues, work_dir, filename)
|
||||
else:
|
||||
print("Keine Fehler gefunden. Keine Error-Datei geschrieben.")
|
||||
|
||||
|
||||
def write_json_file(data: dict, out_dir: Path, filename: str) -> None:
|
||||
"""
|
||||
Schreibt Daten in eine JSON-Datei.
|
||||
|
||||
Args:
|
||||
data: Dictionary mit zu schreibenden Daten
|
||||
out_dir: Ausgabeverzeichnis
|
||||
filename: Dateiname für die JSON-Datei
|
||||
"""
|
||||
print("writing data to a json file ...")
|
||||
outfile = out_dir / filename if isinstance(out_dir, Path) else Path(out_dir) / filename
|
||||
with open(outfile, 'w', encoding='utf-8') as fh:
|
||||
json.dump(data, fh, indent=2, ensure_ascii=False, default=str)
|
||||
print("done")
|
||||
Reference in new issue
Block a user