;;--------------------------------------------------------------------------* ;; Modulbeschreibung: ;; Hilfsbolzen ;;--------------------------------------------------------------------------* ;; Dateiname: Kreiskante_dehnen.lsp ;; Version : 1.0 ;; Datum : 02.07.2025 ;; Author : mibr ;; Beschreibung: Dehnt Kreiskanten im bestimmten Winkel zueinander ;;--------------------------------------------------------------------------* ;; v1.01 Paar Kleinigkeiten -> Anregungen von Der_Wolfgang 07.07.2025 ;;--------------------------------------------------------------------------* (in-package :mibr) (use-package :oli) (sd-defdialog 'kreiskante_dehen :dialog-title (sd-multi-lang-string "stretchy circle" :german "Kreiskante dehnen") :toolbox-button t :variables '( (ueber0 :title (sd-multi-lang-string "Options" :german "Option")) (push-rueck :push-action (progn (sd-return-to-model-checkpoint recover_b) (werte_berech)) :title (sd-multi-lang-string "Undo Changes" :german "Änderungen Rückgängig") :toggle-type :wide-toggle ) (ueber1 :title (sd-multi-lang-string "Circular Edge" :german "Kreiskante")) (f_kreis :selection *sd-circle-3d-seltype* :title (sd-multi-lang-string "fix circular" :german "Fixe") :prompt-text (sd-multi-lang-string "fix circular" :german "Fixe Kreiskante") :initial-visible t :next-variable 'o_kreis :after-input (werte_berech) ) (o_kreis :selection *sd-circle-3d-seltype* :title (sd-multi-lang-string "stretchy circular" :german "Dehnende") :prompt-text (sd-multi-lang-string "stretchy circular element" :german "Zu dehnende Kreiskante angeben") :initial-visible t :after-input (werte_berech) :next-variable 'gew_winkel ) (ueber2 :title (sd-multi-lang-string "Angle" :german "Winkel")) (akt_winkel :value-type :display-only :title (sd-multi-lang-string "current angle" :german "Aktueller") :initial-value 0.0 ) (gew_winkel :value-type :number :title (sd-multi-lang-string "new angle" :german "Neuer") :after-input (progn (werte_berech) (dehne_kante)) :check-function (lambda (gew_winkel) (if (and (>= gew_winkel -89.99999) (<= gew_winkel 89.99999)) :ok (values :error (sd-multi-lang-string "Angle must be in the range of ±89.9°" :german "Winkel muss im Bereich von ±89.9° liegen")) ) ) ) ("-") (push-umk :push-action (when akt_winkel (sd-set-variable-status 'gew_winkel :value (- 0 akt_winkel))) :title (sd-multi-lang-string "Invert" :german "Umkehren") :toggle-type :right-toggle ) (recover_b :initial-value (sd-set-model-checkpoint)) (d_fix) (d_offen) (akt_abst) (achs_abstand) ) ;variables :local-functions '( (werte_berech () (let (p1_struct p2_struct achse_pos_neg achse_p1_p2 p1_achse p2_achse p1_nullpunkt p2_nullpunkt) (when (and f_kreis o_kreis) (setf p1_struct (sd-inq-geo-props f_kreis :dest-space :global)) (setf p2_struct (sd-inq-geo-props o_kreis :dest-space :global)) (setf p1_achse (sd-circle-normal p1_struct)) (setf p2_achse (sd-circle-normal p2_struct)) (setf p1_nullpunkt (sd-circle-center p1_struct)) (setf p2_nullpunkt (sd-circle-center p2_struct)) (when (sd-vec-null-p (sd-vec-cross-product p1_achse p2_achse)) ; wenn Kreuzprodukt der Achsrichtungen = Nullvektor, dann sind Achsen parallel (setf achs_abstand (/ (sd-vec-length (sd-vec-cross-product p1_achse (sd-vec-subtract p2_nullpunkt p1_nullpunkt))) (sd-vec-length p1_achse))) ) ;Achsabstand 0? (setf akt_abst (sd-vec-length (sd-vec-subtract p1_nullpunkt p2_nullpunkt))) ;Abstand ermitteln immer positiv (setf achse_p1_p2 (first (sd-call-cmds (measure_dir_3d :two_pt p1_nullpunkt p2_nullpunkt)))) ;Achse von Kreis 1-2 (when achse_p1_p2 (setf achse_pos_neg (sd-rad-to-deg (sd-vec-angle-between (sd-circle-normal p1_struct) achse_p1_p2)))) ;Winkel der Achsen des Kreis 1 zu Achse Kreis 1-2 (when (and achse_pos_neg (sd-num-equal-p achse_pos_neg 180)) (setf akt_abst (- 0 akt_abst)) ) ;Abstandswert postive oder negativ nach den Achsrichtungen 0° oder 180° (setf d_fix (sd-call-cmds (measure_dist :diameter f_kreis))) (setf d_offen (sd-call-cmds (measure_dist :diameter o_kreis))) (unless (= d_fix d_offen) ;wenn ø gleich der Kreiskanten gleich (setf akt_winkel (sd-rad-to-deg (atan (/ akt_abst (/ (- d_offen d_fix) 2))))) ) ; end unless ) ;when f_kreis, o_kreis ) ;end let ) ;end werte_berech (dehne_kante () (let (kreis_achse abst_deh_gesamt abst_deh) (if (and f_kreis o_kreis gew_winkel ;Werte müssen vorhanden sein (sd-num-equal-p achs_abstand 0) ;Achsabstand muss 0 sein (not (sd-num-equal-p d_fix d_offen)) ;ø dürfen nicht gleich sein (not (sd-num-equal-p gew_winkel akt_winkel))) ;keine action wenn Winkel gleich (progn (setf kreis_achse (sd-circle-normal (sd-inq-geo-props f_kreis :dest-space :global))) ;Achse von Kreis 1 (setf abst_deh_gesamt (* (/ (- d_offen d_fix) 2) (tan (sd-deg-to-rad gew_winkel)))) (setf abst_deh (- abst_deh_gesamt akt_abst)) (unless (= 0 abst_deh) (sd-call-cmds (stretch :edges o_kreis :check_fix :on :other-method :LINEAR :fix-axis-direction :on :current-direction kreis_achse :current-length abst_deh ) ) ;end stretch ) ;end unless (werte_berech) ) (sd-display-error (sd-multi-lang-string "Please Check Input / Model" :german "Bitte Angaben/Modell prüfen")) ) ;end if ) ;end let (setf gew_winkel nil) ) ;end dehne_kante ) ;local-functions ) ;sd-defdialog