feat: Sivas-Merkmale 4427-4432 (AS-/ES-Element) im Export befuellen

Die Streckenbloecke GF_N und VF_N tragen Winkel und Seite ihres AS-/ES-
Elements bereits als Attribute des gemeinsamen Schemas (WINKEL_AS/SEITE_AS/
WINKEL_ES/SEITE_ES, *strecke-attr-front* in ssg_core.lsp). Diese Information
landet jetzt auch im details-JSON des Sivas-Exports.

Zuordnung (Sivas-Hierarchie: 4431/4432 schalten Winkel und Seite frei):
  4431/4432  AS-/ES-Element vorhanden   Ja/Nein
  4427/4429  Winkel                     "30 °"/"90 °"
  4428/4430  Seite                      links/rechts

Die Zuordnung steht vollstaendig in cfg/sivas.cfg - mit denselben sechs
Zeilen in [gefaellestrecke] und [variofoerderer], jeweils direkt hinter 2950,
was auch die Reihenfolge im details-JSON bestimmt.

Ob ein Element vorhanden ist, entscheidet ausschliesslich WINKEL_AS/WINKEL_ES:
das Schema laesst den Winkel leer, wenn keines gewaehlt wurde, waehrend
SEITE_AS/SEITE_ES mit "rechts" immer einen Vorgabewert tragen. Ohne Element
bleiben Winkel UND Seite leer, damit in Sivas keine Seite unter einem
"Nein"-Knoten haengt.

Weitere Punkte:
- sivas_mapping: neuer Dekorator @braucht_attribs. Ein so markierter
  Transform wird als fn(wert, attribs) statt fn(wert) aufgerufen und sieht
  damit die uebrigen Attribute des Blocks - noetig, weil die Seite vom
  Winkel abhaengt. Ohne diese Klammer muessten bedingte Merkmale wieder als
  Python-Code aus der Config herauswandern.
- Die Winkel-Schreibweise der Sivas-Auswahlliste ("30 °" mit Leerzeichen vor
  dem Gradzeichen) steht als Tabelle [as_es_winkel_anzeige] in sivas.cfg,
  Bauart wie [geruest_typ_anzeige] - weicht Sivas davon ab, ist das die
  einzige Stelle zum Nachziehen.
- gefaellestrecke_signature beruecksichtigt AS/ES: zwei sonst baugleiche
  Gefaellestrecken mit AS links bzw. rechts bleiben getrennte Zeilen, sonst
  zeigte die gemeinsame Zeile nur die Seite des ersten Blocks.
- Altbestand ohne diese Attribute meldet "Nein" statt abzubrechen.
- Merkmalsstamm_in_Sivas.xlsx auf den aktuellen Sivas-Stand gebracht
  (enthaelt neben 4427-4432 auch 4002, 7010-7013 und Klartext-Korrekturen;
  4339/4383 heissen jetzt eindeutig "... Gefaellestrecke"/"... Variofoerderer").
