# -*- coding: utf-8 -*- """ Angetriebene_Kurve — Modell für angetriebene Kurven. Refactoring-Änderungen: - antrieb-Property Side-Effect entfernt: Normalisierung "Aussen"→"außen" etc. wird nun beim Erstellen durch @field_validator erledigt - antrieb-Property ist jetzt ein reiner read-only Getter """ from pydantic import BaseModel, Field, field_validator class Angetriebene_Kurve(BaseModel): """Modell für eine angetriebene Kurve.""" teileid: str x: float y: float drehung: float = Field(default=0.0, description="Rotation der Kurve") hoehe0: float = Field(default=0.0, description="Hoehe Anfang der Kurve") hoehe1: float = Field(default=0.0, description="Hoehe Ende der Kurve") kurvenrichtung: str = Field(description="Kurvenrichtung der Kurve") antriebNebenStrecke: str = Field( description="wo die Angetriebene Strecke ist abhängig von der kurvenrichtung" ) winkel: int = Field(description="Der Winkel der Kurve") @field_validator("antriebNebenStrecke", mode="before") @classmethod def normalize_antrieb(cls, v): """ Normalisiert die Antrieb-Bezeichnung beim Erstellen. Konvertiert englische/gemischte Schreibvarianten in die konsistente deutsche Kleinbuchstaben-Form. "Aussen" → "außen", "Innen" → "innen" """ if isinstance(v, str): mapping = {"Aussen": "außen", "Innen": "innen"} return mapping.get(v, v) return v @property def antrieb(self) -> str: """Antrieb-Seite (read-only, normalisiert beim Erstellen).""" return self.antriebNebenStrecke @property def hight_zwischen(self): """Mittlere Höhe zwischen hoehe0 und hoehe1.""" return (self.hoehe0 + self.hoehe1) / 2 @classmethod def from_merkmale( cls, teileid: str, x: float, y: float, merkmale: dict ) -> "Angetriebene_Kurve": """ Erstellt Angetriebene_Kurve aus einem Merkmale-Dictionary. Args: teileid: Teile-Identifikator x, y: Koordinaten in mm merkmale: Dictionary mit Eigenschaftswerten Returns: Angetriebene_Kurve-Instanz """ hoehe0 = float(merkmale.get("Höhe Anfang")) * 1000 hoehe1 = float(merkmale.get("Höhe Ende")) * 1000 winkel = int(merkmale.get("Kurvenwinkel")) kurvenrichtung = merkmale.get("Kurvenrichtung") antriebNebenstrecke = merkmale.get("AntriebNebenStrecke") try: drehung = float(merkmale.get("Drehung")) except (TypeError, ValueError): drehung = 0.0 return cls( teileid=teileid, x=x, y=y, drehung=drehung, hoehe0=hoehe0, hoehe1=hoehe1, kurvenrichtung=kurvenrichtung, antriebNebenStrecke=antriebNebenstrecke, winkel=winkel, )