[ADD] Verbinder für Omniflo Fahrstrecke hinzugefügt

This commit is contained in:
2026-10-21 10:24:49 +02:00
parent 6b8f0f9ec3
commit e528913fbf
28 changed files with 244 additions and 187 deletions
+144 -107
View File
@@ -1004,8 +1004,7 @@
;; 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 angleDeg
drehung-anzeige blockEnt attribs layer-name ed pt10 zval zdelta)
(defun omni:insert-dxf (sivasnr-str hoehe drehung / dxf-pfad omniflo-pfad)
(setq omniflo-pfad (getenv "DXFM_OMNIFLO"))
(if (null omniflo-pfad)
(progn
@@ -1019,94 +1018,102 @@
(princ (ssg-textf "omni-fehler-dxf-nicht-gefunden" (list (strcat omniflo-pfad "/" sivasnr-str ".dxf"))))
nil
)
(progn
(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
(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))
(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 (* (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")))
(cons "DREHUNG" drehung-anzeige)))
;; Layer aus der Block-Vorgabe (LAYER-Attribut) setzen
(setq attribs (ssg-attrib-read blockEnt))
(setq layer-name (ssg-block-layer-vorgabe blockEnt sivasnr-str attribs))
)
)
;; 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))))
)
(omni:insert-datei dxf-pfad sivasnr-str hoehe drehung)
)
)
)
)
;; --- Block-Datei (DXF/DWG) interaktiv einfuegen ---
;; dxf-pfad = vollstaendiger Pfad der Blockdatei (bereits auf Existenz geprueft)
;; name = Anzeigename/Blockname fuer Meldung und Layer-Vorgabe
;; hoehe, drehung wie omni:insert-dxf
;; Rueckgabe: Einfuegepunkt oder nil bei Abbruch
(defun omni:insert-datei (dxf-pfad name hoehe drehung / angleDeg
drehung-anzeige blockEnt attribs layer-name ed pt10 zval zdelta)
(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
(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))
(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 (* (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")))
(cons "DREHUNG" drehung-anzeige)))
;; Layer aus der Block-Vorgabe (LAYER-Attribut) setzen
(setq attribs (ssg-attrib-read blockEnt))
(setq layer-name (ssg-block-layer-vorgabe blockEnt name attribs))
)
)
;; 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
name
(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))))
)
;; --- Eintrag aus Dialog-Ergebnis einfuegen ---
;; dlg-result = (eintrag hoehe drehung) aus omni:bogen-dialog / omni:weichen-dialog
@@ -1650,76 +1657,106 @@
)
;; --- Omniflo / Verbinder ---
;; Verbinder-Bloecke liegen dimensionsunabhaengig als DWG in
;; data/omniflo/Verbinder (nicht unter DXFM_OMNIFLO = data/omniflo/<DIM>).
;; Einfuegen wie die festen TEF-Bauteile ueber omni:insert-datei: Punkt und
;; Drehung interaktiv, Layer aus dem LAYER-Attribut, ID per ssg-id-generate.
;; Befehl -> DWG-Name steht direkt im jeweiligen c:OMNI_TV_*-Befehl.
;; Pfad der Verbinder-DWG aus Datenverzeichnis + Dateiname (ohne .dwg)
(defun omni:verbinder-pfad (data-pfad datei)
(strcat (vl-string-right-trim "/" (vl-string-translate "\\" "/" data-pfad))
"/omniflo/Verbinder/" datei ".dwg")
)
;; Verbinder-DWG interaktiv einfuegen. Rueckgabe: Einfuegepunkt oder nil
(defun omni:insert-verbinder (datei / data-pfad pfad)
(setq data-pfad (getenv "DXFM_DATA"))
(cond
((null data-pfad)
(princ (ssg-text "omni-fehler-dxfm-data"))
nil)
((not (findfile (setq pfad (omni:verbinder-pfad data-pfad datei))))
(princ (ssg-textf "omni-fehler-dxf-nicht-gefunden" (list pfad)))
nil)
(t (omni:insert-datei pfad datei nil nil))
)
)
(defun c:OMNI_TV_W_W ()
(princ "\n[DUMMY] TV W-W kpl")
(omni:insert-verbinder "TV_W-W_kpl")
(princ)
)
(defun c:OMNI_TV_W_AP110 ()
(princ "\n[DUMMY] TV W-AP110 kpl")
(omni:insert-verbinder "TV_W-AP110_kpl")
(princ)
)
(defun c:OMNI_TV_W_AP60 ()
(princ "\n[DUMMY] TV W-AP60 oben kpl.")
(omni:insert-verbinder "TV_W-AP60_oben")
(princ)
)
(defun c:OMNI_TV_W_AP60_KPL ()
(omni:insert-verbinder "TV_W-AP60_kpl")
(princ)
)
(defun c:OMNI_TV_W_AP110_W ()
(princ "\n[DUMMY] TV W-AP110-W kpl")
(princ)
)
(defun c:OMNI_TV_W_AP ()
(princ "\n[DUMMY] TV W-AP oben kpl")
(omni:insert-verbinder "TV_W-AP110-W_kpl")
(princ)
)
(defun c:OMNI_TV_80 ()
(princ "\n[DUMMY] TV 80")
(omni:insert-verbinder "TV_80_kpl")
(princ)
)
(defun c:OMNI_TV_50 ()
(princ "\n[DUMMY] TV 50")
(omni:insert-verbinder "TV_50_kpl")
(princ)
)
(defun c:OMNI_TV_ENDPLATTE ()
(princ "\n[DUMMY] Endplatte Al-Profil AP schraubbar")
(omni:insert-verbinder "VB_ENDP_AP")
(princ)
)
(defun c:OMNI_TV_ANSCHLAG ()
(princ "\n[DUMMY] Anschlag AP-Ende fuer Spulenzug")
(omni:insert-verbinder "VB_ENDP_AP_Spulenzug")
(princ)
)
(defun c:OMNI_TV_A_AP110_AP60 ()
(princ "\n[DUMMY] TV-A fuer AP110/AP60 kpl")
(omni:insert-verbinder "TV_AP110-AP60_kpl")
(princ)
)
(defun c:OMNI_TV_A_AP60_ST ()
(princ "\n[DUMMY] TV-A fuer AP60/ST")
(omni:insert-verbinder "TV_AP60-ST_kpl")
(princ)
)
(defun c:OMNI_TV_A_AP110_ST ()
(princ "\n[DUMMY] TV-A fuer AP110/ST kpl")
(omni:insert-verbinder "TV_AP110-ST_kpl")
(princ)
)
(defun c:OMNI_TV_SW_II_SW_SW ()
(princ "\n[DUMMY] TV-SW II fuer SW-SW")
(omni:insert-verbinder "TV_SW-SW")
(princ)
)
(defun c:OMNI_TV_SW_III_AP110_SW ()
(princ "\n[DUMMY] TV-SW III fuer SW-AP110-SW")
(omni:insert-verbinder "TV_SW-AP110-SW")
(princ)
)
(defun c:OMNI_TV_SW_III_AP110 ()
(princ "\n[DUMMY] TV-SW III fuer SW-AP110")
(defun c:OMNI_TV_W_AP60_KPL ()
(omni:insert-verbinder "TV_W-AP60_kpl")
(princ)
)
(defun c:OMNI_TV_SW_I_AP110 ()
(omni:insert-verbinder "TV_SW_I_SW-AP110")
(princ)
)
(defun c:OMNI_TV_SW_IV_AP60 ()
(princ "\n[DUMMY] TV-SW IV fuer Anschluss SW-AP60")
(omni:insert-verbinder "TV_SW_IV_SW-AP60")
(princ)
)
(defun c:OMNI_TV_SW_IV_ST ()
(princ "\n[DUMMY] TV-SW IV fuer SW-ST")
(omni:insert-verbinder "TV_SW_IV_SW-ST")
(princ)
)
(defun c:OMNI_TV_MUFFE ()
(princ "\n[DUMMY] Muffe")
(omni:insert-verbinder "VB_Muffe")
(princ)
)