Files

149 lines
5.1 KiB
Python

# -*- 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