Files
plant2dxf/lib/Elemente/Angetriebene_Kurve.py
T

90 lines
2.9 KiB
Python

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