From 18c2aa0a607d7662c53fa8eeec20ba060916be01 Mon Sep 17 00:00:00 2001 From: Michael Stangl Date: Thu, 28 May 2026 14:47:12 +0200 Subject: [PATCH] Eckrad Befehle modifziert. Automatische Nummernvergabe in lisp impl. --- Lisp/KreiselInsert.lsp | 80 ++++++++++++++++++++++++++++++++---------- 1 file changed, 61 insertions(+), 19 deletions(-) diff --git a/Lisp/KreiselInsert.lsp b/Lisp/KreiselInsert.lsp index f288af8..a827ba8 100644 --- a/Lisp/KreiselInsert.lsp +++ b/Lisp/KreiselInsert.lsp @@ -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) )