aus Argument test-type rausgeworfen. Es genüügt die Angabe der Szene aus der .json Config, um eine Datei zu erzeugen

This commit is contained in:
2026-01-23 19:09:03 +01:00
parent 48a5b1f971
commit 42393e457e
2 changed files with 65 additions and 51 deletions
+1 -1
View File
@@ -48,7 +48,7 @@
"name": "MA-1@@", "name": "MA-1@@",
"kennzeichnung": "A01+UH00", "kennzeichnung": "A01+UH00",
"layer_name": "ILS_MOTOR", "layer_name": "ILS_MOTOR",
"direction": "TOP_BOTTOM/LEFT_RIGHT", "direction": "LEFT_RIGHT",
"x": 450, "x": 450,
"y": 150, "y": 150,
"width": 1400, "width": 1400,
+64 -50
View File
@@ -23,15 +23,14 @@ PROJECT_CFG = os.getenv('PROJECT_CFG', os.path.join(PROJECT, 'cfg'))
class TestDataGenerator: class TestDataGenerator:
"""Generiert Test-DXF-Dateien für verschiedene Szenarien""" """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.filename = filename
self.test_type = test_type
self.scene_name = scene_name self.scene_name = scene_name
self.doc = None self.doc = None
self.msp = None self.msp = None
self.config = None self.config = None
# Lade Config-Datei falls angegeben # Lade Config-Datei (muss immer angegeben werden)
if config_file: if config_file:
self.load_config(config_file) self.load_config(config_file)
@@ -51,10 +50,10 @@ class TestDataGenerator:
self.config = json.load(f) self.config = json.load(f)
print(f"Config geladen: {config_path}") print(f"Config geladen: {config_path}")
except FileNotFoundError: except FileNotFoundError:
print(f"Warnung: Config-Datei nicht gefunden: {config_path}") print(f"FEHLER: Config-Datei nicht gefunden: {config_path}")
self.config = None self.config = None
except json.JSONDecodeError as e: 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 self.config = None
def create_document(self): def create_document(self):
@@ -624,9 +623,18 @@ class TestDataGenerator:
continue continue
# Erstelle Block-Referenz # 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( blockref = self.msp.add_blockref(
'io', 'io',
insert=(x, y), insert=(block_insert_x, block_insert_y),
dxfattribs={'layer': layer} dxfattribs={'layer': layer}
) )
@@ -703,11 +711,17 @@ class TestDataGenerator:
top_right_y = 1000 top_right_y = 1000
top_right_x_start = 1500 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): for i in range(3):
x = top_right_x_start + i * spacing 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( blockref = self.msp.add_blockref(
'io', 'io',
insert=(x, top_right_y), insert=(block_insert_x, block_insert_y),
dxfattribs={'layer': 'ILS_MOTOR'} dxfattribs={'layer': 'ILS_MOTOR'}
) )
# Erzeuge Attribut-Instanzen aus ATTDEFs mit Werten # Erzeuge Attribut-Instanzen aus ATTDEFs mit Werten
@@ -731,9 +745,14 @@ class TestDataGenerator:
# Links unten: 1x MA-1@@ # Links unten: 1x MA-1@@
left_bottom_x = 500 left_bottom_x = 500
left_bottom_y = 200 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( blockref = self.msp.add_blockref(
'io', 'io',
insert=(left_bottom_x, left_bottom_y), insert=(block_insert_x, block_insert_y),
dxfattribs={'layer': 'ILS_MOTOR'} dxfattribs={'layer': 'ILS_MOTOR'}
) )
blockref.add_auto_attribs({ blockref.add_auto_attribs({
@@ -757,12 +776,18 @@ class TestDataGenerator:
bottom_right_x_start = top_right_x_start bottom_right_x_start = top_right_x_start
y_offsets = [0, -50, 50] # Leichte vertikale Versetzung (angepasst an Symbol-Höhe) 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): for i in range(3):
x = bottom_right_x_start + i * spacing x = bottom_right_x_start + i * spacing
y = bottom_right_y_start + y_offsets[i] 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( blockref = self.msp.add_blockref(
'io', 'io',
insert=(x, y), insert=(block_insert_x, block_insert_y),
dxfattribs={'layer': 'ILS_MOTOR'} dxfattribs={'layer': 'ILS_MOTOR'}
) )
blockref.add_auto_attribs({ blockref.add_auto_attribs({
@@ -833,32 +858,23 @@ class TestDataGenerator:
"""Generiert die Testdaten basierend auf dem Test-Typ""" """Generiert die Testdaten basierend auf dem Test-Typ"""
self.create_document() self.create_document()
if self.test_type == 'nummerierung': # Prüfe ob Scene in Config existiert
# Bestimme Scene-Name: entweder explizit angegeben oder automatisch aus Filename if not self.config:
scene_name = self.scene_name print("FEHLER: Keine Config-Datei geladen")
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}")
return False 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 return True
@@ -869,18 +885,17 @@ def main():
) )
parser.add_argument( parser.add_argument(
'--filename', '--scene',
type=str, type=str,
required=True, 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( parser.add_argument(
'--type', '--filename',
type=str, type=str,
required=True, default=None,
choices=['nummerierung', 'sps', 'todraw', 'erdung', 'translation', 'hoehe'], help='Name der zu erzeugenden Testdatei (z.B. Nummerierung1.dxf). Falls nicht angegeben, wird scene + .dxf verwendet.'
help='Typ des Tests'
) )
parser.add_argument( parser.add_argument(
@@ -897,21 +912,20 @@ def main():
help='JSON-Konfigurationsdatei (Standard: create_tests.json)' 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() 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 # Stelle sicher, dass Dateiname .dxf Endung hat
if not args.filename.endswith('.dxf'): if not filename.endswith('.dxf'):
args.filename += '.dxf' filename += '.dxf'
# Generiere Testdaten # 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(): if generator.generate():
generator.save(args.output_dir) generator.save(args.output_dir)