symbol_frames.py zur Visualisierung der Grenzen um eine Symbol dazu
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
symbol_frames.py - Funktionen zum Zeichnen von Symbol-Rahmen zur Visualisierung
|
||||
|
||||
Dieses Modul enthält wiederverwendbare Funktionen zum Zeichnen von Rahmen
|
||||
um Symbole in DXF-Dateien, um deren berechnete Grenzen zu visualisieren.
|
||||
"""
|
||||
|
||||
|
||||
def draw_symbol_frames(doc, msp, symbols, symbol_width=1210, symbol_height=381, frame_layer="SYMBOL_FRAMES"):
|
||||
"""
|
||||
Zeichnet Rahmen um alle Symbole zur Visualisierung der Symbol-Grenzen.
|
||||
|
||||
Args:
|
||||
doc: DXF-Dokument
|
||||
msp: Modelspace
|
||||
symbols: Liste von Symbol-Dictionaries mit 'entity', 'position', 'attributes'
|
||||
symbol_width: Feste Breite des Symbols (Standard: 1210 für MA-Frame)
|
||||
symbol_height: Feste Höhe des Symbols (Standard: 381)
|
||||
frame_layer: Layer-Name für die Rahmen (Standard: "SYMBOL_FRAMES")
|
||||
|
||||
Returns:
|
||||
Anzahl der gezeichneten Rahmen
|
||||
"""
|
||||
print("\n" + "="*60)
|
||||
print("Zeichne Symbol-Rahmen zur Visualisierung")
|
||||
print("="*60)
|
||||
|
||||
# Erstelle Layer falls nicht vorhanden
|
||||
if frame_layer not in doc.layers:
|
||||
doc.layers.add(frame_layer, color=3) # Farbe 3 = Grün
|
||||
print(f" Layer '{frame_layer}' erstellt (Farbe: Grün)")
|
||||
|
||||
frame_count = 0
|
||||
|
||||
for symbol in symbols:
|
||||
# Hole Position und Attribute
|
||||
pos = symbol['position']
|
||||
attribs = symbol['attributes']
|
||||
|
||||
# Hole IO-Attribut um die Zeichen-Anzahl zu bestimmen
|
||||
io_value = attribs.get('IO', '')
|
||||
if not io_value:
|
||||
# Versuche andere Attribute als Fallback
|
||||
for key in ['KENNZEICHNUNG', 'NAME']:
|
||||
if key in attribs and attribs[key]:
|
||||
io_value = attribs[key]
|
||||
break
|
||||
|
||||
# Bestimme Dimensionen basierend auf Zeichen-Anzahl
|
||||
# 6 Zeichen (MA-1@@) = 1210, 7 Zeichen (BG-1@@@) = 1410
|
||||
char_count = len(str(io_value))
|
||||
if char_count >= 7:
|
||||
width = 1410 # Multi-Frame (BG/MB/POT)
|
||||
else:
|
||||
width = symbol_width # MA-Frame (Standard)
|
||||
height = symbol_height
|
||||
|
||||
# Berechne Eckpunkte (Position = linke untere Ecke des Symbols)
|
||||
# Symbol erstreckt sich von (x, y) nach rechts und nach oben
|
||||
x_min = pos[0]
|
||||
x_max = pos[0] + width
|
||||
y_min = pos[1]
|
||||
y_max = pos[1] + height
|
||||
|
||||
# Erstelle Rechteck als LWPOLYLINE
|
||||
points = [
|
||||
(x_min, y_min),
|
||||
(x_max, y_min),
|
||||
(x_max, y_max),
|
||||
(x_min, y_max),
|
||||
(x_min, y_min) # Schließe das Rechteck
|
||||
]
|
||||
|
||||
msp.add_lwpolyline(points, dxfattribs={
|
||||
'layer': frame_layer,
|
||||
'color': 3, # Grün
|
||||
'closed': True
|
||||
})
|
||||
|
||||
frame_count += 1
|
||||
|
||||
print(f" {frame_count} Symbol-Rahmen gezeichnet")
|
||||
return frame_count
|
||||
Reference in New Issue
Block a user