[ADD] weitere Gerüstkomponenten hinzugefügt

This commit is contained in:
2026-10-09 14:38:11 +02:00
parent fe5cb9664c
commit d3ddcb9d59
9 changed files with 127 additions and 81 deletions
+72 -31
View File
@@ -1553,43 +1553,81 @@
(list (car p) (cadr p) (if (caddr p1) (caddr p1) 0.0))
)
;; Positionen der Querstreben entlang der Traegerlinie (Abstand ab Linienanfang).
;; Regeln: Abstand zwischen zwei Streben hoechstens abstand-max, beide
;; Endabstaende gleich und in [rand-min, rand-max], so wenige Streben wie
;; moeglich.
;; netto <= 2*rand-max -> eine Strebe in der Mitte
;; sonst -> k = aufgerundet (netto - 2*rand-max) / abstand-max
;; Felder (= wenigste Streben). Rand
;; r = max(rand-min, (netto - k*abstand-max) / 2):
;; der Abstand ist damit GENAU abstand-max, solange der
;; Rand >= rand-min bleibt; nur sonst bleibt der Rand
;; bei rand-min und der Abstand wird etwas kleiner.
;; Mit genau abstand-max geht nicht jede Laenge auf (1100 mm: 2 Streben ->
;; Rand 300, 3 Streben -> Rand 50) - dort ergibt sich 100 | 450 | 450 | 100.
;; r <= rand-max ist durch die Wahl von k garantiert.
;; Kuerzer als 2*rand-min -> keine Strebe (der Mindestrand waere verletzt).
(defun geruest-traeger-streben (netto abstand-max rand-min rand-max / k r s i erg)
(cond
((or (null netto) (< netto (- (* 2.0 rand-min) 1e-6))) nil)
((<= netto (+ (* 2.0 rand-max) 1e-6)) (list (/ netto 2.0)))
(T
(setq k (/ (- netto (* 2.0 rand-max)) abstand-max))
;; aufrunden, Rundungsrauschen (z.B. 2.0000000001) nicht mitzaehlen
(setq k (if (equal k (fix k) 1e-6) (fix k) (1+ (fix k))))
(setq r (max rand-min (/ (- netto (* k abstand-max)) 2.0)))
(setq s (/ (- netto (* 2.0 r)) k))
(setq erg nil i k)
;; Abweichung eines Randes vom erlaubten Bereich [rand-min, rand-max]
;; (0 = innerhalb).
(defun geruest-rand-abweichung (r rand-min rand-max)
(cond ((< r rand-min) (- rand-min r))
((> r rand-max) (- r rand-max))
(T 0.0))
)
;; Querstreben-Plan: (rand positionen). Regel: der Abstand zwischen zwei
;; Streben ist IMMER genau abstand, beide Raender sind gleich:
;; netto = k * abstand + 2 * rand (k = Felder, k+1 Streben)
;; Gewaehlt wird das k, dessen Rand am naechsten am Bereich [rand-min,
;; rand-max] liegt (bei Gleichstand das mit weniger Streben). Weil der
;; Bereich schmaler ist als abstand, geht nicht jede Laenge auf: mit 500/
;; 100..250 liegt der Rand genau dann im Bereich, wenn netto mod 500 = 0 oder
;; in [200, 500) ist - bei 1001..1199 mm oder unter 200 mm z.B. nicht. Der Plan
;; wird dann trotzdem geliefert, die Pruefung (geruest-rand-abweichung) und
;; die Meldung uebernimmt der Aufrufer. netto <= 0 -> nil.
(defun geruest-traeger-streben-plan (netto abstand rand-min rand-max
/ k kmax r dev best-k best-r best-dev i erg)
(if (and netto (> netto 1e-6) abstand (> abstand 1e-6))
(progn
(setq kmax (fix (+ (/ netto abstand) 1e-9)) k 0 best-k nil)
(while (<= k kmax)
(setq r (/ (- netto (* k abstand)) 2.0))
(if (>= r -1e-9)
(progn
(setq dev (geruest-rand-abweichung r rand-min rand-max))
;; strikt kleiner: bei Gleichstand bleibt das kleinere k
(if (or (null best-k) (< dev (- best-dev 1e-6)))
(setq best-k k best-r (max r 0.0) best-dev dev))
)
)
(setq k (1+ k))
)
(setq erg nil i best-k)
(while (>= i 0)
(setq erg (cons (+ r (* i s)) erg))
(setq erg (cons (+ best-r (* i abstand)) erg))
(setq i (1- i))
)
erg
(list best-r erg)
)
)
)
;; Rand des Streben-Plans gegen [rand-min, rand-max] pruefen und bei
;; Abweichung den Benutzer informieren (Messagebox, ohne GUI auf die
;; Konsole). strebe = Ergebnis von geruest-traeger-strebe-cfg.
;; Rueckgabe: T = Rand im Bereich.
(defun geruest-traeger-rand-pruefen (netto strebe / plan txt)
(setq plan (geruest-traeger-streben-plan netto (nth 3 strebe) (nth 4 strebe) (nth 5 strebe)))
(if (and plan
(> (geruest-rand-abweichung (car plan) (nth 4 strebe) (nth 5 strebe)) 1e-6))
(progn
(setq txt (ssg-textf "gr-tr-strebe-rand"
(list (geruest-mm-string netto)
(geruest-mm-string (car plan))
(geruest-mm-string (nth 4 strebe))
(geruest-mm-string (nth 5 strebe))
(geruest-mm-string (nth 3 strebe))
(itoa (length (cadr plan))))))
(if (ssg-gui-p) (alert txt) (princ (strcat "\n" txt)))
nil
)
T
)
)
;; Nur die Positionen der Querstreben (Abstand ab Linienanfang).
(defun geruest-traeger-streben (netto abstand rand-min rand-max)
(cadr (geruest-traeger-streben-plan netto abstand rand-min rand-max))
)
;; Querstreben-Konfiguration (Variante vor Baugruppe) als
;; (dummy laenge querlinie abstand-max rand-min rand-max) oder nil, wenn keine
;; (dummy laenge querlinie abstand rand-min rand-max) oder nil, wenn keine
;; "querstrebe" definiert ist.
;; dummy = DWG unter data/geruest (Basispunkt Strebenmitte, 30 mm laengs
;; X) oder nil
@@ -1605,7 +1643,7 @@
(mapcar '(lambda (feld std)
(setq w (ssg-json-get q feld))
(if (numberp w) (float w) std))
'("laenge" "querlinie" "abstand_max" "rand_min" "rand_max")
'("laenge" "querlinie" "abstand" "rand_min" "rand_max")
'(30.0 25.0 500.0 100.0 250.0)))
)
)
@@ -1863,7 +1901,7 @@
(ssg-make-layer lay (ssg-layer-farbe-fuer-name lay) T)
(entmake (list '(0 . "LINE") (cons 8 lay)
'(10 0.0 0.0 0.0) (list 11 netto 0.0 0.0)))
;; strebe = (dummy laenge querlinie abstand-max rand-min rand-max)
;; strebe = (dummy laenge querlinie abstand rand-min rand-max)
(if strebe
(foreach x (geruest-traeger-streben netto (nth 3 strebe) (nth 4 strebe) (nth 5 strebe))
(if strebe-pfad
@@ -1969,6 +2007,9 @@
(if min-l (geruest-mm-string min-l) "0")
(if max-l (geruest-mm-string max-l) "-")))))
(T
;; Streben-Rand ausserhalb der Grenzen: informieren, aber trotzdem
;; einfuegen (der Abstand zwischen den Streben bleibt immer exakt)
(if strebe (geruest-traeger-rand-pruefen netto strebe))
(setq werte (cons (cons "LAENGE" (geruest-mm-string netto)) werte-basis))
(ssg-start nil '(("OSMODE") ("ATTREQ") ("ATTDIA")
("ANGBASE") ("ANGDIR") ("AUNITS")))