# -*- coding: utf-8 -*- """ Eckrad — Modell und Erstellungsfunktionen für Eckrad-Komponenten. Refactoring-Änderungen: - Hartkodierte Block-Namen durch Konstanten (BLOCK_AN8, BLOCK_RICHTUNGSPFEIL, etc.) ersetzt - @staticmethod auf erstellung_eckrad_richtung - 3x try/except in from_merkmale vereinfacht: drehrichtung braucht kein try/except (dict.get wirft nie) - drehung wird nun korrekt an den Konstruktor übergeben (war vorher gelesen aber nicht weitergegeben) - Hinweis: Modell hat keine x/y-Felder, diese werden von Pydantic ignoriert """ from pydantic import BaseModel, Field from typing import Optional from lib import block_methoden # ============================================================================ # KONSTANTEN # ============================================================================ RADIUS = 400 # Radius der Eckrad-Kreise (mm) BLOCK_AN8 = "AN8" # Grundform-Block für Eckrad BLOCK_RICHTUNGSPFEIL = "Richtungspfeil" # Richtungsanzeiger-Block BLOCK_ECKRAD_UZS = "eckrad_UZS" # Eckrad-Block im Uhrzeigersinn BLOCK_ECKRAD_GUZS = "eckrad_GUZS" # Eckrad-Block gegen Uhrzeigersinn RICHTUNGSPFEIL_OFFSET = 200 # Versatz der Richtungspfeile vom Zentrum (mm) # ============================================================================ # HILFSFUNKTIONEN # ============================================================================ def _safe_float(value, default=0.0): """ Konvertiert einen Wert zu float mit Fallback. Args: value: Zu konvertierender Wert (kann None sein) default: Rückgabewert bei Fehler Returns: Float-Wert oder default """ try: if value is None: return default return float(value) except (TypeError, ValueError): return default # ============================================================================ # ECKRAD KLASSE # ============================================================================ class Eckrad(BaseModel): """Modell für Eckrad-Komponenten.""" teileid: str drehung: Optional[float] = Field(default=0.0, description="Rotation des Elements") hoehe: Optional[float] = Field(default=0.0, description="Hoehe des Elements") drehrichtung: Optional[str] = Field( default=None, description="Richtung des Eckrads" ) @classmethod def from_merkmale( cls, teileid: str, x: float, y: float, merkmale: dict ) -> "Eckrad": """ Erstellt Eckrad aus einem Merkmale-Dictionary. Args: teileid: Teile-Identifikator x, y: Koordinaten (werden vom Modell nicht gespeichert) merkmale: Dictionary mit Eigenschaftswerten Returns: Eckrad-Instanz """ hoehe = _safe_float(merkmale.get("Höhe in Meter"), 0.0) * 1000 drehung = _safe_float(merkmale.get("Drehung"), 0.0) # dict.get() wirft keine Ausnahme — kein try/except nötig drehrichtung = merkmale.get("Drehrichtung") return cls( teileid=teileid, hoehe=hoehe, drehung=drehung, drehrichtung=drehrichtung, ) @staticmethod def erstellung_eckrad_richtung(merkmale, doc, lib_doc): """ Erstellt Eckrad-Blöcke mit Richtungspfeilen (UZS und GUZS). Erstellt bei Bedarf neue Blöcke für beide Drehrichtungen, jeder mit dem AN8-Grundform-Block und zwei Richtungspfeilen. Args: merkmale: Dictionary mit "Höhe in m" doc: DXF-Dokument lib_doc: Bibliotheks-Dokument Returns: (eckrad_rechts, eckrad_links, hight): Blocknamen und Höhe in mm """ block_methoden.import_block(BLOCK_AN8, lib_doc, doc) block_methoden.import_block(BLOCK_RICHTUNGSPFEIL, lib_doc, doc) hight = float(merkmale.get("Höhe in m")) * 1000 # Blöcke nur erstellen wenn noch nicht vorhanden if BLOCK_ECKRAD_UZS not in doc.blocks: block_rechts = doc.blocks.new(name=BLOCK_ECKRAD_UZS, base_point=(0, 0, 0)) block_links = doc.blocks.new(name=BLOCK_ECKRAD_GUZS, base_point=(0, 0, 0)) # Grundform für beide block_rechts.add_blockref(BLOCK_AN8, (0, 0, 0)) block_links.add_blockref(BLOCK_AN8, (0, 0, 0)) # UZS: Pfeile bei (+offset, +RADIUS) und (-offset, -RADIUS) block_rechts.add_blockref( BLOCK_RICHTUNGSPFEIL, (RICHTUNGSPFEIL_OFFSET, RADIUS, 0), ) block_rechts.add_blockref( BLOCK_RICHTUNGSPFEIL, (-RICHTUNGSPFEIL_OFFSET, -RADIUS, 0), dxfattribs={"rotation": 180}, ) # GUZS: Pfeile bei (+offset, -RADIUS) und (-offset, +RADIUS) block_links.add_blockref( BLOCK_RICHTUNGSPFEIL, (RICHTUNGSPFEIL_OFFSET, -RADIUS, 0), ) block_links.add_blockref( BLOCK_RICHTUNGSPFEIL, (-RICHTUNGSPFEIL_OFFSET, RADIUS, 0), dxfattribs={"rotation": 180}, ) return BLOCK_ECKRAD_UZS, BLOCK_ECKRAD_GUZS, hight