feat: Omniflo-Fahrstrecke (OMNI_FAHRSTRECKE) + Geruest-Dialoge ueberarbeitet

Fahrstrecke:
- Neuer Befehl OMNI_FAHRSTRECKE (+ _BESCHRIFTEN) im Omniflo-Menue,
  Daten aus data/json/omniflo_fahrstrecke.json, Vorlage dcl/fahrstrecke.dcl
- Nutzt die Linien-Logik des Geruest-Traegers (geruest-linien-starten,
  Dialog/Einfuegen/Beschriftung je Baugruppe parametriert)
- Muffen-Dummy wie beim Traeger, farbig nur wo in der JSON gesetzt
- Stueckliste: eigene Klasse "Omniflo Fahrstrecke" (GR_Fahrstrecke_*)

Geruest-Dialoge:
- DCL als statische Vorlagen mit //@NAME@-Platzhaltern
  (ssg-dcl-vorlage-fuellen in ssg_core), dcl/geruest.dcl neu
- Ein Dialog je Bereich (keine Bereichsumschaltung mehr)
- Varianten als Radiobuttons mit Artikelnummern im Label,
  "disabled": true graut Varianten aus
- Eine Befestigungsspalte (Gesamtanzahl) + Zeile "Sonstiges",
  Art.-Nr. unter jedem Anbauteil
- Winkel Platte (0/90): Anbauteile gedreht eingefuegt
- Kennzeichnung geaenderter Konfiguration, Ueberspeichern per Enter
- Traeger: Querstreben nur bei "mit_querstrebe": true

