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.")
