[FIX] nach dem Editieren bzw. Austauschen eines Objekts über Doppelklick und Menü wird das Layer nun korrekt entsprechend des Layer-Attributs gesetzt

This commit is contained in:
2026-07-22 08:54:04 +02:00
parent 63e4e9ef32
commit 187f0acf31
+64 -49
View File
@@ -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,62 +898,56 @@
nil
)
(progn
(setq pt (getpoint (ssg-text "omni-prompt-einfuegepunkt")))
(if (null pt)
(progn (princ (ssg-text "omni-abbruch-omni")) nil)
(progn
(ssg-start "OMNI DXF Insert" '(("OSMODE") ("ATTREQ") ("ATTDIA")))
(ssg-start "OMNI DXF Insert" '(("ATTREQ") ("ATTDIA")))
(setvar "ATTREQ" 0)
(setvar "ATTDIA" 0)
;; Drehwinkel aus Dialog uebernehmen, sonst zunaechst ungedreht
;; einfuegen und den Winkel erst nach dem Einfuegen abfragen
;; (Nutzer kann die Orientierung am eingefuegten Objekt erkennen)
;; 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
(setq angleDeg (atof drehung))
(setq drehung-anzeige drehung)
(command "_.INSERT" dxf-pfad pause "" "" angleDeg)
)
(setq angleDeg 0.0)
(command "_.INSERT" dxf-pfad pause "" "" pause)
)
;; 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 ""))
;; INSERT vollstaendig abschliessen (bei Bedarf weitere Eingabe zulassen)
(while (> (getvar "CMDACTIVE") 0) (command pause))
(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 drehung-anzeige (rtos angleDeg 2 1))
)
)
(if (null drehung-anzeige)
(setq drehung-anzeige (rtos angleDeg 2 1))
)
(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 (* (cdr (assoc 50 ed)) (/ 180.0 pi)))
(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))
)
;; HOEHE und DREHUNG Attribute setzen
(ssg-attrib-set-on blockEnt
(list (cons "HOEHE" (if hoehe hoehe (ssg-cfg-or "omniflo" "default_hoehe" "2000")))
@@ -971,6 +966,11 @@
)
)
;; 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)
@@ -984,9 +984,8 @@
(if layer-name (strcat " Layer=" layer-name) "")
)))
(ssg-end)
pt
)
)
;; 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"))
(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"