Test scenes werden aus der json config gelesen. Main Funktion in eigene Methode ausgelagert
This commit is contained in:
+238
-73
@@ -1,4 +1,5 @@
|
|||||||
import argparse
|
import argparse
|
||||||
|
import json
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
@@ -52,6 +53,33 @@ Alle Sensoren, Motoren, Aktoren etc. innerhalb der zugehörigen Polylinie nehmen
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
def read_test_scenes_from_json(json_path: Path) -> list:
|
||||||
|
"""
|
||||||
|
Liest die create_tests.json und gibt alle konfigurierten Szenen-Namen zurück.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
json_path: Pfad zur create_tests.json
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Liste der Szenen-Namen (z.B. ['Nummerierung1', 'Nummerierung2', 'BGMG', ...])
|
||||||
|
"""
|
||||||
|
if not json_path.exists():
|
||||||
|
return []
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(json_path, 'r', encoding='utf-8') as f:
|
||||||
|
data = json.load(f)
|
||||||
|
|
||||||
|
# Hole alle Keys aus test_scenes
|
||||||
|
if 'test_scenes' in data:
|
||||||
|
return list(data['test_scenes'].keys())
|
||||||
|
else:
|
||||||
|
return []
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Fehler beim Lesen der JSON-Datei {json_path}: {e}")
|
||||||
|
return []
|
||||||
|
|
||||||
|
|
||||||
def read_config_layers(config_path: Path) -> list:
|
def read_config_layers(config_path: Path) -> list:
|
||||||
"""
|
"""
|
||||||
Liest die enumerate.cfg und gibt die Layer zurück, auf denen nach Renamer-Blöcken gesucht werden soll.
|
Liest die enumerate.cfg und gibt die Layer zurück, auf denen nach Renamer-Blöcken gesucht werden soll.
|
||||||
@@ -1268,79 +1296,28 @@ def collect_all_symbols_from_groups(doc, msp, renamer_groups, renamer_layers, er
|
|||||||
return all_symbols
|
return all_symbols
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
def process_single_file(dxf_path, work_dir, renamer_layers, polyline_max_distance, args):
|
||||||
# Lese Umgebungsvariablen vor argparse, um Config-Info in Hilfe anzuzeigen
|
"""
|
||||||
out_dir = check_environment_var('PROJECT_DATA')
|
Verarbeitet eine einzelne DXF-Datei.
|
||||||
work_dir = check_environment_var('PROJECT_WORK')
|
|
||||||
config_dir = check_environment_var("PROJECT_CFG")
|
|
||||||
|
|
||||||
# Versuche Config zu lesen für --help Ausgabe
|
Args:
|
||||||
config_path = Path(config_dir) / "enumerate.cfg"
|
dxf_path: Pfad zur DXF-Datei
|
||||||
available_layers = []
|
work_dir: Work-Verzeichnis
|
||||||
if config_path.exists():
|
renamer_layers: Liste der konfigurierten Renamer-Layer
|
||||||
try:
|
polyline_max_distance: Maximale Distanz zur Polylinie
|
||||||
available_layers = read_config_layers(config_path)
|
args: Argparse-Argumente
|
||||||
except Exception:
|
|
||||||
pass # Ignoriere Fehler beim Lesen für --help
|
|
||||||
|
|
||||||
# Erstelle Epilog mit verfügbaren Layern
|
Returns:
|
||||||
epilog_text = "\nKonfigurierte Renamer-Layer:\n"
|
Tuple (success, error_collector):
|
||||||
if available_layers:
|
- success: True wenn erfolgreich verarbeitet
|
||||||
epilog_text += " " + ", ".join(available_layers) + "\n"
|
- error_collector: ErrorCollector mit gesammelten Fehlern/Warnungen
|
||||||
epilog_text += f"\n(aus Konfigurationsdatei: {config_path})"
|
"""
|
||||||
else:
|
# Initialisiere ErrorCollector für diese Datei
|
||||||
epilog_text += " (keine Layer konfiguriert oder Config-Datei nicht gefunden)\n"
|
|
||||||
epilog_text += f" Standard-Pfad: {config_path}"
|
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(
|
|
||||||
description='Nummeriert Symbole in DXF-Dateien basierend auf Renamer-Blöcken',
|
|
||||||
prog='create_numbers',
|
|
||||||
epilog=epilog_text,
|
|
||||||
formatter_class=argparse.RawDescriptionHelpFormatter
|
|
||||||
)
|
|
||||||
parser.add_argument('-f', '--filename', action='store', required=True, help='DXF-Datei die verarbeitet werden soll', metavar='myfile.dxf')
|
|
||||||
parser.add_argument('-e', '--errorfile', action='store', required=False, help='JSON-Datei für Fehler und Warnungen', metavar='errors.json')
|
|
||||||
parser.add_argument('-i', '--info', action='store', help='Schreibe Ergebnisse der Nummerierung in eine JSON-Datei')
|
|
||||||
parser.add_argument('-d', '--dryrun', action='store_true', help='Symbole nicht in der DXF-Datei überschreiben, nur Ausgabe auf Konsole')
|
|
||||||
parser.add_argument('--overwrite', action='store_true', help='Überschreibt die Originaldatei anstatt eine neue Datei mit Suffix _numbered zu erstellen')
|
|
||||||
parser.add_argument('--show_symbol_frames', action='store_true', help='Zeichne Rahmen um jedes Symbol, um die Grenze des Symbols zu visualisieren')
|
|
||||||
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
# Validierung: --overwrite und --dryrun können nicht zusammen verwendet werden
|
|
||||||
if args.overwrite and args.dryrun:
|
|
||||||
parser.error("--overwrite und --dryrun können nicht zusammen verwendet werden")
|
|
||||||
|
|
||||||
# Initialisiere ErrorCollector
|
|
||||||
error_collector = ErrorCollector()
|
error_collector = ErrorCollector()
|
||||||
|
|
||||||
filename = Path(args.filename)
|
print(f"\n{'='*80}")
|
||||||
if not filename.suffix == ".dxf":
|
print(f"Verarbeite Datei: {dxf_path.name}")
|
||||||
print("Nur für .dxf Dateien verfügbar")
|
print(f"{'='*80}\n")
|
||||||
exit(1)
|
|
||||||
|
|
||||||
(dxf_path, dexists) = check_file_in_work(work_dir, filename)
|
|
||||||
if dexists == False:
|
|
||||||
print(f"Datei nicht gefunden: {filename}")
|
|
||||||
parser.print_help()
|
|
||||||
exit(1)
|
|
||||||
|
|
||||||
# Config-Datei existiert bereits (wurde für --help geprüft)
|
|
||||||
if not config_path.exists():
|
|
||||||
print(f"Konfigurationsdatei nicht gefunden: {config_path}")
|
|
||||||
exit(1)
|
|
||||||
|
|
||||||
renamer_layers = read_config_layers(config_path)
|
|
||||||
print(f"Konfigurierte Layer: {renamer_layers}")
|
|
||||||
|
|
||||||
if not renamer_layers:
|
|
||||||
print("Keine Layer in der Konfiguration gefunden")
|
|
||||||
exit(1)
|
|
||||||
|
|
||||||
# Lese Parameter aus Config
|
|
||||||
config_parameters = read_config_parameters(config_path)
|
|
||||||
polyline_max_distance = config_parameters.get('polyline_max_distance', 500.0)
|
|
||||||
print(f"Parameter: polyline_max_distance = {polyline_max_distance}")
|
|
||||||
|
|
||||||
# Lese DXF-Datei
|
# Lese DXF-Datei
|
||||||
if dxf_is_binary(dxf_path):
|
if dxf_is_binary(dxf_path):
|
||||||
@@ -1450,12 +1427,200 @@ if __name__ == '__main__':
|
|||||||
write_json_file(error_data, dxf_path.parent, error_filename)
|
write_json_file(error_data, dxf_path.parent, error_filename)
|
||||||
print(f"Fehler/Warnungen gespeichert: {dxf_path.parent / error_filename}")
|
print(f"Fehler/Warnungen gespeichert: {dxf_path.parent / error_filename}")
|
||||||
|
|
||||||
# Exit-Code basierend auf Fehlern
|
# Status-Meldung
|
||||||
if error_collector.has_errors():
|
if error_collector.has_errors():
|
||||||
print("\n!!! Es sind Fehler aufgetreten !!!")
|
print("\n!!! Es sind Fehler aufgetreten !!!")
|
||||||
exit(1)
|
return False, error_collector
|
||||||
elif error_collector.has_errors_or_warnings():
|
elif error_collector.has_errors_or_warnings():
|
||||||
print("\n(Warnungen vorhanden, aber keine kritischen Fehler)")
|
print("\n(Warnungen vorhanden, aber keine kritischen Fehler)")
|
||||||
exit(0)
|
return True, error_collector
|
||||||
else:
|
else:
|
||||||
exit(0)
|
return True, error_collector
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# Lese Umgebungsvariablen vor argparse, um Config-Info in Hilfe anzuzeigen
|
||||||
|
out_dir = check_environment_var('PROJECT_DATA')
|
||||||
|
work_dir = check_environment_var('PROJECT_WORK')
|
||||||
|
config_dir = check_environment_var("PROJECT_CFG")
|
||||||
|
|
||||||
|
# Versuche Config zu lesen für --help Ausgabe
|
||||||
|
config_path = Path(config_dir) / "enumerate.cfg"
|
||||||
|
available_layers = []
|
||||||
|
if config_path.exists():
|
||||||
|
try:
|
||||||
|
available_layers = read_config_layers(config_path)
|
||||||
|
except Exception:
|
||||||
|
pass # Ignoriere Fehler beim Lesen für --help
|
||||||
|
|
||||||
|
# Erstelle Epilog mit verfügbaren Layern
|
||||||
|
epilog_text = "\nKonfigurierte Renamer-Layer:\n"
|
||||||
|
if available_layers:
|
||||||
|
epilog_text += " " + ", ".join(available_layers) + "\n"
|
||||||
|
epilog_text += f"\n(aus Konfigurationsdatei: {config_path})"
|
||||||
|
else:
|
||||||
|
epilog_text += " (keine Layer konfiguriert oder Config-Datei nicht gefunden)\n"
|
||||||
|
epilog_text += f" Standard-Pfad: {config_path}"
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description='Nummeriert Symbole in DXF-Dateien basierend auf Renamer-Blöcken',
|
||||||
|
prog='create_numbers',
|
||||||
|
epilog=epilog_text,
|
||||||
|
formatter_class=argparse.RawDescriptionHelpFormatter
|
||||||
|
)
|
||||||
|
parser.add_argument('-f', '--filename', action='store', required=False, help='DXF-Datei die verarbeitet werden soll', metavar='myfile.dxf')
|
||||||
|
parser.add_argument('-e', '--errorfile', action='store', required=False, help='JSON-Datei für Fehler und Warnungen', metavar='errors.json')
|
||||||
|
parser.add_argument('-i', '--info', action='store', help='Schreibe Ergebnisse der Nummerierung in eine JSON-Datei')
|
||||||
|
parser.add_argument('-d', '--dryrun', action='store_true', help='Symbole nicht in der DXF-Datei überschreiben, nur Ausgabe auf Konsole')
|
||||||
|
parser.add_argument('--overwrite', action='store_true', help='Überschreibt die Originaldatei anstatt eine neue Datei mit Suffix _numbered zu erstellen')
|
||||||
|
parser.add_argument('--show_symbol_frames', action='store_true', help='Zeichne Rahmen um jedes Symbol, um die Grenze des Symbols zu visualisieren')
|
||||||
|
parser.add_argument('--all-examples', action='store_true', help='Verarbeitet alle in create_tests.json konfigurierten DXF-Dateien aus dem work-Ordner')
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
# Validierung: --filename oder --all-examples muss angegeben werden
|
||||||
|
if not args.filename and not args.all_examples:
|
||||||
|
parser.error("Entweder --filename oder --all-examples muss angegeben werden")
|
||||||
|
|
||||||
|
# Validierung: --filename und --all-examples können nicht zusammen verwendet werden
|
||||||
|
if args.filename and args.all_examples:
|
||||||
|
parser.error("--filename und --all-examples können nicht zusammen verwendet werden")
|
||||||
|
|
||||||
|
# Validierung: --overwrite und --dryrun können nicht zusammen verwendet werden
|
||||||
|
if args.overwrite and args.dryrun:
|
||||||
|
parser.error("--overwrite und --dryrun können nicht zusammen verwendet werden")
|
||||||
|
|
||||||
|
# Validierung: Bei --all-examples können --errorfile und --info nicht verwendet werden
|
||||||
|
if args.all_examples and (args.errorfile or args.info):
|
||||||
|
parser.error("Bei --all-examples können --errorfile und --info nicht verwendet werden (Dateien werden automatisch generiert)")
|
||||||
|
|
||||||
|
# Config-Datei existiert bereits (wurde für --help geprüft)
|
||||||
|
if not config_path.exists():
|
||||||
|
print(f"Konfigurationsdatei nicht gefunden: {config_path}")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
renamer_layers = read_config_layers(config_path)
|
||||||
|
print(f"Konfigurierte Layer: {renamer_layers}")
|
||||||
|
|
||||||
|
if not renamer_layers:
|
||||||
|
print("Keine Layer in der Konfiguration gefunden")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
# Lese Parameter aus Config
|
||||||
|
config_parameters = read_config_parameters(config_path)
|
||||||
|
polyline_max_distance = config_parameters.get('polyline_max_distance', 500.0)
|
||||||
|
print(f"Parameter: polyline_max_distance = {polyline_max_distance}")
|
||||||
|
|
||||||
|
# ====================================================================================
|
||||||
|
# Verarbeite entweder eine einzelne Datei oder alle Beispiel-Dateien
|
||||||
|
# ====================================================================================
|
||||||
|
|
||||||
|
if args.all_examples:
|
||||||
|
# Verarbeite alle in create_tests.json konfigurierten Dateien
|
||||||
|
print("\n" + "="*80)
|
||||||
|
print("MODUS: Verarbeite alle Beispiel-Dateien aus create_tests.json")
|
||||||
|
print("="*80)
|
||||||
|
|
||||||
|
# Lese Test-Szenen aus create_tests.json
|
||||||
|
create_tests_path = Path(config_dir) / "create_tests.json"
|
||||||
|
test_scenes = read_test_scenes_from_json(create_tests_path)
|
||||||
|
|
||||||
|
if not test_scenes:
|
||||||
|
print(f"\nFEHLER: Keine Test-Szenen in {create_tests_path} gefunden")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
print(f"\nGefundene Test-Szenen: {', '.join(test_scenes)}")
|
||||||
|
print(f"Anzahl: {len(test_scenes)}\n")
|
||||||
|
|
||||||
|
# Prüfe welche DXF-Dateien im work-Ordner existieren
|
||||||
|
existing_files = []
|
||||||
|
missing_files = []
|
||||||
|
|
||||||
|
for scene_name in test_scenes:
|
||||||
|
dxf_filename = f"{scene_name}.dxf"
|
||||||
|
dxf_path = Path(work_dir) / dxf_filename
|
||||||
|
|
||||||
|
if dxf_path.exists():
|
||||||
|
existing_files.append((scene_name, dxf_path))
|
||||||
|
else:
|
||||||
|
missing_files.append(dxf_filename)
|
||||||
|
|
||||||
|
# Melde fehlende Dateien
|
||||||
|
if missing_files:
|
||||||
|
print("WARNUNG: Folgende DXF-Dateien wurden im work-Ordner nicht gefunden:")
|
||||||
|
for filename in missing_files:
|
||||||
|
print(f" - {filename}")
|
||||||
|
print()
|
||||||
|
|
||||||
|
if not existing_files:
|
||||||
|
print("FEHLER: Keine DXF-Dateien im work-Ordner gefunden")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
print(f"Verarbeite {len(existing_files)} Datei(en):\n")
|
||||||
|
|
||||||
|
# Verarbeite alle gefundenen Dateien
|
||||||
|
results = []
|
||||||
|
for scene_name, dxf_path in existing_files:
|
||||||
|
success, error_collector = process_single_file(dxf_path, work_dir, renamer_layers, polyline_max_distance, args)
|
||||||
|
results.append({
|
||||||
|
'scene_name': scene_name,
|
||||||
|
'filename': dxf_path.name,
|
||||||
|
'success': success,
|
||||||
|
'has_errors': error_collector.has_errors(),
|
||||||
|
'has_warnings': error_collector.has_errors_or_warnings() and not error_collector.has_errors()
|
||||||
|
})
|
||||||
|
|
||||||
|
# Zusammenfassung
|
||||||
|
print("\n" + "="*80)
|
||||||
|
print("ZUSAMMENFASSUNG")
|
||||||
|
print("="*80)
|
||||||
|
|
||||||
|
successful = sum(1 for r in results if r['success'])
|
||||||
|
with_errors = sum(1 for r in results if r['has_errors'])
|
||||||
|
with_warnings = sum(1 for r in results if r['has_warnings'])
|
||||||
|
|
||||||
|
print(f"\nVerarbeitete Dateien: {len(results)}")
|
||||||
|
print(f"Erfolgreich: {successful}")
|
||||||
|
print(f"Mit Fehlern: {with_errors}")
|
||||||
|
print(f"Mit Warnungen (ohne Fehler): {with_warnings}")
|
||||||
|
|
||||||
|
if with_errors > 0:
|
||||||
|
print("\nDateien mit Fehlern:")
|
||||||
|
for r in results:
|
||||||
|
if r['has_errors']:
|
||||||
|
print(f" - {r['filename']}")
|
||||||
|
|
||||||
|
if with_warnings > 0:
|
||||||
|
print("\nDateien mit Warnungen:")
|
||||||
|
for r in results:
|
||||||
|
if r['has_warnings']:
|
||||||
|
print(f" - {r['filename']}")
|
||||||
|
|
||||||
|
# Exit-Code: Fehler wenn mindestens eine Datei Fehler hat
|
||||||
|
if with_errors > 0:
|
||||||
|
print("\n!!! Mindestens eine Datei hat Fehler !!!")
|
||||||
|
exit(1)
|
||||||
|
else:
|
||||||
|
print("\nAlle Dateien erfolgreich verarbeitet!")
|
||||||
|
exit(0)
|
||||||
|
|
||||||
|
else:
|
||||||
|
# Verarbeite einzelne Datei
|
||||||
|
filename = Path(args.filename)
|
||||||
|
if not filename.suffix == ".dxf":
|
||||||
|
print("Nur für .dxf Dateien verfügbar")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
(dxf_path, dexists) = check_file_in_work(work_dir, filename)
|
||||||
|
if dexists == False:
|
||||||
|
print(f"Datei nicht gefunden: {filename}")
|
||||||
|
parser.print_help()
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
success, error_collector = process_single_file(dxf_path, work_dir, renamer_layers, polyline_max_distance, args)
|
||||||
|
|
||||||
|
# Exit-Code basierend auf Fehlern
|
||||||
|
if error_collector.has_errors():
|
||||||
|
exit(1)
|
||||||
|
else:
|
||||||
|
exit(0)
|
||||||
|
|||||||
Reference in New Issue
Block a user