Files
y.wang b8e8d0b0a0 feat: Kettenfoerderer (Schraegfoerderer Stahl) als parametrische 3D-Baugruppe
Neues Modul KettenFoerderer.lsp: baut aus KF_UM_<winkel>, KF_LAENGE und
KF_AN_<winkel> (je KS_AUS auf KS_EIN) plus der Draufsicht KF_2D einen Block
KF_<n>. Die Bausteine werden aufgerichtet eingebaut (Rz*Rx(90)*Rz), die Hoehe
laeuft in Z; KF_2D liegt deckungsgleich mit der Kette. Der Einbauwinkel jedes
Folgebausteins wird aus der Richtung des KS_AUS seines Vorgaengers gemessen,
KF_LAENGE ueber die Einbauhoehe skaliert.

- Dialog (DCL-Vorlage, Typ als Radiobuttons), Hoehe per Zahl oder aus zwei
  Punkten, Doppelklick auf KF_n oeffnet KF_EDIT mit Neuaufbau
- eigenstaendiges Attribut-Schema, Auswahllisten mit Sivas-Optionstexten in
  data/json/kettenfoerderer.json
- Sivas-Export: Merkmale 350, 353-357, 359-361, 391, baugleiche Foerderer
  werden zu einer Zeile zusammengefasst (Artikelnummer 6120)
- ssg_ks_insert.lsp: neue Primitiven ks-xy-winkel, ks-block-messen,
  insert-block-ks-skaliert und insert-block-ks-matrix (freie 3x3-Rotation);
  ensure-block-loaded nimmt Bloecke ohne Dimensionssuffix unveraendert
- Menueeintrag KettenFoerderer aktiviert, toter Dummy OMNI_KettenFoerderer
  entfernt; KF_* im Export-Pattern, in der ID-Vergabe und im Dispatcher
  SSG_BLOCKEDIT (vor dem Omniflo-Zweig)
- Unit-Tests tu-tests-kf fuer die reinen Rechenkerne; Modul wird in der MNL
  vorgeladen, dbg-Schalter kf-zeit zur Laufzeitmessung

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-23 15:34:27 +02:00

211 lines
9.9 KiB
INI

