From 187f0acf31455de37ffc16507a3de03372c50c51 Mon Sep 17 00:00:00 2001 From: Simon Hensch Date: Wed, 22 Jul 2026 08:54:04 +0200 Subject: [PATCH] =?UTF-8?q?[FIX]=20nach=20dem=20Editieren=20bzw.=20Austaus?= =?UTF-8?q?chen=20eines=20Objekts=20=C3=BCber=20Doppelklick=20und=20Men?= =?UTF-8?q?=C3=BC=20wird=20das=20Layer=20nun=20korrekt=20entsprechend=20de?= =?UTF-8?q?s=20Layer-Attributs=20gesetzt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lisp/OmniModulInsert.lsp | 183 +++++++++++++++++++++------------------ 1 file changed, 99 insertions(+), 84 deletions(-) diff --git a/Lisp/OmniModulInsert.lsp b/Lisp/OmniModulInsert.lsp index b20c3cc..9df5571 100644 --- a/Lisp/OmniModulInsert.lsp +++ b/Lisp/OmniModulInsert.lsp @@ -882,7 +882,8 @@ ;; hoehe = Hoehe in mm als String (wird als HOEHE-Attribut gesetzt) ;; drehung = Drehwinkel in Grad als String (Block-Rotation) ;; Rueckgabe: Einfuegepunkt oder nil bei Abbruch -(defun omni:insert-dxf (sivasnr-str hoehe drehung / dxf-pfad omniflo-pfad pt angleDeg drehung-anzeige blockEnt attribs layer-name) +(defun omni:insert-dxf (sivasnr-str hoehe drehung / dxf-pfad omniflo-pfad angleDeg + drehung-anzeige blockEnt attribs layer-name ed pt10 zval zdelta) (setq omniflo-pfad (getenv "DXFM_OMNIFLO")) (if (null omniflo-pfad) (progn @@ -897,96 +898,94 @@ nil ) (progn - (setq pt (getpoint (ssg-text "omni-prompt-einfuegepunkt"))) - (if (null pt) - (progn (princ (ssg-text "omni-abbruch-omni")) nil) + (ssg-start "OMNI DXF Insert" '(("ATTREQ") ("ATTDIA"))) + (setvar "ATTREQ" 0) + (setvar "ATTDIA" 0) + + ;; Absolute Z-Hoehe fuer den Einfuegepunkt bestimmen + (setq zval (if (and hoehe (/= hoehe "")) (atof hoehe) 0.0)) + + ;; Interaktives Einfuegen mit Live-Vorschau am Mauszeiger: + ;; dxf-pfad -> Block aus Datei definieren/waehlen + ;; 1. 'pause -> Einfuegepunkt; Objekt haengt sichtbar am Cursor und + ;; verschiebt sich mit der Maus (erster Klick positioniert) + ;; "" "" -> X-/Y-Massstab = 1 + ;; Drehung -> aus Dialog fest, sonst 2. 'pause: Objekt dreht sich + ;; beim Ziehen sichtbar mit, zweiter Klick beendet + (if drehung (progn - (ssg-start "OMNI DXF Insert" '(("OSMODE") ("ATTREQ") ("ATTDIA"))) - (setvar "ATTREQ" 0) - (setvar "ATTDIA" 0) + (setq angleDeg (atof drehung)) + (setq drehung-anzeige drehung) + (command "_.INSERT" dxf-pfad pause "" "" angleDeg) + ) + (command "_.INSERT" dxf-pfad pause "" "" pause) + ) + ;; INSERT vollstaendig abschliessen (bei Bedarf weitere Eingabe zulassen) + (while (> (getvar "CMDACTIVE") 0) (command pause)) - ;; Drehwinkel aus Dialog uebernehmen, sonst zunaechst ungedreht - ;; einfuegen und den Winkel erst nach dem Einfuegen abfragen - ;; (Nutzer kann die Orientierung am eingefuegten Objekt erkennen) - (if drehung + (setq blockEnt (entlast)) + + (if (and blockEnt (= (cdr (assoc 0 (entget blockEnt))) "INSERT")) + (progn + (setq ed (entget blockEnt)) + + ;; Tatsaechlich per Maus gesetzte Drehung ermitteln (interaktiv) + (if (null drehung) (progn - (setq angleDeg (atof drehung)) - (setq drehung-anzeige drehung) - ) - (setq angleDeg 0.0) - ) - - ;; Hoehe als Z-Koordinate auf den Einfuegepunkt anwenden - (if (and hoehe (/= hoehe "")) - (setq pt (list (car pt) (cadr pt) (atof hoehe))) - (setq pt (list (car pt) (cadr pt) (if (caddr pt) (caddr pt) 0.0))) - ) - - ;; Objektfang aus: sonst kann _.INSERT den (mit expliziter Z-Hoehe - ;; gesetzten) Einfuegepunkt auf ein Objekt umfangen -> falsche Hoehe - ;; (gleicher Bugtyp wie beim GF-Z-Versatz). OSMODE via ssg-start - ;; gesichert, ssg-end stellt es wieder her. - (setvar "OSMODE" 0) - ;; Block einfuegen mit Drehwinkel aus Dialog - (command "_.INSERT" dxf-pfad pt "" "" angleDeg) - ;; INSERT vollstaendig abschliessen (Attribut-Prompts beenden) - (while (> (getvar "CMDACTIVE") 0) (command "")) - - (setq blockEnt (entlast)) - - ;; Drehwinkel interaktiv abfragen: ROTATE-Befehl mit der Entity - ;; und Basispunkt starten, dann per 'pause' die Winkeleingabe dem - ;; Nutzer ueberlassen (Objekt dreht sich beim Ziehen sichtbar mit). - ;; WICHTIG: Ohne 'pause' wuerde die nachfolgende CMDACTIVE-Schleife - ;; die Winkelabfrage sofort mit "" (=0 Grad) beenden. - (if (and (null drehung) blockEnt (= (cdr (assoc 0 (entget blockEnt))) "INSERT")) - (progn - (command "_.ROTATE" blockEnt "" pt pause) - (while (> (getvar "CMDACTIVE") 0) (command pause)) - (setq angleDeg (* (cdr (assoc 50 (entget blockEnt))) (/ 180.0 pi))) + (setq angleDeg (* (cdr (assoc 50 ed)) (/ 180.0 pi))) (setq drehung-anzeige (rtos angleDeg 2 1)) ) ) - (if (null drehung-anzeige) - (setq drehung-anzeige (rtos angleDeg 2 1)) + + ;; Z-Hoehe absolut anwenden: Block (inkl. Attribute) per MOVE um + ;; die Differenz zum aktuellen Einfuegepunkt-Z verschieben. Osnap + ;; beim interaktiven Einfuegen kann eine abweichende Z-Lage liefern, + ;; daher Differenz statt fixem Wert (vgl. GF-Z-Versatz-Bug). + ;; Explizite Koordinaten unterliegen keinem Objektfang. + (setq pt10 (cdr (assoc 10 ed))) + (setq zdelta (- zval (caddr pt10))) + (if (/= zdelta 0.0) + (command "_.MOVE" blockEnt "" (list 0.0 0.0 0.0) (list 0.0 0.0 zdelta)) ) - (if (and blockEnt (= (cdr (assoc 0 (entget blockEnt))) "INSERT")) - (progn - ;; HOEHE und DREHUNG Attribute setzen - (ssg-attrib-set-on blockEnt - (list (cons "HOEHE" (if hoehe hoehe (ssg-cfg-or "omniflo" "default_hoehe" "2000"))) - (cons "DREHUNG" drehung-anzeige))) + ;; HOEHE und DREHUNG Attribute setzen + (ssg-attrib-set-on blockEnt + (list (cons "HOEHE" (if hoehe hoehe (ssg-cfg-or "omniflo" "default_hoehe" "2000"))) + (cons "DREHUNG" drehung-anzeige))) - ;; Layer aus LAYER-Attribut lesen und Block verschieben - (setq attribs (ssg-attrib-read blockEnt)) - (setq layer-name (cdr (assoc "LAYER" attribs))) - (if (and layer-name (> (strlen layer-name) 0)) - (progn - (ssg-make-layer layer-name 7 nil) - (entmod (subst (cons 8 layer-name) (assoc 8 (entget blockEnt)) (entget blockEnt))) - (entupd blockEnt) - ) - ) + ;; Layer aus LAYER-Attribut lesen und Block verschieben + (setq attribs (ssg-attrib-read blockEnt)) + (setq layer-name (cdr (assoc "LAYER" attribs))) + (if (and layer-name (> (strlen layer-name) 0)) + (progn + (ssg-make-layer layer-name 7 nil) + (entmod (subst (cons 8 layer-name) (assoc 8 (entget blockEnt)) (entget blockEnt))) + (entupd blockEnt) ) ) - - ;; Eindeutige ID zuweisen - (if (and blockEnt (atoms-family 1 '("ssg-id-generate"))) - (ssg-id-generate blockEnt) - ) - - (princ (ssg-textf "omni-dxf-eingefuegt" - (list - sivasnr-str - (if hoehe hoehe (ssg-cfg-or "omniflo" "default_hoehe" "2000")) - drehung-anzeige - (if layer-name (strcat " Layer=" layer-name) "") - ))) - (ssg-end) - pt ) ) + + ;; Fallback fuer Anzeige, falls keine Drehung ermittelt wurde + (if (null drehung-anzeige) + (setq drehung-anzeige (rtos (if angleDeg angleDeg 0.0) 2 1)) + ) + + ;; Eindeutige ID zuweisen + (if (and blockEnt (atoms-family 1 '("ssg-id-generate"))) + (ssg-id-generate blockEnt) + ) + + (princ (ssg-textf "omni-dxf-eingefuegt" + (list + sivasnr-str + (if hoehe hoehe (ssg-cfg-or "omniflo" "default_hoehe" "2000")) + drehung-anzeige + (if layer-name (strcat " Layer=" layer-name) "") + ))) + (ssg-end) + ;; Rueckgabe: tatsaechlicher Einfuegepunkt + (if blockEnt (cdr (assoc 10 (entget blockEnt)))) ) ) ) @@ -1165,7 +1164,8 @@ artinr hoehe drehung rotation typ eintrag winkel weichentyp dlg-result new-eintrag new-hoehe new-drehung - basePoint sivasnr-str dxf-pfad data-pfad angleDeg blockEnt) + basePoint sivasnr-str dxf-pfad data-pfad angleDeg blockEnt + layer-name) ;; Implied Selection pruefen (setq ss (ssget "I")) @@ -1270,10 +1270,12 @@ ;; 5. Neuen Eintrag und Werte extrahieren ;; Drehung: Dialog liefert keine Drehung mehr (interaktiv beim Neu-Einfuegen); - ;; beim Edit wird die bestehende Blockdrehung beibehalten (in-place Neuaufbau). + ;; beim Edit wird die bestehende Blockdrehung beibehalten. Quelle ist die + ;; tatsaechliche Geometrie (rotation = Gruppe 50 in Grad, immer numerisch), + ;; nicht das DREHUNG-Attribut (kann fehlen/kein Zahl-String sein -> (atof T)). (setq new-eintrag (car dlg-result)) (setq new-hoehe (cadr dlg-result)) - (setq new-drehung (or (caddr dlg-result) drehung)) + (setq new-drehung (rtos rotation 2 1)) (setq sivasnr-str (omni:sivasid-to-str (omni:val new-eintrag "Sivasnr"))) ;; 6. DXF-Datei pruefen @@ -1304,9 +1306,22 @@ ;; Attribute setzen (if (and blockEnt (= (cdr (assoc 0 (entget blockEnt))) "INSERT")) - (ssg-attrib-set-on blockEnt - (list (cons "HOEHE" (if new-hoehe new-hoehe (ssg-cfg-or "omniflo" "default_hoehe" "2000"))) - (cons "DREHUNG" (if new-drehung new-drehung (ssg-cfg-or "omniflo" "default_drehung" "0"))))) + (progn + (ssg-attrib-set-on blockEnt + (list (cons "HOEHE" (if new-hoehe new-hoehe (ssg-cfg-or "omniflo" "default_hoehe" "2000"))) + (cons "DREHUNG" (if new-drehung new-drehung (ssg-cfg-or "omniflo" "default_drehung" "0"))))) + + ;; Layer aus LAYER-Attribut lesen und Block verschieben (wie omni:insert-dxf) + (setq attribs (ssg-attrib-read blockEnt)) + (setq layer-name (cdr (assoc "LAYER" attribs))) + (if (and layer-name (> (strlen layer-name) 0)) + (progn + (ssg-make-layer layer-name 7 nil) + (entmod (subst (cons 8 layer-name) (assoc 8 (entget blockEnt)) (entget blockEnt))) + (entupd blockEnt) + ) + ) + ) ) (princ (ssg-textf "omni-edit-aktualisiert"