feat: Eckrad-Dialog, Kreiselname, Hoehen-Neuberechnung beim Export

- Eckrad: eigener DCL-Dialog (eckrad_edit.dcl) beim Einfuegen und per
  Doppelklick (EckradEdit); Sivas-Merkmale am Kreisel ausgerichtet
  (2950, 3381, 3992 Ja/Nein); bei Sep./Scanner-Zaehlung ausgenommen
- Kreisel: eigener Name bleibt in Bezeichnung + Beschriftung erhalten
- Sivas: Kreisel/Eckrad unterschiedlicher Hoehe nicht mehr zusammengefasst
- Export: Hoehen-Attribute in Z verschobener Kreisel/Eckrad/VF/GF neu
  berechnet
- GF-Edit: Einfuegehoehe aus aktueller Z-Koordinate
This commit is contained in:
2026-10-13 14:24:01 +02:00
parent ea0e46a441
commit 6044c35957
15 changed files with 453 additions and 68 deletions
+17 -14
View File
@@ -113,17 +113,17 @@ def ja_nein(flag_1_0):
return "Ja" if flag_1_0 == "1" else "Nein"
def ist_eins(flag_1_0):
"""Wandelt ein "0"/"1"-Attribut in ein echtes bool um (True/False im
JSON, NICHT "Ja"/"Nein" wie ja_nein - siehe build_eckrad_details)."""
return flag_1_0 == "1"
def mm_zu_m(wert_mm):
"""Wandelt ein mm-Attribut (z.B. Eckrad-HOEHE) in Meter um, gerundet wie
3512 beim Kreisel ("2000" -> "2.0")."""
return str(round(safe_float(wert_mm, 0.0) / 1000.0, 3))
# --- Transform-Namen, wie sie in cfg/sivas.cfg hinter "|" stehen koennen ---
TRANSFORMS = {
"ja_nein": ja_nein,
"geruest_typ_anzeige": geruest_typ_anzeige,
"ist_eins": ist_eins,
"mm_zu_m": mm_zu_m,
}
@@ -157,13 +157,15 @@ def build_gefaellestrecke_details(block, anzahl=1):
def kreisel_signature(block):
"""
Schluessel zur Gruppierung gleichartiger Kreisel: Kreiselart, Abstand,
Anzahl der Separatoren, Anzahl der Scanner, Anzahl der Rampen sowie
Geruest fuer Einzelmodul/Geruestoption entscheiden, ob Kreisel in
derselben Sivas-Zeile summiert werden.
Schluessel zur Gruppierung gleichartiger Kreisel: Montagehoehe (Merkmal
2952), Kreiselart, Abstand, Anzahl der Separatoren, Anzahl der Scanner,
Anzahl der Rampen sowie Geruest fuer Einzelmodul/Geruestoption
entscheiden, ob Kreisel in derselben Sivas-Zeile summiert werden.
Die Hoehe wird numerisch verglichen ("4.820" == "4.82").
"""
attribs = block.get("attribs", {})
return (
round(safe_float(attribs.get("MONTAGEHOEHE_m", "0"), 0.0), 3),
attribs.get("KREISELART", "STANDARD"),
attribs.get("ABSTAND", "2300"),
attribs.get("ANZAHL_SEPARATOR", attribs.get("N_SEPARATOREN", "2")),
@@ -176,12 +178,13 @@ def kreisel_signature(block):
def eckrad_signature(block):
"""
Schluessel zur Gruppierung gleichartiger Eckraeder: Geruest fuer
Einzelmodul/Geruestoption entscheiden, ob Eckraeder in derselben
Sivas-Zeile summiert werden.
Schluessel zur Gruppierung gleichartiger Eckraeder: Hoehe (Merkmal 2950)
und Geruest fuer Einzelmodul/Geruestoption entscheiden, ob Eckraeder in
derselben Sivas-Zeile summiert werden.
"""
attribs = block.get("attribs", {})
return (
mm_zu_m(attribs.get("HOEHE", "0")),
attribs.get("GERUEST_EINZELMODUL", "0"),
attribs.get("GERUEST_TYP", "Schoenenberger Geruest"),
)
@@ -315,8 +318,8 @@ def build_kreisel_details(block):
def build_eckrad_details(block):
"""Merkmale-Dict fuer ein ILS Eckrad. Vollstaendig aus cfg/sivas.cfg
[eckrad] (keine berechneten Werte)."""
"""Merkmale-Dict fuer eine Gruppe gleichartiger ILS Eckraeder.
Vollstaendig aus cfg/sivas.cfg [eckrad] (2950 per Transform mm_zu_m)."""
attribs = block.get("attribs", {})
return sivas_mapping.anwenden(SIVAS_MAPPING_ECKRAD, attribs, TRANSFORMS)
+1 -3
View File
@@ -109,9 +109,7 @@ def anwenden(section_mapping, attribs, transforms):
Rueckgabe: dict merkmal -> wert. Ohne Transform wird der Rohwert zu str()
gewandelt (bisheriges Verhalten der build_*_details-Funktionen: alles
Merkmalnummer-Werte sind Strings). Ein Transform liefert seinen
Rueckgabewert UNVERAENDERT (z.B. build_eckrad_details erwartet fuer
"Geruest fuer Einzelmodul" ein echtes bool, kein "True"/"False"-String -
json.dumps schreibt dann true/false statt eines Strings).
Rueckgabewert UNVERAENDERT (er ist selbst fuer den Typ verantwortlich).
"""
ergebnis = {}
for merkmal, (attribut, alt_attribut, default, transform) in section_mapping.items():