Undo Funktion mit ssg-start und ssg-end verwendet. Routinen standardisiert

This commit is contained in:
2026-05-18 17:43:08 +02:00
parent e801c84439
commit 156c2029a5
3 changed files with 199 additions and 177 deletions
+6 -10
View File
@@ -115,8 +115,7 @@
;; Rueckgabe: Entity-Name des eingefuegten Blocks ;; Rueckgabe: Entity-Name des eingefuegten Blocks
(defun draw-module (basePoint abstand rotation attribs / lastEnt ss e bname (defun draw-module (basePoint abstand rotation attribs / lastEnt ss e bname
radius pin-y is-pin radius pin-y is-pin)
oldAttreq oldAttdia)
;; Attribute vorbereiten ;; Attribute vorbereiten
(setq attribs (ssg-attrib-merge attribs *kreisel-attrib-defs*)) (setq attribs (ssg-attrib-merge attribs *kreisel-attrib-defs*))
@@ -184,13 +183,10 @@
;; --- Block am Zielpunkt einfuegen (ohne Attribut-Dialog) --- ;; --- Block am Zielpunkt einfuegen (ohne Attribut-Dialog) ---
;; basePoint kann 2D oder 3D sein; INSERT uebernimmt die Z-Koordinate ;; basePoint kann 2D oder 3D sein; INSERT uebernimmt die Z-Koordinate
(setq oldAttreq (getvar "ATTREQ")) ;; ATTREQ/ATTDIA werden durch ssg-start/ssg-end der Aufrufer gesichert
(setq oldAttdia (getvar "ATTDIA"))
(setvar "ATTREQ" 0) (setvar "ATTREQ" 0)
(setvar "ATTDIA" 0) (setvar "ATTDIA" 0)
(command "_.INSERT" bname basePoint 1 1 rotation) (command "_.INSERT" bname basePoint 1 1 rotation)
(setvar "ATTREQ" oldAttreq)
(setvar "ATTDIA" oldAttdia)
;; --- Attribut-Werte setzen --- ;; --- Attribut-Werte setzen ---
(ssg-attrib-set-many attribs) (ssg-attrib-set-many attribs)
@@ -208,7 +204,7 @@
;; -------------------------------------------- ;; --------------------------------------------
(defun c:KreiselInsert ( / pt abstand typ rotation rotStr) (defun c:KreiselInsert ( / pt abstand typ rotation rotStr)
(ssg-start "Kreisel Modul einfuegen" '(("OSMODE") ("CECOLOR"))) (ssg-start "Kreisel Modul einfuegen" '(("OSMODE") ("CECOLOR") ("ATTREQ") ("ATTDIA")))
(setvar "OSMODE" 0) (setvar "OSMODE" 0)
;; 1. Einfuegepunkt ;; 1. Einfuegepunkt
@@ -263,7 +259,7 @@
z1s z1e z2s z2e zCoord zTol z1s z1e z2s z2e zCoord zTol
ok msg) ok msg)
(ssg-start "Kreisel Smart Connect" '(("OSMODE") ("CECOLOR"))) (ssg-start "Kreisel Smart Connect" '(("OSMODE") ("CECOLOR") ("ATTREQ") ("ATTDIA")))
(setvar "OSMODE" 0) (setvar "OSMODE" 0)
(setq ok T msg nil) (setq ok T msg nil)
@@ -399,7 +395,7 @@
;; ----------------------------------------------- ;; -----------------------------------------------
(defun c:KreiselRedraw ( / sel ent ed attribs basePoint rotation newAbstand) (defun c:KreiselRedraw ( / sel ent ed attribs basePoint rotation newAbstand)
(ssg-start "Kreisel Neu Zeichnen" '(("OSMODE") ("CECOLOR"))) (ssg-start "Kreisel Neu Zeichnen" '(("OSMODE") ("CECOLOR") ("ATTREQ") ("ATTDIA")))
(setvar "OSMODE" 0) (setvar "OSMODE" 0)
;; 1. Bestehenden Kreisel-Block auswaehlen ;; 1. Bestehenden Kreisel-Block auswaehlen
@@ -445,7 +441,7 @@
;; KreiselQuick: Schnell mit Defaults (horizontal) ;; KreiselQuick: Schnell mit Defaults (horizontal)
;; -------------------------------------------- ;; --------------------------------------------
(defun c:KreiselQuick ( / pt) (defun c:KreiselQuick ( / pt)
(ssg-start "Kreisel Schnell Einfuegen" '(("OSMODE") ("CECOLOR"))) (ssg-start "Kreisel Schnell Einfuegen" '(("OSMODE") ("CECOLOR") ("ATTREQ") ("ATTDIA")))
(setvar "OSMODE" 0) (setvar "OSMODE" 0)
(setq pt (getpoint "\nBasispunkt (AN-Seite): ")) (setq pt (getpoint "\nBasispunkt (AN-Seite): "))
(if pt (if pt
+121 -167
View File
@@ -555,61 +555,16 @@
;; --- Omniflo / Aluprofil Gerade --- ;; --- Omniflo / Aluprofil Gerade ---
;; Attribut-Definitionen fuer Aluprofil-Bloecke: ((TAG DEFAULT) ...)
;; LAENGE und LAENGEMAX werden automatisch gesetzt.
(setq *omni-profil-attrib-defs*
'(("ETIKETTE" "")
("AUFLOESE" "")
("GRUPPE" "")
("A" "")
("B" "")
("C" "")
("BESCHR" "")
("ARTINR" "")
("MENGE" "")
("POSITION" "")
("LAENGE" "")
("LAYER" "")
("TLAGE" "")
("LAENGEMAX" ""))
)
;; Attribute eines bestimmten INSERT-Entity setzen.
;; ent = Entity-Name des INSERT-Blocks
;; attrib-alist = (("TAG" . "Wert") ...)
(defun omni:attrib-set-on (ent attrib-alist / obj ed typ tag wert)
(setq obj (entnext ent))
(while obj
(setq ed (entget obj))
(setq typ (cdr (assoc 0 ed)))
(if (equal typ "SEQEND") (setq obj nil)
(progn
(if (equal typ "ATTRIB")
(progn
(setq tag (cdr (assoc 2 ed)))
(setq wert (cdr (assoc tag attrib-alist)))
(if (and wert (> (strlen wert) 0))
(progn
(entmod (subst (cons 1 wert) (assoc 1 ed) ed))
(entupd obj)
)
)
)
)
(setq obj (entnext obj))
)
)
)
)
;; Aluprofil-Fahrstrecke einfuegen. ;; Aluprofil-Fahrstrecke einfuegen.
;; ;;
;; Ablauf: ;; Ablauf:
;; 1. Nutzer waehlt Einfuegepunkt -> Text "blockname" wird horizontal platziert ;; 1. Quell-Block (.dwg) temporaer einfuegen, Attribute lesen, loeschen
;; 2. Nutzer klickt Endpunkt -> Linie definiert Fahrstreckenlaenge und Richtung ;; 2. Nutzer waehlt Einfuegepunkt -> Text "blockname" wird horizontal platziert
;; 3. Laenge wird gegen laengemax geprueft (Fehlermeldung bei Ueberschreitung) ;; 3. Nutzer klickt Endpunkt -> Linie definiert Fahrstreckenlaenge und Richtung
;; 4. Compound-Block aus Linie + Attributen wird erzeugt und eingefuegt ;; 4. Laenge wird gegen laengemax geprueft (Fehlermeldung bei Ueberschreitung)
;; 5. Text wird gedreht, verschoben (oberhalb Linie) und Inhalt aktualisiert ;; 5. Compound-Block aus Linie + ATTDEFs (mit Quell-Werten) wird erzeugt
;; Blockname: blockname_YYYYMMDDHHMMSS
;; 6. Text wird gedreht, oberhalb der Linie positioniert, Inhalt aktualisiert
;; z.B. "APG110 L=2879" ;; z.B. "APG110 L=2879"
;; ;;
;; blockname = Profiltyp (z.B. "AP60", "AP110", "APG110") ;; blockname = Profiltyp (z.B. "AP60", "AP110", "APG110")
@@ -619,134 +574,142 @@
dx dy angle angleDeg dx dy angle angleDeg
textEnt textHeight textGap textEnt textHeight textGap
perpX perpY textPt ed perpX perpY textPt ed
lastEnt ss e bname blockEnt attribs lastEnt ss e bname blockEnt
oldOsnap oldCmdEcho oldLayer oldAttreq oldAttdia srcAttribs attribDefs attribs
ok) ok)
(setq textHeight 100.0) (setq textHeight 100.0)
(setq textGap 20.0) (setq textGap 20.0)
(setq pt (getpoint "\nEinfuegepunkt waehlen: ")) ;; 0. Attribute aus der Quell-.dwg lesen (vor ssg-start, da eigene INSERT/ERASE)
(if (null pt) (setq srcAttribs (ssg-attrib-read-dwg (strcat *block-path* blockname ".dwg")))
(progn (princ "\n[OMNI] Abgebrochen.") nil) (if (null srcAttribs)
(progn (princ "\n[OMNI] Keine Attribute im Quell-Block gefunden.") nil)
(progn (progn
;; Einstellungen sichern ;; LAENGEMAX aus Quell-Attribut lesen (falls vorhanden), sonst Parameter
(setq oldOsnap (getvar "OSMODE")) (if (and (assoc "LAENGEMAX" srcAttribs)
(setq oldCmdEcho (getvar "CMDECHO")) (> (strlen (cdr (assoc "LAENGEMAX" srcAttribs))) 0))
(setq oldLayer (getvar "CLAYER")) (setq laengemax (atof (cdr (assoc "LAENGEMAX" srcAttribs))))
(setvar "CMDECHO" 0) )
;; 1. Text horizontal am Einfuegepunkt erzeugen (per entmake) (setq pt (getpoint "\nEinfuegepunkt waehlen: "))
(entmake (list '(0 . "TEXT") (if (null pt)
(cons 8 (getvar "CLAYER")) (progn (princ "\n[OMNI] Abgebrochen.") nil)
(cons 10 (list (car pt) (cadr pt) (progn
(if (caddr pt) (caddr pt) 0.0))) (ssg-start "OMNI Aluprofil" '(("OSMODE") ("ATTREQ") ("ATTDIA")))
(cons 40 textHeight) ;; ATTREQ/ATTDIA auf 0 setzen (werden durch ssg-end wiederhergestellt)
(cons 1 blockname) (setvar "ATTREQ" 0)
'(50 . 0.0))) (setvar "ATTDIA" 0)
(setq textEnt (entlast))
;; 2. Endpunkt fuer Fahrstrecke abfragen (Schleife bei Ueberschreitung) ;; 1. Text horizontal am Einfuegepunkt erzeugen
(setq ok nil) (entmake (list '(0 . "TEXT")
(while (not ok) (cons 8 (getvar "CLAYER"))
(setq pt2 (getpoint pt "\nEndpunkt der Fahrstrecke waehlen: ")) (cons 10 (list (car pt) (cadr pt)
(if (null pt2) (if (caddr pt) (caddr pt) 0.0)))
(progn (cons 40 textHeight)
;; Abbruch: Text loeschen (cons 1 blockname)
(command "_.ERASE" textEnt "") '(50 . 0.0)))
(setvar "OSMODE" oldOsnap) (setq textEnt (entlast))
(setvar "CMDECHO" oldCmdEcho)
(setvar "CLAYER" oldLayer) ;; 2. Endpunkt fuer Fahrstrecke abfragen (Schleife bei Ueberschreitung)
(princ "\n[OMNI] Abgebrochen.") (setq ok nil)
(setq ok T pt nil) (while (not ok)
) (setq pt2 (getpoint pt "\nEndpunkt der Fahrstrecke waehlen: "))
(progn (if (null pt2)
(setq laenge (distance (list (car pt) (cadr pt))
(list (car pt2) (cadr pt2))))
(if (> laenge laengemax)
(alert (strcat "Die gewuenschte Fahrstreckenlaenge von "
(rtos laenge 2 0) " mm ueberschreitet die Maximallaenge von "
(rtos laengemax 2 0) " mm des Fahrstreckenprofils.\n"
"Bitte neu definieren!"))
(progn (progn
(setq laengeStr (rtos laenge 2 0)) ;; Abbruch: Text loeschen
(setq dx (- (car pt2) (car pt)) (command "_.ERASE" textEnt "")
dy (- (cadr pt2) (cadr pt))) (princ "\n[OMNI] Abgebrochen.")
(setq angle (atan dy dx)) (setq ok T pt nil)
(setq angleDeg (* (/ 180.0 pi) angle)) )
(progn
(setq laenge (distance (list (car pt) (cadr pt))
(list (car pt2) (cadr pt2))))
(if (> laenge laengemax)
(alert (strcat "Die gewuenschte Fahrstreckenlaenge von "
(rtos laenge 2 0) " mm ueberschreitet die Maximallaenge von "
(rtos laengemax 2 0) " mm des Fahrstreckenprofils.\n"
"Bitte neu definieren!"))
(progn
(setq laengeStr (rtos laenge 2 0))
(setq dx (- (car pt2) (car pt))
dy (- (cadr pt2) (cadr pt)))
(setq angle (atan dy dx))
(setq angleDeg (* (/ 180.0 pi) angle))
;; 3. Compound-Block: Linie bei (0,0) + ATTDEFs ;; 3. Compound-Block: Linie bei (0,0) + ATTDEFs aus Quell-Attributen
(setq lastEnt textEnt) (setq lastEnt textEnt)
;; Linie von Ursprung bis (laenge, 0) ;; Linie von Ursprung bis (laenge, 0)
(command "_.LINE" (list 0.0 0.0) (list laenge 0.0) "") (command "_.LINE" (list 0.0 0.0) (list laenge 0.0) "")
;; Unsichtbare Attribut-Definitionen ;; ATTDEFs aus Quell-Attributen erzeugen
(ssg-attrib-make-defs *omni-profil-attrib-defs* 50.0) (setq attribDefs (ssg-attrib-alist-to-defs srcAttribs))
(ssg-attrib-make-defs attribDefs 50.0)
;; Neue Entities einsammeln (alles nach textEnt) ;; Neue Entities einsammeln (alles nach textEnt)
(setq ss (ssadd)) (setq ss (ssadd))
(setq e (entnext lastEnt)) (setq e (entnext lastEnt))
(while e (ssadd e ss) (setq e (entnext e))) (while e (ssadd e ss) (setq e (entnext e)))
;; Block erzeugen ;; Block mit eindeutigem Zeitstempel-Namen erzeugen
(setq bname (strcat blockname "_" (setq bname (strcat blockname "_" (ssg-timestamp)))
(ssg-make-blockname ;; Falls Name schon existiert, Suffix anhaengen
(list (car pt) (cadr pt) (if (tblsearch "BLOCK" bname)
(if (caddr pt) (caddr pt) 0.0))))) (setq bname (strcat bname "_" (itoa (fix (* (getvar "CDATE") 1000000)))))
(command "_.-BLOCK" bname (list 0.0 0.0 0.0) ss "") )
(command "_.-BLOCK" bname (list 0.0 0.0 0.0) ss "")
;; Block einfuegen (ohne Attribut-Dialog) ;; Block einfuegen (ATTREQ/ATTDIA bereits auf 0)
(setq oldAttreq (getvar "ATTREQ")) (command "_.INSERT" bname pt 1 1 angleDeg)
(setq oldAttdia (getvar "ATTDIA"))
(setvar "ATTREQ" 0)
(setvar "ATTDIA" 0)
(command "_.INSERT" bname pt 1 1 angleDeg)
(setvar "ATTREQ" oldAttreq)
(setvar "ATTDIA" oldAttdia)
(setq blockEnt (entlast)) (setq blockEnt (entlast))
;; 4. Attribute setzen ;; 4. Attribute setzen: Quell-Werte + LAENGE/A aktualisieren
(setq attribs (ssg-attrib-merge (setq attribs srcAttribs)
(list (cons "LAENGE" laengeStr) (if (assoc "LAENGE" attribs)
(cons "A" laengeStr) (setq attribs (subst (cons "LAENGE" laengeStr)
(cons "LAENGEMAX" (rtos laengemax 2 0))) (assoc "LAENGE" attribs) attribs))
*omni-profil-attrib-defs*)) (setq attribs (cons (cons "LAENGE" laengeStr) attribs))
(omni:attrib-set-on blockEnt attribs) )
(if (assoc "A" attribs)
(setq attribs (subst (cons "A" laengeStr)
(assoc "A" attribs) attribs))
(setq attribs (cons (cons "A" laengeStr) attribs))
)
(ssg-attrib-set-on blockEnt attribs)
;; 5. Text aktualisieren: oberhalb der Linie positionieren, ;; 5. Text aktualisieren: oberhalb der Linie positionieren,
;; um Linienwinkel drehen, Inhalt mit Laenge ergaenzen ;; um Linienwinkel drehen, Inhalt mit Laenge ergaenzen
(setq perpX (* (- (sin angle)) textGap) (setq perpX (* (- (sin angle)) textGap)
perpY (* (cos angle) textGap)) perpY (* (cos angle) textGap))
(setq textPt (list (+ (car pt) perpX) (setq textPt (list (+ (car pt) perpX)
(+ (cadr pt) perpY) (+ (cadr pt) perpY)
(if (caddr pt) (caddr pt) 0.0))) (if (caddr pt) (caddr pt) 0.0)))
(setq ed (entget textEnt)) (setq ed (entget textEnt))
(setq ed (subst (cons 10 textPt) (assoc 10 ed) ed)) (setq ed (subst (cons 10 textPt) (assoc 10 ed) ed))
(if (assoc 50 ed) (if (assoc 50 ed)
(setq ed (subst (cons 50 angle) (assoc 50 ed) ed)) (setq ed (subst (cons 50 angle) (assoc 50 ed) ed))
(setq ed (append ed (list (cons 50 angle)))) (setq ed (append ed (list (cons 50 angle))))
)
(setq ed (subst (cons 1 (strcat blockname " L=" laengeStr))
(assoc 1 ed) ed))
(entmod ed)
(entupd textEnt)
(princ (strcat "\n[OMNI] " bname " eingefuegt. Laenge=" laengeStr " mm"))
(setq ok T)
)
) )
(setq ed (subst (cons 1 (strcat blockname " L=" laengeStr))
(assoc 1 ed) ed))
(entmod ed)
(entupd textEnt)
(princ (strcat "\n[OMNI] " blockname " eingefuegt. Laenge=" laengeStr " mm"))
(setq ok T)
) )
) )
) )
(ssg-end)
pt
) )
) )
;; Einstellungen wiederherstellen
(setvar "OSMODE" oldOsnap)
(setvar "CMDECHO" oldCmdEcho)
(setvar "CLAYER" oldLayer)
pt
) )
) )
) )
@@ -956,8 +919,7 @@
;; --- DXF-Datei als Block einfuegen --- ;; --- DXF-Datei als Block einfuegen ---
;; sivasnr-str = SivasNr als String (Dateiname ohne .dxf) ;; sivasnr-str = SivasNr als String (Dateiname ohne .dxf)
;; Rueckgabe: Einfuegepunkt oder nil bei Abbruch ;; Rueckgabe: Einfuegepunkt oder nil bei Abbruch
(defun omni:insert-dxf (sivasnr-str / dxf-pfad data-pfad pt (defun omni:insert-dxf (sivasnr-str / dxf-pfad data-pfad pt)
oldOsnap oldCmdEcho oldLayer)
(setq data-pfad (getenv "DXFM_DATA")) (setq data-pfad (getenv "DXFM_DATA"))
(if (null data-pfad) (if (null data-pfad)
(progn (progn
@@ -976,21 +938,13 @@
(if (null pt) (if (null pt)
(progn (princ "\n[OMNI] Abgebrochen.") nil) (progn (princ "\n[OMNI] Abgebrochen.") nil)
(progn (progn
;; Einstellungen sichern (ssg-start "OMNI DXF Insert" '(("OSMODE")))
(setq oldOsnap (getvar "OSMODE"))
(setq oldCmdEcho (getvar "CMDECHO"))
(setq oldLayer (getvar "CLAYER"))
(setvar "CMDECHO" 0)
;; Block einfuegen mit Winkelabfrage (pause) ;; Block einfuegen mit Winkelabfrage (pause)
(command "_.INSERT" dxf-pfad pt "" "" pause) (command "_.INSERT" dxf-pfad pt "" "" pause)
;; Einstellungen wiederherstellen
(setvar "OSMODE" oldOsnap)
(setvar "CMDECHO" oldCmdEcho)
(setvar "CLAYER" oldLayer)
(princ (strcat "\n[OMNI] " sivasnr-str " eingefuegt.")) (princ (strcat "\n[OMNI] " sivasnr-str " eingefuegt."))
(ssg-end)
pt pt
) )
) )
+72
View File
@@ -181,6 +181,15 @@
;; BLOCK-OPERATIONEN ;; BLOCK-OPERATIONEN
;; ------------------------------------------------------------ ;; ------------------------------------------------------------
;; Zeitstempel als YYYYMMDDHHMMSS erzeugen (fuer eindeutige Blocknamen)
(defun ssg-timestamp ( / cd ds ts)
(setq cd (rtos (getvar "CDATE") 2 6))
;; cd = "20260518.143052" -> Punkt entfernen
(setq ds (substr cd 1 8))
(setq ts (substr cd 10 6))
(strcat ds ts)
)
;; Eindeutigen Blocknamen aus Einfuegepunkt + Zeitstempel erzeugen ;; Eindeutigen Blocknamen aus Einfuegepunkt + Zeitstempel erzeugen
;; pt = Einfuegepunkt (Liste); Rueckgabe: Blockname als String ;; pt = Einfuegepunkt (Liste); Rueckgabe: Blockname als String
(defun ssg-make-blockname (pt / k1 k2) (defun ssg-make-blockname (pt / k1 k2)
@@ -347,6 +356,69 @@
) )
) )
;; Attribute eines bestimmten INSERT-Entity setzen (nicht entlast).
;; ent = Entity-Name des INSERT-Blocks
;; attrib-alist = (("TAG" . "Wert") ...)
(defun ssg-attrib-set-on (ent attrib-alist / obj ed typ tag wert)
(setq obj (entnext ent))
(while obj
(setq ed (entget obj))
(setq typ (cdr (assoc 0 ed)))
(if (equal typ "SEQEND") (setq obj nil)
(progn
(if (equal typ "ATTRIB")
(progn
(setq tag (cdr (assoc 2 ed)))
(setq wert (cdr (assoc tag attrib-alist)))
(if (and wert (> (strlen wert) 0))
(progn
(entmod (subst (cons 1 wert) (assoc 1 ed) ed))
(entupd obj)
)
)
)
)
(setq obj (entnext obj))
)
)
)
)
;; Assoziationsliste in ATTDEF-Definitionsliste konvertieren.
;; alist = (("TAG" . "Wert") ...) -> ((TAG Wert) ...)
;; Passend fuer ssg-attrib-make-defs.
(defun ssg-attrib-alist-to-defs (alist / result)
(foreach pair alist
(setq result (cons (list (car pair) (cdr pair)) result))
)
(reverse result)
)
;; Block (.dwg) temporaer einfuegen, Attribute lesen, Block loeschen.
;; dwg-pfad = vollstaendiger Pfad zur .dwg Datei
;; Rueckgabe: Assoziationsliste (("TAG" . "Wert") ...) oder nil
(defun ssg-attrib-read-dwg (dwg-pfad / tmpEnt srcAttribs oldAttreq oldAttdia)
(if (not (findfile dwg-pfad))
(progn
(princ (strcat "\nFEHLER: Block nicht gefunden: " dwg-pfad))
nil
)
(progn
(setq oldAttreq (getvar "ATTREQ"))
(setq oldAttdia (getvar "ATTDIA"))
(setvar "ATTREQ" 0)
(setvar "ATTDIA" 0)
(command "_.INSERT" dwg-pfad (list 0.0 0.0 0.0) 1 1 0)
(setvar "ATTREQ" oldAttreq)
(setvar "ATTDIA" oldAttdia)
(setq tmpEnt (entlast))
(setq srcAttribs (ssg-attrib-read tmpEnt))
(command "_.ERASE" tmpEnt "")
srcAttribs
)
)
)
;; Attribut eines Blocks anhand seines Handle suchen und aendern ;; Attribut eines Blocks anhand seines Handle suchen und aendern
;; handle = Entity-Handle (String) des INSERT ;; handle = Entity-Handle (String) des INSERT
;; tag = Attributbezeichner ;; tag = Attributbezeichner