[ADD] Gerüst Dummydateien sowie Zeichnungsdateien hinzugefügt; [FIX] Anzahl und menge der Baugruppenteile unterscheidet sich nun mit dem vorgabe wert für die Inputfelder; [CHANGE] Gerüstträger in separates JSON FIle ausgelagert, da andere Einfügelogik

This commit is contained in:
Simon Hensch committed 2026-10-05 09:49:20 +02:00
1 parent 6ec85905d4
commit fe5cb9664c
14 files changed
+488 -348

No files matched your search

+2 -2
View File
@@ -23,7 +23,7 @@ AutoLISP-Makros (SSG_LIB) fuer BricsCAD Pro zur automatisierten Erstellung von F
| `cfg/` | Konfigurationsdateien | | `cfg/` | Konfigurationsdateien |
| `data/` | JSON-Daten, DXF-Quellen, Block-Libraries | | `data/` | JSON-Daten, DXF-Quellen, Block-Libraries |
| `data/ils/` | DWG-Bloecke fuer ILS-Kreisel/Eckrad (AN8, SP8, AP-Typen) | | `data/ils/` | DWG-Bloecke fuer ILS-Kreisel/Eckrad (AN8, SP8, AP-Typen) |
| `data/json/` | Komponentendaten (Masse, Sivas-IDs) | | `data/json/` | Komponentendaten (Masse, Sivas-IDs); Geruest: `geruest.json` (GERUEST-Dialog) und `geruest_traeger.json` (Traeger mit Linien-Logik) |
| `data/block_libraries/` | DXF Block-Libraries (ils_library.dxf) | | `data/block_libraries/` | DXF Block-Libraries (ils_library.dxf) |
| `dcl/` | DCL-Dialogdefinitionen | | `dcl/` | DCL-Dialogdefinitionen |
| `doc/` | Dokumentation, Entwicklungsplan | | `doc/` | Dokumentation, Entwicklungsplan |
@@ -107,7 +107,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 | | `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) | | `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. | | `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) - 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 Stueckzahl (vorbelegt aus `menge`). 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] merkmal_teilefarbe`). Blockname `GR_<id>_<ssg-timestamp>` (Kollisionszaehler wie in OmniModulInsert). **Das `GR_`-Praefix ist nicht kosmetisch**: `SSG_BLOCKEDIT` haelt JEDEN Block mit TEILEART-Attribut fuer ein Omniflo-Element, deshalb steht in `SSG_LIB_Commands.lsp` ein `GR_*`-Zweig VOR dem Omniflo-Zweig. ARTINR listet jede Sivas-ID so oft, wie die gewaehlte Stueckzahl es vorgibt - erst Basis, dann Befestigung oben, dann unten; bei einer benannten Gruppe (`teile`) wird das ganze Set n-mal wiederholt, die Mengen INNERHALB des Sets bleiben dabei erhalten (`geruest-artikelnummern-n`). BEZEICHNUNG nennt Position und Menge je Teil ("oben 2x ...") und verkettet mit `" + "`, NICHT mit Komma - Line truncated | `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
| `menu-inventory.lsp` | MenuInventory | BricsCAD Diagnostik (Menuegruppen, Plugins, Startdateien) | | `menu-inventory.lsp` | MenuInventory | BricsCAD Diagnostik (Menuegruppen, Plugins, Startdateien) |
| `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). | | `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). |
+125 -72
View File
@@ -5,6 +5,7 @@
;; Nutzer eine Basis-Variante, Anbauteile fuer "Befestigung oben" UND ;; Nutzer eine Basis-Variante, Anbauteile fuer "Befestigung oben" UND
;; "Befestigung unten" (je mit eigener Stueckzahl), Laenge und Farbe waehlen, ;; "Befestigung unten" (je mit eigener Stueckzahl), Laenge und Farbe waehlen,
;; und fuegt das Ergebnis als Block GR_<id>_<Zeitstempel> ein. ;; und fuegt das Ergebnis als Block GR_<id>_<Zeitstempel> ein.
;; Rohr-Geruest-Traeger (GERUEST_TRAEGER) lesen data/json/geruest_traeger.json.
;; ;;
;; Beide Befestigungslisten enthalten ALLE Anbauteile der Baugruppe - dasselbe ;; Beide Befestigungslisten enthalten ALLE Anbauteile der Baugruppe - dasselbe
;; Teil kann oben, unten oder gleichzeitig an beiden Positionen sitzen. ;; Teil kann oben, unten oder gleichzeitig an beiden Positionen sitzen.
@@ -100,9 +101,10 @@
) )
) )
(defun geruest-json-pfad ( / basis) ;; Pfad einer Datendatei unter data/json, z.B. "geruest.json".
(defun geruest-json-pfad (datei / basis)
(if (setq basis (geruest-data-verzeichnis)) (if (setq basis (geruest-data-verzeichnis))
(strcat basis "/json/geruest.json") (strcat basis "/json/" datei)
) )
) )
@@ -112,36 +114,48 @@
) )
) )
;; Datendatei einmal je Zeichnungssitzung laden. ;; Datendatei unter data/json einmal je Zeichnungssitzung laden und im
(defun geruest-daten ( / pfad) ;; globalen Symbol cache-sym ablegen. Rueckgabe: die geparsten Daten oder nil
(if (null *geruest-daten*) ;; (mit Meldung).
(defun geruest-json-laden-cache (datei cache-sym / pfad daten)
(if (null (eval cache-sym))
(progn (progn
(setq pfad (geruest-json-pfad)) (setq pfad (geruest-json-pfad datei))
(cond (cond
((null pfad) (princ (ssg-text "gr-fehler-datenpfad"))) ((null pfad) (princ (ssg-text "gr-fehler-datenpfad")))
((null (findfile pfad)) (princ (ssg-textf "gr-fehler-json-fehlt" (list pfad)))) ((null (findfile pfad)) (princ (ssg-textf "gr-fehler-json-fehlt" (list pfad))))
(T (T
(setq *geruest-daten* (ssg-json-laden pfad)) (setq daten (ssg-json-laden pfad))
(if (null *geruest-daten*) (set cache-sym daten)
(if (null daten)
(princ (ssg-textf "gr-fehler-json-lesbar" (list pfad))) (princ (ssg-textf "gr-fehler-json-lesbar" (list pfad)))
) )
) )
) )
) )
) )
*geruest-daten* (eval cache-sym)
)
;; Baugruppen des GERUEST-Dialogs (Rohrabhaenger, Saeulen, Wandbefestigung).
(defun geruest-daten ( / )
(geruest-json-laden-cache "geruest.json" '*geruest-daten*)
)
;; Traeger-Baugruppen mit Linien-Logik (Rohr-Geruest-Traeger, spaeter z.B.
;; Gattertraeger) - bewusst eine eigene Datei: eigener Dialog, Laenge aus der
;; Zeichnung, Streben/Muffe/Beschriftung statt Anbaugruppen/Konfigurationen.
(defun geruest-traeger-daten ( / )
(geruest-json-laden-cache "geruest_traeger.json" '*geruest-traeger-daten*)
) )
;; Alle Baugruppen als ((id . objekt) ...) in Dateireihenfolge - diese ;; Alle Baugruppen als ((id . objekt) ...) in Dateireihenfolge - diese
;; Reihenfolge bestimmt auch die Reihenfolge im Bereichs-Dropdown. ;; Reihenfolge bestimmt auch die Reihenfolge im Bereichs-Dropdown. Die
;; Baugruppen mit "einfuegeart": "linie" (Rohr-Geruest-Traeger) fehlen hier: ;; Traeger stehen in geruest_traeger.json und gehoeren nicht hierher.
;; sie haben einen eigenen Dialog und einen eigenen Einfuegeablauf
;; (c:GERUEST_TRAEGER) und gehoeren nicht in das Bereichs-Dropdown.
(defun geruest-baugruppen-liste ( / erg) (defun geruest-baugruppen-liste ( / erg)
(setq erg nil) (setq erg nil)
(foreach eintrag (geruest-daten) (foreach eintrag (geruest-daten)
(if (and (listp (cdr eintrag)) (if (listp (cdr eintrag))
(not (equal (ssg-json-get (cdr eintrag) "einfuegeart") "linie")))
(setq erg (append erg (setq erg (append erg
(list (cons (ssg-json-get (cdr eintrag) "id") (cdr eintrag))))) (list (cons (ssg-json-get (cdr eintrag) "id") (cdr eintrag)))))
) )
@@ -169,6 +183,40 @@
(if (and w (/= w "")) w (ssg-json-get bg schluessel)) (if (and w (/= w "")) w (ssg-json-get bg schluessel))
) )
;; Pfad der Dummy-DWG fuer den Block. Ein "dummy" in der Geometrie-Variante
;; wird bevorzugt; fehlt die Datei unter data/geruest, wird gemeldet und auf
;; den "dummy" der Baugruppe zurueckgefallen. Rueckgabe: (datei . pfad) -
;; pfad ist nil, wenn kein Datenverzeichnis bekannt ist; ob die
;; Rueckfall-Datei existiert, prueft der Aufrufer.
(defun geruest-dummy-wahl (variante bg / v pfad)
(setq v (if variante (ssg-json-get variante "dummy")))
(if (and v (= (type v) 'STR) (/= v "")
(setq pfad (geruest-dummy-pfad v))
(findfile pfad))
(cons v pfad)
(progn
(if (and v (= (type v) 'STR) (/= v ""))
(princ (ssg-textf "gr-fehler-dummy-variante"
(list (if pfad pfad v)
(if (ssg-json-get bg "dummy")
(ssg-json-get bg "dummy")
"-"))))
)
(setq v (ssg-json-get bg "dummy"))
(cons v (geruest-dummy-pfad v))
)
)
)
;; Liste ohne die Eintraege, die (ohne Gross/Klein) gleich pfad sind. Damit
;; landet eine Teile-DWG, die zugleich der Dummy ist, nicht doppelt im Block.
(defun geruest-ohne-pfad (pfad liste)
(if pfad
(vl-remove-if '(lambda (p) (= (strcase p) (strcase pfad))) liste)
liste
)
)
;; ============================================================ ;; ============================================================
;; TEILE AUSWERTEN ;; TEILE AUSWERTEN
@@ -184,9 +232,23 @@
) )
) )
(defun geruest-menge (eintrag / m) ;; Zwei Mengenfelder im JSON, bewusst verschieden benannt:
(setq m (ssg-json-get eintrag "menge")) ;; "stueckzahl" = wie oft das Teil TATSAECHLICH geschrieben wird - je
(if (and m (numberp m) (> m 0)) (fix m) 1) ;; Einbau (Variante) bzw. je Satz/Anbauteil. Fehlt = 1.
;; "anzahl_vorgabe" = NUR die Vorbelegung des Anzahl-Feldes im Dialog
;; (Anbaugruppen). Fehlt = 1.
;; Ein Anbauteil wird Anzahl (Dialog) x stueckzahl mal geschrieben; bei einer
;; Gruppe ("teile") ist die Anzahl die Zahl der Saetze.
(defun geruest-positiv-int (w / )
(if (and w (numberp w) (> w 0)) (fix w) 1)
)
(defun geruest-stueckzahl (eintrag)
(geruest-positiv-int (ssg-json-get eintrag "stueckzahl"))
)
(defun geruest-anzahl-vorgabe (eintrag)
(geruest-positiv-int (ssg-json-get eintrag "anzahl_vorgabe"))
) )
;; Sivas-ID als String. Im JSON stehen rein numerische IDs als Zahl ;; Sivas-ID als String. Im JSON stehen rein numerische IDs als Zahl
@@ -212,7 +274,7 @@
) )
;; Alle Teile eines Eintrags als ((artnr . farbig) ...), jedes gemaess ;; Alle Teile eines Eintrags als ((artnr . farbig) ...), jedes gemaess
;; "menge" wiederholt. Benannte Gruppen ("teile") werden rekursiv aufgeloest. ;; "stueckzahl" wiederholt. Benannte Gruppen ("teile") werden rekursiv aufgeloest.
;; farbig = darf das Teil die Baugruppenfarbe tragen ("farbig" im JSON). Eine ;; farbig = darf das Teil die Baugruppenfarbe tragen ("farbig" im JSON). Eine
;; Gruppe mit "farbig": true vererbt das an ihre Teile (erbe); ein Teil kann ;; Gruppe mit "farbig": true vererbt das an ihre Teile (erbe); ein Teil kann
;; die Vererbung nicht per false aufheben - false und "fehlt" sind beide nil. ;; die Vererbung nicht per false aufheben - false und "fehlt" sind beide nil.
@@ -229,12 +291,12 @@
(setq erg (mapcar '(lambda (nr) (cons nr farbig)) (setq erg (mapcar '(lambda (nr) (cons nr farbig))
(geruest-wiederholen (geruest-wiederholen
(geruest-id-string (ssg-json-get eintrag "sivas_id")) (geruest-id-string (ssg-json-get eintrag "sivas_id"))
(geruest-menge eintrag)))) (geruest-stueckzahl eintrag))))
) )
erg erg
) )
;; Alle Artikelnummern eines Eintrags, jede gemaess "menge" wiederholt. ;; Alle Artikelnummern eines Eintrags, jede gemaess "stueckzahl" wiederholt.
(defun geruest-artikelnummern (eintrag) (defun geruest-artikelnummern (eintrag)
(mapcar 'car (geruest-teile-paare eintrag nil)) (mapcar 'car (geruest-teile-paare eintrag nil))
) )
@@ -289,7 +351,7 @@
;; Eingabe aus einem Mengenfeld auswerten. ;; Eingabe aus einem Mengenfeld auswerten.
;; Leer -> Vorgabewert aus dem JSON, gueltig -> Zahl >= 1, sonst nil. ;; Leer -> Vorgabewert aus dem JSON, gueltig -> Zahl >= 1, sonst nil.
(defun geruest-menge-wert (s vorgabe) (defun geruest-anzahl-wert (s vorgabe)
(setq s (ssg-cfg-trim (if s s ""))) (setq s (ssg-cfg-trim (if s s "")))
(cond (cond
((= s "") vorgabe) ((= s "") vorgabe)
@@ -310,30 +372,18 @@
) )
) )
;; Artikelnummern eines Eintrags bei frei gewaehlter Stueckzahl. ;; Teile eines Anbauteils bei der im Dialog gewaehlten Anzahl: der Eintrag
;; Einzelteil: die Sivas-ID anzahl-mal. Benannte Gruppe ("teile"): das ;; (Einzelteil mit seiner "stueckzahl" bzw. benannte Gruppe als kompletter
;; komplette Set anzahl-mal - die Mengen INNERHALB des Sets bleiben erhalten ;; Satz) anzahl-mal. Die Stueckzahlen INNERHALB eines Satzes bleiben erhalten
;; (ein Schraubenset bleibt 1 Scheibe + 2 Muttern + 1 Schraube je Satz). ;; (ein Schraubenset bleibt 1 Scheibe + 2 Muttern + 1 Schraube je Satz).
(defun geruest-teile-paare-n (eintrag anzahl / teile einmal erg i farbig) (defun geruest-teile-paare-n (eintrag anzahl / einmal erg i)
(setq teile (ssg-json-get eintrag "teile")) (setq einmal (geruest-teile-paare eintrag nil))
(setq farbig (if (ssg-json-get eintrag "farbig") T nil)) (setq erg nil i 0)
(if teile (while (< i anzahl)
(progn (setq erg (append erg einmal))
(setq einmal nil) (setq i (1+ i))
(foreach teil teile
(setq einmal (append einmal (geruest-teile-paare teil farbig)))
)
(setq erg nil i 0)
(while (< i anzahl)
(setq erg (append erg einmal))
(setq i (1+ i))
)
erg
)
(mapcar '(lambda (nr) (cons nr farbig))
(geruest-wiederholen
(geruest-id-string (ssg-json-get eintrag "sivas_id")) anzahl))
) )
erg
) )
(defun geruest-artikelnummern-n (eintrag anzahl) (defun geruest-artikelnummern-n (eintrag anzahl)
@@ -441,7 +491,7 @@
;; Positionsliste ("oben"/"unten") einer Konfiguration auf die Anbauteile ;; Positionsliste ("oben"/"unten") einer Konfiguration auf die Anbauteile
;; abbilden. Rueckgabe: ein Eintrag je Anbauteil - nil (nicht gewaehlt) oder ;; abbilden. Rueckgabe: ein Eintrag je Anbauteil - nil (nicht gewaehlt) oder
;; die Stueckzahl. Ein unbekannter Artikelname wird gemeldet und ;; die Anzahl (Feld "anzahl"). Ein unbekannter Artikelname wird gemeldet und
;; uebersprungen, statt die ganze Konfiguration scheitern zu lassen. ;; uebersprungen, statt die ganze Konfiguration scheitern zu lassen.
(defun geruest-konfig-position (konfig schluessel anbauteile / mengen idx n) (defun geruest-konfig-position (konfig schluessel anbauteile / mengen idx n)
(setq mengen (geruest-nil-liste (length anbauteile))) (setq mengen (geruest-nil-liste (length anbauteile)))
@@ -449,7 +499,7 @@
(setq idx (geruest-name-index (ssg-json-get e "artikel") anbauteile)) (setq idx (geruest-name-index (ssg-json-get e "artikel") anbauteile))
(if idx (if idx
(progn (progn
(setq n (ssg-json-get e "menge")) (setq n (ssg-json-get e "anzahl"))
(setq mengen (geruest-liste-setzen mengen idx (setq mengen (geruest-liste-setzen mengen idx
(if (and n (numberp n) (> n 0)) (fix n) 1))) (if (and n (numberp n) (> n 0)) (fix n) 1)))
) )
@@ -583,20 +633,20 @@
(defun geruest-dlg-standard ( / erg) (defun geruest-dlg-standard ( / erg)
(setq erg nil) (setq erg nil)
(foreach a *geruest-anbauteile* (foreach a *geruest-anbauteile*
(setq erg (append erg (list (cons "0" (itoa (geruest-menge a)))))) (setq erg (append erg (list (cons "0" (itoa (geruest-anzahl-vorgabe a))))))
) )
erg erg
) )
;; Mengenliste (nil oder Zahl je Teil) in den Tile-Zustand umsetzen. ;; Mengenliste (nil oder Zahl je Teil) in den Tile-Zustand umsetzen.
(defun geruest-mengen->tiles (mengen / erg i a) (defun geruest-anzahlen->tiles (mengen / erg i a)
(setq erg nil i 0) (setq erg nil i 0)
(foreach m mengen (foreach m mengen
(setq a (nth i *geruest-anbauteile*)) (setq a (nth i *geruest-anbauteile*))
(setq erg (append erg (setq erg (append erg
(list (if m (list (if m
(cons "1" (itoa m)) (cons "1" (itoa m))
(cons "0" (itoa (geruest-menge a))))))) (cons "0" (itoa (geruest-anzahl-vorgabe a)))))))
(setq i (1+ i)) (setq i (1+ i))
) )
erg erg
@@ -720,10 +770,10 @@
*geruest-dlg-frei* farbe)) *geruest-dlg-frei* farbe))
) )
(setq *geruest-dlg-oben* (setq *geruest-dlg-oben*
(geruest-mengen->tiles (geruest-anzahlen->tiles
(geruest-konfig-position k "oben" *geruest-anbauteile*))) (geruest-konfig-position k "oben" *geruest-anbauteile*)))
(setq *geruest-dlg-unten* (setq *geruest-dlg-unten*
(geruest-mengen->tiles (geruest-anzahlen->tiles
(geruest-konfig-position k "unten" *geruest-anbauteile*))) (geruest-konfig-position k "unten" *geruest-anbauteile*)))
) )
) )
@@ -745,16 +795,16 @@
) )
;; Angehakte Teile einer Spalte mit gueltiger Menge einsammeln. ;; Angehakte Teile einer Spalte mit gueltiger Menge einsammeln.
;; Rueckgabe: (T . ((index . menge) ...)) oder nil bei ungueltigem Mengenfeld. ;; Rueckgabe: (T . ((index . anzahl) ...)) oder nil bei ungueltigem Mengenfeld.
;; Das fuehrende T ist noetig, weil "nichts ausgewaehlt" ein gueltiges ;; Das fuehrende T ist noetig, weil "nichts ausgewaehlt" ein gueltiges
;; Ergebnis ist und sich sonst nicht von einem Fehler unterscheiden liesse. ;; Ergebnis ist und sich sonst nicht von einem Fehler unterscheiden liesse.
(defun geruest-mengen-lesen (zustand / erg i a m ok) (defun geruest-anzahlen-lesen (zustand / erg i a m ok)
(setq erg nil i 0 ok T) (setq erg nil i 0 ok T)
(foreach paar zustand (foreach paar zustand
(setq a (nth i *geruest-anbauteile*)) (setq a (nth i *geruest-anbauteile*))
(if (and ok (= (car paar) "1")) (if (and ok (= (car paar) "1"))
(progn (progn
(setq m (geruest-menge-wert (cdr paar) (geruest-menge a))) (setq m (geruest-anzahl-wert (cdr paar) (geruest-anzahl-vorgabe a)))
(if m (if m
(setq erg (append erg (list (cons i m)))) (setq erg (append erg (list (cons i m))))
(setq ok nil) (setq ok nil)
@@ -788,11 +838,11 @@
(setq a (nth i *geruest-anbauteile*)) (setq a (nth i *geruest-anbauteile*))
(if (= (car paar) "1") (if (= (car paar) "1")
(progn (progn
(setq m (geruest-menge-wert (cdr paar) (geruest-menge a))) (setq m (geruest-anzahl-wert (cdr paar) (geruest-anzahl-vorgabe a)))
(if m (if m
(setq erg (append erg (setq erg (append erg
(list (list (cons "artikel" (geruest-eintrag-name a)) (list (list (cons "artikel" (geruest-eintrag-name a))
(cons "menge" m))))) (cons "anzahl" m)))))
) )
) )
) )
@@ -818,7 +868,7 @@
(write-line (write-line
(strcat " { \"artikel\": \"" (strcat " { \"artikel\": \""
(ssg-json-escape (ssg-json-get e "artikel")) (ssg-json-escape (ssg-json-get e "artikel"))
"\", \"menge\": " (itoa (ssg-json-get e "menge")) " }" "\", \"anzahl\": " (itoa (ssg-json-get e "anzahl")) " }"
(if (< i n) "," "")) (if (< i n) "," ""))
f) f)
) )
@@ -963,7 +1013,7 @@
) )
;; Dialog fuer einen Bereich zeigen. Rueckgabe: ;; Dialog fuer einen Bereich zeigen. Rueckgabe:
;; ("OK" variante-index ((idx . menge) ...) ((idx . menge) ...) laenge farbe) ;; ("OK" variante-index ((idx . anzahl) ...) ((idx . anzahl) ...) laenge farbe)
;; - drittes Element = Befestigung oben, viertes = unten ;; - drittes Element = Befestigung oben, viertes = unten
;; ("WECHSEL" bereich-index) - Nutzer hat den Bereich umgestellt ;; ("WECHSEL" bereich-index) - Nutzer hat den Bereich umgestellt
;; nil - abgebrochen ;; nil - abgebrochen
@@ -1120,8 +1170,8 @@
) )
(T (T
(setq oben-m (geruest-mengen-lesen *geruest-dlg-oben*)) (setq oben-m (geruest-anzahlen-lesen *geruest-dlg-oben*))
(setq unten-m (geruest-mengen-lesen *geruest-dlg-unten*)) (setq unten-m (geruest-anzahlen-lesen *geruest-dlg-unten*))
(if (or (null oben-m) (null unten-m)) (if (or (null oben-m) (null unten-m))
(alert (ssg-text "gr-alert-menge")) (alert (ssg-text "gr-alert-menge"))
(progn (progn
@@ -1170,10 +1220,14 @@
;; Rueckgabe: (blockname . entity) oder nil. ;; Rueckgabe: (blockname . entity) oder nil.
(defun geruest-block-bauen (bg variante werte pt teile-dwgs / datei dummy lastEnt dummyEnt (defun geruest-block-bauen (bg variante werte pt teile-dwgs / datei dummy lastEnt dummyEnt
dummy-attribs attribs) dummy-attribs attribs)
;; Eine Variante darf eine eigene Dummy-DWG mitbringen; sonst gilt die der ;; Eine Variante darf eine eigene Dummy-DWG mitbringen; sonst (oder wenn
;; Baugruppe. ;; deren Datei fehlt) gilt die der Baugruppe.
(setq datei (geruest-variante-wert variante bg "dummy")) (setq datei (geruest-dummy-wahl variante bg))
(setq dummy (geruest-dummy-pfad datei)) (setq dummy (cdr datei)
datei (car datei))
;; Ist der Dummy zugleich eine Teile-DWG (z.B. 821006036.dwg beim
;; T-Abhaenger), nicht ein zweites Mal einfuegen.
(setq teile-dwgs (geruest-ohne-pfad dummy teile-dwgs))
(if (or (null dummy) (null (findfile dummy))) (if (or (null dummy) (null (findfile dummy)))
(progn (progn
(princ (ssg-textf "gr-fehler-dummy" (list (if dummy dummy datei)))) (princ (ssg-textf "gr-fehler-dummy" (list (if dummy dummy datei))))
@@ -1269,7 +1323,7 @@
;; ============================================================ ;; ============================================================
;; Teile-Paare ((artnr . farbig) ...) einer Befestigungsauswahl ;; Teile-Paare ((artnr . farbig) ...) einer Befestigungsauswahl
;; ((index . menge) ...). ;; ((index . anzahl) ...).
(defun geruest-auswahl-paare (auswahl anbauteile / erg) (defun geruest-auswahl-paare (auswahl anbauteile / erg)
(setq erg nil) (setq erg nil)
(foreach paar auswahl (foreach paar auswahl
@@ -1410,7 +1464,7 @@
;; ============================================================ ;; ============================================================
;; ROHR-GERUEST-TRAEGER (Baugruppe mit "einfuegeart": "linie") ;; ROHR-GERUEST-TRAEGER (Daten: data/json/geruest_traeger.json)
;; ============================================================ ;; ============================================================
;; Eigener Dialog (dcl/geruest_traeger.dcl): Variante, Farbe und zwei ;; Eigener Dialog (dcl/geruest_traeger.dcl): Variante, Farbe und zwei
;; Laengenabzuege. Die Laenge selbst wird DANACH in der Zeichnung bestimmt - ;; Laengenabzuege. Die Laenge selbst wird DANACH in der Zeichnung bestimmt -
@@ -1425,11 +1479,10 @@
;; Richtungswinkel eingefuegt. Es wird wiederholt eingefuegt, bis der Nutzer ;; Richtungswinkel eingefuegt. Es wird wiederholt eingefuegt, bis der Nutzer
;; ESC/Enter drueckt - jeder Traeger ist ein eigener GR_Traeger_<ts>-Block. ;; ESC/Enter drueckt - jeder Traeger ist ein eigener GR_Traeger_<ts>-Block.
;; Baugruppe ueber das ASCII-Feld "id" (auch solche, die ;; Baugruppe ueber das ASCII-Feld "id" in daten (z.B. (geruest-traeger-daten)).
;; geruest-baugruppen-liste auslaesst). (defun geruest-baugruppe (id daten / erg)
(defun geruest-baugruppe (id / erg)
(setq erg nil) (setq erg nil)
(foreach eintrag (geruest-daten) (foreach eintrag daten
(if (and (null erg) (listp (cdr eintrag)) (if (and (null erg) (listp (cdr eintrag))
(equal (ssg-json-get (cdr eintrag) "id") id)) (equal (ssg-json-get (cdr eintrag) "id") id))
(setq erg (cdr eintrag)) (setq erg (cdr eintrag))
@@ -2098,7 +2151,7 @@
cfg laenge lage lay handle code erg) cfg laenge lage lay handle code erg)
(setq ed (entget blockEnt)) (setq ed (entget blockEnt))
(setq attribs (ssg-attrib-read blockEnt)) (setq attribs (ssg-attrib-read blockEnt))
(setq bg (geruest-baugruppe "Traeger")) (setq bg (geruest-baugruppe "Traeger" (geruest-traeger-daten)))
(setq laenge (atof (cond ((cdr (assoc "LAENGE" attribs))) ("0")))) (setq laenge (atof (cond ((cdr (assoc "LAENGE" attribs))) ("0"))))
(if (and bg (> laenge 0.0)) (if (and bg (> laenge 0.0))
(progn (progn
@@ -2190,7 +2243,7 @@
) )
(defun c:GERUEST_TRAEGER ( / bg wahl) (defun c:GERUEST_TRAEGER ( / bg wahl)
(setq bg (geruest-baugruppe "Traeger")) (setq bg (geruest-baugruppe "Traeger" (geruest-traeger-daten)))
(cond (cond
((null bg) ((null bg)
(princ (ssg-textf "gr-fehler-baugruppe" (list "Traeger")))) (princ (ssg-textf "gr-fehler-baugruppe" (list "Traeger"))))
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+91 -243
View File
@@ -29,13 +29,13 @@
"artikel": "ROHR R 1\" 33,7 x 2,6", "artikel": "ROHR R 1\" 33,7 x 2,6",
"sivas_id": 821006026, "sivas_id": 821006026,
"farbig": true, "farbig": true,
"menge": 1 "stueckzahl": 1
}, },
{ {
"artikel": "CAD - ROHRABH. 1\" NICHT GEQUETSCHT - MONTAGEELEMENTE KPL.", "artikel": "CAD - ROHRABH. 1\" NICHT GEQUETSCHT - MONTAGEELEMENTE KPL.",
"sivas_id": 821004202, "sivas_id": 821004202,
"farbig": false, "farbig": false,
"menge": 1 "stueckzahl": 1
} }
] ]
}, },
@@ -46,13 +46,13 @@
"artikel": "ROHR R 1\" 33,7 x 2,6 einseitig gequetscht", "artikel": "ROHR R 1\" 33,7 x 2,6 einseitig gequetscht",
"sivas_id": 821006034, "sivas_id": 821006034,
"farbig": true, "farbig": true,
"menge": 1 "stueckzahl": 1
}, },
{ {
"artikel": "CAD - ROHRABHÄNGER 1\" EINSEITIG GEQUETSCHT - MONTAGEELEMENTE KPL.", "artikel": "CAD - ROHRABHÄNGER 1\" EINSEITIG GEQUETSCHT - MONTAGEELEMENTE KPL.",
"sivas_id": 821004203, "sivas_id": 821004203,
"farbig": false, "farbig": false,
"menge": 1 "stueckzahl": 1
} }
] ]
}, },
@@ -63,13 +63,25 @@
"artikel": "ROHR R 1\" 33,7 x 2,6 beidseitig gequetscht", "artikel": "ROHR R 1\" 33,7 x 2,6 beidseitig gequetscht",
"sivas_id": 821006035, "sivas_id": 821006035,
"farbig": true, "farbig": true,
"menge": 1 "stueckzahl": 1
}, },
{ {
"artikel": "CAD - ROHRABHÄNGER 1\" BEIDSEITIG GEQUETSCHT - MONTAGEELEMENTE KPL.", "artikel": "CAD - ROHRABHÄNGER 1\" BEIDSEITIG GEQUETSCHT - MONTAGEELEMENTE KPL.",
"sivas_id": 821004204, "sivas_id": 821004204,
"farbig": false, "farbig": false,
"menge": 1 "stueckzahl": 1
}
]
},
{
"name": "T-Abhaenger mit 300 mm Flanschrohr R 1\" 33,7 x 2,6",
"dummy": "821006036.dwg",
"teile": [
{
"artikel": "T-ABHÄNGER MIT FLANSCH-ROHR 33,7 x 2,6",
"sivas_id": 821006036,
"farbig": true,
"stueckzahl": 1
} }
] ]
} }
@@ -79,34 +91,37 @@
"artikel": "SPANNPRATZE ST - KH 8-11 KPL.SELBSTSICHERND", "artikel": "SPANNPRATZE ST - KH 8-11 KPL.SELBSTSICHERND",
"sivas_id": 821004120, "sivas_id": 821004120,
"farbig": false, "farbig": false,
"menge": 1 "stueckzahl": 1,
"anzahl_vorgabe": 1
}, },
{ {
"artikel": "SPANNPRATZE SELBSTSICHERND KPL.", "artikel": "SPANNPRATZE SELBSTSICHERND KPL.",
"sivas_id": 821004058, "sivas_id": 821004058,
"farbig": false, "farbig": false,
"menge": 1 "stueckzahl": 1,
"anzahl_vorgabe": 1
}, },
{ {
"name": "Schraubenset", "name": "Schraubenset",
"anzahl_vorgabe": 1,
"teile": [ "teile": [
{ {
"artikel": "Scheibe DIN 125 - A 10,5 - 140 HV - St", "artikel": "Scheibe DIN 125 - A 10,5 - 140 HV - St",
"sivas_id": 913011010, "sivas_id": 913011010,
"farbig": false, "farbig": false,
"menge": 1 "stueckzahl": 1
}, },
{ {
"artikel": "Sechskantmutter DIN 934 - M10 - 8", "artikel": "Sechskantmutter DIN 934 - M10 - 8",
"sivas_id": 912011010, "sivas_id": 912011010,
"farbig": false, "farbig": false,
"menge": 2 "stueckzahl": 2
}, },
{ {
"artikel": "Sechskantschraube DIN 933 - M10 x 30 - 8.8", "artikel": "Sechskantschraube DIN 933 - M10 x 30 - 8.8",
"sivas_id": 911011008, "sivas_id": 911011008,
"farbig": false, "farbig": false,
"menge": 1 "stueckzahl": 1
} }
] ]
}, },
@@ -114,43 +129,50 @@
"artikel": "U-BÜGEL M7 41X49 FÜR PROFILGERÜST - BG", "artikel": "U-BÜGEL M7 41X49 FÜR PROFILGERÜST - BG",
"sivas_id": 825004049, "sivas_id": 825004049,
"farbig": false, "farbig": false,
"menge": 1 "stueckzahl": 1,
"anzahl_vorgabe": 1
}, },
{ {
"artikel": "ROHRKLAMMER 1\" KPL. VERTIKAL", "artikel": "ROHRKLAMMER 1\" KPL. VERTIKAL",
"sivas_id": 825004040, "sivas_id": 825004040,
"farbig": false, "farbig": false,
"menge": 2 "stueckzahl": 1,
"anzahl_vorgabe": 2
}, },
{ {
"artikel": "WINKEL 60X60X6X300", "artikel": "WINKEL 60X60X6X300",
"sivas_id": 821006043, "sivas_id": 821006043,
"farbig": false, "farbig": false,
"menge": 1 "stueckzahl": 1,
"anzahl_vorgabe": 1
}, },
{ {
"artikel": "WINKEL 60X60X6X60", "artikel": "WINKEL 60X60X6X60",
"sivas_id": 821006042, "sivas_id": 821006042,
"farbig": false, "farbig": false,
"menge": 1 "stueckzahl": 1,
"anzahl_vorgabe": 1
}, },
{ {
"artikel": "ROHRKLAMMER 1\" T-VERBINDUNG KPL.", "artikel": "ROHRKLAMMER 1\" T-VERBINDUNG KPL.",
"sivas_id": 825004030, "sivas_id": 825004030,
"farbig": false, "farbig": false,
"menge": 1 "stueckzahl": 1,
"anzahl_vorgabe": 1
}, },
{ {
"artikel": "ROHRKLAMMER 1\" FLACH UND LANG, KPL.", "artikel": "ROHRKLAMMER 1\" FLACH UND LANG, KPL.",
"sivas_id": 825002021, "sivas_id": 825002021,
"farbig": false, "farbig": false,
"menge": 1 "stueckzahl": 1,
"anzahl_vorgabe": 1
}, },
{ {
"artikel": "DURCHSTECKANKER HST M12X115X20", "artikel": "DURCHSTECKANKER HST M12X115X20",
"sivas_id": 922021003, "sivas_id": 922021003,
"farbig": false, "farbig": false,
"menge": 1 "stueckzahl": 1,
"anzahl_vorgabe": 1
} }
], ],
"konfigurationen": [ "konfigurationen": [
@@ -162,17 +184,17 @@
"oben": [ "oben": [
{ {
"artikel": "SPANNPRATZE SELBSTSICHERND KPL.", "artikel": "SPANNPRATZE SELBSTSICHERND KPL.",
"menge": 1 "anzahl": 1
}, },
{ {
"artikel": "Schraubenset", "artikel": "Schraubenset",
"menge": 1 "anzahl": 1
} }
], ],
"unten": [ "unten": [
{ {
"artikel": "ROHRKLAMMER 1\" KPL. VERTIKAL", "artikel": "ROHRKLAMMER 1\" KPL. VERTIKAL",
"menge": 2 "anzahl": 2
} }
] ]
}, },
@@ -184,13 +206,13 @@
"oben": [ "oben": [
{ {
"artikel": "DURCHSTECKANKER HST M12X115X20", "artikel": "DURCHSTECKANKER HST M12X115X20",
"menge": 2 "anzahl": 2
} }
], ],
"unten": [ "unten": [
{ {
"artikel": "ROHRKLAMMER 1\" T-VERBINDUNG KPL.", "artikel": "ROHRKLAMMER 1\" T-VERBINDUNG KPL.",
"menge": 1 "anzahl": 1
} }
] ]
} }
@@ -200,7 +222,7 @@
"id": "Saeulen", "id": "Saeulen",
"titel": "Saeulen", "titel": "Saeulen",
"teileart": "Geruest Saeule", "teileart": "Geruest Saeule",
"dummy": "R2-Saeule_dummy.dwg", "dummy": "821006051.dwg",
"attribute": { "attribute": {
"LAENGE": { "LAENGE": {
"typ": "number", "typ": "number",
@@ -239,31 +261,32 @@
"artikel": "BODENSÄULE R 2\" 60,3 MIT FUSSPLATTE", "artikel": "BODENSÄULE R 2\" 60,3 MIT FUSSPLATTE",
"sivas_id": 821006051, "sivas_id": 821006051,
"farbig": true, "farbig": true,
"menge": 1 "stueckzahl": 1
}, },
{ {
"artikel": "CAD - BODENSÄULE R 2\" - DURCHSTECKANKER KPL.", "artikel": "CAD - BODENSÄULE R 2\" - DURCHSTECKANKER KPL.",
"sivas_id": 821004201, "sivas_id": 821004201,
"farbig": false, "farbig": false,
"menge": 1 "stueckzahl": 1
} }
] ]
}, },
{ {
"name": "R 1\"", "name": "R 1\"",
"teileart": "Geruest Saeule 1 Zoll", "teileart": "Geruest Saeule 1 Zoll",
"dummy": "821004200.dwg",
"teile": [ "teile": [
{ {
"artikel": "ROHR R 1\" 33,7 x 2,6", "artikel": "ROHR R 1\" 33,7 x 2,6",
"sivas_id": 821006026, "sivas_id": 821006026,
"farbig": true, "farbig": true,
"menge": 1 "stueckzahl": 1
}, },
{ {
"artikel": "CAD - BODENSÄULE R 1\" - BODENPLATTE KPL.", "artikel": "CAD - BODENSÄULE R 1\" - BODENPLATTE KPL.",
"sivas_id": 821004200, "sivas_id": 821004200,
"farbig": false, "farbig": false,
"menge": 1 "stueckzahl": 1
} }
] ]
} }
@@ -273,67 +296,78 @@
"artikel": "KLEMMRING MIT MUFFE EINFACH KPL.", "artikel": "KLEMMRING MIT MUFFE EINFACH KPL.",
"sivas_id": 825002019, "sivas_id": 825002019,
"farbig": false, "farbig": false,
"menge": 2 "stueckzahl": 1,
"anzahl_vorgabe": 2
}, },
{ {
"artikel": "KLEMMRING MIT MUFFE DOPPELT 90 Grad, KPL.", "artikel": "KLEMMRING MIT MUFFE DOPPELT 90 Grad, KPL.",
"sivas_id": 825002009, "sivas_id": 825002009,
"farbig": false, "farbig": false,
"menge": 2 "stueckzahl": 1,
"anzahl_vorgabe": 2
}, },
{ {
"artikel": "KLEMMRING MIT MUFFE DOPPELT 180 Grad, KPL.", "artikel": "KLEMMRING MIT MUFFE DOPPELT 180 Grad, KPL.",
"sivas_id": 825002008, "sivas_id": 825002008,
"farbig": false, "farbig": false,
"menge": 2 "stueckzahl": 1,
"anzahl_vorgabe": 2
}, },
{ {
"artikel": "KLEMMRING M. MUFFE DREIFACH 90 Grad/180 Grad KPL.", "artikel": "KLEMMRING M. MUFFE DREIFACH 90 Grad/180 Grad KPL.",
"sivas_id": 825002007, "sivas_id": 825002007,
"farbig": false, "farbig": false,
"menge": 2 "stueckzahl": 1,
"anzahl_vorgabe": 2
}, },
{ {
"artikel": "KLEMMRING MIT LASCHE KPL. ZUSAMMENBAUZEICHNUNG", "artikel": "KLEMMRING MIT LASCHE KPL. ZUSAMMENBAUZEICHNUNG",
"sivas_id": 825002020, "sivas_id": 825002020,
"farbig": false, "farbig": false,
"menge": 2 "stueckzahl": 1,
"anzahl_vorgabe": 2
}, },
{ {
"artikel": "QUERSCHELLE F. 1\" UND 2\" ROHR GESCHW./VZ. M. 4X M10X30 KPL.", "artikel": "QUERSCHELLE F. 1\" UND 2\" ROHR GESCHW./VZ. M. 4X M10X30 KPL.",
"sivas_id": 825002022, "sivas_id": 825002022,
"farbig": false, "farbig": false,
"menge": 2 "stueckzahl": 1,
"anzahl_vorgabe": 2
}, },
{ {
"artikel": "KREUZSCHELLE F. 2\" UND 1\" ROHR SCHWENKBAR 360 Grad", "artikel": "KREUZSCHELLE F. 2\" UND 1\" ROHR SCHWENKBAR 360 Grad",
"sivas_id": 922083009, "sivas_id": 922083009,
"farbig": false, "farbig": false,
"menge": 2 "stueckzahl": 1,
"anzahl_vorgabe": 2
}, },
{ {
"artikel": "HALTEARM FÜR BODENSÄULE R 2\" 1-ARMIG KPL.", "artikel": "HALTEARM FÜR BODENSÄULE R 2\" 1-ARMIG KPL.",
"sivas_id": 821004051, "sivas_id": 821004051,
"farbig": true, "farbig": true,
"menge": 1 "stueckzahl": 1,
"anzahl_vorgabe": 1
}, },
{ {
"artikel": "HALTEARM FÜR BODENSÄULE R 2\" 2-ARMIG 90 Grad KPL.", "artikel": "HALTEARM FÜR BODENSÄULE R 2\" 2-ARMIG 90 Grad KPL.",
"sivas_id": 821004054, "sivas_id": 821004054,
"farbig": true, "farbig": true,
"menge": 1 "stueckzahl": 1,
"anzahl_vorgabe": 1
}, },
{ {
"artikel": "HALTEARM FÜR BODENSÄULE R 2\" 2-ARMIG 180 Grad KPL.", "artikel": "HALTEARM FÜR BODENSÄULE R 2\" 2-ARMIG 180 Grad KPL.",
"sivas_id": 821004052, "sivas_id": 821004052,
"farbig": true, "farbig": true,
"menge": 1 "stueckzahl": 1,
"anzahl_vorgabe": 1
}, },
{ {
"artikel": "HALTEARM FÜR BODENSÄULE R 2\" 3-ARMIG KPL.", "artikel": "HALTEARM FÜR BODENSÄULE R 2\" 3-ARMIG KPL.",
"sivas_id": 821004053, "sivas_id": 821004053,
"farbig": true, "farbig": true,
"menge": 1 "stueckzahl": 1,
"anzahl_vorgabe": 1
} }
], ],
"konfigurationen": [ "konfigurationen": [
@@ -353,7 +387,7 @@
"oben": [ "oben": [
{ {
"artikel": "KLEMMRING MIT MUFFE EINFACH KPL.", "artikel": "KLEMMRING MIT MUFFE EINFACH KPL.",
"menge": 2 "anzahl": 2
} }
], ],
"unten": [] "unten": []
@@ -366,13 +400,13 @@
"oben": [ "oben": [
{ {
"artikel": "KLEMMRING MIT MUFFE DOPPELT 90 Grad, KPL.", "artikel": "KLEMMRING MIT MUFFE DOPPELT 90 Grad, KPL.",
"menge": 2 "anzahl": 2
} }
], ],
"unten": [ "unten": [
{ {
"artikel": "QUERSCHELLE F. 1\" UND 2\" ROHR GESCHW./VZ. M. 4X M10X30 KPL.", "artikel": "QUERSCHELLE F. 1\" UND 2\" ROHR GESCHW./VZ. M. 4X M10X30 KPL.",
"menge": 2 "anzahl": 2
} }
] ]
} }
@@ -386,45 +420,49 @@
"geometrie_varianten": [ "geometrie_varianten": [
{ {
"name": "WANDFLANSCH EINZELTEIL", "name": "WANDFLANSCH EINZELTEIL",
"dummy": "821006031.dwg",
"teile": [ "teile": [
{ {
"artikel": "WANDFLANSCH EINZELTEIL", "artikel": "WANDFLANSCH EINZELTEIL",
"sivas_id": 821006031, "sivas_id": 821006031,
"farbig": false, "farbig": false,
"menge": 1 "stueckzahl": 1
} }
] ]
}, },
{ {
"name": "WINKEL 60X60X6X60", "name": "WINKEL 60X60X6X60",
"dummy": "821006042.dwg",
"teile": [ "teile": [
{ {
"artikel": "WINKEL 60X60X6X60", "artikel": "WINKEL 60X60X6X60",
"sivas_id": 821006042, "sivas_id": 821006042,
"farbig": false, "farbig": false,
"menge": 1 "stueckzahl": 1
} }
] ]
}, },
{ {
"name": "WINKEL 60X60X6X300", "name": "WINKEL 60X60X6X300",
"dummy": "821006043.dwg",
"teile": [ "teile": [
{ {
"artikel": "WINKEL 60X60X6X300", "artikel": "WINKEL 60X60X6X300",
"sivas_id": 821006043, "sivas_id": 821006043,
"farbig": false, "farbig": false,
"menge": 1 "stueckzahl": 1
} }
] ]
}, },
{ {
"name": "ROHRSCHELLE 1\" OBERTEIL", "name": "ROHRSCHELLE 1\" OBERTEIL",
"dummy": "825006009.dwg",
"teile": [ "teile": [
{ {
"artikel": "ROHRSCHELLE 1\" OBERTEIL", "artikel": "ROHRSCHELLE 1\" OBERTEIL",
"sivas_id": 825006009, "sivas_id": 825006009,
"farbig": false, "farbig": false,
"menge": 1 "stueckzahl": 1
} }
] ]
} }
@@ -432,29 +470,31 @@
"anbaugruppen": [ "anbaugruppen": [
{ {
"name": "Nylondübel 12x60 inkl. Holzschrauben", "name": "Nylondübel 12x60 inkl. Holzschrauben",
"anzahl_vorgabe": 2,
"teile": [ "teile": [
{ {
"artikel": "HOLZSCHRAUB,10X70, 6KT DIN 571 VZ", "artikel": "HOLZSCHRAUB,10X70, 6KT DIN 571 VZ",
"sivas_id": 911271027, "sivas_id": 911271027,
"farbig": false, "farbig": false,
"menge": 2 "stueckzahl": 1
}, },
{ {
"artikel": "NYLON - DUEBEL 12X60 (TYP S)", "artikel": "NYLON - DUEBEL 12X60 (TYP S)",
"sivas_id": 922013003, "sivas_id": 922013003,
"farbig": false, "farbig": false,
"menge": 2 "stueckzahl": 1
} }
] ]
}, },
{ {
"name": "HST M12X115X20", "name": "HST M12X115X20",
"anzahl_vorgabe": 2,
"teile": [ "teile": [
{ {
"artikel": "DURCHSTECKANKER HST M12X115X20 WANDABH.", "artikel": "DURCHSTECKANKER HST M12X115X20 WANDABH.",
"sivas_id": 922021003, "sivas_id": 922021003,
"farbig": false, "farbig": false,
"menge": 2 "stueckzahl": 1
} }
] ]
} }
@@ -466,7 +506,7 @@
"oben": [ "oben": [
{ {
"artikel": "Nylondübel 12x60 inkl. Holzschrauben", "artikel": "Nylondübel 12x60 inkl. Holzschrauben",
"menge": 1 "anzahl": 2
} }
], ],
"unten": [] "unten": []
@@ -477,203 +517,11 @@
"oben": [ "oben": [
{ {
"artikel": "HST M12X115X20", "artikel": "HST M12X115X20",
"menge": 1 "anzahl": 2
} }
], ],
"unten": [] "unten": []
} }
] ]
},
"Rohr-Gerüst-Träger": {
"id": "Traeger",
"titel": "Traeger",
"teileart": "Geruest Traeger",
"einfuegeart": "linie",
"querstrebe": {
"dummy": "dummy_Strebe_30x4.dwg",
"abstand_max": 500,
"rand_min": 100,
"rand_max": 250
},
"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"
},
"LAENGENABZUGANFANG": {
"typ": "number",
"einheit": "mm",
"vorgabe": 35,
"aktiv": false
},
"LAENGENABZUGENDE": {
"typ": "number",
"einheit": "mm",
"vorgabe": 35,
"aktiv": false
},
"TEILEFARBE": {
"typ": "auswahl",
"optionen": [
"RAL7035",
"RAL7030"
],
"frei_erlaubt": true,
"frei_option": "Individuell"
}
},
"geometrie_varianten": [
{
"name": "Rohr 1\"",
"beschriftung": {
"text": "Rohr 1\"",
"layer": "D-6-BEM"
},
"teileart": "Geruest Traeger",
"layer": "D-6",
"teile": [
{
"artikel": "ROHR R 1\"",
"sivas_id": 821006026,
"farbig": true,
"menge": 1
}
]
},
{
"name": "Rohr 1\" mit Muffe",
"beschriftung": {
"text": "Rohr 1\"",
"layer": "D-6-BEM"
},
"mit_muffe": true,
"teileart": "Geruest Traeger",
"layer": "D-6",
"teile": [
{
"artikel": "ROHR R 1\" mit Muffe",
"sivas_id": 825004000,
"farbig": true,
"menge": 1
}
]
},
{
"name": "DRT 80 1\"",
"beschriftung": {
"text": "DRT 80",
"layer": "D-1-BEM"
},
"teileart": "Geruest Traeger",
"layer": "D-1",
"teile": [
{
"artikel": "DRT DOPPELROHRTRAEGER 80 1\"",
"sivas_id": 825084000,
"farbig": true,
"menge": 1
}
]
},
{
"name": "DRT 80 1\" mit 2 Muffen",
"beschriftung": {
"text": "DRT 80",
"layer": "D-1-BEM"
},
"mit_muffe": true,
"teileart": "Geruest Traeger",
"layer": "D-1",
"teile": [
{
"artikel": "DRT DOPPELROHRTRAEGER 80 1\" mit 2 Muffen",
"sivas_id": 825084007,
"farbig": true,
"menge": 1
}
]
},
{
"name": "DRT 114 1\"",
"beschriftung": {
"text": "DRT 114",
"layer": "D-3-BEM"
},
"teileart": "Geruest Traeger",
"layer": "D-3",
"teile": [
{
"artikel": "DRT DOPPELROHRTRAEGER 114 1\"",
"sivas_id": 825104000,
"farbig": true,
"menge": 1
}
]
},
{
"name": "DRT 114 1\" mit 2 Muffen",
"beschriftung": {
"text": "DRT 114",
"layer": "D-3-BEM"
},
"mit_muffe": true,
"teileart": "Geruest Traeger",
"layer": "D-3",
"teile": [
{
"artikel": "DRT DOPPELROHRTRAEGER 114 1\" mit 2 Muffen",
"sivas_id": 825104007,
"farbig": true,
"menge": 1
}
]
},
{
"name": "RT 80/80 1\"",
"beschriftung": {
"text": "RT 80/80",
"layer": "D-5-BEM"
},
"teileart": "Geruest Traeger",
"layer": "D-5",
"teile": [
{
"artikel": "RT ROHRTRAEGER 80/80 1\"",
"sivas_id": 825144000,
"farbig": true,
"menge": 1
}
]
},
{
"name": "RT 80/80 1\" mit 2 Muffen",
"beschriftung": {
"text": "RT 80/80",
"layer": "D-5-BEM"
},
"mit_muffe": true,
"teileart": "Geruest Traeger",
"layer": "D-5",
"teile": [
{
"artikel": "RT ROHRTRAEGER 80/80 1\" mit 2 Muffen",
"sivas_id": 825144007,
"farbig": true,
"menge": 1
}
]
}
]
} }
} }
+193
View File
@@ -0,0 +1,193 @@
{
"Rohr-Gerüst-Träger": {
"id": "Traeger",
"titel": "Traeger",
"teileart": "Geruest Traeger",
"querstrebe": {
"dummy": "dummy_Strebe_30x4.dwg",
"abstand_max": 500,
"rand_min": 100,
"rand_max": 250
},
"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"
},
"LAENGENABZUGANFANG": {
"typ": "number",
"einheit": "mm",
"vorgabe": 35,
"aktiv": false
},
"LAENGENABZUGENDE": {
"typ": "number",
"einheit": "mm",
"vorgabe": 35,
"aktiv": false
},
"TEILEFARBE": {
"typ": "auswahl",
"optionen": [
"RAL7035",
"RAL7030"
],
"frei_erlaubt": true,
"frei_option": "Individuell"
}
},
"geometrie_varianten": [
{
"name": "Rohr 1\"",
"beschriftung": {
"text": "Rohr 1\"",
"layer": "D-6-BEM"
},
"teileart": "Geruest Traeger",
"layer": "D-6",
"teile": [
{
"artikel": "ROHR R 1\"",
"sivas_id": 821006026,
"farbig": true,
"stueckzahl": 1
}
]
},
{
"name": "Rohr 1\" mit Muffe",
"beschriftung": {
"text": "Rohr 1\"",
"layer": "D-6-BEM"
},
"mit_muffe": true,
"teileart": "Geruest Traeger",
"layer": "D-6",
"teile": [
{
"artikel": "ROHR R 1\" mit Muffe",
"sivas_id": 825004000,
"farbig": true,
"stueckzahl": 1
}
]
},
{
"name": "DRT 80 1\"",
"beschriftung": {
"text": "DRT 80",
"layer": "D-1-BEM"
},
"teileart": "Geruest Traeger",
"layer": "D-1",
"teile": [
{
"artikel": "DRT DOPPELROHRTRAEGER 80 1\"",
"sivas_id": 825084000,
"farbig": true,
"stueckzahl": 1
}
]
},
{
"name": "DRT 80 1\" mit 2 Muffen",
"beschriftung": {
"text": "DRT 80",
"layer": "D-1-BEM"
},
"mit_muffe": true,
"teileart": "Geruest Traeger",
"layer": "D-1",
"teile": [
{
"artikel": "DRT DOPPELROHRTRAEGER 80 1\" mit 2 Muffen",
"sivas_id": 825084007,
"farbig": true,
"stueckzahl": 1
}
]
},
{
"name": "DRT 114 1\"",
"beschriftung": {
"text": "DRT 114",
"layer": "D-3-BEM"
},
"teileart": "Geruest Traeger",
"layer": "D-3",
"teile": [
{
"artikel": "DRT DOPPELROHRTRAEGER 114 1\"",
"sivas_id": 825104000,
"farbig": true,
"stueckzahl": 1
}
]
},
{
"name": "DRT 114 1\" mit 2 Muffen",
"beschriftung": {
"text": "DRT 114",
"layer": "D-3-BEM"
},
"mit_muffe": true,
"teileart": "Geruest Traeger",
"layer": "D-3",
"teile": [
{
"artikel": "DRT DOPPELROHRTRAEGER 114 1\" mit 2 Muffen",
"sivas_id": 825104007,
"farbig": true,
"stueckzahl": 1
}
]
},
{
"name": "RT 80/80 1\"",
"beschriftung": {
"text": "RT 80/80",
"layer": "D-5-BEM"
},
"teileart": "Geruest Traeger",
"layer": "D-5",
"teile": [
{
"artikel": "RT ROHRTRAEGER 80/80 1\"",
"sivas_id": 825144000,
"farbig": true,
"stueckzahl": 1
}
]
},
{
"name": "RT 80/80 1\" mit 3 Muffen",
"beschriftung": {
"text": "RT 80/80",
"layer": "D-5-BEM"
},
"mit_muffe": true,
"teileart": "Geruest Traeger",
"layer": "D-5",
"teile": [
{
"artikel": "RT ROHRTRAEGER 80/80 1\" mit 3 Muffen",
"sivas_id": 825144007,
"farbig": true,
"stueckzahl": 1
}
]
}
]
}
}
+2 -1
View File
@@ -1003,13 +1003,14 @@
"gr-fehler-baugruppe": "\nGeruest: Baugruppe '%1' steht nicht in der Datendatei.", "gr-fehler-baugruppe": "\nGeruest: Baugruppe '%1' steht nicht in der Datendatei.",
"gr-fehler-keine-varianten": "\nGeruest: Baugruppe '%1' hat keine Geometrie-Varianten.", "gr-fehler-keine-varianten": "\nGeruest: Baugruppe '%1' hat keine Geometrie-Varianten.",
"gr-fehler-dummy": "\nGeruest: Dummy-Baugruppe nicht gefunden: %1", "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.", "gr-fehler-dcl": "Dialog geruest.dcl konnte nicht geladen werden.",
"gr-dlg-kopf": "%1 konfigurieren", "gr-dlg-kopf": "%1 konfigurieren",
"gr-alert-laenge": "Laenge ungueltig: '%1' mm. Erlaubt: %2 bis %3 mm.", "gr-alert-laenge": "Laenge ungueltig: '%1' mm. Erlaubt: %2 bis %3 mm.",
"gr-prompt-einfuegepunkt": "\nEinfuegepunkt waehlen: ", "gr-prompt-einfuegepunkt": "\nEinfuegepunkt waehlen: ",
"gr-abgebrochen": "\nAbgebrochen.", "gr-abgebrochen": "\nAbgebrochen.",
"gr-fertig": "\nGeruest-Baugruppe '%1' eingefuegt (Block %2).", "gr-fertig": "\nGeruest-Baugruppe '%1' eingefuegt (Block %2).",
"gr-alert-menge": "Ungueltige Stueckzahl. Erlaubt ist eine ganze Zahl ab 1; ein leeres Feld uebernimmt den Vorgabewert.", "gr-alert-menge": "Ungueltige Anzahl. Erlaubt ist eine ganze Zahl ab 1; ein leeres Feld uebernimmt den Vorgabewert.",
"gr-position-oben": "oben", "gr-position-oben": "oben",
"gr-position-unten": "unten", "gr-position-unten": "unten",
"gr-konfig-keine": "<keine>", "gr-konfig-keine": "<keine>",
+1
View File
@@ -1003,6 +1003,7 @@
"gr-fehler-baugruppe": "\nScaffold: assembly '%1' is not in the data file.", "gr-fehler-baugruppe": "\nScaffold: assembly '%1' is not in the data file.",
"gr-fehler-keine-varianten": "\nScaffold: assembly '%1' has no geometry variants.", "gr-fehler-keine-varianten": "\nScaffold: assembly '%1' has no geometry variants.",
"gr-fehler-dummy": "\nScaffold: dummy assembly not found: %1", "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.", "gr-fehler-dcl": "Dialog geruest.dcl could not be loaded.",
"gr-dlg-kopf": "Configure %1", "gr-dlg-kopf": "Configure %1",
"gr-alert-laenge": "Invalid length: '%1' mm. Allowed: %2 to %3 mm.", "gr-alert-laenge": "Invalid length: '%1' mm. Allowed: %2 to %3 mm.",
+74 -30
View File
@@ -754,9 +754,9 @@
(if (findfile _datei) (if (findfile _datei)
(progn (progn
(setq _daten (ssg-json-laden _datei)) (setq _daten (ssg-json-laden _datei))
;; Vier Baugruppen: Rohrabhaenger, Saeulen (1 und 2 Zoll ;; Drei Bereiche: Rohrabhaenger, Saeulen (1 und 2 Zoll zusammengefuehrt),
;; zusammengefuehrt), Wandbefestigung, Rohr-Geruest-Traeger ;; Wandbefestigung. Die Traeger liegen in geruest_traeger.json.
(tu-eq "json/geruest-baugruppen" 4 (length _daten)) (tu-eq "json/geruest-baugruppen" 3 (length _daten))
;; Baugruppe ueber das ASCII-Feld "id" finden (aeusserer Schluessel ;; Baugruppe ueber das ASCII-Feld "id" finden (aeusserer Schluessel
;; traegt Umlaute bzw. Anfuehrungszeichen) ;; traegt Umlaute bzw. Anfuehrungszeichen)
(setq _bg nil) (setq _bg nil)
@@ -768,7 +768,7 @@
(progn (progn
(setq _var (ssg-json-get _bg "geometrie_varianten")) (setq _var (ssg-json-get _bg "geometrie_varianten"))
(setq _anb (ssg-json-get _bg "anbaugruppen")) (setq _anb (ssg-json-get _bg "anbaugruppen"))
(tu-eq "json/geruest-varianten" 3 (length _var)) (tu-eq "json/geruest-varianten" 4 (length _var))
(tu-eq "json/geruest-teileart" "Geruest Rohrabhaenger" (tu-eq "json/geruest-teileart" "Geruest Rohrabhaenger"
(ssg-json-get _bg "teileart")) (ssg-json-get _bg "teileart"))
(tu-eq "json/geruest-dummy" "Rohrabhaenger_dummy.dwg" (tu-eq "json/geruest-dummy" "Rohrabhaenger_dummy.dwg"
@@ -824,24 +824,24 @@
(tu-eq "geruest-id-string/str" "0_B10071" (geruest-id-string "0_B10071")) (tu-eq "geruest-id-string/str" "0_B10071" (geruest-id-string "0_B10071"))
(tu-eq "geruest-id-string/nil" nil (geruest-id-string nil)) (tu-eq "geruest-id-string/nil" nil (geruest-id-string nil))
;; Einzelteil mit menge 2 -> Artikelnummer zweimal (ARTINR-Regel) ;; Einzelteil mit stueckzahl 2 -> Artikelnummer zweimal (ARTINR-Regel)
(setq _eintrag (ssg-json-parse (setq _eintrag (ssg-json-parse
"{\"artikel\": \"X\", \"sivas_id\": 825002019, \"menge\": 2}")) "{\"artikel\": \"X\", \"sivas_id\": 825002019, \"stueckzahl\": 2}"))
(tu-eq "geruest-artnr/menge2" '("825002019" "825002019") (tu-eq "geruest-artnr/stueckzahl2" '("825002019" "825002019")
(geruest-artikelnummern _eintrag)) (geruest-artikelnummern _eintrag))
(tu-eq "geruest-name/artikel" "X" (geruest-eintrag-name _eintrag)) (tu-eq "geruest-name/artikel" "X" (geruest-eintrag-name _eintrag))
;; Benannte Gruppe -> teile rekursiv aufloesen, Mengen beachten ;; Benannte Gruppe -> teile rekursiv aufloesen, Mengen beachten
(setq _gruppe (ssg-json-parse (setq _gruppe (ssg-json-parse
(strcat "{\"name\": \"Schraubenset\", \"teile\": [" (strcat "{\"name\": \"Schraubenset\", \"teile\": ["
"{\"artikel\": \"A\", \"sivas_id\": 111, \"menge\": 1}," "{\"artikel\": \"A\", \"sivas_id\": 111, \"stueckzahl\": 1},"
"{\"artikel\": \"B\", \"sivas_id\": 222, \"menge\": 2}]}"))) "{\"artikel\": \"B\", \"sivas_id\": 222, \"stueckzahl\": 2}]}")))
(tu-eq "geruest-artnr/gruppe" '("111" "222" "222") (tu-eq "geruest-artnr/gruppe" '("111" "222" "222")
(geruest-artikelnummern _gruppe)) (geruest-artikelnummern _gruppe))
(tu-eq "geruest-name/gruppe" "Schraubenset" (geruest-eintrag-name _gruppe)) (tu-eq "geruest-name/gruppe" "Schraubenset" (geruest-eintrag-name _gruppe))
;; Fehlendes menge-Feld -> 1 ;; Fehlendes stueckzahl-Feld -> 1
(tu-eq "geruest-artnr/ohne-menge" '("333") (tu-eq "geruest-artnr/ohne-stueckzahl" '("333")
(geruest-artikelnummern (geruest-artikelnummern
(ssg-json-parse "{\"artikel\": \"C\", \"sivas_id\": 333}"))) (ssg-json-parse "{\"artikel\": \"C\", \"sivas_id\": 333}")))
@@ -859,21 +859,62 @@
(tu-eq "geruest-teile-dwgs/vorhanden" (list _pfad) (tu-eq "geruest-teile-dwgs/vorhanden" (list _pfad)
(geruest-teile-dwgs '("825002019" "999999999" "825002019"))) (geruest-teile-dwgs '("825002019" "999999999" "825002019")))
) )
;; --- Anzahl-Vorgabe (Dialogfeld) vs. stueckzahl (wirklich geschrieben) ---
(tu-eq "geruest-anzahl-vorgabe/gruppe" 2
(geruest-anzahl-vorgabe (ssg-json-parse
"{\"name\": \"G\", \"anzahl_vorgabe\": 2, \"teile\": [{\"sivas_id\": 1, \"stueckzahl\": 1}]}")))
;; stueckzahl ist KEINE Vorgabe fuer das Dialogfeld
(tu-eq "geruest-anzahl-vorgabe/stueckzahl-zaehlt-nicht" 1
(geruest-anzahl-vorgabe (ssg-json-parse "{\"sivas_id\": 1, \"stueckzahl\": 3}")))
(tu-eq "geruest-anzahl-vorgabe/ohne" 1
(geruest-anzahl-vorgabe (ssg-json-parse "{\"name\": \"G\", \"teile\": []}")))
;; anzahl_vorgabe bestimmt nur die Vorbelegung, nicht den Satzinhalt:
;; 3 Saetze a (1 Schraube + 1 Duebel) = 6 Nummern
(tu-eq "geruest-artikelnummern-n/anzahl-vorgabe" '("1" "2" "1" "2" "1" "2")
(geruest-artikelnummern-n (ssg-json-parse
"{\"name\": \"G\", \"anzahl_vorgabe\": 2, \"teile\": [{\"sivas_id\": 1, \"stueckzahl\": 1}, {\"sivas_id\": 2, \"stueckzahl\": 1}]}")
3))
;; Einzelteil-Anbauteil: Anzahl x stueckzahl
(tu-eq "geruest-artikelnummern-n/einzelteil-stueckzahl" '("7" "7" "7" "7")
(geruest-artikelnummern-n (ssg-json-parse
"{\"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")))
;; Dummy-Wahl: Variante gewinnt, fehlende Varianten-DWG -> Baugruppe
(setq _pfad (geruest-dummy-pfad "821006036.dwg"))
(if (and _pfad (findfile _pfad))
(tu-eq "geruest-dummy-wahl/variante" "821006036.dwg"
(car (geruest-dummy-wahl
(ssg-json-parse "{\"dummy\": \"821006036.dwg\"}")
(ssg-json-parse "{\"dummy\": \"basis.dwg\"}"))))
)
(tu-eq "geruest-dummy-wahl/fehlt" "basis.dwg"
(car (geruest-dummy-wahl
(ssg-json-parse "{\"dummy\": \"gibtsnicht_999.dwg\"}")
(ssg-json-parse "{\"dummy\": \"basis.dwg\"}"))))
(tu-eq "geruest-dummy-wahl/ohne" "basis.dwg"
(car (geruest-dummy-wahl
(ssg-json-parse "{\"name\": \"X\"}")
(ssg-json-parse "{\"dummy\": \"basis.dwg\"}"))))
;; --- Mengenfeld --- ;; --- Mengenfeld ---
(tu-eq "geruest-zahl-p/ziffern" T (geruest-zahl-p "12")) (tu-eq "geruest-zahl-p/ziffern" T (geruest-zahl-p "12"))
(tu-eq "geruest-zahl-p/text" nil (geruest-zahl-p "1a")) (tu-eq "geruest-zahl-p/text" nil (geruest-zahl-p "1a"))
(tu-eq "geruest-zahl-p/leer" nil (geruest-zahl-p "")) (tu-eq "geruest-zahl-p/leer" nil (geruest-zahl-p ""))
;; Leeres Feld uebernimmt die JSON-Vorgabe, ungueltiges liefert nil ;; Leeres Feld uebernimmt die JSON-Vorgabe, ungueltiges liefert nil
(tu-eq "geruest-menge-wert/leer" 2 (geruest-menge-wert "" 2)) (tu-eq "geruest-anzahl-wert/leer" 2 (geruest-anzahl-wert "" 2))
(tu-eq "geruest-menge-wert/zahl" 5 (geruest-menge-wert "5" 2)) (tu-eq "geruest-anzahl-wert/zahl" 5 (geruest-anzahl-wert "5" 2))
(tu-eq "geruest-menge-wert/null" nil (geruest-menge-wert "0" 2)) (tu-eq "geruest-anzahl-wert/null" nil (geruest-anzahl-wert "0" 2))
(tu-eq "geruest-menge-wert/text" nil (geruest-menge-wert "abc" 2)) (tu-eq "geruest-anzahl-wert/text" nil (geruest-anzahl-wert "abc" 2))
(tu-eq "geruest-menge-wert/negativ" nil (geruest-menge-wert "-3" 2)) (tu-eq "geruest-anzahl-wert/negativ" nil (geruest-anzahl-wert "-3" 2))
;; --- Stueckzahl ersetzt die JSON-Menge (Einzelteil) --- ;; --- Einzelteil: Anzahl (Dialog) x stueckzahl (JSON, hier 2) ---
(tu-eq "geruest-artnr-n/einzelteil" '("825002019" "825002019" "825002019") (tu-eq "geruest-artnr-n/einzelteil" 6
(geruest-artikelnummern-n _eintrag 3)) (length (geruest-artikelnummern-n _eintrag 3)))
;; --- Gruppe: ganzes Set n-mal, Mengen INNERHALB bleiben erhalten --- ;; --- Gruppe: ganzes Set n-mal, Mengen INNERHALB bleiben erhalten ---
(tu-eq "geruest-artnr-n/gruppe" '("111" "222" "222" "111" "222" "222") (tu-eq "geruest-artnr-n/gruppe" '("111" "222" "222" "111" "222" "222")
(geruest-artikelnummern-n _gruppe 2)) (geruest-artikelnummern-n _gruppe 2))
@@ -894,7 +935,7 @@
(setq _teile (ssg-json-parse (setq _teile (ssg-json-parse
(strcat "{\"name\": \"Set\", \"farbig\": true, \"teile\": [" (strcat "{\"name\": \"Set\", \"farbig\": true, \"teile\": ["
"{\"artikel\": \"A\", \"sivas_id\": 111}," "{\"artikel\": \"A\", \"sivas_id\": 111},"
"{\"artikel\": \"B\", \"sivas_id\": 222, \"menge\": 2}]}"))) "{\"artikel\": \"B\", \"sivas_id\": 222, \"stueckzahl\": 2}]}")))
(tu-eq "geruest-paare/gruppe-erbt" '(("111" . T) ("222" . T) ("222" . T)) (tu-eq "geruest-paare/gruppe-erbt" '(("111" . T) ("222" . T) ("222" . T))
(geruest-teile-paare _teile nil)) (geruest-teile-paare _teile nil))
(tu-eq "geruest-paare-n/gruppe" 6 (length (geruest-teile-paare-n _teile 2))) (tu-eq "geruest-paare-n/gruppe" 6 (length (geruest-teile-paare-n _teile 2)))
@@ -934,8 +975,8 @@
;; die ganze Konfiguration verworfen) ;; die ganze Konfiguration verworfen)
(setq _konfig (ssg-json-parse (setq _konfig (ssg-json-parse
(strcat "{\"name\": \"K1\", \"oben\": [" (strcat "{\"name\": \"K1\", \"oben\": ["
"{\"artikel\": \"Schraubenset\", \"menge\": 3}," "{\"artikel\": \"Schraubenset\", \"anzahl\": 3},"
"{\"artikel\": \"unbekannt\", \"menge\": 1}]}"))) "{\"artikel\": \"unbekannt\", \"anzahl\": 1}]}")))
(tu-eq "geruest-konfig-position" '(nil 3) (tu-eq "geruest-konfig-position" '(nil 3)
(geruest-konfig-position _konfig "oben" _teile)) (geruest-konfig-position _konfig "oben" _teile))
@@ -1172,18 +1213,21 @@
_bgtest "LAENGENABZUGENDE" "aktiv")) _bgtest "LAENGENABZUGENDE" "aktiv"))
;; --- Rohr-Geruest-Traeger in der echten Datendatei --- ;; --- Rohr-Geruest-Traeger in der echten Datendatei ---
;; Eigener Dialog: im Bereichs-Dropdown von GERUEST darf er fehlen, ;; Eigene Datei data/json/geruest_traeger.json: im Bereichs-Dropdown von
;; ueber geruest-baugruppe muss er aber auffindbar sein. ;; GERUEST darf er nicht auftauchen, ueber geruest-traeger-daten muss er
;; auffindbar sein.
(setq _rec nil) (setq _rec nil)
(foreach _e (geruest-baugruppen-liste) (foreach _e (geruest-baugruppen-liste)
(if (equal (car _e) "Traeger") (setq _rec T))) (if (equal (car _e) "Traeger") (setq _rec T)))
(tu-nil "geruest/traeger-nicht-im-dropdown" _rec) (tu-nil "geruest/traeger-nicht-im-dropdown" _rec)
(setq _traeger (geruest-baugruppe "Traeger")) (tu-true "geruest/traeger-datei"
(findfile (geruest-json-pfad "geruest_traeger.json")))
(setq _traeger (geruest-baugruppe "Traeger" (geruest-traeger-daten)))
(tu-true "geruest/traeger-vorhanden" _traeger) (tu-true "geruest/traeger-vorhanden" _traeger)
(tu-nil "geruest/traeger-nicht-in-geruest-json"
(geruest-baugruppe "Traeger" (geruest-daten)))
(if _traeger (if _traeger
(progn (progn
(tu-eq "geruest/traeger-einfuegeart" "linie"
(ssg-json-get _traeger "einfuegeart"))
(tu-eq "geruest/traeger-varianten-artikel" 0 (tu-eq "geruest/traeger-varianten-artikel" 0
(tu-geruest-artikel-unvollstaendig (tu-geruest-artikel-unvollstaendig
(ssg-json-get _traeger "geometrie_varianten"))) (ssg-json-get _traeger "geometrie_varianten")))
@@ -1236,7 +1280,7 @@
(cons "laenge" "2000") (cons "laenge" "2000")
(cons "teilefarbe" "RAL 7035 Lichtgrau") (cons "teilefarbe" "RAL 7035 Lichtgrau")
(cons "oben" (list (list (cons "artikel" "ROHRKLAMMER 1\" KPL. VERTIKAL") (cons "oben" (list (list (cons "artikel" "ROHRKLAMMER 1\" KPL. VERTIKAL")
(cons "menge" 2)))) (cons "anzahl" 2))))
(cons "unten" nil))) (cons "unten" nil)))
(setq _pfad (vl-filename-mktemp "grtest" nil ".json")) (setq _pfad (vl-filename-mktemp "grtest" nil ".json"))
(setq _f (open _pfad "w")) (setq _f (open _pfad "w"))
@@ -1256,8 +1300,8 @@
(ssg-json-get _zurueck "teilefarbe")) (ssg-json-get _zurueck "teilefarbe"))
(tu-eq "geruest-schreiber/oben-artikel" "ROHRKLAMMER 1\" KPL. VERTIKAL" (tu-eq "geruest-schreiber/oben-artikel" "ROHRKLAMMER 1\" KPL. VERTIKAL"
(ssg-json-get (car (ssg-json-get _zurueck "oben")) "artikel")) (ssg-json-get (car (ssg-json-get _zurueck "oben")) "artikel"))
(tu-eq "geruest-schreiber/oben-menge" 2 (tu-eq "geruest-schreiber/oben-anzahl" 2
(ssg-json-get (car (ssg-json-get _zurueck "oben")) "menge")) (ssg-json-get (car (ssg-json-get _zurueck "oben")) "anzahl"))
(tu-eq "geruest-schreiber/unten-leer" nil (tu-eq "geruest-schreiber/unten-leer" nil
(ssg-json-get _zurueck "unten")) (ssg-json-get _zurueck "unten"))
) )