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
+64 -50
View File
@@ -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)