From 9ce67480205f71a65b6f70c57e08b97431d66af9 Mon Sep 17 00:00:00 2001 From: Yuelin Wang Date: Wed, 20 May 2026 08:55:05 +0200 Subject: [PATCH] =?UTF-8?q?Kreisel=20wurde=20mit=20Beschriftung=20erstellt?= =?UTF-8?q?=20und=20Die=20H=C3=B6he=20des=20Basispunktes=20bestimmt=20die?= =?UTF-8?q?=20H=C3=B6he=20des=20neuen=20Kreisels.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lisp/KreiselInsert.lsp | 480 +++++++++++++++++++++++++++++++++-------- 1 file changed, 389 insertions(+), 91 deletions(-) diff --git a/Lisp/KreiselInsert.lsp b/Lisp/KreiselInsert.lsp index 73b7b3f..0feef3c 100644 --- a/Lisp/KreiselInsert.lsp +++ b/Lisp/KreiselInsert.lsp @@ -8,6 +8,12 @@ ;; TEIL 1: GLOBALE EINSTELLUNGEN ;; ============================================================ +;; Zähler für Kreisel-Nummerierung (wird in Zeichnung gespeichert) +(if (null #Kreisel_LetzteNr) + (setq #Kreisel_LetzteNr 0) +) + +;; Block-Pfad (setq block-pfad (getenv "DXFM_BLOCKS")) (if (or (null block-pfad) (= block-pfad "")) @@ -25,9 +31,9 @@ (setq *kreisel-durchmesser* 800.0) ;; Kreisdurchmesser AN8/SP8 (setq *kreisel-pin-abstand* 100.0) ;; Einrueckung PIN-Linie vom Kreisrand (setq *kreisel-default-laenge* 2300.0) ;; Standard-Tangentenlaenge +(setq *kreisel-default-hoehe* 2000.0) ;; Standard-Höhe (Z-Koordinate) ;; Attribut-Definitionen: ((TAG DEFAULT) ...) -;; Reihenfolge = Reihenfolge der ATTDEFs im Block (setq *kreisel-attrib-defs* '(("DREHRICHTUNG" "UZS") ("N_SEPARATOREN" "2") @@ -35,17 +41,115 @@ ("N_SCANNER" "0") ("N_RAMPEN" "0") ("DREHUNG" "0") - ("ABSTAND" "2300")) + ("ABSTAND" "2300") + ("NUMMER" "0") + ("HOEHE" "0")) ) ;; Letzter gewaehlter Typ (gespeichert zwischen Aufrufen) (if (null #Kreisel_Typ) (setq #Kreisel_Typ "STANDARD")) +;; Beschriftungs-Einstellungen (NUR EINMAL definieren!) +(setq *kreisel-beschriftung-layer* "S_KRS_BESCHR") +(setq *kreisel-beschriftung-hoehe* 100.0) ;; Texthöhe in mm +(setq *kreisel-beschriftung-farbe* 7) ;; 7 = weiß +(setq *kreisel-beschriftung-abstand-oben* 0.0) ;; Abstand über Kreisel-Mitte +(setq *kreisel-beschriftung-schriftart* "Arial") ;; Schriftart + ;; ============================================================ ;; TEIL 2: HILFSFUNKTIONEN ;; ============================================================ +;; Funktion zum Erstellen/Setzen der Schriftart Arial +(defun kreisel-setup-textstyle ( / style-name) + (setq style-name "Kreisel_Arial") + + ;; Prüfen ob der Textstil bereits existiert + (if (not (tblsearch "STYLE" style-name)) + (progn + ;; Neuen Textstil mit Arial erstellen + (command "_.STYLE" style-name "Arial" 0 1 0 "N" "N" "N") + (princ (strcat "\n-> Textstil '" style-name "' mit Arial erstellt")) + ) + ) + + ;; Aktuellen Textstil setzen + (setvar "TEXTSTYLE" style-name) + style-name +) + +;; Nächste freie Kreisel-Nummer ermitteln +(defun kreisel-next-number ( / maxNr tag val ss i ent attribs) + (setq maxNr 0) + (if (setq ss (ssget "_X" '((0 . "INSERT") (2 . "KREISEL_*")))) + (progn + (setq i 0) + (repeat (sslength ss) + (setq ent (ssname ss i)) + (setq attribs (ssg-attrib-read ent)) + (setq tag (cdr (assoc "NUMMER" attribs))) + (if (and tag (setq val (atoi tag)) (> val maxNr)) + (setq maxNr val) + ) + (setq i (1+ i)) + ) + ) + ) + (if (= maxNr 0) + (setq maxNr #Kreisel_LetzteNr) + ) + (setq #Kreisel_LetzteNr (1+ maxNr)) + #Kreisel_LetzteNr +) + +;; Beschriftungstext erzeugen +(defun kreisel-make-label (nummer abstand kreiselart / textStr insertPoint radius mitteX mitteY textHoehe) + ;; Text: "KREISEL 1: PIN_4000" + (setq textStr (strcat "KREISEL " (itoa nummer) ": " kreiselart "_" (rtos abstand 2 0))) + + ;; Geometrie berechnen + (setq radius (/ *kreisel-durchmesser* 2.0)) + + ;; Mitte zwischen AN8 und SP8 (X-Mitte des gesamten Kreisels) + (setq mitteX (+ radius (/ abstand 2.0))) + + ;; Y-Position: Leicht über der mitteX + (setq mitteY *kreisel-beschriftung-abstand-oben*) + + ;; Texthöhe + (setq textHoehe *kreisel-beschriftung-hoehe*) ;; 100 mm + + ;; Position + (setq insertPoint (list mitteX mitteY 0)) + + ;; Schriftart Arial einstellen + (kreisel-setup-textstyle) + + ;; Layer erstellen + (ssg-make-layer *kreisel-beschriftung-layer* (itoa *kreisel-beschriftung-farbe*) T) + + ;; Text mit entmake erstellen (zentriert) + (entmake (list + '(0 . "TEXT") + (cons 8 *kreisel-beschriftung-layer*) + (cons 10 insertPoint) + (cons 40 textHoehe) + (cons 1 textStr) + (cons 50 0.0) + (cons 7 "Kreisel_Arial") ;; Arial Textstil + (cons 62 *kreisel-beschriftung-farbe*) + '(72 . 1) ;; Horizontale Ausrichtung: Mitte + '(73 . 2) ;; Vertikale Ausrichtung: Mitte + (cons 11 insertPoint) ;; Ausrichtungspunkt + )) + + (princ (strcat "\n-> Beschriftung: " textStr " (Höhe=" (rtos textHoehe 2 0) "mm, Arial, zentriert)")) + textStr +) + +;; ... Rest Ihrer Funktionen (kreisel-ask-typ, kreisel-project-point, etc.) + ;; Kreiselart abfragen. Rueckgabe: "PIN" oder "STANDARD" (defun kreisel-ask-typ ( / typNum typ) (princ "\n[1] STANDARD (ohne PIN)") @@ -116,7 +220,11 @@ (defun draw-module (basePoint abstand rotation attribs / lastEnt ss e bname radius pin-y is-pin - oldAttreq oldAttdia) + oldAttreq oldAttdia + kreisel-nummer block-exists + z-hoehe block-hoehe + insertPoint block-ent + att-entity att-data att-tag new-value) ;; Attribute vorbereiten (setq attribs (ssg-attrib-merge attribs *kreisel-attrib-defs*)) @@ -126,75 +234,158 @@ (assoc "DREHUNG" 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)) + + ;; --- HÖHE BESTIMMEN --- + ;; Priorität 1: Aus basePoint (wenn 3D Punkt mit Z > 0) + ;; Priorität 2: Aus Attribut HOEHE (wenn vorhanden) + ;; Priorität 3: Default 0 + (if (and basePoint (caddr basePoint) (> (caddr basePoint) 0)) + (progn + (setq z-hoehe (caddr basePoint)) + (setq block-hoehe (rtos z-hoehe 2 0)) + (princ (strcat "\n-> Höhe aus Basispunkt übernommen: " block-hoehe)) + ) + (progn + ;; Höhe aus Attributen lesen + (setq block-hoehe (cdr (assoc "HOEHE" attribs))) + (if (or (null block-hoehe) (= block-hoehe "")) + (setq block-hoehe "0") + ) + (setq z-hoehe (atof block-hoehe)) + ) + ) + + ;; Attribut HOEHE aktualisieren + (setq attribs (subst (cons "HOEHE" block-hoehe) + (assoc "HOEHE" attribs) attribs)) + ;; Abgeleitete Masse (setq radius (/ *kreisel-durchmesser* 2.0)) (setq pin-y (- radius *kreisel-pin-abstand*)) - ;; Letzte Entity vor dem Zeichnen merken - (setq lastEnt (entlast)) + ;; Blockname Format: KREISEL_1_PIN_2300 oder KREISEL_1_STANDARD_2300 + (setq bname (strcat "KREISEL_" + (itoa kreisel-nummer) "_" + (if is-pin "PIN" "STANDARD") "_" + (rtos abstand 2 0))) + + ;; Blocknamen bereinigen (Punkt durch nichts ersetzen, da wir keine Dezimalstellen wollen) + (setq bname (vl-string-subst "" "." bname)) + + ;; Pruefen ob Block bereits existiert + (setq block-exists (tblsearch "BLOCK" bname)) - ;; --- Geometrie bei Ursprung (0,0) zeichnen --- - - ;; AN8 Kreis (Antriebsstation) bei (radius, 0) - (command "_.INSERT" (strcat block-pfad "AN8.dwg") (list radius 0.0) 1 1 0) - - ;; SP8 Kreis (Spannstation) bei (radius+abstand, 0) - (command "_.INSERT" (strcat block-pfad "SP8.dwg") (list (+ radius abstand) 0.0) 1 1 0) - - ;; Tangenten auf Layer S_LP - (ssg-make-layer "S_LP" "7" T) - (if is-pin - (setvar "CECOLOR" "5") - (setvar "CECOLOR" "1") - ) - - ;; Obere Tangente - (command "_.LINE" (list radius radius) (list (+ radius abstand) radius) "") - ;; Untere Tangente - (command "_.LINE" (list radius (- radius)) (list (+ radius abstand) (- radius)) "") - - ;; PIN-Linien - (if is-pin + ;; --- Geometrie NUR zeichnen, wenn Block noch nicht existiert --- + (if (not block-exists) (progn - (ssg-make-layer "pinbereich" "3" T) - (setvar "CECOLOR" "3") - ;; Obere PIN-Linie - (command "_.LINE" (list *kreisel-durchmesser* pin-y) (list (float abstand) pin-y) "") - ;; Untere PIN-Linie - (command "_.LINE" (list *kreisel-durchmesser* (- pin-y)) (list (float abstand) (- pin-y)) "") + ;; WICHTIG: Vor dem Zeichnen den aktuellen letzten Entity merken + ;; Aber wenn die Zeichnung leer ist, setzen wir lastEnt auf nil + (if (setq lastEnt (entlast)) + (princ) ;; Letzte Entity existiert + (setq lastEnt nil) ;; Zeichnung ist leer + ) + + ;; AN8 Kreis (Antriebsstation) bei (radius, 0) + (command "_.INSERT" (strcat block-pfad "AN8.dwg") (list radius 0.0 0) 1 1 0) + + ;; SP8 Kreis (Spannstation) bei (radius+abstand, 0) + (command "_.INSERT" (strcat block-pfad "SP8.dwg") (list (+ radius abstand) 0.0 0) 1 1 0) + + ;; Tangenten auf Layer S_LP + (ssg-make-layer "S_LP" "7" T) + (if is-pin + (setvar "CECOLOR" "5") + (setvar "CECOLOR" "1") + ) + + ;; Obere Tangente + (command "_.LINE" (list radius radius 0) (list (+ radius abstand) radius 0) "") + ;; Untere Tangente + (command "_.LINE" (list radius (- radius) 0) (list (+ radius abstand) (- radius) 0) "") + + ;; PIN-Linien + (if is-pin + (progn + (ssg-make-layer "pinbereich" "3" T) + (setvar "CECOLOR" "3") + + ;; Obere PIN-Linie + (command "_.LINE" (list *kreisel-durchmesser* pin-y 0) (list (float abstand) pin-y 0) "") + ;; Untere PIN-Linie + (command "_.LINE" (list *kreisel-durchmesser* (- pin-y) 0) (list (float abstand) (- pin-y) 0) "") + ) + ) + + ;; BESCHRIFTUNG einfügen (vor Block-Erzeugung, damit sie im Block ist) + (kreisel-make-label kreisel-nummer abstand (if is-pin "PIN" "STANDARD") ) + + ;; Unsichtbare Attribut-Definitionen erzeugen + (ssg-attrib-make-defs *kreisel-attrib-defs* 50.0) + + ;; --- Neue Entities einsammeln --- + (setq ss (ssadd)) + + ;; Korrekte Behandlung wenn lastEnt nil ist (Zeichnung war leer) + (if (null lastEnt) + (setq e (entnext)) + (setq e (entnext lastEnt)) + ) + + (while e + (ssadd e ss) + (setq e (entnext e)) + ) + + ;; --- Block erzeugen (Entities werden aus Zeichnung entfernt) --- + (if (> (sslength ss) 0) + (command "_.-BLOCK" bname (list 0.0 0.0 0.0) ss "") + (princ "\nFehler: Keine Entities zum Block erstellen!") + ) + + (princ (strcat "\n-> Neue Blockdefinition: " bname)) ) + (princ (strcat "\n-> Verwende bestehende Blockdefinition: " bname)) ) - ;; Unsichtbare Attribut-Definitionen erzeugen - (ssg-attrib-make-defs *kreisel-attrib-defs* 50.0) - - ;; --- Neue Entities einsammeln --- - (setq ss (ssadd)) - (setq e (entnext lastEnt)) - (while e - (ssadd e ss) - (setq e (entnext e)) - ) - - ;; --- Block erzeugen (Entities werden aus Zeichnung entfernt) --- - (setq bname (strcat "KR_" (ssg-make-blockname - (list (car basePoint) (cadr basePoint) - (if (caddr basePoint) (caddr basePoint) 0.0))))) - (command "_.-BLOCK" bname (list 0.0 0.0 0.0) ss "") - ;; --- Block am Zielpunkt einfuegen (ohne Attribut-Dialog) --- ;; basePoint kann 2D oder 3D sein; INSERT uebernimmt die Z-Koordinate (setq oldAttreq (getvar "ATTREQ")) (setq oldAttdia (getvar "ATTDIA")) (setvar "ATTREQ" 0) (setvar "ATTDIA" 0) - (command "_.INSERT" bname basePoint 1 1 rotation) - (setvar "ATTREQ" oldAttreq) - (setvar "ATTDIA" oldAttdia) - ;; --- Attribut-Werte setzen --- - (ssg-attrib-set-many attribs) + ;; Einfügepunkt: X,Y aus basePoint, Z aus ermittelter Höhe + + (setq insertPoint (list (car basePoint) (cadr basePoint) z-hoehe)) + (command "_.INSERT" bname insertPoint 1 1 rotation) + ;; --- Attribut-Werte durch direkte Datenbankänderung setzen --- + (setq block-ent (entlast)) + (setq att-entity (entnext block-ent)) + + (while att-entity + (setq att-data (entget att-entity)) + (if (= (cdr (assoc 0 att-data)) "ATTRIB") + (progn + (setq att-tag (cdr (assoc 2 att-data))) + (setq new-value (cdr (assoc att-tag attribs))) + (if new-value + (progn + (setq att-data (subst (cons 1 new-value) (assoc 1 att-data) att-data)) + (entmod att-data) + ) + ) + ) + ) + (setq att-entity (entnext att-entity)) + ) + (entupd block-ent) + (princ (strcat "\n-> Kreisel #" (itoa kreisel-nummer) " eingefügt: " bname + " (Höhe=" block-hoehe ")")) (entlast) ) @@ -206,39 +397,88 @@ ;; -------------------------------------------- ;; KreiselInsert: Manuell Position + Parameter ;; -------------------------------------------- -(defun c:KreiselInsert ( / pt abstand typ rotation rotStr) - - (ssg-start "Kreisel Modul einfuegen" '(("OSMODE") ("CECOLOR"))) - (setvar "OSMODE" 0) +;; -------------------------------------------- +;; KreiselInsert: Manuell Position + Parameter +;; -------------------------------------------- +(defun c:KreiselInsert ( / pt abstand typ rotation rotStr hoehe + selectedEnt blockAttribs oldOsmode) + (ssg-start "Kreisel Modul einfuegen" '(("CECOLOR"))) + + ;; Temporär Osnap für Blockerkennung setzen + (setq oldOsmode (getvar "OSMODE")) + (setvar "OSMODE" (logior oldOsmode 512)) ;; 512 = INS (Block-Einfügepunkt) + ;; 1. Einfuegepunkt (setq pt (getpoint "\nBasispunkt (AN-Seite): ")) - (if (null pt) (exit)) + (if (null pt) + (progn + (setvar "OSMODE" oldOsmode) + (ssg-end) + (princ "\nBefehl abgebrochen.") + (princ) + (return) + ) + ) + + ;; Osnap zurücksetzen auf den ursprünglichen Wert + (setvar "OSMODE" oldOsmode) + + ;; 2. Prüfen ob ein Block getroffen wurde + (setq selectedEnt (nentselp pt)) + + ;; --- HÖHE BESTIMMEN --- + (cond + ;; Fall 1: Auf einem Kreisel-Block geklickt + ((and selectedEnt + (setq selectedEnt (car selectedEnt)) + (setq blockAttribs (ssg-attrib-read selectedEnt)) + (assoc "HOEHE" blockAttribs)) + (setq hoehe (atof (cdr (assoc "HOEHE" blockAttribs)))) + (princ (strcat "\n-> Höhe von bestehendem Kreisel übernommen: " (rtos hoehe 2 0))) + ) + ;; Fall 2: Punkt hat Z-Koordinate > 0 + ((and (> (length pt) 2) (> (caddr pt) 0)) + (setq hoehe (caddr pt)) + (princ (strcat "\n-> Höhe aus 3D-Punkt übernommen: " (rtos hoehe 2 0))) + ) + ;; Fall 3: Sonst separat abfragen + (t + (setq hoehe (getreal (strcat "\nHöhe (Z-Koordinate) <" (rtos *kreisel-default-hoehe* 2 0) ">: "))) + (if (null hoehe) (setq hoehe *kreisel-default-hoehe*)) + ) + ) - ;; 2. Abstand (zeigen oder tippen) + ;; 3. Abstand (initget 6) - (setq abstand (getdist pt (strcat "\nAbstand (Tangentenlaenge) zeigen oder eingeben <" - (rtos *kreisel-default-laenge* 2 0) ">: "))) + (setq abstand (getdist (list (car pt) (cadr pt)) + (strcat "\nAbstand (Tangentenlaenge) <" + (rtos *kreisel-default-laenge* 2 0) ">: "))) (if (null abstand) (setq abstand *kreisel-default-laenge*)) - - ;; 3. Rotation + (princ (strcat "\n-> Abstand: " (rtos abstand 2 0) " mm")) + + ;; 4. Rotation (setq rotStr (getstring "\nRotation in Grad <0>: ")) (if (= rotStr "") (setq rotation 0.0) (setq rotation (atof rotStr)) ) - - ;; 4. Kreiselart + + ;; 5. Kreiselart (setq typ (kreisel-ask-typ)) - (princ (strcat "\n-> Abstand: " (rtos abstand 2 0) - " Rotation: " (rtos rotation 2 1) + (princ (strcat "\n-> Rotation: " (rtos rotation 2 1) + " Höhe: " (rtos hoehe 2 0) " Kreiselart: " typ)) - ;; 5. Modul einfuegen (Attribute = Defaults + KREISELART) - (draw-module (list (car pt) (cadr pt)) abstand rotation - (list (cons "KREISELART" typ))) + ;; 6. Modul einfuegen + (draw-module (list (car pt) (cadr pt) hoehe) abstand rotation + (list (cons "KREISELART" typ) + (cons "HOEHE" (rtos hoehe 2 0)))) + ;; KEIN weiteres (setvar "OSMODE" ...) mehr nötig! + ;; ssg-end stellt nur CLAYER und CMDECHO wieder her, nicht OSMODE + (princ "\nKreisel Modul eingefuegt.") (ssg-end) ) @@ -259,12 +499,11 @@ (defun c:KreiselConnect ( / sel1 ent1 pt1 sel2 ent2 pt2 lpts1 lpts2 s1 e1 s2 e2 dir1 dir2 snap1 foot - dx dy dist abstand rotation typ + dx dy dist abstand rotation typ hoehe z1s z1e z2s z2e zCoord zTol ok msg) - (ssg-start "Kreisel Smart Connect" '(("OSMODE") ("CECOLOR"))) - (setvar "OSMODE" 0) + (ssg-start "Kreisel Smart Connect" '(("CECOLOR"))) (setq ok T msg nil) (princ "\n--- Kreisel zwischen zwei parallelen Linien ---") @@ -367,17 +606,31 @@ ;; Winkel von AN-Punkt (snap1) zum SP-Fusspunkt (foot) (setq rotation (* (/ 180.0 pi) (atan dy dx))) + ;; Höhe (Z-Koordinate) - NUR abfragen, wenn zCoord keine Höhe hat (also 0 ist) + (if (and zCoord (> zCoord 0)) + (progn + (setq hoehe zCoord) + (princ (strcat "\n-> Höhe aus Linie übernommen: " (rtos hoehe 2 0))) + ) + (progn + (setq hoehe (getreal (strcat "\nHöhe (Z-Koordinate) <" (rtos *kreisel-default-hoehe* 2 0) ">: "))) + (if (null hoehe) (setq hoehe *kreisel-default-hoehe*)) + ) + ) + ;; Kreiselart abfragen (einzige Benutzer-Eingabe) (setq typ (kreisel-ask-typ)) (princ (strcat "\n-> Abstand: " (rtos abstand 2 0) " mm" " Rotation: " (rtos rotation 2 1) " Grad" + " Höhe: " (rtos hoehe 2 0) " Kreiselart: " typ)) ;; Modul als Compound-Block einfuegen (mit Z-Koordinate) - (draw-module (list (car snap1) (cadr snap1) zCoord) - abstand rotation - (list (cons "KREISELART" typ))) + ;; NEU - Höhe im Aufruf übergeben: + (draw-module (list (car snap1) (cadr snap1) hoehe) abstand rotation + (list (cons "KREISELART" typ) + (cons "HOEHE" (rtos hoehe 2 0)))) ;; <-- HOEHE Attribut (princ "\nKreisel Connect erfolgreich!") ) @@ -389,6 +642,24 @@ ) +;; Neue Befehle für Beschriftungs-Einstellungen +(defun c:KreiselLabelPos ( / dx dy) + (setq dx (getreal (strcat "\nX-Abstand von AN8-Mitte <" (rtos *kreisel-beschriftung-abstand-x* 2 0) ">: "))) + (if dx (setq *kreisel-beschriftung-abstand-x* dx)) + (setq dy (getreal (strcat "\nY-Abstand von AN8-Mitte <" (rtos *kreisel-beschriftung-abstand-y* 2 0) ">: "))) + (if dy (setq *kreisel-beschriftung-abstand-y* dy)) + (princ (strcat "\nNeue Beschriftungsposition: X=" (rtos *kreisel-beschriftung-abstand-x* 2 0) + " Y=" (rtos *kreisel-beschriftung-abstand-y* 2 0))) + (princ) +) + +(defun c:KreiselLabelHoehe ( / h) + (setq h (getreal (strcat "\nTexthöhe <" (rtos *kreisel-beschriftung-hoehe* 2 0) ">: "))) + (if h (setq *kreisel-beschriftung-hoehe* h)) + (princ (strcat "\nNeue Texthöhe: " (rtos *kreisel-beschriftung-hoehe* 2 0))) + (princ) +) + ;; ----------------------------------------------- ;; KreiselRedraw: Bestehenden Kreisel neu zeichnen ;; @@ -399,8 +670,7 @@ ;; ----------------------------------------------- (defun c:KreiselRedraw ( / sel ent ed attribs basePoint rotation newAbstand) - (ssg-start "Kreisel Neu Zeichnen" '(("OSMODE") ("CECOLOR"))) - (setvar "OSMODE" 0) + (ssg-start "Kreisel Neu Zeichnen" '(("CECOLOR"))) ;; 1. Bestehenden Kreisel-Block auswaehlen (setq sel (entsel "\nKreisel-Block auswaehlen: ")) @@ -418,9 +688,11 @@ (setq basePoint (cdr (assoc 10 ed))) (setq rotation (* (/ 180.0 pi) (cdr (assoc 50 ed)))) + ;; NEU - Höhe aus Attributen lesen und anzeigen: (princ (strcat "\n-> Bestehend: Abstand=" (cdr (assoc "ABSTAND" attribs)) - " Drehung=" (cdr (assoc "DREHUNG" attribs)) - " Art=" (cdr (assoc "KREISELART" attribs)))) + " Drehung=" (cdr (assoc "DREHUNG" attribs)) + " Höhe=" (cdr (assoc "HOEHE" attribs)) ;; <-- NEU + " Art=" (cdr (assoc "KREISELART" attribs)))) ;; 3. Neuen Abstand abfragen (Enter = beibehalten) (initget 6) @@ -428,13 +700,17 @@ (if (null newAbstand) (setq newAbstand (atof (cdr (assoc "ABSTAND" attribs)))) ) - + ;; NEU - Neue Höhe abfragen: + (setq newHoehe (getreal (strcat "\nNeue Höhe <" (cdr (assoc "HOEHE" attribs)) ">: "))) + (if (null newHoehe) + (setq newHoehe (atof (cdr (assoc "HOEHE" attribs)))) + ) ;; 4. Alten Block loeschen (command "_.ERASE" ent "") ;; 5. Neu zeichnen mit bestehenden Attributen + neuem Abstand - (draw-module (list (car basePoint) (cadr basePoint)) - newAbstand rotation attribs) + (draw-module (list (car basePoint) (cadr basePoint) newHoehe) + newAbstand rotation attribs) (princ (strcat "\nKreisel neu gezeichnet. Abstand=" (rtos newAbstand 2 0))) (ssg-end) @@ -445,11 +721,15 @@ ;; KreiselQuick: Schnell mit Defaults (horizontal) ;; -------------------------------------------- (defun c:KreiselQuick ( / pt) - (ssg-start "Kreisel Schnell Einfuegen" '(("OSMODE") ("CECOLOR"))) - (setvar "OSMODE" 0) + (ssg-start "Kreisel Schnell Einfuegen" '(("CECOLOR"))) (setq pt (getpoint "\nBasispunkt (AN-Seite): ")) + ;; NEU - Höhe abfragen: + (setq hoehe (getreal (strcat "\nHöhe (Z-Koordinate) <0>: "))) + (if (null hoehe) (setq hoehe 0.0)) (if pt - (draw-module (list (car pt) (cadr pt)) *kreisel-default-laenge* 0.0 nil) + ;; NEU - Höhe im Aufruf übergeben: + (draw-module (list (car pt) (cadr pt) hoehe) *kreisel-default-laenge* 0.0 + (list (cons "HOEHE" (rtos hoehe 2 0)))) ) (princ "\nSchnell Einfuegen fertig.") (ssg-end) @@ -464,6 +744,8 @@ (princ (strcat "\nKreiselart: " #Kreisel_Typ)) (princ (strcat "\nDurchmesser: " (rtos *kreisel-durchmesser* 2 0))) (princ (strcat "\nDefault-Laenge: " (rtos *kreisel-default-laenge* 2 0))) + ;; NEU - Default-Höhe anzeigen: + (princ (strcat "\nDefault-Höhe: " (rtos *kreisel-default-hoehe* 2 0))) (princ "\nAttribute im Block:") (foreach def *kreisel-attrib-defs* (princ (strcat "\n " (car def) " = " (cadr def))) @@ -481,8 +763,7 @@ ;; -------------------------------------------- (defun c:ILS_Eckrad ( / pt rotStr rotation) - (ssg-start "Eckrad einfuegen" '(("OSMODE") ("ATTREQ") ("ATTDIA"))) - (setvar "OSMODE" 0) + (ssg-start "Eckrad einfuegen" '(("ATTREQ") ("ATTDIA"))) (setvar "ATTREQ" 0) (setvar "ATTDIA" 0) @@ -506,7 +787,24 @@ (ssg-end) ) +;; NEU: KreiselLabelSetup - Hier einfügen! +(defun c:KreiselLabelSetup ( / hoehe farbe abstand schriftart) + (setq hoehe (getreal (strcat "\nSchrifthöhe <" (rtos *kreisel-beschriftung-hoehe* 2 0) ">: "))) + (if hoehe (setq *kreisel-beschriftung-hoehe* hoehe)) + + (setq farbe (getint (strcat "\nSchriftfarbe (1=Rot,2=Gelb,3=Grün,4=Cyan,5=Blau,6=Magenta,7=Weiß) <" (itoa *kreisel-beschriftung-farbe*) ">: "))) + (if farbe (setq *kreisel-beschriftung-farbe* farbe)) + + (setq abstand (getreal (strcat "\nAbstand über Kreisel-Mitte <" (rtos *kreisel-beschriftung-abstand-oben* 2 0) ">: "))) + (if abstand (setq *kreisel-beschriftung-abstand-oben* abstand)) + + (princ (strcat "\nNeue Einstellungen: Höhe=" (rtos *kreisel-beschriftung-hoehe* 2 0) + ", Farbe=" (itoa *kreisel-beschriftung-farbe*) + ", Y-Versatz=" (rtos *kreisel-beschriftung-abstand-oben* 2 0) + ", Schriftart=Arial")) + (princ) +) -(princ "\nKreiselInsert.lsp geladen (Version 6.0 - Attribute + Redraw + Eckrad)") +(princ "\nKreiselInsert.lsp geladen (Version 7.0 - Auto-Nummerierung + Beschriftung + Attribute + Redraw + Eckrad)") (princ "\nBefehle: KreiselInsert, KreiselConnect, KreiselRedraw, KreiselQuick, KreiselParams, ILS_Eckrad") (princ)