utils enthält jetzt generelle Routinen der verschiedenen Programme. create_example refactored. utils wird jetzt entsprechend überall importiert

This commit is contained in:
2026-01-30 15:39:35 +01:00
parent 09ffb5d7b2
commit 222a2efbf6
6 changed files with 832 additions and 204 deletions
+58 -20
View File
@@ -635,18 +635,17 @@ class TestDataGenerator:
return offset_map.get(insert_point, (0, 0)) # Default: left_top_corner
def _generate_ma_group(self, group, ma_defaults, symbol_width, symbol_height, spacing_factor, y_offsets_list, insert_point='left_top_corner'):
def _generate_symbol_group(self, group, symbol_defaults, symbol_type='MA', spacing_factor=1.2, y_offsets_list=[0, -50, 50], insert_point='left_bottom_corner'):
"""
Generiert eine Gruppe von MA-Symbolen
Generiert eine Gruppe von Symbolen (MA, BG, MB, POT, etc.)
Args:
group: Dict mit Gruppen-Config (name, count, layout_type, base_x, base_y, spacing)
ma_defaults: Dict mit MA-Default-Attributen
symbol_width: Feste Breite des Symbols
symbol_height: Feste Höhe des Symbols
symbol_defaults: Dict mit Symbol-Default-Attributen (ma_defaults, bg_defaults, etc.)
symbol_type: Typ des Symbols ('MA', 'BG', 'MB', 'POT') für BEZEICHNUNG
spacing_factor: Spacing-Faktor zwischen Symbolen
y_offsets_list: Liste von Y-Offsets für horizontal_offset Layout
insert_point: Einfügepunkt des Blocks (z.B. "left_top_corner", "center")
insert_point: Einfügepunkt des Blocks (z.B. "left_bottom_corner", "center")
"""
name = group['name']
count = group['count']
@@ -657,19 +656,33 @@ class TestDataGenerator:
# Extrahiere IO-Pattern aus Name (z.B. "MA-1@@_top" -> "MA-1@@")
io_pattern = name.split('_')[0]
# Hole Dimensionen aus defaults
dimensions = symbol_defaults.get('dimensions', {})
symbol_width = dimensions.get('width', 1210)
symbol_height = dimensions.get('height', 381)
# Berechne Spacing
if layout_type in ['horizontal', 'horizontal_offset']:
actual_spacing = symbol_width * spacing_factor
else:
actual_spacing = 0
# Hole Attribute aus ma_defaults
attributes = ma_defaults.get('attributes', {})
layer = ma_defaults.get('layer', 'ILS_MOTOR')
# Hole Attribute und Block-Info aus defaults
attributes = symbol_defaults.get('attributes', {})
layer = symbol_defaults.get('layer', 'ILS_MOTOR')
block_name = symbol_defaults.get('block_name', 'io')
# Berechne Offset basierend auf Einfügepunkt
offset_x, offset_y = self._calculate_insert_offset(insert_point, symbol_width, symbol_height)
# Bestimme BEZEICHNUNG basierend auf Symbol-Typ
bezeichnung_prefix = {
'MA': 'Motor',
'BG': 'Eingang',
'MB': 'Ausgang',
'POT': 'Erdung'
}.get(symbol_type, 'Symbol')
# Generiere Symbole basierend auf Layout-Typ
for i in range(count):
if layout_type == 'single':
@@ -692,7 +705,7 @@ class TestDataGenerator:
# DXF-Block wird an der linken unteren Ecke eingefügt
# (da der io-Block bei (0,0) startet und nach oben geht)
blockref = self.msp.add_blockref(
'io',
block_name,
insert=(left_top_x, left_top_y - symbol_height),
dxfattribs={'layer': layer}
)
@@ -700,7 +713,10 @@ class TestDataGenerator:
# Setze Attribute (dynamisch IO und BEZEICHNUNG)
attrib_values = attributes.copy()
attrib_values['IO'] = io_pattern
attrib_values['BEZEICHNUNG'] = f"Motor {io_pattern}"
# Setze BEZEICHNUNG nur wenn im Template vorhanden
if 'BEZEICHNUNG' in attrib_values:
attrib_values['BEZEICHNUNG'] = f"{bezeichnung_prefix} {io_pattern}"
blockref.add_auto_attribs(attrib_values)
@@ -724,26 +740,48 @@ class TestDataGenerator:
scene_name: Name der Testszene in der Config
"""
scene = self.config['test_scenes'][scene_name]
ma_defaults = self.config.get('ma_defaults', {})
general = self.config.get('general', {})
# Hole Dimensions aus Config (feste Werte)
dimensions = ma_defaults.get('dimensions', {})
symbol_width = dimensions.get('width', 1210)
symbol_height = dimensions.get('height', 381)
# Hole Layout-Einstellungen
layout = general.get('layout', {})
spacing_factor = layout.get('symbol_spacing_factor', 1.2)
y_offsets_list = layout.get('horizontal_offset_y_offsets', [0, -50, 50])
# Hole Einfügepunkt aus Config (default: left_top_corner)
# Hole Einfügepunkt aus Config (default: left_bottom_corner)
ma_frame = general.get('ma_frame', {})
insert_point = ma_frame.get('insert_point', 'left_top_corner')
insert_point = ma_frame.get('insert_point', 'left_bottom_corner')
# Generiere MA-Gruppen aus Config
ma_defaults = self.config.get('ma_defaults', {})
for group in scene.get('ma_groups', []):
self._generate_ma_group(group, ma_defaults, symbol_width, symbol_height, spacing_factor, y_offsets_list, insert_point)
self._generate_symbol_group(group, ma_defaults, symbol_type='MA',
spacing_factor=spacing_factor,
y_offsets_list=y_offsets_list,
insert_point=insert_point)
# Generiere BG-Gruppen aus Config (Eingänge)
bg_defaults = self.config.get('bg_defaults', {})
for group in scene.get('bg_groups', []):
self._generate_symbol_group(group, bg_defaults, symbol_type='BG',
spacing_factor=spacing_factor,
y_offsets_list=y_offsets_list,
insert_point=insert_point)
# Generiere MB-Gruppen aus Config (Ausgänge)
mb_defaults = self.config.get('mb_defaults', {})
for group in scene.get('mb_groups', []):
self._generate_symbol_group(group, mb_defaults, symbol_type='MB',
spacing_factor=spacing_factor,
y_offsets_list=y_offsets_list,
insert_point=insert_point)
# Generiere POT-Gruppen aus Config (Erdungspunkte)
pot_defaults = self.config.get('pot_defaults', {})
for group in scene.get('pot_groups', []):
self._generate_symbol_group(group, pot_defaults, symbol_type='POT',
spacing_factor=spacing_factor,
y_offsets_list=y_offsets_list,
insert_point=insert_point)
# Generiere Renamer-Rahmen aus Config
for frame_config in scene.get('renaming_frames', []):