This commit is contained in:
2026-07-21 14:11:56 +02:00
14 changed files with 7454 additions and 26567 deletions
+2 -1
View File
@@ -183,6 +183,7 @@ cython_debug/
/tests/output/ /tests/output/
# BricsCAD kompilierte Menuedateien # BricsCAD kompilierte Menuedateien
*.cui #CUI soll nun auch verwaltet werden
#*.cui
data/block_libraries/ils_library.dxf >> .gitignore data/block_libraries/ils_library.dxf >> .gitignore
echo data/block_libraries/ils_library.dxf echo data/block_libraries/ils_library.dxf
+18
View File
@@ -1289,6 +1289,24 @@
) )
;; --- Omniflo / Anbaugruppen, Scanner, Stopper ---
;; Feste TEF-Bauteile ohne Sivas-Auswahl: Datei liegt direkt unter DXFM_OMNIFLO,
;; wird per omni:insert-dxf am gewaehlten Einfuegepunkt ohne Drehung eingefuegt.
(defun c:OMNI_STOPPER ()
(omni:insert-dxf "827062022" nil nil)
(princ)
)
(defun c:OMNI_SCANNER ()
(omni:insert-dxf "Scanner" nil nil)
(princ)
)
(defun c:OMNI_BUERSTENBREMSE ()
(omni:insert-dxf "827064041" nil nil)
(princ)
)
;; --- Omniflo / TEF Elemente --- ;; --- Omniflo / TEF Elemente ---
;; Feste TEF-Bauteile ohne Sivas-Auswahl: Datei liegt direkt unter DXFM_OMNIFLO, ;; Feste TEF-Bauteile ohne Sivas-Auswahl: Datei liegt direkt unter DXFM_OMNIFLO,
;; wird per omni:insert-dxf am gewaehlten Einfuegepunkt ohne Drehung eingefuegt. ;; wird per omni:insert-dxf am gewaehlten Einfuegepunkt ohne Drehung eingefuegt.
+216
View File
@@ -0,0 +1,216 @@
;; ============================================================
;; TEFInsert.lsp - TEF-Geradenstuecke entlang einer Linie
;;
;; Zeichnet eine Linie zwischen zwei vom Benutzer gewaehlten Punkten
;; und reiht darauf 1000 mm lange TEF-Geradenelemente
;; (data/omniflo/<DIM>/0_B10030.dxf, $INSBASE=Ursprung=Anfang des
;; Elements, Ende bei lokal X=1000) aneinander.
;;
;; Ist die Linienlaenge kein exaktes Vielfaches von 1000 mm, wird fuer
;; das letzte Stueck ein zusaetzliches Element eingefuegt, das auf der
;; Linie zurueckverschoben platziert wird (ueberlappt das vorletzte
;; Element), sodass der Foerderer exakt am Linienende endet - statt
;; einer Luecke oder eines abgeschnittenen Elements.
;;
;; Die Linie darf geneigt sein (3D): Start-/Endpunkt koennen
;; unterschiedliche Z-Werte haben, die Elemente werden dann analog zu
;; vf_core.lsp (Rz(hz)*Ry(winkel)-Rotation, winkel positiv=abwaerts)
;; gekippt eingefuegt.
;;
;; Befehl: TEF_FOERDERER_LINIE
;; ============================================================
(vl-load-com)
(if (null doc) (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))))
(if (null modelspace) (setq modelspace (vla-get-ModelSpace doc)))
;; Elementlaenge (mm) von 0_B10030.dxf (siehe Header-Kommentar oben)
(if (null *tefl-elementlaenge*) (setq *tefl-elementlaenge* 1000.0))
;; Toleranz (mm): Restlaenge unterhalb dieses Werts gilt als "exaktes
;; Vielfaches der Elementlaenge" -> kein Zusatzelement noetig.
(if (null *tefl-toleranz*) (setq *tefl-toleranz* 0.5))
;; Dateiname (ohne .dxf) des TEF-Geradenelements in DXFM_OMNIFLO
(if (null *tefl-blockname*) (setq *tefl-blockname* "0_B10030"))
;; ------------------------------------------------------------
;; Pfad zur Element-DXF ermitteln (DXFM_OMNIFLO, wie omni:insert-dxf
;; in OmniModulInsert.lsp).
;; ------------------------------------------------------------
(defun tefl-dxf-pfad ( / omniflo-pfad)
(setq omniflo-pfad (getenv "DXFM_OMNIFLO"))
(if omniflo-pfad
(strcat (vl-string-translate "\\" "/" omniflo-pfad) "/" *tefl-blockname* ".dxf")
)
)
;; ------------------------------------------------------------
;; Element-DXF einmalig als Block registrieren (Analog zu
;; ensure-block-loaded in vf_core.lsp, aber fuer eine externe .dxf statt
;; .dwg): einmal am Ursprung einfuegen und wieder loeschen, damit die
;; Datei als Block-Tabelleneintrag *tefl-blockname* existiert. Danach
;; kann jede weitere Einfuegung ueber vla-InsertBlock + vla-TransformBy
;; mit voller 3D-Rotation erfolgen (das kann die reine command-Zeilen-
;; INSERT nicht leisten - die dreht nur um die Z-Achse).
;; ------------------------------------------------------------
(defun tefl-ensure-block-loaded (dxf-pfad / tmpEnt)
(if (not (tblsearch "BLOCK" *tefl-blockname*))
(progn
(command "_.INSERT" dxf-pfad (list 0.0 0.0 0.0) 1 1 0)
(while (> (getvar "CMDACTIVE") 0) (command ""))
(setq tmpEnt (entlast))
(if (and tmpEnt (= (cdr (assoc 0 (entget tmpEnt))) "INSERT"))
(command "_.ERASE" tmpEnt "")
)
)
)
(tblsearch "BLOCK" *tefl-blockname*)
)
;; ------------------------------------------------------------
;; Ein Element an Position 's' (mm ab Startpunkt) entlang der
;; Fahrtrichtung einfuegen.
;; start : Startpunkt der Linie (3D)
;; richtung-einheit : Einheitsvektor der Fahrtrichtung (3D)
;; hz / winkel : Fahrtrichtung in Grad (Rz(hz)*Ry(winkel)-Konvention
;; wie hz-winkel->xu/frame->hz-winkel in vf_core.lsp)
;;
;; Attribute: vla-InsertBlock legt fuer ein Block mit ATTDEFs automatisch
;; ATTRIB-Entities mit den Vorgabewerten aus der Quell-DXF an (wie beim
;; command-Zeilen-INSERT mit ATTREQ=0). Analog zu omni:insert-dxf in
;; OmniModulInsert.lsp wird danach nur das LAYER-Attribut ausgelesen und
;; der Block auf diesen Layer verschoben - alle anderen Attribute
;; (ARTINR, BESCHR, MENGE, POSITION, DETAILS, ...) behalten den aus der
;; Quell-DXF uebernommenen Vorgabewert.
;; ------------------------------------------------------------
(defun tefl-insert-element (start richtung-einheit s hz winkel /
rad-h rad-v chv shv cvv svv matrix block-obj blockEnt
pt attribs layer-name)
(setq pt (list (+ (car start) (* s (car richtung-einheit)))
(+ (cadr start) (* s (cadr richtung-einheit)))
(+ (caddr start) (* s (caddr richtung-einheit)))))
(setq rad-h (* (float hz) (/ pi 180.0)))
(setq rad-v (* (float winkel) (/ pi 180.0)))
(setq chv (cos rad-h) shv (sin rad-h) cvv (cos rad-v) svv (sin rad-v))
(setq block-obj (vla-InsertBlock modelspace (vlax-3D-point '(0.0 0.0 0.0))
*tefl-blockname* 1.0 1.0 1.0 0))
(setq matrix (list
(list (* chv cvv) (- shv) (* chv svv) 0)
(list (* shv cvv) chv (* shv svv) 0)
(list (- svv) 0 cvv 0)
(list 0 0 0 1)))
(vla-TransformBy block-obj (vlax-tmatrix matrix))
(vla-Move block-obj (vlax-3D-point '(0.0 0.0 0.0)) (vlax-3D-point pt))
;; LAYER-Attribut auslesen und Block auf diesen Layer verschieben
(setq blockEnt (vlax-vla-object->ename block-obj))
(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, falls das Block-Schema ein ID-Attribut fuehrt
;; (bei 0_B10030 aktuell nicht der Fall - dann folgenlos, wie in
;; omni:insert-dxf).
(if (atoms-family 1 '("ssg-id-generate"))
(ssg-id-generate blockEnt)
)
block-obj
)
;; ------------------------------------------------------------
;; Hauptbefehl: Start-/Endpunkt abfragen, Linie zeichnen, TEF-Geraden-
;; elemente entlang der Linie aneinanderreihen.
;; ------------------------------------------------------------
(defun c:TEF_FOERDERER_LINIE ( / dxf-pfad p1 p2 dx dy dz laenge horiz hz winkel
richtung-einheit anzahl-voll rest i s)
(setq dxf-pfad (tefl-dxf-pfad))
(cond
((null dxf-pfad)
(princ (ssg-text "tefl-fehler-dxfm-omniflo")))
((not (findfile dxf-pfad))
(princ (ssg-textf "tefl-fehler-dxf-nicht-gefunden" (list dxf-pfad))))
(t
(setq p1 (getpoint (ssg-text "tefl-prompt-startpunkt")))
(if (null p1)
(princ (ssg-text "tefl-abgebrochen"))
(progn
(setq p2 (getpoint p1 (ssg-text "tefl-prompt-endpunkt")))
(if (null p2)
(princ (ssg-text "tefl-abgebrochen"))
(progn
(setq dx (- (car p2) (car p1))
dy (- (cadr p2) (cadr p1))
dz (- (caddr p2) (caddr p1)))
(setq laenge (sqrt (+ (* dx dx) (* dy dy) (* dz dz))))
(if (< laenge *tefl-toleranz*)
(princ (ssg-text "tefl-fehler-laenge-null"))
(progn
(ssg-start "TEF Foerderer Linie" '(("OSMODE") ("ATTREQ") ("ATTDIA")))
(setvar "ATTREQ" 0)
(setvar "ATTDIA" 0)
(if (not (tefl-ensure-block-loaded dxf-pfad))
(progn
(princ (ssg-textf "tefl-fehler-dxf-nicht-gefunden" (list dxf-pfad)))
(ssg-end)
)
(progn
;; Fahrtrichtung als Einheitsvektor + hz/winkel
(setq richtung-einheit
(list (/ dx laenge) (/ dy laenge) (/ dz laenge)))
(setq horiz (sqrt (+ (* dx dx) (* dy dy))))
(setq hz (* (atan dy dx) (/ 180.0 pi)))
(setq winkel (* (atan (- dz) horiz) (/ 180.0 pi)))
;; Linie zwischen den beiden Punkten zeichnen
(entmake (list '(0 . "LINE")
(cons 8 (getvar "CLAYER"))
(cons 10 p1)
(cons 11 p2)))
;; Volle Elemente ab dem Startpunkt aneinanderreihen
(setq anzahl-voll
(fix (/ (+ laenge *tefl-toleranz*) *tefl-elementlaenge*)))
(setq i 0)
(repeat anzahl-voll
(tefl-insert-element p1 richtung-einheit
(* i *tefl-elementlaenge*) hz winkel)
(setq i (1+ i))
)
;; Restlaenge: Zusatzelement zurueckverschoben einfuegen,
;; damit der Foerderer exakt am Linienende (p2) endet.
(setq rest (- laenge (* anzahl-voll *tefl-elementlaenge*)))
(if (> rest *tefl-toleranz*)
(progn
(setq s (- laenge *tefl-elementlaenge*))
(tefl-insert-element p1 richtung-einheit s hz winkel)
(setq anzahl-voll (1+ anzahl-voll))
)
)
(princ (ssg-textf "tefl-fertig"
(list (itoa anzahl-voll) (rtos laenge 2 0))))
(ssg-end)
)
)
)
)
)
)
)
)
)
)
(princ)
)
(princ "\nTEFInsert.lsp geladen. Befehl: TEF_FOERDERER_LINIE")
(princ)
Binary file not shown.
+3446 -3278
View File
File diff suppressed because it is too large Load Diff
+2289 -5191
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.
+8 -1
View File
@@ -618,6 +618,13 @@
"gf-status-zus2-ein-seite": "\n>>> EIN-Seite: %1", "gf-status-zus2-ein-seite": "\n>>> EIN-Seite: %1",
"gf-status-zus2-lstau": "\n>>> L_stau: %1 mm", "gf-status-zus2-lstau": "\n>>> L_stau: %1 mm",
"ques-yn-default-yes": " Y/N <Y>: ", "ques-yn-default-yes": " Y/N <Y>: ",
"ques-yn-default-no": " Y/N <N>: " "ques-yn-default-no": " Y/N <N>: ",
"tefl-fehler-dxfm-omniflo": "\n[TEF] FEHLER: DXFM_OMNIFLO nicht gesetzt (bin/setenv.bat ausfuehren).",
"tefl-fehler-dxf-nicht-gefunden": "\n[TEF] FEHLER: Element-DXF nicht gefunden: %1",
"tefl-prompt-startpunkt": "\nStartpunkt der Foerderstrecke waehlen: ",
"tefl-prompt-endpunkt": "\nEndpunkt der Foerderstrecke waehlen: ",
"tefl-abgebrochen": "\n[TEF] Abgebrochen.",
"tefl-fehler-laenge-null": "\n[TEF] FEHLER: Start- und Endpunkt liegen zu nah beieinander.",
"tefl-fertig": "\n[TEF] %1 Element(e) eingefuegt, Streckenlaenge=%2 mm."
} }
} }
+8 -1
View File
@@ -618,6 +618,13 @@
"gf-status-zus2-ein-seite": "\n>>> Input side: %1", "gf-status-zus2-ein-seite": "\n>>> Input side: %1",
"gf-status-zus2-lstau": "\n>>> L_stau: %1 mm", "gf-status-zus2-lstau": "\n>>> L_stau: %1 mm",
"ques-yn-default-yes": " Y/N <Y>: ", "ques-yn-default-yes": " Y/N <Y>: ",
"ques-yn-default-no": " Y/N <N>: " "ques-yn-default-no": " Y/N <N>: ",
"tefl-fehler-dxfm-omniflo": "\n[TEF] ERROR: DXFM_OMNIFLO not set (run bin/setenv.bat).",
"tefl-fehler-dxf-nicht-gefunden": "\n[TEF] ERROR: Element DXF not found: %1",
"tefl-prompt-startpunkt": "\nSelect start point of the conveyor path: ",
"tefl-prompt-endpunkt": "\nSelect end point of the conveyor path: ",
"tefl-abgebrochen": "\n[TEF] Cancelled.",
"tefl-fehler-laenge-null": "\n[TEF] ERROR: Start and end point are too close together.",
"tefl-fertig": "\n[TEF] %1 element(s) inserted, path length=%2 mm."
} }
} }
+3 -3
View File
@@ -244,7 +244,7 @@ def build_kreisel_details(block):
SKIP_BLOCKS = set(BLOCKPATTERNS.get("pattern_ks_subblocks", ["K1", "K2", "K3", "K4", "KS_EIN", "KS_AUS"])) SKIP_BLOCKS = set(BLOCKPATTERNS.get("pattern_ks_subblocks", ["K1", "K2", "K3", "K4", "KS_EIN", "KS_AUS"]))
# Sivas-Nummern und Bezeichnungen je ILS-Elementtyp # Sivas-Nummern und Bezeichnungen je ILS-Elementtyp
# Hinweis: "ils_kurve", "bt_beladung" und "bg_entladung" sind aktuell nur # Hinweis: "ils_kurve", sind aktuell nur
# Typnamen-Platzhalter - die zugehoerigen Menuebefehle sind noch Dummies # Typnamen-Platzhalter - die zugehoerigen Menuebefehle sind noch Dummies
# (siehe Lisp/README.md), es gibt noch keine Block-Erkennung dafuer. # (siehe Lisp/README.md), es gibt noch keine Block-Erkennung dafuer.
ILS_SIVASNR = { ILS_SIVASNR = {
@@ -255,8 +255,8 @@ ILS_SIVASNR = {
"ils_kurve": ("", "ILS 2.0 Kurve"), "ils_kurve": ("", "ILS 2.0 Kurve"),
"strecke": ("6220", "ILS 2.0 Strecke"), "strecke": ("6220", "ILS 2.0 Strecke"),
"gefaellestrecke": ("6220", "ILS 2.0 Gefaellestrecke"), "gefaellestrecke": ("6220", "ILS 2.0 Gefaellestrecke"),
"bt_beladung": ("", "BT - Beladung"), "bt_beladung": ("", "BT - Beladung (mit Vereinzeler, ohne Separator)"),
"bg_entladung": ("", "BG - Entladung"), "bg_entladung": ("", "Abwurf für Klammerbügel Sitzbezüge / Kleiderbügel"),
"automation": ("6269", "ILS 2.0 Automation und Pneumatik - Gesamtanlage"), "automation": ("6269", "ILS 2.0 Automation und Pneumatik - Gesamtanlage"),
} }
+1449
View File
File diff suppressed because it is too large Load Diff
+5
View File
@@ -81,7 +81,12 @@
[TEF Antriebst. links]^C^C(ssg-ensure "OmniModulInsert") OMNI_TEF_AntriebL [TEF Antriebst. links]^C^C(ssg-ensure "OmniModulInsert") OMNI_TEF_AntriebL
[TEF Umlenkspannst. links]^C^C(ssg-ensure "OmniModulInsert") OMNI_TEF_UmlenkL [TEF Umlenkspannst. links]^C^C(ssg-ensure "OmniModulInsert") OMNI_TEF_UmlenkL
[--] [--]
[TEF Gerade auf Linie]^C^C(ssg-ensure "TEFInsert") TEF_FOERDERER_LINIE
[<-TEF Gerade]^C^C(ssg-ensure "OmniModulInsert") OMNI_TEF_Gerade [<-TEF Gerade]^C^C(ssg-ensure "OmniModulInsert") OMNI_TEF_Gerade
[->Anbaugruppen]
[Stopper AP]^C^C(ssg-ensure "OmniModulInsert") OMNI_STOPPER
[Scanner]^C^C(ssg-ensure "OmniModulInsert") OMNI_SCANNER
[<-Bürstenbremse]^C^C(ssg-ensure "OmniModulInsert") OMNI_BUERSTENBREMSE
[~KettenFoerderer]^C^C(ssg-ensure "OmniModulInsert") OMNI_KettenFoerderer [~KettenFoerderer]^C^C(ssg-ensure "OmniModulInsert") OMNI_KettenFoerderer
[->Verbinder] [->Verbinder]
[~TV W-W kpl]^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_W_W [~TV W-W kpl]^C^C(ssg-ensure "OmniModulInsert") OMNI_TV_W_W
+10
View File
@@ -16,6 +16,11 @@
"wert": 4500.0, "wert": 4500.0,
"kommentar": "getreal Hoehe (Z) Startpunkt" "kommentar": "getreal Hoehe (Z) Startpunkt"
}, },
{
"typ": "string",
"wert": "1",
"kommentar": "getstring AS-Element Winkel (90 Grad)"
},
{ {
"typ": "string", "typ": "string",
"wert": "2", "wert": "2",
@@ -170,6 +175,11 @@
"wert": 2, "wert": 2,
"kommentar": "getint Option-3-Winkelwahl (45 Grad)" "kommentar": "getint Option-3-Winkelwahl (45 Grad)"
}, },
{
"typ": "string",
"wert": "1",
"kommentar": "getstring ES-Element Winkel (90 Grad)"
},
{ {
"typ": "string", "typ": "string",
"wert": "2", "wert": "2",