Schalter --show_symbol_frames dazugemacht.
This commit is contained in:
@@ -0,0 +1,295 @@
|
||||
import ezdxf
|
||||
from ezdxf import colors
|
||||
from ezdxf.enums import TextEntityAlignment
|
||||
import math
|
||||
|
||||
def create_grounding_symbol(filename="erdung.dxf"):
|
||||
"""Erstellt ein Schutzerde-Symbol nach DIN EN 60617"""
|
||||
doc = ezdxf.new('R2010')
|
||||
msp = doc.modelspace()
|
||||
|
||||
# Block erstellen
|
||||
block = doc.blocks.new(name='ERDUNG')
|
||||
|
||||
# Mittelpunkt (relativ zum Block)
|
||||
cx, cy = 0, 0
|
||||
|
||||
# Vertikale Linie (Erdungsleiter)
|
||||
block.add_line((cx, cy + 60), (cx, cy - 20))
|
||||
|
||||
# Drei horizontale Linien (Erdsymbol)
|
||||
# Obere Linie (längste)
|
||||
block.add_line((cx - 40, cy - 20), (cx + 40, cy - 20))
|
||||
# Mittlere Linie
|
||||
block.add_line((cx - 25, cy - 35), (cx + 25, cy - 35))
|
||||
# Untere Linie (kürzeste)
|
||||
block.add_line((cx - 15, cy - 50), (cx + 15, cy - 50))
|
||||
|
||||
# Beschriftung PE
|
||||
block.add_text("PE", dxfattribs={
|
||||
'height': 12,
|
||||
'insert': (cx, cy + 70),
|
||||
'halign': TextEntityAlignment.CENTER
|
||||
})
|
||||
|
||||
# Attribute definieren
|
||||
block.add_attdef(tag='REALE_POSITION', insert=(cx, cy - 70), dxfattribs={
|
||||
'height': 8,
|
||||
'prompt': 'Reale Position:',
|
||||
'default': 'x',
|
||||
'halign': TextEntityAlignment.CENTER,
|
||||
'invisible': 1 # Unsichtbar, nur für Daten
|
||||
})
|
||||
|
||||
block.add_attdef(tag='NAME', insert=(cx, cy - 85), dxfattribs={
|
||||
'height': 10,
|
||||
'prompt': 'Name:',
|
||||
'default': '',
|
||||
'halign': TextEntityAlignment.CENTER
|
||||
})
|
||||
|
||||
block.add_attdef(tag='KENNZEICHNUNG', insert=(cx, cy - 100), dxfattribs={
|
||||
'height': 8,
|
||||
'prompt': 'Kennzeichnung:',
|
||||
'default': '=A01+UH00-X01',
|
||||
'halign': TextEntityAlignment.CENTER,
|
||||
'invisible': 1 # Unsichtbar, nur für Daten
|
||||
})
|
||||
|
||||
# Block-Instanz einfügen
|
||||
msp.add_blockref('ERDUNG', (125, 125))
|
||||
|
||||
doc.saveas(filename)
|
||||
print(f"✓ {filename} erstellt")
|
||||
|
||||
def create_switchboard_symbol(filename="schaltschrank.dxf"):
|
||||
"""Erstellt ein schematisches Schaltschrank-Symbol für Lagepläne"""
|
||||
doc = ezdxf.new('R2010')
|
||||
msp = doc.modelspace()
|
||||
|
||||
# Block erstellen
|
||||
block = doc.blocks.new(name='SCHALTSCHRANK')
|
||||
|
||||
# Mittelpunkt (relativ zum Block)
|
||||
cx, cy = 0, 0
|
||||
|
||||
# Rechteck für Schaltschrank (60x80mm)
|
||||
width, height = 60, 80
|
||||
x1, y1 = cx - width/2, cy - height/2
|
||||
x2, y2 = cx + width/2, cy + height/2
|
||||
|
||||
# Außenrahmen
|
||||
block.add_lwpolyline([
|
||||
(x1, y1), (x2, y1), (x2, y2), (x1, y2), (x1, y1)
|
||||
], dxfattribs={'closed': True})
|
||||
|
||||
# Innere Unterteilung (Fächer)
|
||||
block.add_line((x1, cy - 15), (x2, cy - 15))
|
||||
block.add_line((x1, cy + 15), (x2, cy + 15))
|
||||
|
||||
# Türgriff-Symbol (vertikale Linie links)
|
||||
block.add_line((x1 + 5, cy - 25), (x1 + 5, cy + 25))
|
||||
|
||||
# Beschriftung
|
||||
block.add_text("Schaltschrank", dxfattribs={
|
||||
'height': 10,
|
||||
'insert': (cx, y2 + 15),
|
||||
'halign': TextEntityAlignment.CENTER
|
||||
})
|
||||
|
||||
# Attribute definieren
|
||||
block.add_attdef(tag='REALE_POSITION', insert=(cx, y1 - 15), dxfattribs={
|
||||
'height': 8,
|
||||
'prompt': 'Reale Position:',
|
||||
'default': 'x',
|
||||
'halign': TextEntityAlignment.CENTER,
|
||||
'invisible': 1
|
||||
})
|
||||
|
||||
block.add_attdef(tag='NAME', insert=(cx, y1 - 30), dxfattribs={
|
||||
'height': 10,
|
||||
'prompt': 'Name:',
|
||||
'default': '',
|
||||
'halign': TextEntityAlignment.CENTER
|
||||
})
|
||||
|
||||
block.add_attdef(tag='KENNZEICHNUNG', insert=(cx, y1 - 45), dxfattribs={
|
||||
'height': 8,
|
||||
'prompt': 'Kennzeichnung:',
|
||||
'default': '=A01+UH00-X01',
|
||||
'halign': TextEntityAlignment.CENTER,
|
||||
'invisible': 1
|
||||
})
|
||||
|
||||
# Block-Instanz einfügen
|
||||
msp.add_blockref('SCHALTSCHRANK', (125, 125))
|
||||
|
||||
doc.saveas(filename)
|
||||
print(f"✓ {filename} erstellt")
|
||||
|
||||
def create_subdistribution_symbol(filename="unterverteiler.dxf"):
|
||||
"""Erstellt ein Unterverteiler-Symbol (ähnlich Schaltschrank, kleiner)"""
|
||||
doc = ezdxf.new('R2010')
|
||||
msp = doc.modelspace()
|
||||
|
||||
# Block erstellen
|
||||
block = doc.blocks.new(name='UNTERVERTEILER')
|
||||
|
||||
# Mittelpunkt (relativ zum Block)
|
||||
cx, cy = 0, 0
|
||||
|
||||
# Rechteck für Unterverteiler (45x60mm - kleiner als Schaltschrank)
|
||||
width, height = 45, 60
|
||||
x1, y1 = cx - width/2, cy - height/2
|
||||
x2, y2 = cx + width/2, cy + height/2
|
||||
|
||||
# Außenrahmen
|
||||
block.add_lwpolyline([
|
||||
(x1, y1), (x2, y1), (x2, y2), (x1, y2), (x1, y1)
|
||||
], dxfattribs={'closed': True})
|
||||
|
||||
# Innere Unterteilung (weniger Fächer)
|
||||
block.add_line((x1, cy), (x2, cy))
|
||||
|
||||
# Türgriff-Symbol
|
||||
block.add_line((x1 + 4, cy - 15), (x1 + 4, cy + 15))
|
||||
|
||||
# Beschriftung UV (Unterverteiler)
|
||||
block.add_text("UV", dxfattribs={
|
||||
'height': 12,
|
||||
'insert': (cx, cy),
|
||||
'halign': TextEntityAlignment.CENTER,
|
||||
'valign': TextEntityAlignment.MIDDLE
|
||||
})
|
||||
|
||||
# Zusätzliche Beschriftung
|
||||
block.add_text("Unterverteiler", dxfattribs={
|
||||
'height': 10,
|
||||
'insert': (cx, y2 + 15),
|
||||
'halign': TextEntityAlignment.CENTER
|
||||
})
|
||||
|
||||
# Attribute definieren
|
||||
block.add_attdef(tag='REALE_POSITION', insert=(cx, y1 - 15), dxfattribs={
|
||||
'height': 8,
|
||||
'prompt': 'Reale Position:',
|
||||
'default': 'x',
|
||||
'halign': TextEntityAlignment.CENTER,
|
||||
'invisible': 1
|
||||
})
|
||||
|
||||
block.add_attdef(tag='NAME', insert=(cx, y1 - 30), dxfattribs={
|
||||
'height': 10,
|
||||
'prompt': 'Name:',
|
||||
'default': '',
|
||||
'halign': TextEntityAlignment.CENTER
|
||||
})
|
||||
|
||||
block.add_attdef(tag='KENNZEICHNUNG', insert=(cx, y1 - 45), dxfattribs={
|
||||
'height': 8,
|
||||
'prompt': 'Kennzeichnung:',
|
||||
'default': '=A01+UH00-X01',
|
||||
'halign': TextEntityAlignment.CENTER,
|
||||
'invisible': 1
|
||||
})
|
||||
|
||||
# Block-Instanz einfügen
|
||||
msp.add_blockref('UNTERVERTEILER', (125, 125))
|
||||
|
||||
doc.saveas(filename)
|
||||
print(f"✓ {filename} erstellt")
|
||||
|
||||
def create_motor_symbol(filename="motor.dxf"):
|
||||
"""Erstellt ein allgemeines Motor-Symbol (M im Kreis) nach DIN EN 60617"""
|
||||
doc = ezdxf.new('R2010')
|
||||
msp = doc.modelspace()
|
||||
|
||||
# Block erstellen
|
||||
block = doc.blocks.new(name='MOTOR')
|
||||
|
||||
# Mittelpunkt (relativ zum Block)
|
||||
cx, cy = 0, 0
|
||||
radius = 30
|
||||
|
||||
# Kreis
|
||||
block.add_circle((cx, cy), radius)
|
||||
|
||||
# Buchstabe "M" in der Mitte
|
||||
block.add_text("M", dxfattribs={
|
||||
'height': 25,
|
||||
'insert': (cx, cy),
|
||||
'halign': TextEntityAlignment.CENTER,
|
||||
'valign': TextEntityAlignment.MIDDLE
|
||||
})
|
||||
|
||||
# Anschlussklemmen (drei Linien für Drehstrom - optional)
|
||||
# Oben
|
||||
block.add_line((cx, cy + radius), (cx, cy + radius + 20))
|
||||
# Links unten
|
||||
angle1 = math.radians(210)
|
||||
x1 = cx + radius * math.cos(angle1)
|
||||
y1 = cy + radius * math.sin(angle1)
|
||||
block.add_line((x1, y1), (x1 - 15, y1 - 10))
|
||||
# Rechts unten
|
||||
angle2 = math.radians(330)
|
||||
x2 = cx + radius * math.cos(angle2)
|
||||
y2 = cy + radius * math.sin(angle2)
|
||||
block.add_line((x2, y2), (x2 + 15, y2 - 10))
|
||||
|
||||
# Beschriftung
|
||||
block.add_text("Motor", dxfattribs={
|
||||
'height': 10,
|
||||
'insert': (cx, cy - radius - 25),
|
||||
'halign': TextEntityAlignment.CENTER
|
||||
})
|
||||
|
||||
# Attribute definieren
|
||||
block.add_attdef(tag='REALE_POSITION', insert=(cx, cy - radius - 40), dxfattribs={
|
||||
'height': 8,
|
||||
'prompt': 'Reale Position:',
|
||||
'default': 'x',
|
||||
'halign': TextEntityAlignment.CENTER,
|
||||
'invisible': 1
|
||||
})
|
||||
|
||||
block.add_attdef(tag='NAME', insert=(cx, cy - radius - 55), dxfattribs={
|
||||
'height': 10,
|
||||
'prompt': 'Name:',
|
||||
'default': '',
|
||||
'halign': TextEntityAlignment.CENTER
|
||||
})
|
||||
|
||||
block.add_attdef(tag='KENNZEICHNUNG', insert=(cx, cy - radius - 70), dxfattribs={
|
||||
'height': 8,
|
||||
'prompt': 'Kennzeichnung:',
|
||||
'default': '=A01+UH00-X01',
|
||||
'halign': TextEntityAlignment.CENTER,
|
||||
'invisible': 1
|
||||
})
|
||||
|
||||
# Block-Instanz einfügen
|
||||
msp.add_blockref('MOTOR', (125, 125))
|
||||
|
||||
doc.saveas(filename)
|
||||
print(f"✓ {filename} erstellt")
|
||||
|
||||
# Hauptprogramm
|
||||
if __name__ == "__main__":
|
||||
print("Erstelle DXF Elektrosymbole nach DIN EN 60617 mit Attributen...\n")
|
||||
|
||||
create_grounding_symbol()
|
||||
create_switchboard_symbol()
|
||||
create_subdistribution_symbol()
|
||||
create_motor_symbol()
|
||||
|
||||
print("\n✓ Alle Symbole wurden erfolgreich erstellt!")
|
||||
print("\nDateien:")
|
||||
print(" - erdung.dxf")
|
||||
print(" - schaltschrank.dxf")
|
||||
print(" - unterverteiler.dxf")
|
||||
print(" - motor.dxf")
|
||||
print("\nJedes Symbol ist als Block mit folgenden Attributen definiert:")
|
||||
print(" - REALE_POSITION (Standard: 'x', unsichtbar)")
|
||||
print(" - NAME (Standard: leer, sichtbar unter dem Symbol)")
|
||||
print(" - KENNZEICHNUNG (Standard: '=A01+UH00-X01', unsichtbar)")
|
||||
print("\nDie Attribute können in CAD-Programmen bearbeitet werden.")
|
||||
Reference in New Issue
Block a user