diff --git a/cfg/create_tests.json b/cfg/create_tests.json index 1a55b58..8b7ddfe 100644 --- a/cfg/create_tests.json +++ b/cfg/create_tests.json @@ -48,7 +48,7 @@ "name": "MA-1@@", "kennzeichnung": "A01+UH00", "layer_name": "ILS_MOTOR", - "direction": "TOP_BOTTOM/LEFT_RIGHT", + "direction": "LEFT_RIGHT", "x": 450, "y": 150, "width": 1400, diff --git a/lib/create_example.py b/lib/create_example.py index fb6601b..eef6e9d 100644 --- a/lib/create_example.py +++ b/lib/create_example.py @@ -23,15 +23,14 @@ PROJECT_CFG = os.getenv('PROJECT_CFG', os.path.join(PROJECT, 'cfg')) class TestDataGenerator: """Generiert Test-DXF-Dateien für verschiedene Szenarien""" - def __init__(self, filename, test_type, config_file=None, scene_name=None): + def __init__(self, filename, scene_name, config_file=None): self.filename = filename - self.test_type = test_type self.scene_name = scene_name self.doc = None self.msp = None self.config = None - # Lade Config-Datei falls angegeben + # Lade Config-Datei (muss immer angegeben werden) if config_file: self.load_config(config_file) @@ -51,10 +50,10 @@ class TestDataGenerator: self.config = json.load(f) print(f"Config geladen: {config_path}") except FileNotFoundError: - print(f"Warnung: Config-Datei nicht gefunden: {config_path}") + print(f"FEHLER: Config-Datei nicht gefunden: {config_path}") self.config = None except json.JSONDecodeError as e: - print(f"Fehler beim Parsen der Config-Datei: {e}") + print(f"FEHLER beim Parsen der Config-Datei: {e}") self.config = None def create_document(self): @@ -624,9 +623,18 @@ class TestDataGenerator: continue # Erstelle Block-Referenz + # Der Insert-Punkt soll an der oberen linken Ecke des TEXT-D liegen + # TEXT-D ist bei (772.87, 110.44) relativ zum Block, Höhe 63.75 + # Die obere linke Ecke von TEXT-D ist bei (772.87, 110.44 + 63.75) = (772.87, 174.19) relativ zum Block + # Daher muss der Block um diese Werte verschoben werden + text_d_x_offset = 772.87 + text_d_y_offset = 110.44 + 63.75 # Basis + Höhe = obere linke Ecke + block_insert_x = x - text_d_x_offset + block_insert_y = y - text_d_y_offset + blockref = self.msp.add_blockref( 'io', - insert=(x, y), + insert=(block_insert_x, block_insert_y), dxfattribs={'layer': layer} ) @@ -703,11 +711,17 @@ class TestDataGenerator: top_right_y = 1000 top_right_x_start = 1500 + # Der Insert-Punkt soll an der oberen linken Ecke des TEXT-D liegen + text_d_x_offset = 772.87 + text_d_y_offset = 110.44 + 63.75 # Basis + Höhe = obere linke Ecke + for i in range(3): x = top_right_x_start + i * spacing + block_insert_x = x - text_d_x_offset + block_insert_y = top_right_y - text_d_y_offset blockref = self.msp.add_blockref( 'io', - insert=(x, top_right_y), + insert=(block_insert_x, block_insert_y), dxfattribs={'layer': 'ILS_MOTOR'} ) # Erzeuge Attribut-Instanzen aus ATTDEFs mit Werten @@ -731,9 +745,14 @@ class TestDataGenerator: # Links unten: 1x MA-1@@ left_bottom_x = 500 left_bottom_y = 200 + # Der Insert-Punkt soll an der oberen linken Ecke des TEXT-D liegen + text_d_x_offset = 772.87 + text_d_y_offset = 110.44 + 63.75 # Basis + Höhe = obere linke Ecke + block_insert_x = left_bottom_x - text_d_x_offset + block_insert_y = left_bottom_y - text_d_y_offset blockref = self.msp.add_blockref( 'io', - insert=(left_bottom_x, left_bottom_y), + insert=(block_insert_x, block_insert_y), dxfattribs={'layer': 'ILS_MOTOR'} ) blockref.add_auto_attribs({ @@ -757,12 +776,18 @@ class TestDataGenerator: bottom_right_x_start = top_right_x_start y_offsets = [0, -50, 50] # Leichte vertikale Versetzung (angepasst an Symbol-Höhe) + # Der Insert-Punkt soll an der oberen linken Ecke des TEXT-D liegen + text_d_x_offset = 772.87 + text_d_y_offset = 110.44 + 63.75 # Basis + Höhe = obere linke Ecke + for i in range(3): x = bottom_right_x_start + i * spacing y = bottom_right_y_start + y_offsets[i] + block_insert_x = x - text_d_x_offset + block_insert_y = y - text_d_y_offset blockref = self.msp.add_blockref( 'io', - insert=(x, y), + insert=(block_insert_x, block_insert_y), dxfattribs={'layer': 'ILS_MOTOR'} ) blockref.add_auto_attribs({ @@ -833,32 +858,23 @@ class TestDataGenerator: """Generiert die Testdaten basierend auf dem Test-Typ""" self.create_document() - if self.test_type == 'nummerierung': - # Bestimme Scene-Name: entweder explizit angegeben oder automatisch aus Filename - scene_name = self.scene_name - if not scene_name: - # Versuche Scene-Name aus Filename zu extrahieren (z.B. "Nummerierung2.dxf" -> "Nummerierung2") - import re - match = re.match(r'(Nummerierung\d+)', self.filename, re.IGNORECASE) - if match: - scene_name = match.group(1) - else: - scene_name = 'Nummerierung1' # Default - self.generate_nummerierung(scene_name) - elif self.test_type == 'sps': - print("SPS-Testdaten noch nicht implementiert") - elif self.test_type == 'todraw': - print("ToDraw-Testdaten noch nicht implementiert") - elif self.test_type == 'erdung': - print("Erdung-Testdaten noch nicht implementiert") - elif self.test_type == 'translation': - print("Translation-Testdaten noch nicht implementiert") - elif self.test_type == 'hoehe': - print("Höhe-Testdaten noch nicht implementiert") - else: - print(f"Unbekannter Test-Typ: {self.test_type}") + # Prüfe ob Scene in Config existiert + if not self.config: + print("FEHLER: Keine Config-Datei geladen") return False - + + if 'test_scenes' not in self.config: + print("FEHLER: Config enthält keinen 'test_scenes' Abschnitt") + return False + + if self.scene_name not in self.config['test_scenes']: + print(f"FEHLER: Scene '{self.scene_name}' nicht in Config gefunden") + print(f"Verfügbare Scenes: {', '.join(self.config['test_scenes'].keys())}") + return False + + # Generiere nur Nummerierung (andere Test-Typen werden später unterstützt) + self.generate_nummerierung(self.scene_name) + return True @@ -869,18 +885,17 @@ def main(): ) parser.add_argument( - '--filename', + '--scene', type=str, required=True, - help='Name der zu erzeugenden Testdatei (z.B. Nummerierung1.dxf)' + help='Name der Testszene (z.B. Nummerierung1, Nummerierung2). Muss in der Config existieren.' ) parser.add_argument( - '--type', + '--filename', type=str, - required=True, - choices=['nummerierung', 'sps', 'todraw', 'erdung', 'translation', 'hoehe'], - help='Typ des Tests' + default=None, + help='Name der zu erzeugenden Testdatei (z.B. Nummerierung1.dxf). Falls nicht angegeben, wird scene + .dxf verwendet.' ) parser.add_argument( @@ -897,21 +912,20 @@ def main(): help='JSON-Konfigurationsdatei (Standard: create_tests.json)' ) - parser.add_argument( - '--scene', - type=str, - default=None, - help='Name der Testszene (z.B. Nummerierung1, Nummerierung2). Falls nicht angegeben, wird aus Filename extrahiert.' - ) - args = parser.parse_args() + # Bestimme Filename: entweder angegeben oder aus scene ableiten + if args.filename: + filename = args.filename + else: + filename = args.scene + '.dxf' + # Stelle sicher, dass Dateiname .dxf Endung hat - if not args.filename.endswith('.dxf'): - args.filename += '.dxf' + if not filename.endswith('.dxf'): + filename += '.dxf' # Generiere Testdaten - generator = TestDataGenerator(args.filename, args.type, config_file=args.config, scene_name=args.scene) + generator = TestDataGenerator(filename, args.scene, config_file=args.config) if generator.generate(): generator.save(args.output_dir)