Konfigurationen im alten Format (oben/unten) werden beim Laden
uebernommen. Unit-Tests ergaenzt (599 gruen).
This commit is contained in:
2026-10-13 11:02:23 +02:00
parent 3116e639eb
commit ea0e46a441
25 changed files with 2597 additions and 1469 deletions
+56
View File
@@ -0,0 +1,56 @@
// ============================================================
// fahrstrecke.dcl - Omniflo-Fahrstrecke konfigurieren (VORLAGE)
// Verwendet von: OMNI_FAHRSTRECKE (GeruestInsert.lsp, geruest-traeger-dialog)
// Daten: data/json/omniflo_fahrstrecke.json
//
// Gleicher Aufbau wie geruest_traeger.dcl - dieselben Tile-Keys, denn beide
// Dialoge laufen ueber dieselben Funktionen (geruest-traeger-dialog).
//
// Diese Datei wird NICHT direkt geladen: //@VARIANTEN@ ist ein Platzhalter,
// den GeruestInsert.lsp zur Laufzeit durch einen radio_button je
// Variante (key v<i>, i = Index in geometrie_varianten) ersetzt
// (ssg-dcl-vorlage-fuellen, ssg_core.lsp). Das Ergebnis wird als Temp-Datei
// geladen.
//
// Jede Variante (auch die mit Muffe) hat einen eigenen Radiobutton, damit
// ihre Artikelnummer sichtbar ist.
//
// Die Laenge steht bewusst NICHT im Dialog - sie wird nach dem Dialog in der
// Zeichnung per Start-/Endpunkt (oder getippter Laenge) bestimmt.
// ============================================================
fahrstrecke : dialog {
label = "Fahrstrecke konfigurieren";
: boxed_column {
label = "Basis";
: radio_column {
key = "variante";
label = "Variante:";
alignment = left;
//@VARIANTEN@
}
: row {
: popup_list { key = "farbe"; label = "Farbe:"; width = 25; }
: edit_box { key = "farbe_frei"; label = "eigene:"; edit_width = 12; }
}
}
: boxed_column {
label = "Längenabzug";
: row {
: toggle { key = "abzug_a"; label = "Längenabzug Anfang"; width = 24; fixed_width = true; }
: edit_box { key = "abzug_a_w"; label = "mm:"; edit_width = 8; fixed_width = true; }
}
: row {
: toggle { key = "abzug_e"; label = "Längenabzug Ende"; width = 24; fixed_width = true; }
: edit_box { key = "abzug_e_w"; label = "mm:"; edit_width = 8; fixed_width = true; }
}
}
: toggle { key = "beschriftung"; label = "Beschriftung einfügen"; }
: text { key = "hinweis"; label = ""; width = 56; }
ok_cancel;
}
+55
View File
@@ -0,0 +1,55 @@
// ============================================================
// geruest.dcl - Geruest-Baugruppe konfigurieren (VORLAGE)
// Verwendet von: GERUEST_SAEULEN, GERUEST_ROHRABHAENGER,
// GERUEST_WANDBEFESTIGUNG (GeruestInsert.lsp, geruest-dialog)
//
// Diese Datei wird NICHT direkt geladen: Zeilen der Form //@NAME@ sind
// Platzhalter, die GeruestInsert.lsp zur Laufzeit durch datenabhaengige
// Bloecke ersetzt (ssg-dcl-vorlage-fuellen, ssg_core.lsp) - DCL kann Tiles
// weder zur Laufzeit erzeugen noch ausblenden, und Radiobutton-Labels lassen
// sich per set_tile nicht aendern. Das Ergebnis wird als Temp-Datei geladen.
//
// //@TITEL@ label-Zeile des Dialogs (Bereichsname)
// //@VARIANTEN@ ein radio_button je Geometrie-Variante (key v<i>)
// //@BEFESTIGUNG@ Spalte "Befestigung oben und unten" (Tile-Keys b<i>/bm<i>,
// entfaellt ohne Teile - ein leerer Cluster ist in DCL
// unzulaessig)
// //@SONSTIGES@ Spalte "Sonstiges" (s<i>/sm<i>, entfaellt ohne Teile)
// Je Teil: Mengenfeld, Ankreuzfeld und darunter "Art.-Nr. ..." (sivas_id).
// ============================================================
geruest : dialog {
//@TITEL@
: row {
: popup_list { key = "konfig"; label = "Konfiguration:"; width = 40; }
: button { key = "kspeichern"; label = "Speichern..."; fixed_width = true; }
: button { key = "kloeschen"; label = "Löschen"; fixed_width = true; }
}
// Zeigt an, ob der Stand noch der gewaehlten Konfiguration entspricht
// (geruest-dlg-aenderung-pruefen).
: text { key = "kstatus"; label = ""; width = 64; }
: boxed_column {
label = "Basis";
// Radiobuttons statt Liste: alle Varianten sichtbar, Einfachauswahl,
// Beschriftung in voller Breite.
: radio_column {
key = "variante";
label = "Variante:";
alignment = left;
//@VARIANTEN@
}
: row {
: edit_box { key = "laenge"; label = "Laenge (mm):"; edit_width = 10; }
: popup_list { key = "farbe"; label = "Farbe:"; width = 25; }
: edit_box { key = "farbe_frei"; label = "eigene:"; edit_width = 12; }
}
// Ausrichtung, in der die Anbauteile mit der Basis zusammengebaut werden
: popup_list { key = "winkel"; label = "Winkel Platte:"; width = 22; fixed_width = true; }
}
//@BEFESTIGUNG@
//@SONSTIGES@
ok_cancel;
}
+21 -7
View File
@@ -1,18 +1,32 @@
// ============================================================
// geruest_traeger.dcl - Rohr-Geruest-Traeger konfigurieren
// geruest_traeger.dcl - Rohr-Geruest-Traeger konfigurieren (VORLAGE)
// Verwendet von: GERUEST_TRAEGER (GeruestInsert.lsp, geruest-traeger-dialog)
//
// Diese Datei wird NICHT direkt geladen: //@VARIANTEN@ ist ein Platzhalter,
// den GeruestInsert.lsp zur Laufzeit durch einen radio_button je
// Variante (key v<i>, i = Index in geometrie_varianten) ersetzt
// (ssg-dcl-vorlage-fuellen, ssg_core.lsp) - Radiobutton-Labels lassen sich
// per set_tile nicht aendern. Das Ergebnis wird als Temp-Datei geladen.
//
// Jede Variante (auch die mit Muffe) hat einen eigenen Radiobutton, damit
// ihre Artikelnummer sichtbar ist.
//
// Die Laenge steht bewusst NICHT im Dialog - sie wird nach dem Dialog in der
// Zeichnung per Start-/Endpunkt (oder getippter Laenge) bestimmt. Aktive
// Laengenabzuege ruecken die Linie am Anfang bzw. Ende ein.
// ============================================================
geruest_traeger : dialog {
label = "Rohr-Geruest-Traeger konfigurieren";
label = "Rohr-Gerüst-Träger konfigurieren";
: boxed_column {
label = "Basis";
: popup_list { key = "variante"; label = "Variante:"; width = 56; }
: radio_column {
key = "variante";
label = "Variante:";
alignment = left;
//@VARIANTEN@
}
: row {
: popup_list { key = "farbe"; label = "Farbe:"; width = 25; }
: edit_box { key = "farbe_frei"; label = "eigene:"; edit_width = 12; }
@@ -20,18 +34,18 @@ geruest_traeger : dialog {
}
: boxed_column {
label = "Laengenabzug";
label = "Längenabzug";
: row {
: toggle { key = "abzug_a"; label = "Laengenabzug Anfang"; width = 24; fixed_width = true; }
: toggle { key = "abzug_a"; label = "Längenabzug Anfang"; width = 24; fixed_width = true; }
: edit_box { key = "abzug_a_w"; label = "mm:"; edit_width = 8; fixed_width = true; }
}
: row {
: toggle { key = "abzug_e"; label = "Laengenabzug Ende"; width = 24; fixed_width = true; }
: toggle { key = "abzug_e"; label = "Längenabzug Ende"; width = 24; fixed_width = true; }
: edit_box { key = "abzug_e_w"; label = "mm:"; edit_width = 8; fixed_width = true; }
}
}
: toggle { key = "beschriftung"; label = "Beschriftung einfuegen"; }
: toggle { key = "beschriftung"; label = "Beschriftung einfügen"; }
: text { key = "hinweis"; label = ""; width = 56; }