[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)
)
+1 -2
View File
@@ -39,7 +39,6 @@ am Label-Anfang, bei Submenue-Schliessern hinter dem `<-` (`[<-~Label]`).
| Menuebereich | Eintraege | Definiert in |
| --- | --- | --- |
| Omniflo ▸ Anbaugruppen | `OMNI_KettenFoerderer` | `OmniModulInsert.lsp` |
| Omniflo ▸ Verbinder | alle `OMNI_TV_*` (18) | `OmniModulInsert.lsp` |
| Omniflo ▸ Boegen fuer Weichen | alle `OMNI_APBW_*` (14) | `OmniModulInsert.lsp` |
| ILS ▸ Zusatzmodule/Kurven | `ILS_ETF_Etagenfoerderer`, `ILS_K{90,60,30}{L,R}{A,I}` (12), `ILS_Gefaellestrecke` | `SSG_LIB_Commands.lsp` |
| Geruest | `GERUEST` (Gattertraeger-Platzhalter, derselbe Befehl wie Saeulen/Rohrabhaenger/Wandbefestigung) | `GeruestInsert.lsp` |
@@ -703,7 +702,7 @@ AutoLISP-Implementierung fuer alle Omniflo-Komponenten: Boegen, Weichen, Verbind
| Ladeschleifen | `OMNI_LADESCHLEIFE_AP110` | Ladeschleife aus `omniflo_ladeschleifen.json` ueber DCL-Dialog (`dcl/omniflo_ladeschleifen.dcl`) einfuegen; Daten per `ssg-json-laden` (Beschreibungen enthalten Kommas). Blockdatei `<Sivasnr>.dwg` unter `DXFM_OMNIFLO` (`omni:insert-dxf` faellt auf `.dwg` zurueck, wenn keine `.dxf` existiert). Per `OMNI_EDIT` editierbar |
| TEF Elemente | `OMNI_TEF_UmlenkR/L`, `OMNI_TEF_AntriebL/R`, `OMNI_TEF_Gerade` | Feste TEF-Bauteile ohne Sivas-Auswahl, direkt per `omni:insert-dxf` an gewaehltem Punkt eingefuegt (Dateien unter `DXFM_OMNIFLO`) |
| Anbaugruppen ⚠️ | `OMNI_KettenFoerderer` | **Dummy** (noch nicht implementiert, im Menue ausgegraut); `OMNI_STOPPER`/`OMNI_SCANNER`/`OMNI_BUERSTENBREMSE` sind implementiert |
| Transferwagen ⚠️ | `OMNI_TV_*` | **Dummy** (noch nicht implementiert, im Menue ausgegraut) |
| Verbinder | `OMNI_TV_*` | Verbinder-DWG aus `data/omniflo/Verbinder` (dimensionsunabhaengig, `omni:insert-verbinder` -> `omni:insert-datei`, Punkt + Drehung interaktiv). Zuordnung Befehl -> DWG nach Dateiname, z.B. `OMNI_TV_W_AP60` -> `TV_W-AP60_oben`, `OMNI_TV_ENDPLATTE` -> `VB_ENDP_AP`, `OMNI_TV_W_AP60_KPL` -> `TV_W-AP60_kpl`, `OMNI_TV_ANSCHLAG` -> `VB_ENDP_AP_Spulenzug`, `OMNI_TV_SW_I_AP110` -> `TV_SW_I_SW-AP110`, `OMNI_TV_MUFFE` -> `VB_Muffe`. Alle 18 Eintraege aktiv |
| Bogenweichen ⚠️ | `OMNI_APBW_*` | **Dummy** (noch nicht implementiert, im Menue ausgegraut) |
| Bearbeiten | `OMNI_EDIT` | Omniflo-Block selektieren und Attribute bearbeiten |
+4
View File
@@ -2394,6 +2394,9 @@
;; GeruestInsert.lsp). Wie BTMT eigenstaendig und von keinem anderen
;; Element mitgezaehlt - export_csv.py UND export_sivas.py fuehren sie
;; beide als eigene TeileArt-Zeilen.
;; VB_*/TV_* = Omniflo-Verbinder (siehe pattern_verbinder in
;; cfg/export.cfg, OMNI_TV_* in OmniModulInsert.lsp). export_sivas.py
;; fuehrt sie ueber TEILEART/ARTINR im allgemeinen Omniflo-Zweig.
;; Bloecke auf GEFRORENEN Layern (und die Hilfsobjekte gefrorener VF_n/GF_n)
;; werden ausgelassen, solange *csv-gefrorene-ausschliessen* an ist (Standard,
;; Dialog CSV_EXPORT_KONFIG); ausgeschaltete Layer zaehlen nicht als gefroren.
@@ -2445,6 +2448,7 @@
(wcmatch bname (export:pattern "pattern_eingang" "Eingang*"))
(wcmatch bname (export:pattern "pattern_ausgang" "Ausgang*"))
(wcmatch bname (export:pattern "pattern_geruest" "GR_*"))
(wcmatch bname (export:pattern "pattern_verbinder" "VB_*,TV_*"))
(wcmatch bname (export:pattern "pattern_unit_marker" "ZZ_UNIT_MARKER*"))
;; Rein numerische Namen = Omniflo SivasNr (Boegen/Weichen)
;; Rein LISP-intern (Python klassifiziert Omniflo stattdessen
+3
View File
@@ -45,6 +45,8 @@
;; Spalte (auch auf Kreiseln) bekommen.
;; GR_* (Geruest-Baugruppen, siehe pattern_geruest in cfg/export.cfg) ebenso -
;; das ID-ATTDEF steht seit *geruest-attrib-defs* zur Verfuegung.
;; VB_*/TV_* (Omniflo-Verbinder, siehe pattern_verbinder in
;; cfg/export.cfg) ebenso - fest im Code wie GR_*.
;; Gefaellebogen_* (siehe pattern_nested_bogen in cfg/export.cfg): einer der
;; Bausteine einer GF-Kette, verpackt in VF_n/GF_n; wird beim Export ebenso
;; als temporaere Kopie ausgepackt wie die uebrigen Vario_*/Staustrecke_*-
@@ -81,6 +83,7 @@
(wcmatch bname "BTMT-Beladung*,SC_Entladung*")
(wcmatch bname "Eingang*,Ausgang*")
(wcmatch bname "GR_*")
(wcmatch bname "VB_*,TV_*")
(wcmatch bname "#*")
)
(ssadd ename ss-out)