Eckrad Befehle modifziert. Automatische Nummernvergabe in lisp impl.

This commit is contained in:
2026-05-28 14:47:12 +02:00
parent 788593599a
commit 18c2aa0a60
+61 -19
View File
@@ -282,10 +282,19 @@
(assoc "HOEHE" attribs) attribs))
(setq is-pin (equal (cdr (assoc "KREISELART" attribs)) "PIN"))
;; AUTOMATISCHE NUMMER VERGEBEN
(setq kreisel-nummer (kreisel-next-number))
(setq attribs (subst (cons "NUMMER" (itoa kreisel-nummer))
(assoc "NUMMER" attribs) attribs))
;; NUMMER: Bestehende beibehalten (Redraw/Edit), sonst neue vergeben
(setq kreisel-nummer (atoi (cdr (assoc "NUMMER" attribs))))
(if (<= kreisel-nummer 0)
(progn
(setq kreisel-nummer (kreisel-next-number))
(setq attribs (subst (cons "NUMMER" (itoa kreisel-nummer))
(assoc "NUMMER" attribs) attribs))
)
)
;; NAME automatisch setzen: "KreiselN"
(setq attribs (subst (cons "NAME" (strcat "Kreisel" (itoa kreisel-nummer)))
(assoc "NAME" attribs) attribs))
;; --- HÖHE BESTIMMEN ---
;; Priorität 1: Aus basePoint (wenn 3D Punkt mit Z > 0)
@@ -934,27 +943,60 @@
;; --------------------------------------------
;; ILS_Eckrad: Befehl - fragt Eingaben ab und fuegt Eckrad ein
;;
;; Ablauf:
;; 1. Beruehrpunkt anklicken (wo der Kreis tangential anliegen soll)
;; 2. Richtungspunkt anklicken (bestimmt Versatzrichtung zum Kreismittelpunkt)
;; 3. Kreismittelpunkt = Beruehrpunkt + Radius in Richtung des 2. Klicks
;; 4. Hoehe aus Z-Koordinate oder manuell
;; --------------------------------------------
(defun c:ILS_Eckrad ( / pt rotStr rotation hoehe)
(defun c:ILS_Eckrad ( / ptTangent ptDir dx dy dist ux uy radius
centerPt rotation hoehe)
(dbgf "c:ILS_Eckrad")
;; 1. Einfuegepunkt
(setq pt (getpoint "\nEinfuegepunkt Eckrad: "))
(if (null pt) (progn (dbgreturn nil) (exit)))
(dbg 'pt)
;; 1. Beruehrpunkt (Tangentenpunkt)
(setq ptTangent (getpoint "\nBeruehrpunkt Eckrad (Tangente): "))
(if (null ptTangent) (progn (dbgreturn nil) (exit)))
(dbg 'ptTangent)
;; 2. Rotation
(setq rotStr (getstring "\nRotation in Grad <0>: "))
(if (= rotStr "")
(setq rotation 0.0)
(setq rotation (atof rotStr))
;; 2. Richtungspunkt (Gummiband vom Beruehrpunkt)
(setq ptDir (getpoint ptTangent "\nRichtung zum Kreismittelpunkt: "))
(if (null ptDir) (progn (dbgreturn nil) (exit)))
(dbg 'ptDir)
;; 3. Winkel und Versatz berechnen
(setq dx (- (car ptDir) (car ptTangent))
dy (- (cadr ptDir) (cadr ptTangent)))
(setq dist (sqrt (+ (* dx dx) (* dy dy))))
(if (<= dist 0.001)
(progn
(princ "\nFehler: Beruehr- und Richtungspunkt sind identisch!")
(dbgreturn nil)
(exit)
)
)
;; Einheitsvektor in Richtung Beruehrpunkt -> Richtungspunkt
(setq ux (/ dx dist)
uy (/ dy dist))
;; Radius = halber Kreisdurchmesser
(setq radius (/ *kreisel-durchmesser* 2.0))
;; Kreismittelpunkt = Beruehrpunkt + Radius * Richtung
(setq centerPt (list (+ (car ptTangent) (* radius ux))
(+ (cadr ptTangent) (* radius uy))))
(dbg 'centerPt)
;; Rotation = Winkel der Versatzrichtung
(setq rotation (* (/ 180.0 pi) (atan dy dx)))
(dbg 'rotation)
;; 3. Hoehe bestimmen
(if (and (> (length pt) 2) (caddr pt) (> (caddr pt) 0))
;; 4. Hoehe bestimmen
(if (and (> (length ptTangent) 2) (caddr ptTangent) (> (caddr ptTangent) 0))
(progn
(setq hoehe (caddr pt))
(setq hoehe (caddr ptTangent))
(princ (strcat "\n-> Hoehe aus 3D-Punkt uebernommen: " (rtos hoehe 2 0)))
)
(progn
@@ -964,8 +1006,8 @@
)
(dbg 'hoehe)
;; 4. Einfuegen
(ils-eckrad-insert (list (car pt) (cadr pt) hoehe) rotation nil)
;; 5. Einfuegen (centerPt ist der Kreismittelpunkt)
(ils-eckrad-insert (list (car centerPt) (cadr centerPt) hoehe) rotation nil)
(dbgreturn nil)
)