diff --git a/Lisp/KreiselInsert.lsp b/Lisp/KreiselInsert.lsp index c46735c..ccbb025 100644 --- a/Lisp/KreiselInsert.lsp +++ b/Lisp/KreiselInsert.lsp @@ -208,19 +208,40 @@ ;; draw-module verwendet eine vorhandene Definition KREISEL_n_TYP_ABSTAND ;; wieder (Edit/Redraw) - ein geaenderter Name kaeme sonst nie in die ;; Beschriftung. Wirkt auf alle Referenzen dieser Definition. -(defun kreisel-label-aktualisieren (bname textStr / e ed) +(defun kreisel-label-aktualisieren (bname textStr winkel / e ed) (setq e (tblobjname "BLOCK" bname)) (while (setq e (entnext e)) (setq ed (entget e)) (if (and (= (cdr (assoc 0 ed)) "TEXT") - (/= (cdr (assoc 1 ed)) textStr)) - (entmod (subst (cons 1 textStr) (assoc 1 ed) ed)) + (or (/= (cdr (assoc 1 ed)) textStr) + (not (equal (cdr (assoc 50 ed)) (kreisel-grad->rad winkel) 1e-6)))) + (progn + (setq ed (subst (cons 1 textStr) (assoc 1 ed) ed)) + (setq ed (subst (cons 50 (kreisel-grad->rad winkel)) (assoc 50 ed) ed)) + (entmod ed) + ) ) ) ) +(defun kreisel-grad->rad (grad) + (* grad (/ pi 180.0)) +) + +;; Textwinkel INNERHALB der Blockdefinition (Grad, reiner Kern, getestet). +;; Der Block wird mit `rotation` eingefuegt; die Schrift soll in der Welt von +;; unten oder von links lesbar sein, also Weltwinkel in [270,360) und [0,90). +;; Liegt der Block im Bereich [90,270) (z.B. horizontal SM / vertikal MS), +;; wird die Schrift um 180 Grad um ihren Mittelpunkt gedreht (Text ist +;; mittig ausgerichtet, die Mitte bleibt daher stehen). +(defun kreisel-label-winkel (rotation / w) + (setq w (- rotation (* 360.0 (fix (/ rotation 360.0))))) + (if (< w 0.0) (setq w (+ w 360.0))) + (if (and (>= w 89.999 ) (< w 269.999)) 180.0 0.0) +) + ;; Beschriftungstext erzeugen -(defun kreisel-make-label (nummer abstand kreiselart name / textStr insertPoint radius mitteX mitteY textHoehe lay) +(defun kreisel-make-label (nummer abstand kreiselart name winkel / textStr insertPoint radius mitteX mitteY textHoehe lay) (setq textStr (kreisel-label-text nummer name kreiselart abstand)) ;; Geometrie berechnen @@ -258,8 +279,8 @@ (cons 10 insertPoint) (cons 40 textHoehe) (cons 1 textStr) - (cons 50 0.0) - (cons 7 "Kreisel_Arial") ;; Arial Textstil + (cons 50 (kreisel-grad->rad winkel)) + (cons 7 "Kreisel_Arial") ;; Arial Textstil (cons 62 *kreisel-beschriftung-farbe*) '(72 . 1) ;; Horizontale Ausrichtung: Mitte '(73 . 2) ;; Vertikale Ausrichtung: Mitte @@ -561,8 +582,9 @@ ;; BESCHRIFTUNG einfügen (vor Block-Erzeugung, damit sie im Block ist) (kreisel-make-label kreisel-nummer abstand (if is-pin "PIN" "STANDARD") - (cdr (assoc "Bezeichnung" attribs))) - + (cdr (assoc "Bezeichnung" attribs)) + (kreisel-label-winkel rotation)) + ;; Unsichtbare Attribut-Definitionen erzeugen (ssg-attrib-make-defs *kreisel-attrib-defs* 50.0) @@ -593,7 +615,8 @@ ;; Beschriftung der wiederverwendeten Definition an den Namen anpassen (kreisel-label-aktualisieren bname (kreisel-label-text kreisel-nummer (cdr (assoc "Bezeichnung" attribs)) - (if is-pin "PIN" "STANDARD") abstand)) + (if is-pin "PIN" "STANDARD") abstand) + (kreisel-label-winkel rotation)) ;; ebenso die Spiegelung der Drehrichtungspfeile (kreisel-pfeil-aktualisieren bname (cdr (assoc "DREHRICHTUNG" attribs))) ) diff --git a/tests/test_unit.lsp b/tests/test_unit.lsp index e347ebe..4a15775 100644 --- a/tests/test_unit.lsp +++ b/tests/test_unit.lsp @@ -1272,6 +1272,14 @@ (tu-eq "kreisel-label-text/leer" "KREISEL 3: PIN_4000" (kreisel-label-text 3 "" "PIN" 4000.0)) + ;; Beschriftungswinkel: von unten oder links lesbar + (tu-eq "kreisel-label-winkel/0" 0.0 (kreisel-label-winkel 0.0)) + (tu-eq "kreisel-label-winkel/90" 180.0 (kreisel-label-winkel 90.0)) + (tu-eq "kreisel-label-winkel/180" 180.0 (kreisel-label-winkel 180.0)) + (tu-eq "kreisel-label-winkel/270" 0.0 (kreisel-label-winkel 270.0)) + (tu-eq "kreisel-label-winkel/-90" 0.0 (kreisel-label-winkel -90.0)) + (tu-eq "kreisel-label-winkel/450" 180.0 (kreisel-label-winkel 450.0)) + ;; Eckrad-Dialog: Eingaben -> (attribs . rotation) (setq _e (eckrad-dialog-werte '(("NUMMER" . "3") ("HOEHE" . "0") ("DREHRICHTUNG" . "UZS")) "Eck3" "2500" "-90" "1" "0" "1"))