[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:
+99
-84
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user