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
+56 -102
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,24 +574,34 @@
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)
;; 0. Attribute aus der Quell-.dwg lesen (vor ssg-start, da eigene INSERT/ERASE)
(setq srcAttribs (ssg-attrib-read-dwg (strcat *block-path* blockname ".dwg")))
(if (null srcAttribs)
(progn (princ "\n[OMNI] Keine Attribute im Quell-Block gefunden.") nil)
(progn
;; LAENGEMAX aus Quell-Attribut lesen (falls vorhanden), sonst Parameter
(if (and (assoc "LAENGEMAX" srcAttribs)
(> (strlen (cdr (assoc "LAENGEMAX" srcAttribs))) 0))
(setq laengemax (atof (cdr (assoc "LAENGEMAX" srcAttribs))))
)
(setq pt (getpoint "\nEinfuegepunkt waehlen: ")) (setq pt (getpoint "\nEinfuegepunkt waehlen: "))
(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 Aluprofil" '(("OSMODE") ("ATTREQ") ("ATTDIA")))
(setq oldOsnap (getvar "OSMODE")) ;; ATTREQ/ATTDIA auf 0 setzen (werden durch ssg-end wiederhergestellt)
(setq oldCmdEcho (getvar "CMDECHO")) (setvar "ATTREQ" 0)
(setq oldLayer (getvar "CLAYER")) (setvar "ATTDIA" 0)
(setvar "CMDECHO" 0)
;; 1. Text horizontal am Einfuegepunkt erzeugen (per entmake) ;; 1. Text horizontal am Einfuegepunkt erzeugen
(entmake (list '(0 . "TEXT") (entmake (list '(0 . "TEXT")
(cons 8 (getvar "CLAYER")) (cons 8 (getvar "CLAYER"))
(cons 10 (list (car pt) (cadr pt) (cons 10 (list (car pt) (cadr pt)
@@ -654,9 +619,6 @@
(progn (progn
;; Abbruch: Text loeschen ;; Abbruch: Text loeschen
(command "_.ERASE" textEnt "") (command "_.ERASE" textEnt "")
(setvar "OSMODE" oldOsnap)
(setvar "CMDECHO" oldCmdEcho)
(setvar "CLAYER" oldLayer)
(princ "\n[OMNI] Abgebrochen.") (princ "\n[OMNI] Abgebrochen.")
(setq ok T pt nil) (setq ok T pt nil)
) )
@@ -675,45 +637,47 @@
(setq angle (atan dy dx)) (setq angle (atan dy dx))
(setq angleDeg (* (/ 180.0 pi) angle)) (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"))
(setq oldAttdia (getvar "ATTDIA"))
(setvar "ATTREQ" 0)
(setvar "ATTDIA" 0)
(command "_.INSERT" bname pt 1 1 angleDeg) (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
@@ -734,7 +698,7 @@
(entmod ed) (entmod ed)
(entupd textEnt) (entupd textEnt)
(princ (strcat "\n[OMNI] " blockname " eingefuegt. Laenge=" laengeStr " mm")) (princ (strcat "\n[OMNI] " bname " eingefuegt. Laenge=" laengeStr " mm"))
(setq ok T) (setq ok T)
) )
) )
@@ -742,14 +706,13 @@
) )
) )
;; Einstellungen wiederherstellen (ssg-end)
(setvar "OSMODE" oldOsnap)
(setvar "CMDECHO" oldCmdEcho)
(setvar "CLAYER" oldLayer)
pt pt
) )
) )
) )
)
)
(defun c:OMNI_AP60 () (defun c:OMNI_AP60 ()
(omni:insert-block "AP60" 7000.0) (omni:insert-block "AP60" 7000.0)
@@ -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