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>
15 KiB
Sivas-Merkmal-Zuordnung (export_sivas.py)
Diese Datei dokumentiert, welches Block-Attribut in export_raw.json welche
Sivas-Merkmalnummer im details-JSON von export_sivas.py befuellt (Spalte
Nr;TeileArt;SivasNummer;Bezeichnung;Dispogruppe;Anzahl;Laenge[mm];IDs;details).
Bezeichnungen stammen aus cfg/Merkmalsstamm_in_Sivas.xlsx. Einzige Quelle
der Wahrheit ist der Code in lib/export_sivas.py - diese Datei ist ein
Backup/Nachschlagewerk, bei Aenderungen am Code bitte hier nachziehen.
Stand: abgeglichen mit lib/export_sivas.py nach der Umstellung von
beschreibenden JSON-Keys auf reine Merkmalnummern (Sept. 2026), ergaenzt um
die AS-/ES-Element-Merkmale 4427-4432 (Okt. 2026).
ILS 2.0 Kreisel (SivasNr 6200, Dispogruppe 20)
Gruppierung: gleiche Kreiselart+Abstand+Separatoren/Scanner/Rampen+Geruest
werden zu EINER Zeile zusammengefasst (kreisel_signature). Die Anzahl-Spalte
traegt die reale Stueckzahl der Gruppe.
| Merkmalnr | Bezeichnung (Merkmalstamm) | Block-Attribut | Berechnung |
|---|---|---|---|
| 2952 | Kreiselhoehe in Meter | MONTAGEHOEHE_m |
direkt |
| 3510 | Kreisel oder Kreisel mit PINBAND oder Verbindungskreisel | KREISELART |
"PIN" -> "Kreisel mit PINBAND", sonst "Kreisel" |
| 3511 | Kreisel - zu fertigende Menge | - | fest "1" (reale Stueckzahl steht in der Anzahl-Spalte der Zeile) |
| 3512 | Kreisel - Abstand (Kreiselachse A - Kreiselachse B) in Meter | ABSTAND |
round(ABSTAND/1000, 2) |
| 3515 | Kreisel - Anzahl der Separatoren | ANZAHL_SEPARATOR (Fallback N_SEPARATOREN) |
direkt |
| 3517 | Kreisel - Anzahl der Scanner | ANZAHL_SCANNER (Fallback N_SCANNER) |
direkt |
| 3519 | Kreisel - Anzahl der Rampen | ANZAHL_RAMPEN (Fallback N_RAMPEN) |
direkt |
| 3992 | Geruest fuer Einzelmodul | GERUEST_EINZELMODUL |
"1" -> "Ja", sonst "Nein" |
| 3993 | Geruestoption fuer Einzelmodul | GERUEST_TYP |
Anzeige-Uebersetzung, siehe GERUEST_TYP_ANZEIGE ("Schoenenberger Geruest" -> "Schoenenberger-Geruest" mit Umlauten) |
ILS 2.0 Strecke - Streckengruppe VF_N (SivasNr 6220, Dispogruppe 20)
Je VF_N-Block IMMER eine eigene Zeile (keine Gruppierung), Anzahl-Spalte immer 1. Sivas kennt je Streckengruppe nur EIN Gefaelle-Segment-Paar (001/002) und EIN Vario-Segment (001).
| Merkmalnr | Bezeichnung (Merkmalstamm) | Block-Attribut | Berechnung |
|---|---|---|---|
| 2950 | Anlagenhoehe in Meter | MONTAGEHOEHE_m |
direkt |
| 4300 | Streckengruppe | - | fest "mehrere Objekte" |
| 4311 | Strecken- zu fertigende Menge | - | fest "1" |
| 4312 | Streckengruppe - Gefaellestrecke (Segment 001 vorhanden) | L_GF_m (1. Wert vorhanden?) |
"Ja"/"Nein" |
| 4318 | Streckengruppe - Gefaellestrecke 001-Laenge in Meter | L_GF_m (1. Wert) |
nur wenn Segment 1 existiert |
| 4391 | Streckengruppe - Gefaellestrecke 001 -Winkel | GF_WINKEL (1. Wert) |
int(...), nur wenn Segment 1 existiert |
| 4314 | Streckengruppe - Gefaellestrecke 002 (Segment vorhanden) | L_GF_m (2. Wert vorhanden?) |
"Ja"/"Nein" |
| 4319 | Streckengruppe - Gefaellestrecke 002-Laenge in Meter | L_GF_m (2. Wert) |
nur wenn Segment 2 existiert |
| 4392 | Streckengruppe - Gefaellestrecke 002- Winkel | GF_WINKEL (2. Wert) |
int(...), nur wenn Segment 2 existiert |
| 4329-4334 | ...Kurven Gefaellestrecke links/rechts 90/60/30 Grad | GF_Bogen_L_90/60/30, GF_Bogen_R_90/60/30 |
direkt |
| 4337 | Streckengruppe - Anzahl der Separatoren - Gefaellestrecke | - | Platzhalter, fest "0" (Aufteilung Gefaelle-/Vario-Anteil noch nicht umgesetzt, siehe unten) |
| 4338 | Streckengruppe - Bearbeitung Gefaellestreckenteilstueck fuer Separator (829516050) | - | fest SEPARATOR_BEARBEITUNG_ANZEIGE = "ohne HARTCOAT HRC 50 +/- 5" |
| 4339 | Streckengruppe - Anzahl der Scanner (Gefaelle-Anteil) | - | Platzhalter, fest "0" |
| 4340 | Streckengruppe - Variofoerderer (vorhanden) | L_VF_m (vorhanden?) |
"Ja"/"Nein" |
| 4341 | ...Anzahl der Motoren fuer Vario-Foerderer (links) | MOTORSEITE |
Anzahl Eintraege == "links" |
| 4342 | ...Anzahl der Motoren fuer Vario-Foerderer (rechts) | MOTORSEITE |
Anzahl Eintraege == "rechts" |
| 4353 | Streckengruppe - Variofoerderer 001-Laenge in Meter | L_VF_m (1. Wert) |
nur wenn Vario-Segment existiert |
| 4354 | Streckengruppe - Variofoerderer 001-Richtung | ANTRIEBFAHRTRICHTUNG (1. Wert) |
kleingeschrieben ("Auf" -> "auf") |
| 4386 | Streckengruppe - Variofoerderer 001- Winkel | VF_WINKEL (1. Wert) |
int(...) |
| 4373-4378 | ...Kurven Variofoerderer Aussen-/Innenbogen 90/60/30 Grad | VF_Bogen_A_90/60/30, VF_Bogen_I_90/60/30 |
direkt |
| 4381 | Streckengruppe - Anzahl der Separatoren - Variofoerderer | ANZAHL_SEPARATOR |
voller Blockwert (Aufteilung noch offen, siehe 4337) |
| 4382 | (dieselbe Bezeichnung wie 4338 im Merkmalstamm) | - | fest SEPARATOR_BEARBEITUNG_ANZEIGE |
| 4383 | Streckengruppe - Anzahl der Scanner (Vario-Anteil) | ANZAHL_SCANNER |
voller Blockwert |
| 4427-4432 | AS-/ES-Element (vorhanden/Winkel/Seite) | WINKEL_AS/SEITE_AS/WINKEL_ES/SEITE_ES |
siehe eigener Abschnitt unten |
| 3992 | Geruest fuer Einzelmodul | GERUEST_EINZELMODUL |
wie Kreisel |
| 3993 | Geruestoption fuer Einzelmodul | GERUEST_TYP |
wie Kreisel |
Offener Punkt: 4337/4339 (Gefaelle-Anteil) stehen fest auf "0", 4381/4383
(Vario-Anteil) tragen den KOMPLETTEN ANZAHL_SEPARATOR/ANZAHL_SCANNER-Wert
des Blocks. Die korrekte Aufteilung auf beide Streckenabschnitte folgt erst,
wenn die Separator-/Scanner-Zuordnung im Zeichnungsmodell selbst ueberarbeitet
ist (siehe build_variofoerderer_details in export_sivas.py).
ILS 2.0 Gefaellestrecke - eigenstaendige GF_N-Gruppe (SivasNr 6220, Dispogruppe 20)
Gruppierung: gleiche Masse (Hoehe/Laenge/Winkel/Separatoren/Scanner/Typ/
Geruest) werden zu EINER Zeile zusammengefasst (gefaellestrecke_signature).
ANDERS ALS BEI KREISEL bleibt die Anzahl-Spalte fest auf 1 - die reale
Stueckzahl der Gruppe steht im Merkmal 4311.
| Merkmalnr | Bezeichnung (Merkmalstamm) | Block-Attribut | Berechnung |
|---|---|---|---|
| 2950 | Anlagenhoehe in Meter | MONTAGEHOEHE_m |
direkt |
| 4300 | Streckengruppe | TYP |
"Streckengruppe" -> "mehrere Objekte", sonst ("Gefaellestrecke") -> "ein Objekt" |
| 4384 | Gefaellestrecke oder Vario-Foerderer | - | fest "Gefaellestrecke" |
| 4311 | Strecken- zu fertigende Menge | - | Anzahl der in dieser Zeile gruppierten, baugleichen GF_N-Bloecke (Gegenstueck zur Anzahl-Spalte, die hier fest 1 ist) |
| 4318 | Streckengruppe - Gefaellestrecke 001-Laenge in Meter | L_GF_m |
direkt |
| 4391 | Streckengruppe - Gefaellestrecke 001 -Winkel | GF_WINKEL |
direkt |
| 4337 | Streckengruppe - Anzahl der Separatoren - Gefaellestrecke | ANZAHL_SEPARATOR |
direkt (kein Split noetig, kein Vario-Anteil vorhanden) |
| 4338 | Streckengruppe - Bearbeitung Gefaellestreckenteilstueck fuer Separator (829516050) | - | fest SEPARATOR_BEARBEITUNG_ANZEIGE |
| 4339 | Streckengruppe - Anzahl der Scanner | ANZAHL_SCANNER |
direkt |
| 4427-4432 | AS-/ES-Element (vorhanden/Winkel/Seite) | WINKEL_AS/SEITE_AS/WINKEL_ES/SEITE_ES |
siehe eigener Abschnitt unten |
| 3992 | Geruest fuer Einzelmodul | GERUEST_EINZELMODUL |
wie Kreisel |
| 3993 | Geruestoption fuer Einzelmodul | GERUEST_TYP |
wie Kreisel |
Die Gruppierung (gefaellestrecke_signature) beruecksichtigt AS-/ES-Element
mit: zwei sonst baugleiche Gefaellestrecken mit AS links bzw. AS rechts
bleiben getrennte Zeilen, sonst zeigte die gemeinsame Zeile nur die Seite des
ersten Blocks.
AS-/ES-Element (4427-4432) - gilt fuer VF_N UND GF_N
Die Zuordnung steht vollstaendig in cfg/sivas.cfg - mit denselben sechs
Zeilen in [gefaellestrecke] UND [variofoerderer], weil beide Blockarten
dieselben Attribute des gemeinsamen Strecken-Schemas tragen
(*strecke-attr-front* in ssg_core.lsp). In export_sivas.py stehen nur
die Transform-Funktionen.
Sivas-Hierarchie (Merkmalstamm): 4431/4432 ("Ja"/"Nein") sind die
Oberknoten, Winkel und Seite haengen als Unterknoten darunter - darum auch
diese Reihenfolge in der Config.
| Merkmalnr | Bezeichnung (Merkmalstamm) | Block-Attribut | Transform | Berechnung |
|---|---|---|---|---|
| 4431 | AS-Element | WINKEL_AS |
as_es_vorhanden |
"Ja", wenn ein Winkel gesetzt ist, sonst "Nein" |
| 4427 | AS-Element - Winkel | WINKEL_AS |
as_es_winkel |
Optionswert der Auswahlliste ("30" -> "30 °", Tabelle [as_es_winkel_anzeige]); leer, wenn kein AS-Element |
| 4428 | AS-Element - Seite | SEITE_AS |
as_seite |
kleingeschrieben ("links"/"rechts"); leer, wenn kein AS-Element |
| 4432 | ES-Element | WINKEL_ES |
as_es_vorhanden |
wie 4431 |
| 4429 | ES-Element - Winkel | WINKEL_ES |
as_es_winkel |
wie 4427 |
| 4430 | ES-Element - Seite | SEITE_ES |
es_seite |
wie 4428 |
Warum der Winkel ueber das Vorhandensein entscheidet und nicht die Seite:
das Schema laesst WINKEL_AS/WINKEL_ES leer, wenn kein Element gewaehlt
wurde, waehrend SEITE_AS/SEITE_ES mit "rechts" immer einen Vorgabewert
tragen. Ohne Element bleiben darum Winkel UND Seite leer - sonst stuende in
Sivas eine Seite unter einem "Nein"-Knoten.
Winkel-Schreibweise: die Sivas-Auswahlliste fuehrt "30 °"/"90 °" (mit
Leerzeichen vor dem Gradzeichen), das Block-Attribut dagegen die nackte Zahl.
Die Uebersetzung steht als Tabelle [as_es_winkel_anzeige] in sivas.cfg
(gleiche Bauart wie [geruest_typ_anzeige]) - weicht Sivas davon ab, ist das
die einzige Stelle zum Nachziehen. Ein Winkel ohne Eintrag dort wird
unveraendert uebernommen.
Neu im Mapping-Mechanismus: 4428/4430 brauchen ein ZWEITES Attribut
(die Seite haengt am Winkel). Dafuer gibt es in sivas_mapping.py den
Dekorator @braucht_attribs - ein so markierter Transform wird als
fn(wert, attribs) statt fn(wert) aufgerufen und sieht damit die uebrigen
Attribute des Blocks. Ohne diese Klammer muessten bedingte Merkmale wieder
als Python-Code aus der Config herauswandern.
ILS 2.0 Zusatzmodul (SivasNr 6215, Dispogruppe 20)
BTMT-Beladestationen UND Abwurfstationen (Klammerbuegel-Entladung) in EINER
Zeile zusammengefasst. Anzahl-Spalte fest 1, Bezeichnung leer, IDs beider
Blockarten kombiniert.
| Merkmalnr | Bezeichnung (Merkmalstamm) | Quelle | Berechnung |
|---|---|---|---|
| 3501 | BT - Beladung (mit Vereinzeler, ohne Separator) | Vorhandensein von BTMT-Beladung-Bloecken (pattern_btmt_beladung) |
"Ja", wenn mind. 1 Block, sonst "Nein" |
| 3503 | Anzahl der BT - Beladung (mit Vereinzeler, ohne Separator) | Anzahl BTMT-Beladung-Bloecke | direkt gezaehlt |
| 3502 | Abwurf fuer Klammerbuegel Sitzbezuege / Kleiderbuegel | Vorhandensein von Abwurf-Bloecken (pattern_btmt_entladung) |
"Ja", wenn mind. 1 Block, sonst "Nein" |
| 3504 | Anzahl der Abwuerfe | Anzahl Abwurf-Bloecke | direkt gezaehlt |
ILS 2.0 Automation und Pneumatik - Gesamtanlage (SivasNr 6269, Dispogruppe 20)
Eine Summenzeile pro Zeichnung, nur wenn mindestens ein ILS-Element (Kreisel/ Eckrad/Variofoerderer/Gefaellestrecke/BTMT) vorhanden ist.
| Merkmalnr | Bezeichnung (Merkmalstamm) | Quelle (counters/process_blocks) | Berechnung |
|---|---|---|---|
| 4000 | Automation | - | fest "Ja" (Zeile existiert nur bei has_ils) |
| 4400 | Anzahl der Kreisel | anzahl_kreisel |
Anzahl aller Kreisel-Bloecke (vor Gruppierung) |
| 4401 | Anzahl der Kreisel mit PINBAND | anzahl_kreisel_pinband |
|
| 4402 | Anzahl der Verbindungskreisel | anzahl_verbindungskreisel |
aktuell nie befuellt (kein Verbindungskreisel-Typ erkannt) |
| 4403 | Anzahl der Weichen | anzahl_weichen_ils |
aktuell nie befuellt (kein ILS-Weichen-Typ erkannt) |
| 4404 | Anzahl der Eckraeder | anzahl_eckraeder |
|
| 4407 | Anzahl der Streckengruppen | len(vario_list) |
Anzahl VF_N-Compound-Bloecke (TYP "Streckengruppe") - NICHT anzahl_variofoerderer (der zaehlt auch lose Strecke-Module mit) |
| 4408 | Anzahl der Motoren in Vario-Foerderer | anzahl_motoren_vario |
Summe ANZAHL_VF ueber alle VF_N-Bloecke |
| 4409 | Anzahl der ETFs | anzahl_etf |
aktuell nie befuellt |
| 4410 | Anzahl der Separatoren in der Anlage | anzahl_separatoren |
Summe ueber Kreisel+VF_N+GF_N |
| 4411 | Anzahl der Scanner in der Anlage | anzahl_scanner |
Summe ueber Kreisel+VF_N+GF_N |
| 4413 | Anzahl der Separatoren - Kreisel ohne PINBAND | sep_kreisel_ohne_pin |
|
| 4414 | Anzahl der Separatoren - Kreisel mit PINBAND | sep_kreisel_pin |
|
| 4417 | Laengen aller ETFS und Zusatzstuecke (Gefaellestrecken) | laengen_etf |
aktuell immer 0.0, NICHT auf 2 Nachkommastellen gerundet |
| 4418 | Laengen aller Gefaellestrecken | laengen_gefaellestrecken |
auf 2 Nachkommastellen gerundet (.2f) |
| 4419 | Laengen aller Kreisel | laengen_kreisel |
auf 2 Nachkommastellen gerundet (.2f) |
| 4420 | Laengen aller Vario-Foerderer | laengen_variofoerderer |
NICHT gerundet (roher str()-Wert) |
| 4421 | Zusatzmodul - Anzahl der BT-Beladung | anzahl_btbeladung |
|
| 4422 | Zusatzmodul - Anzahl der Abwurfstation | anzahl_abwurfstationen |
|
| 4425 | Anzahl der einzelnen Gefaellestrecken | anzahl_gefaellestrecken |
Anzahl aller GF_N-Bloecke (vor Gruppierung) |
| 4426 | Anzahl der einzelnen Vario-Foerderer | - | fest "0" (Konzept "einzelner Variofoerderer" getrennt von "Streckengruppe" gibt es nicht mehr) |
| 4100 | Pneumatik | - | fest "Ja" |
Nicht angefasst (ausserhalb dieser Umstellung)
- ILS 2.0 Eckrad (
build_eckrad_details): bleibt beim alten, beschreibenden Key-Format ("Geruest fuer Einzelmodul"/"Geruestoption fuer Einzelmodul") - war nicht Teil der angefragten 5 Teilearten. - Geruest-Baugruppen (
build_geruest_details,GR_*-Bloecke): eigenes Format ueberARTINR/BEZEICHNUNG/TEILEART/LAENGEin den festen CSV-Spalten (je Artikelnummer eine Zeile). Siehe eigener Abschnitt unten.
Geruest-Baugruppe (GR_*, je Artikelnummer eine Zeile, Dispogruppe 20)
| Merkmalnr | Bezeichnung (Merkmalstamm) | Block-Attribut | Berechnung |
|---|---|---|---|
| 108 | Farbe | TEILEFARBE |
kommagetrennte Liste parallel zu ARTINR; je Zeile der Eintrag an der Position der Artikelnummer. Leerer Eintrag (Teil ohne "farbig": true in geruest.json) -> Merkmal fehlt. Laenge passt nicht zu ARTINR (Altbestand) -> Warnung, ohne Farbe. Nummer aus cfg/export.cfg [Sivas] merkmal_teilefarbe |
Gleiche Artikelnummer mit gleicher Farbe innerhalb eines Blocks -> eine Zeile mit Anzahl > 1.
- Omniflo Bogen/Weiche/Gerade:
detailsbleibt leer ({}), keine Merkmalnummern-Zuordnung noetig.
Bekannte offene Punkte
- 4337/4339 vs. 4381/4383 (Streckengruppe VF_N): Aufteilung der Separatoren/Scanner auf Gefaelle- und Vario-Anteil ist ein Platzhalter (siehe oben) - folgt nach der Neuzuordnung von Separator/Scanner zum jeweiligen Streckenabschnitt im Zeichnungsmodell.
- Zeichnungsseitige Datenpflege (kein Code-Thema):
GERUEST_EINZELMODULmuss am jeweiligen Block korrekt gesetzt sein (Dialog-Haekchen beim Einfuegen) - der Export uebernimmt das Attribut unveraendert 1:1.