Unittests zu allen Elementen erstellt
This commit is contained in:
+123
-30
@@ -1,12 +1,64 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from pydantic import BaseModel, Field, field_validator
|
||||
"""
|
||||
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
|
||||
|
||||
RADIUS = 400
|
||||
|
||||
# ============================================================================
|
||||
# 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")
|
||||
@@ -18,38 +70,79 @@ class Eckrad(BaseModel):
|
||||
def from_merkmale(
|
||||
cls, teileid: str, x: float, y: float, merkmale: dict
|
||||
) -> "Eckrad":
|
||||
try:
|
||||
hoehe = float(merkmale.get("Höhe in Meter")) * 1000
|
||||
except Exception as e:
|
||||
hoehe = 0.0
|
||||
try:
|
||||
drehung = float(merkmale.get("Drehung"))
|
||||
except Exception as e:
|
||||
drehung = 0.0
|
||||
try:
|
||||
drehrichtung = merkmale.get("Drehrichtung")
|
||||
except Exception as e:
|
||||
drehrichtung = None
|
||||
return cls(teileid=teileid, x=x, y=y, hoehe=hoehe, drehrichtung=drehrichtung)
|
||||
"""
|
||||
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):
|
||||
block_methoden.import_block("AN8", lib_doc, doc)
|
||||
block_methoden.import_block("Richtungspfeil", lib_doc, doc)
|
||||
eckrad_rechts = "eckrad_UZS"
|
||||
eckrad_links = "eckrad_GUZS"
|
||||
"""
|
||||
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
|
||||
# Erstellung der Richtungung Blöcke der Eckrads
|
||||
if eckrad_rechts not in doc.blocks:
|
||||
block_rechts = doc.blocks.new(name=eckrad_rechts, base_point=(0, 0, 0))
|
||||
block_links = doc.blocks.new(name=eckrad_links, base_point=(0, 0, 0))
|
||||
block_rechts.add_blockref("AN8", (0, 0, 0))
|
||||
block_links.add_blockref("AN8", (0, 0, 0))
|
||||
block_rechts.add_blockref("Richtungspfeil", (0 + 200, 0 + RADIUS, 0))
|
||||
|
||||
# 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(
|
||||
"Richtungspfeil", (0 - 200, 0 - RADIUS, 0), dxfattribs={"rotation": 180}
|
||||
BLOCK_RICHTUNGSPFEIL,
|
||||
(RICHTUNGSPFEIL_OFFSET, RADIUS, 0),
|
||||
)
|
||||
block_links.add_blockref("Richtungspfeil", (0 + 200, 0 - 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(
|
||||
"Richtungspfeil", (0 - 200, 0 + RADIUS, 0), dxfattribs={"rotation": 180}
|
||||
BLOCK_RICHTUNGSPFEIL,
|
||||
(RICHTUNGSPFEIL_OFFSET, -RADIUS, 0),
|
||||
)
|
||||
return eckrad_rechts, eckrad_links, hight
|
||||
block_links.add_blockref(
|
||||
BLOCK_RICHTUNGSPFEIL,
|
||||
(-RICHTUNGSPFEIL_OFFSET, RADIUS, 0),
|
||||
dxfattribs={"rotation": 180},
|
||||
)
|
||||
|
||||
return BLOCK_ECKRAD_UZS, BLOCK_ECKRAD_GUZS, hight
|
||||
|
||||
Reference in New Issue
Block a user