90 lines
2.9 KiB
Python
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,
|
|
)
|