[ADD] Geruest: Teile-DWGs (data/geruest/<artnr>.dwg) als Geometrie im GR_-Block; TEILEFARBE als Liste parallel zu ARTINR (Flag farbig in geruest.json), Sivas-Merkmal 108 aus cfg [Sivas]; Menue-Befehle GERUEST_SAEULEN/_ROHRABHAENGER/_WANDBEFESTIGUNG
[FIX] Sivas-Export las nicht existierendes Attribut FARBE
This commit is contained in:
+126
-26
@@ -22,6 +22,16 @@
|
||||
;; die Dummy-DWG einen Tag nicht kennt (ssg-attrib-set-on schreibt nur Tags,
|
||||
;; die als ATTDEF existieren).
|
||||
;;
|
||||
;; Zusaetzlich wird jede ausgewaehlte Artikelnummer (Basis, oben, unten, inkl.
|
||||
;; aufgeloester Gruppen), fuer die data/geruest/<artnr>.dwg existiert, einmal
|
||||
;; bei 0,0,0 mit in den Block eingefuegt (geruest-teile-dwgs) - reine
|
||||
;; Geometrie als visuelle Rueckmeldung, die Attribute bleiben davon unberuehrt.
|
||||
;; Teile ohne DWG werden still uebergangen.
|
||||
;;
|
||||
;; TEILEFARBE ist eine kommagetrennte Liste parallel zu ARTINR: jedes Teil mit
|
||||
;; "farbig": true in geruest.json bekommt die im Dialog gewaehlte Farbe, alle
|
||||
;; anderen einen leeren Eintrag (geruest-teile-paare/geruest-farbliste).
|
||||
;;
|
||||
;; Das GR_-Praefix ist nicht kosmetisch: SSG_BLOCKEDIT haelt jeden Block mit
|
||||
;; TEILEART-Attribut fuer ein Omniflo-Element (SSG_LIB_Commands.lsp). Der
|
||||
;; Doppelklick-Dispatcher erkennt Geruest-Bloecke an diesem Praefix.
|
||||
@@ -179,22 +189,65 @@
|
||||
erg
|
||||
)
|
||||
|
||||
;; Alle Artikelnummern eines Eintrags, jede gemaess "menge" wiederholt.
|
||||
;; Benannte Gruppen ("teile") werden rekursiv aufgeloest.
|
||||
(defun geruest-artikelnummern (eintrag / erg teile)
|
||||
;; Alle Teile eines Eintrags als ((artnr . farbig) ...), jedes gemaess
|
||||
;; "menge" wiederholt. Benannte Gruppen ("teile") werden rekursiv aufgeloest.
|
||||
;; farbig = darf das Teil die Baugruppenfarbe tragen ("farbig" im JSON). Eine
|
||||
;; 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.
|
||||
;; ARTINR und TEILEFARBE entstehen aus DIESEM einen Durchlauf, damit beide
|
||||
;; Listen garantiert gleich lang und gleich sortiert sind.
|
||||
(defun geruest-teile-paare (eintrag erbe / erg teile farbig)
|
||||
(setq erg nil)
|
||||
(setq farbig (if (or erbe (ssg-json-get eintrag "farbig")) T nil))
|
||||
(setq teile (ssg-json-get eintrag "teile"))
|
||||
(if teile
|
||||
(foreach teil teile
|
||||
(setq erg (append erg (geruest-artikelnummern teil)))
|
||||
(setq erg (append erg (geruest-teile-paare teil farbig)))
|
||||
)
|
||||
(setq erg (geruest-wiederholen
|
||||
(geruest-id-string (ssg-json-get eintrag "sivas_id"))
|
||||
(geruest-menge eintrag)))
|
||||
(setq erg (mapcar '(lambda (nr) (cons nr farbig))
|
||||
(geruest-wiederholen
|
||||
(geruest-id-string (ssg-json-get eintrag "sivas_id"))
|
||||
(geruest-menge eintrag))))
|
||||
)
|
||||
erg
|
||||
)
|
||||
|
||||
;; Alle Artikelnummern eines Eintrags, jede gemaess "menge" wiederholt.
|
||||
(defun geruest-artikelnummern (eintrag)
|
||||
(mapcar 'car (geruest-teile-paare eintrag nil))
|
||||
)
|
||||
|
||||
;; TEILEFARBE-Liste zu Teile-Paaren: die Baugruppenfarbe fuer jedes farbige
|
||||
;; Teil, "" fuer alle anderen.
|
||||
(defun geruest-farbliste (paare farbe)
|
||||
(mapcar '(lambda (p) (if (cdr p) farbe "")) paare)
|
||||
)
|
||||
|
||||
;; Liste ohne Duplikate, Reihenfolge des ersten Auftretens bleibt erhalten.
|
||||
(defun geruest-eindeutig (lst / erg)
|
||||
(setq erg nil)
|
||||
(foreach e lst
|
||||
(if (not (member e erg)) (setq erg (cons e erg)))
|
||||
)
|
||||
(reverse erg)
|
||||
)
|
||||
|
||||
;; Teile-DWGs zu einer Liste von Artikelnummern: data/geruest/<artnr>.dwg,
|
||||
;; soweit vorhanden. Jede Nummer nur einmal - alle Teile sitzen bei 0,0,0,
|
||||
;; eine Mehrfach-Stueckzahl waere visuell nicht unterscheidbar. Fehlende
|
||||
;; DWGs werden still uebergangen.
|
||||
(defun geruest-teile-dwgs (artnr-liste / erg pfad)
|
||||
(setq erg nil)
|
||||
(foreach nr (geruest-eindeutig artnr-liste)
|
||||
(if (and nr
|
||||
(setq pfad (geruest-dummy-pfad (strcat nr ".dwg")))
|
||||
(findfile pfad))
|
||||
(setq erg (cons pfad erg))
|
||||
)
|
||||
)
|
||||
(reverse erg)
|
||||
)
|
||||
|
||||
|
||||
;; ============================================================
|
||||
;; DIALOG
|
||||
@@ -239,13 +292,14 @@
|
||||
;; Einzelteil: die Sivas-ID anzahl-mal. Benannte Gruppe ("teile"): das
|
||||
;; komplette Set anzahl-mal - die Mengen INNERHALB des Sets bleiben erhalten
|
||||
;; (ein Schraubenset bleibt 1 Scheibe + 2 Muttern + 1 Schraube je Satz).
|
||||
(defun geruest-artikelnummern-n (eintrag anzahl / teile einmal erg i)
|
||||
(defun geruest-teile-paare-n (eintrag anzahl / teile einmal erg i farbig)
|
||||
(setq teile (ssg-json-get eintrag "teile"))
|
||||
(setq farbig (if (ssg-json-get eintrag "farbig") T nil))
|
||||
(if teile
|
||||
(progn
|
||||
(setq einmal nil)
|
||||
(foreach teil teile
|
||||
(setq einmal (append einmal (geruest-artikelnummern teil)))
|
||||
(setq einmal (append einmal (geruest-teile-paare teil farbig)))
|
||||
)
|
||||
(setq erg nil i 0)
|
||||
(while (< i anzahl)
|
||||
@@ -254,11 +308,16 @@
|
||||
)
|
||||
erg
|
||||
)
|
||||
(geruest-wiederholen
|
||||
(geruest-id-string (ssg-json-get eintrag "sivas_id")) anzahl)
|
||||
(mapcar '(lambda (nr) (cons nr farbig))
|
||||
(geruest-wiederholen
|
||||
(geruest-id-string (ssg-json-get eintrag "sivas_id")) anzahl))
|
||||
)
|
||||
)
|
||||
|
||||
(defun geruest-artikelnummern-n (eintrag anzahl)
|
||||
(mapcar 'car (geruest-teile-paare-n eintrag anzahl))
|
||||
)
|
||||
|
||||
;; Index eines Eintrags (Variante oder Anbauteil) ueber seinen Anzeigenamen.
|
||||
(defun geruest-name-index (name liste / i idx)
|
||||
(setq i 0 idx nil)
|
||||
@@ -1073,8 +1132,10 @@
|
||||
;; Dummy-Geometrie + eigene ATTDEFs zu einem Block zusammenfassen und am
|
||||
;; gewaehlten Punkt einfuegen. werte = alist der berechneten Attributwerte,
|
||||
;; variante = gewaehlte Geometrie-Variante (liefert ggf. eine eigene DWG).
|
||||
;; teile-dwgs = Pfade der Teile-DWGs (geruest-teile-dwgs), die zusaetzlich
|
||||
;; als reine Geometrie bei 0,0,0 mit in den Block wandern.
|
||||
;; Rueckgabe: (blockname . entity) oder nil.
|
||||
(defun geruest-block-bauen (bg variante werte pt / datei dummy lastEnt dummyEnt
|
||||
(defun geruest-block-bauen (bg variante werte pt teile-dwgs / datei dummy lastEnt dummyEnt
|
||||
e ss bname blockEnt dummy-attribs attribs)
|
||||
;; Eine Variante darf eine eigene Dummy-DWG mitbringen; sonst gilt die der
|
||||
;; Baugruppe.
|
||||
@@ -1089,7 +1150,10 @@
|
||||
(setvar "ATTREQ" 0)
|
||||
(setvar "ATTDIA" 0)
|
||||
(setvar "OSMODE" 0)
|
||||
(setq lastEnt (entlast))
|
||||
;; Nicht (entlast): ist das letzte Objekt ein Block mit Attributen (z.B.
|
||||
;; eine per Strg+C/V eingefuegte GR_-Kopie), wuerden dessen ATTRIBs mit
|
||||
;; eingesammelt und von _.-BLOCK entfernt.
|
||||
(setq lastEnt (ssg-lastent-ohne-attribute))
|
||||
|
||||
;; Dummy bei (0,0,0) einfuegen - seine Attribute liefern u.a. die
|
||||
;; LAYER-Vorgabe.
|
||||
@@ -1097,6 +1161,14 @@
|
||||
(setq dummyEnt (entlast))
|
||||
(setq dummy-attribs (ssg-attrib-read dummyEnt))
|
||||
|
||||
;; Ausgewaehlte Teile mit eigener DWG als sichtbare Rueckmeldung
|
||||
;; einfuegen - erst NACH dem Lesen des Dummys, damit dummyEnt auf den
|
||||
;; Dummy zeigt. Nur Geometrie: die Sammelschleife unten nimmt die
|
||||
;; INSERTs mit in den Block, das Attribut-Schema bleibt unberuehrt.
|
||||
(foreach teil teile-dwgs
|
||||
(command "_.INSERT" teil (list 0.0 0.0 0.0) 1 1 0)
|
||||
)
|
||||
|
||||
;; Unser Schema gewinnt an Struktur, die Dummy-Werte an Inhalt:
|
||||
;; ssg-attrib-merge legt alle Tags aus *geruest-attrib-defs* an und
|
||||
;; uebernimmt zusaetzlich alle Tags der Dummy-DWG.
|
||||
@@ -1150,12 +1222,13 @@
|
||||
;; ABLAUF
|
||||
;; ============================================================
|
||||
|
||||
;; Artikelnummern einer Befestigungsauswahl ((index . menge) ...).
|
||||
(defun geruest-auswahl-artnr (auswahl anbauteile / erg)
|
||||
;; Teile-Paare ((artnr . farbig) ...) einer Befestigungsauswahl
|
||||
;; ((index . menge) ...).
|
||||
(defun geruest-auswahl-paare (auswahl anbauteile / erg)
|
||||
(setq erg nil)
|
||||
(foreach paar auswahl
|
||||
(setq erg (append erg
|
||||
(geruest-artikelnummern-n (nth (car paar) anbauteile) (cdr paar))))
|
||||
(geruest-teile-paare-n (nth (car paar) anbauteile) (cdr paar))))
|
||||
)
|
||||
erg
|
||||
)
|
||||
@@ -1176,7 +1249,7 @@
|
||||
;; wahl = (variante-index oben unten laenge farbe) - die Dialog-Rueckgabe ohne
|
||||
;; das fuehrende "OK".
|
||||
(defun geruest-einfuegen (bg wahl / varianten anbauteile variante teileart
|
||||
artnr bezeichnung teile-namen werte pt ergebnis)
|
||||
paare artnr bezeichnung teile-namen werte pt ergebnis)
|
||||
(setq varianten (ssg-json-get bg "geometrie_varianten"))
|
||||
(setq anbauteile (ssg-json-get bg "anbaugruppen"))
|
||||
(setq variante (nth (car wahl) varianten))
|
||||
@@ -1186,10 +1259,12 @@
|
||||
|
||||
;; ARTINR: jede Sivas-ID so oft wie die gewaehlte Stueckzahl, erst die
|
||||
;; Basis, dann Befestigung oben, dann unten. Dasselbe Teil an beiden
|
||||
;; Positionen erscheint entsprechend mehrfach.
|
||||
(setq artnr (geruest-artikelnummern variante))
|
||||
(setq artnr (append artnr (geruest-auswahl-artnr (cadr wahl) anbauteile)))
|
||||
(setq artnr (append artnr (geruest-auswahl-artnr (caddr wahl) anbauteile)))
|
||||
;; Positionen erscheint entsprechend mehrfach. Die Paare tragen zusaetzlich
|
||||
;; das farbig-Flag je Teil fuer die TEILEFARBE-Liste (gleiche Reihenfolge).
|
||||
(setq paare (geruest-teile-paare variante nil))
|
||||
(setq paare (append paare (geruest-auswahl-paare (cadr wahl) anbauteile)))
|
||||
(setq paare (append paare (geruest-auswahl-paare (caddr wahl) anbauteile)))
|
||||
(setq artnr (mapcar 'car paare))
|
||||
|
||||
;; BEZEICHNUNG: mit " + " verketten - die Artikelbezeichnungen enthalten
|
||||
;; selbst Kommas ("ROHR R 1\" 33,7 x 2,6").
|
||||
@@ -1207,15 +1282,19 @@
|
||||
(cons "TEILEART" teileart)))
|
||||
(if (/= (nth 3 wahl) "")
|
||||
(setq werte (append werte (list (cons "LAENGE" (nth 3 wahl))))))
|
||||
;; TEILEFARBE: je ARTINR-Eintrag die gewaehlte Farbe (farbiges Teil) oder
|
||||
;; "" (z.B. ",,RAL7030,,RAL7030") - fuer den Sivas-Export je Artikelnummer.
|
||||
(if (/= (nth 4 wahl) "")
|
||||
(setq werte (append werte (list (cons "TEILEFARBE" (nth 4 wahl))))))
|
||||
(setq werte (append werte (list (cons "TEILEFARBE"
|
||||
(ssg-join (geruest-farbliste paare (nth 4 wahl)) ","))))))
|
||||
|
||||
(setq pt (getpoint (ssg-text "gr-prompt-einfuegepunkt")))
|
||||
(if (null pt)
|
||||
(princ (ssg-text "gr-abgebrochen"))
|
||||
(progn
|
||||
(ssg-start "Geruest" '(("OSMODE") ("ATTREQ") ("ATTDIA")))
|
||||
(setq ergebnis (geruest-block-bauen bg variante werte pt))
|
||||
(setq ergebnis (geruest-block-bauen bg variante werte pt
|
||||
(geruest-teile-dwgs artnr)))
|
||||
(ssg-end)
|
||||
(if ergebnis
|
||||
(princ (ssg-textf "gr-fertig" (list teileart (car ergebnis))))
|
||||
@@ -1226,15 +1305,29 @@
|
||||
)
|
||||
|
||||
|
||||
;; Index eines Bereichs ueber das ASCII-Feld "id" (nil, wenn unbekannt).
|
||||
(defun geruest-bereich-index (id bereiche / i idx)
|
||||
(setq i 0 idx nil)
|
||||
(foreach b bereiche
|
||||
(if (and (null idx) (equal (car b) id)) (setq idx i))
|
||||
(setq i (1+ i))
|
||||
)
|
||||
idx
|
||||
)
|
||||
|
||||
;; Ein Dialog fuer alle Geruest-Bereiche. Der Bereichswechsel laeuft ueber
|
||||
;; diese Schleife, weil der Dialog dafuer neu aufgebaut werden muss.
|
||||
(defun c:GERUEST ( / bereiche idx bg erg weiter)
|
||||
;; start-id = "id" des Bereichs, mit dem der Dialog oeffnet (nil oder
|
||||
;; unbekannt -> erster Bereich). Der Wechsel per Dropdown bleibt moeglich.
|
||||
(defun geruest-starten (start-id / bereiche idx bg erg weiter)
|
||||
(setq *geruest-zustand* nil)
|
||||
(setq bereiche (geruest-baugruppen-liste))
|
||||
(if (null bereiche)
|
||||
(princ (ssg-text "gr-fehler-keine-baugruppen"))
|
||||
(progn
|
||||
(setq idx 0 weiter T)
|
||||
(setq idx (if start-id (geruest-bereich-index start-id bereiche)))
|
||||
(if (null idx) (setq idx 0))
|
||||
(setq weiter T)
|
||||
(while weiter
|
||||
(setq bg (cdr (nth idx bereiche)))
|
||||
(cond
|
||||
@@ -1262,5 +1355,12 @@
|
||||
(princ)
|
||||
)
|
||||
|
||||
(princ "\nGeruestInsert.lsp geladen. Befehl: GERUEST")
|
||||
(defun c:GERUEST ( / ) (geruest-starten nil))
|
||||
|
||||
;; Menue-Einstiege je Bereich - oeffnen denselben Dialog im passenden Bereich.
|
||||
(defun c:GERUEST_SAEULEN ( / ) (geruest-starten "Saeulen"))
|
||||
(defun c:GERUEST_ROHRABHAENGER ( / ) (geruest-starten "Rohrabhaenger"))
|
||||
(defun c:GERUEST_WANDBEFESTIGUNG ( / ) (geruest-starten "Wandbefestigung"))
|
||||
|
||||
(princ "\nGeruestInsert.lsp geladen. Befehle: GERUEST, GERUEST_SAEULEN, GERUEST_ROHRABHAENGER, GERUEST_WANDBEFESTIGUNG")
|
||||
(princ)
|
||||
|
||||
Reference in New Issue
Block a user