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:
Simon Hensch committed 2026-10-13 11:02:23 +02:00
1 parent 3116e639eb
commit ea0e46a441
25 files changed
+2597 -1469

No files matched your search

+8 -6
View File
@@ -23,7 +23,7 @@ AutoLISP-Makros (SSG_LIB) fuer BricsCAD Pro zur automatisierten Erstellung von F
| `cfg/` | Konfigurationsdateien |
| `data/` | JSON-Daten, DXF-Quellen, Block-Libraries |
| `data/ils/` | DWG-Bloecke fuer ILS-Kreisel/Eckrad (AN8, SP8, AP-Typen) |
| `data/json/` | Komponentendaten (Masse, Sivas-IDs); Geruest: `geruest.json` (GERUEST-Dialog) und `geruest_traeger.json` (Traeger mit Linien-Logik) |
| `data/json/` | Komponentendaten (Masse, Sivas-IDs); Geruest: `geruest.json` (GERUEST-Dialog) und `geruest_traeger.json` (Traeger mit Linien-Logik); `omniflo_fahrstrecke.json` (Omniflo-Fahrstrecke, gleiche Linien-Logik) |
| `data/block_libraries/` | DXF Block-Libraries (ils_library.dxf) |
| `cfg/rahmen/` | DIN-Rahmen + Schriftkopf-DWGs (A0-A4, Kopf11 DE/EN/FR/IT), kopiert aus `\\infor-ln\SSG_Tools\ACADSST\KOEPFE`, fuer `DIN_FORMATE` (DinFormate.lsp) |
| `dcl/` | DCL-Dialogdefinitionen |
@@ -75,8 +75,8 @@ Die `start_briscad.bat` ruft `setenv.bat` auf und startet BricsCAD.
| Zusatzmodul/Foerderer/Kurven | `SSG_LIB_Commands` | ILS_BTMT_*, ILS_ETF_*, ILS_GK*_* |
| VarioFoerderer | `VarioFoerderer` | FOERDERANLAGE, VARIOFOERDERER_EDIT, Vario_Kette_Merge |
| Gefaellestrecke | `Gefaellestrecke` | GEFAELLESTRECKE, GEFAELLESTRECKE_EDIT |
| Omniflo (komplett) | `OmniModulInsert` | OMNI_APB_*, OMNI_W*_*, OMNI_AP*, OMNI_TEF_*, OMNI_TV_*, OMNI_LADESCHLEIFE_*, OMNI_EDIT |
| Geruest | `GeruestInsert` | GERUEST_SAEULEN, GERUEST_ROHRABHAENGER, GERUEST_WANDBEFESTIGUNG (derselbe Dialog, im jeweiligen Bereich geoeffnet), GERUEST_TRAEGER (eigener Dialog), GERUEST_TRAEGER_BESCHRIFTEN (Untermenue Geruest -> Funktionen -> Traeger beschriften; alle Traeger der Zeichnung neu beschriften); Gattertraeger noch Platzhalter auf GERUEST |
| Omniflo (komplett) | `OmniModulInsert` + `GeruestInsert` | OMNI_APB_*, OMNI_W*_*, OMNI_AP*, OMNI_TEF_*, OMNI_TV_*, OMNI_LADESCHLEIFE_*, OMNI_EDIT; OMNI_FAHRSTRECKE / OMNI_FAHRSTRECKE_BESCHRIFTEN (GeruestInsert, Linien-Logik wie GERUEST_TRAEGER) |
| Geruest | `GeruestInsert` | GERUEST_SAEULEN, GERUEST_ROHRABHAENGER, GERUEST_WANDBEFESTIGUNG (je eigener Dialog aus der Vorlage geruest.dcl, keine Umschaltung), GERUEST_TRAEGER (eigener Dialog), GERUEST_TRAEGER_BESCHRIFTEN (Untermenue Geruest -> Funktionen -> Traeger beschriften; alle Traeger der Zeichnung neu beschriften); Gattertraeger noch Platzhalter auf GERUEST (zeigt nur einen Hinweis) |
| Connections | `Connection_Edit` + `SSG_LIB_Commands` | CONNECTION_INSERT, CONNECTION_EDIT, ILS_EINGANG_INSERT, ILS_AUSGANG_INSERT |
| Export | `export` | EXPORTSIVAS, EXPORTCSV, CALLPYTHON |
| Werkzeuge | `ssg_blocktools`, `ssg_texttools`, `ssg_stueckliste`, `DinFormate` | SSG_BLOCK_COUNT, SSG_BLOCK_DELETE, SSG_ATTR_ERSETZEN, SSG_TEXT_ERSETZEN, SSG_TEXT_PARALLEL, SSG_TEXT_HOEHE, SSG_TEXT_STIL, SSG_FAEHNCHEN_STUECKLISTE, DIN_FORMATE |
@@ -95,7 +95,7 @@ Detaillierte Dokumentation aller Funktionen und Befehle: siehe `Lisp/README.md`.
| Datei | Befehle | Beschreibung |
|---|---|---|
| `ssg_core.lsp` | - | Kernel: ssg-start/ssg-end, ssg-cfg-or, ssg-attrib-read/write, Layer/Block-Ops. Zentrale Helfer: `ssg-lisp-verzeichnis`/`ssg-lisp-datei-pfad` (Lisp-Pfad-Ermittlung), `ssg-rot-matrix-zy` (4x4 Rz(hz)*Ry(vert)-Rotationsmatrix, clusteruebergreifend), GUI-Aus-Schalter `*ssg-gui-aus*` + `ssg-gui-aus`/`ssg-gui-an`/`ssg-gui-p` (fuer automatische Tests: schaltet DCL-/Wizard-Dialoge ab, Module fallen auf Konsolen-/getXXX-Pfad zurueck; der Linienzug hat zusaetzlich `*vfl-headless*`, das die Konsolen-Rueckfrage selbst verbietet - siehe VarioFoerderer-Zeile). **Layer-Zuordnung**: `ssg-layer-cfg-load`/`-reset` (liest `cfg/layer.cfg` lazy), `ssg-layer-cfg-eintrag` (reine Aufloesung "Layername, Farbe" -> `(layer . farbe)`, in `tests/test_unit.lsp` getestet), `ssg-layer-eintrag` (Suchreihenfolge `[ils_<dim>]` -> `[allgemein]`), `ssg-layer-anlegen` (Layer mit cfg-Farbe anlegen, optional aktivieren) und `ssg-layer-setzen` (Blockreferenz auf den Baugruppen-Layer legen) - fuer ZUSAMMENGEBAUTE Baugruppen; `ssg-block-layer-vorgabe` (LAYER-Attribut -> `ssg-ils-block-ebene`) fuer nur EINGEFUEGTE Bloecke. Alle liefern nil, wenn nichts konfiguriert ist, und lassen den Layer dann unangetastet. **JSON**: drei Parser nebeneinander, bewusst nicht zusammengelegt - `ssg-load-json`/`ssg-parse-json-array` (flaches Array von Objekten) und `ssg-cfg-parse-nested` (genau 1 Ebene) sind ZEILENbasiert und koennen weder echte Verschachtelung noch mehrzeilige Arrays, maskierte Anfuehrungszeichen (`\"`) oder Kommas in Strings lesen; ihre Konsumenten (Konfiguration, Sprache, VF-Spec) sind auf dieses Verhalten eingestellt und bleiben unangetastet. Fuer alles andere `ssg-json-laden`/`ssg-json-parse`/`ssg-json-get` (rekursiver Descent-Parser ueber einen Positionszeiger): Objekt -> Alist, Array -> Liste, true -> T, false/null -> nil (beide nil, "Feld fehlt" ist also nicht von "Feld ist false" unterscheidbar), `\uXXXX` nur fuer ASCII. In `tests/test_unit.lsp` (`tu-tests-json`) gegen die echte Geruest-Datendatei getestet. Dazu `ssg-join` (Liste + Trennzeichen -> String). `ssg-lastent-ohne-attribute`: Startmarke fuer "alles Neue seit Marke per entnext einsammeln" - statt nacktem `(entlast)` verwenden, sonst laeuft `entnext` in die ATTRIBs/SEQEND eines vorherigen Attribut-Blocks und `_.-BLOCK` entfernt sie dort (realer Bug: per Strg+C/V kopierter GR_-Block verlor beim naechsten GERUEST seine Attribute; Test `tests/test_lastent.lsp`) |
| `ssg_core.lsp` | - | Kernel: ssg-start/ssg-end, ssg-cfg-or, ssg-attrib-read/write, Layer/Block-Ops. Zentrale Helfer: `ssg-lisp-verzeichnis`/`ssg-lisp-datei-pfad` (Lisp-Pfad-Ermittlung), `ssg-rot-matrix-zy` (4x4 Rz(hz)*Ry(vert)-Rotationsmatrix, clusteruebergreifend), GUI-Aus-Schalter `*ssg-gui-aus*` + `ssg-gui-aus`/`ssg-gui-an`/`ssg-gui-p` (fuer automatische Tests: schaltet DCL-/Wizard-Dialoge ab, Module fallen auf Konsolen-/getXXX-Pfad zurueck; der Linienzug hat zusaetzlich `*vfl-headless*`, das die Konsolen-Rueckfrage selbst verbietet - siehe VarioFoerderer-Zeile). **Layer-Zuordnung**: `ssg-layer-cfg-load`/`-reset` (liest `cfg/layer.cfg` lazy), `ssg-layer-cfg-eintrag` (reine Aufloesung "Layername, Farbe" -> `(layer . farbe)`, in `tests/test_unit.lsp` getestet), `ssg-layer-eintrag` (Suchreihenfolge `[ils_<dim>]` -> `[allgemein]`), `ssg-layer-anlegen` (Layer mit cfg-Farbe anlegen, optional aktivieren) und `ssg-layer-setzen` (Blockreferenz auf den Baugruppen-Layer legen) - fuer ZUSAMMENGEBAUTE Baugruppen; `ssg-block-layer-vorgabe` (LAYER-Attribut -> `ssg-ils-block-ebene`) fuer nur EINGEFUEGTE Bloecke. Alle liefern nil, wenn nichts konfiguriert ist, und lassen den Layer dann unangetastet. **JSON**: drei Parser nebeneinander, bewusst nicht zusammengelegt - `ssg-load-json`/`ssg-parse-json-array` (flaches Array von Objekten) und `ssg-cfg-parse-nested` (genau 1 Ebene) sind ZEILENbasiert und koennen weder echte Verschachtelung noch mehrzeilige Arrays, maskierte Anfuehrungszeichen (`\"`) oder Kommas in Strings lesen; ihre Konsumenten (Konfiguration, Sprache, VF-Spec) sind auf dieses Verhalten eingestellt und bleiben unangetastet. Fuer alles andere `ssg-json-laden`/`ssg-json-parse`/`ssg-json-get` (rekursiver Descent-Parser ueber einen Positionszeiger): Objekt -> Alist, Array -> Liste, true -> T, false/null -> nil (beide nil, "Feld fehlt" ist also nicht von "Feld ist false" unterscheidbar), `\uXXXX` nur fuer ASCII. In `tests/test_unit.lsp` (`tu-tests-json`) gegen die echte Geruest-Datendatei getestet. Dazu `ssg-join` (Liste + Trennzeichen -> String). **DCL-Vorlagen**: `ssg-dcl-vorlage-fuellen` (Vorlage lesen, Markerzeilen `//@NAME@` durch erzeugte Zeilen ersetzen - reiner Kern `ssg-dcl-zeilen-ersetzen`, getestet - und per `ssg-dcl-temp-schreiben` als Temp-Datei schreiben) fuer Dialoge mit fester Grundstruktur und einzelnen datenabhaengigen Bloecken. `ssg-lastent-ohne-attribute`: Startmarke fuer "alles Neue seit Marke per entnext einsammeln" - statt nacktem `(entlast)` verwenden, sonst laeuft `entnext` in die ATTRIBs/SEQEND eines vorherigen Attribut-Blocks und `_.-BLOCK` entfernt sie dort (realer Bug: per Strg+C/V kopierter GR_-Block verlor beim naechsten GERUEST seine Attribute; Test `tests/test_lastent.lsp`) |
| `ssg_ks_insert.lsp` | - | Gemeinsame KS-Extraktion + Block-Einfuegeprimitiven (von VarioFoerderer UND Gefaellestrecke genutzt, frueher in beiden dupliziert): `vec-length`, `ks-line-axis`, `ks-normalize-name`, `ks-relativize`/`-absolutize`, `ensure-block-loaded`, `extract-ks-from-block[-raw]` (Cache `*ks-cache*`), `insert-block-by-ks` (nur Rz), `insert-inclined-scaled-block`/`insert-rotated-block-with-ks` (Rz*Ry). MNL laedt es als Core-Modul VOR Gefaellestrecke/VarioFoerderer; vf_core/Gefaellestrecke haben einen guarded Nachlade-Load fuers isolierte Test-Laden |
| `ssg_lang.lsp` | - | Sprachumschaltung Deutsch/Englisch (ssg-text, ssg-textf, *ssg-lang*) |
| `ssg_dbg.lsp` | - | Debug-Logging (dbgopen, dbgmsg, dbgflush, dbgclose) |
@@ -113,7 +113,7 @@ Detaillierte Dokumentation aller Funktionen und Befehle: siehe `Lisp/README.md`.
| `OmniModulInsert.lsp` | OMNI_LOAD, OMNI_APB_*, OMNI_W*_*, OMNI_AP60/AP110, OMNI_TEF_*, OMNI_TV_*, OMNI_APBW_*, OMNI_LADESCHLEIFE_AP110, OMNI_EDIT | Omniflo-Komponenten: Boegen, Weichen, Verbinder, Transferwagen, Ladeschleifen (`data/json/omniflo_ladeschleifen.json`, per `ssg-json-laden`, da die Beschreibungen Kommas enthalten; Blockdatei darf `.dwg` statt `.dxf` sein), Edit-Dialog |
| `SSG_LIB_Commands.lsp` | ILS_BTMT_Beladung, ILS_BTMT_Entladung, ILS_SCANNER_INSERT, ILS_SEPARATOR_INSERT, ILS_EINGANG_INSERT, ILS_AUSGANG_INSERT, ILS_ETF_*, ILS_GK*_*, SSG_BLOCKEDIT, SSG_DIM_SWITCH, SSG_SPRACHE | BTMT Be-/Entladung (`ils-insert-station`: wiederholtes Einfuegen von `BTMT-Beladung` bzw. `SC_Entladung`, Drehung interaktiv, Layer aus `LAYER`-Attribut, Dimension via `ssg-ils-block-laden`) + Sensoren (`ils-insert-sensor`) + Eingang-/Ausgang-Symbol (frei platzierbar wie BTMT Be-/Entladung, ueber `ils-insert-station` mit den Rohnamen `Eingang`/`Ausgang`, Bloecke `Eingang_<DIM>.dwg`/`Ausgang_<DIM>.dwg` in data/ils) + Dummy-Befehle fuer Menue + Doppelklick/Kontextmenue-Dispatcher + Konfiguration (2D/3D, Sprache) |
| `Tro_Edit.lsp` | TRO_INSERT, TRO_EDIT | TRO-Marker (Block `TRO_SYM_<Typ>`) fuer sps_skel (lib/tro_annotate.py): TRO_INSERT fuegt eine bestehende Blockdefinition an einem gewaehlten Punkt ein und setzt ID/TYPE (bricht ab, wenn der Typ noch keine Blockdefinition in der Zeichnung hat - die entsteht nur ueber tro_annotate.py); TRO_EDIT aendert ID/TYPE eines bestehenden Markers per Dialog. Typliste aus `tro_types.lsp` (von `tro_annotate.py --emit-lisp` nach DXFM_LISP geschrieben). Der Dispatcher SSG_BLOCKEDIT leitet Blocknamen `TRO_*` zu TRO_EDIT. |
| `GeruestInsert.lsp` | GERUEST, GERUEST_SAEULEN, GERUEST_ROHRABHAENGER, GERUEST_WANDBEFESTIGUNG, GERUEST_TRAEGER, GERUEST_TRAEGER_BESCHRIFTEN | Geruest-Baugruppen aus `data/json/geruest.json` konfigurieren und einfuegen. **Ein Dialog fuer alle Bereiche**: oben ein Dropdown `bereich` (Rohrabhaenger / Saeulen / Wandbefestigung, Reihenfolge = Dateireihenfolge, Anzeigename aus dem ASCII-Feld `titel`). DCL hat **kein Reiter-Tile**, und da sich die Teilezeilen je Bereich unterscheiden, schliesst ein Bereichswechsel den Dialog (`done_dialog 4`) und die Schleife in `c:GERUEST` baut ihn neu auf; der Stand jedes Bereichs bleibt in `*geruest-zustand*` erhalten, ein versehentlicher Wechsel verwirft also nichts. 1"- und 2"-Saeulen liegen in EINER Baugruppe `Saeulen` mit gemeinsamer Anbauteil-Liste; **`teileart` und `dummy` duerfen je Geometrie-Variante ueberschrieben werden** (`geruest-variante-wert`, Variante gewinnt vor Baugruppe; fuer `dummy` ueber `geruest-dummy-wahl`: fehlt die DWG der Variante, Meldung + Rueckfall auf den Baugruppen-Dummy; ist der Dummy zugleich eine Teile-DWG, wird er per `geruest-ohne-pfad` nicht doppelt eingefuegt) - so liefert `R 1"` weiterhin TEILEART `Geruest Saeule 1 Zoll` und die `R 2"`-Varianten `Geruest Saeule 2 Zoll`, die Groessen bleiben im Export also unterscheidbar. **Die Dialogdefinition wird zur Laufzeit erzeugt** (`geruest-dcl-schreiben` -> temporaere Datei per `vl-filename-mktemp`, nach `unload_dialog` wieder geloescht) - es gibt KEINE `dcl/geruest.dcl`. Grund: je Anbauteil wird ein eigenes Mengenfeld gebraucht, und eine DCL-Liste (`list_box`) kann keine Eingabefelder enthalten; DCL kann weder Dateien einbinden noch Tiles zur Laufzeit erzeugen. Inhalt: Basis-Variante aus `geometrie_varianten` (Dropdown), Laenge (gegen `attribute.Laenge` min/max geprueft, Retry-Schleife), Farbe (`attribute.Teilefarbe`, Freitext bei `frei_option`) und **zwei Befestigungslisten** ("oben"/"unten"), die BEIDE alle `anbaugruppen` enthalten - dasselbe Teil kann oben, unten oder gleichzeitig an beiden Positionen sitzen, je mit eigener Anzahl. **Zwei Mengenfelder im JSON, bewusst verschieden benannt**: `stueckzahl` = wie oft ein Teil TATSAECHLICH geschrieben wird (je Variante bzw. je Satz/Anbauteil, fehlt = 1), `anzahl_vorgabe` = NUR die Vorbelegung des Anzahl-Feldes im Dialog (Anbaugruppen, fehlt = 1); ein Anbauteil wird Anzahl x `stueckzahl` mal geschrieben, bei einer Gruppe (`teile`) zaehlt die Anzahl die Saetze (`geruest-stueckzahl`/`geruest-anzahl-vorgabe`). In Konfigurationen (`oben`/`unten`) heisst der gespeicherte Dialogwert `anzahl`. Baugruppen ohne `attribute`-Block (Wandbefestigung) bekommen Laenge/Farbe gesperrt, Baugruppen ohne Anbauteile bekommen gar keine Spalten (ein leerer DCL-Cluster ist unzulaessig). Im generierten Label wird `"` zu `''` ersetzt (`geruest-dcl-label`) - fuenf Artikelnamen enthalten ein Anfuehrungszeichen, das das DCL-Label sonst vorzeitig beendet und die Datei zerstoert. **Konfigurationen**: gepflegte Bibliothek je Baugruppe unter `konfigurationen` in `geruest.json` (schreibgeschuetzt) plus eigene in `cfg/geruest_user.json` (gitignored, `geruest-user-schreiben`; getrennte Datei, damit Benutzerdaten und versionierte Bibliothek nicht kollidieren). Eigene Eintraege sind in der Liste mit `*` markiert und nur diese loeschbar. Konfigurationen verweisen ueber den ANZEIGENAMEN auf Variante und Anbauteile; ein unbekannter Name wird gemeldet und uebersprungen, statt die Konfiguration scheitern zu lassen. Speichern/Loeschen laufen ueber `done_dialog 2`/`3` (Dialog schliessen, Aktion, neu zeigen) - `getstring` funktioniert aus einem `action_tile`-Rueckruf heraus nicht. Der Block wird - wie KREISEL_n/VF_n - SELBST zusammengebaut: Dummy-DWG aus `data/geruest` liefert nur Geometrie, das Attribut-Schema kommt aus `*geruest-attrib-defs*` (ID, ARTINR, LAENGE, BEZEICHNUNG, TEILEART, TEILEFARBE, LAYER) und wird per `ssg-attrib-merge` mit den Dummy-Tags zusammengefuehrt - sonst verschluckt `ssg-attrib-set-on` stillschweigend jeden Tag, den die Dummy-DWG nicht als ATTDEF kennt. **Teile-Geometrie**: jede ausgewaehlte Artikelnummer (Basis/oben/unten inkl. aufgeloester Gruppen), fuer die `data/geruest/<artnr>.dwg` existiert, wird zusaetzlich einmal bei 0,0,0 mit in den Block eingefuegt (`geruest-teile-dwgs`, dedupliziert, fehlende DWGs still uebergangen) - reine visuelle Rueckmeldung, die Attribut-Logik bleibt davon unberuehrt. **TEILEFARBE** ist eine kommagetrennte Liste parallel zu ARTINR (z.B. `,,RAL7030,,RAL7030`): Teile mit `"farbig": true` in `geruest.json` (je Artikel; eine Gruppe vererbt es an ihre Teile, fehlend = false) bekommen die im Dialog gewaehlte Baugruppenfarbe, alle anderen einen leeren Eintrag. ARTINR und TEILEFARBE entstehen aus demselben Durchlauf (`geruest-teile-paare`/`-paare-n`, `geruest-farbliste`), sind also garantiert gleich lang. `export_sivas.py` schreibt daraus je Artikelnummer das Merkmal `{"108": "<Farbe>"}` in `details` (Nummer aus `cfg/export.cfg` `[Sivas] merLine truncated
| `GeruestInsert.lsp` | GERUEST, GERUEST_SAEULEN, GERUEST_ROHRABHAENGER, GERUEST_WANDBEFESTIGUNG, GERUEST_TRAEGER, GERUEST_TRAEGER_BESCHRIFTEN, OMNI_FAHRSTRECKE, OMNI_FAHRSTRECKE_BESCHRIFTEN | Geruest-Baugruppen aus `data/json/geruest.json` konfigurieren und einfuegen. **Ein Dialog je Bereich**: Rohrabhaenger / Saeulen / Wandbefestigung oeffnen NUR ueber ihren eigenen Menuebefehl (`geruest-starten id`, Dialogtitel aus dem ASCII-Feld `titel`); eine Umschaltung im Dialog gibt es nicht (DCL hat kein Reiter-Tile), `GERUEST` ohne Bereich zeigt nur einen Hinweis. Der Dialogstand beginnt je Aufruf frisch. 1"- und 2"-Saeulen liegen in EINER Baugruppe `Saeulen` mit gemeinsamer Anbauteil-Liste; **`teileart` und `dummy` duerfen je Geometrie-Variante ueberschrieben werden** (`geruest-variante-wert`, Variante gewinnt vor Baugruppe; fuer `dummy` ueber `geruest-dummy-wahl`: fehlt die DWG der Variante, Meldung + Rueckfall auf den Baugruppen-Dummy; ist der Dummy zugleich eine Teile-DWG, wird er per `geruest-ohne-pfad` nicht doppelt eingefuegt) - so liefert `R 1"` weiterhin TEILEART `Geruest Saeule 1 Zoll` und die `R 2"`-Varianten `Geruest Saeule 2 Zoll`, die Groessen bleiben im Export also unterscheidbar. **Das Layout steht als Vorlage in `dcl/geruest.dcl`** (bzw. `dcl/geruest_traeger.dcl`); nur die datenabhaengigen Bloecke - ein `radio_button` je Variante (Key `v<i>`, `geruest-radio-key`/`-index`), Mengenfeld + Ankreuzfeld je Anbauteil - werden zur Laufzeit an Markerzeilen `//@NAME@` eingesetzt (`geruest-dcl-ersetzungen` -> `ssg-dcl-vorlage-fuellen` in ssg_core, Temp-Datei, nach `unload_dialog` geloescht). Grund: DCL kann Tiles weder zur Laufzeit erzeugen noch ausblenden, Radiobutton-Labels lassen sich per `set_tile` nicht aendern, und eine `list_box` kann keine Eingabefelder enthalten. Varianten bewusst als Radiobuttons statt `list_box`: BricsCAD zeichnet die Listenspalte nur halb so breit, und ein `tabs`-Wert passt nur schrift-/skalierungsabhaengig. Inhalt: Basis-Variante aus `geometrie_varianten` (`list_box` mit Einfachauswahl, Hoehe nach Variantenzahl, `geruest-dcl-listenhoehe`), **Winkel Platte** (0/90 Grad, `*geruest-winkel-werte*`): Ausrichtung der Anbauteile zur Basis - die Teile-DWGs aus oben/unten/sonstiges werden um diesen Winkel um Z gedreht in den Block eingefuegt, Basis und Dummy bleiben ungedreht (`geruest-teile-dwgs-rot`; in Konfigurationen als echter Wert `winkel_platte`, kein Block-Attribut), Laenge (gegen `attribute.Laenge` min/max geprueft, Retry-Schleife), Farbe (`attribute.Teilefarbe`, Freitext bei `frei_option`) und **eine Befestigungsspalte** "Befestigung oben und unten" mit allen `anbaugruppen.befestigung` - die Anzahl ist die GESAMTanzahl je Teil (oben und unten zusammen; Tile-Keys `b<i>`/`bm<i>`, Zustand `*geruest-dlg-bef*`). Unter jedem Teil (auch in Sonstiges) zeigt eine Textzeile "Art.-Nr. ..." die Artikelnummer(n) (`geruest-artnr-anzeige`: Einzelteil -> `sivas_id`, Gruppe -> eindeutige Nummern der Teile; DCL kennt keine Schriftgroesse, darum normale Groesse in eigener Zeile). `anbaugruppen` ist ein Objekt mit zwei Listen: `befestigung` (Befestigungsspalte) und `sonstiges` (Teile, die weder oben noch unten sitzen, z.B. die Saeulen-Haltearme) - letztere bekommen eine eigene Zeile darunter (nur wenn nicht leer), in ARTINR/BEZEICHNUNG nach "unten" als "sonstiges" (`geruest-anbau-liste`; ein altes flaches Array gilt als `befestigung`). **Zwei Mengenfelder im JSON, bewusst verschieden benannt**: `stueckzahl` = wie oft ein Teil TATSAECHLICH geschrieben wird (je Variante bzw. je Satz/Anbauteil, fehlt = 1), `anzahl_vorgabe` = NUR die Vorbelegung des Anzahl-Feldes im Dialog (Anbaugruppen, fehlt = 1); ein Anbauteil wird Anzahl x `stueckzahl` mal geschrieben, bei einer Gruppe (`teile`) zaehlt die Anzahl die Saetze (`geruest-stueckzahl`/`geruest-anzahl-vorgabe`). In Konfigurationen (`befestigung`/`sonstiges`, dazu `winkel_platte`) heisst der gespeicherte Dialogwert `anzahl`. Aeltere Konfigurationen mit getrennten `oben`/`unten`-Listen laden weiter: deren Mengen werden zur Gesamtanzahl addiert (`geruest-konfig-befestigung`), Sonstiges-Teile darin still in die Sonstiges-Zeile umgehaengt (`geruest-konfig-sonstiges`); beim naechsten Speichern steht alles im neuen Format. Baugruppen ohne `attribute`-Block (Wandbefestigung) bekommen Laenge/Farbe gesperrt, Baugruppen ohne Anbauteile bekommen gar keine Spalten (ein leerer DCL-Cluster ist unzulaessig). Im generierten Label wird `"` zu `''` ersetzt (`geruest-dcl-label`) - fuenf Artikelnamen enthalten ein Anfuehrungszeichen, das das DCL-Label sonst vorzeitig beendet und die Datei zerstoert. **Konfigurationen**: gepflegte Bibliothek je Baugruppe unter `konfigurationen` in `geruest.json` (schreibgeschuetzt) plus eigene in `cfg/geruest_user.json` (gitignored, `geruest-user-schreiben`; getrennte Datei, damit Benutzerdaten und versionierte Bibliothek nicht kollidieren). Eigene Eintraege sind in der Liste mit `*` markiert und nur diese loeschbar. **Geaenderte KonfiguratiLine truncated
| `menu-inventory.lsp` | MenuInventory | BricsCAD Diagnostik (Menuegruppen, Plugins, Startdateien) |
| `DinFormate.lsp` | DIN_FORMATE | Ersatz fuer das alte ACADSST-Makro `DINFORM.LSP`/`.DCL` (SSG2-Menue "DIN-FORMATE..."): fuegt einen DIN-Rahmen (A0-A3, A4 quer/hoch) und optional einen Schriftkopf (KOPF11, Sprachen DE/EN/FR/IT) per Dialog (`dcl/dinformate.dcl`) ein. Block-DWGs liegen flach in `cfg/rahmen/` (kopiert aus `\\infor-ln\SSG_Tools\ACADSST\KOEPFE` - nur die von DINFORM.LSP tatsaechlich referenzierten Dateien: `A0`/`A1`/`A2`/`A3`/`A4Q`/`A4H.DWG` + `Kopf11`/`Kopf11e`/`Kopf11f`/`Kopf11i.dwg`). Rahmen wird im Zeichenmassstab-Faktor eingefuegt, der Kopf im Faktor/100 (Kopf-DWG ist 100x groesser als die Rahmen-DWGs angelegt) - unveraendert aus dem Original-Massstabsschema uebernommen. Blockdefinitionen werden einmalig per `_.-INSERT ... _X 0` nachgeladen (`dinformate-block-laden`), falls noch nicht in der Zeichnung vorhanden. Lazy geladen ueber `(ssg-ensure "DinFormate")`, Menue: Werkzeuge > Din Formate. |
| `DrawPlanquadrate.lsp` | DRAW_PLANQUADRATE, DELETE_PLANQUADRATE, PLANQUADRATE_TOGGLE | Zeichnet auf Z=0 ein Planquadrat-Linienraster (senkrecht/waagerecht), im Abstand/Zaehlschema der aktiven `[Planquadrate]`-Konfiguration aus `cfg/export.cfg` (dieselbe Quelle wie `lib/export_planquadrat.py` fuer den CSV-Export). Bereich kommt NICHT aus den Zeichnungs-Extents, sondern aus derselben Blockmenge wie EXPORTCSV (`csv:collect-export-blocks`, export.lsp; siehe `plq-export-bbox`): Ursprung (Index 1) UND obere Grenze kommen BEIDE aus der tatsaechlichen Bounding-Box jedes Blocks (`csv:get-bbox`, wie `bbox_columns()`/`planquadrat_column()`/`_bbox_min()` in `lib/export_csv.py` bzw. `lib/export_planquadrat.py`), NICHT aus dem reinen Einfuegepunkt - bei einem gedrehten/exzentrisch eingefuegten Block (z.B. ein um 90 Grad gedrehter Kreisel) kann das Bounding-Box-Zentrum weit vom Einfuegepunkt abweichen; Ursprung und Zellzuordnung muessen auf derselben Referenz beruhen, sonst driften sie auseinander (realer Bug, behoben). Reine Hilfsgeometrie (Kreisel-Umfahrungsboegen als eigene Linien, Texte) zaehlt bewusst nicht mit, sonst weicht das Raster vom CSV-Export ab. `x_origin`/`y_origin` ueberschreiben den Ursprung, Fallback auf EXTMIN/EXTMAX falls keine Export-Bloecke vorhanden sind bzw. `csv:get-bbox` fuer einen Block scheitert. Spalten-/Zeilenzahl wird IMMER aufgerundet auf volle Rasterschritte, damit alle senkrechten Linien auf der letzten waagerechten enden und umgekehrt - das Raster bildet immer ein geschlossenes Rechteck. Zaehlung (alphabetisch/numerisch je Achse) als Text am linken/unteren Rand. Das fertige Raster (Linien+Texte) wird per `_.-BLOCK`/`_.INSERT` zu einem einzigen Block `ZZ_PLANQUADRATE` bei (0,0,0) zusammengefasst. Layer aus `cfg/layer.cfg` (`[allgemein]` Key `planquadrate`, Fallback `ZZ_Planquadrate`). DRAW_PLANQUADRATE entfernt vor dem Neuaufbau zuerst einen evtl. vorhandenen Block (`plq-block-entfernen`: INSERTs loeschen + `_-PURGE _B`), DELETE_PLANQUADRATE ruft nur diese Entfernung auf. PLANQUADRATE_TOGGLE ("Planquadrate an/aus", Menue: Konfiguration) prueft per `tblsearch`/`ssget "X"`, ob der Block existiert, und dispatcht auf Zeichnen bzw. Loeschen. Lazy geladen ueber `(ssg-ensure "DrawPlanquadrate")`, nicht in der Core-Ladereihenfolge. Die Planquadrat-SPALTE im CSV-Export (`export_csv.py::planquadrat_column`/`resolve_origins`, `lib/export_planquadrat.py::compute_planquadrat`/`_bbox_min`) rechnet ebenfalls durchgaengig auf Bounding-Box-Basis (nicht nur Einfuegepunkt) und liefert eine SPANNE ("A/1-J/1") statt nur einer Zelle, wenn ein Element mehr als eine Zelle ueberdeckt (Kreisel, lange VF-/GF-Ketten). |
@@ -131,7 +131,9 @@ Detaillierte Dokumentation aller Funktionen und Befehle: siehe `Lisp/README.md`.
| `sprache.dcl` | SSG_SPRACHE (SSG_LIB_Commands.lsp) |
| `tro_insert.dcl` | TRO_INSERT (Tro_Edit.lsp) |
| `tro_edit.dcl` | TRO_EDIT (Tro_Edit.lsp) |
| `geruest_traeger.dcl` | GERUEST_TRAEGER (GeruestInsert.lsp, `geruest-traeger-dialog`) |
| `geruest.dcl` | VORLAGE fuer GERUEST_SAEULEN/_ROHRABHAENGER/_WANDBEFESTIGUNG (GeruestInsert.lsp, `geruest-dialog`); Platzhalter `//@TITEL@`/`//@VARIANTEN@`/`//@BEFESTIGUNG@`/`//@SONSTIGES@` werden per `ssg-dcl-vorlage-fuellen` gefuellt, nicht direkt ladbar |
| `geruest_traeger.dcl` | VORLAGE fuer GERUEST_TRAEGER (GeruestInsert.lsp, `geruest-traeger-dialog`), Platzhalter `//@VARIANTEN@` |
| `fahrstrecke.dcl` | VORLAGE fuer OMNI_FAHRSTRECKE (GeruestInsert.lsp, `geruest-traeger-dialog`), gleiche Tile-Keys wie `geruest_traeger.dcl`, Platzhalter `//@VARIANTEN@` |
| `dinformate.dcl` | DIN_FORMATE (DinFormate.lsp) |
| `vfl_edit.dcl` | Linienzug-Editieren/Fortsetzen (vf_linienzug.lsp, `vfl-dlg-position`, aufgerufen aus `vfl-edit-ent`) |
| `vf_linienzug_wizard.dcl` | Linienzug-Assistent (Modus 1, 2 UND 3): zwei generische Einzel-Dialoge (Zahl-Eingabe, Mehrfachauswahl; `vflw-zahl`/`vflw-wahl`, aufgerufen aus `vfl-in-real`/`vfl-in-string`/`vfl-in-int` bei aktivem `*vfl-wizard-mode*`) PLUS sieben Gruppen-Dialoge, die mehrere immer unmittelbar aufeinanderfolgende Fragen in einem Bildschirm zusammenfassen (Kettenstart, AS-Element, GF-Bogen, ES-Element, Vario-Kurve, Gefaelle festlegen, Ziel-Hoehe, Horizontales Stueck - inkl. Punktwahl-Button mit X/Y/Z-Anzeige; `vflw-gruppe-*-impl` in vf_linienzug.lsp fuellen dafuer vorab eine kleine Pending-Queue `*vflw-pending*`, die einzelnen `vfl-in-*`-Aufrufe bleiben dabei unveraendert) PLUS drei Segment-Gruppen-Dialoge fuer die segmentweise Klassifizierung in Modus 2/3 (`vflw_seg_linie_m2` = Typ+GF-Neigung, `vflw_seg_linie_m3` = 4-fach-Typ+kontextabh. Wertfeld, `vflw_seg_bogen` = Typ+Variante; `vflw-seg-*-impl`). Beide Modi heben vor der Frage das aktuelle Pfad-Segment (LINE/ARC) per `vfl-seg-highlight` (`redraw`) in der Zeichnung hervor und zeigen "Segment i/n ..." im Dialogkopf. Details: `doc/variofoerderer.md` |
+689 -387
View File
File diff suppressed because it is too large. Load diff
+21
View File
@@ -1479,6 +1479,27 @@
(princ)
)
;; --- Omniflo / Türlösungen Schwenkschienen ---
;; Feste TEF-Bauteile ohne Sivas-Auswahl: Datei liegt direkt unter DXFM_OMNIFLO,
;; wird per omni:insert-dxf am gewaehlten Einfuegepunkt ohne Drehung eingefuegt.
(defun c:OMNI_SCHW_400_R ()
(omni:insert-dxf "824604002" nil nil)
(princ)
)
(defun c:OMNI_SCHW_400_L ()
(omni:insert-dxf "824604001" nil nil)
(princ)
)
(defun c:OMNI_SCHW_400_R_SENSORIK ()
(omni:insert-dxf "824604012" nil nil)
(princ)
)
(defun c:OMNI_SCHW_400_L_SENSORIK ()
(omni:insert-dxf "824604011" nil nil)
(princ)
)
;; --- Omniflo / TEF Elemente ---
+43 -4
View File
@@ -1643,10 +1643,9 @@
;; Schreibt eine Liste von Textzeilen als temporaere DCL-Datei und liefert
;; deren Pfad zurueck (oder nil bei Fehler, z.B. wenn open scheitert). Der
;; Aufrufer ist fuer load_dialog/unload_dialog UND das Loeschen der Datei
;; (vl-file-delete) danach selbst verantwortlich - analog zum bestehenden
;; Muster in GeruestInsert.lsp (geruest-dcl-schreiben), hier nur als
;; generischer Baustein fuer WEITERE Aufrufer (GeruestInsert.lsp selbst
;; bleibt unveraendert, um dessen Code nicht anzufassen).
;; (vl-file-delete) danach selbst verantwortlich. Fuer Dialoge mit fester
;; Grundstruktur und nur einzelnen datenabhaengigen Bloecken siehe
;; ssg-dcl-vorlage-fuellen.
(defun ssg-dcl-temp-schreiben (praefix zeilen / pfad f)
(setq pfad (vl-filename-mktemp praefix nil ".dcl"))
(if (setq f (open pfad "w"))
@@ -1659,6 +1658,46 @@
)
)
;; DCL-Vorlagen mit Platzhaltern: DCL kann Tiles weder zur Laufzeit erzeugen
;; noch ausblenden, und Labels von radio_button/toggle lassen sich per
;; set_tile nicht aendern. Datenabhaengige Teile (z.B. ein Radiobutton je
;; Variante) werden darum in eine statische .dcl-Vorlage eingesetzt: jede
;; Zeile, die getrimmt genau "//@NAME@" lautet, wird durch die Zeilen aus
;; ersetzungen (("NAME" . (zeile ...)) ...) ersetzt. Eine leere Liste
;; entfernt die Markerzeile; ein unbekannter Marker bleibt als DCL-Kommentar
;; stehen (harmlos). Das Layout bleibt so eine normale, lesbare .dcl-Datei.
(defun ssg-dcl-zeilen-ersetzen (zeilen ersetzungen / erg t1 name e)
(setq erg nil)
(foreach z zeilen
(setq t1 (vl-string-trim " \t" z))
(setq name (if (and (> (strlen t1) 4)
(= (substr t1 1 3) "//@")
(= (substr t1 (strlen t1) 1) "@"))
(substr t1 4 (- (strlen t1) 4))))
(if (and name (setq e (assoc name ersetzungen)))
(setq erg (append erg (cdr e)))
(setq erg (append erg (list z)))
)
)
erg
)
;; Vorlage lesen, Platzhalter ersetzen (ssg-dcl-zeilen-ersetzen) und als
;; temporaere DCL-Datei schreiben. Rueckgabe: Pfad oder nil (Vorlage fehlt /
;; nicht lesbar / nicht schreibbar). Laden und Loeschen wie bei
;; ssg-dcl-temp-schreiben durch den Aufrufer.
(defun ssg-dcl-vorlage-fuellen (vorlage-pfad praefix ersetzungen / f z zeilen)
(if (and vorlage-pfad (findfile vorlage-pfad) (setq f (open vorlage-pfad "r")))
(progn
(setq zeilen nil)
(while (setq z (read-line f)) (setq zeilen (cons z zeilen)))
(close f)
(ssg-dcl-temp-schreiben praefix
(ssg-dcl-zeilen-ersetzen (reverse zeilen) ersetzungen))
)
)
)
;; ------------------------------------------------------------
;; REKURSIVER JSON-PARSER
+4
View File
@@ -163,6 +163,10 @@
(cons "ils_kreisel" (ssg-text "sl-erk-kreisel")))
((or (wcmatch b "VF_*") (wcmatch b "GF_*"))
(cons "ils_strecke" (ssg-text "sl-erk-strecke")))
;; Fahrstrecke (OMNI_FAHRSTRECKE) entsteht ueber den Geruest-Baukasten und
;; traegt darum ebenfalls das GR_-Praefix - VOR dem allgemeinen GR_-Zweig.
((wcmatch b "GR_FAHRSTRECKE_*")
(cons "fahrstrecke" (ssg-text "sl-erk-fahrstrecke")))
((wcmatch b "GR_*")
(cons "geruest" (ssg-text "sl-erk-geruest")))
((wcmatch b "AP60*")
+213 -307
View File
@@ -83,137 +83,99 @@
]
}
],
"anbaugruppen": [
{
"artikel": "SPANNPRATZE ST - KH 8-11 KPL.SELBSTSICHERND",
"sivas_id": 821004120,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 1
},
{
"artikel": "SPANNPRATZE SELBSTSICHERND KPL.",
"sivas_id": 821004058,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 1
},
{
"name": "Schraubenset",
"anzahl_vorgabe": 1,
"teile": [
{
"artikel": "Scheibe DIN 125 - A 10,5 - 140 HV - St",
"sivas_id": 913011010,
"farbig": false,
"stueckzahl": 1
},
{
"artikel": "Sechskantmutter DIN 934 - M10 - 8",
"sivas_id": 912011010,
"farbig": false,
"stueckzahl": 2
},
{
"artikel": "Sechskantschraube DIN 933 - M10 x 30 - 8.8",
"sivas_id": 911011008,
"farbig": false,
"stueckzahl": 1
}
]
},
{
"artikel": "U-BÜGEL M7 41X49 FÜR PROFILGERÜST - BG",
"sivas_id": 825004049,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 1
},
{
"artikel": "ROHRKLAMMER 1\" KPL. VERTIKAL",
"sivas_id": 825004040,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 2
},
{
"artikel": "WINKEL 60X60X6X300",
"sivas_id": 821006043,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 1
},
{
"artikel": "WINKEL 60X60X6X60",
"sivas_id": 821006042,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 1
},
{
"artikel": "ROHRKLAMMER 1\" T-VERBINDUNG KPL.",
"sivas_id": 825004030,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 1
},
{
"artikel": "ROHRKLAMMER 1\" FLACH UND LANG, KPL.",
"sivas_id": 825002021,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 1
},
{
"artikel": "DURCHSTECKANKER HST M12X115X20",
"sivas_id": 922021003,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 1
}
],
"konfigurationen": [
{
"name": "Abhaengung Spannpratze / Rohrklammer",
"variante": "ROHR R 1\" 33,7 x 2,6",
"laenge": 2000,
"teilefarbe": "RAL7035",
"oben": [
{
"artikel": "SPANNPRATZE SELBSTSICHERND KPL.",
"anzahl": 1
},
{
"artikel": "Schraubenset",
"anzahl": 1
}
],
"unten": [
{
"artikel": "ROHRKLAMMER 1\" KPL. VERTIKAL",
"anzahl": 2
}
]
},
{
"name": "Abhaengung Duebel / T-Verbindung",
"variante": "ROHR R 1\" 33,7 x 2,6 einseitig gequetscht",
"laenge": 1500,
"teilefarbe": "RAL7035",
"oben": [
{
"artikel": "DURCHSTECKANKER HST M12X115X20",
"anzahl": 2
}
],
"unten": [
{
"artikel": "ROHRKLAMMER 1\" T-VERBINDUNG KPL.",
"anzahl": 1
}
]
}
]
"anbaugruppen": {
"befestigung": [
{
"artikel": "SPANNPRATZE ST - KH 8-11 KPL.SELBSTSICHERND",
"sivas_id": 821004120,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 1
},
{
"artikel": "SPANNPRATZE SELBSTSICHERND KPL.",
"sivas_id": 821004058,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 1
},
{
"name": "Schraubenset",
"anzahl_vorgabe": 1,
"teile": [
{
"artikel": "Scheibe DIN 125 - A 10,5 - 140 HV - St",
"sivas_id": 913011010,
"farbig": false,
"stueckzahl": 1
},
{
"artikel": "Sechskantmutter DIN 934 - M10 - 8",
"sivas_id": 912011010,
"farbig": false,
"stueckzahl": 2
},
{
"artikel": "Sechskantschraube DIN 933 - M10 x 30 - 8.8",
"sivas_id": 911011008,
"farbig": false,
"stueckzahl": 1
}
]
},
{
"artikel": "U-BÜGEL M7 41X49 FÜR PROFILGERÜST - BG",
"sivas_id": 825004049,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 1
},
{
"artikel": "ROHRKLAMMER 1\" KPL. VERTIKAL",
"sivas_id": 825004040,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 2
},
{
"artikel": "WINKEL 60X60X6X300",
"sivas_id": 821006043,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 1
},
{
"artikel": "WINKEL 60X60X6X60",
"sivas_id": 821006042,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 1
},
{
"artikel": "ROHRKLAMMER 1\" T-VERBINDUNG KPL.",
"sivas_id": 825004030,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 1
},
{
"artikel": "ROHRKLAMMER 1\" FLACH UND LANG, KPL.",
"sivas_id": 825002021,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 1
},
{
"artikel": "DURCHSTECKANKER HST M12X115X20",
"sivas_id": 922021003,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 1
}
],
"sonstiges": []
},
"konfigurationen": []
},
"Säulen": {
"id": "Saeulen",
@@ -273,126 +235,90 @@
]
}
],
"anbaugruppen": [
{
"artikel": "KLEMMRING MIT MUFFE EINFACH KPL.",
"sivas_id": 825002019,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 2
},
{
"artikel": "KLEMMRING MIT MUFFE DOPPELT 90 Grad, KPL.",
"sivas_id": 825002009,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 2
},
{
"artikel": "KLEMMRING MIT MUFFE DOPPELT 180 Grad, KPL.",
"sivas_id": 825002008,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 2
},
{
"artikel": "KLEMMRING M. MUFFE DREIFACH 90 Grad/180 Grad KPL.",
"sivas_id": 825002007,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 2
},
{
"artikel": "KLEMMRING MIT LASCHE KPL. ZUSAMMENBAUZEICHNUNG",
"sivas_id": 825002020,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 2
},
{
"artikel": "QUERSCHELLE F. 1\" UND 2\" ROHR GESCHW./VZ. M. 4X M10X30 KPL.",
"sivas_id": 825002022,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 2
},
{
"artikel": "KREUZSCHELLE F. 2\" UND 1\" ROHR SCHWENKBAR 360 Grad",
"sivas_id": 922083009,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 2
},
{
"artikel": "HALTEARM FÜR BODENSÄULE R 2\" 1-ARMIG KPL.",
"sivas_id": 821004051,
"farbig": true,
"stueckzahl": 1,
"anzahl_vorgabe": 1
},
{
"artikel": "HALTEARM FÜR BODENSÄULE R 2\" 2-ARMIG 90 Grad KPL.",
"sivas_id": 821004054,
"farbig": true,
"stueckzahl": 1,
"anzahl_vorgabe": 1
},
{
"artikel": "HALTEARM FÜR BODENSÄULE R 2\" 2-ARMIG 180 Grad KPL.",
"sivas_id": 821004052,
"farbig": true,
"stueckzahl": 1,
"anzahl_vorgabe": 1
},
{
"artikel": "HALTEARM FÜR BODENSÄULE R 2\" 3-ARMIG KPL.",
"sivas_id": 821004053,
"farbig": true,
"stueckzahl": 1,
"anzahl_vorgabe": 1
}
],
"konfigurationen": [
{
"name": "Bodensaeule 1 Zoll, Standardhoehe",
"variante": "R 1\"",
"laenge": 1000,
"teilefarbe": "RAL7035",
"oben": [],
"unten": []
},
{
"name": "Bodensaeule 2 Zoll, Haltearm 1-armig",
"variante": "R 2\" Haltearm 1-ARMIG",
"laenge": 1200,
"teilefarbe": "RAL7035",
"oben": [
{
"artikel": "KLEMMRING MIT MUFFE EINFACH KPL.",
"anzahl": 2
}
],
"unten": []
},
{
"name": "Bodensaeule 2 Zoll, Haltearm 2-armig 90 Grad",
"variante": "R 2\" Haltearm 2-ARMIG 90 Grad",
"laenge": 1200,
"teilefarbe": "RAL7035",
"oben": [
{
"artikel": "KLEMMRING MIT MUFFE DOPPELT 90 Grad, KPL.",
"anzahl": 2
}
],
"unten": [
{
"artikel": "QUERSCHELLE F. 1\" UND 2\" ROHR GESCHW./VZ. M. 4X M10X30 KPL.",
"anzahl": 2
}
]
}
]
"anbaugruppen": {
"befestigung": [
{
"artikel": "KLEMMRING MIT MUFFE EINFACH KPL.",
"sivas_id": 825002019,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 2
},
{
"artikel": "KLEMMRING MIT MUFFE DOPPELT 90 Grad, KPL.",
"sivas_id": 825002009,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 2
},
{
"artikel": "KLEMMRING MIT MUFFE DOPPELT 180 Grad, KPL.",
"sivas_id": 825002008,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 2
},
{
"artikel": "KLEMMRING M. MUFFE DREIFACH 90 Grad/180 Grad KPL.",
"sivas_id": 825002007,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 2
},
{
"artikel": "KLEMMRING MIT LASCHE KPL. ZUSAMMENBAUZEICHNUNG",
"sivas_id": 825002020,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 2
},
{
"artikel": "QUERSCHELLE F. 1\" UND 2\" ROHR GESCHW./VZ. M. 4X M10X30 KPL.",
"sivas_id": 825002022,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 2
},
{
"artikel": "KREUZSCHELLE F. 2\" UND 1\" ROHR SCHWENKBAR 360 Grad",
"sivas_id": 922083009,
"farbig": false,
"stueckzahl": 1,
"anzahl_vorgabe": 2
}
],
"sonstiges": [
{
"artikel": "HALTEARM FÜR BODENSÄULE R 2\" 1-ARMIG KPL.",
"sivas_id": 821004051,
"farbig": true,
"stueckzahl": 1,
"anzahl_vorgabe": 1
},
{
"artikel": "HALTEARM FÜR BODENSÄULE R 2\" 2-ARMIG 90 Grad KPL.",
"sivas_id": 821004054,
"farbig": true,
"stueckzahl": 1,
"anzahl_vorgabe": 1
},
{
"artikel": "HALTEARM FÜR BODENSÄULE R 2\" 2-ARMIG 180 Grad KPL.",
"sivas_id": 821004052,
"farbig": true,
"stueckzahl": 1,
"anzahl_vorgabe": 1
},
{
"artikel": "HALTEARM FÜR BODENSÄULE R 2\" 3-ARMIG KPL.",
"sivas_id": 821004053,
"farbig": true,
"stueckzahl": 1,
"anzahl_vorgabe": 1
}
]
},
"konfigurationen": []
},
"Wandbefestigung": {
"id": "Wandbefestigung",
@@ -449,61 +375,41 @@
]
}
],
"anbaugruppen": [
{
"name": "Nylondübel 12x60 inkl. Holzschrauben",
"anzahl_vorgabe": 2,
"teile": [
{
"artikel": "HOLZSCHRAUB,10X70, 6KT DIN 571 VZ",
"sivas_id": 911271027,
"farbig": false,
"stueckzahl": 1
},
{
"artikel": "NYLON - DUEBEL 12X60 (TYP S)",
"sivas_id": 922013003,
"farbig": false,
"stueckzahl": 1
}
]
},
{
"name": "HST M12X115X20",
"anzahl_vorgabe": 2,
"teile": [
{
"artikel": "DURCHSTECKANKER HST M12X115X20 WANDABH.",
"sivas_id": 922021003,
"farbig": false,
"stueckzahl": 1
}
]
}
],
"konfigurationen": [
{
"name": "Wandflansch mit Duebeln",
"variante": "WANDFLANSCH EINZELTEIL",
"oben": [
{
"artikel": "Nylondübel 12x60 inkl. Holzschrauben",
"anzahl": 2
}
],
"unten": []
},
{
"name": "Winkel 300 mit Schwerlastanker",
"variante": "WINKEL 60X60X6X300",
"oben": [
{
"artikel": "HST M12X115X20",
"anzahl": 2
}
],
"unten": []
}
]
"anbaugruppen": {
"befestigung": [
{
"name": "Nylondübel 12x60 inkl. Holzschrauben",
"anzahl_vorgabe": 2,
"teile": [
{
"artikel": "HOLZSCHRAUB,10X70, 6KT DIN 571 VZ",
"sivas_id": 911271027,
"farbig": false,
"stueckzahl": 1
},
{
"artikel": "NYLON - DUEBEL 12X60 (TYP S)",
"sivas_id": 922013003,
"farbig": false,
"stueckzahl": 1
}
]
},
{
"name": "HST M12X115X20",
"anzahl_vorgabe": 2,
"teile": [
{
"artikel": "DURCHSTECKANKER HST M12X115X20 WANDABH.",
"sivas_id": 922021003,
"farbig": false,
"stueckzahl": 1
}
]
}
],
"sonstiges": []
},
"konfigurationen": []
}
}
+6
View File
@@ -89,6 +89,7 @@
"text": "DRT 80",
"layer": "D-1-BEM"
},
"mit_querstrebe": true,
"teileart": "Geruest Traeger",
"layer": "D-1",
"teile": [
@@ -107,6 +108,7 @@
"layer": "D-1-BEM"
},
"mit_muffe": true,
"mit_querstrebe": true,
"teileart": "Geruest Traeger",
"layer": "D-1",
"teile": [
@@ -124,6 +126,7 @@
"text": "DRT 114",
"layer": "D-3-BEM"
},
"mit_querstrebe": true,
"teileart": "Geruest Traeger",
"layer": "D-3",
"teile": [
@@ -142,6 +145,7 @@
"layer": "D-3-BEM"
},
"mit_muffe": true,
"mit_querstrebe": true,
"teileart": "Geruest Traeger",
"layer": "D-3",
"teile": [
@@ -159,6 +163,7 @@
"text": "RT 80/80",
"layer": "D-5-BEM"
},
"mit_querstrebe": true,
"teileart": "Geruest Traeger",
"layer": "D-5",
"teile": [
@@ -177,6 +182,7 @@
"layer": "D-5-BEM"
},
"mit_muffe": true,
"mit_querstrebe": true,
"teileart": "Geruest Traeger",
"layer": "D-5",
"teile": [
+157
View File
@@ -0,0 +1,157 @@
{
"Fahrstrecke": {
"id": "Fahrstrecke",
"titel": "Fahrstrecke",
"teileart": "Omniflo Fahrstrecke",
"muffe": {
"dummy": "dummy_Muffe_1zoll.dwg"
},
"beschriftung": {
"format": "%1 L=%2",
"stil": "Lan",
"ausrichtung": "BL",
"hoehe": 100
},
"attribute": {
"LAENGE": {
"typ": "number",
"min": 0,
"max": 6000,
"einheit": "mm"
},
"TEILEFARBE": {
"typ": "auswahl",
"optionen": [
"RAL7035",
"RAL7030"
],
"frei_erlaubt": true,
"frei_option": "Individuell"
}
},
"geometrie_varianten": [
{
"name": "AP 110",
"beschriftung": {
"text": "AP 110",
"layer": "A-7-BEM"
},
"teileart": "Omniflo Fahrstrecke",
"layer": "A-7",
"teile": [
{
"artikel": "AP 110",
"sivas_id": 821106001,
"stueckzahl": 1
}
]
},
{
"name": "APG 110",
"beschriftung": {
"text": "APG 110",
"layer": "A-2-BEM"
},
"teileart": "Omniflo Fahrstrecke",
"layer": "A-2",
"teile": [
{
"artikel": "APG 110",
"sivas_id": 821106002,
"stueckzahl": 1
}
]
},
{
"name": "AP 60",
"beschriftung": {
"text": "AP 60",
"layer": "A-4-BEM"
},
"teileart": "Omniflo Fahrstrecke",
"layer": "A-4",
"teile": [
{
"artikel": "AP 60",
"sivas_id": 821096001,
"stueckzahl": 1
}
]
},
{
"name": "ST",
"beschriftung": {
"text": "ST",
"layer": "L-2-BEM"
},
"mit_muffe": false,
"teileart": "Omniflo Fahrstrecke",
"layer": "L-2",
"teile": [
{
"artikel": "ST",
"sivas_id": 821084000,
"farbig": true,
"stueckzahl": 1
}
]
},
{
"name": "ST mit Muffen",
"disabled": true,
"beschriftung": {
"text": "ST",
"layer": "L-2-BEM"
},
"mit_muffe": true,
"teileart": "Omniflo Fahrstrecke",
"layer": "L-2",
"teile": [
{
"artikel": "ST mit Muffen",
"sivas_id": 821084007,
"farbig": true,
"stueckzahl": 1
}
]
},
{
"name": "STL",
"beschriftung": {
"text": "STL",
"layer": "L-2-BEM"
},
"mit_muffe": false,
"teileart": "Omniflo Fahrstrecke",
"layer": "L-2",
"teile": [
{
"artikel": "STL",
"sivas_id": 821084050,
"farbig": true,
"stueckzahl": 1
}
]
},
{
"name": "STL mit Muffen",
"disabled": true,
"beschriftung": {
"text": "STL",
"layer": "L-2-BEM"
},
"mit_muffe": true,
"teileart": "Omniflo Fahrstrecke",
"layer": "L-2",
"teile": [
{
"artikel": "STL mit Muffen",
"sivas_id": 821084057,
"farbig": true,
"stueckzahl": 1
}
]
}
]
}
}
+10
View File
@@ -0,0 +1,10 @@
[
{
"Sivasnr": 824331125,
"Beschreibung": "Ladeschleife - 6300, stufenlos ausziehbar, kpl.",
"Laenge": 6300,
"ProfilTyp": "AP 110",
"Stuetzfuß": 0,
"Antriebsart": 0
}
]
+247 -247
View File
@@ -1,76 +1,4 @@
[
{
"Sivasnr": 834372001,
"ProfilTyp": "WEICHE S 45-L-350/700, KPL. MIT M",
"WeichenTyp": "Einzelweiche",
"KurvenWinkel": 45,
"Schaltungstyp": "M",
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 1,
"SivasnrTEF": null,
"WeichenkörperLänge": 360
},
{
"Sivasnr": 834372002,
"ProfilTyp": "WEICHE S 45-L-350/700, KPL. MIT P",
"WeichenTyp": "Einzelweiche",
"KurvenWinkel": 45,
"Schaltungstyp": "P",
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 1,
"SivasnrTEF": null,
"WeichenkörperLänge": 360
},
{
"Sivasnr": "834372002+0_BG090090",
"ProfilTyp": "WEICHE S 45-L-350/700, KPL. MIT P mit TEF Innen",
"WeichenTyp": "Einzelweiche",
"KurvenWinkel": 45,
"Schaltungstyp": "P",
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 1,
"SivasnrTEF": "0_B10090+0_B10090",
"WeichenkörperLänge": 360
},
{
"Sivasnr": 834372004,
"ProfilTyp": "WEICHE S 45-R-350/700, KPL. MIT M",
"WeichenTyp": "Einzelweiche",
"KurvenWinkel": 45,
"Schaltungstyp": "M",
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 2,
"SivasnrTEF": null,
"WeichenkörperLänge": 360
},
{
"Sivasnr": 834372005,
"ProfilTyp": "WEICHE S 45-R-350/700, KPL. MIT P",
"WeichenTyp": "Einzelweiche",
"KurvenWinkel": 45,
"Schaltungstyp": "P",
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 2,
"SivasnrTEF": null,
"WeichenkörperLänge": 360
},
{
"Sivasnr": "834372005+0_BG090090",
"ProfilTyp": "WEICHE S 45-R-350/700, KPL. MIT P mit TEF Innen",
"WeichenTyp": "Einzelweiche",
"KurvenWinkel": 45,
"Schaltungstyp": "P",
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 2,
"SivasnrTEF": "0_B10090+0_B10090",
"WeichenkörperLänge": 360
},
{
"Sivasnr": 834372007,
"ProfilTyp": "WEICHE S 45-L-400/750, KPL. MIT M",
@@ -144,53 +72,77 @@
"WeichenkörperLänge": 360
},
{
"Sivasnr": 834372021,
"ProfilTyp": "WEICHE S 90-L-500/600, KPL. MIT M",
"Sivasnr": 834372001,
"ProfilTyp": "WEICHE S 45-L-350/700, KPL. MIT M",
"WeichenTyp": "Einzelweiche",
"KurvenWinkel": 90,
"KurvenWinkel": 45,
"Schaltungstyp": "M",
"Breite": 500,
"Länge": 600,
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 1,
"SivasnrTEF": null,
"WeichenkörperLänge": 360
},
{
"Sivasnr": 834372022,
"ProfilTyp": "WEICHE S 90-L-500/600, KPL. MIT P",
"Sivasnr": 834372002,
"ProfilTyp": "WEICHE S 45-L-350/700, KPL. MIT P",
"WeichenTyp": "Einzelweiche",
"KurvenWinkel": 90,
"KurvenWinkel": 45,
"Schaltungstyp": "P",
"Breite": 500,
"Länge": 600,
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 1,
"SivasnrTEF": null,
"WeichenkörperLänge": 360
},
{
"Sivasnr": 834372024,
"ProfilTyp": "WEICHE S 90-R-500/600, KPL. MIT M",
"Sivasnr": "834372002+0_BG090090",
"ProfilTyp": "WEICHE S 45-L-350/700, KPL. MIT P mit TEF Innen",
"WeichenTyp": "Einzelweiche",
"KurvenWinkel": 90,
"KurvenWinkel": 45,
"Schaltungstyp": "P",
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 1,
"SivasnrTEF": "0_B10090+0_B10090",
"WeichenkörperLänge": 360
},
{
"Sivasnr": 834372004,
"ProfilTyp": "WEICHE S 45-R-350/700, KPL. MIT M",
"WeichenTyp": "Einzelweiche",
"KurvenWinkel": 45,
"Schaltungstyp": "M",
"Breite": 500,
"Länge": 600,
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 2,
"SivasnrTEF": null,
"WeichenkörperLänge": 360
},
{
"Sivasnr": 834372025,
"ProfilTyp": "WEICHE S 90-R-500/600, KPL. MIT P",
"Sivasnr": 834372005,
"ProfilTyp": "WEICHE S 45-R-350/700, KPL. MIT P",
"WeichenTyp": "Einzelweiche",
"KurvenWinkel": 90,
"KurvenWinkel": 45,
"Schaltungstyp": "P",
"Breite": 500,
"Länge": 600,
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 2,
"SivasnrTEF": null,
"WeichenkörperLänge": 360
},
{
"Sivasnr": "834372005+0_BG090090",
"ProfilTyp": "WEICHE S 45-R-350/700, KPL. MIT P mit TEF Innen",
"WeichenTyp": "Einzelweiche",
"KurvenWinkel": 45,
"Schaltungstyp": "P",
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 2,
"SivasnrTEF": "0_B10090+0_B10090",
"WeichenkörperLänge": 360
},
{
"Sivasnr": 834372027,
"ProfilTyp": "WEICHE S 90-L-700/700, KPL. MIT M",
@@ -263,6 +215,54 @@
"SivasnrTEF": "0_B10080+0_B10090",
"WeichenkörperLänge": 360
},
{
"Sivasnr": 834372021,
"ProfilTyp": "WEICHE S 90-L-500/600, KPL. MIT M",
"WeichenTyp": "Einzelweiche",
"KurvenWinkel": 90,
"Schaltungstyp": "M",
"Breite": 500,
"Länge": 600,
"KurvenRichtung": 1,
"SivasnrTEF": null,
"WeichenkörperLänge": 360
},
{
"Sivasnr": 834372022,
"ProfilTyp": "WEICHE S 90-L-500/600, KPL. MIT P",
"WeichenTyp": "Einzelweiche",
"KurvenWinkel": 90,
"Schaltungstyp": "P",
"Breite": 500,
"Länge": 600,
"KurvenRichtung": 1,
"SivasnrTEF": null,
"WeichenkörperLänge": 360
},
{
"Sivasnr": 834372024,
"ProfilTyp": "WEICHE S 90-R-500/600, KPL. MIT M",
"WeichenTyp": "Einzelweiche",
"KurvenWinkel": 90,
"Schaltungstyp": "M",
"Breite": 500,
"Länge": 600,
"KurvenRichtung": 2,
"SivasnrTEF": null,
"WeichenkörperLänge": 360
},
{
"Sivasnr": 834372025,
"ProfilTyp": "WEICHE S 90-R-500/600, KPL. MIT P",
"WeichenTyp": "Einzelweiche",
"KurvenWinkel": 90,
"Schaltungstyp": "P",
"Breite": 500,
"Länge": 600,
"KurvenRichtung": 2,
"SivasnrTEF": null,
"WeichenkörperLänge": 360
},
{
"Sivasnr": 834372047,
"ProfilTyp": "WEICHE S PARALLEL-L-200/750, KPL. MIT M",
@@ -311,61 +311,6 @@
"SivasnrTEF": null,
"WeichenkörperLänge": 360
},
{
"Sivasnr": 834372100,
"ProfilTyp": "WEICHE S D 45-350/700, KPL. MIT M",
"WeichenTyp": "Doppelweiche",
"KurvenWinkel": 45,
"Schaltungstyp": "M",
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 3,
"SivasnrTEF": null
},
{
"Sivasnr": 834372101,
"ProfilTyp": "WEICHE S D 45-350/700, KPL. MIT P",
"WeichenTyp": "Doppelweiche",
"KurvenWinkel": 45,
"Schaltungstyp": "P",
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 3,
"SivasnrTEF": null
},
{
"Sivasnr": "0_BG090090+834372101",
"ProfilTyp": "WEICHE S D 45-350/700, KPL. MIT P mit TEF links",
"WeichenTyp": "Doppelweiche",
"KurvenWinkel": 45,
"Schaltungstyp": "P",
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 3,
"SivasnrTEF": "0_B10090+0_B10090"
},
{
"Sivasnr": "834372101+0_BG090090",
"ProfilTyp": "WEICHE S D 45-350/700, KPL. MIT P mit TEF rechts",
"WeichenTyp": "Doppelweiche",
"KurvenWinkel": 45,
"Schaltungstyp": "P",
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 3,
"SivasnrTEF": "0_B10090+0_B10090"
},
{
"Sivasnr": "0_BG090090+834372101+0_BG090090",
"ProfilTyp": "WEICHE S D 45-350/700, KPL. MIT P mit TEF beideseitig",
"WeichenTyp": "Doppelweiche",
"KurvenWinkel": 45,
"Schaltungstyp": "P",
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 3,
"SivasnrTEF": "0_B10090+0_B10090+0_B10090+0_B10090"
},
{
"Sivasnr": 834372103,
"ProfilTyp": "WEICHE S D 45-400/750, KPL. MIT M",
@@ -422,27 +367,60 @@
"SivasnrTEF": "0_B10090+0_B10090+0_B10090+0_B10090"
},
{
"Sivasnr": 834372106,
"ProfilTyp": "WEICHE S D 90-500/600, KPL. MIT M",
"Sivasnr": 834372100,
"ProfilTyp": "WEICHE S D 45-350/700, KPL. MIT M",
"WeichenTyp": "Doppelweiche",
"KurvenWinkel": 90,
"KurvenWinkel": 45,
"Schaltungstyp": "M",
"Breite": 500,
"Länge": 600,
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 3,
"SivasnrTEF": null
},
{
"Sivasnr": 834372107,
"ProfilTyp": "WEICHE S D 90-500/600, KPL. MIT P",
"Sivasnr": 834372101,
"ProfilTyp": "WEICHE S D 45-350/700, KPL. MIT P",
"WeichenTyp": "Doppelweiche",
"KurvenWinkel": 90,
"KurvenWinkel": 45,
"Schaltungstyp": "P",
"Breite": 500,
"Länge": 600,
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 3,
"SivasnrTEF": null
},
{
"Sivasnr": "0_BG090090+834372101",
"ProfilTyp": "WEICHE S D 45-350/700, KPL. MIT P mit TEF links",
"WeichenTyp": "Doppelweiche",
"KurvenWinkel": 45,
"Schaltungstyp": "P",
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 3,
"SivasnrTEF": "0_B10090+0_B10090"
},
{
"Sivasnr": "834372101+0_BG090090",
"ProfilTyp": "WEICHE S D 45-350/700, KPL. MIT P mit TEF rechts",
"WeichenTyp": "Doppelweiche",
"KurvenWinkel": 45,
"Schaltungstyp": "P",
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 3,
"SivasnrTEF": "0_B10090+0_B10090"
},
{
"Sivasnr": "0_BG090090+834372101+0_BG090090",
"ProfilTyp": "WEICHE S D 45-350/700, KPL. MIT P mit TEF beideseitig",
"WeichenTyp": "Doppelweiche",
"KurvenWinkel": 45,
"Schaltungstyp": "P",
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 3,
"SivasnrTEF": "0_B10090+0_B10090+0_B10090+0_B10090"
},
{
"Sivasnr": 834372109,
"ProfilTyp": "WEICHE S D 90-700/700, KPL. MIT M",
@@ -498,6 +476,28 @@
"KurvenRichtung": 3,
"SivasnrTEF": "0_B10080+0_B10090+0_B10080+0_B10090"
},
{
"Sivasnr": 834372106,
"ProfilTyp": "WEICHE S D 90-500/600, KPL. MIT M",
"WeichenTyp": "Doppelweiche",
"KurvenWinkel": 90,
"Schaltungstyp": "M",
"Breite": 500,
"Länge": 600,
"KurvenRichtung": 3,
"SivasnrTEF": null
},
{
"Sivasnr": 834372107,
"ProfilTyp": "WEICHE S D 90-500/600, KPL. MIT P",
"WeichenTyp": "Doppelweiche",
"KurvenWinkel": 90,
"Schaltungstyp": "P",
"Breite": 500,
"Länge": 600,
"KurvenRichtung": 3,
"SivasnrTEF": null
},
{
"Sivasnr": 834372115,
"ProfilTyp": "WEICHE S D PARALLEL-200/750, KPL. MIT M",
@@ -520,61 +520,6 @@
"KurvenRichtung": 3,
"SivasnrTEF": null
},
{
"Sivasnr": 834372200,
"ProfilTyp": "WEICHE S T 45-350/700, KPL. MIT M",
"WeichenTyp": "Dreiwegeweiche",
"KurvenWinkel": 45,
"Schaltungstyp": "M",
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 7,
"SivasnrTEF": null
},
{
"Sivasnr": 834372201,
"ProfilTyp": "WEICHE S T 45-350/700, KPL. MIT P",
"WeichenTyp": "Dreiwegeweiche",
"KurvenWinkel": 45,
"Schaltungstyp": "P",
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 7,
"SivasnrTEF": null
},
{
"Sivasnr": "0_BG090090+834372201",
"ProfilTyp": "WEICHE S T 45-350/700, KPL. MIT P mit TEF links",
"WeichenTyp": "Dreiwegeweiche",
"KurvenWinkel": 45,
"Schaltungstyp": "P",
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 7,
"SivasnrTEF": "0_B10090+0_B10090"
},
{
"Sivasnr": "834372201+0_BG090090",
"ProfilTyp": "WEICHE S T 45-350/700, KPL. MIT P mit TEF rechts",
"WeichenTyp": "Dreiwegeweiche",
"KurvenWinkel": 45,
"Schaltungstyp": "P",
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 7,
"SivasnrTEF": "0_B10090+0_B10090"
},
{
"Sivasnr": "0_BG090090+834372201+0_BG090090",
"ProfilTyp": "WEICHE S T 45-350/700, KPL. MIT P mit TEF beideseitig",
"WeichenTyp": "Dreiwegeweiche",
"KurvenWinkel": 45,
"Schaltungstyp": "P",
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 7,
"SivasnrTEF": "0_B10090+0_B10090+0_B10090+0_B10090"
},
{
"Sivasnr": 834372203,
"ProfilTyp": "WEICHE S T 45-400/750, KPL. MIT M",
@@ -631,27 +576,60 @@
"SivasnrTEF": "0_B10090+0_B10090+0_B10090+0_B10090"
},
{
"Sivasnr": 834372206,
"ProfilTyp": "WEICHE S T 90-500/600, KPL. MIT M",
"Sivasnr": 834372200,
"ProfilTyp": "WEICHE S T 45-350/700, KPL. MIT M",
"WeichenTyp": "Dreiwegeweiche",
"KurvenWinkel": 90,
"KurvenWinkel": 45,
"Schaltungstyp": "M",
"Breite": 500,
"Länge": 600,
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 7,
"SivasnrTEF": null
},
{
"Sivasnr": 834372207,
"ProfilTyp": "WEICHE S T 90-500/600, KPL. MIT P",
"Sivasnr": 834372201,
"ProfilTyp": "WEICHE S T 45-350/700, KPL. MIT P",
"WeichenTyp": "Dreiwegeweiche",
"KurvenWinkel": 90,
"KurvenWinkel": 45,
"Schaltungstyp": "P",
"Breite": 500,
"Länge": 600,
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 7,
"SivasnrTEF": null
},
{
"Sivasnr": "0_BG090090+834372201",
"ProfilTyp": "WEICHE S T 45-350/700, KPL. MIT P mit TEF links",
"WeichenTyp": "Dreiwegeweiche",
"KurvenWinkel": 45,
"Schaltungstyp": "P",
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 7,
"SivasnrTEF": "0_B10090+0_B10090"
},
{
"Sivasnr": "834372201+0_BG090090",
"ProfilTyp": "WEICHE S T 45-350/700, KPL. MIT P mit TEF rechts",
"WeichenTyp": "Dreiwegeweiche",
"KurvenWinkel": 45,
"Schaltungstyp": "P",
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 7,
"SivasnrTEF": "0_B10090+0_B10090"
},
{
"Sivasnr": "0_BG090090+834372201+0_BG090090",
"ProfilTyp": "WEICHE S T 45-350/700, KPL. MIT P mit TEF beideseitig",
"WeichenTyp": "Dreiwegeweiche",
"KurvenWinkel": 45,
"Schaltungstyp": "P",
"Breite": 350,
"Länge": 700,
"KurvenRichtung": 7,
"SivasnrTEF": "0_B10090+0_B10090+0_B10090+0_B10090"
},
{
"Sivasnr": 834372209,
"ProfilTyp": "WEICHE S T 90-700/700, KPL. MIT M",
@@ -707,6 +685,28 @@
"KurvenRichtung": 7,
"SivasnrTEF": "0_B10080+0_B10090+0_B10080+0_B10090"
},
{
"Sivasnr": 834372206,
"ProfilTyp": "WEICHE S T 90-500/600, KPL. MIT M",
"WeichenTyp": "Dreiwegeweiche",
"KurvenWinkel": 90,
"Schaltungstyp": "M",
"Breite": 500,
"Länge": 600,
"KurvenRichtung": 7,
"SivasnrTEF": null
},
{
"Sivasnr": 834372207,
"ProfilTyp": "WEICHE S T 90-500/600, KPL. MIT P",
"WeichenTyp": "Dreiwegeweiche",
"KurvenWinkel": 90,
"Schaltungstyp": "P",
"Breite": 500,
"Länge": 600,
"KurvenRichtung": 7,
"SivasnrTEF": null
},
{
"Sivasnr": 834372215,
"ProfilTyp": "WEICHE S T PARALLEL-200/750, KPL. MIT M",
@@ -729,30 +729,6 @@
"KurvenRichtung": 7,
"SivasnrTEF": null
},
{
"Sivasnr": 834372400,
"ProfilTyp": "WEICHE S C DELTA 1400/700, KPL. M",
"WeichenTyp": "Deltaweiche",
"KurvenWinkel": 90,
"Schaltungstyp": "M",
"Breite": 1400,
"Länge": 700,
"KurvenRichtung": 3,
"SivasnrTEF": null,
"WeichenkörperLänge": 1400.4619
},
{
"Sivasnr": 834372401,
"ProfilTyp": "WEICHE S C DELTA 1400/700, KPL. P",
"WeichenTyp": "Deltaweiche",
"KurvenWinkel": 90,
"Schaltungstyp": "P",
"Breite": 1400,
"Länge": 700,
"KurvenRichtung": 7,
"SivasnrTEF": null,
"WeichenkörperLänge": 1400.4619
},
{
"Sivasnr": 834372403,
"ProfilTyp": "WEICHE S C DELTA 1600/800, KPL. M",
@@ -812,6 +788,30 @@
"KurvenRichtung": 3,
"SivasnrTEF": "0_B10090+0_B10090+0_B10071",
"WeichenkörperLänge": 1600.3844
},
{
"Sivasnr": 834372400,
"ProfilTyp": "WEICHE S C DELTA 1400/700, KPL. M",
"WeichenTyp": "Deltaweiche",
"KurvenWinkel": 90,
"Schaltungstyp": "M",
"Breite": 1400,
"Länge": 700,
"KurvenRichtung": 3,
"SivasnrTEF": null,
"WeichenkörperLänge": 1400.4619
},
{
"Sivasnr": 834372401,
"ProfilTyp": "WEICHE S C DELTA 1400/700, KPL. P",
"WeichenTyp": "Deltaweiche",
"KurvenWinkel": 90,
"Schaltungstyp": "P",
"Breite": 1400,
"Länge": 700,
"KurvenRichtung": 7,
"SivasnrTEF": null,
"WeichenkörperLänge": 1400.4619
},
{
"Sivasnr": 834372420,
@@ -927,4 +927,4 @@
"KurvenRichtung": 7,
"SivasnrTEF": null
}
]
]
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+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; }
+17 -9
View File
@@ -973,6 +973,7 @@
"gr-fehler-json-lesbar": "\nGeruest: Datendatei nicht lesbar: %1",
"gr-fehler-baugruppe": "\nGeruest: Baugruppe '%1' steht nicht in der Datendatei.",
"gr-fehler-keine-varianten": "\nGeruest: Baugruppe '%1' hat keine Geometrie-Varianten.",
"gr-bereich-waehlen": "\nGeruest: bitte einen Bereich ueber das Menue waehlen (GERUEST_SAEULEN, GERUEST_ROHRABHAENGER, GERUEST_WANDBEFESTIGUNG).",
"gr-fehler-dummy": "\nGeruest: Dummy-Baugruppe nicht gefunden: %1",
"gr-fehler-dummy-variante": "\nGeruest: Dummy der Variante nicht gefunden: %1 - verwende Dummy der Baugruppe (%2)",
"gr-fehler-dcl": "Dialog geruest.dcl konnte nicht geladen werden.",
@@ -982,10 +983,15 @@
"gr-abgebrochen": "\nAbgebrochen.",
"gr-fertig": "\nGeruest-Baugruppe '%1' eingefuegt (Block %2).",
"gr-alert-menge": "Ungueltige Anzahl. Erlaubt ist eine ganze Zahl ab 1; ein leeres Feld uebernimmt den Vorgabewert.",
"gr-position-oben": "oben",
"gr-position-unten": "unten",
"gr-position-befestigung": "Befestigung",
"gr-position-sonstiges": "sonstiges",
"gr-konfig-keine": "<keine>",
"gr-konfig-name": "\nName der Konfiguration: ",
"gr-konfig-name-vorgabe": "\nName der Konfiguration <%1>: ",
"gr-konfig-geaendert": "%1 (geaendert)",
"gr-konfig-status-geaendert": "Geaendert gegenueber '%1' - Speichern (Enter beim Namen) ueberschreibt sie.",
"gr-konfig-status-bibliothek": "Geaendert gegenueber '%1' (Bibliothek, schreibgeschuetzt) - zum Speichern einen neuen Namen vergeben.",
"gr-winkel-grad": "%1%2",
"gr-konfig-gespeichert": "\nKonfiguration '%1' gespeichert.",
"gr-konfig-geloescht": "\nKonfiguration '%1' geloescht.",
"gr-konfig-loeschen-frage": "\nKonfiguration '%1' wirklich loeschen? [Ja/Nein] <Nein>: ",
@@ -993,25 +999,26 @@
"gr-konfig-bibliothek-fest": "\nKonfigurationen der Bibliothek koennen nicht geloescht werden - nur eigene (mit * markiert).",
"gr-konfig-teil-unbekannt": "\nGeruest: Anbauteil '%1' aus Konfiguration '%2' ist bei dieser Baugruppe unbekannt - uebersprungen.",
"gr-konfig-variante-unbekannt": "\nGeruest: Variante '%1' aus Konfiguration '%2' ist bei dieser Baugruppe unbekannt - Auswahl unveraendert.",
"gr-konfig-variante-gesperrt": "\nKonfiguration '%2': Variante '%1' ist gesperrt - Auswahl bleibt unveraendert.",
"gr-fehler-schreiben": "\nGeruest: Datei konnte nicht geschrieben werden: %1",
"gr-fehler-keine-baugruppen": "\nGeruest: Die Datendatei enthaelt keine Baugruppen.",
"gr-tr-fehler-dcl": "Dialog %1 konnte nicht geladen werden.",
"gr-tr-hinweis": "Die Laenge wird nach OK in der Zeichnung bestimmt.",
"gr-tr-alert-abzug": "Laengenabzug ungueltig. Erlaubt ist eine Zahl ab 0 (mm); ein leeres Feld gilt als 0.",
"gr-tr-prompt-start": "\nStartpunkt des Traegers waehlen <Ende>: ",
"gr-tr-prompt-start": "\nStartpunkt (%1) waehlen <Ende>: ",
"gr-tr-prompt-ende": "\nEndpunkt waehlen oder Laenge (mm) eingeben: ",
"gr-tr-prompt-richtung": "\nRichtung angeben <0>: ",
"gr-tr-eingabe-ungueltig": "\nEingabe '%1' ist weder Punkt noch Laenge.",
"gr-tr-laenge-null": "\nStrecke %1 mm ist nicht laenger als die Abzuege (%2 mm) - kein Traeger eingefuegt.",
"gr-tr-laenge-bereich": "\nTraegerlaenge %1 mm ausserhalb des erlaubten Bereichs %2 bis %3 mm - kein Traeger eingefuegt.",
"gr-tr-fertig": "\nTraeger %1 mm eingefuegt (Block %2).",
"gr-tr-ende": "\n%1 Traeger eingefuegt.",
"gr-tr-laenge-null": "\nStrecke %1 mm ist nicht laenger als die Abzuege (%2 mm) - nichts eingefuegt (%3).",
"gr-tr-laenge-bereich": "\n%4: Laenge %1 mm ausserhalb des erlaubten Bereichs %2 bis %3 mm - nichts eingefuegt.",
"gr-tr-fertig": "\n%3 %1 mm eingefuegt (Block %2).",
"gr-tr-ende": "\n%1x %2 eingefuegt.",
"gr-tr-bez-abzug-anfang": "Abzug Anfang %1 mm",
"gr-tr-bez-abzug-ende": "Abzug Ende %1 mm",
"gr-tr-beschr-stil-fehlt": "\nTextstil %1 fehlt in der Zeichnung - Beschriftung mit aktuellem Stil %2.",
"gr-tr-beschr-ausrichtung": "\nUnbekannte Ausrichtung %1 fuer die Traeger-Beschriftung - verwende BC.",
"gr-tr-beschr-ergebnis": "\n%1 Traeger beschriftet (davon %2 ohne bekannte Variante), %3 nicht beschriftbar, %4 verwaiste Beschriftungen entfernt.",
"gr-tr-beschr-keine": "\nKeine Rohr-Geruest-Traeger in der Zeichnung.",
"gr-tr-beschr-ergebnis": "\n%5: %1 beschriftet (davon %2 ohne bekannte Variante), %3 nicht beschriftbar, %4 verwaiste Beschriftungen entfernt.",
"gr-tr-beschr-keine": "\nKeine Bloecke vom Typ %1 in der Zeichnung.",
"gr-tr-strebe-rand": "Traeger %1 mm: Der Randabstand der Querstreben betraegt %2 mm und liegt ausserhalb des erlaubten Bereichs %3 bis %4 mm (Strebenabstand %5 mm, %6 Streben). Der Traeger wird trotzdem eingefuegt.",
"in-yesno-keys": "Ja Nein",
"in-keys-bereich": "Alle Auswahl",
@@ -1092,6 +1099,7 @@
"sl-erk-kreisel": "ILS Kreisel/Eckrad",
"sl-erk-strecke": "ILS Streckengruppe (VarioFoerderer/Gefaellestrecke)",
"sl-erk-geruest": "Rohrgeruest",
"sl-erk-fahrstrecke": "Omniflo Fahrstrecke",
"sl-erk-ap60": "Omniflo Gerade AP60",
"sl-erk-ap110": "Omniflo Gerade AP110",
"sl-erk-apg110": "Omniflo Gerade APG110"
+17 -9
View File
@@ -973,6 +973,7 @@
"gr-fehler-json-lesbar": "\nScaffold: data file not readable: %1",
"gr-fehler-baugruppe": "\nScaffold: assembly '%1' is not in the data file.",
"gr-fehler-keine-varianten": "\nScaffold: assembly '%1' has no geometry variants.",
"gr-bereich-waehlen": "\nScaffold: please choose an area from the menu (GERUEST_SAEULEN, GERUEST_ROHRABHAENGER, GERUEST_WANDBEFESTIGUNG).",
"gr-fehler-dummy": "\nScaffold: dummy assembly not found: %1",
"gr-fehler-dummy-variante": "\nScaffold: dummy of the variant not found: %1 - using dummy of the assembly (%2)",
"gr-fehler-dcl": "Dialog geruest.dcl could not be loaded.",
@@ -982,10 +983,15 @@
"gr-abgebrochen": "\nCancelled.",
"gr-fertig": "\nScaffold assembly '%1' inserted (block %2).",
"gr-alert-menge": "Invalid quantity. Enter a whole number of 1 or more; an empty field uses the default.",
"gr-position-oben": "top",
"gr-position-unten": "bottom",
"gr-position-befestigung": "mounting",
"gr-position-sonstiges": "other",
"gr-konfig-keine": "<none>",
"gr-konfig-name": "\nConfiguration name: ",
"gr-konfig-name-vorgabe": "\nConfiguration name <%1>: ",
"gr-konfig-geaendert": "%1 (modified)",
"gr-konfig-status-geaendert": "Modified compared to '%1' - Save (Enter at the name prompt) overwrites it.",
"gr-konfig-status-bibliothek": "Modified compared to '%1' (library, read-only) - enter a new name to save.",
"gr-winkel-grad": "%1%2",
"gr-konfig-gespeichert": "\nConfiguration '%1' saved.",
"gr-konfig-geloescht": "\nConfiguration '%1' deleted.",
"gr-konfig-loeschen-frage": "\nReally delete configuration '%1'? [Ja/Nein] <Nein>: ",
@@ -993,25 +999,26 @@
"gr-konfig-bibliothek-fest": "\nLibrary configurations cannot be deleted - only your own (marked with *).",
"gr-konfig-teil-unbekannt": "\nScaffold: add-on part '%1' from configuration '%2' is unknown for this assembly - skipped.",
"gr-konfig-variante-unbekannt": "\nScaffold: variant '%1' from configuration '%2' is unknown for this assembly - selection unchanged.",
"gr-konfig-variante-gesperrt": "\nConfiguration '%2': variant '%1' is disabled - selection left unchanged.",
"gr-fehler-schreiben": "\nScaffold: could not write file: %1",
"gr-fehler-keine-baugruppen": "\nScaffold: the data file contains no assemblies.",
"gr-tr-fehler-dcl": "Dialog %1 could not be loaded.",
"gr-tr-hinweis": "The length is defined in the drawing after OK.",
"gr-tr-alert-abzug": "Invalid length deduction. Allowed is a number from 0 (mm); an empty field counts as 0.",
"gr-tr-prompt-start": "\nSelect start point of the beam <exit>: ",
"gr-tr-prompt-start": "\nSelect start point (%1) <exit>: ",
"gr-tr-prompt-ende": "\nSelect end point or enter length (mm): ",
"gr-tr-prompt-richtung": "\nSpecify direction <0>: ",
"gr-tr-eingabe-ungueltig": "\nInput '%1' is neither a point nor a length.",
"gr-tr-laenge-null": "\nDistance %1 mm is not longer than the deductions (%2 mm) - no beam inserted.",
"gr-tr-laenge-bereich": "\nBeam length %1 mm outside the allowed range %2 to %3 mm - no beam inserted.",
"gr-tr-fertig": "\nBeam %1 mm inserted (block %2).",
"gr-tr-ende": "\n%1 beam(s) inserted.",
"gr-tr-laenge-null": "\nDistance %1 mm is not longer than the deductions (%2 mm) - nothing inserted (%3).",
"gr-tr-laenge-bereich": "\n%4: length %1 mm outside the allowed range %2 to %3 mm - nothing inserted.",
"gr-tr-fertig": "\n%3 %1 mm inserted (block %2).",
"gr-tr-ende": "\n%1x %2 inserted.",
"gr-tr-bez-abzug-anfang": "Deduction start %1 mm",
"gr-tr-bez-abzug-ende": "Deduction end %1 mm",
"gr-tr-beschr-stil-fehlt": "\nText style %1 missing in drawing - labelling with current style %2.",
"gr-tr-beschr-ausrichtung": "\nUnknown justification %1 for beam label - using BC.",
"gr-tr-beschr-ergebnis": "\n%1 beam(s) labelled (%2 without known variant), %3 not labellable, %4 orphaned label(s) removed.",
"gr-tr-beschr-keine": "\nNo pipe scaffold beams in the drawing.",
"gr-tr-beschr-ergebnis": "\n%5: %1 labelled (%2 without known variant), %3 not labellable, %4 orphaned label(s) removed.",
"gr-tr-beschr-keine": "\nNo blocks of type %1 in the drawing.",
"gr-tr-strebe-rand": "Beam %1 mm: the edge distance of the cross braces is %2 mm, outside the allowed range %3 to %4 mm (brace spacing %5 mm, %6 braces). The beam is inserted anyway.",
"in-yesno-keys": "Yes No",
"in-keys-bereich": "All Selection",
@@ -1092,6 +1099,7 @@
"sl-erk-kreisel": "ILS roundabout/corner wheel",
"sl-erk-strecke": "ILS conveyor section (VarioFoerderer/gravity conveyor)",
"sl-erk-geruest": "Pipe scaffold",
"sl-erk-fahrstrecke": "Omniflo track",
"sl-erk-ap60": "Omniflo straight AP60",
"sl-erk-ap110": "Omniflo straight AP110",
"sl-erk-apg110": "Omniflo straight APG110"
+510 -437
View File
File diff suppressed because it is too large. Load diff
+35 -25
View File
@@ -34,6 +34,9 @@
[QC Linie mit GF (automatische Auf-Ab-Berechnung)]^C^C(ssg-ensure "VarioFoerderer") QcLinieMitGf
[<-<-QC Linie mit GF und U-Form]^C^C(ssg-ensure "VarioFoerderer") QcLinieMitGfUForm
[->Omniflo]
[Fahrstrecke]^C^C(ssg-ensure "GeruestInsert") OMNI_FAHRSTRECKE
[Fahrstrecken beschriften]^C^C(ssg-ensure "GeruestInsert") OMNI_FAHRSTRECKE_BESCHRIFTEN
[--]
[->Boegen APB110]
[90]^C^C(ssg-ensure "OmniModulInsert") OMNI_APB_630_90
[67.5]^C^C(ssg-ensure "OmniModulInsert") OMNI_APB_550_675
@@ -46,26 +49,26 @@
[AP 60]^C^C(ssg-ensure "OmniModulInsert") OMNI_AP60
[AP 110]^C^C(ssg-ensure "OmniModulInsert") OMNI_AP110
[<-APG 110]^C^C(ssg-ensure "OmniModulInsert") OMNI_APG110
[->Weiche 90 Grad]
[Einfach 90 700/700 links M]^C^C(ssg-ensure "OmniModulInsert") OMNI_W90_Einfach
[Doppel 90 700/700 M]^C^C(ssg-ensure "OmniModulInsert") OMNI_W90_Doppel
[<-Dreiwege 90 700/700 M]^C^C(ssg-ensure "OmniModulInsert") OMNI_W90_Dreiwege
[->Weiche 45 Grad]
[Einfach 45 350/700 links M]^C^C(ssg-ensure "OmniModulInsert") OMNI_W45_Einfach
[Doppel 45 350/700 M]^C^C(ssg-ensure "OmniModulInsert") OMNI_W45_Doppel
[<-Dreiwege 45 350/700 M]^C^C(ssg-ensure "OmniModulInsert") OMNI_W45_Dreiwege
[->Weichen Parallel]
[Einfach Parallel 200/750 links M]^C^C(ssg-ensure "OmniModulInsert") OMNI_WP_Einfach
[Doppel Parallel 200/750 M]^C^C(ssg-ensure "OmniModulInsert") OMNI_WP_Doppel
[<-Dreiwege Parallel 200/750 M]^C^C(ssg-ensure "OmniModulInsert") OMNI_WP_Dreiwege
[->Weichenkoerper]
[Einfach 22.5 links M]^C^C(ssg-ensure "OmniModulInsert") OMNI_WK_Einfach
[Doppel 22.5 M]^C^C(ssg-ensure "OmniModulInsert") OMNI_WK_Doppel
[<-Dreiwege 22.5 M]^C^C(ssg-ensure "OmniModulInsert") OMNI_WK_Dreiwege
[->Weichenkombinationen]
[Delta 1400/700 M]^C^C(ssg-ensure "OmniModulInsert") OMNI_WKomb_Delta_1400
[Delta 1600/800 M]^C^C(ssg-ensure "OmniModulInsert") OMNI_WKomb_Delta_1600
[<-Star 1400/1400 M]^C^C(ssg-ensure "OmniModulInsert") OMNI_WKomb_Star
[->Weichen]
[Einfach 90]^C^C(ssg-ensure "OmniModulInsert") OMNI_W90_Einfach
[Doppel 90]^C^C(ssg-ensure "OmniModulInsert") OMNI_W90_Doppel
[Dreiwege 90]^C^C(ssg-ensure "OmniModulInsert") OMNI_W90_Dreiwege
[--]
[Einfach 45]^C^C(ssg-ensure "OmniModulInsert") OMNI_W45_Einfach
[Doppel 45]^C^C(ssg-ensure "OmniModulInsert") OMNI_W45_Doppel
[Dreiwege 45]^C^C(ssg-ensure "OmniModulInsert") OMNI_W45_Dreiwege
[--]
[Einfach Parallel]^C^C(ssg-ensure "OmniModulInsert") OMNI_WP_Einfach
[Doppel Parallel]^C^C(ssg-ensure "OmniModulInsert") OMNI_WP_Doppel
[Dreiwege Parallel]^C^C(ssg-ensure "OmniModulInsert") OMNI_WP_Dreiwege
[--]
[Einfach 22.5]^C^C(ssg-ensure "OmniModulInsert") OMNI_WK_Einfach
[Doppel 22.5]^C^C(ssg-ensure "OmniModulInsert") OMNI_WK_Doppel
[Dreiwege 22.5]^C^C(ssg-ensure "OmniModulInsert") OMNI_WK_Dreiwege
[--]
[Delta 1600/800]^C^C(ssg-ensure "OmniModulInsert") OMNI_WKomb_Delta_1600
[Delta 1400/700]^C^C(ssg-ensure "OmniModulInsert") OMNI_WKomb_Delta_1400
[<-Star 1400/1400]^C^C(ssg-ensure "OmniModulInsert") OMNI_WKomb_Star
[->TEF Elemente]
[TEF Antriebst. rechts]^C^C(ssg-ensure "OmniModulInsert") OMNI_TEF_AntriebR
[TEF Umlenkspannst. rechts]^C^C(ssg-ensure "OmniModulInsert") OMNI_TEF_UmlenkR
@@ -79,6 +82,13 @@
[Stopper AP]^C^C(ssg-ensure "OmniModulInsert") OMNI_STOPPER
[Scanner]^C^C(ssg-ensure "OmniModulInsert") OMNI_SCANNER
[<-Bürstenbremse]^C^C(ssg-ensure "OmniModulInsert") OMNI_BUERSTENBREMSE
[->Spez. Streckenelemente]
[->Türlösungen]
[->Schwenkschienen]
[Schwenkschiene Schiebetür L]^C^C(ssg-ensure "OmniModulInsert") OMNI_SCHW_400_L
[Schwenkschiene Schiebetür R]^C^C(ssg-ensure "OmniModulInsert") OMNI_SCHW_400_R
[Schwenkschiene Schiebetür L mit Sensorik]^C^C(ssg-ensure "OmniModulInsert") OMNI_SCHW_400_L_SENSORIK
[<-<-<-Schwenkschiene Schiebetür R mit Sensorik]^C^C(ssg-ensure "OmniModulInsert") OMNI_SCHW_400_R_SENSORIK
[~KettenFoerderer]^C^C(ssg-ensure "OmniModulInsert") OMNI_KettenFoerderer
[Ladeschleifen]^C^C(ssg-ensure "OmniModulInsert") OMNI_LADESCHLEIFE_AP110
[->Verbinder]
@@ -116,12 +126,12 @@
[~APBW 110 R550/67,5 208x347]^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R550_675_208
[<-~APBW 110 R550/67,5 58x497]^C^C(ssg-ensure "OmniModulInsert") OMNI_APBW_R550_675_58
[<-Element bearbeiten]^C^C(ssg-ensure "OmniModulInsert") OMNI_EDIT
[->Geruest]^C^C(ssg-ensure "GeruestInsert") GERUEST
[Rohr-Geruest-Traeger]^C^C(ssg-ensure "GeruestInsert") GERUEST_TRAEGER
[Saeulen]^C^C(ssg-ensure "GeruestInsert") GERUEST_SAEULEN
[Rohrabhaenger]^C^C(ssg-ensure "GeruestInsert") GERUEST_ROHRABHAENGER
[->Gerüst]^C^C(ssg-ensure "GeruestInsert") GERUEST
[Rohr-Gerüst-Traeger]^C^C(ssg-ensure "GeruestInsert") GERUEST_TRAEGER
[Säulen]^C^C(ssg-ensure "GeruestInsert") GERUEST_SAEULEN
[Rohrabhänger]^C^C(ssg-ensure "GeruestInsert") GERUEST_ROHRABHAENGER
[Wandbefestigung]^C^C(ssg-ensure "GeruestInsert") GERUEST_WANDBEFESTIGUNG
[Gattertraeger]^C^C(ssg-ensure "GeruestInsert") GERUEST
[Gatterträger]^C^C(ssg-ensure "GeruestInsert") GERUEST
[->Funktionen]
[<-<-Traeger beschriften]^C^C(ssg-ensure "GeruestInsert") GERUEST_TRAEGER_BESCHRIFTEN
[->SPS]
+39
View File
@@ -0,0 +1,39 @@
"""Merkmale der GR_-Geruest-Bloecke im CSV-Export (build_geruest_merkmale).
Prueft die Teilefarbe (Attribut TEILEFARBE - das frueher gelesene FARBE gibt
es im Schema nicht) und die Laengenabzuege, die nur der Rohr-Geruest-Traeger
traegt und die bei den anderen GR_-Bloecken nicht auftauchen duerfen.
"""
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "lib"))
from export_csv import build_geruest_merkmale # noqa: E402
def test_teilefarbe_aus_teilefarbe_attribut():
block = {"attribs": {"TEILEART": "Geruest Saeule 1 Zoll",
"TEILEFARBE": ",RAL7030", "LAENGE": "2000",
"LAYER": "D-6"}}
m = build_geruest_merkmale(block)
assert m["Farbe"] == ",RAL7030"
assert m["Laenge"] == "2000"
assert m["Layer"] == "D-6"
def test_ohne_abzug_keine_abzugsmerkmale():
m = build_geruest_merkmale({"attribs": {"TEILEART": "Geruest Rohrabhaenger"}})
assert "LaengenabzugAnfang" not in m
assert "LaengenabzugEnde" not in m
def test_traeger_abzuege():
block = {"attribs": {"TEILEART": "Geruest Traeger 1 Zoll", "LAENGE": "965",
"LAENGENABZUGANFANG": "0",
"LAENGENABZUGENDE": "35"}}
m = build_geruest_merkmale(block)
assert m["Laenge"] == "965"
assert m["LaengenabzugAnfang"] == "0"
assert m["LaengenabzugEnde"] == "35"
+52
View File
@@ -0,0 +1,52 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
test_export_sivas_zusammenfassen.py - zusammengefasste Sivas-Kopie
(<output>_zusammengefasst.csv, export_sivas.items_zusammenfassen).
Laeuft komplett ohne BricsCAD (reine Python-Logik).
"""
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "lib"))
import export_sivas # noqa: E402
def _geruest(teileid, laenge="2500"):
return {"block_name": f"GR_{teileid}", "x": 0.0, "y": 0.0, "z": 0.0,
"rotation": 0.0,
"attribs": {"ID": teileid, "TEILEART": "Geruest Saeule 2 Zoll",
"ARTINR": "821006051,825002022,825002022",
"TEILEFARBE": "RAL7035,,",
"BEZEICHNUNG": "Saeule", "LAENGE": laenge}}
def test_gleiche_zeilen_werden_summiert():
items, _ = export_sivas.process_blocks(
[_geruest("0001"), _geruest("0002"), _geruest("0003", laenge="2800")])
assert len(items) == 6
zus = export_sivas.items_zusammenfassen(items)
# Laenge gehoert zum Schluessel: 2500er und 2800er bleiben getrennt
assert len(zus) == 4
assert [z["nr"] for z in zus] == [1, 2, 3, 4]
z = {(z["sivasnr"], z["laenge_mm"]): z for z in zus}
assert z[("825002022", "2500")]["anzahl"] == 4
assert z[("825002022", "2500")]["ids"] == ["0001", "0002"]
assert z[("821006051", "2500")]["anzahl"] == 2
assert z[("821006051", "2500")]["details"] == {export_sivas.MERKMAL_TEILEFARBE: "RAL7035"}
assert z[("825002022", "2800")]["anzahl"] == 2
assert z[("825002022", "2800")]["ids"] == ["0003"]
def test_eingabe_bleibt_unveraendert():
items, _ = export_sivas.process_blocks([_geruest("0001"), _geruest("0002")])
vorher = [export_sivas.format_csv_line(it) for it in items]
export_sivas.items_zusammenfassen(items)
assert [export_sivas.format_csv_line(it) for it in items] == vorher
def test_dateiname():
assert export_sivas.zusammengefasster_dateiname("x/500651_sivas.csv") == \
"x/500651_sivas_zusammengefasst.csv"
+129
View File
@@ -0,0 +1,129 @@
;; ============================================================
;; test_lastent.lsp - Szenario-Test fuer ssg-lastent-ohne-attribute (ssg_core)
;;
;; Stellt den realen Bug nach: ein Block MIT Attributen (z.B. eine per
;; Strg+C/V eingefuegte GR_-Kopie) ist das letzte Objekt der Zeichnung.
;; Ein Makro merkt sich die Startmarke, zeichnet neue Objekte, sammelt
;; "alles ab (entnext marke)" ein und wickelt es per _.-BLOCK zu einem Block.
;; Mit nacktem (entlast) als Marke landeten dabei die ATTRIBs des alten
;; Blocks im Auswahlsatz und wurden entfernt.
;;
;; Aufruf in BricsCAD:
;; (load (strcat (getenv "DXFMAKRO") "/tests/test_lastent.lsp"))
;; TEST_LASTENT
;;
;; Speichert tests/output/lastent_results.json (Konvention test_run_all).
;; ============================================================
(setq *tle-pass* 0 *tle-fail* 0 *tle-fails* '())
;; Ein Assert: erwartet-Wert gleich ist-Wert (equal). Loggt Pass/Fail.
(defun tle-eq (name erwartet ist)
(if (equal erwartet ist)
(progn (setq *tle-pass* (1+ *tle-pass*))
(princ (strcat "\n [PASS] " name)))
(progn (setq *tle-fail* (1+ *tle-fail*))
(setq *tle-fails* (cons name *tle-fails*))
(princ (strcat "\n [FAIL] " name
"\n erwartet: " (vl-princ-to-string erwartet)
"\n ist: " (vl-princ-to-string ist))))))
;; Blockdefinition mit zwei ATTDEFs anlegen (falls noch nicht vorhanden).
(defun tle-blockdef (name)
(if (not (tblsearch "BLOCK" name))
(progn
(entmake (list '(0 . "BLOCK") (cons 2 name) '(70 . 2) '(10 0.0 0.0 0.0)))
(entmake '((0 . "LINE") (8 . "0") (10 0.0 0.0 0.0) (11 100.0 0.0 0.0)))
(foreach tag '("ID" "ARTINR")
(entmake (list '(0 . "ATTDEF") '(8 . "0") '(10 0.0 0.0 0.0)
'(40 . 10.0) '(1 . "") (cons 2 tag) (cons 3 tag)
'(70 . 0))))
(entmake '((0 . "ENDBLK")))))
name)
;; INSERT mit Attributen per entmake (INSERT 66=1, ATTRIBs, SEQEND).
;; Rueckgabe: ename des INSERT.
(defun tle-insert-mit-attributen (name pt werte / ins)
(entmake (list '(0 . "INSERT") (cons 2 name) (cons 10 pt) '(66 . 1)))
(setq ins (entlast))
(foreach paar werte
(entmake (list '(0 . "ATTRIB") '(8 . "0") (cons 10 pt) '(40 . 10.0)
(cons 1 (cdr paar)) (cons 2 (car paar)) '(70 . 0))))
(entmake '((0 . "SEQEND")))
ins)
(defun lastent:tests ( / bname werte ins marke line ss e neu anz)
(setvar "CMDECHO" 0)
(setq bname (tle-blockdef "TLE_ATT_BLOCK"))
(setq werte (list (cons "ID" "4711") (cons "ARTINR" "A1,A2")))
(setq ins (tle-insert-mit-attributen bname '(0.0 0.0 0.0) werte))
;; --- Vorbedingung: Attribute lesbar, INSERT ist (entlast) ---
(tle-eq "vorher: attribute lesbar" werte (ssg-attrib-read ins))
(tle-eq "vorher: entlast = insert" ins (entlast))
;; --- Marke steht auf dem SEQEND des Attribut-Blocks ---
(setq marke (ssg-lastent-ohne-attribute))
(tle-eq "marke ist SEQEND" "SEQEND" (cdr (assoc 0 (entget marke))))
;; --- Neues Objekt zeichnen: entnext der Marke ist genau dieses Objekt ---
(entmake '((0 . "LINE") (8 . "0") (10 0.0 50.0 0.0) (11 100.0 50.0 0.0)))
(setq line (entlast))
(tle-eq "entnext marke = neues objekt" line (entnext marke))
;; --- Einsammeln + _.-BLOCK wie geruest-block-bauen ---
(setq ss (ssadd) anz 0 e (entnext marke))
(while e (ssadd e ss) (setq anz (1+ anz)) (setq e (entnext e)))
(tle-eq "genau 1 objekt eingesammelt" 1 anz)
(setq neu (strcat "TLE_NEU_" (ssg-timestamp)))
(command "_.-BLOCK" neu '(0.0 0.0 0.0) ss "")
;; --- Kern des Bugs: der alte Block behaelt seine Attribute ---
(tle-eq "nachher: attribute erhalten" werte (ssg-attrib-read ins))
(tle-eq "nachher: neuer block existiert" T (if (tblsearch "BLOCK" neu) T nil))
;; --- Leere Zeichnung wird hier nicht getestet (Testzeichnung ist nie leer);
;; ohne Attribute liefert der Helfer (entlast) unveraendert ---
(entmake '((0 . "LINE") (8 . "0") (10 0.0 90.0 0.0) (11 10.0 90.0 0.0)))
(tle-eq "ohne attribute: marke = entlast" (entlast) (ssg-lastent-ohne-attribute))
;; Aufraeumen
(entdel ins)
(entdel (entlast))
(princ))
(defun lastent:export-results (out-dir / f pfad)
(setq pfad (strcat out-dir "/lastent_results.json"))
(setq f (open pfad "w"))
(if f
(progn
(write-line "{" f)
(write-line (strcat " \"pass\": " (itoa *tle-pass*) ",") f)
(write-line (strcat " \"fail\": " (itoa *tle-fail*) ",") f)
(write-line (strcat " \"status\": \""
(if (= *tle-fail* 0) "OK" "FEHLER") "\"") f)
(write-line "}" f)
(close f)
(princ (strcat "\n Ergebnis: " pfad))))
(princ))
(defun c:TEST_LASTENT ( / )
(setq *tle-pass* 0 *tle-fail* 0 *tle-fails* '())
(princ "\n================================================================")
(princ "\n TEST_LASTENT - ssg-lastent-ohne-attribute (ssg_core.lsp)")
(princ "\n================================================================")
(lastent:tests)
(princ "\n\n----------------------------------------------------------------")
(princ (strcat "\n Ergebnis: " (itoa *tle-pass*) " PASS, "
(itoa *tle-fail*) " FAIL"))
(if (> *tle-fail* 0)
(progn
(princ "\n Fehlgeschlagen:")
(foreach n (reverse *tle-fails*) (princ (strcat "\n - " n)))))
(princ "\n================================================================")
(princ))
(princ "\nTEST_LASTENT geladen. Aufruf: TEST_LASTENT")
(princ)
+268 -31
View File
@@ -217,6 +217,21 @@
(setq *ssg-ils-dim* _lay-dim-alt
*ssg-layer-cfg* _lay-cfg-alt
*ssg-layer-cfg-versucht* _lay-vers-alt)
;; --- DCL-Vorlagen: Platzhalterzeilen //@NAME@ ersetzen ---
(tu-eq "ssg-dcl-zeilen-ersetzen/ersetzt"
'("a {" " x;" " y;" "}")
(ssg-dcl-zeilen-ersetzen '("a {" " //@L@" "}") '(("L" " x;" " y;"))))
(tu-eq "ssg-dcl-zeilen-ersetzen/leer-entfernt"
'("a {" "}")
(ssg-dcl-zeilen-ersetzen '("a {" "\t//@L@ " "}") '(("L"))))
(tu-eq "ssg-dcl-zeilen-ersetzen/mehrere"
'("1" "2")
(ssg-dcl-zeilen-ersetzen '("//@A@" "//@B@") '(("A" "1") ("B" "2"))))
;; unbekannter Marker und normaler Kommentar bleiben stehen
(tu-eq "ssg-dcl-zeilen-ersetzen/unbekannt"
'("//@X@" "// Kommentar")
(ssg-dcl-zeilen-ersetzen '("//@X@" "// Kommentar") '(("A" "1"))))
)
@@ -849,7 +864,7 @@
)
(defun tu-tests-geruest ( / _eintrag _gruppe _teile _konfig _rec _pfad _f
_zurueck _bgtest _saeulen)
_zurueck _bgtest _saeulen _vmq _alt _fs)
(princ "\n[GeruestInsert]")
;; GeruestInsert ist ein lazy Feature-Modul (nicht in der Core-Ladeliste).
;; Geladen wird es zentral in test_unit.scr auf .scr-Top-Level; hier nur
@@ -917,10 +932,10 @@
"{\"artikel\": \"X\", \"sivas_id\": 7, \"stueckzahl\": 2, \"anzahl_vorgabe\": 5}")
2))
;; Dummy, der zugleich Teile-DWG ist, faellt aus der Teileliste
(tu-eq "geruest-ohne-pfad/entfernt" '("b/2.dwg")
(geruest-ohne-pfad "A/1.DWG" '("a/1.dwg" "b/2.dwg")))
(tu-eq "geruest-ohne-pfad/nil" '("a/1.dwg")
(geruest-ohne-pfad nil '("a/1.dwg")))
(tu-eq "geruest-ohne-pfad/entfernt" '(("b/2.dwg" . 90.0))
(geruest-ohne-pfad "A/1.DWG" '(("a/1.dwg" . 0.0) ("b/2.dwg" . 90.0))))
(tu-eq "geruest-ohne-pfad/nil" '(("a/1.dwg" . 0.0))
(geruest-ohne-pfad nil '(("a/1.dwg" . 0.0))))
;; Dummy-Wahl: Variante gewinnt, fehlende Varianten-DWG -> Baugruppe
(setq _pfad (geruest-dummy-pfad "821006036.dwg"))
(if (and _pfad (findfile _pfad))
@@ -1015,7 +1030,148 @@
"{\"artikel\": \"Schraubenset\", \"anzahl\": 3},"
"{\"artikel\": \"unbekannt\", \"anzahl\": 1}]}")))
(tu-eq "geruest-konfig-position" '(nil 3)
(geruest-konfig-position _konfig "oben" _teile))
(geruest-konfig-position _konfig "oben" _teile nil))
;; --- anbaugruppen: befestigung / sonstiges ---
(setq _bgtest (ssg-json-parse
(strcat "{\"anbaugruppen\": {\"befestigung\": [{\"artikel\": \"K\"}],"
" \"sonstiges\": [{\"artikel\": \"H1\"}, {\"artikel\": \"H2\"}]}}")))
(tu-eq "geruest-anbau-liste/befestigung" 1
(length (geruest-anbau-liste _bgtest "befestigung")))
(tu-eq "geruest-anbau-liste/sonstiges" '("H1" "H2")
(mapcar 'geruest-eintrag-name (geruest-anbau-liste _bgtest "sonstiges")))
;; altes flaches Array gilt als befestigung
(setq _rec (ssg-json-parse "{\"anbaugruppen\": [{\"artikel\": \"A\"}, {\"artikel\": \"B\"}]}"))
(tu-eq "geruest-anbau-liste/flach" 2 (length (geruest-anbau-liste _rec "befestigung")))
(tu-nil "geruest-anbau-liste/flach-sonstiges" (geruest-anbau-liste _rec "sonstiges"))
(tu-nil "geruest-anbau-liste/leer"
(geruest-anbau-liste
(ssg-json-parse "{\"anbaugruppen\": {\"befestigung\": [], \"sonstiges\": []}}")
"sonstiges"))
(tu-nil "geruest-anbau-liste/fehlt"
(geruest-anbau-liste (ssg-json-parse "{\"id\": \"X\"}") "befestigung"))
(tu-eq "geruest-dlg-standard/teile" '(("0" . "1") ("0" . "1"))
(geruest-dlg-standard (geruest-anbau-liste _bgtest "sonstiges")))
(tu-eq "geruest-mengen-addieren" '(nil 3 2 5)
(geruest-mengen-addieren '(nil 1 nil 2) '(nil 2 2 3)))
;; Alte Konfiguration mit Haltearm unter "oben": landet in sonstiges
;; (Mengen addiert), oben meldet ihn nicht als unbekannt
(setq _konfig (ssg-json-parse
(strcat "{\"name\": \"Alt\","
" \"oben\": [{\"artikel\": \"K\", \"anzahl\": 2}, {\"artikel\": \"H2\", \"anzahl\": 1}],"
" \"unten\": [{\"artikel\": \"H2\", \"anzahl\": 2}],"
" \"sonstiges\": [{\"artikel\": \"H1\", \"anzahl\": 4}]}")))
(tu-eq "geruest-konfig-position/ausweich" '(2)
(geruest-konfig-position _konfig "oben"
(geruest-anbau-liste _bgtest "befestigung")
(geruest-anbau-liste _bgtest "sonstiges")))
;; --- Winkel Platte: Basis ungedreht, Anbauteile gedreht, kein Doppel ---
(tu-eq "geruest-teile-dwgs-rot/90" '(("b.dwg" . 0.0) ("a.dwg" . 90.0))
(geruest-teile-dwgs-rot '("b.dwg") '("b.dwg" "a.dwg") 90))
(tu-eq "geruest-teile-dwgs-rot/0" '(("a.dwg" . 0.0))
(geruest-teile-dwgs-rot nil '("a.dwg") 0))
(tu-eq "geruest-rest-liste" '(3 4) (geruest-rest-liste '(1 2 3 4) 2))
(tu-eq "geruest-winkel-aus-index/90" 90 (geruest-winkel-aus-index "1"))
(tu-eq "geruest-winkel-aus-index/leer" 0 (geruest-winkel-aus-index ""))
(tu-eq "geruest-winkel-index/90" "1" (geruest-winkel-index 90))
(tu-eq "geruest-winkel-index/fehlt" "0" (geruest-winkel-index nil))
;; --- Radiobuttons der Varianten: Key "v<i>" <-> Index ---
(tu-eq "geruest-radio-key" "v3" (geruest-radio-key 3))
(tu-eq "geruest-radio-index" 3 (geruest-radio-index "v3"))
(tu-eq "geruest-radio-index/leer" 0 (geruest-radio-index ""))
(tu-eq "geruest-radio-index/nil" 0 (geruest-radio-index nil))
(tu-eq "geruest-indizes" '(0 1 2) (geruest-indizes 3))
(tu-nil "geruest-indizes/0" (geruest-indizes 0))
(tu-eq "geruest-dcl-varianten-zeilen"
'(" : radio_button { key = \"v1\"; label = \"B 1''\"; }")
(geruest-dcl-varianten-zeilen
(list '(("name" . "A")) '(("name" . "B 1\""))) '(1)))
;; Variante mit Teilen: Artikelnummern in Klammern, jede nur einmal
(tu-eq "geruest-varianten-label/nummern" "R 2\" (111, 222)"
(geruest-varianten-label
(ssg-json-parse
(strcat "{\"name\": \"R 2\\\"\", \"teile\": ["
"{\"artikel\": \"A\", \"sivas_id\": 111},"
"{\"artikel\": \"B\", \"sivas_id\": 222, \"stueckzahl\": 2}]}"))))
(tu-eq "geruest-varianten-label/ohne" "A"
(geruest-varianten-label '(("name" . "A"))))
;; --- Gesperrte Varianten ("disabled": true) ---
(setq _rec (list '(("name" . "A") ("disabled" . T))
'(("name" . "B"))
'(("name" . "C") ("disabled" . T))))
(tu-true "geruest-variante-gesperrt-p/ja" (geruest-variante-gesperrt-p (nth 0 _rec)))
(tu-nil "geruest-variante-gesperrt-p/nein" (geruest-variante-gesperrt-p (nth 1 _rec)))
(tu-eq "geruest-erste-freie-variante" 1 (geruest-erste-freie-variante _rec))
(tu-eq "geruest-erste-freie-variante/alle-gesperrt" 0
(geruest-erste-freie-variante (list '(("disabled" . T)))))
(tu-eq "geruest-variante-waehlbar/frei" 1 (geruest-variante-waehlbar _rec 1))
(tu-eq "geruest-variante-waehlbar/gesperrt" 1 (geruest-variante-waehlbar _rec 2))
(tu-eq "geruest-variante-waehlbar/zu-gross" 1 (geruest-variante-waehlbar _rec 7))
;; Ersetzungen: ohne Teile entfallen die Bloecke (leerer Cluster)
(setq _rec (geruest-dcl-ersetzungen "Saeulen" nil nil
(list '(("name" . "A")))))
(tu-nil "geruest-dcl-ersetzungen/ohne-befestigung"
(cdr (assoc "BEFESTIGUNG" _rec)))
(tu-nil "geruest-dcl-ersetzungen/ohne-sonstiges"
(cdr (assoc "SONSTIGES" _rec)))
(tu-eq "geruest-dcl-ersetzungen/varianten" 1
(length (cdr (assoc "VARIANTEN" _rec))))
;; --- Geaenderte Konfiguration: Vergleich ohne Namen ---
(tu-true "geruest-record-gleich-p/name"
(geruest-record-gleich-p '(("name" . "A") ("laenge" . "100"))
'(("name" . "B") ("laenge" . "100"))))
(tu-nil "geruest-record-gleich-p/geaendert"
(geruest-record-gleich-p '(("name" . "A") ("laenge" . "100"))
'(("name" . "A") ("laenge" . "200"))))
;; Eigene Konfiguration gewinnt vor gleichnamiger Bibliothek; nur eine
;; eigene liefert eine Namensvorgabe (Ueberspeichern)
(setq _alt *geruest-konfig-liste*)
(setq *geruest-konfig-liste*
(list (cons nil '(("name" . "K"))) (cons T '(("name" . "K")))
(cons nil '(("name" . "L")))))
(tu-eq "geruest-konfig-index/eigene-zuerst" 2 (geruest-konfig-index "K"))
(tu-eq "geruest-konfig-index/bibliothek" 3 (geruest-konfig-index "L"))
(tu-eq "geruest-konfig-name-vorgabe/eigene" "K" (geruest-konfig-name-vorgabe 2))
(tu-nil "geruest-konfig-name-vorgabe/bibliothek" (geruest-konfig-name-vorgabe 1))
(tu-nil "geruest-konfig-name-vorgabe/keine" (geruest-konfig-name-vorgabe 0))
(setq *geruest-konfig-liste* _alt)
(tu-eq "geruest-konfig-sonstiges/umhaengen" '(4 3)
(geruest-konfig-sonstiges _konfig
(geruest-anbau-liste _bgtest "sonstiges")
(geruest-anbau-liste _bgtest "befestigung")))
;; Befestigung = Gesamtanzahl: neues Feld "befestigung", altes oben +
;; unten summiert; der Haltearm unter "oben" wird hier still uebergangen
(tu-eq "geruest-konfig-befestigung/alt" '(2)
(geruest-konfig-befestigung _konfig
(geruest-anbau-liste _bgtest "befestigung")
(geruest-anbau-liste _bgtest "sonstiges")))
(tu-eq "geruest-konfig-befestigung/oben-unten" '(5)
(geruest-konfig-befestigung
(ssg-json-parse
(strcat "{\"name\": \"A\", \"oben\": [{\"artikel\": \"K\", \"anzahl\": 2}],"
" \"unten\": [{\"artikel\": \"K\", \"anzahl\": 3}]}"))
(geruest-anbau-liste _bgtest "befestigung")
(geruest-anbau-liste _bgtest "sonstiges")))
(tu-eq "geruest-konfig-befestigung/neu" '(4)
(geruest-konfig-befestigung
(ssg-json-parse
"{\"name\": \"N\", \"befestigung\": [{\"artikel\": \"K\", \"anzahl\": 4}]}")
(geruest-anbau-liste _bgtest "befestigung")
(geruest-anbau-liste _bgtest "sonstiges")))
;; Artikelnummer(n) fuer die Anzeige: Einzelteil bzw. Gruppe eindeutig
(tu-eq "geruest-artnr-anzeige/einzelteil" "825002019"
(geruest-artnr-anzeige _eintrag))
(tu-eq "geruest-artnr-anzeige/gruppe" "111, 222"
(geruest-artnr-anzeige _gruppe))
;; Eine Befestigungsspalte (Prefix b) mit Art.-Nr.-Zeile je Teil
(setq _rec (geruest-dcl-ersetzungen "Saeulen" (list _eintrag) nil
(list '(("name" . "A")))))
(tu-true "geruest-dcl-ersetzungen/befestigung-key"
(vl-some '(lambda (z) (vl-string-search "key = \"bm0\"" z))
(cdr (assoc "BEFESTIGUNG" _rec))))
(tu-true "geruest-dcl-ersetzungen/artnr-zeile"
(vl-some '(lambda (z) (vl-string-search "Art.-Nr. 825002019" z))
(cdr (assoc "BEFESTIGUNG" _rec))))
;; --- Variante gewinnt vor Baugruppe (TEILEART/dummy) ---
;; Die zusammengefuehrte Saeulen-Baugruppe unterscheidet 1 Zoll und
@@ -1032,9 +1188,7 @@
(geruest-variante-wert nil _bgtest "dummy"))
;; --- Zusammengefuehrte Saeulen-Baugruppe ---
(setq _saeulen nil)
(foreach _e (geruest-baugruppen-liste)
(if (equal (car _e) "Saeulen") (setq _saeulen (cdr _e))))
(setq _saeulen (geruest-baugruppe "Saeulen" (geruest-daten)))
(tu-eq "geruest/saeulen-vorhanden" T (if _saeulen T nil))
(if _saeulen
(progn
@@ -1046,10 +1200,27 @@
(tu-geruest-artikel-unvollstaendig
(ssg-json-get _saeulen "geometrie_varianten")))
(tu-eq "geruest/saeulen-anbauteile" T
(if (ssg-json-get _saeulen "anbaugruppen") T nil))
(if (geruest-anbau-liste _saeulen "befestigung") T nil))
(tu-eq "geruest/saeulen-anbauteile-artikel" 0
(tu-geruest-artikel-unvollstaendig
(ssg-json-get _saeulen "anbaugruppen")))
(geruest-anbau-liste _saeulen "befestigung")))
;; Haltearme passen weder oben noch unten -> eigene Sonstiges-Zeile
(tu-eq "geruest/saeulen-sonstiges" 4
(length (geruest-anbau-liste _saeulen "sonstiges")))
(tu-eq "geruest/saeulen-sonstiges-artikel" 0
(tu-geruest-artikel-unvollstaendig
(geruest-anbau-liste _saeulen "sonstiges")))
(tu-nil "geruest/saeulen-haltearm-nicht-befestigung"
(vl-some '(lambda (a)
(wcmatch (geruest-eintrag-name a) "HALTEARM*"))
(geruest-anbau-liste _saeulen "befestigung")))
;; Rohrabhaenger/Wandbefestigung haben keine Sonstiges-Teile
(foreach _e '("Rohrabhaenger" "Wandbefestigung")
(setq _rec (geruest-baugruppe _e (geruest-daten)))
(tu-true (strcat "geruest/" _e "-befestigung")
(geruest-anbau-liste _rec "befestigung"))
(tu-nil (strcat "geruest/" _e "-ohne-sonstiges")
(geruest-anbau-liste _rec "sonstiges")))
(tu-eq "geruest/saeulen-titel" "Saeulen" (geruest-titel _saeulen))
;; Variante R 1" traegt die eigene TEILEART - per Name gesucht,
;; die Reihenfolge in geruest.json ist nicht fest.
@@ -1136,20 +1307,33 @@
(tu-eqf "geruest-traeger-streben/6000-letzte" 5750.0 (last _rec))
;; Konfiguration: fehlende Felder -> Standard, ohne querstrebe -> nil
;; Ergebnis (dummy laenge querlinie abstand rand-min rand-max)
;; Streben nur bei Varianten mit "mit_querstrebe": true
(setq _vmq (ssg-json-parse "{\"name\": \"A\", \"mit_querstrebe\": true}"))
(tu-eqf "geruest-traeger-strebe-cfg/standard" '(nil 30.0 25.0 500.0 100.0 250.0)
(geruest-traeger-strebe-cfg nil
(geruest-traeger-strebe-cfg _vmq
(ssg-json-parse "{\"querstrebe\": {\"rand_min\": 100}}")))
(tu-eqf "geruest-traeger-strebe-cfg/dummy" '("s.dwg" 30.0 25.0 500.0 100.0 250.0)
(geruest-traeger-strebe-cfg nil
(geruest-traeger-strebe-cfg _vmq
(ssg-json-parse "{\"querstrebe\": {\"dummy\": \"s.dwg\"}}")))
(tu-eqf "geruest-traeger-strebe-cfg/wert" '(nil 30.0 25.0 400.0 100.0 250.0)
(geruest-traeger-strebe-cfg _vmq
(ssg-json-parse "{\"querstrebe\": {\"abstand\": 400}}")))
(tu-eqf "geruest-traeger-strebe-cfg/variante" '(nil 30.0 25.0 300.0 100.0 250.0)
(geruest-traeger-strebe-cfg
(ssg-json-parse
"{\"mit_querstrebe\": true, \"querstrebe\": {\"abstand\": 300}}")
(ssg-json-parse "{\"querstrebe\": {\"abstand\": 400}}")))
(tu-nil "geruest-traeger-strebe-cfg/ohne-flag"
(geruest-traeger-strebe-cfg (ssg-json-parse "{\"name\": \"Rohr 1\"}")
(ssg-json-parse "{\"querstrebe\": {\"abstand\": 400}}")))
(tu-nil "geruest-traeger-strebe-cfg/ohne-variante"
(geruest-traeger-strebe-cfg nil
(ssg-json-parse "{\"querstrebe\": {\"abstand\": 400}}")))
;; Querlinien an Anfang und Ende der 30 mm langen Strebe
(tu-eqf "geruest-traeger-strebe-enden" '(235.0 265.0)
(geruest-traeger-strebe-enden 250.0 30.0))
(tu-nil "geruest-traeger-strebe-cfg/ohne"
(geruest-traeger-strebe-cfg nil (ssg-json-parse "{\"id\": \"X\"}")))
(geruest-traeger-strebe-cfg _vmq (ssg-json-parse "{\"id\": \"X\"}")))
;; Muffe nur bei "mit_muffe": true; Variante darf eigene Muffe mitbringen
(setq _bgtest (ssg-json-parse "{\"muffe\": {\"dummy\": \"m.dwg\"}}"))
(tu-eq "geruest-traeger-muffe-dummy/flag" "m.dwg"
@@ -1271,13 +1455,8 @@
_bgtest "LAENGENABZUGENDE" "aktiv"))
;; --- Rohr-Geruest-Traeger in der echten Datendatei ---
;; Eigene Datei data/json/geruest_traeger.json: im Bereichs-Dropdown von
;; GERUEST darf er nicht auftauchen, ueber geruest-traeger-daten muss er
;; auffindbar sein.
(setq _rec nil)
(foreach _e (geruest-baugruppen-liste)
(if (equal (car _e) "Traeger") (setq _rec T)))
(tu-nil "geruest/traeger-nicht-im-dropdown" _rec)
;; Eigene Datei data/json/geruest_traeger.json: in geruest.json darf er
;; nicht stehen, ueber geruest-traeger-daten muss er auffindbar sein.
(tu-true "geruest/traeger-datei"
(findfile (geruest-json-pfad "geruest_traeger.json")))
(setq _traeger (geruest-baugruppe "Traeger" (geruest-traeger-daten)))
@@ -1297,12 +1476,26 @@
(geruest-attr-feld nil _traeger "LAENGE" "max"))
(tu-eqf "geruest/traeger-querstrebe"
'("dummy_Strebe_30x4.dwg" 30.0 25.0 500.0 100.0 250.0)
(geruest-traeger-strebe-cfg nil _traeger))
(geruest-traeger-strebe-cfg _vmq _traeger))
;; Querstreben-Flag je Variante: alle ausser den beiden Rohr-1"-Varianten
(setq _rec 0)
(foreach _v (ssg-json-get _traeger "geometrie_varianten")
(if (geruest-traeger-strebe-cfg _v _traeger) (setq _rec (1+ _rec))))
(tu-eq "geruest/traeger-querstreben-varianten" 6 _rec)
(tu-nil "geruest/traeger-rohr-ohne-querstrebe"
(geruest-traeger-strebe-cfg
(car (ssg-json-get _traeger "geometrie_varianten")) _traeger))
;; Muffen-Flag ausdruecklich je Variante: genau die "mit (2) Muffe(n)"
(setq _rec 0)
(foreach _v (ssg-json-get _traeger "geometrie_varianten")
(if (geruest-traeger-muffe-dummy _v _traeger) (setq _rec (1+ _rec))))
(tu-eq "geruest/traeger-muffen-varianten" 4 _rec)
;; Dialog: ein Radiobutton je Variante, auch fuer die mit Muffe
(tu-eq "geruest/traeger-radiobuttons" 8
(length (geruest-dcl-varianten-zeilen
(ssg-json-get _traeger "geometrie_varianten")
(geruest-indizes (length (ssg-json-get _traeger
"geometrie_varianten"))))))
;; Jede Variante definiert Beschriftungstext UND -layer selbst - der
;; Layer ist je Traegervariante verschieden, eine Vorgabe der
;; Baugruppe gibt es dafuer bewusst nicht.
@@ -1327,6 +1520,44 @@
)
)
;; --- Omniflo-Fahrstrecke (data/json/omniflo_fahrstrecke.json) ---
;; Gleiche Linien-Logik wie der Traeger: jede Variante ein Radiobutton,
;; nur ST/STL gibt es mit Muffen, nur ST/STL sind farbig.
(setq _fs (geruest-baugruppe "Fahrstrecke" (geruest-fahrstrecke-daten)))
(tu-true "fahrstrecke/vorhanden" _fs)
(if _fs
(progn
(setq _rec (ssg-json-get _fs "geometrie_varianten"))
(tu-eq "fahrstrecke/titel" "Fahrstrecke" (geruest-titel _fs))
(tu-eq "fahrstrecke/varianten"
'("AP 110" "APG 110" "AP 60" "ST" "ST mit Muffen" "STL" "STL mit Muffen")
(mapcar 'geruest-eintrag-name _rec))
(tu-eq "fahrstrecke/mit-muffe" '("ST mit Muffen" "STL mit Muffen")
(mapcar 'geruest-eintrag-name
(vl-remove-if-not '(lambda (v) (ssg-json-get v "mit_muffe")) _rec)))
;; AP 110 ohne "farbig" -> leerer TEILEFARBE-Eintrag, ST farbig
(tu-eq "fahrstrecke/ap110-nicht-farbig" '("")
(geruest-farbliste (geruest-teile-paare (nth 0 _rec) nil) "RAL7035"))
(tu-eq "fahrstrecke/st-farbig" '("RAL7035")
(geruest-farbliste
(geruest-teile-paare
(nth (geruest-name-index "ST" _rec) _rec) nil)
"RAL7035"))
;; Keine Querstreben; Muffen-Dummy wie beim Traeger nur bei den
;; Varianten mit "mit_muffe": true
(tu-nil "fahrstrecke/ohne-querstrebe"
(geruest-traeger-strebe-cfg (nth (geruest-name-index "ST" _rec) _rec) _fs))
(tu-eq "fahrstrecke/muffe-dummy" "dummy_Muffe_1zoll.dwg"
(geruest-traeger-muffe-dummy
(nth (geruest-name-index "ST mit Muffen" _rec) _rec) _fs))
(tu-nil "fahrstrecke/ohne-muffe-dummy"
(geruest-traeger-muffe-dummy
(nth (geruest-name-index "ST" _rec) _rec) _fs))
)
)
(tu-true "fahrstrecke/dcl-vorlage"
(findfile (geruest-dcl-vorlage-pfad "fahrstrecke.dcl")))
;; --- Rundlauf Schreiber -> Parser ---
;; Prueft den Konfigurations-Schreiber ohne BricsCAD-Dialog. Bewusst in
;; eine temporaere Datei: ein Test darf cfg/geruest_user.json nicht
@@ -1337,9 +1568,10 @@
(cons "variante" "ROHR R 1\" 33,7 x 2,6")
(cons "laenge" "2000")
(cons "teilefarbe" "RAL 7035 Lichtgrau")
(cons "oben" (list (list (cons "artikel" "ROHRKLAMMER 1\" KPL. VERTIKAL")
(cons "anzahl" 2))))
(cons "unten" nil)))
(cons "befestigung" (list (list (cons "artikel" "ROHRKLAMMER 1\" KPL. VERTIKAL")
(cons "anzahl" 2))))
(cons "sonstiges" nil)
(cons "winkel_platte" 90)))
(setq _pfad (vl-filename-mktemp "grtest" nil ".json"))
(setq _f (open _pfad "w"))
(write-line "{ \"Test\": [" _f)
@@ -1356,12 +1588,16 @@
(ssg-json-get _zurueck "laenge"))
(tu-eq "geruest-schreiber/farbe" "RAL 7035 Lichtgrau"
(ssg-json-get _zurueck "teilefarbe"))
(tu-eq "geruest-schreiber/oben-artikel" "ROHRKLAMMER 1\" KPL. VERTIKAL"
(ssg-json-get (car (ssg-json-get _zurueck "oben")) "artikel"))
(tu-eq "geruest-schreiber/oben-anzahl" 2
(ssg-json-get (car (ssg-json-get _zurueck "oben")) "anzahl"))
(tu-eq "geruest-schreiber/unten-leer" nil
(ssg-json-get _zurueck "unten"))
(tu-eq "geruest-schreiber/befestigung-artikel" "ROHRKLAMMER 1\" KPL. VERTIKAL"
(ssg-json-get (car (ssg-json-get _zurueck "befestigung")) "artikel"))
(tu-eq "geruest-schreiber/befestigung-anzahl" 2
(ssg-json-get (car (ssg-json-get _zurueck "befestigung")) "anzahl"))
(tu-eq "geruest-schreiber/sonstiges-leer" nil
(ssg-json-get _zurueck "sonstiges"))
(tu-eq "geruest-schreiber/winkel" 90
(ssg-json-get _zurueck "winkel_platte"))
;; altes Format wird nicht mehr geschrieben
(tu-nil "geruest-schreiber/ohne-oben" (assoc "oben" _zurueck))
)
)
)
@@ -1713,6 +1949,7 @@
(tu-eq "ssg-sl-klasse/vf" "ils_strecke" (car (ssg-sl-klasse "VF_2")))
(tu-eq "ssg-sl-klasse/gf" "ils_strecke" (car (ssg-sl-klasse "GF_1")))
(tu-eq "ssg-sl-klasse/geruest" "geruest" (car (ssg-sl-klasse "GR_Saeulen_20260101120000")))
(tu-eq "ssg-sl-klasse/fahrstrecke" "fahrstrecke" (car (ssg-sl-klasse "GR_Fahrstrecke_20260101120000")))
(tu-eq "ssg-sl-klasse/ap60" "ap60" (car (ssg-sl-klasse "AP60_20260101120000")))
(tu-eq "ssg-sl-klasse/apg110" "apg110" (car (ssg-sl-klasse "APG110_20260101120000")))
(tu-eq "ssg-sl-klasse/ap110" "ap110" (car (ssg-sl-klasse "AP110_20260101120000")))