Merge remote-tracking branch 'origin/master'
This commit is contained in:
+72
-31
@@ -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")))
|
||||
|
||||
Reference in New Issue
Block a user