From 30ca28179f199137ac163547bf95c277d7bc2122 Mon Sep 17 00:00:00 2001 From: Simon Hensch Date: Thu, 10 Jul 2025 16:30:53 +0200 Subject: [PATCH] =?UTF-8?q?F=C3=BCr=20das=20Zusammenf=C3=BChren=20der=202d?= =?UTF-8?q?=20(dwg)=20und=203d=20(par)=20Abmessungen=20liest=20das=20Skrip?= =?UTF-8?q?t=20merge=5Fdimensions=20zwei=20JSON=20Dateien=20aus=20und=20ve?= =?UTF-8?q?rgleicht=20die=20Werte=20f=C3=BCr=20die=20Breite=20und=20H?= =?UTF-8?q?=C3=B6he.=20Treten=20Differenzen=20au=C3=9Ferhalb=20einer=20vor?= =?UTF-8?q?gegebenen=20Toleranz=20auf,=20so=20wird=20die=20Sivasnummer=20m?= =?UTF-8?q?it=20den=20ensprechenden=20Werten=20f=C3=BCr=20Breite/H=C3=B6he?= =?UTF-8?q?=20in=20eine=20neue=20JSON-Datei=20geschrieben?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CAD/Code/bin/merge_dimensions.bat | 6 + CAD/Code/bin/setenv.bat | 11 +- CAD/Code/lib/merge_dimensions.py | 289 ++++++++++++++++++ .../OFWeiche/{ => json}/omniflo_weichen.json | 0 4 files changed, 305 insertions(+), 1 deletion(-) create mode 100644 CAD/Code/bin/merge_dimensions.bat create mode 100644 CAD/Code/lib/merge_dimensions.py rename SVGs/Omniflo/python/OFWeiche/{ => json}/omniflo_weichen.json (100%) diff --git a/CAD/Code/bin/merge_dimensions.bat b/CAD/Code/bin/merge_dimensions.bat new file mode 100644 index 0000000..3ca1630 --- /dev/null +++ b/CAD/Code/bin/merge_dimensions.bat @@ -0,0 +1,6 @@ +@echo off +REM ~dp0 steht für das Verzeichnis, in der diese Datei liegt + +call setenv.bat + +python "%PROJECT_LIB%\merge_dimensions.py" %* \ No newline at end of file diff --git a/CAD/Code/bin/setenv.bat b/CAD/Code/bin/setenv.bat index e2a8bd1..7d89d19 100644 --- a/CAD/Code/bin/setenv.bat +++ b/CAD/Code/bin/setenv.bat @@ -2,8 +2,12 @@ REM ~dp0 steht für das Verzeichnis, in der diese Datei liegt pushd %~dp0\.. -set PROJECT_DIR=%cd% +for /f "delims=" %%i in ('git rev-parse --show-toplevel') do set SSG_RD_DIR=%%i + +set PROJECT_DIR=%SSG_RD_DIR%\CAD\Code + +set PROJECT_BIN=%PROJECT_DIR%\bin set PROJECT_LIB=%PROJECT_DIR%\lib set PROJECT_WORK=%PROJECT_DIR%\work set PROJECT_DATA=%PROJECT_DIR%\data @@ -12,5 +16,10 @@ set PROJECT_INPUT=%PROJECT_DIR%\input if not exist %PROJECT_WORK% mkdir %PROJECT_WORK% if not exist %PROJECT_INPUT% mkdir %PROJECT_INPUT% +set PROJECT_JSON_BOGEN=%SSG_RD_DIR%\SVGs\Omniflo\python\OFBogen\json +set PROJECT_JSON_WEICHE=%SSG_RD_DIR%\SVGs\Omniflo\python\OFWeiche\json +set PROJECT_JSON_TEFBOGEN=%SSG_RD_DIR%\SVGs\Omniflo\python\TEFBogen\json +set PROJECT_JSON_TEFWEICHE=%SSG_RD_DIR%\SVGs\Omniflo\python\TEFWeiche\json + popd goto :eof \ No newline at end of file diff --git a/CAD/Code/lib/merge_dimensions.py b/CAD/Code/lib/merge_dimensions.py new file mode 100644 index 0000000..aa4ee1f --- /dev/null +++ b/CAD/Code/lib/merge_dimensions.py @@ -0,0 +1,289 @@ +#!/usr/bin/env python3 +""" +JSON Integration Script +Integriert Daten aus JSON_1 in JSON_2 über die Sivasnr +""" + +import json +import argparse +import sys +import os +from pathlib import Path +import math + +def load_json_file(file_path): + """ + Lädt eine JSON-Datei und gibt den Inhalt zurück. + + Args: + file_path (str): Pfad zur JSON-Datei + + Returns: + list: JSON-Daten als Liste + + Raises: + FileNotFoundError: Wenn die Datei nicht gefunden wird + json.JSONDecodeError: Wenn die JSON-Datei ungültig ist + """ + try: + with open(file_path, 'r', encoding='utf-8') as f: + return json.load(f) + except FileNotFoundError: + print(f"Fehler: Datei '{file_path}' nicht gefunden.") + sys.exit(1) + except json.JSONDecodeError as e: + print(f"Fehler beim Parsen der JSON-Datei '{file_path}': {e}") + sys.exit(1) + + +def save_json_file(data, file_path): + """ + Speichert Daten in eine JSON-Datei. + + Args: + data (list): Zu speichernde Daten + file_path (str): Pfad zur Ausgabedatei + """ + try: + with open(file_path, 'w', encoding='utf-8') as f: + json.dump(data, f, ensure_ascii=False, indent=2) + print(f"Integrierte Daten erfolgreich in '{file_path}' gespeichert.") + except Exception as e: + print(f"Fehler beim Speichern der Datei '{file_path}': {e}") + sys.exit(1) + + +def integrate_json_data(json_dimensions_data, json_2d_data, tolerance): + """ + Integriert Daten aus JSON_1 in JSON_2 über die Sivasnr. + Nur Einträge mit NICHT übereinstimmenden Objekt_width_mm und Objekt_height_mm werden integriert. + + Args: + json_dimensions_data (dict): Dictionary mit Sivasnr als Key und Dimensionsdaten als Value + json_2d_data (list): Daten aus JSON_2 + tolerance (float): Toleranz für die Übereinstimmung der Objekt-Abmessungen + + Returns: + list: Integrierte Daten + """ + # Erstelle eine Kopie des Dictionary für die Verarbeitung + json_dimensions_dict = json_dimensions_data.copy() + + integrated_data = [] + updated_count = 0 + new_count = 0 + skipped_count = 0 + + # Durchlaufe JSON_2 und aktualisiere mit Daten aus JSON_1 + for json_2d_item in json_2d_data: + sivasnr = json_2d_item['Sivasnr'] + # Konvertiere Sivasnr zu String für Dictionary-Lookup + sivasnr_str = str(sivasnr) + + if sivasnr_str in json_dimensions_dict: + json_dimensions_item = json_dimensions_dict[sivasnr_str] + + # Prüfe Übereinstimmung der Objekt-Abmessungen + # Mapping der Attributnamen: 'breite' -> 'Objekt_width_mm', 'hoehe' -> 'Objekt_height_mm' + dimensions_width = json_dimensions_item.get('breite', 0) + dimensions_height = json_dimensions_item.get('hoehe', 0) + + width_match = round(abs(dimensions_width - json_2d_item.get('Objekte_width_mm', 0)), 3) <= tolerance + height_match = round(abs(dimensions_height - json_2d_item.get('Objekte_height_mm', 0)), 3) <= tolerance + + if not (width_match and height_match): + # Abmessungen stimmen NICHT überein - Eintrag mit Werten aus json_dimensions_data verwenden + width_diff = abs(dimensions_width - json_2d_item.get('Objekte_width_mm', 0)) + height_diff = abs(dimensions_height - json_2d_item.get('Objekte_height_mm', 0)) + print(f"Integriere Sivasnr {sivasnr}: Abmessungen stimmen nicht überein (Toleranz: {tolerance})") + print(f" Width-Differenz: {width_diff:.3f}mm, Height-Differenz: {height_diff:.3f}mm") + print(f" Verwende Werte aus json_dimensions_data") + + # Erstelle einen neuen Eintrag mit den Werten aus json_dimensions_data + # und konvertiere die Attributnamen + integrated_item = { + 'Sivasnr': sivasnr, # Verwende die ursprüngliche Sivasnr aus json_2d_data + 'Objekt_width_mm': dimensions_width, + 'Objekt_height_mm': dimensions_height + } + # Weitere Attribute aus json_dimensions_data hinzufügen (falls vorhanden) + for key, value in json_dimensions_item.items(): + if key not in ['breite', 'hoehe']: + integrated_item[key] = value + + integrated_data.append(integrated_item) + updated_count += 1 + else: + # Abmessungen stimmen überein - Eintrag überspringen + print(f"Überspringe Sivasnr {sivasnr}: Abmessungen stimmen überein, w_diff={abs(dimensions_width-json_2d_item.get('Objekte_width_mm', 0))}, h_diff={abs(dimensions_height-json_2d_item.get('Objekte_height_mm', 0))}, (innerhalb der Toleranz)") + skipped_count += 1 + + # Entferne das verarbeitete Item aus dem Dictionary + del json_dimensions_dict[sivasnr_str] + # Wenn Sivasnr nicht in JSON_1 gefunden wird, wird der Eintrag nicht zur Ausgabe hinzugefügt + + # Füge verbleibende Items aus JSON_1 hinzu (die nicht in JSON_2 waren) + for sivasnr_str, json_dimensions_item in json_dimensions_dict.items(): + # Erstelle einen neuen Eintrag mit konvertierten Attributnamen + integrated_item = { + 'Sivasnr': sivasnr_str, # Verwende die String-Version der Sivasnr + 'Objekt_width_mm': json_dimensions_item.get('breite', 0), + 'Objekt_height_mm': json_dimensions_item.get('hoehe', 0) + } + # Weitere Attribute aus json_dimensions_data hinzufügen (falls vorhanden) + for key, value in json_dimensions_item.items(): + if key not in ['breite', 'hoehe']: + integrated_item[key] = value + + integrated_data.append(integrated_item) + new_count += 1 + print(f"Neue Sivasnr {sivasnr_str} aus JSON_1 hinzugefügt (nicht in JSON_2 vorhanden).") + + print(f"\nIntegration abgeschlossen:") + print(f"- {updated_count} Einträge integriert (Abmessungen stimmen nicht überein)") + print(f"- {new_count} neue Einträge hinzugefügt (nur in JSON_1 vorhanden)") + print(f"- {skipped_count} Einträge übersprungen (Abmessungen stimmen überein)") + print(f"- {len(integrated_data)} Einträge gesamt") + + return integrated_data +def main(): + """ + Hauptfunktion des Programms. + """ + parser = argparse.ArgumentParser( + description="Integriert JSON-Daten aus JSON_1 in JSON_2 über die Sivasnr", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=""" +Beispiel: + python json_integration.py --json_dimensions file1.json --json_2d file2.json --result result.json + python json_integration.py --type=BOGEN --output_dir /custom/output --json_dimensions file1.json --json_2d file2.json --result result.json + """ + ) + + parser.add_argument( + '--output_dir', + dest='output_dir', + required=False, + help='Ausgabeverzeichnis für integrierte Daten (Standard: PROJECT_WORK)' + ) + + parser.add_argument( + '--json_dimensions', + required=True, + help='Dateiname der ersten JSON-Datei (Quelldaten)', + metavar='[Weiche_3D, Bogen_3D, TEFWeiche_3D, TEFBogen_3D].json' + ) + + parser.add_argument( + '--json_2d', + required=True, + help='Dateiname der zweiten JSON-Datei (Zieldaten)', + metavar='[Weiche_2D, Bogen_2D, TEFWeiche_2D, TEFBogen_2D].json' + ) + + parser.add_argument( + '--tolerance', + type=float, + default=0.05, + required=False, + help='Toleranz in Millimetern, welche als Differenz akzeptiert wird.', + metavar='0.05' + ) + + parser.add_argument( + '--result', + default='Differenzen_2D_3D.json', + required=False, + help='Dateiname für die Ausgabedatei mit integrierten Daten' + ) + + parser.add_argument("--type", type=str, choices=["BOGEN", "WEICHE", "TEFBOGEN", "TEFWEICHE"], help="Art des Exports (BOGEN, WEICHE, TEFBOGEN, TEFWEICHE).") + + if len(sys.argv) == 2 and sys.argv[1] in ("-h", "--help"): + parser.print_help() + sys.exit(0) + + args = parser.parse_args() + + # Umgebungsvariablen & Ordner + output_dir = args.output_dir or os.environ.get("PROJECT_WORK", "./output") + input_3d_dir = os.environ.get("PROJECT_WORK") + bogen = os.environ.get("PROJECT_JSON_BOGEN") + weiche = os.environ.get("PROJECT_JSON_WEICHE") + tefbogen = os.environ.get("PROJECT_JSON_TEFBOGEN") + tefweiche = os.environ.get("PROJECT_JSON_TEFWEICHE") + tolerance = args.tolerance + + if args.type == "BOGEN": + input_dir = bogen + elif args.type == "WEICHE": + input_dir = weiche + elif args.type == "TEFBOGEN": + input_dir = tefbogen + elif args.type == "TEFWEICHE": + input_dir = tefweiche + + + # Erstelle Verzeichnisse falls sie nicht existieren + if not Path(input_dir).exists(): + print(f"Fehler: Eingabeverzeichnis existiert nicht.") + sys.exit(1) + + Path(output_dir).mkdir(parents=True, exist_ok=True) + + # Vollständige Pfade zu den Dateien + json_dimensions_path = Path(input_3d_dir) / args.json_dimensions + json_2d_path = Path(input_dir) / args.json_2d + output_path = Path(output_dir) / args.result + + # Validiere Eingabedateien + if not json_dimensions_path.exists(): + print(f"Fehler: JSON_1 Datei '{json_dimensions_path}' existiert nicht.") + sys.exit(1) + + if not json_2d_path.exists(): + print(f"Fehler: JSON_2 Datei '{json_2d_path}' existiert nicht.") + sys.exit(1) + + + # Lade JSON-Dateien + print(f"Lade JSON_1: {json_dimensions_path}") + json_dimensions_data = load_json_file(json_dimensions_path) + + print(f"Lade JSON_2: {json_2d_path}") + json_2d_data = load_json_file(json_2d_path) + + # # Validiere Datenstruktur + # if not isinstance(json_dimensions_data, list) or not isinstance(json_2d_data, list): + # print("Fehler: Beide JSON-Dateien müssen Arrays (Listen) enthalten.") + # parser.print_help() + # sys.exit(1) + + # # Prüfe ob Sivasnr in allen Einträgen vorhanden ist + # for i, item in enumerate(json_dimensions_data): + # if 'Sivasnr' not in item: + # print(f"Fehler: Sivasnr fehlt in JSON_1 Eintrag {i}") + # parser.print_help() + # sys.exit(1) + + for i, item in enumerate(json_2d_data): + if 'Sivasnr' not in item: + print(f"Fehler: Sivasnr fehlt in JSON_2 Eintrag {i}") + parser.print_help() + sys.exit(1) + + print(f"JSON_1 enthält {len(json_dimensions_data)} Einträge") + print(f"JSON_2 enthält {len(json_2d_data)} Einträge") + + # Integriere Daten + integrated_data = integrate_json_data(json_dimensions_data, json_2d_data, tolerance) + + if len(integrated_data) > 0: + # Speichere integrierte Daten + save_json_file(integrated_data, output_path) + else: + print(f"Dateien enthalten keine Unterschiede") + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/SVGs/Omniflo/python/OFWeiche/omniflo_weichen.json b/SVGs/Omniflo/python/OFWeiche/json/omniflo_weichen.json similarity index 100% rename from SVGs/Omniflo/python/OFWeiche/omniflo_weichen.json rename to SVGs/Omniflo/python/OFWeiche/json/omniflo_weichen.json