- 12 neue Tests in tests/test_export_sivas_as_es.py, ohne BricsCAD lauffaehig.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-10-14 10:28:35 +02:00
parent 4fdeaf831f
commit 4ce2a02205
6 changed files with 396 additions and 12 deletions
+51 -4
View File
@@ -28,19 +28,45 @@
# (TRANSFORMS-Dict), die den ermittelten Rohwert
# (Attribut- oder Default-Wert) in die Sivas-Anzeige
# umwandelt (z.B. "0"/"1" -> "Ja"/"Nein"). Bekannte Namen:
# ja_nein, geruest_typ_anzeige. Ein unbekannter Name
# ja_nein, geruest_typ_anzeige, mm_zu_m, as_es_vorhanden,
# as_es_winkel, as_seite, es_seite. Ein unbekannter Name
# bricht NICHT ab, der Rohwert wird unveraendert
# uebernommen (siehe sivas_mapping.anwenden).
# Soll ein Merkmal ohne eigenes Attribut nur per Transform
# entstehen, braucht die Zeile trotzdem den ":" vor dem
# "|" ("WINKEL_AS : | as_es_vorhanden") - sonst gilt der
# Transform-Name als Fallback-Attributname.
# Transforms, die mit @braucht_attribs markiert sind
# (as_seite/es_seite), sehen zusaetzlich alle uebrigen
# Attribute des Blocks - noetig, wenn ein Merkmal von
# einem ZWEITEN Attribut abhaengt (Seite nur, wenn der
# zugehoerige Winkel ueberhaupt ein Element ausweist).
#
# Abschnittsnamen entsprechen den bisherigen build_*_details-Funktionen in
# export_sivas.py: [gefaellestrecke], [kreisel], [eckrad], [geruest]. Die
# geruest-typ-Anzeige-Tabelle (ASCII-Attributwert -> Sivas-Klartext mit
# Umlauten) UND SEPARATOR_BEARBEITUNG_ANZEIGE bleiben eigene, kleine
# Abschnitte weiter unten.
# Anzeige-Tabellen (ASCII-Attributwert -> Sivas-Klartext/Optionswert:
# [geruest_typ_anzeige], [as_es_winkel_anzeige]) UND
# SEPARATOR_BEARBEITUNG_ANZEIGE bleiben eigene, kleine Abschnitte weiter
# unten.
#
# [gefaellestrecke] und [variofoerderer] fuehren die AS-/ES-Merkmale
# (4427-4432) absichtlich DOPPELT: GF_N- und VF_N-Bloecke tragen dieselben
# Attribute des gemeinsamen Strecken-Schemas, und jeder Abschnitt soll fuer
# sich lesbar bleiben. Aenderungen dort bitte in beiden nachziehen (der Test
# tests/test_export_sivas_as_es.py::test_zuordnung_steht_in_der_config wacht
# darueber).
# ============================================================
[gefaellestrecke]
2950= MONTAGEHOEHE_m : 0
# AS-/ES-Element, Reihenfolge wie die Sivas-Hierarchie (identisch in
# [variofoerderer]): 4431/4432 Ja/Nein schalten Winkel und Seite frei.
4431= WINKEL_AS : | as_es_vorhanden
4427= WINKEL_AS : | as_es_winkel
4428= SEITE_AS : | as_seite
4432= WINKEL_ES : | as_es_vorhanden
4429= WINKEL_ES : | as_es_winkel
4430= SEITE_ES : | es_seite
4384= : Gefällestrecke
4318= L_GF_m
4391= GF_WINKEL
@@ -85,6 +111,14 @@ Farbe= FARBE
# Die Gefaelle-/Vario-Segmentpaare (4312-4392, 4353/4354/4386) haengen an der
# Listenlaenge von L_GF_m/L_VF_m und bleiben Code.
2950= MONTAGEHOEHE_m : 0
# AS-/ES-Element, Reihenfolge wie die Sivas-Hierarchie (identisch in
# [gefaellestrecke]): 4431/4432 Ja/Nein schalten Winkel und Seite frei.
4431= WINKEL_AS : | as_es_vorhanden
4427= WINKEL_AS : | as_es_winkel
4428= SEITE_AS : | as_seite
4432= WINKEL_ES : | as_es_vorhanden
4429= WINKEL_ES : | as_es_winkel
4430= SEITE_ES : | es_seite
4329= GF_Bogen_L_90 : 0
4330= GF_Bogen_L_60 : 0
4331= GF_Bogen_L_30 : 0
@@ -103,6 +137,19 @@ Farbe= FARBE
3992= GERUEST_EINZELMODUL : 0 | ja_nein
3993= GERUEST_TYP : Schoenenberger Geruest | geruest_typ_anzeige
[as_es_winkel_anzeige]
# Attributwert WINKEL_AS/WINKEL_ES -> Optionswert der Sivas-Auswahlliste zu
# Merkmal 4427/4429. Im Merkmalstamm heissen die Optionen "30 °"/"90 °" (mit
# Leerzeichen vor dem Gradzeichen) - das Attribut in der Zeichnung bleibt die
# nackte Zahl. Gleiche Bauart wie [geruest_typ_anzeige]: steht ein Winkel
# hier NICHT drin, wird er unveraendert uebernommen.
#
# >>> Falls Sivas den Import mit "30 °" ablehnt, ist DIESE Tabelle die
# >>> einzige Stelle zum Nachziehen (z.B. auf "30°" ohne Leerzeichen oder
# >>> auf die nackte Zahl) - der Code bleibt unberuehrt.
30= 30 °
90= 90 °
[geruest_typ_anzeige]
# ASCII-Attributwert (GERUEST_TYP) -> Sivas-Klartext mit Umlauten/Sonder-
# zeichen (Attribute selbst bleiben ASCII, siehe CLAUDE.md-Konvention).