Für das Zusammenführen der 2d (dwg) und 3d (par) Abmessungen liest das Skript merge_dimensions zwei JSON Dateien aus und vergleicht die Werte für die Breite und Höhe. Treten Differenzen außerhalb einer vorgegebenen Toleranz auf, so wird die Sivasnummer mit den ensprechenden Werten für Breite/Höhe in eine neue JSON-Datei geschrieben
This commit is contained in:
@@ -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" %*
|
||||
+10
-1
@@ -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
|
||||
@@ -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()
|
||||
Reference in New Issue
Block a user