# ============================================================
# sivas.cfg - Attribut->Sivas-Merkmal-Zuordnung fuer lib/export_sivas.py
#
# Deckt NUR die "einfachen" Faelle ab: eine Sivas-Merkmalnummer entspricht
# genau einem (ggf. per Fallback alternativen) Block-Attribut, optional mit
# festem Default und/oder einer benannten Transform-Funktion. Berechnete
# Werte, die von der Anzahl vorhandener Segmente abhaengen oder mehrere
# Attribute kombinieren (VarioFoerderer-Gefaelle-/Vario-Segmentpaare 4312-
# 4392/4353-4386, die ILS-Automation-Summenzeile) bleiben bewusst Python-Code
# in export_sivas.py - ein flaches Attribut-Mapping kann bedingte/berechnete
# Werte nicht abbilden.
#
# Format je Zeile (Abschnitt = Elementtyp, Key = Sivas-Merkmalnummer):
# merkmal = attribut
# merkmal = attribut : default
# merkmal = attribut | alt_attribut : default
# merkmal = attribut : default | transform
#
# attribut - Name des Block-Attributs (ssg-attrib-*, siehe jeweiliges
# .lsp-Modul). Fehlt es in der Zeichnung, greift default.
# | alt_attribut - optionaler Fallback-Attributname (aeltere Zeichnungen mit
# abweichendem Attributnamen, z.B. N_SEPARATOREN vor der
# Umbenennung zu ANZAHL_SEPARATOR). Wird nur genutzt, wenn
# attribut selbst fehlt.
# : default - Vorgabewert, falls weder attribut noch alt_attribut in
# der Zeichnung gesetzt sind. Fehlt ":", ist default "".
# | transform - Name einer Python-Funktion in export_sivas.py
# (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, 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
# 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
4337= ANZAHL_SEPARATOR : 0
4338= : ohne HARTCOAT HRC 50 ± 5
4339= ANZAHL_SCANNER : 0
3992= GERUEST_EINZELMODUL : 0 | ja_nein
3993= GERUEST_TYP : Schoenenberger Geruest | geruest_typ_anzeige
# 4300 (Streckengruppe "ein Objekt"/"mehrere Objekte") und 4311 (Anzahl der
# gruppierten Bloecke) bleiben Code (streckengruppe_objekt_text, anzahl-Param.).
[kreisel]
2952= MONTAGEHOEHE_m : 0
3511= : 1
3515= ANZAHL_SEPARATOR | N_SEPARATOREN : 2
3517= ANZAHL_SCANNER | N_SCANNER : 0
3519= ANZAHL_RAMPEN | N_RAMPEN : 0
3992= GERUEST_EINZELMODUL : 0 | ja_nein
3993= GERUEST_TYP : Schoenenberger Geruest | geruest_typ_anzeige
# 3510 (Kreiselart-Anzeigetext) und 3512 (Abstand in m, gerundet) bleiben
# Code (bedingte Umbenennung bzw. Umrechnung mm->m).
[eckrad]
# Am Kreisel ausgerichtet, aber nur Merkmale, fuer die das Eckrad-Objekt ein
# Attribut hat (*eckrad-attrib-defs*); Merkmalnummern aus
# Merkmalsstamm_in_Sivas.xlsx. Hoehe: beim Eckrad 2950 "Anlagenhoehe in
# Meter" (NICHT 2952 "Kreiselhoehe" wie beim Kreisel), Wert aus HOEHE (mm),
# da das Eckrad kein MONTAGEHOEHE_m traegt. 3381 "Eckrad - zu
# fertigende Menge" steht wie 3511 beim Kreisel fest auf 1 (reale Stueckzahl
# in der Anzahl-Spalte). Separatoren (3382/3383) hat das Eckrad nicht.
2950= HOEHE : 0 | mm_zu_m
3381= : 1
3992= GERUEST_EINZELMODUL : 0 | ja_nein
3993= GERUEST_TYP : Schoenenberger Geruest | geruest_typ_anzeige
[geruest]
Farbe= FARBE
[kettenfoerderer]
# Kettenfoerderer / Schraegfoerderer Stahl (KF_n, Lisp/KettenFoerderer.lsp).
# Merkmalnummern laut Merkmalstamm des Schraegfoerderers.
#
# 350 kommt aus FOERDERERTYP (Bauart im Klartext). Der Default greift nur
# bei Altbestands-Bloecken ohne das Attribut.
# 359 kommt aus WINKEL, das den Neigungswinkel als nackte Zahl fuehrt
# ("26"/"30"); die Anzeige-Tabelle [kf_typ_anzeige] weiter unten macht
# daraus den Sivas-Optionstext mit Gradzeichen. Grund fuer die
# Zweiteilung: Block-Attribute bleiben laut Projektkonvention ASCII.
# 353 (Anzahl der gleichen KF) steht ABSICHTLICH NICHT hier: der Wert
# entsteht erst aus der Gruppierung baugleicher Bloecke
# (kettenfoerderer_signature in export_sivas.py) und ist damit kein
# flaches Attribut-Mapping - gleiche Bauart wie 3510/3512 beim Kreisel.
# 356 und 361 nutzen den vorhandenen Transform ja_nein, die Attribute
# fuehren "1"/"0".
# 357 "Antriebsart" ist beim Kettenfoerderer FEST (1.1 kW): im Dialog ein
# Dropdown mit genau einer, zwingend gewaehlten Option - das Attribut gibt es trotzdem, damit der Wert am
# Block steht und nicht nur im Export auftaucht.
# 354 "Farbe Foerderer" und 355 "Antriebsmotor Foerderer" sind ZWEI getrennte
# Merkmale (nicht ein kombinierter Text) - im Dialog darum auch zwei
# Felder, Attribute FARBE und ANTRIEBSMOTOR.
# 354/355/391 tragen bereits den vollen Sivas-Optionstext im Attribut (die
# Auswahllisten in data/json/kettenfoerderer.json liefern ihn so) -
# darum kein Transform.
350= FOERDERERTYP : Schrägförderer Stahl
359= WINKEL : 26 | kf_typ_anzeige
361= STANDARD_STEUERUNG : 0 | ja_nein
354= FARBE : RAL 7035
355= ANTRIEBSMOTOR : Europa 50 Hz
357= ANTRIEBSART : 1.1 kW
356= MOVIMOT : 0 | ja_nein
360= H_EINBAUHOEHE_mm : 0
391= VERBINDUNGSELEMENTE : Nein
[variofoerderer]
# Nur die von der Segmentanzahl UNABHAENGIGEN Top-Level-Felder einer VF_N-
# Streckengruppe (siehe build_variofoerderer_details in export_sivas.py).
# 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
4332= GF_Bogen_R_90 : 0
4333= GF_Bogen_R_60 : 0
4334= GF_Bogen_R_30 : 0
4373= VF_Bogen_A_90 : 0
4374= VF_Bogen_A_60 : 0
4375= VF_Bogen_A_30 : 0
4376= VF_Bogen_I_90 : 0
4377= VF_Bogen_I_60 : 0
4378= VF_Bogen_I_30 : 0
4381= ANZAHL_SEPARATOR : 0
4382= : ohne HARTCOAT HRC 50 ± 5
4383= ANZAHL_SCANNER : 0
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).
Schoenenberger Geruest= Schönenberger-Gerüst
[kf_typ_anzeige]
# Attributwert WINKEL (Neigungswinkel als nackte Zahl) -> Optionswert der
# Sivas-Auswahlliste zu Merkmal 359. Gleiche Bauart wie
# [geruest_typ_anzeige]/[as_es_winkel_anzeige]: steht ein Wert hier NICHT
# drin, wird er unveraendert uebernommen.
#
# >>> Lehnt Sivas den Import ab, ist DIESE Tabelle die einzige Stelle zum
# >>> Nachziehen (z.B. "26 °" mit Leerzeichen) - der Code bleibt unberuehrt.
26= Schrägförderer Stahl 26°
30= Schrägförderer Stahl 30°
[weichen]
# ILS 2.0 Weiche (6216): eine Summenzeile, Werte aus den Kreisel-Beruehr-
# punkten des LISP-Exports (kreisel_weichen.json). Ein Beruehrpunkt ist eine
# Weichenkombination = 1x aktiv + 1x passiv, darum lesen beide Merkmale
# dieselbe Zahl ANZAHL_WEICHEN (= Anzahl Beruehrpunkte, siehe export_sivas.py).
3371= ANZAHL_WEICHEN : 0
3372= ANZAHL_WEICHEN : 0