[CHANGE] Lager-Export nur noch als JSON mit Kennwerten, Gitterkorb unter Regalreihen
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
3c729ea604
commit
d2729140ff
22 files changed
+1068
-1089
No files matched your search
+566
-143
@@ -2,8 +2,8 @@
|
||||
;; LagerInsert.lsp - Lagerplanung GOH-Buehnenlager (Phase 1: Mengen, 2D)
|
||||
;;
|
||||
;; Erzeugt parametrische Attributbloecke fuer ein mehrgeschossiges
|
||||
;; Haengewarenlager und sammelt daraus die Mengen fuer die RFQ-YAML
|
||||
;; (Overlay, siehe doc/plan/lager_rfq.md):
|
||||
;; Haengewarenlager und exportiert daraus die technischen Daten als JSON
|
||||
;; fuer die RFQ-Dokumentation (LAGER_EXPORT, siehe doc/plan/lager_rfq.md):
|
||||
;;
|
||||
;; LG_GESCHOSS Geschoss-Kopfsymbol, verknuepft mit seiner Belagskontur
|
||||
;; LG_BEREICH Lagerbereich (Kontur + Parameter), fuellt sich selbst
|
||||
@@ -13,7 +13,7 @@
|
||||
;; je Belag aus lager.json belag_schraffur)
|
||||
;;
|
||||
;; Befehle: LG_GESCHOSS, LG_GESCHOSS_AKTIV, LG_GESCHOSS_KOPIEREN, LG_BEREICH,
|
||||
;; LG_REIHE, LG_GANG, LG_EDIT, LG_REGALE, LAGER_EXPORT, LAGER_HAND_YAML
|
||||
;; LG_REIHE, LG_GANG, LG_EDIT, LG_REGALE, LAGER_EXPORT
|
||||
;;
|
||||
;; Grundsaetze (CLAUDE.md):
|
||||
;; - Alle Werte selbstbeschreibend in mm/Grad, keine Index-Codes.
|
||||
@@ -379,6 +379,7 @@
|
||||
("SCHIENEN_JE_GANG" . "") ("QUERGANG_ABSTAND_mm" . "") ("QUERGANG_BREITE_mm" . "")
|
||||
("RICHTUNG" . "") ("HAENGEEBENEN" . "") ("BELAG" . "")
|
||||
("RANDGANG_N_mm" . "0") ("RANDGANG_O_mm" . "0") ("RANDGANG_S_mm" . "0") ("RANDGANG_W_mm" . "0")
|
||||
("UNTER_REIHE" . "") ("GITTERKORB_HOEHE_mm" . "")
|
||||
("RESTBREITE_mm" . "")))
|
||||
|
||||
(setq *lg-schema-reihe*
|
||||
@@ -621,6 +622,8 @@
|
||||
("richtung" "RICHTUNG" "grad" nil)
|
||||
("ebenen" "HAENGEEBENEN" "ebenen" nil)
|
||||
("belag" "BELAG" "wahl" belag)
|
||||
("unter" "UNTER_REIHE" "wahl" unter)
|
||||
("korbhoehe" "GITTERKORB_HOEHE_mm" "mm" nil)
|
||||
("rand_n" "RANDGANG_N_mm" "mm" nil)
|
||||
("rand_o" "RANDGANG_O_mm" "mm" nil)
|
||||
("rand_s" "RANDGANG_S_mm" "mm" nil)
|
||||
@@ -653,6 +656,7 @@
|
||||
((eq sym 'brand) (lg-vorgabe '("brandgefaehrdungen") '("normal" "erhoeht_mit_loeschanlage" "erhoeht_ohne_loeschanlage")))
|
||||
((eq sym 'reihen) '("1" "2"))
|
||||
((eq sym 'gangart) '("gang" "randgang" "quergang"))
|
||||
((eq sym 'unter) *lg-unter-reihe-werte*)
|
||||
((eq sym 'geschosse) (mapcar '(lambda (g) (itoa (cadr g))) (lg-geschosse)))
|
||||
)
|
||||
)
|
||||
@@ -1174,12 +1178,36 @@
|
||||
(cons "RICHTUNG" (lg-mm-str (if pts (lg-kontur-richtung pts) 0.0)))
|
||||
(cons "HAENGEEBENEN" (lg-vorgabe '("reihe" "haengeebenen") "2300/1200;1100/1100"))
|
||||
(cons "BELAG" (lg-vorgabe '("bereich" "belag") "spanplatte"))
|
||||
(cons "UNTER_REIHE" (lg-unter-reihe-vorgabe))
|
||||
(cons "GITTERKORB_HOEHE_mm" (lg-mm-str (lg-zahl (lg-vorgabe '("bereich" "gitterkorb_hoehe_mm") 500))))
|
||||
(cons "RANDGANG_N_mm" (lg-mm-str (lg-zahl (lg-vorgabe '("bereich" "randgang_mm" "n") 0))))
|
||||
(cons "RANDGANG_O_mm" (lg-mm-str (lg-zahl (lg-vorgabe '("bereich" "randgang_mm" "o") 0))))
|
||||
(cons "RANDGANG_S_mm" (lg-mm-str (lg-zahl (lg-vorgabe '("bereich" "randgang_mm" "s") 0))))
|
||||
(cons "RANDGANG_W_mm" (lg-mm-str (lg-zahl (lg-vorgabe '("bereich" "randgang_mm" "w") 0)))))
|
||||
)
|
||||
|
||||
;; Absturzsicherung unter den Regalreihen (Attribut UNTER_REIHE am Bereich):
|
||||
;; gitterrost = Grundflaeche der Reihe als Gitterrost, gitterkorb = Korb mit
|
||||
;; Boden UND Seitenwaenden zum Geschoss darunter, keine = offen.
|
||||
(setq *lg-unter-reihe-werte* '("gitterrost" "gitterkorb" "keine"))
|
||||
|
||||
(defun lg-unter-reihe-vorgabe ( / v)
|
||||
(setq v (lg-vorgabe '("bereich" "unter_reihe") "gitterrost"))
|
||||
(if (member v *lg-unter-reihe-werte*) v "gitterrost")
|
||||
)
|
||||
|
||||
;; Reiner Kern: wirksamer Wert unter einer Reihe. wert = UNTER_REIHE des
|
||||
;; Bereichs (nil/leer/unbekannt -> vorgabe), buehne-p = nil auf Hallenboden
|
||||
;; (dort gibt es nichts abzusichern -> "keine").
|
||||
(defun lg-unter-reihe-wert (wert vorgabe buehne-p)
|
||||
(cond
|
||||
((not buehne-p) "keine")
|
||||
((member wert *lg-unter-reihe-werte*) wert)
|
||||
((member vorgabe *lg-unter-reihe-werte*) vorgabe)
|
||||
(T "gitterrost")
|
||||
)
|
||||
)
|
||||
|
||||
;; Randgang-Breiten eines Bereichs (Attribute) fuer lg-fuellung-berechnen.
|
||||
;; Fehlt ein Attribut (Altbestand), gilt 0.
|
||||
(defun lg-bereich-rand (a)
|
||||
@@ -2011,11 +2039,21 @@
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; EXPORT (lager_raw.json)
|
||||
;; EXPORT (<dwg>_lager.json)
|
||||
;; ============================================================
|
||||
;; Eine JSON-Datei mit den technischen Daten des Lagers fuer die
|
||||
;; RFQ-Dokumentation (eigenes Projekt): alle Objekte mit Attributen und
|
||||
;; voller Geometrie (WCS, mm) plus Kennwerte je Geschoss und fuer das ganze
|
||||
;; Lager, jeder Geschoss-Kennwert mit Formel und Quelle (herkunft).
|
||||
;; Schema und Formeln: doc/plan/lager_rfq.md. Die Kennwerte entstehen hier
|
||||
;; in reinen Kernen (getestet) - fachliche Regeln leben in LISP.
|
||||
;;
|
||||
;; Datenform: Objekte als (OBJ (schluessel . wert) ...), Arrays als
|
||||
;; (ARR wert ...); lg-j liest ein Feld, lg-j-setzen setzt es.
|
||||
|
||||
;; --- JSON-Schreiber (rein, getestet) ---
|
||||
;; Werte: nil -> null, T -> true, String, Ganz-/Fliesszahl, (ROH "json").
|
||||
;; Werte: nil -> null, T -> true, FALSE -> false, String, Ganz-/Fliesszahl,
|
||||
;; (ROH "json"), (OBJ ...) -> Objekt, (ARR ...) -> Array.
|
||||
(defun lg-json-zahl (w / s)
|
||||
(setq s (rtos w 2 3))
|
||||
(if (vl-string-search "." s)
|
||||
@@ -2025,141 +2063,564 @@
|
||||
(if (= s "-0") "0" s)
|
||||
)
|
||||
|
||||
(defun lg-hex4 (n / h erg)
|
||||
(setq h "0123456789abcdef" erg "")
|
||||
(repeat 4
|
||||
(setq erg (strcat (substr h (1+ (rem n 16)) 1) erg) n (/ n 16)))
|
||||
erg
|
||||
)
|
||||
|
||||
;; String als JSON-Text. Zeichen ausserhalb ASCII (Umlaute in einer
|
||||
;; Bezeichnung) als \uXXXX, damit die Datei unabhaengig von der Codepage
|
||||
;; gueltiges UTF-8 bleibt.
|
||||
(defun lg-json-str (s / roh i c erg)
|
||||
(setq roh (ssg-json-escape s) erg "" i 1)
|
||||
(while (<= i (strlen roh))
|
||||
(setq c (substr roh i 1))
|
||||
(setq erg (strcat erg (if (> (ascii c) 127) (strcat "\\u" (lg-hex4 (ascii c))) c))
|
||||
i (1+ i)))
|
||||
(strcat "\"" erg "\"")
|
||||
)
|
||||
|
||||
(defun lg-json-wert (v)
|
||||
(cond
|
||||
((null v) "null")
|
||||
((eq v T) "true")
|
||||
((= (type v) 'STR) (strcat "\"" (ssg-json-escape v) "\""))
|
||||
((eq v 'FALSE) "false")
|
||||
((= (type v) 'STR) (lg-json-str v))
|
||||
((= (type v) 'INT) (itoa v))
|
||||
((= (type v) 'REAL) (lg-json-zahl v))
|
||||
((and (listp v) (eq (car v) 'ROH)) (cadr v))
|
||||
(T (strcat "\"" (ssg-json-escape (vl-princ-to-string v)) "\""))
|
||||
((and (listp v) (eq (car v) 'OBJ)) (lg-json-obj (cdr v)))
|
||||
((and (listp v) (eq (car v) 'ARR))
|
||||
(strcat "[" (ssg-join (mapcar 'lg-json-wert (cdr v)) ", ") "]"))
|
||||
(T (lg-json-str (vl-princ-to-string v)))
|
||||
)
|
||||
)
|
||||
|
||||
(defun lg-json-obj (paare)
|
||||
(strcat "{"
|
||||
(ssg-join (mapcar '(lambda (p) (strcat "\"" (car p) "\": " (lg-json-wert (cdr p)))) paare)
|
||||
(ssg-join (mapcar '(lambda (p) (strcat (lg-json-str (car p)) ": " (lg-json-wert (cdr p)))) paare)
|
||||
", ")
|
||||
"}")
|
||||
)
|
||||
|
||||
;; Liste bereits gerenderter JSON-Texte als Array (ein Element je Zeile).
|
||||
(defun lg-json-arr (texte einrueckung)
|
||||
(if texte
|
||||
(strcat "[\n" einrueckung (ssg-join texte (strcat ",\n" einrueckung)) "\n" (substr einrueckung 3) "]")
|
||||
"[]")
|
||||
(defun lg-json-container-p (v)
|
||||
(and v (listp v) (member (car v) '(OBJ ARR)))
|
||||
)
|
||||
|
||||
(defun lg-json-zahlen (zahlen)
|
||||
(list 'ROH (strcat "[" (ssg-join (mapcar 'lg-json-wert zahlen) ", ") "]"))
|
||||
;; Anzahl Blattwerte eines Werts (Mass fuer "passt in eine Zeile").
|
||||
(defun lg-json-blaetter (v)
|
||||
(cond
|
||||
((not (lg-json-container-p v)) 1)
|
||||
((eq (car v) 'OBJ) (apply '+ (cons 0 (mapcar '(lambda (p) (lg-json-blaetter (cdr p))) (cdr v)))))
|
||||
(T (apply '+ (cons 0 (mapcar 'lg-json-blaetter (cdr v)))))
|
||||
)
|
||||
)
|
||||
|
||||
(defun lg-json-ebenen (s)
|
||||
(list 'ROH
|
||||
(strcat "["
|
||||
(ssg-join (mapcar '(lambda (e) (lg-json-obj (list (cons "schienenhoehe_mm" (car e))
|
||||
(cons "warenlaenge_mm" (cadr e)))))
|
||||
(lg-haengeebenen-parse s))
|
||||
", ")
|
||||
"]"))
|
||||
;; Zahl, null oder Array nur daraus (Punkte, Punktlisten, bbox).
|
||||
(defun lg-json-zahlen-p (v)
|
||||
(cond
|
||||
((or (null v) (numberp v)) T)
|
||||
((and (listp v) (eq (car v) 'ARR)) (vl-every 'lg-json-zahlen-p (cdr v)))
|
||||
(T nil)
|
||||
)
|
||||
)
|
||||
|
||||
;; Eingerueckter JSON-Text. Zahlenreihen (Punkte, Konturen) und kleine
|
||||
;; Container (bis *lg-json-inline-max* Blattwerte) bleiben einzeilig, alles
|
||||
;; andere bekommt je Eintrag eine Zeile.
|
||||
(setq *lg-json-inline-max* 12)
|
||||
|
||||
(defun lg-json-text (v einr / innen zeilen obj-p)
|
||||
(if (or (not (lg-json-container-p v))
|
||||
(lg-json-zahlen-p v)
|
||||
(<= (lg-json-blaetter v) *lg-json-inline-max*))
|
||||
(lg-json-wert v)
|
||||
(progn
|
||||
(setq innen (strcat einr " ") obj-p (eq (car v) 'OBJ))
|
||||
(setq zeilen
|
||||
(if obj-p
|
||||
(mapcar '(lambda (p) (strcat innen (lg-json-str (car p)) ": " (lg-json-text (cdr p) innen))) (cdr v))
|
||||
(mapcar '(lambda (x) (strcat innen (lg-json-text x innen))) (cdr v))))
|
||||
(if zeilen
|
||||
(strcat (if obj-p "{" "[") "\n" (ssg-join zeilen ",\n") "\n" einr (if obj-p "}" "]"))
|
||||
(if obj-p "{}" "[]")))
|
||||
)
|
||||
)
|
||||
|
||||
;; --- Zugriff auf OBJ-Records ---
|
||||
(defun lg-j (obj key) (cdr (assoc key (cdr obj))))
|
||||
|
||||
(defun lg-j-setzen (obj key wert / alt)
|
||||
(if (setq alt (assoc key (cdr obj)))
|
||||
(cons 'OBJ (subst (cons key wert) alt (cdr obj)))
|
||||
(cons 'OBJ (append (cdr obj) (list (cons key wert)))))
|
||||
)
|
||||
|
||||
(defun lg-j-pkte (pts) (cons 'ARR (mapcar '(lambda (p) (cons 'ARR p)) pts)))
|
||||
(defun lg-j-bbox (bb) (if bb (cons 'ARR (append (car bb) (cadr bb)))))
|
||||
(defun lg-n (v) (if (numberp v) (float v) 0.0))
|
||||
|
||||
(defun lg-j-ebenen (s)
|
||||
(cons 'ARR
|
||||
(mapcar '(lambda (e) (list 'OBJ (cons "schienenhoehe_mm" (car e)) (cons "warenlaenge_mm" (cadr e))))
|
||||
(lg-haengeebenen-parse s)))
|
||||
)
|
||||
|
||||
;; Attributwert als Zahl bzw. Ganzzahl (nil, wenn leer).
|
||||
(defun lg-a-zahl (a tag) (lg-zahl (cdr (assoc tag a))))
|
||||
(defun lg-a-int (a tag / w) (if (setq w (lg-zahl (cdr (assoc tag a)))) (fix w)))
|
||||
|
||||
(defun lg-export-geschoss (g / a k pts bb)
|
||||
(setq a (caddr g) pts (cadddr g) bb (ssg-poly-bbox pts)
|
||||
k (lg-xdata-wert (car g) "kontur"))
|
||||
(lg-json-obj
|
||||
(list (cons "nr" (cadr g))
|
||||
(cons "bezeichnung" (cdr (assoc "BEZEICHNUNG" a)))
|
||||
(cons "hoehe_belag_mm" (lg-a-zahl a "HOEHE_BELAG_mm"))
|
||||
(cons "konstr_hoehe_mm" (lg-a-zahl a "KONSTR_HOEHE_mm"))
|
||||
(cons "lichte_hoehe_mm" (lg-a-zahl a "LICHTE_HOEHE_mm"))
|
||||
(cons "belag_art" (cdr (assoc "BELAG_ART" a)))
|
||||
(cons "personen" (lg-a-int a "PERSONEN"))
|
||||
(cons "brandgefaehrdung" (cdr (assoc "BRANDGEFAEHRDUNG" a)))
|
||||
(cons "kontur_flaeche_mm2" (if pts (ssg-poly-flaeche pts)))
|
||||
(cons "kontur_umfang_mm" (if pts (ssg-poly-umfang pts)))
|
||||
(cons "kontur_bbox" (if bb (lg-json-zahlen (append (car bb) (cadr bb)))))
|
||||
(cons "handle" (lg-handle (car g)))
|
||||
(cons "kontur_handle" k)))
|
||||
;; Buehne = Belag vorhanden und kein Hallenboden. Rein.
|
||||
(defun lg-buehne-p (belag)
|
||||
(and (= (type belag) 'STR) (/= belag "") (/= (strcase belag T) "hallenboden"))
|
||||
)
|
||||
|
||||
(defun lg-export-bereich (e / a k pts bb)
|
||||
(setq a (ssg-attrib-read e)
|
||||
k (lg-ent-aus-handle (lg-xdata-wert e "kontur"))
|
||||
pts (if k (ssg-lwpoly-punkte k))
|
||||
bb (ssg-poly-bbox pts))
|
||||
(lg-json-obj
|
||||
(list (cons "nr" (lg-a-int a "NR"))
|
||||
(cons "geschoss" (lg-a-int a "GESCHOSS"))
|
||||
(cons "gangbreite_mm" (lg-a-zahl a "GANGBREITE_mm"))
|
||||
(cons "regaltiefe_mm" (lg-a-zahl a "REGALTIEFE_mm"))
|
||||
(cons "reihen_je_gang" (lg-a-int a "REIHEN_JE_GANG"))
|
||||
(cons "schienen_je_gang" (lg-a-int a "SCHIENEN_JE_GANG"))
|
||||
(cons "quergang_abstand_mm" (lg-a-zahl a "QUERGANG_ABSTAND_mm"))
|
||||
(cons "quergang_breite_mm" (lg-a-zahl a "QUERGANG_BREITE_mm"))
|
||||
(cons "richtung_grad" (lg-a-zahl a "RICHTUNG"))
|
||||
(cons "haengeebenen" (lg-json-ebenen (cdr (assoc "HAENGEEBENEN" a))))
|
||||
(cons "belag" (cdr (assoc "BELAG" a)))
|
||||
(cons "randgang_mm" (list 'ROH (lg-json-obj
|
||||
(mapcar '(lambda (r) (cons (strcase (car r) T) (cdr r)))
|
||||
(lg-bereich-rand a)))))
|
||||
(cons "restbreite_mm" (lg-a-zahl a "RESTBREITE_mm"))
|
||||
(cons "kontur_flaeche_mm2" (if pts (ssg-poly-flaeche pts)))
|
||||
(cons "kontur_bbox" (if bb (lg-json-zahlen (append (car bb) (cadr bb)))))
|
||||
(cons "handle" (lg-handle e))))
|
||||
;; --- Reine Kerne der Kennwerte (getestet) ---
|
||||
|
||||
;; Regallaenge je Haengeebene. reihen = Reihen-Records mit laenge_mm und
|
||||
;; haengeebenen; jede Reihe traegt ihre Laenge in jede ihrer Ebenen ein.
|
||||
;; Rueckgabe (ARR (OBJ schienenhoehe_mm warenlaenge_mm reihen regallaenge_mm)
|
||||
;; ...), nach Schienenhoehe absteigend.
|
||||
(defun lg-haengeebenen-summen (reihen / erg key alt l)
|
||||
(setq erg nil)
|
||||
(foreach r reihen
|
||||
(setq l (lg-n (lg-j r "laenge_mm")))
|
||||
(foreach e (cdr (lg-j r "haengeebenen"))
|
||||
(setq key (list (lg-n (lg-j e "schienenhoehe_mm")) (lg-n (lg-j e "warenlaenge_mm")))
|
||||
alt (assoc key erg))
|
||||
(setq erg (if alt
|
||||
(subst (list key (1+ (cadr alt)) (+ (caddr alt) l)) alt erg)
|
||||
(cons (list key 1 l) erg)))))
|
||||
(cons 'ARR
|
||||
(mapcar '(lambda (x) (list 'OBJ (cons "schienenhoehe_mm" (car (car x)))
|
||||
(cons "warenlaenge_mm" (cadr (car x)))
|
||||
(cons "reihen" (cadr x))
|
||||
(cons "regallaenge_mm" (caddr x))))
|
||||
(vl-sort erg '(lambda (a b) (if (equal (car (car a)) (car (car b)) 1e-6)
|
||||
(> (cadr (car a)) (cadr (car b)))
|
||||
(> (car (car a)) (car (car b))))))))
|
||||
)
|
||||
|
||||
(defun lg-export-linie (e art / a ed)
|
||||
(setq a (ssg-attrib-read e) ed (entget e))
|
||||
(lg-json-obj
|
||||
;; Gaenge je ART: (OBJ ("gang" . (OBJ anzahl laenge_mm flaeche_mm2)) ...),
|
||||
;; gang/quergang/randgang immer vorhanden, weitere Arten dahinter.
|
||||
(defun lg-gaenge-je-art (gaenge / erg art x l f)
|
||||
(setq erg (mapcar '(lambda (a) (list a 0 0.0 0.0)) '("gang" "quergang" "randgang")))
|
||||
(foreach g gaenge
|
||||
(setq art (cond ((lg-j g "art")) ("unbekannt"))
|
||||
x (assoc art erg)
|
||||
l (lg-n (lg-j g "laenge_mm"))
|
||||
f (* l (lg-n (lg-j g "breite_mm"))))
|
||||
(setq erg (if x
|
||||
(subst (list art (1+ (cadr x)) (+ (caddr x) l) (+ (cadddr x) f)) x erg)
|
||||
(append erg (list (list art 1 l f))))))
|
||||
(cons 'OBJ
|
||||
(mapcar '(lambda (x) (cons (car x) (list 'OBJ (cons "anzahl" (cadr x))
|
||||
(cons "laenge_mm" (caddr x))
|
||||
(cons "flaeche_mm2" (cadddr x)))))
|
||||
erg))
|
||||
)
|
||||
|
||||
;; Die vier Kanten eines Rechtecks aus lg-linie-polygon, in fester
|
||||
;; Reihenfolge: 1-2 laengs, 2-3 stirn, 3-4 laengs, 4-1 stirn.
|
||||
(defun lg-rechteck-kanten (ecken)
|
||||
(list (list (nth 0 ecken) (nth 1 ecken)) (list (nth 1 ecken) (nth 2 ecken))
|
||||
(list (nth 2 ecken) (nth 3 ecken)) (list (nth 3 ecken) (nth 0 ecken)))
|
||||
)
|
||||
|
||||
(defun lg-bbox-beruehrt-p (a b tol)
|
||||
(and a b
|
||||
(<= (car (car b)) (+ (car (cadr a)) tol)) (<= (car (car a)) (+ (car (cadr b)) tol))
|
||||
(<= (cadr (car b)) (+ (cadr (cadr a)) tol)) (<= (cadr (car a)) (+ (cadr (cadr b)) tol)))
|
||||
)
|
||||
|
||||
;; Offener Teil der Kante (p q): Laenge minus die Abschnitte, auf denen eine
|
||||
;; Kante eines Nachbar-Rechtecks kollinear (Abstand < tol) aufliegt.
|
||||
(defun lg-kante-offen (kante nachbarn tol / p q len ux uy zu c d dx dy dl t1 t2 lo hi)
|
||||
(setq p (car kante) q (cadr kante) zu nil
|
||||
len (distance (list (car p) (cadr p)) (list (car q) (cadr q))))
|
||||
(if (< len 1e-9)
|
||||
0.0
|
||||
(progn
|
||||
(setq ux (/ (- (car q) (car p)) len) uy (/ (- (cadr q) (cadr p)) len))
|
||||
(foreach f nachbarn
|
||||
(foreach k (lg-rechteck-kanten f)
|
||||
(setq c (car k) d (cadr k)
|
||||
dx (- (car d) (car c)) dy (- (cadr d) (cadr c))
|
||||
dl (sqrt (+ (* dx dx) (* dy dy))))
|
||||
(if (and (> dl 1e-9)
|
||||
(< (abs (- (* ux dy) (* uy dx))) (* 1e-4 dl)) ; parallel
|
||||
(< (abs (- (* ux (- (cadr c) (cadr p))) (* uy (- (car c) (car p))))) tol)) ; gleiche Linie
|
||||
(progn
|
||||
(setq t1 (+ (* ux (- (car c) (car p))) (* uy (- (cadr c) (cadr p))))
|
||||
t2 (+ (* ux (- (car d) (car p))) (* uy (- (cadr d) (cadr p))))
|
||||
lo (max 0.0 (min t1 t2))
|
||||
hi (min len (max t1 t2)))
|
||||
(if (> (- hi lo) tol) (setq zu (cons (list lo hi) zu)))))))
|
||||
(apply '+ (cons 0.0 (mapcar '(lambda (i) (- (cadr i) (car i)))
|
||||
(ssg-intervalle-minus (list (list 0.0 len)) zu))))))
|
||||
)
|
||||
|
||||
;; Offene Kantenlaenge je Reihe. ecken-liste = je Reihe die 4 Ecken (2D)
|
||||
;; aus lg-linie-polygon. Eine Kante ist dort zu, wo eine Kante einer ANDEREN
|
||||
;; Reihe kollinear darauf liegt (z.B. Ruecken an Ruecken). Rueckgabe je
|
||||
;; Reihe (offen-laengs offen-stirn) in mm.
|
||||
(defun lg-reihen-offene-kanten (ecken-liste tol / bbs erg i j k bb nachbarn l s o)
|
||||
(setq bbs (mapcar 'ssg-poly-bbox ecken-liste) erg nil i 0)
|
||||
(foreach e ecken-liste
|
||||
(setq bb (nth i bbs) nachbarn nil j 0 l 0.0 s 0.0 k 0)
|
||||
(foreach f ecken-liste
|
||||
(if (and (/= i j) (lg-bbox-beruehrt-p bb (nth j bbs) tol))
|
||||
(setq nachbarn (cons f nachbarn)))
|
||||
(setq j (1+ j)))
|
||||
(foreach kante (lg-rechteck-kanten e)
|
||||
(setq o (lg-kante-offen kante nachbarn tol))
|
||||
(if (= 0 (rem k 2)) (setq l (+ l o)) (setq s (+ s o)))
|
||||
(setq k (1+ k)))
|
||||
(setq erg (cons (list l s) erg) i (1+ i)))
|
||||
(reverse erg)
|
||||
)
|
||||
|
||||
;; Gitterkorb der Reihen EINES Geschosses vervollstaendigen: Reihen mit
|
||||
;; gitterkorb (OBJ hoehe_mm) bekommen Boden (Laenge x Tiefe), offene Kanten
|
||||
;; (gegen alle Reihen des Geschosses) und Seitenflaeche (offen x Hoehe).
|
||||
(defun lg-reihen-gitterkorb-berechnen (reihen tol / offen)
|
||||
(if (vl-some '(lambda (r) (lg-j r "gitterkorb")) reihen)
|
||||
(progn
|
||||
(setq offen (lg-reihen-offene-kanten
|
||||
(mapcar '(lambda (r) (mapcar 'cdr (cdr (lg-j r "ecken")))) reihen) tol))
|
||||
(mapcar '(lambda (r o / gk h l b)
|
||||
(if (setq gk (lg-j r "gitterkorb"))
|
||||
(progn
|
||||
(setq h (lg-n (lg-j gk "hoehe_mm"))
|
||||
l (lg-n (lg-j r "laenge_mm"))
|
||||
b (lg-n (lg-j r "tiefe_mm")))
|
||||
(lg-j-setzen r "gitterkorb"
|
||||
(list 'OBJ (cons "hoehe_mm" (lg-j gk "hoehe_mm"))
|
||||
(cons "bodenflaeche_mm2" (* l b))
|
||||
(cons "offen_laengs_mm" (car o))
|
||||
(cons "offen_stirn_mm" (cadr o))
|
||||
(cons "seitenflaeche_mm2" (* h (+ (car o) (cadr o)))))))
|
||||
r))
|
||||
reihen offen))
|
||||
reihen)
|
||||
)
|
||||
|
||||
(defun lg-herkunft (key formel quelle)
|
||||
(cons key (list 'OBJ (cons "formel" formel) (cons "quelle" quelle)))
|
||||
)
|
||||
|
||||
;; Kennwerte eines Geschosses. g = Geschoss-Record, nx = Record des
|
||||
;; naechsthoeheren Geschosses (nil = oberstes), reihen/gaenge = Records
|
||||
;; dieses Geschosses (Reihen mit unter_reihe/gitterkorb), n-bereiche =
|
||||
;; Anzahl Bereiche. Rueckgabe (kennwerte herkunft), beide OBJ.
|
||||
(defun lg-kennwerte-geschoss (g nx reihen gaenge n-bereiche / nrs q qr buehne hk lichte regal grund
|
||||
schienen gitter-r korb gk l f belag-g gitter-g belag gitter)
|
||||
(setq nrs (vl-princ-to-string (lg-j g "nr"))
|
||||
q (strcat "LG_GESCHOSS " nrs)
|
||||
qr (strcat (itoa (length reihen)) " Regalreihe(n) LG_REIHE_* Geschoss " nrs)
|
||||
buehne (lg-buehne-p (lg-j g "belag_art"))
|
||||
hk nil)
|
||||
;; lichte Hoehe: Vorgabe am Geschoss, sonst aus dem Geschoss darueber
|
||||
(cond
|
||||
((numberp (lg-j g "lichte_hoehe_mm"))
|
||||
(setq lichte (lg-j g "lichte_hoehe_mm")
|
||||
hk (cons (lg-herkunft "lichte_hoehe_mm" "LICHTE_HOEHE_mm (Vorgabe am Geschoss)" q) hk)))
|
||||
(nx
|
||||
(setq lichte (- (lg-n (lg-j nx "hoehe_belag_mm")) (lg-n (lg-j nx "konstr_hoehe_mm"))
|
||||
(lg-n (lg-j g "hoehe_belag_mm")))
|
||||
hk (cons (lg-herkunft "lichte_hoehe_mm"
|
||||
"HOEHE_BELAG_mm darueber - KONSTR_HOEHE_mm darueber - eigene HOEHE_BELAG_mm"
|
||||
(strcat q " / " (vl-princ-to-string (lg-j nx "nr"))))
|
||||
hk)))
|
||||
(T (setq lichte nil))
|
||||
)
|
||||
;; Regalreihen
|
||||
(setq regal 0.0 grund 0.0 schienen 0.0 gitter-r 0.0 korb (list 0 0.0 0.0 0.0 0.0))
|
||||
(foreach r reihen
|
||||
(setq l (lg-n (lg-j r "laenge_mm"))
|
||||
f (* l (lg-n (lg-j r "tiefe_mm"))))
|
||||
(setq regal (+ regal l) grund (+ grund f)
|
||||
schienen (+ schienen (* l (if (numberp (lg-j r "schienen")) (lg-j r "schienen") 1))))
|
||||
(cond
|
||||
((equal (lg-j r "unter_reihe") "gitterrost") (setq gitter-r (+ gitter-r f)))
|
||||
((setq gk (lg-j r "gitterkorb"))
|
||||
(setq korb (list (1+ (nth 0 korb))
|
||||
(+ (nth 1 korb) (lg-n (lg-j gk "bodenflaeche_mm2")))
|
||||
(+ (nth 2 korb) (lg-n (lg-j gk "seitenflaeche_mm2")))
|
||||
(+ (nth 3 korb) (lg-n (lg-j gk "offen_laengs_mm")))
|
||||
(+ (nth 4 korb) (lg-n (lg-j gk "offen_stirn_mm")))))))
|
||||
)
|
||||
(setq hk (append (reverse
|
||||
(list (lg-herkunft "regallaenge_mm" "Summe LAENGE der Regalreihen" qr)
|
||||
(lg-herkunft "regalgrundflaeche_mm2" "Summe LAENGE x TIEFE_mm der Regalreihen" qr)
|
||||
(lg-herkunft "schienenlaenge_mm" "Summe LAENGE x SCHIENEN der Regalreihen" qr)
|
||||
(lg-herkunft "haengeebenen" "je Schienenhoehe/Warenlaenge: Summe LAENGE aller Reihen mit dieser Haengeebene" qr)
|
||||
(lg-herkunft "gaenge" "je ART: Anzahl, Summe LAENGE, Summe LAENGE x BREITE_mm"
|
||||
(strcat (itoa (length gaenge)) " Flaeche(n) LG_GANG_* Geschoss " nrs))))
|
||||
hk))
|
||||
;; Belag und Gitterrost (nur Buehne)
|
||||
(setq belag-g 0.0 gitter-g 0.0)
|
||||
(foreach x gaenge
|
||||
(setq f (* (lg-n (lg-j x "laenge_mm")) (lg-n (lg-j x "breite_mm"))))
|
||||
(if (equal (lg-j x "belag") "gitterrost")
|
||||
(setq gitter-g (+ gitter-g f))
|
||||
(setq belag-g (+ belag-g f))))
|
||||
(if buehne
|
||||
(progn
|
||||
(if gaenge
|
||||
(setq belag belag-g
|
||||
hk (cons (lg-herkunft "belagsflaeche_mm2"
|
||||
"Summe LAENGE x BREITE_mm der Gaenge mit BELAG ungleich gitterrost"
|
||||
(strcat "LG_GANG_* Geschoss " nrs)) hk))
|
||||
(setq belag (- (lg-n (lg-j (lg-j g "kontur") "flaeche_mm2")) grund)
|
||||
hk (cons (lg-herkunft "belagsflaeche_mm2"
|
||||
"Konturflaeche - Grundflaeche der Regalreihen (keine LG_GANG-Flaechen)"
|
||||
(strcat "Belagskontur Geschoss " nrs)) hk)))
|
||||
(setq gitter (+ gitter-g gitter-r)
|
||||
hk (cons (lg-herkunft "gitterrostflaeche_mm2"
|
||||
(strcat "Summe LAENGE x BREITE_mm der Gaenge mit BELAG gitterrost"
|
||||
" + LAENGE x TIEFE_mm der Reihen mit UNTER_REIHE gitterrost")
|
||||
(strcat "LG_GANG_*/LG_REIHE_* Geschoss " nrs)) hk))
|
||||
(setq hk (cons (lg-herkunft "gitterkorb"
|
||||
(strcat "Reihen mit UNTER_REIHE gitterkorb: Boden = LAENGE x TIEFE_mm,"
|
||||
" Seiten = offene Kantenlaenge x GITTERKORB_HOEHE_mm"
|
||||
" (Kanten an einer direkt anliegenden Nachbarreihe zaehlen nicht)")
|
||||
qr) hk)))
|
||||
(setq belag nil gitter nil
|
||||
hk (cons (lg-herkunft "buehne" "BELAG_ART hallenboden (oder leer): keine Buehne, kein Belag/Gitterrost/Gitterkorb" q) hk))
|
||||
)
|
||||
(list
|
||||
(list 'OBJ
|
||||
(cons "lichte_hoehe_mm" lichte)
|
||||
(cons "buehne" (if buehne T 'FALSE))
|
||||
(cons "bereiche" n-bereiche)
|
||||
(cons "reihen" (length reihen))
|
||||
(cons "regallaenge_mm" regal)
|
||||
(cons "regalgrundflaeche_mm2" grund)
|
||||
(cons "schienenlaenge_mm" schienen)
|
||||
(cons "haengeebenen" (lg-haengeebenen-summen reihen))
|
||||
(cons "gaenge" (lg-gaenge-je-art gaenge))
|
||||
(cons "belagsflaeche_mm2" belag)
|
||||
(cons "gitterrostflaeche_mm2" gitter)
|
||||
(cons "gitterkorb" (list 'OBJ (cons "reihen" (nth 0 korb))
|
||||
(cons "bodenflaeche_mm2" (nth 1 korb))
|
||||
(cons "seitenflaeche_mm2" (nth 2 korb))
|
||||
(cons "offen_laengs_mm" (nth 3 korb))
|
||||
(cons "offen_stirn_mm" (nth 4 korb)))))
|
||||
(cons 'OBJ (reverse hk)))
|
||||
)
|
||||
|
||||
(defun lg-summe-feld (objs key)
|
||||
(apply '+ (cons 0.0 (mapcar '(lambda (o) (lg-n (lg-j o key))) objs)))
|
||||
)
|
||||
|
||||
;; Kennwerte des ganzen Lagers. geschosse = Geschoss-Records mit kennwerte
|
||||
;; und kontur, reihen/gaenge = alle einem Geschoss zugeordneten Records.
|
||||
(defun lg-kennwerte-lager (geschosse reihen gaenge n-bereiche / kws korb bbs xmin ymin xmax ymax dx dy)
|
||||
(setq kws (mapcar '(lambda (g) (lg-j g "kennwerte")) geschosse)
|
||||
korb (mapcar '(lambda (k) (lg-j k "gitterkorb")) kws)
|
||||
bbs (vl-remove nil (mapcar '(lambda (g) (cdr (lg-j (lg-j g "kontur") "bbox"))) geschosse)))
|
||||
(if bbs
|
||||
(setq xmin (apply 'min (mapcar 'car bbs)) ymin (apply 'min (mapcar 'cadr bbs))
|
||||
xmax (apply 'max (mapcar 'caddr bbs)) ymax (apply 'max (mapcar 'cadddr bbs))
|
||||
dx (- xmax xmin) dy (- ymax ymin)))
|
||||
(list 'OBJ
|
||||
(cons "geschosse" (length geschosse))
|
||||
(cons "bereiche" n-bereiche)
|
||||
(cons "reihen" (length reihen))
|
||||
(cons "regallaenge_mm" (lg-summe-feld kws "regallaenge_mm"))
|
||||
(cons "regalgrundflaeche_mm2" (lg-summe-feld kws "regalgrundflaeche_mm2"))
|
||||
(cons "schienenlaenge_mm" (lg-summe-feld kws "schienenlaenge_mm"))
|
||||
(cons "haengeebenen" (lg-haengeebenen-summen reihen))
|
||||
(cons "gaenge" (lg-gaenge-je-art gaenge))
|
||||
(cons "belagsflaeche_mm2" (lg-summe-feld kws "belagsflaeche_mm2"))
|
||||
(cons "gitterrostflaeche_mm2" (lg-summe-feld kws "gitterrostflaeche_mm2"))
|
||||
(cons "gitterkorb" (list 'OBJ (cons "reihen" (fix (lg-summe-feld korb "reihen")))
|
||||
(cons "bodenflaeche_mm2" (lg-summe-feld korb "bodenflaeche_mm2"))
|
||||
(cons "seitenflaeche_mm2" (lg-summe-feld korb "seitenflaeche_mm2"))
|
||||
(cons "offen_laengs_mm" (lg-summe-feld korb "offen_laengs_mm"))
|
||||
(cons "offen_stirn_mm" (lg-summe-feld korb "offen_stirn_mm"))))
|
||||
(cons "huelle" (if bbs
|
||||
(list 'OBJ (cons "bbox" (list 'ARR xmin ymin xmax ymax))
|
||||
(cons "laenge_mm" (max dx dy))
|
||||
(cons "breite_mm" (min dx dy))))))
|
||||
)
|
||||
|
||||
;; --- Records aus der Zeichnung ---
|
||||
|
||||
(defun lg-ent-layer (e) (cdr (assoc 8 (entget e))))
|
||||
|
||||
(defun lg-export-kontur (k / pts)
|
||||
(if (and k (setq pts (ssg-lwpoly-punkte k)))
|
||||
(list 'OBJ
|
||||
(cons "handle" (lg-handle k))
|
||||
(cons "z" (cond ((caddr (car pts))) (0.0)))
|
||||
(cons "punkte" (lg-j-pkte (mapcar '(lambda (p) (list (car p) (cadr p))) pts)))
|
||||
(cons "flaeche_mm2" (ssg-poly-flaeche pts))
|
||||
(cons "umfang_mm" (ssg-poly-umfang pts))
|
||||
(cons "bbox" (lg-j-bbox (ssg-poly-bbox pts)))))
|
||||
)
|
||||
|
||||
(defun lg-export-geschoss-rec (g / a)
|
||||
(setq a (caddr g))
|
||||
(list 'OBJ
|
||||
(cons "nr" (cadr g))
|
||||
(cons "bezeichnung" (cdr (assoc "BEZEICHNUNG" a)))
|
||||
(cons "id" (cdr (assoc "ID" a)))
|
||||
(cons "handle" (lg-handle (car g)))
|
||||
(cons "layer" (lg-ent-layer (car g)))
|
||||
(cons "hoehe_belag_mm" (lg-a-zahl a "HOEHE_BELAG_mm"))
|
||||
(cons "konstr_hoehe_mm" (lg-a-zahl a "KONSTR_HOEHE_mm"))
|
||||
(cons "lichte_hoehe_mm" (lg-a-zahl a "LICHTE_HOEHE_mm"))
|
||||
(cons "belag_art" (cdr (assoc "BELAG_ART" a)))
|
||||
(cons "personen" (lg-a-int a "PERSONEN"))
|
||||
(cons "brandgefaehrdung" (cdr (assoc "BRANDGEFAEHRDUNG" a)))
|
||||
(cons "kontur" (lg-export-kontur (lg-ent-aus-handle (lg-xdata-wert (car g) "kontur"))))))
|
||||
|
||||
(defun lg-export-bereich-rec (e / a kinder)
|
||||
(setq a (ssg-attrib-read e) kinder (lg-bereich-kinder e))
|
||||
(list 'OBJ
|
||||
(cons "nr" (lg-a-int a "NR"))
|
||||
(cons "id" (cdr (assoc "ID" a)))
|
||||
(cons "handle" (lg-handle e))
|
||||
(cons "layer" (lg-ent-layer e))
|
||||
(cons "geschoss" (lg-a-int a "GESCHOSS"))
|
||||
(cons "gangbreite_mm" (lg-a-zahl a "GANGBREITE_mm"))
|
||||
(cons "regaltiefe_mm" (lg-a-zahl a "REGALTIEFE_mm"))
|
||||
(cons "reihen_je_gang" (lg-a-int a "REIHEN_JE_GANG"))
|
||||
(cons "schienen_je_gang" (lg-a-int a "SCHIENEN_JE_GANG"))
|
||||
(cons "quergang_abstand_mm" (lg-a-zahl a "QUERGANG_ABSTAND_mm"))
|
||||
(cons "quergang_breite_mm" (lg-a-zahl a "QUERGANG_BREITE_mm"))
|
||||
(cons "richtung_grad" (lg-a-zahl a "RICHTUNG"))
|
||||
(cons "haengeebenen" (lg-j-ebenen (cdr (assoc "HAENGEEBENEN" a))))
|
||||
(cons "belag" (cdr (assoc "BELAG" a)))
|
||||
(cons "unter_reihe" (lg-unter-reihe-wert (cdr (assoc "UNTER_REIHE" a)) (lg-unter-reihe-vorgabe) T))
|
||||
(cons "gitterkorb_hoehe_mm" (cond ((lg-a-zahl a "GITTERKORB_HOEHE_mm"))
|
||||
((lg-zahl (lg-vorgabe '("bereich" "gitterkorb_hoehe_mm") nil)))))
|
||||
(cons "randgang_mm" (cons 'OBJ (mapcar '(lambda (r) (cons (strcase (car r) T) (cdr r)))
|
||||
(lg-bereich-rand a))))
|
||||
(cons "restbreite_mm" (lg-a-zahl a "RESTBREITE_mm"))
|
||||
(cons "anzahl_reihen" (length (vl-remove-if-not '(lambda (k) (wcmatch (strcase (lg-blockname k)) "LG_REIHE_*")) kinder)))
|
||||
(cons "anzahl_gaenge" (length (vl-remove-if-not '(lambda (k) (wcmatch (strcase (lg-blockname k)) "LG_GANG_*")) kinder)))
|
||||
(cons "kontur" (lg-export-kontur (lg-ent-aus-handle (lg-xdata-wert e "kontur"))))))
|
||||
|
||||
;; Reihe oder Gang: Attribute plus Geometrie (Start/Ende/Mitte in WCS mit Z,
|
||||
;; Ecken des Grundrisses 2D aus lg-linie-polygon).
|
||||
(defun lg-export-linie-rec (e art / a ed p1 z rot l b p2 quelle)
|
||||
(setq a (ssg-attrib-read e) ed (entget e)
|
||||
p1 (cdr (assoc 10 ed)) z (cond ((caddr p1)) (0.0))
|
||||
rot (cond ((cdr (assoc 50 ed))) (0.0))
|
||||
l (lg-a-zahl a "LAENGE")
|
||||
b (lg-a-zahl a (if (= art "reihe") "TIEFE_mm" "BREITE_mm"))
|
||||
p2 (polar (list (car p1) (cadr p1)) rot (lg-n l))
|
||||
quelle (cdr (assoc "QUELLE" a)))
|
||||
(if (member quelle '(nil "")) (setq quelle "auto"))
|
||||
(cons 'OBJ
|
||||
(append
|
||||
(list (cons "geschoss" (lg-a-int a "GESCHOSS"))
|
||||
(cons "laenge_mm" (lg-a-zahl a "LAENGE")))
|
||||
(list (cons "id" (cdr (assoc "ID" a)))
|
||||
(cons "handle" (lg-handle e))
|
||||
(cons "layer" (lg-ent-layer e))
|
||||
(cons "geschoss" (lg-a-int a "GESCHOSS"))
|
||||
(cons "bereich" (lg-a-int a "BEREICH"))
|
||||
(cons "bereich_handle" (lg-xdata-wert e "bereich"))
|
||||
(cons "quelle" quelle)
|
||||
(cons "laenge_mm" l))
|
||||
(if (= art "reihe")
|
||||
(list (cons "tiefe_mm" (lg-a-zahl a "TIEFE_mm"))
|
||||
(cons "haengeebenen" (lg-json-ebenen (cdr (assoc "HAENGEEBENEN" a))))
|
||||
(list (cons "tiefe_mm" b)
|
||||
(cons "schienen" (lg-a-int a "SCHIENEN"))
|
||||
(cons "quelle" (cdr (assoc "QUELLE" a))))
|
||||
(list (cons "breite_mm" (lg-a-zahl a "BREITE_mm"))
|
||||
(cons "haengeebenen" (lg-j-ebenen (cdr (assoc "HAENGEEBENEN" a)))))
|
||||
(list (cons "breite_mm" b)
|
||||
(cons "art" (cdr (assoc "ART" a)))
|
||||
(cons "belag" (cdr (assoc "BELAG" a)))
|
||||
(cons "quelle" (if (member (cdr (assoc "QUELLE" a)) '(nil "")) "auto"
|
||||
(cdr (assoc "QUELLE" a))))))
|
||||
(list (cons "bereich" (lg-a-int a "BEREICH"))
|
||||
(cons "start" (lg-json-zahlen (cdr (assoc 10 ed))))
|
||||
(cons "winkel_grad" (* (/ (cond ((cdr (assoc 50 ed))) (0.0)) pi) 180.0))
|
||||
(cons "handle" (lg-handle e)))))
|
||||
(cons "belag" (cdr (assoc "BELAG" a)))))
|
||||
(list (cons "start" (list 'ARR (car p1) (cadr p1) z))
|
||||
(cons "ende" (list 'ARR (car p2) (cadr p2) z))
|
||||
(cons "mitte" (list 'ARR (/ (+ (car p1) (car p2)) 2.0) (/ (+ (cadr p1) (cadr p2)) 2.0) z))
|
||||
(cons "winkel_grad" (* (/ rot pi) 180.0))
|
||||
(cons "ecken" (lg-j-pkte (lg-linie-polygon e)))
|
||||
(cons "flaeche_mm2" (* (lg-n l) (lg-n b))))))
|
||||
)
|
||||
|
||||
;; Alle Daten als JSON-Text.
|
||||
(defun lg-export-json ( / gs warn)
|
||||
(setq gs (lg-geschosse) warn nil)
|
||||
;; unter_reihe je Reihe aus ihrem Bereich (sonst Vorgabe), auf Hallenboden
|
||||
;; "keine"; Reihen mit Gitterkorb bekommen (OBJ hoehe_mm) als Startwert.
|
||||
(defun lg-reihen-unter-setzen (reihen bereiche geschosse vorgabe / br gr u)
|
||||
(mapcar
|
||||
'(lambda (r / br gr u)
|
||||
(setq br (if (lg-j r "bereich_handle")
|
||||
(vl-some '(lambda (b) (if (equal (lg-j b "handle") (lg-j r "bereich_handle")) b)) bereiche))
|
||||
gr (vl-some '(lambda (g) (if (equal (lg-j g "nr") (lg-j r "geschoss")) g)) geschosse)
|
||||
u (lg-unter-reihe-wert (lg-j br "unter_reihe") vorgabe (lg-buehne-p (lg-j gr "belag_art"))))
|
||||
(lg-j-setzen
|
||||
(lg-j-setzen r "unter_reihe" u)
|
||||
"gitterkorb"
|
||||
(if (= u "gitterkorb")
|
||||
(list 'OBJ (cons "hoehe_mm" (cond ((lg-j br "gitterkorb_hoehe_mm"))
|
||||
((lg-zahl (lg-vorgabe '("bereich" "gitterkorb_hoehe_mm") nil)))))))))
|
||||
reihen)
|
||||
)
|
||||
|
||||
;; Alle Daten des Lagers als OBJ (Grundlage von lg-export-json).
|
||||
(defun lg-export-daten ( / warn gs bereiche reihen gaenge g-recs vorgabe g-neu r-neu r-gs g-gs i g nx nr nrs kw)
|
||||
(setq gs (lg-geschosse) warn nil vorgabe (lg-unter-reihe-vorgabe))
|
||||
(if (null gs) (setq warn (cons (ssg-text "lg-exp-keine-geschosse") warn)))
|
||||
(foreach g gs
|
||||
(if (null (cadddr g))
|
||||
(setq warn (cons (ssg-textf "lg-exp-geschoss-ohne-kontur" (list (itoa (cadr g)))) warn))))
|
||||
(strcat
|
||||
"{\n"
|
||||
" \"version\": 1,\n"
|
||||
" \"zeichnung\": " (lg-json-wert (strcat (getvar "DWGPREFIX") (getvar "DWGNAME"))) ",\n"
|
||||
" \"erzeugt\": " (lg-json-wert (ssg-timestamp)) ",\n"
|
||||
" \"einheit\": \"mm\",\n"
|
||||
" \"land\": " (lg-json-wert (lg-land)) ",\n"
|
||||
" \"belag_yaml\": " (lg-json-obj (vl-remove-if '(lambda (p) (or (/= (type (cdr p)) 'STR)
|
||||
(= (car p) "beschreibung")))
|
||||
(lg-vorgabe '("belag_yaml") nil))) ",\n"
|
||||
" \"reihen_als_gitterrost\": " (lg-json-wert (if (lg-vorgabe '("flaechen" "reihen_als_gitterrost") nil) T nil)) ",\n"
|
||||
" \"geschosse\": " (lg-json-arr (mapcar 'lg-export-geschoss gs) " ") ",\n"
|
||||
" \"bereiche\": " (lg-json-arr (mapcar 'lg-export-bereich (lg-alle-bloecke "LG_BEREICH")) " ") ",\n"
|
||||
" \"reihen\": " (lg-json-arr (mapcar '(lambda (e) (lg-export-linie e "reihe")) (lg-alle-bloecke "LG_REIHE_*")) " ") ",\n"
|
||||
" \"gaenge\": " (lg-json-arr (mapcar '(lambda (e) (lg-export-linie e "gang")) (lg-alle-bloecke "LG_GANG_*")) " ") ",\n"
|
||||
" \"warnungen\": " (lg-json-arr (mapcar 'lg-json-wert warn) " ") "\n"
|
||||
"}\n")
|
||||
(setq bereiche (mapcar 'lg-export-bereich-rec (lg-alle-bloecke "LG_BEREICH"))
|
||||
reihen (mapcar '(lambda (e) (lg-export-linie-rec e "reihe")) (lg-alle-bloecke "LG_REIHE_*"))
|
||||
gaenge (mapcar '(lambda (e) (lg-export-linie-rec e "gang")) (lg-alle-bloecke "LG_GANG_*"))
|
||||
;; Geschosse von unten nach oben (Belagshoehe, dann Nr)
|
||||
g-recs (vl-sort (mapcar 'lg-export-geschoss-rec gs)
|
||||
'(lambda (a b / ha hb)
|
||||
(setq ha (lg-n (lg-j a "hoehe_belag_mm")) hb (lg-n (lg-j b "hoehe_belag_mm")))
|
||||
(if (equal ha hb 1e-6) (< (lg-j a "nr") (lg-j b "nr")) (< ha hb)))))
|
||||
(setq reihen (lg-reihen-unter-setzen reihen bereiche g-recs vorgabe))
|
||||
(setq g-neu nil r-neu nil r-gs nil g-gs nil i 0)
|
||||
(foreach g g-recs
|
||||
(setq nr (lg-j g "nr")
|
||||
nx (nth (1+ i) g-recs)
|
||||
r-gs (lg-reihen-gitterkorb-berechnen
|
||||
(vl-remove-if-not '(lambda (r) (equal (lg-j r "geschoss") nr)) reihen) 1.0)
|
||||
g-gs (vl-remove-if-not '(lambda (x) (equal (lg-j x "geschoss") nr)) gaenge)
|
||||
kw (lg-kennwerte-geschoss g nx r-gs g-gs
|
||||
(length (vl-remove-if-not '(lambda (b) (equal (lg-j b "geschoss") nr)) bereiche))))
|
||||
(if (null (lg-j (car kw) "lichte_hoehe_mm"))
|
||||
(setq warn (cons (ssg-textf "lg-exp-lichte-hoehe-oben" (list (itoa nr))) warn)))
|
||||
(if (not (lg-buehne-p (lg-j g "belag_art")))
|
||||
(foreach b bereiche
|
||||
(if (and (equal (lg-j b "geschoss") nr) (= (lg-j b "unter_reihe") "gitterkorb"))
|
||||
(setq warn (cons (ssg-textf "lg-exp-korb-hallenboden"
|
||||
(list (vl-princ-to-string (lg-j b "nr")) (itoa nr))) warn)))))
|
||||
(setq g-neu (cons (lg-j-setzen (lg-j-setzen g "kennwerte" (car kw)) "herkunft" (cadr kw)) g-neu)
|
||||
r-neu (append r-neu r-gs)
|
||||
i (1+ i)))
|
||||
(setq g-neu (reverse g-neu)
|
||||
nrs (mapcar '(lambda (g) (lg-j g "nr")) g-recs)
|
||||
r-gs (vl-remove-if '(lambda (r) (member (lg-j r "geschoss") nrs)) reihen))
|
||||
(if r-gs
|
||||
(setq warn (cons (ssg-textf "lg-exp-reihen-ohne-geschoss" (list (itoa (length r-gs)))) warn)))
|
||||
(list 'OBJ
|
||||
(cons "format" "ssg-lager")
|
||||
(cons "version" 2)
|
||||
(cons "zeichnung" (strcat (getvar "DWGPREFIX") (getvar "DWGNAME")))
|
||||
(cons "erzeugt" (ssg-timestamp))
|
||||
(cons "land" (lg-land))
|
||||
(cons "einheiten" (list 'OBJ (cons "laenge" "mm") (cons "flaeche" "mm2") (cons "winkel" "grad")))
|
||||
(cons "koordinaten" "WCS, Nord = +Y")
|
||||
(cons "lager" (lg-kennwerte-lager g-neu r-neu
|
||||
(vl-remove-if-not '(lambda (x) (member (lg-j x "geschoss") nrs)) gaenge)
|
||||
(length bereiche)))
|
||||
(cons "geschosse" (cons 'ARR g-neu))
|
||||
(cons "bereiche" (cons 'ARR bereiche))
|
||||
(cons "reihen" (cons 'ARR (append r-neu r-gs)))
|
||||
(cons "gaenge" (cons 'ARR gaenge))
|
||||
(cons "warnungen" (cons 'ARR (reverse warn))))
|
||||
)
|
||||
|
||||
;; Alle Daten als JSON-Text.
|
||||
(defun lg-export-json ( / )
|
||||
(strcat (lg-json-text (lg-export-daten) "") "\n")
|
||||
)
|
||||
|
||||
(defun lg-ausgabe-verzeichnis ( / d)
|
||||
@@ -2180,49 +2641,11 @@
|
||||
(progn (princ (ssg-textf "lg-exp-datei-fehler" (list pfad))) nil))
|
||||
)
|
||||
|
||||
;; Python-Skript lager_yaml_export.py aufrufen (nutzt die Interpreter-
|
||||
;; Ermittlung aus export.lsp). Rueckgabe: Exitcode oder nil.
|
||||
(defun lg-python-aufrufen (raw yaml html / skript hand log args rc)
|
||||
(cond
|
||||
((not (car (atoms-family 1 '("EXPORT:RUN-PYTHON"))))
|
||||
(princ (ssg-text "lg-exp-ohne-python")) nil)
|
||||
((null (getenv "DXFM_LIB")) (princ (ssg-text "lg-exp-ohne-python")) nil)
|
||||
(T
|
||||
(setq skript (strcat (vl-string-translate "\\" "/" (getenv "DXFM_LIB")) "/lager_yaml_export.py")
|
||||
hand (lg-ldata-lesen "HAND_YAML")
|
||||
log (strcat (lg-ausgabe-verzeichnis) "/lager_export_python.log"))
|
||||
(setq args (list raw yaml "--nachweis" html))
|
||||
(if (and hand (= (type hand) 'STR) (findfile hand))
|
||||
(setq args (append args (list "--hand" hand))))
|
||||
(setq rc (export:run-python (export:python-exe) skript args log))
|
||||
(if (and rc (/= rc 0))
|
||||
(princ (ssg-textf "lg-exp-python-fehler" (list (vl-princ-to-string rc) log))))
|
||||
rc)
|
||||
)
|
||||
)
|
||||
|
||||
(defun c:LAGER_EXPORT ( / dir basis raw yaml html rc)
|
||||
(setq dir (lg-ausgabe-verzeichnis) basis (lg-dwg-basis))
|
||||
(setq raw (strcat dir "/" basis "_lager_raw.json")
|
||||
yaml (strcat dir "/" basis "_drawing.yaml")
|
||||
html (strcat dir "/" basis "_nachweis.html"))
|
||||
(if (lg-export-schreiben raw)
|
||||
(progn
|
||||
(princ (ssg-textf "lg-exp-raw" (list raw)))
|
||||
(setq rc (lg-python-aufrufen raw yaml html))
|
||||
(if (and rc (= rc 0))
|
||||
(princ (ssg-textf "lg-exp-yaml" (list yaml html))))))
|
||||
(princ)
|
||||
)
|
||||
|
||||
;; Hand-YAML fuer den Abgleich (Konfliktliste) festlegen; leer = keiner.
|
||||
(defun c:LAGER_HAND_YAML ( / alt neu)
|
||||
(setq alt (lg-ldata-lesen "HAND_YAML"))
|
||||
(setq neu (if (ssg-gui-p)
|
||||
(getfiled (ssg-text "lg-titel-hand-yaml") (if (= (type alt) 'STR) alt "") "yaml" 0)
|
||||
(ssg-in-string (ssg-text "lg-titel-hand-yaml") (if (= (type alt) 'STR) alt ""))))
|
||||
(lg-ldata-setzen "HAND_YAML" (if neu neu ""))
|
||||
(princ (ssg-textf "lg-hand-yaml" (list (if (and neu (/= neu "")) neu "-"))))
|
||||
;; Technische Daten des Lagers als <dwg>_lager.json nach DXFM_RESULTS.
|
||||
(defun c:LAGER_EXPORT ( / pfad)
|
||||
(setq pfad (strcat (lg-ausgabe-verzeichnis) "/" (lg-dwg-basis) "_lager.json"))
|
||||
(if (lg-export-schreiben pfad)
|
||||
(princ (ssg-textf "lg-exp-json" (list pfad))))
|
||||
(princ)
|
||||
)
|
||||
|
||||
|
||||
Reference in new issue
Block a user