Compare commits
93 Commits
10ed8b863b
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 78f19c750c | |||
| 2eca169326 | |||
| 1ddd9449c6 | |||
| 3ab7d29476 | |||
| 15ba546a17 | |||
| 9458382965 | |||
| 0fe14c5454 | |||
| bf517475bb | |||
| ae9ce69d5f | |||
| 2ae64cb4a8 | |||
| a9c03b0b9a | |||
| ab7fc92e23 | |||
| bde2380490 | |||
| 2767897158 | |||
| 444d643dd3 | |||
| 554e9bee99 | |||
| fe283a0bf3 | |||
| 6bf6b00e13 | |||
| f7933df5a4 | |||
| 0b89ed6c5e | |||
| 335c6d7875 | |||
| 8a7521572d | |||
| 1d3191b84b | |||
| 6073eb1d78 | |||
| 96788e7244 | |||
| 72a4637bd2 | |||
| 7a1444439c | |||
| 3897581dc9 | |||
| 8ae55d171e | |||
| 6a487433e2 | |||
| 80ec7043b8 | |||
| 9ce739fb35 | |||
| 5eb0acd446 | |||
| fd63e4c3ad | |||
| acdf735e00 | |||
| 17d5bfc539 | |||
| 027b377b84 | |||
| cc3cb9f160 | |||
| da1ffb27a4 | |||
| d2d51e4415 | |||
| 2abcd0964c | |||
| 3c5d8be08d | |||
| f87260c605 | |||
| f73f0c123a | |||
| 3869f8b624 | |||
| 8a424d292e | |||
| ca8543cca3 | |||
| 05a7000d33 | |||
| 3dd6e091e0 | |||
| 11555ace8e | |||
| b915980540 | |||
| 649857a9dd | |||
| 0bee5ad8d0 | |||
| 2e72f17806 | |||
| b7025e5523 | |||
| 9b2bfed255 | |||
| 2009eb1a2c | |||
| 8db7b2bfbf | |||
| 68affdaa82 | |||
| 4a9d29f243 | |||
| d92b723e8c | |||
| bf3996435a | |||
| fe2e467888 | |||
| 4863df7bac | |||
| 8c7998c0cd | |||
| 311d611f59 | |||
| 79f699432e | |||
| 1328a6e933 | |||
| 9e79e21fb6 | |||
| 3a3d22d103 | |||
| 20dd489468 | |||
| d961c81caf | |||
| 5f4e73b3af | |||
| 376f2e1fc8 | |||
| 2c689cbcf1 | |||
| 84e91e557e | |||
| f417df4b54 | |||
| b9ca2820d4 | |||
| 0ea11fdac2 | |||
| d408f3eea7 | |||
| 99eb5c9d86 | |||
| 44762cce8f | |||
| db0d9abb7a | |||
| b0aeb04022 | |||
| b7499669af | |||
| 2d4cb1cc36 | |||
| b60205013f | |||
| 64cd1612cb | |||
| 73528fa574 | |||
| 6be04e11ff | |||
| 250ee0d788 | |||
| dea039f349 | |||
| cab9db526e |
@@ -135,6 +135,7 @@ venv/
|
||||
ENV/
|
||||
env.bak/
|
||||
venv.bak/
|
||||
_setenv.bat
|
||||
|
||||
# cui folder for briscad
|
||||
aiassist_next_command/
|
||||
@@ -183,3 +184,5 @@ cython_debug/
|
||||
|
||||
# BricsCAD kompilierte Menuedateien
|
||||
*.cui
|
||||
data/block_libraries/ils_library.dxf >> .gitignore
|
||||
echo data/block_libraries/ils_library.dxf
|
||||
|
||||
@@ -19,7 +19,7 @@ AutoLISP-Makros (SSG_LIB) fuer BricsCAD Pro zur automatisierten Erstellung von F
|
||||
| Verzeichnis | Inhalt |
|
||||
|---|---|
|
||||
| `Lisp/` | AutoLISP-Makros und Kernbibliotheken |
|
||||
| `bin/` | Hilfs-Skripte (setenv.bat, start_briscad.bat, on_start.lsp) |
|
||||
| `bin/` | Hilfs-Skripte (setenv.bat, start_briscad.bat) |
|
||||
| `cfg/` | Konfigurationsdateien |
|
||||
| `data/` | JSON-Daten, DXF-Quellen, Block-Libraries |
|
||||
| `data/ils/` | DWG-Bloecke fuer ILS-Kreisel/Eckrad (AN8, SP8, AP-Typen) |
|
||||
@@ -33,20 +33,33 @@ AutoLISP-Makros (SSG_LIB) fuer BricsCAD Pro zur automatisierten Erstellung von F
|
||||
|
||||
## Lademechanismus (Lazy Loading via MNL)
|
||||
|
||||
Das Laden der LISP-Module erfolgt **nicht** ueber Startup-Skripte, sondern ueber das Menuesystem:
|
||||
Das Laden der LISP-Module erfolgt ueber das Menuesystem. Voraussetzung ist, dass das
|
||||
Menue einmalig in BricsCAD geladen wurde (siehe unten: "Menue einrichten").
|
||||
|
||||
1. Die Menuedatei `SSG_LIB.mnu` wird beim BricsCAD-Start als CUI geladen (einmalig via `_MENULOAD`)
|
||||
2. BricsCAD laedt automatisch `SSG_LIB.mnl` (gleichnamige MNL-Datei) mit dem Menue
|
||||
3. Die MNL definiert `ssg-ensure` (Lazy-Loader) und setzt `DBLCLKEDIT=0`
|
||||
4. Beim ersten Menueklick laedt `ssg-ensure` automatisch die benoetigten Module:
|
||||
- Zuerst die **Kern-Module**: `ssg_core` → `ssg_dbg` → `ssg_dialog` → `ssg_layer`
|
||||
- Dann das angeforderte **Feature-Modul** (z.B. `KreiselInsert`, `OmniModulInsert`)
|
||||
5. Bereits geladene Module werden uebersprungen (Flag-Variable `*ssg-<modul>-loaded*`)
|
||||
1. BricsCAD laedt beim Start automatisch `SSG_LIB.mnl` (gleichnamige MNL-Datei zum Menue)
|
||||
2. Die MNL laedt alle Kern- und Feature-Module direkt per `ssg-ensure`
|
||||
3. `ssg-ensure` ueberspringt bereits geladene Module (Flag `*ssg-<modul>-loaded*`)
|
||||
|
||||
### Menue einrichten (einmalig pro BricsCAD-Installation)
|
||||
|
||||
1. `bin/setenv.bat` ausfuehren (setzt `DXFM_LISP`, `DXFMAKRO` u.a.)
|
||||
2. BricsCAD starten
|
||||
3. In der BricsCAD-Kommandozeile: `_MENULOAD` eingeben
|
||||
4. Im Dialog: `menu/SSG_LIB.mnu` auswaehlen und laden
|
||||
5. BricsCAD laedt automatisch `SSG_LIB.mnl` mit – alle Module werden initialisiert
|
||||
|
||||
Alternativ per LISP-Kommandozeile in BricsCAD:
|
||||
```lisp
|
||||
(command "_.MENULOAD" "C:/10-Develop/gitrepos/dxfmakros/menu/SSG_LIB.mnu")
|
||||
```
|
||||
|
||||
Das Menue bleibt dauerhaft registriert. Nach einem Update der `.mnu`-Datei
|
||||
genuegt es, BricsCAD neu zu starten oder `_MENULOAD` erneut aufzurufen.
|
||||
|
||||
### Voraussetzung
|
||||
|
||||
Umgebungsvariable `DXFM_LISP` muss gesetzt sein (via `bin/setenv.bat`).
|
||||
Die `start_briscad.bat` ruft `setenv.bat` auf und startet BricsCAD ohne `/s` oder `/p`.
|
||||
Die `start_briscad.bat` ruft `setenv.bat` auf und startet BricsCAD.
|
||||
|
||||
### Modulzuordnung im Menue
|
||||
|
||||
@@ -58,14 +71,14 @@ Die `start_briscad.bat` ruft `setenv.bat` auf und startet BricsCAD ohne `/s` ode
|
||||
| Gefaellestrecke | `Gefaellestrecke` | GEFAELLESTRECKE |
|
||||
| Omniflo (komplett) | `OmniModulInsert` | OMNI_APB_*, OMNI_W*_*, OMNI_AP*, OMNI_TEF_*, OMNI_TV_*, OMNI_EDIT |
|
||||
| Export | `export` | EXPORTSIVAS, EXPORTCSV, CALLPYTHON |
|
||||
| Konfiguration | `SSG_LIB_Commands` | SSG_DIM_SWITCH, SSG_SPRACHE |
|
||||
| Doppelklick/Kontextmenue | `SSG_LIB_Commands` | SSG_BLOCKEDIT |
|
||||
|
||||
### Legacy-Dateien (nicht mehr verwendet)
|
||||
### Entfernte Legacy-Dateien
|
||||
|
||||
- `bin/startup.scr` - Entfernt (war fuer `/s` Parameter)
|
||||
- `bin/acaddoc.lsp` - Entfernt (war fuer ACAD-Pfad-basiertes Laden)
|
||||
- `bin/on_start.lsp` - Nicht mehr fuer Lazy-Loading noetig, kann fuer manuelles Laden aller Module verwendet werden
|
||||
- `Lisp/ssg_load.lsp` - Laedt alle Module auf einmal (Alternative zum Lazy-Loading)
|
||||
- `bin/on_start.lsp` - Entfernt; Menue wird jetzt manuell per `_MENULOAD` eingerichtet
|
||||
|
||||
Detaillierte Dokumentation aller Funktionen und Befehle: siehe `Lisp/README.md`.
|
||||
|
||||
@@ -74,15 +87,16 @@ Detaillierte Dokumentation aller Funktionen und Befehle: siehe `Lisp/README.md`.
|
||||
| Datei | Befehle | Beschreibung |
|
||||
|---|---|---|
|
||||
| `ssg_core.lsp` | - | Kernel: ssg-start/ssg-end, ssg-cfg-or, ssg-attrib-read/write, Layer/Block-Ops |
|
||||
| `ssg_lang.lsp` | - | Sprachumschaltung Deutsch/Englisch (ssg-text, ssg-textf, *ssg-lang*) |
|
||||
| `ssg_dbg.lsp` | - | Debug-Logging (dbgopen, dbgmsg, dbgflush, dbgclose) |
|
||||
| `ssg_dialog.lsp` | - | DCL-Dialog-Vorlagen und Hilfsfunktionen |
|
||||
| `ssg_layer.lsp` | - | Layer-Verwaltung |
|
||||
| `KreiselInsert.lsp` | KreiselInsert, KreiselConnect, KreiselRedraw, KreiselQuick, KreiselEdit, KreiselParams, KreiselLabelSetup, KreiselLabelPos, KreiselLabelHoehe, ILS_Eckrad | ILS Kreisel und Eckrad komplett in AutoLISP |
|
||||
| `VarioFoerderer.lsp` | FOERDERANLAGE | Vario-Foerderanlagen Generator |
|
||||
| `Gefaellestrecke.lsp` | GEFAELLESTRECKE | Gefaelle-Foerderanlage (AUS -> Staustrecke skaliert -> Separator -> EIN) |
|
||||
| `export.lsp` | EXPORTSIVAS, EXPORTCSV, OMNI_EXPORT, OMNI_UPDATE_ATTRIBS | JSON-Sammlung und Export (Python-Aufruf oder LISP-nativ) |
|
||||
| `export.lsp` | EXPORTSIVAS, EXPORTCSV, OMNI_UPDATE_ATTRIBS | JSON-Sammlung und Python-Export (Omniflo-Merkmale/Sum-Zeile via lib/export_csv.py) |
|
||||
| `OmniModulInsert.lsp` | OMNI_LOAD, OMNI_APB_*, OMNI_W*_*, OMNI_AP60/AP110, OMNI_TEF_*, OMNI_TV_*, OMNI_APBW_*, OMNI_EDIT | Omniflo-Komponenten: Boegen, Weichen, Verbinder, Transferwagen, Edit-Dialog |
|
||||
| `SSG_LIB_Commands.lsp` | ILS_BTMT_*, ILS_ETF_*, ILS_K*_*, ILS_GK*_*, SSG_BLOCKEDIT | Dummy-Befehle fuer Menue + Doppelklick/Kontextmenue-Dispatcher |
|
||||
| `SSG_LIB_Commands.lsp` | ILS_BTMT_*, ILS_ETF_*, ILS_K*_*, ILS_GK*_*, SSG_BLOCKEDIT, SSG_DIM_SWITCH, SSG_SPRACHE | Dummy-Befehle fuer Menue + Doppelklick/Kontextmenue-Dispatcher + Konfiguration (2D/3D, Sprache) |
|
||||
| `menu-inventory.lsp` | MenuInventory | BricsCAD Diagnostik (Menuegruppen, Plugins, Startdateien) |
|
||||
|
||||
## DCL-Dialoge
|
||||
@@ -92,13 +106,14 @@ Detaillierte Dokumentation aller Funktionen und Befehle: siehe `Lisp/README.md`.
|
||||
| `kreisel_edit.dcl` | KreiselEdit (KreiselInsert.lsp) |
|
||||
| `omniflo_boegen.dcl` | OMNI_APB_* (OmniModulInsert.lsp) |
|
||||
| `omniflo_weichen.dcl` | OMNI_W*_* (OmniModulInsert.lsp) |
|
||||
| `sprache.dcl` | SSG_SPRACHE (SSG_LIB_Commands.lsp) |
|
||||
|
||||
## Menue (SSG_LIB.mnu + SSG_LIB.mnl)
|
||||
|
||||
- `SSG_LIB.mnu` - Menuedefinition mit Lazy-Loading (`(ssg-ensure "Modul") Befehl`)
|
||||
- `SSG_LIB.mnl` - Automatisch geladen mit dem Menue, definiert `ssg-ensure` Loader
|
||||
- `***MENUGROUP=SSG_LIB` - Menuegruppenname
|
||||
- `***POP1` - Hauptmenue (ILS, Omniflo, Export)
|
||||
- `***POP1` - Hauptmenue (ILS, Omniflo, Export, Konfiguration)
|
||||
- `***DOUBLECLICK` - Doppelklick auf INSERT-Bloecke ruft SSG_BLOCKEDIT auf
|
||||
- `***POP501` - Rechtsklick-Kontextmenue (KreiselEdit, OMNI_EDIT, SSG_BLOCKEDIT)
|
||||
|
||||
@@ -112,6 +127,7 @@ Werden via `bin/setenv.bat` gesetzt. Wichtigste:
|
||||
- `DXFM_LOG` - Log-Verzeichnis
|
||||
- `DXFM_DCL` - Pfad zu DCL-Dialogdateien
|
||||
- `DXFM_CFG` - Konfigurationsverzeichnis
|
||||
- `DXFM_LANG` - Aktive Sprache (`de_DE`/`en_GB`), persistiert von `SSG_SPRACHE`; Default `de_DE`
|
||||
|
||||
## Konventionen
|
||||
|
||||
|
||||
+17
-1108
File diff suppressed because it is too large
Load Diff
+1749
-143
File diff suppressed because it is too large
Load Diff
+156
-128
@@ -16,19 +16,53 @@
|
||||
(setq #Eckrad_LetzteNr 0)
|
||||
)
|
||||
|
||||
;; Block-Pfad
|
||||
(setq block-pfad (getenv "DXFM_BLOCKS"))
|
||||
|
||||
(if (or (null block-pfad) (= block-pfad ""))
|
||||
(progn
|
||||
(setq block-pfad "C:/Users/y.wang/Documents/dxfmakros/Blocks/")
|
||||
(alert (strcat "Umgebungsvariable DXFM_BLOCKS nicht gefunden.\nNutze Standardpfad: " block-pfad))
|
||||
;; DXFM_DIM sicher lesen (type-Guard gegen nicht-String Rueckgabewerte)
|
||||
(setq *ki-dxfm-dim* (getenv "DXFM_DIM"))
|
||||
(if (not (= (type *ki-dxfm-dim*) 'STR)) (setq *ki-dxfm-dim* "3D"))
|
||||
;; Modul-eigener Block-Pfad (nicht in globalem block-pfad speichern,
|
||||
;; da GF/VF stets 3D-Pfad benoetigen, KI aber DXFM_DIM-abhaengig)
|
||||
(setq *block-path*
|
||||
(cond
|
||||
((and (getenv "DXFMAKRO") (= (type (getenv "DXFMAKRO")) 'STR))
|
||||
(strcat (vl-string-right-trim "/" (vl-string-translate "\\" "/" (getenv "DXFMAKRO")))
|
||||
"/data/ils/" *ki-dxfm-dim* "/"))
|
||||
((and (boundp '*ssg-lisp-pfad*) (= (type *ssg-lisp-pfad*) 'STR)
|
||||
(vl-string-search "/Lisp" *ssg-lisp-pfad*))
|
||||
(strcat (substr *ssg-lisp-pfad* 1 (vl-string-search "/Lisp" *ssg-lisp-pfad*))
|
||||
"/data/ils/" *ki-dxfm-dim* "/"))
|
||||
(t
|
||||
(princ (ssg-text "kreisel-warn-blockpfad"))
|
||||
nil)
|
||||
)
|
||||
(setq block-pfad (strcat (vl-string-right-trim "/" (vl-string-translate "\\" "/" block-pfad)) "/"))
|
||||
)
|
||||
|
||||
(setq *block-path* block-pfad)
|
||||
(princ (strcat "\nBlock-Pfad aktiv: " block-pfad))
|
||||
;; ssg_core laden falls noch nicht geschehen (Schutz bei direktem Laden ohne ssg-ensure)
|
||||
(if (null (car (atoms-family 1 '("SSG-CFG-OR"))))
|
||||
(progn
|
||||
(setq *ssg-core-datei*
|
||||
(cond
|
||||
((getenv "DXFM_LISP")
|
||||
(strcat (vl-string-translate "\\" "/" (getenv "DXFM_LISP")) "/ssg_core.lsp"))
|
||||
((findfile "ssg_core.lsp")
|
||||
(findfile "ssg_core.lsp"))
|
||||
(t nil)
|
||||
)
|
||||
)
|
||||
(if *ssg-core-datei*
|
||||
(progn
|
||||
(load *ssg-core-datei*)
|
||||
(if (car (atoms-family 1 '("SSG-LOAD-CONFIG"))) (ssg-load-config))
|
||||
(princ (strcat "\n[KreiselInsert] ssg_core geladen: " *ssg-core-datei*))
|
||||
)
|
||||
(progn
|
||||
(defun ssg-cfg-or (sektion schluessel standard) standard)
|
||||
(defun ssg-cfg (sektion schluessel) nil)
|
||||
(defun ssg-load-config () nil)
|
||||
(princ (ssg-text "kreisel-warn-core-fehlt"))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;; Kreisel-Geometrie-Konstanten (aus Config oder Fallback)
|
||||
(setq *kreisel-durchmesser* (ssg-cfg-or "kreisel" "durchmesser" 800.0))
|
||||
@@ -88,7 +122,7 @@
|
||||
(progn
|
||||
;; Neuen Textstil mit Arial erstellen
|
||||
(command "_.STYLE" style-name "Arial" 0 1 0 "N" "N" "N")
|
||||
(princ (strcat "\n-> Textstil '" style-name "' mit Arial erstellt"))
|
||||
(princ (ssg-textf "kreisel-textstil-erstellt" (list style-name)))
|
||||
)
|
||||
)
|
||||
|
||||
@@ -188,7 +222,7 @@
|
||||
(cons 11 insertPoint) ;; Ausrichtungspunkt
|
||||
))
|
||||
|
||||
(princ (strcat "\n-> Beschriftung: " textStr " (Höhe=" (rtos textHoehe 2 0) "mm, Arial, zentriert)"))
|
||||
(princ (ssg-textf "kreisel-beschriftung-erzeugt" (list textStr (rtos textHoehe 2 0))))
|
||||
textStr
|
||||
)
|
||||
|
||||
@@ -196,9 +230,9 @@
|
||||
|
||||
;; Kreiselart abfragen. Rueckgabe: "PIN" oder "STANDARD"
|
||||
(defun kreisel-ask-typ ( / typNum typ)
|
||||
(princ "\n[1] STANDARD (ohne PIN)")
|
||||
(princ "\n[2] PIN")
|
||||
(princ (strcat "\nBitte waehlen <" (if (= #Kreisel_Typ "PIN") "2" "1") ">: "))
|
||||
(princ (ssg-text "kreisel-typ-opt-standard"))
|
||||
(princ (ssg-text "kreisel-typ-opt-pin"))
|
||||
(princ (ssg-textf "kreisel-typ-prompt" (list (if (= #Kreisel_Typ "PIN") "2" "1"))))
|
||||
(setq typNum (getstring ""))
|
||||
(cond
|
||||
((= typNum "2") (setq typ "PIN"))
|
||||
@@ -303,7 +337,7 @@
|
||||
(progn
|
||||
(setq z-hoehe (caddr basePoint))
|
||||
(setq block-hoehe (rtos z-hoehe 2 0))
|
||||
(princ (strcat "\n-> Höhe aus Basispunkt übernommen: " block-hoehe))
|
||||
(princ (ssg-textf "kreisel-hoehe-aus-basispunkt" (list block-hoehe)))
|
||||
)
|
||||
(progn
|
||||
;; Höhe aus Attributen lesen
|
||||
@@ -367,10 +401,10 @@
|
||||
)
|
||||
|
||||
;; AN8 Kreis (Antriebsstation) bei (radius, 0)
|
||||
(command "_.INSERT" (strcat block-pfad "AN8.dwg") (list radius 0.0 0.0) 1 1 0)
|
||||
(command "_.INSERT" (strcat *block-path* "AN8.dwg") (list radius 0.0 0.0) 1 1 0)
|
||||
|
||||
;; SP8 Kreis (Spannstation) bei (radius+abstand, 0)
|
||||
(command "_.INSERT" (strcat block-pfad "SP8.dwg") (list (+ radius abstand) 0.0 0.0) 1 1 0)
|
||||
(command "_.INSERT" (strcat *block-path* "SP8.dwg") (list (+ radius abstand) 0.0 0.0) 1 1 0)
|
||||
|
||||
;; Tangenten auf Layer S_LP
|
||||
(ssg-make-layer "S_LP" "7" T)
|
||||
@@ -420,12 +454,12 @@
|
||||
;; --- Block erzeugen (Entities werden aus Zeichnung entfernt) ---
|
||||
(if (> (sslength ss) 0)
|
||||
(command "_.-BLOCK" bname (list 0.0 0.0 0.0) ss "")
|
||||
(princ "\nFehler: Keine Entities zum Block erstellen!")
|
||||
(princ (ssg-text "kreisel-fehler-keine-entities"))
|
||||
)
|
||||
|
||||
(princ (strcat "\n-> Neue Blockdefinition: " bname))
|
||||
|
||||
(princ (ssg-textf "kreisel-neue-blockdef" (list bname)))
|
||||
)
|
||||
(princ (strcat "\n-> Verwende bestehende Blockdefinition: " bname))
|
||||
(princ (ssg-textf "kreisel-bestehende-blockdef" (list bname)))
|
||||
)
|
||||
|
||||
;; --- Block am Zielpunkt einfuegen (ohne Attribut-Dialog) ---
|
||||
@@ -461,8 +495,7 @@
|
||||
(if (atoms-family 1 '("ssg-id-generate"))
|
||||
(ssg-id-generate block-ent)
|
||||
)
|
||||
(princ (strcat "\n-> Kreisel #" (itoa kreisel-nummer) " eingefügt: " bname
|
||||
" (Höhe=" block-hoehe ")"))
|
||||
(princ (ssg-textf "kreisel-eingefuegt" (list (itoa kreisel-nummer) bname block-hoehe)))
|
||||
(entlast)
|
||||
)
|
||||
|
||||
@@ -480,19 +513,19 @@
|
||||
;; --------------------------------------------
|
||||
(defun c:KreiselInsert ( / pt abstand typ rotation rotStr hoehe
|
||||
selectedEnt blockAttribs oldOsmode)
|
||||
(ssg-start "Kreisel Modul einfuegen" '(("OSMODE") ("CECOLOR")))
|
||||
(ssg-start (ssg-text "kreisel-start-insert") '(("OSMODE") ("CECOLOR")))
|
||||
|
||||
;; Temporär Osnap für Blockerkennung setzen
|
||||
(setq oldOsmode (getvar "OSMODE"))
|
||||
(setvar "OSMODE" (logior oldOsmode 512)) ;; 512 = INS (Block-Einfügepunkt)
|
||||
|
||||
;; 1. Einfuegepunkt
|
||||
(setq pt (getpoint "\nBasispunkt (AN-Seite): "))
|
||||
(if (null pt)
|
||||
(progn
|
||||
(setq pt (getpoint (ssg-text "kreisel-prompt-basispunkt")))
|
||||
(if (null pt)
|
||||
(progn
|
||||
(setvar "OSMODE" oldOsmode)
|
||||
(ssg-end)
|
||||
(princ "\nBefehl abgebrochen.")
|
||||
(ssg-end)
|
||||
(princ (ssg-text "kreisel-abbruch-befehl"))
|
||||
(princ)
|
||||
(return)
|
||||
)
|
||||
@@ -512,41 +545,39 @@
|
||||
(setq blockAttribs (ssg-attrib-read selectedEnt))
|
||||
(assoc "HOEHE" blockAttribs))
|
||||
(setq hoehe (atof (cdr (assoc "HOEHE" blockAttribs))))
|
||||
(princ (strcat "\n-> Höhe von bestehendem Kreisel übernommen: " (rtos hoehe 2 0)))
|
||||
(princ (ssg-textf "kreisel-hoehe-von-bestehendem" (list (rtos hoehe 2 0))))
|
||||
)
|
||||
;; Fall 2: Punkt hat Z-Koordinate > 0
|
||||
((and (> (length pt) 2) (> (caddr pt) 0))
|
||||
(setq hoehe (caddr pt))
|
||||
(princ (strcat "\n-> Höhe aus 3D-Punkt übernommen: " (rtos hoehe 2 0)))
|
||||
(princ (ssg-textf "kreisel-hoehe-aus-3dpunkt" (list (rtos hoehe 2 0))))
|
||||
)
|
||||
;; Fall 3: Sonst separat abfragen
|
||||
(t
|
||||
(setq hoehe (getreal (strcat "\nHöhe (Z-Koordinate) <" (rtos *kreisel-default-hoehe* 2 0) ">: ")))
|
||||
(setq hoehe (getreal (ssg-textf "kreisel-prompt-hoehe-z" (list (rtos *kreisel-default-hoehe* 2 0)))))
|
||||
(if (null hoehe) (setq hoehe *kreisel-default-hoehe*))
|
||||
)
|
||||
)
|
||||
|
||||
;; 3. Abstand
|
||||
(initget 6)
|
||||
(setq abstand (getdist (list (car pt) (cadr pt))
|
||||
(strcat "\nAbstand (Tangentenlaenge) <"
|
||||
(rtos *kreisel-default-laenge* 2 0) ">: ")))
|
||||
(setq abstand (getdist (list (car pt) (cadr pt))
|
||||
(ssg-textf "kreisel-prompt-abstand" (list (rtos *kreisel-default-laenge* 2 0)))))
|
||||
(if (null abstand) (setq abstand *kreisel-default-laenge*))
|
||||
(princ (strcat "\n-> Abstand: " (rtos abstand 2 0) " mm"))
|
||||
|
||||
(princ (ssg-textf "kreisel-abstand-ausgabe" (list (rtos abstand 2 0))))
|
||||
|
||||
;; 4. Rotation
|
||||
(setq rotStr (getstring "\nRotation in Grad <0>: "))
|
||||
(setq rotStr (getstring (ssg-text "kreisel-prompt-rotation")))
|
||||
(if (= rotStr "")
|
||||
(setq rotation 0.0)
|
||||
(setq rotation (atof rotStr))
|
||||
)
|
||||
|
||||
|
||||
;; 5. Kreiselart
|
||||
(setq typ (kreisel-ask-typ))
|
||||
|
||||
(princ (strcat "\n-> Rotation: " (rtos rotation 2 1)
|
||||
" Höhe: " (rtos hoehe 2 0)
|
||||
" Kreiselart: " typ))
|
||||
(princ (ssg-textf "kreisel-insert-zusammenfassung"
|
||||
(list (rtos rotation 2 1) (rtos hoehe 2 0) typ)))
|
||||
|
||||
;; 6. Modul einfuegen
|
||||
(draw-module (list (car pt) (cadr pt) hoehe) abstand rotation
|
||||
@@ -556,7 +587,7 @@
|
||||
;; KEIN weiteres (setvar "OSMODE" ...) mehr nötig!
|
||||
;; ssg-end stellt nur CLAYER und CMDECHO wieder her, nicht OSMODE
|
||||
|
||||
(princ "\nKreisel Modul eingefuegt.")
|
||||
(princ (ssg-text "kreisel-insert-fertig"))
|
||||
(ssg-end)
|
||||
)
|
||||
|
||||
@@ -573,20 +604,20 @@
|
||||
;; -----------------------------------------------
|
||||
(defun c:KreiselConnect ( / ptStart ptEnd dx dy dist abstand rotation typ hoehe)
|
||||
|
||||
(ssg-start "Kreisel Smart Connect" '(("OSMODE") ("CECOLOR")))
|
||||
(ssg-start (ssg-text "kreisel-start-connect") '(("OSMODE") ("CECOLOR")))
|
||||
|
||||
(princ "\n--- Kreisel durch Linie definieren (AN -> SP) ---")
|
||||
(princ (ssg-text "kreisel-connect-header"))
|
||||
|
||||
;; 1. Startpunkt (aeusserster Punkt AN-Seite)
|
||||
(setq ptStart (getpoint "\nStartpunkt (AN-Seite aussen): "))
|
||||
(setq ptStart (getpoint (ssg-text "kreisel-prompt-startpunkt")))
|
||||
(if (null ptStart)
|
||||
(progn (ssg-end) (princ "\nAbgebrochen.") (princ) (exit))
|
||||
(progn (ssg-end) (princ (ssg-text "kreisel-abgebrochen")) (princ) (exit))
|
||||
)
|
||||
|
||||
;; 2. Endpunkt (aeusserster Punkt SP-Seite) mit Gummiband
|
||||
(setq ptEnd (getpoint ptStart "\nEndpunkt (SP-Seite aussen): "))
|
||||
(setq ptEnd (getpoint ptStart (ssg-text "kreisel-prompt-endpunkt")))
|
||||
(if (null ptEnd)
|
||||
(progn (ssg-end) (princ "\nAbgebrochen.") (princ) (exit))
|
||||
(progn (ssg-end) (princ (ssg-text "kreisel-abgebrochen")) (princ) (exit))
|
||||
)
|
||||
|
||||
;; 3. Geometrie berechnen
|
||||
@@ -597,8 +628,8 @@
|
||||
|
||||
(if (<= abstand 0.0)
|
||||
(progn
|
||||
(ssg-emsg (strcat "Distanz zu klein! ("
|
||||
(rtos dist 2 0) " < " (rtos *kreisel-durchmesser* 2 0) ")"))
|
||||
(ssg-emsg (ssg-textf "kreisel-emsg-distanz-klein"
|
||||
(list (rtos dist 2 0) (rtos *kreisel-durchmesser* 2 0))))
|
||||
(ssg-end)
|
||||
(exit)
|
||||
)
|
||||
@@ -614,26 +645,24 @@
|
||||
)
|
||||
(if (<= hoehe 0.0)
|
||||
(progn
|
||||
(setq hoehe (getreal (strcat "\nHoehe (Z-Koordinate) <" (rtos *kreisel-default-hoehe* 2 0) ">: ")))
|
||||
(setq hoehe (getreal (ssg-textf "kreisel-prompt-hoehe-z" (list (rtos *kreisel-default-hoehe* 2 0)))))
|
||||
(if (null hoehe) (setq hoehe *kreisel-default-hoehe*))
|
||||
)
|
||||
(princ (strcat "\n-> Hoehe aus Startpunkt uebernommen: " (rtos hoehe 2 0)))
|
||||
(princ (ssg-textf "kreisel-hoehe-aus-startpunkt" (list (rtos hoehe 2 0))))
|
||||
)
|
||||
|
||||
;; 6. Kreiselart abfragen
|
||||
(setq typ (kreisel-ask-typ))
|
||||
|
||||
(princ (strcat "\n-> Abstand: " (rtos abstand 2 0) " mm"
|
||||
" Rotation: " (rtos rotation 2 1) " Grad"
|
||||
" Hoehe: " (rtos hoehe 2 0)
|
||||
" Kreiselart: " typ))
|
||||
(princ (ssg-textf "kreisel-connect-zusammenfassung"
|
||||
(list (rtos abstand 2 0) (rtos rotation 2 1) (rtos hoehe 2 0) typ)))
|
||||
|
||||
;; 7. Modul einfuegen
|
||||
(draw-module (list (car ptStart) (cadr ptStart) hoehe) abstand rotation
|
||||
(list (cons "KREISELART" typ)
|
||||
(cons "HOEHE" (rtos hoehe 2 0))))
|
||||
|
||||
(princ "\nKreisel Connect erfolgreich!")
|
||||
(princ (ssg-text "kreisel-connect-erfolgreich"))
|
||||
(ssg-end)
|
||||
)
|
||||
|
||||
@@ -650,7 +679,7 @@
|
||||
;; hoehe : Hoehe in mm (oder nil fuer Z aus pt)
|
||||
;; Rueckgabe: Entity-Name des erzeugten Blocks oder nil
|
||||
(defun kreisel-insert-script (pt abstand rotation typ hoehe / z blockEnt)
|
||||
(ssg-start "Kreisel Script Insert" '(("OSMODE") ("CECOLOR")))
|
||||
(ssg-start (ssg-text "kreisel-start-script-insert") '(("OSMODE") ("CECOLOR")))
|
||||
(if (null typ) (setq typ "STANDARD"))
|
||||
(setq z (if hoehe hoehe
|
||||
(if (and pt (caddr pt)) (caddr pt) *kreisel-default-hoehe*)))
|
||||
@@ -669,14 +698,14 @@
|
||||
;; hoehe : Hoehe in mm (oder nil fuer Z aus ptStart)
|
||||
;; Rueckgabe: Entity-Name des erzeugten Blocks oder nil
|
||||
(defun kreisel-connect-script (ptStart ptEnd typ hoehe / dx dy dist abstand rotation z blockEnt)
|
||||
(ssg-start "Kreisel Script Connect" '(("OSMODE") ("CECOLOR")))
|
||||
(ssg-start (ssg-text "kreisel-start-script-connect") '(("OSMODE") ("CECOLOR")))
|
||||
(if (null typ) (setq typ "STANDARD"))
|
||||
(setq dx (- (car ptEnd) (car ptStart))
|
||||
dy (- (cadr ptEnd) (cadr ptStart)))
|
||||
(setq dist (sqrt (+ (* dx dx) (* dy dy))))
|
||||
(setq abstand (- dist *kreisel-durchmesser*))
|
||||
(if (<= abstand 0.0)
|
||||
(progn (princ (strcat "\n[Connect] Distanz zu klein: " (rtos dist 2 0)))
|
||||
(progn (princ (ssg-textf "kreisel-script-distanz-klein" (list (rtos dist 2 0))))
|
||||
(ssg-end) nil)
|
||||
(progn
|
||||
(setq rotation (* (/ 180.0 pi) (atan dy dx)))
|
||||
@@ -693,19 +722,19 @@
|
||||
|
||||
;; Neue Befehle für Beschriftungs-Einstellungen
|
||||
(defun c:KreiselLabelPos ( / dx dy)
|
||||
(setq dx (getreal (strcat "\nX-Abstand von AN8-Mitte <" (rtos *kreisel-beschriftung-abstand-x* 2 0) ">: ")))
|
||||
(setq dx (getreal (ssg-textf "kreisel-prompt-x-abstand" (list (rtos *kreisel-beschriftung-abstand-x* 2 0)))))
|
||||
(if dx (setq *kreisel-beschriftung-abstand-x* dx))
|
||||
(setq dy (getreal (strcat "\nY-Abstand von AN8-Mitte <" (rtos *kreisel-beschriftung-abstand-y* 2 0) ">: ")))
|
||||
(setq dy (getreal (ssg-textf "kreisel-prompt-y-abstand" (list (rtos *kreisel-beschriftung-abstand-y* 2 0)))))
|
||||
(if dy (setq *kreisel-beschriftung-abstand-y* dy))
|
||||
(princ (strcat "\nNeue Beschriftungsposition: X=" (rtos *kreisel-beschriftung-abstand-x* 2 0)
|
||||
" Y=" (rtos *kreisel-beschriftung-abstand-y* 2 0)))
|
||||
(princ (ssg-textf "kreisel-neue-beschriftungsposition"
|
||||
(list (rtos *kreisel-beschriftung-abstand-x* 2 0) (rtos *kreisel-beschriftung-abstand-y* 2 0))))
|
||||
(princ)
|
||||
)
|
||||
|
||||
(defun c:KreiselLabelHoehe ( / h)
|
||||
(setq h (getreal (strcat "\nTexthöhe <" (rtos *kreisel-beschriftung-hoehe* 2 0) ">: ")))
|
||||
(setq h (getreal (ssg-textf "kreisel-prompt-texthoehe" (list (rtos *kreisel-beschriftung-hoehe* 2 0)))))
|
||||
(if h (setq *kreisel-beschriftung-hoehe* h))
|
||||
(princ (strcat "\nNeue Texthöhe: " (rtos *kreisel-beschriftung-hoehe* 2 0)))
|
||||
(princ (ssg-textf "kreisel-neue-texthoehe" (list (rtos *kreisel-beschriftung-hoehe* 2 0))))
|
||||
(princ)
|
||||
)
|
||||
|
||||
@@ -719,17 +748,17 @@
|
||||
;; -----------------------------------------------
|
||||
(defun c:KreiselRedraw ( / sel ent ed attribs basePoint rotation newAbstand)
|
||||
|
||||
(ssg-start "Kreisel Neu Zeichnen" '(("CECOLOR")))
|
||||
(ssg-start (ssg-text "kreisel-start-redraw") '(("CECOLOR")))
|
||||
|
||||
;; 1. Bestehenden Kreisel-Block auswaehlen
|
||||
(setq sel (entsel "\nKreisel-Block auswaehlen: "))
|
||||
(setq sel (entsel (ssg-text "kreisel-prompt-block-auswaehlen")))
|
||||
(if (null sel) (exit))
|
||||
(setq ent (car sel))
|
||||
(setq ed (entget ent))
|
||||
|
||||
;; Pruefen ob INSERT
|
||||
(if (/= (cdr (assoc 0 ed)) "INSERT")
|
||||
(progn (ssg-emsg "Kein Block ausgewaehlt!") (exit))
|
||||
(progn (ssg-emsg (ssg-text "kreisel-emsg-kein-block")) (exit))
|
||||
)
|
||||
|
||||
;; 2. Bestehende Werte auslesen
|
||||
@@ -738,19 +767,20 @@
|
||||
(setq rotation (* (/ 180.0 pi) (cdr (assoc 50 ed))))
|
||||
|
||||
;; NEU - Höhe aus Attributen lesen und anzeigen:
|
||||
(princ (strcat "\n-> Bestehend: Abstand=" (cdr (assoc "ABSTAND" attribs))
|
||||
" Drehung=" (cdr (assoc "DREHUNG" attribs))
|
||||
" Höhe=" (cdr (assoc "HOEHE" attribs)) ;; <-- NEU
|
||||
" Art=" (cdr (assoc "KREISELART" attribs))))
|
||||
(princ (ssg-textf "kreisel-redraw-bestehend"
|
||||
(list (cdr (assoc "ABSTAND" attribs))
|
||||
(cdr (assoc "DREHUNG" attribs))
|
||||
(cdr (assoc "HOEHE" attribs))
|
||||
(cdr (assoc "KREISELART" attribs)))))
|
||||
|
||||
;; 3. Neuen Abstand abfragen (Enter = beibehalten)
|
||||
(initget 6)
|
||||
(setq newAbstand (getdist (strcat "\nNeuer Abstand <" (cdr (assoc "ABSTAND" attribs)) ">: ")))
|
||||
(setq newAbstand (getdist (ssg-textf "kreisel-prompt-neuer-abstand" (list (cdr (assoc "ABSTAND" attribs))))))
|
||||
(if (null newAbstand)
|
||||
(setq newAbstand (atof (cdr (assoc "ABSTAND" attribs))))
|
||||
)
|
||||
;; NEU - Neue Höhe abfragen:
|
||||
(setq newHoehe (getreal (strcat "\nNeue Höhe <" (cdr (assoc "HOEHE" attribs)) ">: ")))
|
||||
(setq newHoehe (getreal (ssg-textf "kreisel-prompt-neue-hoehe" (list (cdr (assoc "HOEHE" attribs))))))
|
||||
(if (null newHoehe)
|
||||
(setq newHoehe (atof (cdr (assoc "HOEHE" attribs))))
|
||||
)
|
||||
@@ -761,7 +791,7 @@
|
||||
(draw-module (list (car basePoint) (cadr basePoint) newHoehe)
|
||||
newAbstand rotation attribs)
|
||||
|
||||
(princ (strcat "\nKreisel neu gezeichnet. Abstand=" (rtos newAbstand 2 0)))
|
||||
(princ (ssg-textf "kreisel-redraw-fertig" (list (rtos newAbstand 2 0))))
|
||||
(ssg-end)
|
||||
)
|
||||
|
||||
@@ -770,17 +800,17 @@
|
||||
;; KreiselQuick: Schnell mit Defaults (horizontal)
|
||||
;; --------------------------------------------
|
||||
(defun c:KreiselQuick ( / pt)
|
||||
(ssg-start "Kreisel Schnell Einfuegen" '(("CECOLOR")))
|
||||
(setq pt (getpoint "\nBasispunkt (AN-Seite): "))
|
||||
(ssg-start (ssg-text "kreisel-start-quick") '(("CECOLOR")))
|
||||
(setq pt (getpoint (ssg-text "kreisel-prompt-basispunkt")))
|
||||
;; NEU - Höhe abfragen:
|
||||
(setq hoehe (getreal (strcat "\nHöhe (Z-Koordinate) <0>: ")))
|
||||
(setq hoehe (getreal (ssg-textf "kreisel-prompt-hoehe-z" (list "0"))))
|
||||
(if (null hoehe) (setq hoehe 0.0))
|
||||
(if pt
|
||||
;; NEU - Höhe im Aufruf übergeben:
|
||||
(draw-module (list (car pt) (cadr pt) hoehe) *kreisel-default-laenge* 0.0
|
||||
(draw-module (list (car pt) (cadr pt) hoehe) *kreisel-default-laenge* 0.0
|
||||
(list (cons "HOEHE" (rtos hoehe 2 0))))
|
||||
)
|
||||
(princ "\nSchnell Einfuegen fertig.")
|
||||
(princ (ssg-text "kreisel-quick-fertig"))
|
||||
(ssg-end)
|
||||
)
|
||||
|
||||
@@ -836,13 +866,13 @@
|
||||
(setq ent (ssname ss 0))
|
||||
)
|
||||
|
||||
(ssg-start "Kreisel bearbeiten" '(("OSMODE") ("CECOLOR") ("ATTREQ") ("ATTDIA")))
|
||||
(ssg-start (ssg-text "kreisel-start-edit") '(("OSMODE") ("CECOLOR") ("ATTREQ") ("ATTDIA")))
|
||||
(setvar "OSMODE" 0)
|
||||
|
||||
;; 1. Block auswaehlen (falls nicht vorselektiert)
|
||||
(if (null ent)
|
||||
(progn
|
||||
(setq sel (entsel "\nKreisel-Block auswaehlen: "))
|
||||
(setq sel (entsel (ssg-text "kreisel-prompt-block-auswaehlen")))
|
||||
(if sel (setq ent (car sel)))
|
||||
)
|
||||
)
|
||||
@@ -850,7 +880,7 @@
|
||||
|
||||
(setq ed (entget ent))
|
||||
(if (/= (cdr (assoc 0 ed)) "INSERT")
|
||||
(progn (ssg-emsg "Kein Block ausgewaehlt!") (ssg-end) (exit))
|
||||
(progn (ssg-emsg (ssg-text "kreisel-emsg-kein-block")) (ssg-end) (exit))
|
||||
)
|
||||
|
||||
;; 2. Bestehende Werte auslesen
|
||||
@@ -861,7 +891,7 @@
|
||||
;; Pruefen ob Block Kreisel-Attribute hat (mindestens ABSTAND)
|
||||
(if (null (assoc "ABSTAND" attribs))
|
||||
(progn
|
||||
(ssg-emsg "Kein Kreisel-Block! (Attribut ABSTAND fehlt)")
|
||||
(ssg-emsg (ssg-text "kreisel-emsg-kein-kreisel-block"))
|
||||
(ssg-end)
|
||||
(exit)
|
||||
)
|
||||
@@ -878,15 +908,14 @@
|
||||
(setq attribs (subst (cons "HOEHE" (rtos (if (caddr basePoint) (caddr basePoint) 0.0) 2 1))
|
||||
(assoc "HOEHE" attribs) attribs))
|
||||
|
||||
(princ (strcat "\n-> Bestehend: Abstand=" (cdr (assoc "ABSTAND" attribs))
|
||||
" Drehung=" (rtos rotation 2 1)
|
||||
" Art=" (cdr (assoc "KREISELART" attribs))))
|
||||
(princ (ssg-textf "kreisel-edit-bestehend"
|
||||
(list (cdr (assoc "ABSTAND" attribs)) (rtos rotation 2 1) (cdr (assoc "KREISELART" attribs)))))
|
||||
|
||||
;; 3. DCL-Dialog laden
|
||||
(setq dcl-pfad (strcat (getenv "DXFM_DCL") "/kreisel_edit.dcl"))
|
||||
(setq dat (load_dialog dcl-pfad))
|
||||
(if (not (new_dialog "kreisel_edit" dat))
|
||||
(progn (alert (strcat "Dialog nicht verfuegbar: " dcl-pfad)) (ssg-end) (exit))
|
||||
(progn (alert (ssg-textf "kreisel-edit-dialog-fehlt" (list dcl-pfad))) (ssg-end) (exit))
|
||||
)
|
||||
|
||||
;; Ausrichtungs-Labels fuer popup_list aufbauen
|
||||
@@ -965,13 +994,10 @@
|
||||
(draw-module (list (car basePoint) (cadr basePoint) (atof dlg-hoehe))
|
||||
newAbstand newRotation attribs)
|
||||
|
||||
(princ (strcat "\nKreisel aktualisiert: "
|
||||
"Name=" dlg-name
|
||||
" Abstand=" (rtos newAbstand 2 0)
|
||||
" Hoehe=" dlg-hoehe
|
||||
" Rotation=" (rtos newRotation 2 1)))
|
||||
(princ (ssg-textf "kreisel-edit-aktualisiert"
|
||||
(list dlg-name (rtos newAbstand 2 0) dlg-hoehe (rtos newRotation 2 1))))
|
||||
)
|
||||
(princ "\nAbgebrochen.")
|
||||
(princ (ssg-text "kreisel-abgebrochen"))
|
||||
)
|
||||
|
||||
(ssg-end)
|
||||
@@ -982,13 +1008,13 @@
|
||||
;; KreiselParams: Aktuelle Parameter anzeigen
|
||||
;; --------------------------------------------
|
||||
(defun c:KreiselParams ()
|
||||
(princ "\n=== Kreisel Parameter ===")
|
||||
(princ (strcat "\nKreiselart: " #Kreisel_Typ))
|
||||
(princ (strcat "\nDurchmesser: " (rtos *kreisel-durchmesser* 2 0)))
|
||||
(princ (strcat "\nDefault-Laenge: " (rtos *kreisel-default-laenge* 2 0)))
|
||||
(princ (ssg-text "kreisel-params-header"))
|
||||
(princ (ssg-textf "kreisel-params-typ" (list #Kreisel_Typ)))
|
||||
(princ (ssg-textf "kreisel-params-durchmesser" (list (rtos *kreisel-durchmesser* 2 0))))
|
||||
(princ (ssg-textf "kreisel-params-default-laenge" (list (rtos *kreisel-default-laenge* 2 0))))
|
||||
;; NEU - Default-Höhe anzeigen:
|
||||
(princ (strcat "\nDefault-Höhe: " (rtos *kreisel-default-hoehe* 2 0)))
|
||||
(princ "\nAttribute im Block:")
|
||||
(princ (ssg-textf "kreisel-params-default-hoehe" (list (rtos *kreisel-default-hoehe* 2 0))))
|
||||
(princ (ssg-text "kreisel-params-attribute-header"))
|
||||
(foreach def *kreisel-attrib-defs*
|
||||
(princ (strcat "\n " (car def) " = " (cadr def)))
|
||||
)
|
||||
@@ -1011,12 +1037,12 @@
|
||||
(dbgf "c:ILS_Eckrad")
|
||||
|
||||
;; 1. Beruehrpunkt (Tangentenpunkt)
|
||||
(setq ptTangent (getpoint "\nBeruehrpunkt Eckrad (Tangente): "))
|
||||
(setq ptTangent (getpoint (ssg-text "kreisel-eckrad-beruehrpunkt")))
|
||||
(if (null ptTangent) (progn (dbgreturn nil) (exit)))
|
||||
(dbg 'ptTangent)
|
||||
|
||||
;; 2. Richtungspunkt (Gummiband vom Beruehrpunkt)
|
||||
(setq ptDir (getpoint ptTangent "\nRichtung zum Kreismittelpunkt: "))
|
||||
(setq ptDir (getpoint ptTangent (ssg-text "kreisel-eckrad-richtung")))
|
||||
(if (null ptDir) (progn (dbgreturn nil) (exit)))
|
||||
(dbg 'ptDir)
|
||||
|
||||
@@ -1027,7 +1053,7 @@
|
||||
|
||||
(if (<= dist (ssg-cfg-or "kreisel" "toleranz_min_distanz" 0.001))
|
||||
(progn
|
||||
(princ "\nFehler: Beruehr- und Richtungspunkt sind identisch!")
|
||||
(princ (ssg-text "kreisel-eckrad-fehler-identisch"))
|
||||
(dbgreturn nil)
|
||||
(exit)
|
||||
)
|
||||
@@ -1053,10 +1079,10 @@
|
||||
(if (and (> (length ptTangent) 2) (caddr ptTangent) (> (caddr ptTangent) 0))
|
||||
(progn
|
||||
(setq hoehe (caddr ptTangent))
|
||||
(princ (strcat "\n-> Hoehe aus 3D-Punkt uebernommen: " (rtos hoehe 2 0)))
|
||||
(princ (ssg-textf "kreisel-hoehe-aus-3dpunkt" (list (rtos hoehe 2 0))))
|
||||
)
|
||||
(progn
|
||||
(setq hoehe (getreal (strcat "\nHoehe (Z-Koordinate) <" (rtos *eckrad-default-hoehe* 2 0) ">: ")))
|
||||
(setq hoehe (getreal (ssg-textf "kreisel-prompt-hoehe-z" (list (rtos *eckrad-default-hoehe* 2 0)))))
|
||||
(if (null hoehe) (setq hoehe *eckrad-default-hoehe*))
|
||||
)
|
||||
)
|
||||
@@ -1084,7 +1110,7 @@
|
||||
(dbg 'pt)
|
||||
(dbg 'rotation)
|
||||
|
||||
(ssg-start "Eckrad einfuegen" '(("ATTREQ") ("ATTDIA") ("OSMODE") ("CECOLOR")))
|
||||
(ssg-start (ssg-text "kreisel-start-eckrad") '(("ATTREQ") ("ATTDIA") ("OSMODE") ("CECOLOR")))
|
||||
|
||||
;; Attribute vorbereiten
|
||||
(setq attribs (ssg-attrib-merge attribs *eckrad-attrib-defs*))
|
||||
@@ -1181,14 +1207,14 @@
|
||||
(dbgp (strcat "Blockdefinition erzeugt: " bname))
|
||||
)
|
||||
(progn
|
||||
(princ "\nFehler: Keine Entities zum Block erstellen!")
|
||||
(princ (ssg-text "kreisel-fehler-keine-entities"))
|
||||
(dbgp "FEHLER: Keine Entities fuer Block!")
|
||||
)
|
||||
)
|
||||
(princ (strcat "\n-> Neue Blockdefinition: " bname))
|
||||
(princ (ssg-textf "kreisel-neue-blockdef" (list bname)))
|
||||
)
|
||||
(progn
|
||||
(princ (strcat "\n-> Verwende bestehende Blockdefinition: " bname))
|
||||
(princ (ssg-textf "kreisel-bestehende-blockdef" (list bname)))
|
||||
(dbgp (strcat "Verwende bestehende Blockdefinition: " bname))
|
||||
)
|
||||
)
|
||||
@@ -1225,32 +1251,34 @@
|
||||
)
|
||||
(entupd block-ent)
|
||||
|
||||
(princ (strcat "\n-> Eckrad #" (itoa eckrad-nummer) " eingefuegt: " bname
|
||||
" bei " (rtos (car pt) 2 1) "," (rtos (cadr pt) 2 1)
|
||||
" Rotation=" (rtos rotation 2 1)
|
||||
" Hoehe=" block-hoehe))
|
||||
(princ (ssg-textf "kreisel-eckrad-eingefuegt"
|
||||
(list (itoa eckrad-nummer) bname (rtos (car pt) 2 1) (rtos (cadr pt) 2 1)
|
||||
(rtos rotation 2 1) block-hoehe)))
|
||||
(ssg-end)
|
||||
(dbgreturn (entlast))
|
||||
)
|
||||
|
||||
;; NEU: KreiselLabelSetup - Hier einfügen!
|
||||
(defun c:KreiselLabelSetup ( / hoehe farbe abstand schriftart)
|
||||
(setq hoehe (getreal (strcat "\nSchrifthöhe <" (rtos *kreisel-beschriftung-hoehe* 2 0) ">: ")))
|
||||
(setq hoehe (getreal (ssg-textf "kreisel-prompt-schrifthoehe" (list (rtos *kreisel-beschriftung-hoehe* 2 0)))))
|
||||
(if hoehe (setq *kreisel-beschriftung-hoehe* hoehe))
|
||||
|
||||
(setq farbe (getint (strcat "\nSchriftfarbe (1=Rot,2=Gelb,3=Grün,4=Cyan,5=Blau,6=Magenta,7=Weiß) <" (itoa *kreisel-beschriftung-farbe*) ">: ")))
|
||||
|
||||
(setq farbe (getint (ssg-textf "kreisel-prompt-schriftfarbe" (list (itoa *kreisel-beschriftung-farbe*)))))
|
||||
(if farbe (setq *kreisel-beschriftung-farbe* farbe))
|
||||
|
||||
(setq abstand (getreal (strcat "\nAbstand über Kreisel-Mitte <" (rtos *kreisel-beschriftung-abstand-oben* 2 0) ">: ")))
|
||||
|
||||
(setq abstand (getreal (ssg-textf "kreisel-prompt-abstand-oben" (list (rtos *kreisel-beschriftung-abstand-oben* 2 0)))))
|
||||
(if abstand (setq *kreisel-beschriftung-abstand-oben* abstand))
|
||||
|
||||
(princ (strcat "\nNeue Einstellungen: Höhe=" (rtos *kreisel-beschriftung-hoehe* 2 0)
|
||||
", Farbe=" (itoa *kreisel-beschriftung-farbe*)
|
||||
", Y-Versatz=" (rtos *kreisel-beschriftung-abstand-oben* 2 0)
|
||||
", Schriftart=Arial"))
|
||||
|
||||
(princ (ssg-textf "kreisel-labelsetup-fertig"
|
||||
(list (rtos *kreisel-beschriftung-hoehe* 2 0)
|
||||
(itoa *kreisel-beschriftung-farbe*)
|
||||
(rtos *kreisel-beschriftung-abstand-oben* 2 0))))
|
||||
(princ)
|
||||
)
|
||||
|
||||
(princ "\nKreiselInsert.lsp geladen (Version 7.0 - Auto-Nummerierung + Beschriftung + Attribute + Redraw + Eckrad)")
|
||||
(princ "\nBefehle: KreiselInsert, KreiselConnect, KreiselRedraw, KreiselEdit, KreiselQuick, KreiselParams, ILS_Eckrad")
|
||||
(princ "\n>>> KREISELINSERT v7.0 geladen <<<")
|
||||
(princ "\n>>> Befehle: KreiselInsert, KreiselConnect, KreiselRedraw,")
|
||||
(princ "\n KreiselEdit, KreiselQuick, KreiselParams, ILS_Eckrad")
|
||||
(if *block-path* (princ (strcat "\n Block-Pfad: " *block-path*)))
|
||||
(princ "\n=========================================")
|
||||
(princ)
|
||||
|
||||
+135
-213
@@ -15,129 +15,11 @@
|
||||
;; ============================================================
|
||||
|
||||
|
||||
;; --- Datei zeilenweise einlesen ---
|
||||
(defun omni:read-file-lines (datei / f zeile ergebnis)
|
||||
(setq f (open datei "r"))
|
||||
(if (null f)
|
||||
(progn
|
||||
(princ (strcat "\n[OMNI] FEHLER: Datei nicht gefunden: " datei))
|
||||
nil
|
||||
)
|
||||
(progn
|
||||
(setq ergebnis nil)
|
||||
(while (setq zeile (read-line f))
|
||||
(setq ergebnis (cons zeile ergebnis))
|
||||
)
|
||||
(close f)
|
||||
(reverse ergebnis)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
;; --- Whitespace und Komma am Ende einer Zeile entfernen ---
|
||||
(defun omni:trim (s / len ch)
|
||||
(setq s (vl-string-trim " \t\r\n" s))
|
||||
(setq len (strlen s))
|
||||
(if (and (> len 0) (= (substr s len 1) ","))
|
||||
(setq s (substr s 1 (1- len)))
|
||||
)
|
||||
(vl-string-trim " \t\r\n" s)
|
||||
)
|
||||
|
||||
|
||||
;; --- JSON-Wert parsen (String, Zahl, null) ---
|
||||
(defun omni:parse-value (val-str / len)
|
||||
(setq val-str (omni:trim val-str))
|
||||
(cond
|
||||
((= val-str "null") nil)
|
||||
((= (substr val-str 1 1) "\"")
|
||||
;; String: Anfuehrungszeichen entfernen
|
||||
(setq len (strlen val-str))
|
||||
(if (and (> len 1) (= (substr val-str len 1) "\""))
|
||||
(substr val-str 2 (- len 2))
|
||||
val-str
|
||||
)
|
||||
)
|
||||
(T
|
||||
;; Zahl
|
||||
(if (vl-string-search "." val-str)
|
||||
(atof val-str)
|
||||
(atoi val-str)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
;; --- Eine Key-Value-Zeile parsen -> dotted pair oder nil ---
|
||||
(defun omni:parse-kv-line (zeile / pos key rest val)
|
||||
(setq zeile (omni:trim zeile))
|
||||
;; Muss mit " beginnen (Key)
|
||||
(if (and (> (strlen zeile) 0) (= (substr zeile 1 1) "\""))
|
||||
(progn
|
||||
;; Key extrahieren: zweites Anfuehrungszeichen finden
|
||||
;; vl-string-search ist 0-basiert, substr ist 1-basiert
|
||||
(setq pos (vl-string-search "\"" zeile 1))
|
||||
(if pos
|
||||
(progn
|
||||
(setq key (substr zeile 2 (1- pos)))
|
||||
;; Rest nach dem schliessenden " extrahieren
|
||||
(setq rest (substr zeile (+ pos 2)))
|
||||
;; ":" im Rest finden
|
||||
(setq pos (vl-string-search ":" rest))
|
||||
(if pos
|
||||
(progn
|
||||
(setq val (substr rest (+ pos 2)))
|
||||
(cons key (omni:parse-value val))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
;; --- JSON-Array von flachen Objekten parsen ---
|
||||
(defun omni:parse-json-array (zeilen / in-obj obj ergebnis zeile kv trimmed)
|
||||
(setq in-obj nil
|
||||
obj nil
|
||||
ergebnis nil
|
||||
)
|
||||
(foreach zeile zeilen
|
||||
(setq trimmed (omni:trim zeile))
|
||||
(cond
|
||||
;; Objekt-Start
|
||||
((= trimmed "{")
|
||||
(setq in-obj T
|
||||
obj nil
|
||||
)
|
||||
)
|
||||
;; Objekt-Ende
|
||||
((or (= trimmed "}") (= trimmed "},"))
|
||||
(if (and in-obj obj)
|
||||
(setq ergebnis (cons (reverse obj) ergebnis))
|
||||
)
|
||||
(setq in-obj nil)
|
||||
)
|
||||
;; Key-Value-Zeile innerhalb eines Objekts
|
||||
(in-obj
|
||||
(setq kv (omni:parse-kv-line zeile))
|
||||
(if kv (setq obj (cons kv obj)))
|
||||
)
|
||||
)
|
||||
)
|
||||
(reverse ergebnis)
|
||||
)
|
||||
|
||||
|
||||
;; --- JSON-Datei laden und als Liste von Alists zurueckgeben ---
|
||||
(defun omni:load-json (datei / zeilen)
|
||||
(setq zeilen (omni:read-file-lines datei))
|
||||
(if zeilen
|
||||
(omni:parse-json-array zeilen)
|
||||
)
|
||||
;; Duenner Wrapper um den zentralen JSON-Parser aus ssg_core.lsp
|
||||
;; (ssg-load-json), damit fuer alle Module derselbe Parser-Standard gilt.
|
||||
(defun omni:load-json (datei)
|
||||
(ssg-load-json datei)
|
||||
)
|
||||
|
||||
|
||||
@@ -146,7 +28,7 @@
|
||||
(setq data-pfad (getenv "DXFM_DATA"))
|
||||
(if (null data-pfad)
|
||||
(progn
|
||||
(princ "\n[OMNI] FEHLER: DXFM_DATA nicht gesetzt!")
|
||||
(princ (ssg-text "omni-fehler-dxfm-data"))
|
||||
nil
|
||||
)
|
||||
(progn
|
||||
@@ -245,8 +127,10 @@
|
||||
;; eintrag = Assoziationsliste (Rueckgabe von omni:get-bogen etc.)
|
||||
;; key = Schluesselname z.B. "Radius"
|
||||
;; Beispiel: (omni:val (omni:get-bogen 821104025) "Radius") -> 550
|
||||
;; Duenner Wrapper um ssg-val (ssg_core.lsp), damit fuer alle Module
|
||||
;; derselbe Alist-Zugriffsstandard gilt.
|
||||
(defun omni:val (eintrag key)
|
||||
(cdr (assoc key eintrag))
|
||||
(ssg-val eintrag key)
|
||||
)
|
||||
|
||||
|
||||
@@ -358,21 +242,21 @@
|
||||
;; --- BricsCAD-Befehl: Bogen-Info anzeigen ---
|
||||
(defun c:OMNI_INFO_BOGEN ( / id eintrag)
|
||||
(if (null *OMNI-BOEGEN*) (omni:load-data))
|
||||
(setq id (getstring T "\nSivasId des Bogens eingeben: "))
|
||||
(if (= id "") (princ "\nAbgebrochen.")
|
||||
(setq id (getstring T (ssg-text "omni-info-bogen-prompt")))
|
||||
(if (= id "") (princ (ssg-text "omni-abbruch"))
|
||||
(progn
|
||||
;; Versuch als Zahl, dann als String
|
||||
(setq eintrag (omni:get-bogen (if (/= (atoi id) 0) (atoi id) id)))
|
||||
(if eintrag
|
||||
(progn
|
||||
(princ (strcat "\n ProfilTyp: " (omni:sivasid-to-str (omni:val eintrag "ProfilTyp"))))
|
||||
(princ (strcat "\n Radius: " (itoa (fix (omni:val eintrag "Radius")))))
|
||||
(princ (strcat "\n KurvenWinkel: " (rtos (omni:val eintrag "KurvenWinkel") 2 1)))
|
||||
(princ (strcat "\n Breite: " (itoa (fix (omni:val eintrag "Breite")))))
|
||||
(princ (strcat "\n Laenge: " (itoa (fix (omni:val eintrag "Länge")))))
|
||||
(princ (strcat "\n Antriebsart: " (itoa (fix (omni:val eintrag "Antriebsart")))))
|
||||
(princ (ssg-textf "omni-bogen-info-profiltyp" (list (omni:sivasid-to-str (omni:val eintrag "ProfilTyp")))))
|
||||
(princ (ssg-textf "omni-bogen-info-radius" (list (itoa (fix (omni:val eintrag "Radius"))))))
|
||||
(princ (ssg-textf "omni-bogen-info-kurvenwinkel" (list (rtos (omni:val eintrag "KurvenWinkel") 2 1))))
|
||||
(princ (ssg-textf "omni-bogen-info-breite" (list (itoa (fix (omni:val eintrag "Breite"))))))
|
||||
(princ (ssg-textf "omni-bogen-info-laenge" (list (itoa (fix (omni:val eintrag "Länge"))))))
|
||||
(princ (ssg-textf "omni-bogen-info-antriebsart" (list (itoa (fix (omni:val eintrag "Antriebsart"))))))
|
||||
)
|
||||
(princ (strcat "\nKein Bogen mit SivasId '" id "' gefunden."))
|
||||
(princ (ssg-textf "omni-bogen-nicht-gefunden" (list id)))
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -383,25 +267,25 @@
|
||||
;; --- BricsCAD-Befehl: Weichen-Info anzeigen ---
|
||||
(defun c:OMNI_INFO_WEICHE ( / id eintrag wkl)
|
||||
(if (null *OMNI-WEICHEN*) (omni:load-data))
|
||||
(setq id (getstring T "\nSivasId der Weiche eingeben: "))
|
||||
(if (= id "") (princ "\nAbgebrochen.")
|
||||
(setq id (getstring T (ssg-text "omni-info-weiche-prompt")))
|
||||
(if (= id "") (princ (ssg-text "omni-abbruch"))
|
||||
(progn
|
||||
(setq eintrag (omni:get-weiche (if (/= (atoi id) 0) (atoi id) id)))
|
||||
(if eintrag
|
||||
(progn
|
||||
(princ (strcat "\n ProfilTyp: " (omni:sivasid-to-str (omni:val eintrag "ProfilTyp"))))
|
||||
(princ (strcat "\n WeichenTyp: " (omni:sivasid-to-str (omni:val eintrag "WeichenTyp"))))
|
||||
(princ (ssg-textf "omni-weiche-info-profiltyp" (list (omni:sivasid-to-str (omni:val eintrag "ProfilTyp")))))
|
||||
(princ (ssg-textf "omni-weiche-info-weichentyp" (list (omni:sivasid-to-str (omni:val eintrag "WeichenTyp")))))
|
||||
(setq wkl (omni:val eintrag "KurvenWinkel"))
|
||||
(princ (strcat "\n KurvenWinkel: " (if (= (type wkl) 'INT) (itoa wkl) (rtos wkl 2 1))))
|
||||
(princ (strcat "\n Schaltungstyp: " (omni:sivasid-to-str (omni:val eintrag "Schaltungstyp"))))
|
||||
(princ (strcat "\n Breite: " (itoa (fix (omni:val eintrag "Breite")))))
|
||||
(princ (strcat "\n Laenge: " (itoa (fix (omni:val eintrag "Länge")))))
|
||||
(princ (strcat "\n KurvenRichtung: " (itoa (fix (omni:val eintrag "KurvenRichtung")))))
|
||||
(princ (ssg-textf "omni-weiche-info-kurvenwinkel" (list (if (= (type wkl) 'INT) (itoa wkl) (rtos wkl 2 1)))))
|
||||
(princ (ssg-textf "omni-weiche-info-schaltungstyp" (list (omni:sivasid-to-str (omni:val eintrag "Schaltungstyp")))))
|
||||
(princ (ssg-textf "omni-weiche-info-breite" (list (itoa (fix (omni:val eintrag "Breite"))))))
|
||||
(princ (ssg-textf "omni-weiche-info-laenge" (list (itoa (fix (omni:val eintrag "Länge"))))))
|
||||
(princ (ssg-textf "omni-weiche-info-kurvenrichtung" (list (itoa (fix (omni:val eintrag "KurvenRichtung"))))))
|
||||
(if (omni:val eintrag "WeichenkörperLänge")
|
||||
(princ (strcat "\n WK-Laenge: " (rtos (omni:val eintrag "WeichenkörperLänge") 2 1)))
|
||||
(princ (ssg-textf "omni-weiche-info-wklaenge" (list (rtos (omni:val eintrag "WeichenkörperLänge") 2 1))))
|
||||
)
|
||||
)
|
||||
(princ (strcat "\nKeine Weiche mit SivasId '" id "' gefunden."))
|
||||
(princ (ssg-textf "omni-weiche-nicht-gefunden" (list id)))
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -442,11 +326,13 @@
|
||||
|
||||
|
||||
;; --- Bogen-Auswahl-Dialog oeffnen ---
|
||||
;; winkel = KurvenWinkel (90, 67.5, 45, 22.5, 180)
|
||||
;; winkel = KurvenWinkel (90, 67.5, 45, 22.5, 180)
|
||||
;; init-hoehe / init-drehung = Vorbelegung (optional, fuer Edit-Modus)
|
||||
;; profiltyp = optionales Praefix zum Filtern des ProfilTyp-Textes,
|
||||
;; z.B. "APB 60" oder "APB 110" (nil = keine Einschraenkung)
|
||||
;; Rueckgabe: (eintrag hoehe drehung) oder nil bei Abbruch
|
||||
(defun omni:bogen-dialog (winkel init-hoehe init-drehung / dcl-pfad dat boegen-liste
|
||||
profil-liste ergebnis dlg-hoehe dlg-drehung)
|
||||
(defun omni:bogen-dialog (winkel init-hoehe init-drehung profiltyp / dcl-pfad dat boegen-liste
|
||||
profil-liste ergebnis dlg-hoehe dlg-drehung profil)
|
||||
(if (null *OMNI-BOEGEN*) (omni:load-data))
|
||||
|
||||
;; Defaults
|
||||
@@ -455,11 +341,31 @@
|
||||
|
||||
;; Boegen nach Winkel filtern
|
||||
(setq boegen-liste (omni:filter *OMNI-BOEGEN* "KurvenWinkel" winkel))
|
||||
|
||||
;; Optional zusaetzlich nach ProfilTyp-Praefix filtern (z.B. "APB 60")
|
||||
(if profiltyp
|
||||
(setq boegen-liste
|
||||
(vl-remove-if-not
|
||||
'(lambda (e)
|
||||
(setq profil (cdr (assoc "ProfilTyp" e)))
|
||||
(and profil (= (vl-string-search profiltyp profil) 0))
|
||||
)
|
||||
boegen-liste
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
(if (null boegen-liste)
|
||||
(progn
|
||||
(alert (strcat "Keine Boegen fuer "
|
||||
(if (= (type winkel) 'INT) (itoa winkel) (rtos winkel 2 1))
|
||||
" Grad gefunden."))
|
||||
(alert (ssg-textf "omni-bogen-keine-gefunden"
|
||||
(list
|
||||
(strcat
|
||||
(if (= (type winkel) 'INT) (itoa winkel) (rtos winkel 2 1))
|
||||
(ssg-text "omni-grad")
|
||||
)
|
||||
(if profiltyp (strcat " (" profiltyp ")") "")
|
||||
)
|
||||
))
|
||||
nil
|
||||
)
|
||||
(progn
|
||||
@@ -474,7 +380,7 @@
|
||||
(setq dcl-pfad (strcat (getenv "DXFM_DCL") "/omniflo_boegen.dcl"))
|
||||
(setq dat (load_dialog dcl-pfad))
|
||||
(if (not (new_dialog "omniflo_boegen" dat))
|
||||
(progn (alert "Bogen-Dialog konnte nicht geladen werden.") nil)
|
||||
(progn (alert (ssg-text "omni-bogen-dialog-ladefehler")) nil)
|
||||
(progn
|
||||
;; Dropdown befuellen
|
||||
(start_list "bogenart")
|
||||
@@ -521,47 +427,57 @@
|
||||
;; ============================================================
|
||||
|
||||
;; --- Omniflo / Boegen ---
|
||||
(defun c:OMNI_APB_630_90 ( / dlg-result)
|
||||
(setq dlg-result (omni:bogen-dialog 90 nil nil))
|
||||
(defun c:OMNI_APB60_90 ( / dlg-result)
|
||||
(setq dlg-result (omni:bogen-dialog 90 nil nil "APB 60"))
|
||||
(if dlg-result
|
||||
(omni:insert-from-entry dlg-result)
|
||||
(princ "\n[BOGEN] Abgebrochen.")
|
||||
(princ (ssg-text "omni-abbruch-bogen"))
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
|
||||
|
||||
(defun c:OMNI_APB_630_90 ( / dlg-result)
|
||||
(setq dlg-result (omni:bogen-dialog 90 nil nil "APB 110"))
|
||||
(if dlg-result
|
||||
(omni:insert-from-entry dlg-result)
|
||||
(princ (ssg-text "omni-abbruch-bogen"))
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
|
||||
(defun c:OMNI_APB_550_675 ( / dlg-result)
|
||||
(setq dlg-result (omni:bogen-dialog 67.5 nil nil))
|
||||
(setq dlg-result (omni:bogen-dialog 67.5 nil nil nil))
|
||||
(if dlg-result
|
||||
(omni:insert-from-entry dlg-result)
|
||||
(princ "\n[BOGEN] Abgebrochen.")
|
||||
(princ (ssg-text "omni-abbruch-bogen"))
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
|
||||
(defun c:OMNI_APB_630_45 ( / dlg-result)
|
||||
(setq dlg-result (omni:bogen-dialog 45 nil nil))
|
||||
(setq dlg-result (omni:bogen-dialog 45 nil nil nil))
|
||||
(if dlg-result
|
||||
(omni:insert-from-entry dlg-result)
|
||||
(princ "\n[BOGEN] Abgebrochen.")
|
||||
(princ (ssg-text "omni-abbruch-bogen"))
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
|
||||
(defun c:OMNI_APB_550_225 ( / dlg-result)
|
||||
(setq dlg-result (omni:bogen-dialog 22.5 nil nil))
|
||||
(setq dlg-result (omni:bogen-dialog 22.5 nil nil nil))
|
||||
(if dlg-result
|
||||
(omni:insert-from-entry dlg-result)
|
||||
(princ "\n[BOGEN] Abgebrochen.")
|
||||
(princ (ssg-text "omni-abbruch-bogen"))
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
|
||||
(defun c:OMNI_APB_650_180 ( / dlg-result)
|
||||
(setq dlg-result (omni:bogen-dialog 180 nil nil))
|
||||
(setq dlg-result (omni:bogen-dialog 180 nil nil nil))
|
||||
(if dlg-result
|
||||
(omni:insert-from-entry dlg-result)
|
||||
(princ "\n[BOGEN] Abgebrochen.")
|
||||
(princ (ssg-text "omni-abbruch-bogen"))
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
@@ -601,7 +517,7 @@
|
||||
(setq srcAttribs (append srcAttribs (list (cons "ID" ""))))
|
||||
)
|
||||
(if (null srcAttribs)
|
||||
(progn (princ "\n[OMNI] Keine Attribute im Quell-Block gefunden.") nil)
|
||||
(progn (princ (ssg-text "omni-insert-keine-attribute")) nil)
|
||||
(progn
|
||||
;; LAENGEMAX aus Quell-Attribut lesen (falls vorhanden), sonst Parameter
|
||||
(if (and (assoc "LAENGEMAX" srcAttribs)
|
||||
@@ -609,9 +525,9 @@
|
||||
(setq laengemax (atof (cdr (assoc "LAENGEMAX" srcAttribs))))
|
||||
)
|
||||
|
||||
(setq pt (getpoint "\nEinfuegepunkt waehlen: "))
|
||||
(setq pt (getpoint (ssg-text "omni-prompt-einfuegepunkt")))
|
||||
(if (null pt)
|
||||
(progn (princ "\n[OMNI] Abgebrochen.") nil)
|
||||
(progn (princ (ssg-text "omni-abbruch-omni")) nil)
|
||||
(progn
|
||||
(ssg-start "OMNI Aluprofil" '(("OSMODE") ("ATTREQ") ("ATTDIA")))
|
||||
;; ATTREQ/ATTDIA auf 0 setzen (werden durch ssg-end wiederhergestellt)
|
||||
@@ -631,22 +547,20 @@
|
||||
;; 2. Endpunkt fuer Fahrstrecke abfragen (Schleife bei Ueberschreitung)
|
||||
(setq ok nil)
|
||||
(while (not ok)
|
||||
(setq pt2 (getpoint pt "\nEndpunkt der Fahrstrecke waehlen: "))
|
||||
(setq pt2 (getpoint pt (ssg-text "omni-prompt-endpunkt-fahrstrecke")))
|
||||
(if (null pt2)
|
||||
(progn
|
||||
;; Abbruch: Text loeschen
|
||||
(command "_.ERASE" textEnt "")
|
||||
(princ "\n[OMNI] Abgebrochen.")
|
||||
(princ (ssg-text "omni-abbruch-omni"))
|
||||
(setq ok T pt nil)
|
||||
)
|
||||
(progn
|
||||
(setq laenge (distance (list (car pt) (cadr pt))
|
||||
(list (car pt2) (cadr pt2))))
|
||||
(if (> laenge laengemax)
|
||||
(alert (strcat "Die gewuenschte Fahrstreckenlaenge von "
|
||||
(rtos laenge 2 0) " mm ueberschreitet die Maximallaenge von "
|
||||
(rtos laengemax 2 0) " mm des Fahrstreckenprofils.\n"
|
||||
"Bitte neu definieren!"))
|
||||
(alert (ssg-textf "omni-laenge-ueberschritten"
|
||||
(list (rtos laenge 2 0) (rtos laengemax 2 0))))
|
||||
(progn
|
||||
(setq laengeStr (rtos laenge 2 0))
|
||||
(setq dx (- (car pt2) (car pt))
|
||||
@@ -720,7 +634,7 @@
|
||||
(ssg-id-generate blockEnt)
|
||||
)
|
||||
|
||||
(princ (strcat "\n[OMNI] " bname " eingefuegt. Laenge=" laengeStr " mm"))
|
||||
(princ (ssg-textf "omni-insert-block-eingefuegt" (list bname laengeStr)))
|
||||
(setq ok T)
|
||||
)
|
||||
)
|
||||
@@ -872,14 +786,16 @@
|
||||
|
||||
(if (null basis-liste)
|
||||
(progn
|
||||
(alert (strcat "Keine Weichen fuer "
|
||||
(cond
|
||||
((null winkel) "alle Winkel")
|
||||
((= (type winkel) 'INT) (strcat (itoa winkel) " Grad"))
|
||||
(T (strcat (rtos winkel 2 1) " Grad"))
|
||||
(alert (ssg-textf "omni-weiche-keine-gefunden"
|
||||
(list
|
||||
(cond
|
||||
((null winkel) (ssg-text "omni-alle-winkel"))
|
||||
((= (type winkel) 'INT) (strcat (itoa winkel) (ssg-text "omni-grad")))
|
||||
(T (strcat (rtos winkel 2 1) (ssg-text "omni-grad")))
|
||||
)
|
||||
(if weichentyp (strcat " / " weichentyp) "")
|
||||
)
|
||||
(if weichentyp (strcat " / " weichentyp) "")
|
||||
" gefunden."))
|
||||
))
|
||||
nil
|
||||
)
|
||||
(progn
|
||||
@@ -895,7 +811,7 @@
|
||||
(setq dcl-pfad (strcat (getenv "DXFM_DCL") "/omniflo_weichen.dcl"))
|
||||
(setq dat (load_dialog dcl-pfad))
|
||||
(if (not (new_dialog "omniflo_weichen" dat))
|
||||
(progn (alert "Weichen-Dialog konnte nicht geladen werden.") nil)
|
||||
(progn (alert (ssg-text "omni-weiche-dialog-ladefehler")) nil)
|
||||
(progn
|
||||
;; Dropdown befuellen
|
||||
(start_list "profiltyp")
|
||||
@@ -960,20 +876,20 @@
|
||||
(setq omniflo-pfad (getenv "DXFM_OMNIFLO"))
|
||||
(if (null omniflo-pfad)
|
||||
(progn
|
||||
(princ "\n[OMNI] FEHLER: DXFM_OMNIFLO nicht gesetzt!")
|
||||
(princ (ssg-text "omni-fehler-dxfm-omniflo"))
|
||||
nil
|
||||
)
|
||||
(progn
|
||||
(setq dxf-pfad (strcat omniflo-pfad "/" sivasnr-str ".dxf"))
|
||||
(if (not (findfile dxf-pfad))
|
||||
(progn
|
||||
(princ (strcat "\n[OMNI] FEHLER: DXF nicht gefunden: " dxf-pfad))
|
||||
(princ (ssg-textf "omni-fehler-dxf-nicht-gefunden" (list dxf-pfad)))
|
||||
nil
|
||||
)
|
||||
(progn
|
||||
(setq pt (getpoint "\nEinfuegepunkt waehlen: "))
|
||||
(setq pt (getpoint (ssg-text "omni-prompt-einfuegepunkt")))
|
||||
(if (null pt)
|
||||
(progn (princ "\n[OMNI] Abgebrochen.") nil)
|
||||
(progn (princ (ssg-text "omni-abbruch-omni")) nil)
|
||||
(progn
|
||||
(ssg-start "OMNI DXF Insert" '(("OSMODE") ("ATTREQ") ("ATTDIA")))
|
||||
(setvar "ATTREQ" 0)
|
||||
@@ -1020,10 +936,13 @@
|
||||
(ssg-id-generate blockEnt)
|
||||
)
|
||||
|
||||
(princ (strcat "\n[OMNI] " sivasnr-str " eingefuegt."
|
||||
" Hoehe=" (if hoehe hoehe (ssg-cfg-or "omniflo" "default_hoehe" "2000"))
|
||||
" Drehung=" (if drehung drehung (ssg-cfg-or "omniflo" "default_drehung" "0"))
|
||||
(if layer-name (strcat " Layer=" layer-name) "")))
|
||||
(princ (ssg-textf "omni-dxf-eingefuegt"
|
||||
(list
|
||||
sivasnr-str
|
||||
(if hoehe hoehe (ssg-cfg-or "omniflo" "default_hoehe" "2000"))
|
||||
(if drehung drehung (ssg-cfg-or "omniflo" "default_drehung" "0"))
|
||||
(if layer-name (strcat " Layer=" layer-name) "")
|
||||
)))
|
||||
(ssg-end)
|
||||
pt
|
||||
)
|
||||
@@ -1044,8 +963,8 @@
|
||||
(setq hoehe (cadr dlg-result))
|
||||
(setq drehung (caddr dlg-result))
|
||||
(setq sivasnr-str (omni:sivasid-to-str (omni:val eintrag "Sivasnr")))
|
||||
(princ (strcat "\n[OMNI] Einfuegen: "
|
||||
(omni:val eintrag "ProfilTyp") " (" sivasnr-str ")"))
|
||||
(princ (ssg-textf "omni-einfuegen-info"
|
||||
(list (omni:val eintrag "ProfilTyp") sivasnr-str)))
|
||||
(omni:insert-dxf sivasnr-str hoehe drehung)
|
||||
)
|
||||
)
|
||||
@@ -1061,7 +980,7 @@
|
||||
(setq dlg-result (omni:weichen-dialog 90 "Einzelweiche" nil nil))
|
||||
(if dlg-result
|
||||
(omni:insert-from-entry dlg-result)
|
||||
(princ "\n[WEICHE] Abgebrochen.")
|
||||
(princ (ssg-text "omni-abbruch-weiche"))
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
@@ -1070,7 +989,7 @@
|
||||
(setq dlg-result (omni:weichen-dialog 90 "Doppelweiche" nil nil))
|
||||
(if dlg-result
|
||||
(omni:insert-from-entry dlg-result)
|
||||
(princ "\n[WEICHE] Abgebrochen.")
|
||||
(princ (ssg-text "omni-abbruch-weiche"))
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
@@ -1079,7 +998,7 @@
|
||||
(setq dlg-result (omni:weichen-dialog 90 "Dreiwegeweiche" nil nil))
|
||||
(if dlg-result
|
||||
(omni:insert-from-entry dlg-result)
|
||||
(princ "\n[WEICHE] Abgebrochen.")
|
||||
(princ (ssg-text "omni-abbruch-weiche"))
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
@@ -1089,7 +1008,7 @@
|
||||
(setq dlg-result (omni:weichen-dialog 45 "Einzelweiche" nil nil))
|
||||
(if dlg-result
|
||||
(omni:insert-from-entry dlg-result)
|
||||
(princ "\n[WEICHE] Abgebrochen.")
|
||||
(princ (ssg-text "omni-abbruch-weiche"))
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
@@ -1098,7 +1017,7 @@
|
||||
(setq dlg-result (omni:weichen-dialog 45 "Doppelweiche" nil nil))
|
||||
(if dlg-result
|
||||
(omni:insert-from-entry dlg-result)
|
||||
(princ "\n[WEICHE] Abgebrochen.")
|
||||
(princ (ssg-text "omni-abbruch-weiche"))
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
@@ -1107,7 +1026,7 @@
|
||||
(setq dlg-result (omni:weichen-dialog 45 "Dreiwegeweiche" nil nil))
|
||||
(if dlg-result
|
||||
(omni:insert-from-entry dlg-result)
|
||||
(princ "\n[WEICHE] Abgebrochen.")
|
||||
(princ (ssg-text "omni-abbruch-weiche"))
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
@@ -1117,7 +1036,7 @@
|
||||
(setq dlg-result (omni:weichen-dialog 0 "Einzelweiche" nil nil))
|
||||
(if dlg-result
|
||||
(omni:insert-from-entry dlg-result)
|
||||
(princ "\n[WEICHE] Abgebrochen.")
|
||||
(princ (ssg-text "omni-abbruch-weiche"))
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
@@ -1126,7 +1045,7 @@
|
||||
(setq dlg-result (omni:weichen-dialog 0 "Doppelweiche" nil nil))
|
||||
(if dlg-result
|
||||
(omni:insert-from-entry dlg-result)
|
||||
(princ "\n[WEICHE] Abgebrochen.")
|
||||
(princ (ssg-text "omni-abbruch-weiche"))
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
@@ -1135,7 +1054,7 @@
|
||||
(setq dlg-result (omni:weichen-dialog 0 "Dreiwegeweiche" nil nil))
|
||||
(if dlg-result
|
||||
(omni:insert-from-entry dlg-result)
|
||||
(princ "\n[WEICHE] Abgebrochen.")
|
||||
(princ (ssg-text "omni-abbruch-weiche"))
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
@@ -1145,7 +1064,7 @@
|
||||
(setq dlg-result (omni:weichen-dialog 22.5 "Einzelweiche" nil nil))
|
||||
(if dlg-result
|
||||
(omni:insert-from-entry dlg-result)
|
||||
(princ "\n[WEICHE] Abgebrochen.")
|
||||
(princ (ssg-text "omni-abbruch-weiche"))
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
@@ -1154,7 +1073,7 @@
|
||||
(setq dlg-result (omni:weichen-dialog 22.5 "Doppelweiche" nil nil))
|
||||
(if dlg-result
|
||||
(omni:insert-from-entry dlg-result)
|
||||
(princ "\n[WEICHE] Abgebrochen.")
|
||||
(princ (ssg-text "omni-abbruch-weiche"))
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
@@ -1163,7 +1082,7 @@
|
||||
(setq dlg-result (omni:weichen-dialog 22.5 "Dreiwegeweiche" nil nil))
|
||||
(if dlg-result
|
||||
(omni:insert-from-entry dlg-result)
|
||||
(princ "\n[WEICHE] Abgebrochen.")
|
||||
(princ (ssg-text "omni-abbruch-weiche"))
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
@@ -1173,7 +1092,7 @@
|
||||
(setq dlg-result (omni:weichen-dialog nil "Deltaweiche" nil nil))
|
||||
(if dlg-result
|
||||
(omni:insert-from-entry dlg-result)
|
||||
(princ "\n[WEICHE] Abgebrochen.")
|
||||
(princ (ssg-text "omni-abbruch-weiche"))
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
@@ -1182,7 +1101,7 @@
|
||||
(setq dlg-result (omni:weichen-dialog nil "Sternweiche" nil nil))
|
||||
(if dlg-result
|
||||
(omni:insert-from-entry dlg-result)
|
||||
(princ "\n[WEICHE] Abgebrochen.")
|
||||
(princ (ssg-text "omni-abbruch-weiche"))
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
@@ -1212,7 +1131,7 @@
|
||||
;; 1. Block auswaehlen (falls nicht vorselektiert)
|
||||
(if (null ent)
|
||||
(progn
|
||||
(setq sel (entsel "\nOmniflo-Element auswaehlen: "))
|
||||
(setq sel (entsel (ssg-text "omni-edit-prompt-auswahl")))
|
||||
(if sel (setq ent (car sel)))
|
||||
)
|
||||
)
|
||||
@@ -1220,7 +1139,7 @@
|
||||
|
||||
(setq ed (entget ent))
|
||||
(if (/= (cdr (assoc 0 ed)) "INSERT")
|
||||
(progn (ssg-emsg "Kein Block ausgewaehlt!") (ssg-end) (exit))
|
||||
(progn (ssg-emsg (ssg-text "omni-edit-kein-block")) (ssg-end) (exit))
|
||||
)
|
||||
|
||||
;; 2. Bestehende Attribute lesen
|
||||
@@ -1276,7 +1195,7 @@
|
||||
|
||||
(if (null eintrag)
|
||||
(progn
|
||||
(ssg-emsg "Kein Omniflo-Element erkannt! (ARTINR/Blockname nicht im Katalog)")
|
||||
(ssg-emsg (ssg-text "omni-edit-kein-element"))
|
||||
(ssg-end)
|
||||
(exit)
|
||||
)
|
||||
@@ -1287,7 +1206,7 @@
|
||||
(if (= typ "bogen")
|
||||
(progn
|
||||
(setq winkel (cdr (assoc "KurvenWinkel" eintrag)))
|
||||
(setq dlg-result (omni:bogen-dialog winkel hoehe drehung))
|
||||
(setq dlg-result (omni:bogen-dialog winkel hoehe drehung nil))
|
||||
)
|
||||
(progn
|
||||
(setq winkel (cdr (assoc "KurvenWinkel" eintrag)))
|
||||
@@ -1297,7 +1216,7 @@
|
||||
)
|
||||
|
||||
(if (null dlg-result)
|
||||
(progn (princ "\nAbgebrochen.") (ssg-end) (exit))
|
||||
(progn (princ (ssg-text "omni-abbruch")) (ssg-end) (exit))
|
||||
)
|
||||
|
||||
;; 5. Neuen Eintrag und Werte extrahieren
|
||||
@@ -1310,7 +1229,7 @@
|
||||
(setq dxf-pfad (strcat (getenv "DXFM_OMNIFLO") "/" sivasnr-str ".dxf"))
|
||||
(if (not (findfile dxf-pfad))
|
||||
(progn
|
||||
(ssg-emsg (strcat "DXF nicht gefunden: " dxf-pfad))
|
||||
(ssg-emsg (ssg-textf "omni-edit-dxf-nicht-gefunden" (list dxf-pfad)))
|
||||
(ssg-end)
|
||||
(exit)
|
||||
)
|
||||
@@ -1339,9 +1258,12 @@
|
||||
(cons "DREHUNG" (if new-drehung new-drehung (ssg-cfg-or "omniflo" "default_drehung" "0")))))
|
||||
)
|
||||
|
||||
(princ (strcat "\n[OMNI] Element aktualisiert: " sivasnr-str
|
||||
" Hoehe=" (if new-hoehe new-hoehe (ssg-cfg-or "omniflo" "default_hoehe" "2000"))
|
||||
" Drehung=" (if new-drehung new-drehung (ssg-cfg-or "omniflo" "default_drehung" "0"))))
|
||||
(princ (ssg-textf "omni-edit-aktualisiert"
|
||||
(list
|
||||
sivasnr-str
|
||||
(if new-hoehe new-hoehe (ssg-cfg-or "omniflo" "default_hoehe" "2000"))
|
||||
(if new-drehung new-drehung (ssg-cfg-or "omniflo" "default_drehung" "0"))
|
||||
)))
|
||||
|
||||
(ssg-end)
|
||||
(princ)
|
||||
|
||||
+83
-25
@@ -4,26 +4,47 @@ AutoLISP-Routinen für BricsCAD Pro zur automatisierten Erstellung von Förderan
|
||||
|
||||
---
|
||||
|
||||
## Ladereihenfolge (`ssg_load.lsp`)
|
||||
## Menue einrichten und Module laden
|
||||
|
||||
```lisp
|
||||
(load "pfad/ssg_load.lsp")
|
||||
Module werden automatisch ueber `SSG_LIB.mnl` geladen, sobald das Menue
|
||||
einmalig in BricsCAD registriert wurde:
|
||||
|
||||
**Einmalige Einrichtung (BricsCAD-Kommandozeile):**
|
||||
```
|
||||
_MENULOAD → menu/SSG_LIB.mnu auswaehlen
|
||||
```
|
||||
|
||||
Die Laderoutine laedt alle Module automatisch in der richtigen Reihenfolge:
|
||||
BricsCAD laedt daraufhin automatisch `SSG_LIB.mnl`, welches alle Module
|
||||
per `ssg-ensure` initialisiert (Kern: ssg_core/lang/dbg/dialog/layer, dann
|
||||
alle Feature-Module). Details: siehe `../CLAUDE.md` Abschnitt "Lademechanismus".
|
||||
|
||||
1. `ssg_core.lsp` – Kernbibliothek
|
||||
2. `(ssg-load-config)` – JSON-Konfiguration laden (aus `data/json/component_defaults.json`)
|
||||
3. `ssg_dbg.lsp` – Debug-Logging (fuer alle nachfolgenden Module verfuegbar)
|
||||
4. `ssg_dialog.lsp` – Dialog-Patterns
|
||||
5. `ssg_layer.lsp` – Layer-Verwaltung
|
||||
6. `KreiselInsert.lsp` – ILS Kreisel und Eckrad
|
||||
7. `VarioFoerderer.lsp` – Vario-Foerderer und Gefaellestrecken-Basis
|
||||
8. `Gefaellestrecke.lsp` – Gefaellestrecken-Generator (setzt VarioFoerderer voraus)
|
||||
9. `export.lsp` – Export-Funktionen (JSON-Sammler, Python-Export, Omniflo-Export)
|
||||
10. `tests.lsp` – Testbefehle (Python-Aufruf via CALLPYTHON)
|
||||
11. `OmniModulInsert.lsp` – Omniflo-Komponenten (Boegen, Weichen, Verbinder, Edit)
|
||||
12. `SSG_LIB_Commands.lsp` – Dummy-Befehle fuer Menueintraege + SSG_BLOCKEDIT Dispatcher
|
||||
**Manuell laden (Notfall / Entwicklung):**
|
||||
```lisp
|
||||
(load "C:/10-Develop/gitrepos/dxfmakros/Lisp/ssg_load.lsp")
|
||||
```
|
||||
`ssg_load.lsp` laedt alle Module in der richtigen Reihenfolge ohne Menueabhaengigkeit.
|
||||
|
||||
---
|
||||
|
||||
## Status: noch offene Menueintraege (im Menue ausgegraut)
|
||||
|
||||
Die folgenden Menueintraege rufen aktuell nur eine Dummy-Funktion auf (Meldung
|
||||
`[DUMMY]`, keine Geometrie). Sie sind in `menu/SSG_LIB.mnu` mit `~` **ausgegraut**
|
||||
und werden erst bei echter Implementierung wieder aktiviert. Der `~`-Marker steht
|
||||
am Label-Anfang, bei Submenue-Schliessern hinter dem `<-` (`[<-~Label]`).
|
||||
|
||||
| Menuebereich | Eintraege | Definiert in |
|
||||
| --- | --- | --- |
|
||||
| ILS ▸ Zusatzmodul | BTMT-Beladung, BTMT-Entladung | `SSG_LIB_Commands.lsp` |
|
||||
| ILS ▸ Foerderer | Durch TEF angetriebene Strecke; Kurven 90/60/30 links/rechts angetrieben Aussen + Innen (12) | `SSG_LIB_Commands.lsp` |
|
||||
| ILS ▸ Gefaellestrecke | Kurven 90/60/30 links/rechts Gefaellestrecke (6) | `SSG_LIB_Commands.lsp` |
|
||||
| Omniflo ▸ TEF Elemente | UmlenkR/L, AntriebL/R, TEF Gerade, KettenFoerderer (6) | `OmniModulInsert.lsp` |
|
||||
| Omniflo ▸ Verbinder | alle `OMNI_TV_*` (18) | `OmniModulInsert.lsp` |
|
||||
| Omniflo ▸ Boegen fuer Weichen | alle `OMNI_APBW_*` (14) | `OmniModulInsert.lsp` |
|
||||
|
||||
Aktiv (implementiert) sind u.a.: Kreisel, Eckrad, VarioFoerderer, EtageVarioFoerderer,
|
||||
Gefaellestrecke, Omniflo Boegen (APB), Aluprofil-Geraden (AP), alle Weichen
|
||||
(W90/W45/WP/WK/WKomb), Export (Sivas/CSV) und die Tests.
|
||||
|
||||
---
|
||||
|
||||
@@ -112,6 +133,20 @@ Interne Parser-Funktionen (nicht direkt aufrufen):
|
||||
|
||||
---
|
||||
|
||||
### `ssg_lang.lsp` – Sprachumschaltung (Deutsch/Englisch)
|
||||
|
||||
Zentrale Textverwaltung fuer benutzersichtbare Meldungen. Kern-Modul, wird direkt nach `ssg_core` geladen. Wird schrittweise auf weitere Module ausgerollt (siehe `doc/translate.md`).
|
||||
|
||||
| Funktion | Beschreibung |
|
||||
| --- | --- |
|
||||
| `ssg-text key` | Liefert Text zu `key` in `*ssg-lang*`, Fallback `de_DE`, dann Key selbst |
|
||||
| `ssg-textf key werte` | Wie `ssg-text`, ersetzt Platzhalter `%1 %2 ...` durch `werte` (Liste) |
|
||||
|
||||
Sprache umschalten: Befehl `SSG_SPRACHE` (Menue → Konfiguration → Sprache) setzt `*ssg-lang*`
|
||||
live und persistiert via `(setenv "DXFM_LANG" ...)`. Default ohne `DXFM_LANG` ist `"de_DE"`.
|
||||
|
||||
---
|
||||
|
||||
### `ssg_dbg.lsp` – Debug-Logging
|
||||
|
||||
Dateibasiertes Debug-Log mit gepuffertem Schreiben. `dbgf`/`dbg`/`dbgmsg` puffern im Speicher, `dbgreturn` flusht auf die Platte (open/append/close).
|
||||
@@ -239,16 +274,30 @@ Sammelt INSERT-Blöcke aus der Zeichnung und exportiert sie als JSON oder ruft P
|
||||
| Befehl / Funktion | Beschreibung |
|
||||
| --- | --- |
|
||||
| `c:EXPORTSIVAS` | Alle Blöcke als JSON sammeln und `export_sivas.py` aufrufen (Sivas-CSV) |
|
||||
| `c:EXPORTCSV` | Alle Blöcke als JSON sammeln und `export_csv.py` aufrufen (einfache Item-Liste) |
|
||||
| `c:OMNI_EXPORT` | LISP-basierter Omniflo-Export: Blöcke direkt in CSV schreiben (ohne Python) |
|
||||
| `c:EXPORTCSV` | Alle Blöcke als JSON sammeln und `export_csv.py` aufrufen (einfache Item-Liste, inkl. Omniflo Bogen/Weiche/Gerade und abschließender "Omniflo Sum"-Zeile) |
|
||||
| `csv:collect-export-blocks` | Alle INSERT-Blöcke der Zeichnung als JSON-Array sammeln |
|
||||
| `csv:run-export py-skript json-datei output-csv` | Python-Skript mit gesammelten Daten aufrufen |
|
||||
| `csv:read-attribs ename` | Attribute eines INSERT als JSON-Objekt lesen |
|
||||
| `csv:omni-bogen-merkmale ename rot` | Omniflo-Bogen-Merkmale als JSON-String |
|
||||
| `csv:omni-weiche-merkmale ename rot` | Omniflo-Weichen-Merkmale als JSON-String |
|
||||
| `csv:omni-gerade-merkmale ename rot` | Omniflo-Gerade-Merkmale als JSON-String (Länge via `infrastruktur/mm_pro_meter`) |
|
||||
| `c:OMNI_UPDATE_ATTRIBS` | HOEHE/DREHUNG aller Omniflo-Elemente aus der Zeichnung aktualisieren |
|
||||
|
||||
Default-Werte (HOEHE, DREHUNG, Längen) kommen via `ssg-cfg-or` aus Config-Sektion `omniflo`.
|
||||
Der Omniflo-CSV-Export (Bogen/Weiche/Gerade, inkl. Merkmale-Aufbau und Sum-Zeile) läuft
|
||||
seit Entfernung von `c:OMNI_EXPORT` ausschließlich über `c:EXPORTCSV` → `lib/export_csv.py`
|
||||
(`build_bogen_merkmale`, `build_weiche_merkmale`, `build_gerade_merkmale`, `build_omni_sum_merkmale`).
|
||||
|
||||
**Ausgabeordner:** `c:EXPORTSIVAS`/`c:EXPORTCSV` schreiben immer nach `DXFM_RESULTS`.
|
||||
`TEST_EXPORT_ALL` (siehe `tests/test_export_all.lsp`) leitet waehrend des Testlaufs stattdessen
|
||||
nach `DXFM_TESTOUT` um, über die reine Lisp-Sitzungsvariable `*export-test-override*` (wird von
|
||||
`csv:run-export` zusaetzlich zu `DXFM_RESULTS` abgefragt und danach garantiert wieder auf `nil`
|
||||
zurueckgesetzt, auch bei einem Fehler, ueber `vl-catch-all-apply`).
|
||||
|
||||
**Wichtig:** Der Umweg über `*export-test-override*` ist bewusst gewaehlt und **kein**
|
||||
`(setenv "DXFM_RESULTS" ...)`. In BricsCAD/AutoCAD schreibt `(setenv ...)` nicht nur in den
|
||||
Windows-Prozess, sondern dauerhaft in die Profil-Registry der Anwendung – der Wert überlebt
|
||||
damit jeden Neustart und jedes `setenv.bat`, bis er erneut per `(setenv)` überschrieben wird.
|
||||
Ein einziger `(setenv "DXFM_RESULTS" ...)`-Aufruf (z. B. ein frueherer, unvollstaendiger
|
||||
Testlauf) würde `DXFM_RESULTS` für alle künftigen Sitzungen unwiderruflich auf den Testordner
|
||||
umbiegen. Falls das bereits passiert ist, hilft nur ein manuelles
|
||||
`(setenv "DXFM_RESULTS" "<richtiger Pfad>")` in BricsCAD, um den Profil-Wert zu korrigieren.
|
||||
|
||||
---
|
||||
|
||||
@@ -291,9 +340,9 @@ AutoLISP-Implementierung fuer alle Omniflo-Komponenten: Boegen, Weichen, Verbind
|
||||
| Boegen | `OMNI_APB_630_90`, `OMNI_APB_550_675`, `OMNI_APB_630_45`, `OMNI_APB_550_225`, `OMNI_APB_650_180` | Omniflo-Boegen ueber DCL-Dialog einfuegen |
|
||||
| Weichen | `OMNI_W90_*`, `OMNI_W45_*`, `OMNI_WP_*`, `OMNI_WK_*`, `OMNI_WKomb_*` | Omniflo-Weichen (Einfach/Doppel/Dreiwege, Delta, Stern) |
|
||||
| Geraden | `OMNI_AP60`, `OMNI_AP110`, `OMNI_APG110` | Omniflo-Geradenstuecke |
|
||||
| TEF | `OMNI_TEF_UmlenkR/L`, `OMNI_TEF_AntriebL/R`, `OMNI_TEF_Gerade` | Omniflo-TEF-Elemente |
|
||||
| Transferwagen | `OMNI_TV_*` | Transferwagen-Komponenten und Schaltwerke |
|
||||
| Bogenweichen | `OMNI_APBW_*` | Omniflo-Bogenweichen (diverse Radien/Winkel) |
|
||||
| TEF ⚠️ | `OMNI_TEF_UmlenkR/L`, `OMNI_TEF_AntriebL/R`, `OMNI_TEF_Gerade`, `OMNI_KettenFoerderer` | **Dummy** (noch nicht implementiert, im Menue ausgegraut) |
|
||||
| Transferwagen ⚠️ | `OMNI_TV_*` | **Dummy** (noch nicht implementiert, im Menue ausgegraut) |
|
||||
| Bogenweichen ⚠️ | `OMNI_APBW_*` | **Dummy** (noch nicht implementiert, im Menue ausgegraut) |
|
||||
| Bearbeiten | `OMNI_EDIT` | Omniflo-Block selektieren und Attribute bearbeiten |
|
||||
|
||||
---
|
||||
@@ -301,6 +350,8 @@ AutoLISP-Implementierung fuer alle Omniflo-Komponenten: Boegen, Weichen, Verbind
|
||||
### `SSG_LIB_Commands.lsp` – Dummy-Befehle und SSG_BLOCKEDIT
|
||||
|
||||
Platzhalter-Definitionen fuer noch nicht implementierte Menueintraege. Gibt beim Aufruf eine Meldung aus.
|
||||
Alle zugehoerigen Menueintraege sind in `menu/SSG_LIB.mnu` mit `~` ausgegraut (siehe
|
||||
Abschnitt ["Status: noch offene Menueintraege"](#status-noch-offene-menueintraege-im-menue-ausgegraut)).
|
||||
|
||||
Registrierte Dummy-Befehle:
|
||||
|
||||
@@ -313,6 +364,13 @@ Registrierte Dummy-Befehle:
|
||||
|
||||
> `FOERDERANLAGE` ist nicht hier definiert – dieser Befehl ist in `VarioFoerderer.lsp` implementiert.
|
||||
|
||||
**Konfigurationsbefehle** (Menue → Konfiguration):
|
||||
|
||||
| Befehl | Beschreibung |
|
||||
| --- | --- |
|
||||
| `SSG_DIM_SWITCH` | Schaltet zwischen 2D/3D-Bloecken um (setzt `DXFM_DIM`, `DXFM_BLOCKS`, `DXFM_OMNIFLO`) |
|
||||
| `SSG_SPRACHE` | Oeffnet Dialog `sprache.dcl`, setzt `*ssg-lang*` und persistiert via `DXFM_LANG` (siehe [`ssg_lang.lsp`](#ssg_langlsp--sprachumschaltung-deutschenglisch)) |
|
||||
|
||||
**SSG_BLOCKEDIT** – Doppelklick/Kontextmenue-Dispatcher:
|
||||
|
||||
Erkennt den Blocktyp des selektierten INSERT-Blocks und ruft den passenden Bearbeitungsbefehl auf:
|
||||
|
||||
+78
-19
@@ -16,11 +16,6 @@
|
||||
)
|
||||
|
||||
;; --- ILS / Foerderer ---
|
||||
(defun c:ILS_ETF_Etagenfoerderer ()
|
||||
(princ "\n[DUMMY] ILS_ETF_Etagenfoerderer aufgerufen")
|
||||
(princ)
|
||||
)
|
||||
|
||||
(defun c:ILS_TEF_Strecke ()
|
||||
(princ "\n[DUMMY] ILS_TEF_Strecke aufgerufen")
|
||||
(princ)
|
||||
@@ -126,6 +121,55 @@
|
||||
(princ)
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; SSG_DIM_SWITCH - Umschalten zwischen 2D und 3D Bloecken
|
||||
;; Setzt DXFM_DIM, DXFM_BLOCKS und DXFM_OMNIFLO neu
|
||||
;; ============================================================
|
||||
|
||||
(defun c:SSG_DIM_SWITCH ( / dim-neu basis)
|
||||
(setq dim-neu (if (equal (strcase (getenv "DXFM_DIM")) "3D") "2D" "3D"))
|
||||
(setq basis (getenv "DXFMAKRO"))
|
||||
(setenv "DXFM_DIM" dim-neu)
|
||||
(setenv "DXFM_BLOCKS" (strcat basis "\\data\\ils\\" dim-neu))
|
||||
(setenv "DXFM_OMNIFLO" (strcat basis "\\data\\omniflo\\" dim-neu))
|
||||
(princ (ssg-textf "dim-switch-modus" (list dim-neu)))
|
||||
(princ (ssg-textf "dim-switch-blocks" (list (getenv "DXFM_BLOCKS"))))
|
||||
(princ (ssg-textf "dim-switch-omniflo" (list (getenv "DXFM_OMNIFLO"))))
|
||||
(princ)
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; SSG_SPRACHE - Sprache umschalten (Deutsch/Englisch)
|
||||
;; Setzt *ssg-lang* live und persistiert ueber DXFM_LANG
|
||||
;; ============================================================
|
||||
|
||||
(defun ssg-sprache-init ( / idx)
|
||||
(start_list "sprache")
|
||||
(add_list "Deutsch")
|
||||
(add_list "Englisch")
|
||||
(end_list)
|
||||
(setq idx (if (= *ssg-lang* "en_GB") "1" "0"))
|
||||
(set_tile "sprache" idx)
|
||||
)
|
||||
|
||||
(defun ssg-sprache-accept ( / idx neu)
|
||||
(setq idx (get_tile "sprache"))
|
||||
(setq neu (if (= idx "1") "en_GB" "de_DE"))
|
||||
(setq *ssg-lang* neu)
|
||||
(setenv "DXFM_LANG" neu)
|
||||
)
|
||||
|
||||
(defun c:SSG_SPRACHE ()
|
||||
(ssg-dialog-run
|
||||
(strcat (getenv "DXFM_DCL") "/sprache.dcl")
|
||||
"sprache"
|
||||
'ssg-sprache-init
|
||||
'ssg-sprache-accept
|
||||
)
|
||||
(princ (ssg-textf "sprache-gewechselt" (list *ssg-lang*)))
|
||||
(princ)
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; SSG_BLOCKEDIT - Kontextmenue-Dispatcher
|
||||
;; Erkennt den selektierten Blocktyp und ruft den passenden
|
||||
@@ -133,18 +177,17 @@
|
||||
;; ============================================================
|
||||
|
||||
(defun c:SSG_BLOCKEDIT ( / ss ent ed bname attribs teileart)
|
||||
;; Implied Selection pruefen (Block muss vorselektiert sein)
|
||||
;; Block ermitteln: zuerst Implied Selection, dann Picking
|
||||
(setq ss (ssget "I"))
|
||||
(if (null ss)
|
||||
(if (or (null ss) (/= (sslength ss) 1))
|
||||
(progn
|
||||
(princ "\nBitte zuerst einen Block auswaehlen.")
|
||||
(princ)
|
||||
(exit)
|
||||
(princ (ssg-text "cmd-block-auswaehlen"))
|
||||
(setq ss (ssget ":S" '((0 . "INSERT"))))
|
||||
)
|
||||
)
|
||||
(if (/= (sslength ss) 1)
|
||||
(if (null ss)
|
||||
(progn
|
||||
(princ "\nBitte genau einen Block auswaehlen.")
|
||||
(princ (ssg-text "cmd-kein-block-ausgewaehlt"))
|
||||
(princ)
|
||||
(exit)
|
||||
)
|
||||
@@ -155,7 +198,7 @@
|
||||
|
||||
(if (/= (cdr (assoc 0 ed)) "INSERT")
|
||||
(progn
|
||||
(princ "\nKein Block ausgewaehlt.")
|
||||
(princ (ssg-text "cmd-kein-block-ausgewaehlt"))
|
||||
(princ)
|
||||
(exit)
|
||||
)
|
||||
@@ -166,13 +209,13 @@
|
||||
(cond
|
||||
;; Kreisel-Bloecke -> KreiselEdit
|
||||
((wcmatch bname "KREISEL_*")
|
||||
(princ (strcat "\nKreisel bearbeiten: " bname))
|
||||
(princ (ssg-textf "cmd-kreisel-bearbeiten" (list bname)))
|
||||
(c:KreiselEdit)
|
||||
)
|
||||
|
||||
;; Eckrad-Bloecke -> BEDIT (kein eigener Edit-Dialog in LISP)
|
||||
((wcmatch bname "ECKRAD_*")
|
||||
(princ (strcat "\nEckrad bearbeiten: " bname))
|
||||
(princ (ssg-textf "cmd-eckrad-bearbeiten" (list bname)))
|
||||
(command "_.BEDIT" bname)
|
||||
)
|
||||
|
||||
@@ -187,18 +230,34 @@
|
||||
(wcmatch bname "#*")
|
||||
)
|
||||
)
|
||||
(princ (strcat "\nOmniflo Element bearbeiten: " bname))
|
||||
(princ (ssg-textf "cmd-omniflo-bearbeiten" (list bname)))
|
||||
(c:OMNI_EDIT)
|
||||
)
|
||||
|
||||
;; Unbekannter Blocktyp -> Standard BEDIT
|
||||
;; Unbekannter Blocktyp -> natives EATTEDIT (Attribut-Editor)
|
||||
(t
|
||||
(princ (strcat "\nBlock bearbeiten (BEDIT): " bname))
|
||||
(command "_.BEDIT" bname)
|
||||
(princ (ssg-textf "cmd-attribute-bearbeiten" (list bname)))
|
||||
(command "_.EATTEDIT")
|
||||
)
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; C:EATTEDIT - Abfangen des eingebauten Doppelklick-Befehls
|
||||
;; UNDEFINE zwingt BricsCAD, auch interne Aufrufe ueber LISP
|
||||
;; zu leiten. Fallback auf _.EATTEDIT (Dot-Prefix = nativ,
|
||||
;; kein Loop) fuer unbekannte Bloecke.
|
||||
;; ============================================================
|
||||
(defun c:EATTEDIT ()
|
||||
(c:SSG_BLOCKEDIT)
|
||||
)
|
||||
(if (not *ssg-eattedit-undefined*)
|
||||
(progn
|
||||
(command "_.UNDEFINE" "EATTEDIT")
|
||||
(setq *ssg-eattedit-undefined* t)
|
||||
)
|
||||
)
|
||||
|
||||
(princ "\nSSG_LIB_Commands.lsp geladen - Dummy-Befehle registriert.")
|
||||
(princ)
|
||||
|
||||
+14
-1362
File diff suppressed because it is too large
Load Diff
+114
-277
@@ -4,12 +4,75 @@
|
||||
;; Enthaelt:
|
||||
;; - JSON-Sammler (csv:collect-export-blocks, csv:run-export)
|
||||
;; - Python-basierter Export: EXPORTSIVAS, EXPORTCSV
|
||||
;; - LISP-basierter Omniflo-Export: OMNI_EXPORT
|
||||
;;
|
||||
;; Alle Blockname-Muster dieses Moduls sind zentral in cfg/export.cfg
|
||||
;; (INI-Style, Abschnitt [blockpattern]) deklariert und werden beim
|
||||
;; Laden des Moduls einmalig eingelesen (export:load-cfg).
|
||||
;; Datei-/Skriptnamen sind fest im Code hinterlegt (*export-filenames*).
|
||||
;; ============================================================
|
||||
|
||||
|
||||
;; --- Export-Konfiguration aus cfg/export.cfg laden ---
|
||||
;; Nutzt den zentralen INI-Parser aus ssg_core.lsp (ssg-load-ini / ssg-ini-get /
|
||||
;; ssg-ini-list), damit fuer alle Module derselbe .cfg-Standard gilt.
|
||||
(defun export:load-cfg ( / cfg-pfad)
|
||||
(setq cfg-pfad (strcat (getenv "DXFM_CFG") "/export.cfg"))
|
||||
(setq *export-cfg* (ssg-load-ini cfg-pfad))
|
||||
(if (null *export-cfg*)
|
||||
(princ (ssg-textf "exp-cfg-not-found" (list cfg-pfad)))
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
|
||||
;; --- Einzelwert aus *export-cfg* lesen, mit Fallback ---
|
||||
;; section = "blockpattern"
|
||||
(defun export:cfg (section key default)
|
||||
(ssg-ini-get *export-cfg* section key default)
|
||||
)
|
||||
|
||||
;; --- Muster aus [blockpattern] als normalisierter wcmatch-String ---
|
||||
;; key = Config-Key, z.B. "pattern_kreisel"
|
||||
;; default-str = Fallback-Wert als kommagetrennter String, falls Config fehlt
|
||||
;; Rueckgabe: kommagetrennter String ohne Leerzeichen, z.B. "KR_*,KREISEL_*"
|
||||
(defun export:pattern (key default-str)
|
||||
(ssg-ini-list *export-cfg* "blockpattern" key default-str)
|
||||
)
|
||||
|
||||
;; Beim Laden des Moduls einmalig einlesen (Lazy-Loading via ssg-ensure "export")
|
||||
(export:load-cfg)
|
||||
|
||||
;; --- Test-Override fuer den Ausgabeordner (nur Lisp-Sitzungsspeicher) ---
|
||||
;; Wird ausschliesslich von TEST_EXPORT_ALL (tests/test_export_all.lsp)
|
||||
;; waehrend des Testlaufs auf DXFM_TESTOUT gesetzt und danach garantiert
|
||||
;; wieder auf nil zurueckgesetzt. Bewusst KEIN (setenv "DXFM_RESULTS" ...):
|
||||
;; (setenv ...) schreibt in BricsCAD dauerhaft in die Profil-Registry und
|
||||
;; ueberlebt damit jeden Neustart.
|
||||
(setq *export-test-override* nil)
|
||||
|
||||
|
||||
;; --- Feste Datei-/Skriptnamen dieses Moduls (keine Config, direkt im Code) ---
|
||||
(setq *export-filenames*
|
||||
(list
|
||||
(cons "raw_json_datei" "export_raw.json")
|
||||
(cons "sivas_script" "export_sivas.py")
|
||||
(cons "sivas_csv" "export_sivas.csv")
|
||||
(cons "csv_script" "export_csv.py")
|
||||
(cons "csv_csv" "export.csv")
|
||||
)
|
||||
)
|
||||
|
||||
;; --- Dateinamen aus *export-filenames* lesen ---
|
||||
(defun export:filename (key)
|
||||
(cdr (assoc key *export-filenames*))
|
||||
)
|
||||
|
||||
|
||||
;; --- String fuer JSON escapen (Anfuehrungszeichen/Backslash) ---
|
||||
;; Konvertiert nicht-String-Werte (z.B. T, nil, Zahlen) defensiv in String.
|
||||
(defun csv:json-escape (s)
|
||||
(if (not (= (type s) 'STR))
|
||||
(setq s (if s (vl-princ-to-string s) ""))
|
||||
)
|
||||
(setq s (vl-string-subst "\\\\" "\\" s))
|
||||
(vl-string-subst "\\\"" "\"" s)
|
||||
)
|
||||
@@ -56,10 +119,7 @@
|
||||
(setq rotation (cdr (assoc 50 ed)))
|
||||
(setq handle (cdr (assoc 5 ed)))
|
||||
(if (null rotation) (setq rotation 0.0))
|
||||
(if (cdr (assoc 66 ed))
|
||||
(setq attribs (csv:read-attribs ename))
|
||||
(setq attribs "{}")
|
||||
)
|
||||
(setq attribs (csv:read-attribs ename))
|
||||
(strcat
|
||||
" {\"block_name\":\"" (csv:json-escape blk-name) "\""
|
||||
",\"layer\":\"" (csv:json-escape layer) "\""
|
||||
@@ -80,6 +140,7 @@
|
||||
;; AP110* = Omniflo Geraden
|
||||
;; Omniflo Boegen/Weichen = rein numerische Blocknamen (SivasNr)
|
||||
;; Vario* = VarioFoerderer-Bloecke
|
||||
;; GF_* = Gefaellestrecke Compound-Bloecke
|
||||
;; Gibt Auswahlsatz zurueck oder nil.
|
||||
(defun csv:collect-export-blocks ( / ss-all ss-out i ename ed bname)
|
||||
(setq ss-all (ssget "X" (list (cons 0 "INSERT"))))
|
||||
@@ -91,10 +152,14 @@
|
||||
(setq ed (entget ename))
|
||||
(setq bname (cdr (assoc 2 ed)))
|
||||
(if (or
|
||||
(wcmatch bname "KR_*,KREISEL_*,ECKRAD_*")
|
||||
(wcmatch (strcase bname) "AP110*,AP_110*")
|
||||
(wcmatch bname "Vario*,Staustrecke*,AUS_Element*,EIN_Element*")
|
||||
(wcmatch bname (export:pattern "pattern_kreisel" "KR_*,KREISEL_*,ECKRAD_*"))
|
||||
(wcmatch (strcase bname) (export:pattern "pattern_gerade" "AP110*,AP_110*"))
|
||||
(wcmatch bname (export:pattern "pattern_strecke"
|
||||
"Vario*,Staustrecke*,AUS_Element*,EIN_Element*,VF_*,GF_*"))
|
||||
;; Rein numerische Namen = Omniflo SivasNr (Boegen/Weichen)
|
||||
;; Rein LISP-intern (Python klassifiziert Omniflo stattdessen
|
||||
;; ueber exakten Katalog-Match), daher fest im Code statt in
|
||||
;; cfg/export.cfg.
|
||||
(wcmatch bname "#*")
|
||||
)
|
||||
(ssadd ename ss-out)
|
||||
@@ -120,7 +185,7 @@
|
||||
(setq bname (cdr (assoc 2 ed)))
|
||||
(setq teileart (csv:get-attrib ename "TEILEART"))
|
||||
(if (or teileart
|
||||
(wcmatch (strcase bname) "AP110*,AP_110*"))
|
||||
(wcmatch (strcase bname) (export:pattern "pattern_gerade" "AP110*,AP_110*")))
|
||||
(progn
|
||||
(omni:set-hoehe-attrib ename)
|
||||
(omni:set-drehung-attrib ename)
|
||||
@@ -139,31 +204,46 @@
|
||||
;; py-name = Python-Skript-Name (z.B. "export_csv.py")
|
||||
;; csv-name = Ergebnis-CSV-Name (z.B. "export.csv")
|
||||
(defun csv:run-export (label py-name csv-name / ss i ename fh out-pfad
|
||||
py-skript ergebnis-pfad cmd first-block count)
|
||||
py-skript ergebnis-pfad cmd first-block count out-dir)
|
||||
;; Vor dem Export: IDs aller Bloecke sicherstellen und Duplikate korrigieren
|
||||
(princ (strcat "\n[" label "] Pruefe und vergebe IDs..."))
|
||||
(princ (ssg-textf "exp-check-ids" (list label)))
|
||||
(ssg-id-check-all)
|
||||
;; Vor dem Export HOEHE/DREHUNG aller Omniflo-Elemente aktualisieren
|
||||
(princ (strcat "\n[" label "] Aktualisiere Hoehe/Drehung..."))
|
||||
(princ (ssg-textf "exp-update-hoehe-drehung" (list label)))
|
||||
(omni:update-all-attribs)
|
||||
(princ (strcat "\n[" label "] Sammle relevante Bloecke..."))
|
||||
(princ (ssg-textf "exp-collect-blocks" (list label)))
|
||||
|
||||
(setq ss (csv:collect-export-blocks))
|
||||
(if (null ss)
|
||||
(progn
|
||||
(princ (strcat "\n[" label "] Keine relevanten Bloecke gefunden."))
|
||||
(princ (ssg-textf "exp-no-blocks-found" (list label)))
|
||||
(princ)
|
||||
)
|
||||
(progn
|
||||
(setq count (sslength ss))
|
||||
(princ (strcat "\n[" label "] " (itoa count) " Bloecke gefunden."))
|
||||
(princ (ssg-textf "exp-blocks-found" (list label count)))
|
||||
|
||||
;; Ausgabeordner: DXFM_RESULTS, ausser *export-test-override* ist gesetzt
|
||||
;; (nur waehrend TEST_EXPORT_ALL, siehe tests/test_export_all.lsp).
|
||||
;; WICHTIG: Hier bewusst KEIN (setenv "DXFM_RESULTS" ...) verwenden!
|
||||
;; (setenv ...) schreibt in BricsCAD dauerhaft in die Profil-Registry
|
||||
;; und ueberlebt damit jeden Neustart - ein einziger Testlauf wuerde
|
||||
;; DXFM_RESULTS fuer alle zukuenftigen Sitzungen unwiderruflich auf den
|
||||
;; Testordner umbiegen. *export-test-override* ist eine reine
|
||||
;; Lisp-Variable (nur Prozess-/Sitzungsspeicher) und daher sicher.
|
||||
(setq out-dir (if *export-test-override*
|
||||
*export-test-override*
|
||||
(getenv "DXFM_RESULTS")))
|
||||
(if (not (vl-file-directory-p out-dir)) (vl-mkdir out-dir))
|
||||
(princ (ssg-textf "exp-output-dir" (list label out-dir)))
|
||||
|
||||
;; JSON-Datei zusammenbauen
|
||||
(setq out-pfad (strcat (getenv "DXFM_RESULTS") "/export_raw.json"))
|
||||
(setq out-pfad (strcat out-dir "/"
|
||||
(export:filename "raw_json_datei")))
|
||||
(setq fh (open out-pfad "w"))
|
||||
(if (null fh)
|
||||
(progn
|
||||
(princ (strcat "\n[" label "] FEHLER: Kann Datei nicht oeffnen: " out-pfad))
|
||||
(princ (ssg-textf "exp-file-open-error" (list label out-pfad)))
|
||||
(princ)
|
||||
)
|
||||
(progn
|
||||
@@ -180,22 +260,22 @@
|
||||
)
|
||||
(write-line "]" fh)
|
||||
(close fh)
|
||||
(princ (strcat "\n[" label "] JSON geschrieben: " out-pfad))
|
||||
(princ (ssg-textf "exp-json-written" (list label out-pfad)))
|
||||
|
||||
;; Python-Skript aufrufen
|
||||
(setq py-skript (strcat (getenv "DXFM_LIB") "/" py-name))
|
||||
(if (findfile py-skript)
|
||||
(progn
|
||||
(setq ergebnis-pfad (strcat (getenv "DXFM_RESULTS") "/" csv-name))
|
||||
(setq ergebnis-pfad (strcat out-dir "/" csv-name))
|
||||
(setq cmd (strcat "python \"" py-skript "\""
|
||||
" \"" out-pfad "\""
|
||||
" \"" (getenv "DXFM_DATA") "\""
|
||||
" \"" ergebnis-pfad "\""))
|
||||
(princ (strcat "\n[" label "] Rufe Python auf..."))
|
||||
(princ (ssg-textf "exp-calling-python" (list label)))
|
||||
(startapp "cmd" (strcat "/c " cmd))
|
||||
(princ (strcat "\n[" label "] Export gestartet: " ergebnis-pfad))
|
||||
(princ (ssg-textf "exp-export-started" (list label ergebnis-pfad)))
|
||||
)
|
||||
(princ (strcat "\n[" label "] FEHLER: Python-Skript nicht gefunden: " py-skript))
|
||||
(princ (ssg-textf "exp-python-not-found" (list label py-skript)))
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -207,22 +287,21 @@
|
||||
|
||||
;; --- EXPORTSIVAS: Sivas-spezifischer CSV-Export mit Summierungszeilen ---
|
||||
(defun c:EXPORTSIVAS ()
|
||||
(csv:run-export "EXPORTSIVAS" "export_sivas.py" "export_sivas.csv")
|
||||
(csv:run-export "EXPORTSIVAS"
|
||||
(export:filename "sivas_script")
|
||||
(export:filename "sivas_csv"))
|
||||
)
|
||||
|
||||
;; --- EXPORTCSV: Einfache Item-Liste aller Bloecke (ohne Summierung) ---
|
||||
(defun c:EXPORTCSV ()
|
||||
(csv:run-export "EXPORTCSV" "export_csv.py" "export.csv")
|
||||
(csv:run-export "EXPORTCSV"
|
||||
(export:filename "csv_script")
|
||||
(export:filename "csv_csv"))
|
||||
)
|
||||
|
||||
|
||||
;; ============================================================
|
||||
;; LISP-basierter Omniflo-Export (ohne Python)
|
||||
;;
|
||||
;; Erkennt Omniflo Bloecke anhand Attribute:
|
||||
;; TEILEART = "Omniflo Kurve" -> Bogen
|
||||
;; TEILEART = "Omniflo Weiche" -> Weiche
|
||||
;; Blockname AP110* -> Gerade
|
||||
;; OMNIFLO HOEHE/DREHUNG AKTUALISIEREN
|
||||
;; ============================================================
|
||||
|
||||
;; --- Attribut-Wert eines INSERT-Blocks nach Tag lesen ---
|
||||
@@ -245,249 +324,6 @@
|
||||
atag
|
||||
)
|
||||
|
||||
|
||||
;; --- Omniflo-Block klassifizieren ---
|
||||
;; Gibt "bogen", "weiche", "gerade" oder nil zurueck
|
||||
(defun csv:omni-classify (ename bname / teileart)
|
||||
(setq teileart (csv:get-attrib ename "TEILEART"))
|
||||
(cond
|
||||
((and teileart (= teileart "Omniflo Kurve")) "bogen")
|
||||
((and teileart (= teileart "Omniflo Weiche")) "weiche")
|
||||
((wcmatch (strcase bname) "AP110*,AP_110*") "gerade")
|
||||
(t nil)
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
;; --- Weichen-Subtyp fuer Omniflo Sum Zaehlung bestimmen ---
|
||||
(defun csv:omni-weichensubtyp (ename / wtyp beschr)
|
||||
(setq wtyp (csv:get-attrib ename "WEICHENTYP"))
|
||||
(setq beschr (csv:get-attrib ename "BESCHR"))
|
||||
(if (null wtyp) (setq wtyp ""))
|
||||
(if (null beschr) (setq beschr ""))
|
||||
(cond
|
||||
((vl-string-search "WEICHENK" (strcase beschr)) "weichenkoerper")
|
||||
((= wtyp "Einzelweiche") "einzelweiche")
|
||||
((= wtyp "Doppelweiche") "doppelweiche")
|
||||
((= wtyp "Dreiwegeweiche") "dreiwegeweiche")
|
||||
((= wtyp "Deltaweiche") "deltaweiche")
|
||||
((= wtyp "Dreifachweiche") "deltaweiche")
|
||||
((= wtyp "Sternweiche") "sternweiche")
|
||||
((vl-string-search "DELTA" (strcase beschr)) "deltaweiche")
|
||||
((vl-string-search "STAR" (strcase beschr)) "sternweiche")
|
||||
(t "einzelweiche")
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
;; --- Merkmale-JSON fuer einen Bogen bauen ---
|
||||
(defun csv:omni-bogen-merkmale (ename rotation / winkel radius sivasnr hoehe drehung)
|
||||
(setq winkel (or (csv:get-attrib ename "WINKEL") "0"))
|
||||
(setq radius (or (csv:get-attrib ename "RADIUS") "0"))
|
||||
(setq sivasnr (or (csv:get-attrib ename "ARTINR") ""))
|
||||
(setq hoehe (or (csv:get-attrib ename "HOEHE") (ssg-cfg-or "omniflo" "default_hoehe" "2000")))
|
||||
(setq drehung (or (csv:get-attrib ename "DREHUNG") (rtos rotation 2 1)))
|
||||
(strcat "{\"Kurvenwinkel\":" winkel
|
||||
",\"Radius\":" radius
|
||||
",\"H\\u00f6he\":\"" (csv:json-escape hoehe) "\""
|
||||
",\"Drehung\":" drehung
|
||||
",\"SivasNummer\":\"" (csv:json-escape sivasnr) "\"}")
|
||||
)
|
||||
|
||||
|
||||
;; --- Merkmale-JSON fuer eine Weiche bauen ---
|
||||
(defun csv:omni-weiche-merkmale (ename rotation / wtyp winkel sivasnr tef-str hoehe drehung)
|
||||
(setq wtyp (or (csv:get-attrib ename "WEICHENTYP") "Einzelweiche"))
|
||||
(setq winkel (or (csv:get-attrib ename "WINKEL") "0"))
|
||||
(setq sivasnr (or (csv:get-attrib ename "ARTINR") ""))
|
||||
(setq tef-str (csv:get-attrib ename "SIVASNR_TEF"))
|
||||
(setq hoehe (or (csv:get-attrib ename "HOEHE") (ssg-cfg-or "omniflo" "default_hoehe" "2000")))
|
||||
(setq drehung (or (csv:get-attrib ename "DREHUNG") (rtos rotation 2 1)))
|
||||
(strcat "{\"Weichentyp\":\"" (csv:json-escape wtyp) "\""
|
||||
",\"Richtung\":\"False\""
|
||||
",\"Weichenwinkel\":" winkel
|
||||
",\"H\\u00f6he\":\"" (csv:json-escape hoehe) "\""
|
||||
",\"Drehung\":" drehung
|
||||
",\"Antrieb Kurve\":" (if (and tef-str (> (strlen tef-str) 0)) "true" "false")
|
||||
",\"SivasNummer\":\"" (csv:json-escape sivasnr) "\"}")
|
||||
)
|
||||
|
||||
|
||||
;; --- Merkmale-JSON fuer eine Gerade bauen ---
|
||||
(defun csv:omni-gerade-merkmale (ename rotation / laenge hoehe drehung)
|
||||
(setq laenge (csv:get-attrib ename "LAENGE"))
|
||||
(if (null laenge) (setq laenge (csv:get-attrib ename "A")))
|
||||
(if (null laenge) (setq laenge (ssg-cfg-or "omniflo" "default_gerade_laenge" "2000")))
|
||||
(setq hoehe (or (csv:get-attrib ename "HOEHE") (ssg-cfg-or "omniflo" "default_hoehe" "2000")))
|
||||
(setq drehung (or (csv:get-attrib ename "DREHUNG") (rtos rotation 2 1)))
|
||||
(strcat "{\"Anzahl der Separatoren\":\"0\""
|
||||
",\"L\\u00e4nge in Meter\":\"" (csv:json-escape (rtos (/ (atof laenge) (ssg-cfg-or "infrastruktur" "mm_pro_meter" 1000.0)) 2 2)) "\""
|
||||
",\"Winkel\":\"0\""
|
||||
",\"Anzahl der Scanner\":0"
|
||||
",\"H\\u00f6he oben\":\"" (csv:json-escape hoehe) "\""
|
||||
",\"H\\u00f6he unten\":\"" (csv:json-escape hoehe) "\""
|
||||
",\"Drehung\":" drehung
|
||||
",\"SivasNummer\":\"\"}")
|
||||
)
|
||||
|
||||
|
||||
;; --- Omniflo Sum Zeile bauen ---
|
||||
(defun csv:omni-sum-zeile (elem-nr cnt-boegen cnt-wk cnt-einzel cnt-delta cnt-doppel cnt-stern len-ap110 len-ap60)
|
||||
(strcat (itoa elem-nr)
|
||||
";\"Omniflo Sum\";\"autogenerated_of_json\";\"Omniflo sum\";1;"
|
||||
"{\"Anzahl B\\u00f6gen\":" (itoa cnt-boegen)
|
||||
",\"Anzahl Weichengrundk\\u00f6rper\":" (itoa cnt-wk)
|
||||
",\"Anzahl Einwegweichen\":" (itoa cnt-einzel)
|
||||
",\"Anzahl Deltaweichen\":" (itoa cnt-delta)
|
||||
",\"Anzahl Doppelweichen und Dreiwegeweichen\":" (itoa cnt-doppel)
|
||||
",\"Anzahl Sternweichen\":" (itoa cnt-stern)
|
||||
",\"Gesamtl\\u00e4nge AP110\":" (rtos len-ap110 2 1)
|
||||
",\"Gesamtl\\u00e4nge AP60\":" (rtos len-ap60 2 1)
|
||||
"}")
|
||||
)
|
||||
|
||||
|
||||
|
||||
;; ============================================================
|
||||
;; C:OMNI_EXPORT - Omniflo-Elemente zaehlen und als CSV exportieren
|
||||
;; Rein LISP-basiert, kein Python noetig.
|
||||
;; ============================================================
|
||||
(defun c:OMNI_EXPORT ( / ss-all i ename ed bname rotation typ
|
||||
elem-nr cnt-boegen cnt-weichen cnt-geraden
|
||||
cnt-wk cnt-einzel cnt-delta cnt-doppel cnt-stern
|
||||
len-ap110 len-ap60 laenge-str
|
||||
fh out-pfad lines subtyp merkmale)
|
||||
|
||||
;; Vor dem Export: IDs aller Bloecke sicherstellen und Duplikate korrigieren
|
||||
(princ "\n[OMNI_EXPORT] Pruefe und vergebe IDs...")
|
||||
(ssg-id-check-all)
|
||||
;; Vor dem Export HOEHE/DREHUNG aller Omniflo-Elemente aktualisieren
|
||||
(princ "\n[OMNI_EXPORT] Aktualisiere Hoehe/Drehung...")
|
||||
(omni:update-all-attribs)
|
||||
(princ "\n[OMNI_EXPORT] Sammle Omniflo-Elemente...")
|
||||
(setq ss-all (ssget "X" (list (cons 0 "INSERT"))))
|
||||
(if (null ss-all)
|
||||
(progn (princ "\n[OMNI_EXPORT] Keine INSERT-Bloecke in der Zeichnung.") (princ))
|
||||
(progn
|
||||
(setq elem-nr 0)
|
||||
(setq cnt-boegen 0 cnt-weichen 0 cnt-geraden 0)
|
||||
(setq cnt-wk 0 cnt-einzel 0 cnt-delta 0 cnt-doppel 0 cnt-stern 0)
|
||||
(setq len-ap110 0.0 len-ap60 0.0)
|
||||
(setq lines '())
|
||||
|
||||
(setq i 0)
|
||||
(while (setq ename (ssname ss-all i))
|
||||
(setq ed (entget ename))
|
||||
(setq bname (cdr (assoc 2 ed)))
|
||||
(setq rotation (cdr (assoc 50 ed)))
|
||||
(if (null rotation) (setq rotation 0.0))
|
||||
(setq rotation (* (/ rotation pi) 180.0))
|
||||
|
||||
(setq typ (csv:omni-classify ename bname))
|
||||
|
||||
(cond
|
||||
((= typ "bogen")
|
||||
(setq elem-nr (1+ elem-nr))
|
||||
(setq cnt-boegen (1+ cnt-boegen))
|
||||
(setq merkmale (csv:omni-bogen-merkmale ename rotation))
|
||||
(setq lines (cons
|
||||
(strcat (itoa elem-nr)
|
||||
";\"Omniflo Kurve\""
|
||||
";\"" (or (csv:get-attrib ename "ID") "0000") "\""
|
||||
";\"" (strcat "OFBogen :" (itoa cnt-boegen)) "\""
|
||||
";1"
|
||||
";" merkmale)
|
||||
lines))
|
||||
)
|
||||
|
||||
((= typ "weiche")
|
||||
(setq elem-nr (1+ elem-nr))
|
||||
(setq cnt-weichen (1+ cnt-weichen))
|
||||
(setq subtyp (csv:omni-weichensubtyp ename))
|
||||
(cond
|
||||
((= subtyp "weichenkoerper") (setq cnt-wk (1+ cnt-wk)))
|
||||
((= subtyp "einzelweiche") (setq cnt-einzel (1+ cnt-einzel)))
|
||||
((= subtyp "deltaweiche") (setq cnt-delta (1+ cnt-delta)))
|
||||
((= subtyp "sternweiche") (setq cnt-stern (1+ cnt-stern)))
|
||||
(t (setq cnt-doppel (1+ cnt-doppel)))
|
||||
)
|
||||
(setq merkmale (csv:omni-weiche-merkmale ename rotation))
|
||||
(setq lines (cons
|
||||
(strcat (itoa elem-nr)
|
||||
";\"Omniflo Weiche\""
|
||||
";\"" (or (csv:get-attrib ename "ID") "0000") "\""
|
||||
";\"" (strcat "OFWeiche :" (itoa cnt-weichen)) "\""
|
||||
";1"
|
||||
";" merkmale)
|
||||
lines))
|
||||
)
|
||||
|
||||
((= typ "gerade")
|
||||
(setq elem-nr (1+ elem-nr))
|
||||
(setq cnt-geraden (1+ cnt-geraden))
|
||||
(setq laenge-str (csv:get-attrib ename "LAENGE"))
|
||||
(if (null laenge-str) (setq laenge-str (csv:get-attrib ename "A")))
|
||||
(if (and laenge-str (> (strlen laenge-str) 0))
|
||||
(setq len-ap110 (+ len-ap110 (atof laenge-str)))
|
||||
(setq len-ap110 (+ len-ap110 (float (atoi (ssg-cfg-or "omniflo" "default_gerade_laenge" "2000")))))
|
||||
)
|
||||
(setq merkmale (csv:omni-gerade-merkmale ename rotation))
|
||||
(setq lines (cons
|
||||
(strcat (itoa elem-nr)
|
||||
";\"Omniflo Gerade\""
|
||||
";\"" (or (csv:get-attrib ename "ID") "0000") "\""
|
||||
";\"" (strcat "OFGerade :" (itoa cnt-geraden)) "\""
|
||||
";1"
|
||||
";" merkmale)
|
||||
lines))
|
||||
)
|
||||
)
|
||||
|
||||
(setq i (1+ i))
|
||||
)
|
||||
|
||||
(princ (strcat "\n[OMNI_EXPORT] Gefunden: "
|
||||
(itoa cnt-boegen) " Boegen, "
|
||||
(itoa cnt-weichen) " Weichen, "
|
||||
(itoa cnt-geraden) " Geraden"))
|
||||
|
||||
(if (= elem-nr 0)
|
||||
(princ "\n[OMNI_EXPORT] Keine Omniflo-Elemente gefunden.")
|
||||
(progn
|
||||
(setq out-pfad (strcat (getenv "DXFM_RESULTS") "/omniflo_export.csv"))
|
||||
(setq fh (open out-pfad "w"))
|
||||
(if (null fh)
|
||||
(princ (strcat "\n[OMNI_EXPORT] FEHLER: Kann Datei nicht oeffnen: " out-pfad))
|
||||
(progn
|
||||
(write-line "Elementnummer;TeileArt;TeileId;Bezeichnung;Anzahl;Merkmale" fh)
|
||||
(foreach ln (reverse lines)
|
||||
(write-line ln fh)
|
||||
)
|
||||
(write-line
|
||||
(csv:omni-sum-zeile (1+ elem-nr)
|
||||
cnt-boegen cnt-wk cnt-einzel cnt-delta cnt-doppel cnt-stern
|
||||
len-ap110 len-ap60)
|
||||
fh)
|
||||
(close fh)
|
||||
(princ (strcat "\n[OMNI_EXPORT] CSV geschrieben: " out-pfad))
|
||||
(princ (strcat "\n[OMNI_EXPORT] Omniflo Sum: "
|
||||
(itoa cnt-boegen) " Boegen, "
|
||||
(itoa (+ cnt-einzel cnt-doppel cnt-delta cnt-stern cnt-wk)) " Weichen, "
|
||||
(rtos len-ap110 2 0) " mm AP110"))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
|
||||
|
||||
;; ============================================================
|
||||
;; OMNIFLO HOEHE/DREHUNG AKTUALISIEREN
|
||||
;; ============================================================
|
||||
|
||||
;; --- Hoehe eines Omniflo-Blocks aus der Zeichnung ermitteln ---
|
||||
;; Liest z-Koordinate des Einfuegepunkts.
|
||||
;; Falls der Block KS_EIN, KS_AUS oder K1-K4 enthaelt,
|
||||
@@ -508,7 +344,8 @@
|
||||
(if (= (cdr (assoc 0 sub-ed)) "INSERT")
|
||||
(progn
|
||||
(setq sub-bname (strcase (cdr (assoc 2 sub-ed))))
|
||||
(if (wcmatch sub-bname "KS_EIN,KS_AUS,K1,K2,K3,K4")
|
||||
(if (wcmatch sub-bname
|
||||
(export:pattern "pattern_ks_subblocks" "KS_EIN,KS_AUS,K1,K2,K3,K4"))
|
||||
(progn
|
||||
(setq sub-pt (cdr (assoc 10 sub-ed)))
|
||||
(setq z-list (cons (if (caddr sub-pt) (caddr sub-pt) 0.0) z-list))
|
||||
@@ -562,7 +399,7 @@
|
||||
(defun c:OMNI_UPDATE_ATTRIBS ( / ss i ename ed bname teileart count)
|
||||
(setq ss (ssget "X" (list (cons 0 "INSERT"))))
|
||||
(if (null ss)
|
||||
(princ "\n[OMNI_UPDATE] Keine INSERT-Bloecke in der Zeichnung.")
|
||||
(princ (ssg-text "exp-omni-no-inserts"))
|
||||
(progn
|
||||
(setq count 0)
|
||||
(setq i 0)
|
||||
@@ -572,7 +409,7 @@
|
||||
;; Nur Omniflo-Elemente (erkennbar an TEILEART-Attribut oder AP110-Blockname)
|
||||
(setq teileart (csv:get-attrib ename "TEILEART"))
|
||||
(if (or teileart
|
||||
(wcmatch (strcase bname) "AP110*,AP_110*"))
|
||||
(wcmatch (strcase bname) (export:pattern "pattern_gerade" "AP110*,AP_110*")))
|
||||
(progn
|
||||
(omni:set-hoehe-attrib ename)
|
||||
(omni:set-drehung-attrib ename)
|
||||
@@ -581,7 +418,7 @@
|
||||
)
|
||||
(setq i (1+ i))
|
||||
)
|
||||
(princ (strcat "\n[OMNI_UPDATE] " (itoa count) " Elemente aktualisiert (HOEHE, DREHUNG)."))
|
||||
(princ (ssg-textf "exp-omni-updated" (list count)))
|
||||
)
|
||||
)
|
||||
(princ)
|
||||
|
||||
@@ -17,12 +17,12 @@
|
||||
(setq fh (open return-datei "r"))
|
||||
(setq zeile (read-line fh))
|
||||
(close fh)
|
||||
(princ (strcat "\n[SSG_LIB] Python Rueckgabe: " zeile))
|
||||
(princ (ssg-textf "extcall-python-rueckgabe" (list zeile)))
|
||||
)
|
||||
(princ "\n[SSG_LIB] WARNUNG: Keine Rueckgabe von Python erhalten.")
|
||||
(princ (ssg-text "extcall-keine-rueckgabe"))
|
||||
)
|
||||
)
|
||||
(princ (strcat "\n[SSG_LIB] FEHLER: " py-skript " nicht gefunden!"))
|
||||
(princ (ssg-textf "extcall-skript-nicht-gefunden" (list py-skript)))
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
|
||||
+149
-9
@@ -35,7 +35,7 @@
|
||||
(setvar "CMDECHO" 0)
|
||||
(command "_undo" "_G")
|
||||
(graphscr)
|
||||
(if titel (prompt (strcat "\n***** " titel " *****\n")))
|
||||
(if titel (prompt (ssg-textf "core-start-titel" (list titel))))
|
||||
(princ)
|
||||
)
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
(defun ssg-errhan (em)
|
||||
(if (= em "Function cancelled")
|
||||
(princ)
|
||||
(progn (princ "\nFehler: ") (princ em))
|
||||
(progn (princ (ssg-text "core-errhan-fehler")) (princ em))
|
||||
)
|
||||
(command)
|
||||
(command)
|
||||
@@ -85,11 +85,11 @@
|
||||
(if defa
|
||||
(progn
|
||||
(initget 1 "Yes No Yes")
|
||||
(= (getkword (strcat "\n" prompt-text " Y/N <Y>: ")) "No")
|
||||
(= (getkword (strcat "\n" prompt-text (ssg-text "ques-yn-default-yes"))) "No")
|
||||
)
|
||||
(progn
|
||||
(initget 1 "Yes No No")
|
||||
(= (getkword (strcat "\n" prompt-text " Y/N <N>: ")) "Yes")
|
||||
(= (getkword (strcat "\n" prompt-text (ssg-text "ques-yn-default-no"))) "Yes")
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -225,7 +225,7 @@
|
||||
(command "_insert" bname pt "" "" rotation)
|
||||
)
|
||||
(progn
|
||||
(alert (strcat "Blockname '" bname "' existiert bereits - wird uebersprungen."))
|
||||
(alert (ssg-textf "core-blockname-exists" (list bname)))
|
||||
(setq bname (strcat "x" bname))
|
||||
(command "_block" bname pt ss "")
|
||||
(command "_insert" bname pt "" "" rotation)
|
||||
@@ -370,7 +370,7 @@
|
||||
(progn
|
||||
(setq tag (cdr (assoc 2 ed)))
|
||||
(setq wert (cdr (assoc tag attrib-alist)))
|
||||
(if (and wert (> (strlen wert) 0))
|
||||
(if (and wert (= (type wert) 'STR) (> (strlen wert) 0))
|
||||
(progn
|
||||
(entmod (subst (cons 1 wert) (assoc 1 ed) ed))
|
||||
(entupd obj)
|
||||
@@ -384,6 +384,66 @@
|
||||
)
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; GEMEINSAMES ATTRIBUT-SCHEMA FUER STRECKEN-BLOECKE
|
||||
;; (Gefaellestrecke + VarioFoerderer, feste Reihenfolge)
|
||||
;; ============================================================
|
||||
;; Vorderteil (immer vorhanden). Bezeichnung = Blockname (GF_n/VF_n),
|
||||
;; Artinr. fest 6220 (alle GF/VF). TYP-Wert wird zur Laufzeit gesetzt.
|
||||
;; ID zuerst (global, jeder eingefuegte Baustein - Kreisel/GF/VF - erhaelt eine
|
||||
;; neue ID), danach Bezeichnung (= Blockname). Hoehen/Delta mit Einheit _mm.
|
||||
(setq *strecke-attr-front*
|
||||
'(("ID" "")
|
||||
("Bezeichnung" "")
|
||||
("Artinr." "6220")
|
||||
("MONTAGEHOEHE_m" "0.000")
|
||||
("HOEHE_VON_mm" "0")
|
||||
("HOEHE_BIS_mm" "0")
|
||||
("DELTA_H_mm" "0")
|
||||
("DELTA_L_mm" "0")
|
||||
("TYP" "Streckengruppe")
|
||||
("SEITE_AS" "rechts")
|
||||
("SEITE_ES" "rechts")
|
||||
("ANZAHL_GF" "0")
|
||||
("L_GF_m" "0.000")
|
||||
("GF_WINKEL" "0.0")))
|
||||
|
||||
;; Mittelteil - nur fuer TYP "Streckengruppe" (mehrsegmentig/mit Bogen bzw. VF).
|
||||
;; Eine einsegmentige Gefaellestrecke ohne Bogen ("Gefaellestrecke") bekommt
|
||||
;; diese Attribute NICHT.
|
||||
(setq *strecke-attr-gruppe*
|
||||
'(("GF_Bogen_L_90" "0")
|
||||
("GF_Bogen_L_60" "0")
|
||||
("GF_Bogen_L_30" "0")
|
||||
("GF_Bogen_R_90" "0")
|
||||
("GF_Bogen_R_60" "0")
|
||||
("GF_Bogen_R_30" "0")
|
||||
("ANZAHL_VF" "0")
|
||||
("MOTORSEITE" "")
|
||||
("L_VF_m" "0.000")
|
||||
("ANTRIEBFAHRTRICHTUNG" "Auf")
|
||||
("VF_WINKEL" "0")
|
||||
("VF_Bogen_A_90" "0")
|
||||
("VF_Bogen_A_60" "0")
|
||||
("VF_Bogen_A_30" "0")
|
||||
("VF_Bogen_I_90" "0")
|
||||
("VF_Bogen_I_60" "0")
|
||||
("VF_Bogen_I_30" "0")))
|
||||
|
||||
;; Hinterteil (immer vorhanden). ANZAHL_SEPARATOR-Wert wird zur Laufzeit gesetzt
|
||||
;; (einsegmentige Gefaellestrecke: 1; Streckengruppe: gezaehlt).
|
||||
(setq *strecke-attr-hinten*
|
||||
'(("ANZAHL_SEPARATOR" "1")
|
||||
("ANZAHL_SCANNER" "0")))
|
||||
|
||||
;; Geordnete ATTDEF-Definitionsliste fuer einen Strecken-Block-Typ.
|
||||
;; typ "Gefaellestrecke" -> Vorderteil + Hinterteil (reduziert)
|
||||
;; sonst ("Streckengruppe") -> Vorderteil + Mittelteil + Hinterteil (voll)
|
||||
(defun ssg-strecke-attrib-defs (typ)
|
||||
(if (= typ "Gefaellestrecke")
|
||||
(append *strecke-attr-front* *strecke-attr-hinten*)
|
||||
(append *strecke-attr-front* *strecke-attr-gruppe* *strecke-attr-hinten*)))
|
||||
|
||||
;; Assoziationsliste in ATTDEF-Definitionsliste konvertieren.
|
||||
;; alist = (("TAG" . "Wert") ...) -> ((TAG Wert) ...)
|
||||
;; Passend fuer ssg-attrib-make-defs.
|
||||
@@ -400,7 +460,7 @@
|
||||
(defun ssg-attrib-read-dwg (dwg-pfad / tmpEnt srcAttribs oldAttreq oldAttdia)
|
||||
(if (not (findfile dwg-pfad))
|
||||
(progn
|
||||
(princ (strcat "\nFEHLER: Block nicht gefunden: " dwg-pfad))
|
||||
(princ (ssg-textf "core-dwg-not-found" (list dwg-pfad)))
|
||||
nil
|
||||
)
|
||||
(progn
|
||||
@@ -476,8 +536,8 @@
|
||||
(if (not (new_dialog dialog-name dat))
|
||||
(progn (alert "Dialog konnte nicht geladen werden.") (exit))
|
||||
)
|
||||
(if init-fn (init-fn))
|
||||
(action_tile "accept" "(if accept-fn (accept-fn)) (done_dialog 1)")
|
||||
(if init-fn (apply init-fn nil))
|
||||
(action_tile "accept" "(if accept-fn (apply accept-fn nil)) (done_dialog 1)")
|
||||
(action_tile "cancel" "(done_dialog 0)")
|
||||
(start_dialog)
|
||||
(unload_dialog dat)
|
||||
@@ -750,5 +810,85 @@
|
||||
)
|
||||
|
||||
|
||||
;; ============================================================
|
||||
;; INI-STYLE CONFIG-PARSER (Standard fuer alle cfg/*.cfg-Dateien)
|
||||
;;
|
||||
;; Format:
|
||||
;; [Abschnitt]
|
||||
;; Key = Wert (einzelner Wert)
|
||||
;; Key = Wert1, Wert2, Wert3 (kommagetrennte Liste, z.B. fuer wcmatch)
|
||||
;; # Kommentar / Leerzeile werden ignoriert
|
||||
;;
|
||||
;; Verwendung:
|
||||
;; (setq cfg (ssg-load-ini pfad))
|
||||
;; (ssg-ini-get cfg "sektion" "key" "default")
|
||||
;; (ssg-ini-list cfg "sektion" "key" "a,b,c") ; normalisiert zu "a,b,c" (wcmatch-tauglich)
|
||||
;; ============================================================
|
||||
|
||||
;; Zeilen einer .cfg-Datei in verschachtelte Alist parsen.
|
||||
;; Rueckgabe: (("sektion" ("key" . "wert") ...) ...)
|
||||
(defun ssg-ini-parse-lines (zeilen / ergebnis section sec-data trimmed pos key val)
|
||||
(setq ergebnis nil section nil sec-data nil)
|
||||
(foreach zeile zeilen
|
||||
(setq trimmed (vl-string-trim " \t\r\n" zeile))
|
||||
(cond
|
||||
;; Leerzeile oder Kommentar
|
||||
((or (= trimmed "") (= (substr trimmed 1 1) "#")) nil)
|
||||
;; Abschnitt: [name]
|
||||
((and (= (substr trimmed 1 1) "[")
|
||||
(= (substr trimmed (strlen trimmed) 1) "]"))
|
||||
(if section
|
||||
(setq ergebnis (cons (cons section (reverse sec-data)) ergebnis)))
|
||||
(setq section (substr trimmed 2 (- (strlen trimmed) 2)))
|
||||
(setq sec-data nil)
|
||||
)
|
||||
;; Key=Wert
|
||||
((and section (setq pos (vl-string-search "=" trimmed)))
|
||||
(setq key (vl-string-trim " \t" (substr trimmed 1 pos)))
|
||||
(setq val (vl-string-trim " \t" (substr trimmed (+ pos 2))))
|
||||
(setq sec-data (cons (cons key val) sec-data))
|
||||
)
|
||||
)
|
||||
)
|
||||
(if section
|
||||
(setq ergebnis (cons (cons section (reverse sec-data)) ergebnis)))
|
||||
(reverse ergebnis)
|
||||
)
|
||||
|
||||
;; .cfg-Datei laden und als verschachtelte Alist zurueckgeben, oder nil.
|
||||
(defun ssg-load-ini (cfg-datei / zeilen)
|
||||
(setq zeilen (ssg-read-file-lines cfg-datei))
|
||||
(if zeilen (ssg-ini-parse-lines zeilen))
|
||||
)
|
||||
|
||||
;; Einzelwert aus geladener INI-Alist lesen, mit Fallback.
|
||||
;; ini-data = Rueckgabe von ssg-load-ini
|
||||
(defun ssg-ini-get (ini-data section key default / sec-data val)
|
||||
(setq sec-data (cdr (assoc section ini-data)))
|
||||
(setq val (if sec-data (cdr (assoc key sec-data))))
|
||||
(if (and val (> (strlen val) 0)) val default)
|
||||
)
|
||||
|
||||
;; Kommagetrennten Wert aus geladener INI-Alist lesen und normalisieren
|
||||
;; (Leerzeichen um Kommas entfernen, leere Teile verwerfen).
|
||||
;; default-str = Fallback als kommagetrennter String, falls Config/Key fehlt.
|
||||
;; Rueckgabe: kommagetrennter String, z.B. "KR_*,KREISEL_*" (wcmatch-tauglich)
|
||||
(defun ssg-ini-list (ini-data section key default-str / raw teile ergebnis item first)
|
||||
(setq raw (ssg-ini-get ini-data section key default-str))
|
||||
(setq teile (ssg-cfg-split-comma raw))
|
||||
(setq ergebnis "" first T)
|
||||
(foreach item teile
|
||||
(setq item (vl-string-trim " \t" item))
|
||||
(if (> (strlen item) 0)
|
||||
(progn
|
||||
(setq ergebnis (if first item (strcat ergebnis "," item)))
|
||||
(setq first nil)
|
||||
)
|
||||
)
|
||||
)
|
||||
ergebnis
|
||||
)
|
||||
|
||||
|
||||
(prompt "\nssg_core.lsp geladen.")
|
||||
(princ)
|
||||
|
||||
+2
-2
@@ -67,7 +67,7 @@
|
||||
aktuell start-val
|
||||
)
|
||||
(if (not (new_dialog dialog-id dat))
|
||||
(progn (alert "Dialog nicht verfuegbar.") (exit))
|
||||
(progn (alert (ssg-text "dialog-nicht-verfuegbar")) (exit))
|
||||
)
|
||||
(set_tile select-tile start-val)
|
||||
(if (and preview-tile slide-lib slide-list)
|
||||
@@ -116,7 +116,7 @@
|
||||
;; ------------------------------------------------------------
|
||||
(defun ssg-insert-modul (lay-name lay-color blk-pfad attrib-alist rotation / pt)
|
||||
(ssg-make-layer lay-name lay-color T)
|
||||
(setq pt (getpoint "\nEinfuegepunkt waehlen: "))
|
||||
(setq pt (getpoint (ssg-text "dialog-einfuegepunkt-waehlen")))
|
||||
(command "_insert" blk-pfad pt "" "" rotation)
|
||||
(if attrib-alist
|
||||
(ssg-attrib-set-many attrib-alist)
|
||||
|
||||
+13
-13
@@ -42,7 +42,7 @@
|
||||
(if (or
|
||||
(wcmatch bname "KR_*,KREISEL_*,ECKRAD_*")
|
||||
(wcmatch (strcase bname) "AP110*,AP_110*,AP60*,AP_60*,APG110*")
|
||||
(wcmatch bname "Vario*,Staustrecke*,AUS_Element*,EIN_Element*")
|
||||
(wcmatch bname "Vario*,Staustrecke*,AUS_Element*,EIN_Element*,VF_*,GF_*")
|
||||
(wcmatch bname "#*")
|
||||
)
|
||||
(ssadd ename ss-out)
|
||||
@@ -93,11 +93,11 @@
|
||||
(setq new-id (1+ max-id))
|
||||
(setq new-id-str (ssg-id-format new-id))
|
||||
(ssg-attrib-set-on ent (list (cons "ID" new-id-str)))
|
||||
(princ (strcat "\n[ID] Neue ID zugewiesen: " new-id-str))
|
||||
(princ (ssg-textf "id-new-assigned" (list new-id-str)))
|
||||
new-id-str
|
||||
)
|
||||
(progn
|
||||
(princ "\n[ID] FEHLER: Kein gueltiger INSERT-Block!")
|
||||
(princ (ssg-text "id-invalid-block"))
|
||||
nil
|
||||
)
|
||||
)
|
||||
@@ -113,7 +113,7 @@
|
||||
(setq ss (ssg-id-collect-blocks))
|
||||
(if (null ss)
|
||||
(progn
|
||||
(princ "\n[IDSCHECK] Keine relevanten Bloecke gefunden.")
|
||||
(princ (ssg-text "id-check-no-blocks"))
|
||||
0
|
||||
)
|
||||
(progn
|
||||
@@ -141,8 +141,8 @@
|
||||
(setq max-id (1+ max-id))
|
||||
(setq new-id-str (ssg-id-format max-id))
|
||||
(ssg-attrib-set-on ename (list (cons "ID" new-id-str)))
|
||||
(princ (strcat "\n[IDSCHECK] Fehlende ID gesetzt: " new-id-str
|
||||
" (Block " (cdr (assoc 2 (entget ename))) ")"))
|
||||
(princ (ssg-textf "id-check-missing-set"
|
||||
(list new-id-str (cdr (assoc 2 (entget ename))))))
|
||||
)
|
||||
)
|
||||
(setq i (1+ i))
|
||||
@@ -158,16 +158,16 @@
|
||||
(setq max-id (1+ max-id))
|
||||
(setq new-id-str (ssg-id-format max-id))
|
||||
(ssg-attrib-set-on ename (list (cons "ID" new-id-str)))
|
||||
(princ (strcat "\n[IDSCHECK] Duplikat ID " (ssg-id-format (car entry))
|
||||
" -> neue ID " new-id-str
|
||||
" (Block " (cdr (assoc 2 (entget ename))) ")"))
|
||||
(princ (ssg-textf "id-check-duplicate"
|
||||
(list (ssg-id-format (car entry)) new-id-str
|
||||
(cdr (assoc 2 (entget ename))))))
|
||||
(setq fixed-count (1+ fixed-count))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
(princ (strcat "\n[IDSCHECK] Fertig. " (itoa fixed-count) " Duplikate korrigiert."))
|
||||
(princ (ssg-textf "id-check-done" (list fixed-count)))
|
||||
fixed-count
|
||||
)
|
||||
)
|
||||
@@ -179,7 +179,7 @@
|
||||
(defun c:IDSCHECK ( / count)
|
||||
(ssg-start "IDSCHECK" nil)
|
||||
(setq count (ssg-id-check-all))
|
||||
(princ (strcat "\n[IDSCHECK] " (itoa count) " IDs korrigiert."))
|
||||
(princ (ssg-textf "id-check-corrected" (list count)))
|
||||
(ssg-end)
|
||||
(princ)
|
||||
)
|
||||
@@ -188,10 +188,10 @@
|
||||
;; Fordert den Benutzer auf, einen Block zu waehlen und weist eine neue ID zu.
|
||||
(defun c:IDGENERATE ( / ent ed)
|
||||
(ssg-start "IDGENERATE" nil)
|
||||
(setq ent (car (entsel "\nBlock waehlen: ")))
|
||||
(setq ent (car (entsel (ssg-text "id-select-block-prompt"))))
|
||||
(if (and ent (= (cdr (assoc 0 (entget ent))) "INSERT"))
|
||||
(ssg-id-generate ent)
|
||||
(princ "\n[IDGENERATE] Kein gueltiger Block gewaehlt.")
|
||||
(princ (ssg-text "id-generate-invalid"))
|
||||
)
|
||||
(ssg-end)
|
||||
(princ)
|
||||
|
||||
+1728
File diff suppressed because it is too large
Load Diff
+33
-33
@@ -75,12 +75,12 @@
|
||||
;; Rueckgabe: neuer Layername oder nil bei Abbruch
|
||||
(defun c:SSG-LayerSet (/ sel lay)
|
||||
(ssg-start "Layer setzen" nil)
|
||||
(if (setq lay (ssg-get-layer "\nObjekt auf dem Ziel-Layer waehlen: "))
|
||||
(if (setq lay (ssg-get-layer (ssg-text "layer-prompt-ziel-layer")))
|
||||
(progn
|
||||
(command "_LAYER" "_SET" lay "")
|
||||
(prompt (strcat "\nAktiver Layer: " lay))
|
||||
(prompt (ssg-textf "layer-aktiver-layer" (list lay)))
|
||||
)
|
||||
(ssg-emsg "Kein Objekt gewaehlt.")
|
||||
(ssg-emsg (ssg-text "layer-err-kein-objekt"))
|
||||
)
|
||||
(ssg-end)
|
||||
lay
|
||||
@@ -89,9 +89,9 @@
|
||||
;; Layer eines Objektes anzeigen
|
||||
(defun c:SSG-LayerInfo (/ sel lay)
|
||||
(ssg-start "Layer-Info" nil)
|
||||
(if (setq lay (ssg-get-layer "\nObjekt waehlen: "))
|
||||
(prompt (strcat "\nObjekt liegt auf Layer: " lay))
|
||||
(ssg-emsg "Kein Objekt gewaehlt.")
|
||||
(if (setq lay (ssg-get-layer (ssg-text "layer-prompt-objekt")))
|
||||
(prompt (ssg-textf "layer-objekt-auf-layer" (list lay)))
|
||||
(ssg-emsg (ssg-text "layer-err-kein-objekt"))
|
||||
)
|
||||
(ssg-end)
|
||||
lay
|
||||
@@ -101,11 +101,11 @@
|
||||
(defun c:SSG-LayerMove (/ elem ziel-lay)
|
||||
(ssg-start "Layer wechseln" nil)
|
||||
(if (setq elem (ssget))
|
||||
(if (setq ziel-lay (ssg-get-layer "\nObjekt auf dem Ziel-Layer waehlen: "))
|
||||
(if (setq ziel-lay (ssg-get-layer (ssg-text "layer-prompt-ziel-layer")))
|
||||
(command "_CHANGE" elem "" "_PROP" "_LA" ziel-lay "")
|
||||
(ssg-emsg "Kein Ziel-Layer gewaehlt.")
|
||||
(ssg-emsg (ssg-text "layer-err-kein-ziel-layer"))
|
||||
)
|
||||
(ssg-emsg "Kein Objekt gewaehlt.")
|
||||
(ssg-emsg (ssg-text "layer-err-kein-objekt"))
|
||||
)
|
||||
(ssg-end)
|
||||
)
|
||||
@@ -114,11 +114,11 @@
|
||||
(defun c:SSG-LayerCopy (/ elem ziel-lay)
|
||||
(ssg-start "Layer-Kopie" nil)
|
||||
(if (setq elem (ssget))
|
||||
(if (setq ziel-lay (ssg-get-layer "\nObjekt auf dem Ziel-Layer waehlen: "))
|
||||
(if (setq ziel-lay (ssg-get-layer (ssg-text "layer-prompt-ziel-layer")))
|
||||
(command "_COPY" elem "" "@" "@" "_CHANGE" elem "" "_PROP" "_LA" ziel-lay "")
|
||||
(ssg-emsg "Kein Ziel-Layer gewaehlt.")
|
||||
(ssg-emsg (ssg-text "layer-err-kein-ziel-layer"))
|
||||
)
|
||||
(ssg-emsg "Kein Objekt gewaehlt.")
|
||||
(ssg-emsg (ssg-text "layer-err-kein-objekt"))
|
||||
)
|
||||
(ssg-end)
|
||||
)
|
||||
@@ -127,34 +127,34 @@
|
||||
;; (nach Auswahl eines Referenz-Objektes dieses Typs)
|
||||
(defun c:SSG-LayerMoveType (/ ref-lay ref-typ elem ziel-lay ss ref-sel)
|
||||
(ssg-start "Layer-Typ verschieben" nil)
|
||||
(if (setq ref-lay (ssg-get-layer "\nReferenz-Objekt waehlen (bestimmt Typ und Layer): "))
|
||||
(if (setq ref-lay (ssg-get-layer (ssg-text "layer-prompt-referenz-objekt")))
|
||||
(progn
|
||||
(setq ref-sel (entsel "\nNochmals fuer Typ-Ermittlung anklicken: "))
|
||||
(setq ref-sel (entsel (ssg-text "layer-prompt-typ-ermittlung")))
|
||||
(if ref-sel
|
||||
(progn
|
||||
(setq ref-typ (cdr (assoc 0 (entget (car ref-sel))))
|
||||
ss (ssg-layer-ss ref-lay ref-typ)
|
||||
)
|
||||
(if ss
|
||||
(if (setq ziel-lay (ssg-get-layer "\nObjekt auf dem Ziel-Layer waehlen: "))
|
||||
(if (setq ziel-lay (ssg-get-layer (ssg-text "layer-prompt-ziel-layer")))
|
||||
(progn
|
||||
(ssg-zoom-save)
|
||||
(ssg-ss-redraw ss 3)
|
||||
(if (not (ssg-ques (strcat "Layer dieser " ref-typ "-Objekte wechseln?") nil))
|
||||
(if (not (ssg-ques (ssg-textf "layer-ques-typ-wechseln" (list ref-typ)) nil))
|
||||
(command "_CHANGE" ss "" "_PROP" "_LA" ziel-lay "")
|
||||
(ssg-ss-redraw ss 4)
|
||||
)
|
||||
(ssg-zoom-restore)
|
||||
)
|
||||
(ssg-emsg "Kein Ziel-Layer.")
|
||||
(ssg-emsg (ssg-text "layer-err-kein-ziel-layer-kurz"))
|
||||
)
|
||||
(ssg-emsg "Keine passenden Objekte gefunden.")
|
||||
(ssg-emsg (ssg-text "layer-err-keine-passenden-objekte"))
|
||||
)
|
||||
)
|
||||
(ssg-emsg "Abgebrochen.")
|
||||
(ssg-emsg (ssg-text "layer-abgebrochen"))
|
||||
)
|
||||
)
|
||||
(ssg-emsg "Kein Referenz-Objekt gewaehlt.")
|
||||
(ssg-emsg (ssg-text "layer-err-kein-referenz-objekt"))
|
||||
)
|
||||
(ssg-end)
|
||||
)
|
||||
@@ -167,10 +167,10 @@
|
||||
;; Layer durch Anklicken ausschalten
|
||||
(defun c:SSG-LayerOff (/ lay)
|
||||
(ssg-start "Layer ausschalten" nil)
|
||||
(while (setq lay (ssg-get-layer "\nLayer zum Ausblenden anklicken (Enter=Ende): "))
|
||||
(while (setq lay (ssg-get-layer (ssg-text "layer-prompt-ausblenden")))
|
||||
(if (ssg-layer-safe-p lay nil)
|
||||
(command "_LAYER" "_OFF" lay "")
|
||||
(ssg-emsg "Aktiven Layer nicht ausschalten!")
|
||||
(ssg-emsg (ssg-text "layer-err-aktiv-nicht-ausschalten"))
|
||||
)
|
||||
)
|
||||
(ssg-end)
|
||||
@@ -179,10 +179,10 @@
|
||||
;; Layer durch Anklicken einfrieren
|
||||
(defun c:SSG-LayerFreeze (/ lay)
|
||||
(ssg-start "Layer einfrieren" nil)
|
||||
(while (setq lay (ssg-get-layer "\nLayer zum Einfrieren anklicken (Enter=Ende): "))
|
||||
(while (setq lay (ssg-get-layer (ssg-text "layer-prompt-einfrieren")))
|
||||
(if (ssg-layer-safe-p lay nil)
|
||||
(command "_LAYER" "_FR" lay "")
|
||||
(ssg-emsg "Aktiven Layer nicht einfrieren!")
|
||||
(ssg-emsg (ssg-text "layer-err-aktiv-nicht-einfrieren"))
|
||||
)
|
||||
)
|
||||
(ssg-end)
|
||||
@@ -191,13 +191,13 @@
|
||||
;; Alle Layer ausser dem aktiven einfrieren
|
||||
(defun c:SSG-FreezeAll (/ aktiv)
|
||||
(ssg-start "Alle anderen Layer einfrieren" nil)
|
||||
(setq aktiv (ssg-get-layer "\nObjekt auf dem Layer waehlen, der AKTIV bleibt: "))
|
||||
(setq aktiv (ssg-get-layer (ssg-text "layer-prompt-aktiv-bleibt")))
|
||||
(if aktiv
|
||||
(progn
|
||||
(command "_LAYER" "_SET" aktiv "_FR" "*" "")
|
||||
(prompt (strcat "\nNur Layer '" aktiv "' ist sichtbar."))
|
||||
(prompt (ssg-textf "layer-nur-layer-sichtbar" (list aktiv)))
|
||||
)
|
||||
(ssg-emsg "Abgebrochen.")
|
||||
(ssg-emsg (ssg-text "layer-abgebrochen"))
|
||||
)
|
||||
(ssg-end)
|
||||
)
|
||||
@@ -278,34 +278,34 @@
|
||||
(defun c:SSG-LayerDelete (/ lay ss)
|
||||
(ssg-start "Layer loeschen" nil)
|
||||
(initget 1)
|
||||
(setq lay (getstring "\nLayername zum Loeschen: "))
|
||||
(setq lay (getstring (ssg-text "layer-prompt-name-loeschen")))
|
||||
(if (tblsearch "LAYER" lay)
|
||||
(progn
|
||||
(setq ss (ssg-layer-ss lay nil))
|
||||
(if ss
|
||||
(progn
|
||||
(ssg-ss-redraw ss 4)
|
||||
(if (not (ssg-ques (strcat "Alle Objekte auf Layer '" lay "' loeschen?") nil))
|
||||
(if (not (ssg-ques (ssg-textf "layer-ques-alle-loeschen" (list lay)) nil))
|
||||
(progn
|
||||
(command "_ERASE" ss "")
|
||||
(command "_LAYER" "_OFF" lay "")
|
||||
(command "_PURGE" "_LA" lay "N")
|
||||
(prompt (strcat "\nLayer '" lay "' geloescht."))
|
||||
(prompt (ssg-textf "layer-geloescht" (list lay)))
|
||||
)
|
||||
(progn
|
||||
(ssg-ss-redraw ss 0)
|
||||
(prompt "\nAbgebrochen.")
|
||||
(prompt (strcat "\n" (ssg-text "layer-abgebrochen")))
|
||||
)
|
||||
)
|
||||
)
|
||||
(progn
|
||||
(command "_LAYER" "_OFF" lay "")
|
||||
(command "_PURGE" "_LA" lay "N")
|
||||
(prompt (strcat "\nLeerer Layer '" lay "' geloescht."))
|
||||
(prompt (ssg-textf "layer-leerer-geloescht" (list lay)))
|
||||
)
|
||||
)
|
||||
)
|
||||
(ssg-emsg (strcat "Layer '" lay "' existiert nicht."))
|
||||
(ssg-emsg (ssg-textf "layer-existiert-nicht" (list lay)))
|
||||
)
|
||||
(ssg-end)
|
||||
)
|
||||
|
||||
+10
-7
@@ -11,17 +11,20 @@
|
||||
;; (load "pfad/ssg_dialog.lsp")
|
||||
;; ============================================================
|
||||
|
||||
(defun ssg-load-libs (/ base-path)
|
||||
;; Pfad dieser Datei als Basis verwenden (AutoCAD 2000+)
|
||||
(defun ssg-load-libs (/ base-path found)
|
||||
;; Pfad ermitteln: 1) DXFM_LISP, 2) findfile, 3) DWGPREFIX
|
||||
(setq base-path
|
||||
(if (findfile "ssg_core.lsp")
|
||||
(substr (findfile "ssg_core.lsp") 1
|
||||
(- (strlen (findfile "ssg_core.lsp")) (strlen "ssg_core.lsp")))
|
||||
(strcat (getvar "DWGPREFIX"))
|
||||
(cond
|
||||
((getenv "DXFM_LISP")
|
||||
(strcat (vl-string-translate "\\" "/" (getenv "DXFM_LISP")) "/"))
|
||||
((setq found (findfile "ssg_core.lsp"))
|
||||
(substr found 1 (- (strlen found) (strlen "ssg_core.lsp"))))
|
||||
(t (getvar "DWGPREFIX"))
|
||||
)
|
||||
)
|
||||
(load (strcat base-path "ssg_core.lsp") "ssg_core.lsp nicht gefunden")
|
||||
(ssg-load-config)
|
||||
(load (strcat base-path "ssg_lang.lsp") "ssg_lang.lsp nicht gefunden")
|
||||
(load (strcat base-path "ssg_dbg.lsp") "ssg_dbg.lsp nicht gefunden")
|
||||
(load (strcat base-path "ssg_dialog.lsp") "ssg_dialog.lsp nicht gefunden")
|
||||
(load (strcat base-path "ssg_layer.lsp") "ssg_layer.lsp nicht gefunden")
|
||||
@@ -32,7 +35,7 @@
|
||||
(load (strcat base-path "tests.lsp") "tests.lsp nicht gefunden")
|
||||
(load (strcat base-path "OmniModulInsert.lsp") "OmniModulInsert.lsp nicht gefunden")
|
||||
(load (strcat base-path "SSG_LIB_Commands.lsp") "SSG_LIB_Commands.lsp nicht gefunden")
|
||||
(prompt "\nSSG-Bibliotheken geladen: ssg_core, ssg_dbg, ssg_dialog, ssg_layer, KreiselInsert, VarioFoerderer, Gefaellestrecke, export, tests, OmniModulInsert, SSG_LIB_Commands")
|
||||
(prompt "\nSSG-Bibliotheken geladen: ssg_core, ssg_lang, ssg_dbg, ssg_dialog, ssg_layer, KreiselInsert, VarioFoerderer, Gefaellestrecke, export, tests, OmniModulInsert, SSG_LIB_Commands")
|
||||
(princ)
|
||||
)
|
||||
|
||||
|
||||
+1371
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,788 @@
|
||||
;; ============================================================
|
||||
;; VF_ETAGE - Etage VarioFoerderer (Typ: "etage")
|
||||
;; Version: 26.0
|
||||
;; Abhaengigkeit: vf_core.lsp muss zuerst geladen sein
|
||||
;; Geometrie: AS/ES 30 Grad, direkt uebereinander (60 Grad Hz-Winkel)
|
||||
;; 15-Schritt-Einfuegung
|
||||
;; ============================================================
|
||||
|
||||
;; Sicherstellen, dass vf_core.lsp geladen ist
|
||||
(if (not (car (atoms-family 1 '("VF-TYP-REGISTRIEREN"))))
|
||||
(progn
|
||||
(setq *vf-etage-core-pfad*
|
||||
(cond
|
||||
((getenv "DXFM_LISP")
|
||||
(vl-string-translate "\\" "/" (getenv "DXFM_LISP")))
|
||||
((and (boundp '*ssg-lisp-pfad*) *ssg-lisp-pfad*)
|
||||
*ssg-lisp-pfad*)
|
||||
(t nil)
|
||||
)
|
||||
)
|
||||
(if *vf-etage-core-pfad*
|
||||
(load (strcat *vf-etage-core-pfad* "/vf_core.lsp"))
|
||||
(progn
|
||||
(princ (ssg-text "vfe-warn-lisp-pfad"))
|
||||
(exit)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; TEIL 1: ETAGE-SPEZIFISCHE GLOBALE VARIABLEN
|
||||
;; ============================================================
|
||||
(setq etage-aus-dx nil etage-aus-dz nil)
|
||||
(setq etage-ein-dx nil etage-ein-dz nil)
|
||||
(setq etage-gef-dx nil etage-gef-dy nil etage-gef-dz nil)
|
||||
(setq etage-gef-dx-rechts nil etage-gef-dz-rechts nil)
|
||||
(setq etage-gef-dx-links nil etage-gef-dz-links nil)
|
||||
(setq *etage-lib-initialized* nil)
|
||||
|
||||
(setq FESTE_ETAGE_MITTE 1000)
|
||||
(setq ETAGE_SCHRAEG_LAENGE 700)
|
||||
(setq ETAGE_HZ_WINKEL 60)
|
||||
|
||||
;; ============================================================
|
||||
;; TEIL 2: BIBLIOTHEK INITIALISIEREN (ETAGE-SPEZIFISCH)
|
||||
;; ============================================================
|
||||
(defun init-bibliothek-etage ( / temp-obj ks-data ks-ein-pos ks-aus-pos
|
||||
gefaelle-blockname)
|
||||
(if (and *etage-lib-initialized* (not (tblsearch "BLOCK" "AS_Element_30_rechts")))
|
||||
(setq *etage-lib-initialized* nil))
|
||||
(if *etage-lib-initialized*
|
||||
(progn (princ (ssg-text "vfe-bib-bereits-init")) t)
|
||||
(progn
|
||||
(princ (ssg-text "vfe-bib-initialisiere"))
|
||||
|
||||
;; Standard-Bogen-Daten laden (bogen-auf/bogen-ab benoetigt)
|
||||
(if (not *lib-initialized*)
|
||||
(init-bibliothek)
|
||||
)
|
||||
|
||||
;; AS_30_rechts Masse extrahieren
|
||||
(princ (ssg-text "vfe-extrahiere-as30"))
|
||||
(ensure-block-loaded "AS_Element_30_rechts")
|
||||
(ensure-block-loaded "AS_Element_30_links")
|
||||
(if (tblsearch "BLOCK" "AS_Element_30_rechts")
|
||||
(progn
|
||||
(setq temp-obj (vla-InsertBlock modelspace
|
||||
(vlax-3D-point '(0 0 0))
|
||||
"AS_Element_30_rechts" 1.0 1.0 1.0 0))
|
||||
(setq ks-data (extract-ks-from-block temp-obj))
|
||||
(vla-Delete temp-obj)
|
||||
(setq ks-ein-pos nil ks-aus-pos nil)
|
||||
(foreach item ks-data
|
||||
(if (= (car item) "KS_EIN") (setq ks-ein-pos (cadr item)))
|
||||
(if (= (car item) "KS_AUS") (setq ks-aus-pos (cadr item)))
|
||||
)
|
||||
(if (and ks-ein-pos ks-aus-pos)
|
||||
(progn
|
||||
(setq etage-aus-dx (- (caar ks-aus-pos) (caar ks-ein-pos)))
|
||||
(setq etage-aus-dz (- (caddr (car ks-aus-pos)) (caddr (car ks-ein-pos))))
|
||||
(princ (ssg-textf "vfe-as30-mass" (list (rtos etage-aus-dx 2 1) (rtos etage-aus-dz 2 1))))
|
||||
)
|
||||
(progn
|
||||
(princ (ssg-text "vfe-warn-ks-fehlt-standard"))
|
||||
(setq etage-aus-dx 525.8 etage-aus-dz -72.9)
|
||||
)
|
||||
)
|
||||
)
|
||||
(progn
|
||||
(princ (ssg-text "vfe-warn-block-as30-fehlt"))
|
||||
(setq etage-aus-dx 525.8 etage-aus-dz -72.9)
|
||||
)
|
||||
)
|
||||
|
||||
;; ES_30_rechts Masse extrahieren
|
||||
(princ (ssg-text "vfe-extrahiere-es30"))
|
||||
(ensure-block-loaded "ES_Element_30_rechts")
|
||||
(ensure-block-loaded "ES_Element_30_links")
|
||||
(if (tblsearch "BLOCK" "ES_Element_30_rechts")
|
||||
(progn
|
||||
(setq temp-obj (vla-InsertBlock modelspace
|
||||
(vlax-3D-point '(0 0 0))
|
||||
"ES_Element_30_rechts" 1.0 1.0 1.0 0))
|
||||
(setq ks-data (extract-ks-from-block temp-obj))
|
||||
(vla-Delete temp-obj)
|
||||
(setq ks-ein-pos nil ks-aus-pos nil)
|
||||
(foreach item ks-data
|
||||
(if (= (car item) "KS_EIN") (setq ks-ein-pos (cadr item)))
|
||||
(if (= (car item) "KS_AUS") (setq ks-aus-pos (cadr item)))
|
||||
)
|
||||
(if (and ks-ein-pos ks-aus-pos)
|
||||
(progn
|
||||
(setq etage-ein-dx (- (caar ks-aus-pos) (caar ks-ein-pos)))
|
||||
(setq etage-ein-dz (- (caddr (car ks-aus-pos)) (caddr (car ks-ein-pos))))
|
||||
(princ (ssg-textf "vfe-es30-mass" (list (rtos etage-ein-dx 2 1) (rtos etage-ein-dz 2 1))))
|
||||
)
|
||||
(progn
|
||||
(princ (ssg-text "vfe-warn-ks-fehlt-standard"))
|
||||
(setq etage-ein-dx 576.2 etage-ein-dz -54.6)
|
||||
)
|
||||
)
|
||||
)
|
||||
(progn
|
||||
(princ (ssg-text "vfe-warn-block-es30-fehlt"))
|
||||
(setq etage-ein-dx 576.2 etage-ein-dz -54.6)
|
||||
)
|
||||
)
|
||||
|
||||
;; Gefaellebogen_links_60 Masse extrahieren
|
||||
(setq gefaelle-blockname "Gefaellebogen_links_60_R500")
|
||||
(princ (ssg-textf "vfe-extrahiere-block-mass" (list gefaelle-blockname)))
|
||||
(ensure-block-loaded gefaelle-blockname)
|
||||
(if (tblsearch "BLOCK" gefaelle-blockname)
|
||||
(progn
|
||||
(setq temp-obj (vla-InsertBlock modelspace
|
||||
(vlax-3D-point '(0 0 0)) gefaelle-blockname 1.0 1.0 1.0 0))
|
||||
(setq ks-data (extract-ks-from-block temp-obj))
|
||||
(vla-Delete temp-obj)
|
||||
(setq ks-ein-pos nil ks-aus-pos nil)
|
||||
(foreach item ks-data
|
||||
(if (= (car item) "KS_EIN") (setq ks-ein-pos (cadr item)))
|
||||
(if (= (car item) "KS_AUS") (setq ks-aus-pos (cadr item)))
|
||||
)
|
||||
(if (and ks-ein-pos ks-aus-pos)
|
||||
(progn
|
||||
(setq etage-gef-dx-links (- (caar ks-aus-pos) (caar ks-ein-pos)))
|
||||
(setq etage-gef-dz-links (- (caddr (car ks-aus-pos)) (caddr (car ks-ein-pos))))
|
||||
)
|
||||
(progn
|
||||
(princ (ssg-text "vfe-warn-kein-ks-links"))
|
||||
(setq etage-gef-dx-links 0.0 etage-gef-dz-links -10.0)
|
||||
)
|
||||
)
|
||||
)
|
||||
(progn
|
||||
(princ (ssg-text "vfe-warn-block-fehlt-links"))
|
||||
(setq etage-gef-dx-links 0.0 etage-gef-dz-links -10.0)
|
||||
)
|
||||
)
|
||||
(princ (ssg-textf "vfe-gefaellebogen-links-mass" (list (rtos etage-gef-dx-links 2 2) (rtos etage-gef-dz-links 2 2))))
|
||||
|
||||
;; Gefaellebogen_rechts_60 Masse extrahieren
|
||||
(setq gefaelle-blockname "Gefaellebogen_rechts_60_R500")
|
||||
(princ (ssg-textf "vfe-extrahiere-block-mass" (list gefaelle-blockname)))
|
||||
(ensure-block-loaded gefaelle-blockname)
|
||||
(if (tblsearch "BLOCK" gefaelle-blockname)
|
||||
(progn
|
||||
(setq temp-obj (vla-InsertBlock modelspace
|
||||
(vlax-3D-point '(0 0 0)) gefaelle-blockname 1.0 1.0 1.0 0))
|
||||
(setq ks-data (extract-ks-from-block temp-obj))
|
||||
(vla-Delete temp-obj)
|
||||
(setq ks-ein-pos nil ks-aus-pos nil)
|
||||
(foreach item ks-data
|
||||
(if (= (car item) "KS_EIN") (setq ks-ein-pos (cadr item)))
|
||||
(if (= (car item) "KS_AUS") (setq ks-aus-pos (cadr item)))
|
||||
)
|
||||
(if (and ks-ein-pos ks-aus-pos)
|
||||
(progn
|
||||
(setq etage-gef-dx-rechts (- (caar ks-aus-pos) (caar ks-ein-pos)))
|
||||
(setq etage-gef-dz-rechts (- (caddr (car ks-aus-pos)) (caddr (car ks-ein-pos))))
|
||||
)
|
||||
(progn
|
||||
(princ (ssg-text "vfe-warn-kein-ks-rechts"))
|
||||
(setq etage-gef-dx-rechts 0.0 etage-gef-dz-rechts -10.0)
|
||||
)
|
||||
)
|
||||
)
|
||||
(progn
|
||||
(princ (ssg-text "vfe-warn-block-fehlt-rechts"))
|
||||
(setq etage-gef-dx-rechts 0.0 etage-gef-dz-rechts -10.0)
|
||||
)
|
||||
)
|
||||
(princ (ssg-textf "vfe-gefaellebogen-rechts-mass" (list (rtos etage-gef-dx-rechts 2 2) (rtos etage-gef-dz-rechts 2 2))))
|
||||
|
||||
(setq *etage-lib-initialized* t)
|
||||
(princ (ssg-text "vfe-bib-init-erfolg"))
|
||||
t
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; TEIL 3: EINFUEGEFUNKTIONEN MIT KOMBINIERTER HZ+VERT ROTATION
|
||||
;; ============================================================
|
||||
;; Transformationsmatrix: Rz(hz) * Ry(vert)
|
||||
;; [ cos(hz)*cos(vert) -sin(hz) cos(hz)*sin(vert) ]
|
||||
;; [ sin(hz)*cos(vert) cos(hz) sin(hz)*sin(vert) ]
|
||||
;; [ -sin(vert) 0 cos(vert) ]
|
||||
|
||||
(defun insert-hz-incl-scaled-block (blockname startpunkt laenge hz-winkel vert-winkel /
|
||||
rad-hz rad-vert chz shz cv sv scale
|
||||
matrix block-obj endpunkt)
|
||||
(setq scale (/ (float laenge) 1000.0))
|
||||
(setq rad-hz (* (float hz-winkel) (/ pi 180.0)))
|
||||
(setq rad-vert (* (float vert-winkel) (/ pi 180.0)))
|
||||
(setq chz (cos rad-hz) shz (sin rad-hz))
|
||||
(setq cv (cos rad-vert) sv (sin rad-vert))
|
||||
(ensure-block-loaded blockname)
|
||||
(if (not (tblsearch "BLOCK" blockname))
|
||||
(progn
|
||||
(princ (ssg-textf "vfe-block-fehlt-abbruch" (list blockname)))
|
||||
(exit)
|
||||
)
|
||||
)
|
||||
(setq block-obj (vla-InsertBlock modelspace
|
||||
(vlax-3D-point '(0 0 0)) blockname scale 1.0 1.0 0))
|
||||
(setq matrix (list
|
||||
(list (* chz cv) (- shz) (* chz sv) 0)
|
||||
(list (* shz cv) chz (* shz sv) 0)
|
||||
(list (- sv) 0 cv 0)
|
||||
(list 0 0 0 1)
|
||||
))
|
||||
(vla-TransformBy block-obj (vlax-tmatrix matrix))
|
||||
(vla-Move block-obj (vlax-3D-point '(0 0 0)) (vlax-3D-point startpunkt))
|
||||
(setq endpunkt (list
|
||||
(+ (car startpunkt) (* laenge chz cv))
|
||||
(+ (cadr startpunkt) (* laenge shz cv))
|
||||
(+ (caddr startpunkt) (* (- sv) laenge))))
|
||||
(princ (ssg-textf "vfe-hz-incl-status"
|
||||
(list blockname (rtos laenge 2 0)
|
||||
(strcat (rtos hz-winkel 2 0) (chr 176))
|
||||
(strcat (rtos vert-winkel 2 0) (chr 176))
|
||||
(rtos (caddr endpunkt) 2 1))))
|
||||
endpunkt
|
||||
)
|
||||
|
||||
(defun insert-hz-rotated-block-with-ks (blockname startpunkt hz-winkel vert-winkel block-dx block-dz /
|
||||
rad-hz rad-vert chz shz cv sv
|
||||
matrix block-obj endpunkt)
|
||||
(setq rad-hz (* (float hz-winkel) (/ pi 180.0)))
|
||||
(setq rad-vert (* (float vert-winkel) (/ pi 180.0)))
|
||||
(setq chz (cos rad-hz) shz (sin rad-hz))
|
||||
(setq cv (cos rad-vert) sv (sin rad-vert))
|
||||
(ensure-block-loaded blockname)
|
||||
(if (not (tblsearch "BLOCK" blockname))
|
||||
(progn
|
||||
(princ (ssg-textf "vfe-block-fehlt-abbruch" (list blockname)))
|
||||
(exit)
|
||||
)
|
||||
)
|
||||
(setq block-obj (vla-InsertBlock modelspace
|
||||
(vlax-3D-point '(0 0 0)) blockname 1.0 1.0 1.0 0))
|
||||
(setq matrix (list
|
||||
(list (* chz cv) (- shz) (* chz sv) 0)
|
||||
(list (* shz cv) chz (* shz sv) 0)
|
||||
(list (- sv) 0 cv 0)
|
||||
(list 0 0 0 1)
|
||||
))
|
||||
(vla-TransformBy block-obj (vlax-tmatrix matrix))
|
||||
(vla-Move block-obj (vlax-3D-point '(0 0 0)) (vlax-3D-point startpunkt))
|
||||
(setq endpunkt (list
|
||||
(+ (car startpunkt) (+ (* block-dx chz cv) (* block-dz chz sv)))
|
||||
(+ (cadr startpunkt) (+ (* block-dx shz cv) (* block-dz shz sv)))
|
||||
(+ (caddr startpunkt) (+ (* (- sv) block-dx) (* cv block-dz)))))
|
||||
(princ (ssg-textf "vfe-hz-rot-status"
|
||||
(list blockname
|
||||
(strcat (rtos hz-winkel 2 0) (chr 176))
|
||||
(strcat (rtos vert-winkel 2 0) (chr 176))
|
||||
(rtos (caddr endpunkt) 2 1))))
|
||||
endpunkt
|
||||
)
|
||||
|
||||
(defun insert-hz-rotated-block-by-ks (blockname startpunkt hz-winkel vert-winkel /
|
||||
rad-hz rad-vert chz shz cv sv
|
||||
temp-obj block-obj ks-data ks-ein ks-aus
|
||||
p-ein p-aus p-ein-rot p-aus-rot
|
||||
offset ausgang)
|
||||
(ensure-block-loaded blockname)
|
||||
(if (not (tblsearch "BLOCK" blockname))
|
||||
(progn
|
||||
(princ (ssg-textf "vfe-block-fehlt-abbruch" (list blockname)))
|
||||
(exit)
|
||||
)
|
||||
)
|
||||
(setq rad-hz (* (float hz-winkel) (/ pi 180.0)))
|
||||
(setq rad-vert (* (float vert-winkel) (/ pi 180.0)))
|
||||
(setq chz (cos rad-hz) shz (sin rad-hz))
|
||||
(setq cv (cos rad-vert) sv (sin rad-vert))
|
||||
;; KS-Positionen aus Cache (Block bei 0 Grad am Ursprung)
|
||||
(setq temp-obj (vla-InsertBlock modelspace (vlax-3D-point '(0 0 0)) blockname 1.0 1.0 1.0 0))
|
||||
(setq ks-data (extract-ks-from-block temp-obj))
|
||||
(if (not (vlax-erased-p temp-obj)) (vla-Delete temp-obj))
|
||||
(setq ks-ein (cadr (assoc "KS_EIN" ks-data)))
|
||||
(setq ks-aus (cadr (assoc "KS_AUS" ks-data)))
|
||||
;; Block einfuegen und rotieren
|
||||
(setq block-obj (vla-InsertBlock modelspace (vlax-3D-point '(0 0 0)) blockname 1.0 1.0 1.0 0))
|
||||
(vla-TransformBy block-obj (vlax-tmatrix
|
||||
(list (list (* chz cv) (- shz) (* chz sv) 0)
|
||||
(list (* shz cv) chz (* shz sv) 0)
|
||||
(list (- sv) 0 cv 0)
|
||||
(list 0 0 0 1))))
|
||||
(if (and ks-ein ks-aus)
|
||||
(progn
|
||||
(setq p-ein (car ks-ein))
|
||||
(setq p-aus (car ks-aus))
|
||||
;; Rotation auf KS-Punkte anwenden: p' = Rz(hz)*Ry(vert) * p
|
||||
(setq p-ein-rot
|
||||
(list (+ (* chz cv (car p-ein)) (- (* shz (cadr p-ein))) (* chz sv (caddr p-ein)))
|
||||
(+ (* shz cv (car p-ein)) (* chz (cadr p-ein)) (* shz sv (caddr p-ein)))
|
||||
(+ (* (- sv) (car p-ein)) (* cv (caddr p-ein)))))
|
||||
(setq p-aus-rot
|
||||
(list (+ (* chz cv (car p-aus)) (- (* shz (cadr p-aus))) (* chz sv (caddr p-aus)))
|
||||
(+ (* shz cv (car p-aus)) (* chz (cadr p-aus)) (* shz sv (caddr p-aus)))
|
||||
(+ (* (- sv) (car p-aus)) (* cv (caddr p-aus)))))
|
||||
;; Block verschieben: rotiertes KS_EIN auf startpunkt
|
||||
(vla-Move block-obj
|
||||
(vlax-3D-point p-ein-rot)
|
||||
(vlax-3D-point startpunkt))
|
||||
(setq offset (list (- (car startpunkt) (car p-ein-rot))
|
||||
(- (cadr startpunkt) (cadr p-ein-rot))
|
||||
(- (caddr startpunkt) (caddr p-ein-rot))))
|
||||
(setq ausgang (list (+ (car p-aus-rot) (car offset))
|
||||
(+ (cadr p-aus-rot) (cadr offset))
|
||||
(+ (caddr p-aus-rot) (caddr offset))))
|
||||
(princ (ssg-textf "vfe-hz-rotks-status"
|
||||
(list blockname
|
||||
(strcat (rtos hz-winkel 2 0) (chr 176))
|
||||
(rtos (caddr ausgang) 2 1))))
|
||||
ausgang
|
||||
)
|
||||
(progn
|
||||
(princ (ssg-textf "vfe-ks-fehlt-startpunkt" (list blockname)))
|
||||
startpunkt
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
(defun insert-hz-scaled-block-by-ks (blockname startpunkt laenge hz-winkel vert-winkel /
|
||||
rad-hz rad-vert chz shz cv sv scale
|
||||
temp-obj block-obj ks-data ks-ein ks-aus
|
||||
p-ein p-aus p-ein-s p-aus-s
|
||||
p-ein-rot p-aus-rot offset ausgang)
|
||||
(ensure-block-loaded blockname)
|
||||
(if (not (tblsearch "BLOCK" blockname))
|
||||
(progn
|
||||
(princ (ssg-textf "vfe-block-fehlt-abbruch" (list blockname)))
|
||||
(exit)
|
||||
)
|
||||
)
|
||||
(setq scale (/ (float laenge) 1000.0))
|
||||
(setq rad-hz (* (float hz-winkel) (/ pi 180.0)))
|
||||
(setq rad-vert (* (float vert-winkel) (/ pi 180.0)))
|
||||
(setq chz (cos rad-hz) shz (sin rad-hz))
|
||||
(setq cv (cos rad-vert) sv (sin rad-vert))
|
||||
;; KS bei Massstab 1
|
||||
(setq temp-obj (vla-InsertBlock modelspace (vlax-3D-point '(0 0 0)) blockname 1.0 1.0 1.0 0))
|
||||
(setq ks-data (extract-ks-from-block temp-obj))
|
||||
(if (not (vlax-erased-p temp-obj)) (vla-Delete temp-obj))
|
||||
(setq ks-ein (cadr (assoc "KS_EIN" ks-data)))
|
||||
(setq ks-aus (cadr (assoc "KS_AUS" ks-data)))
|
||||
;; Block mit XScale einfuegen und rotieren
|
||||
(setq block-obj (vla-InsertBlock modelspace (vlax-3D-point '(0 0 0)) blockname scale 1.0 1.0 0))
|
||||
(vla-TransformBy block-obj (vlax-tmatrix
|
||||
(list (list (* chz cv) (- shz) (* chz sv) 0)
|
||||
(list (* shz cv) chz (* shz sv) 0)
|
||||
(list (- sv) 0 cv 0)
|
||||
(list 0 0 0 1))))
|
||||
(if (and ks-ein ks-aus)
|
||||
(progn
|
||||
(setq p-ein (car ks-ein))
|
||||
(setq p-aus (car ks-aus))
|
||||
;; X-Skalierung anwenden
|
||||
(setq p-ein-s (list (* scale (car p-ein)) (cadr p-ein) (caddr p-ein)))
|
||||
(setq p-aus-s (list (* scale (car p-aus)) (cadr p-aus) (caddr p-aus)))
|
||||
;; Rotation: p' = Rz(hz)*Ry(vert) * p
|
||||
(setq p-ein-rot
|
||||
(list (+ (* chz cv (car p-ein-s)) (- (* shz (cadr p-ein-s))) (* chz sv (caddr p-ein-s)))
|
||||
(+ (* shz cv (car p-ein-s)) (* chz (cadr p-ein-s)) (* shz sv (caddr p-ein-s)))
|
||||
(+ (* (- sv) (car p-ein-s)) (* cv (caddr p-ein-s)))))
|
||||
(setq p-aus-rot
|
||||
(list (+ (* chz cv (car p-aus-s)) (- (* shz (cadr p-aus-s))) (* chz sv (caddr p-aus-s)))
|
||||
(+ (* shz cv (car p-aus-s)) (* chz (cadr p-aus-s)) (* shz sv (caddr p-aus-s)))
|
||||
(+ (* (- sv) (car p-aus-s)) (* cv (caddr p-aus-s)))))
|
||||
;; Block verschieben
|
||||
(vla-Move block-obj
|
||||
(vlax-3D-point p-ein-rot)
|
||||
(vlax-3D-point startpunkt))
|
||||
(setq offset (list (- (car startpunkt) (car p-ein-rot))
|
||||
(- (cadr startpunkt) (cadr p-ein-rot))
|
||||
(- (caddr startpunkt) (caddr p-ein-rot))))
|
||||
(setq ausgang (list (+ (car p-aus-rot) (car offset))
|
||||
(+ (cadr p-aus-rot) (cadr offset))
|
||||
(+ (caddr p-aus-rot) (caddr offset))))
|
||||
(princ (ssg-textf "vfe-hz-scaleks-status"
|
||||
(list blockname (rtos laenge 2 0)
|
||||
(strcat (rtos hz-winkel 2 0) (chr 176))
|
||||
(rtos (caddr ausgang) 2 1))))
|
||||
ausgang
|
||||
)
|
||||
(progn
|
||||
(princ (ssg-textf "vfe-ks-fehlt-startpunkt" (list blockname)))
|
||||
startpunkt
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; TEIL 4: WINKELBERECHNUNG (ETAGE)
|
||||
;; ============================================================
|
||||
(defun berechne-winkel-etage (deltaL deltaH richtung /
|
||||
winkel-list ergebnis-liste A B cos3 sin3
|
||||
bogen-x1 bogen-z1 bogen-x2 bogen-z2
|
||||
abs-dz-AUS abs-dz-EIN abs-dz-GEF
|
||||
L_GF L_VF cosα sinα
|
||||
winkel-eff cosEff sinEff rad5 rad7
|
||||
winkel mass1 mass2 gueltig
|
||||
best-winkel best-L_GF best-L_VF
|
||||
feste-gesamt-cos feste-gesamt-sin
|
||||
schraeg-hz-rad schraeg-cos schraeg-z)
|
||||
|
||||
(if (not *etage-lib-initialized*)
|
||||
(progn
|
||||
(alert (ssg-text "vfe-alert-bib-nicht-init"))
|
||||
(exit)
|
||||
)
|
||||
)
|
||||
|
||||
(setq abs-dz-AUS (abs etage-aus-dz)
|
||||
abs-dz-EIN (abs etage-ein-dz)
|
||||
abs-dz-GEF (abs etage-gef-dz))
|
||||
|
||||
(setq winkel-list '(3 6 9 12 15 18 21 27 33 39 45 51))
|
||||
(setq ergebnis-liste '())
|
||||
(setq cos3 (cos (* 3.0 (/ pi 180.0)))
|
||||
sin3 (sin (* 3.0 (/ pi 180.0))))
|
||||
|
||||
(setq feste-gesamt-cos (* FESTE_ETAGE_MITTE cos3))
|
||||
(setq feste-gesamt-sin (* FESTE_ETAGE_MITTE sin3))
|
||||
(setq schraeg-hz-rad (* (float ETAGE_HZ_WINKEL) (/ pi 180.0)))
|
||||
(setq schraeg-cos (* (cos schraeg-hz-rad) cos3))
|
||||
|
||||
(princ "\n\n=========================================")
|
||||
(princ (ssg-text "vfe-berechnung-header"))
|
||||
(princ "\n=========================================")
|
||||
(princ (ssg-textf "vfe-delta-info" (list (rtos deltaL 2 2) (rtos deltaH 2 2) richtung)))
|
||||
|
||||
(foreach winkel winkel-list
|
||||
(if (= richtung "Auf")
|
||||
(progn
|
||||
(setq mass1 (get-bogen-mass bogen-auf winkel))
|
||||
(setq mass2 (get-bogen-mass bogen-ab winkel))
|
||||
)
|
||||
(progn
|
||||
(setq mass1 (get-bogen-mass bogen-ab winkel))
|
||||
(setq mass2 (get-bogen-mass bogen-auf winkel))
|
||||
)
|
||||
)
|
||||
(if (or (null mass1) (null mass2))
|
||||
(progn
|
||||
(princ (ssg-textf "vfe-bogen-nicht-vorhanden" (list (strcat (itoa winkel) (chr 176)))))
|
||||
(setq ergebnis-liste (cons (list winkel nil nil nil) ergebnis-liste))
|
||||
)
|
||||
(progn
|
||||
(setq rad5 (* 3.0 (/ pi 180.0)))
|
||||
(setq rad7 (* (float (if (= richtung "Auf") (- 3 winkel) (+ winkel 3)))
|
||||
(/ pi 180.0)))
|
||||
(setq bogen-x1 (+ (* (car mass1) (cos rad5)) (* (caddr mass1) (sin rad5))))
|
||||
(setq bogen-z1 (+ (* (- (car mass1)) (sin rad5)) (* (caddr mass1) (cos rad5))))
|
||||
(setq bogen-x2 (+ (* (car mass2) (cos rad7)) (* (caddr mass2) (sin rad7))))
|
||||
(setq bogen-z2 (+ (* (- (car mass2)) (sin rad7)) (* (caddr mass2) (cos rad7))))
|
||||
(setq cosα (cos (* winkel (/ pi 180.0)))
|
||||
sinα (sin (* winkel (/ pi 180.0))))
|
||||
(setq winkel-eff (if (= richtung "Auf") (- winkel 3) (+ winkel 3)))
|
||||
(setq cosEff (cos (* winkel-eff (/ pi 180.0)))
|
||||
sinEff (sin (* winkel-eff (/ pi 180.0))))
|
||||
;; A: horizontaler Rest nach Abzug aller festen Teile
|
||||
(setq A (- deltaL
|
||||
etage-aus-dx
|
||||
etage-ein-dx
|
||||
(* 2.0 ETAGE_SCHRAEG_LAENGE schraeg-cos)
|
||||
(* 2.0 etage-gef-dx)
|
||||
bogen-x1
|
||||
bogen-x2
|
||||
(* 2.0 feste-gesamt-cos)))
|
||||
;; B: vertikaler Rest (Vorzeichen analog Standard)
|
||||
(setq schraeg-z (* ETAGE_SCHRAEG_LAENGE sin3))
|
||||
(if (= richtung "Auf")
|
||||
(setq B (+ deltaH
|
||||
abs-dz-AUS
|
||||
abs-dz-EIN
|
||||
(* 2.0 schraeg-z)
|
||||
(* 2.0 abs-dz-GEF)
|
||||
(- bogen-z1)
|
||||
(- bogen-z2)
|
||||
(* 2.0 feste-gesamt-sin)))
|
||||
(setq B (+ (- deltaH
|
||||
abs-dz-AUS
|
||||
abs-dz-EIN
|
||||
(* 2.0 schraeg-z)
|
||||
(* 2.0 abs-dz-GEF)
|
||||
(* 2.0 feste-gesamt-sin))
|
||||
bogen-z1
|
||||
bogen-z2))
|
||||
)
|
||||
(if (> (abs sinα) 0.0001)
|
||||
(progn
|
||||
(setq L_GF (/ (- (* A sinEff) (* B cosEff)) sinα))
|
||||
(if (= richtung "Auf")
|
||||
(setq L_VF (/ (+ (* A sin3) (* B cos3)) sinα))
|
||||
(setq L_VF (/ (- (* B cos3) (* A sin3)) sinα))
|
||||
)
|
||||
(if (and (numberp L_GF) (numberp L_VF))
|
||||
(progn
|
||||
(setq gueltig (and (>= L_GF 0) (>= L_VF 0)))
|
||||
(setq ergebnis-liste
|
||||
(cons (list winkel L_GF L_VF gueltig) ergebnis-liste))
|
||||
)
|
||||
(setq ergebnis-liste (cons (list winkel nil nil nil) ergebnis-liste))
|
||||
)
|
||||
)
|
||||
(setq ergebnis-liste (cons (list winkel nil nil nil) ergebnis-liste))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(setq ergebnis-liste (reverse ergebnis-liste))
|
||||
|
||||
(princ "\n\n=================================================================================")
|
||||
(princ (ssg-text "vfe-ergebnistabelle-header"))
|
||||
(princ "\n=================================================================================")
|
||||
(princ (ssg-text "vfe-tabelle-spalten"))
|
||||
(princ "\n=================================================================================")
|
||||
|
||||
(setq best-winkel nil best-L_GF nil best-L_VF nil)
|
||||
(foreach item ergebnis-liste
|
||||
(setq winkel (car item)
|
||||
L_GF (cadr item)
|
||||
L_VF (caddr item)
|
||||
gueltig (cadddr item))
|
||||
(if (and (numberp L_GF) (numberp L_VF))
|
||||
(progn
|
||||
(princ (ssg-textf "vfe-tabelle-zeile"
|
||||
(list (strcat (itoa winkel) (chr 176)) (fmt L_GF) (fmt L_VF))))
|
||||
(if gueltig
|
||||
(progn
|
||||
(princ (ssg-text "vfe-status-gueltig"))
|
||||
(if (or (null best-winkel) (< winkel best-winkel))
|
||||
(setq best-winkel winkel best-L_GF L_GF best-L_VF L_VF)
|
||||
)
|
||||
)
|
||||
(princ (ssg-text "vfe-status-ungueltig"))
|
||||
)
|
||||
)
|
||||
(princ (ssg-textf "vfe-tabelle-zeile-fehler" (list (strcat (itoa winkel) (chr 176)))))
|
||||
)
|
||||
)
|
||||
(princ "\n=================================================================================")
|
||||
(if best-winkel
|
||||
(princ (ssg-textf "vfe-empfohlener-winkel" (list (strcat (itoa best-winkel) (chr 176)))))
|
||||
(princ (ssg-text "vfe-kein-winkel-gefunden"))
|
||||
)
|
||||
(list best-winkel best-L_GF best-L_VF ergebnis-liste)
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; TEIL 5: BERECHNE-WRAPPER (Schnittstelle fuer Registry)
|
||||
;; ============================================================
|
||||
;; Initialisiert Etage-Bibliothek, aktiviert Gefaellebogen-Masse
|
||||
;; passend zur gewaehlten Seite (benoetigt fuer Geometrieberechnung).
|
||||
(defun berechne-etage (deltaL deltaH richtung seite)
|
||||
(init-bibliothek-etage)
|
||||
(if (= seite "rechts")
|
||||
(progn
|
||||
(setq etage-gef-dx etage-gef-dx-rechts)
|
||||
(setq etage-gef-dz etage-gef-dz-rechts))
|
||||
(progn
|
||||
(setq etage-gef-dx etage-gef-dx-links)
|
||||
(setq etage-gef-dz etage-gef-dz-links))
|
||||
)
|
||||
(princ (ssg-textf "vfe-gefaellebogen-seite-dx" (list seite (rtos etage-gef-dx 2 2))))
|
||||
(berechne-winkel-etage deltaL deltaH richtung)
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; TEIL 6: EINFUEGEN (15 Schritte, ohne VF_*-Block-Erstellung)
|
||||
;; ============================================================
|
||||
;; Gibt endpunkt zurueck.
|
||||
;; VF_*-Block-Erstellung erfolgt zentral im Dispatcher (vf_core.lsp).
|
||||
;; hz: Parameter fuer Registry-Kompatibilitaet mit variofoerderer-einfuegen
|
||||
;; (siehe c:VarioFoerderer) - wird hier NICHT verwendet: die Etage-Anlage hat
|
||||
;; bereits eine eigene, fest verdrahtete horizontale Geometrie (hz-anfang/
|
||||
;; hz-ende fuer den 60-Grad-Uebereinander-Versatz) und unterstuetzt aktuell
|
||||
;; keine zusaetzliche globale Fahrtrichtung.
|
||||
(defun etage-foerderanlage-einfuegen (deltaL deltaH richtung
|
||||
best-winkel L_GF1 L_GF2 L_VF
|
||||
startpunkt seite hz
|
||||
/ aktueller-punkt bogen-name endpunkt
|
||||
bogen-mass bogen-dx bogen-dz
|
||||
as-block es-block gefaelle-blockname
|
||||
hz-vorzeichen hz-anfang hz-ende)
|
||||
(setq aktueller-punkt startpunkt)
|
||||
;; Horizontalwinkel-Vorzeichen je nach Seite:
|
||||
;; rechts: Anfang +60 Grad (links), Ende -60 Grad (rechts)
|
||||
;; links: Anfang -60 Grad, Ende +60 Grad
|
||||
(setq hz-vorzeichen (if (= seite "rechts") 1 -1))
|
||||
(setq hz-anfang (* hz-vorzeichen ETAGE_HZ_WINKEL))
|
||||
(setq hz-ende (* (- hz-vorzeichen) ETAGE_HZ_WINKEL))
|
||||
(setq as-block (strcat "AS_Element_30_" seite))
|
||||
(setq es-block (strcat "ES_Element_30_" seite))
|
||||
(setq gefaelle-blockname
|
||||
(if (= seite "rechts")
|
||||
"Gefaellebogen_rechts_60_R500"
|
||||
"Gefaellebogen_links_60_R500"
|
||||
))
|
||||
;; Sentinel: Bibliothek neu initialisieren wenn Bloecke fehlen
|
||||
(if (and *etage-lib-initialized* (not (tblsearch "BLOCK" "AS_Element_30_rechts")))
|
||||
(setq *etage-lib-initialized* nil))
|
||||
(if (not *etage-lib-initialized*) (init-bibliothek-etage))
|
||||
|
||||
;; 1. AS_30
|
||||
(princ (ssg-textf "vfe-step1-as30" (list as-block)))
|
||||
(setq aktueller-punkt (insert-block-by-ks as-block aktueller-punkt 0.0))
|
||||
|
||||
;; 2. Staustrecke 400mm (hz-anfang, 3 Grad vert, KS_EIN)
|
||||
(princ (ssg-textf "vfe-step2" (list (itoa hz-anfang))))
|
||||
(setq aktueller-punkt
|
||||
(insert-hz-scaled-block-by-ks "Staustrecke_SP_1000_mm" aktueller-punkt
|
||||
400 hz-anfang 3))
|
||||
|
||||
;; 3. Separator (hz-anfang, 3 Grad vert)
|
||||
(princ (ssg-textf "vfe-step3" (list (itoa hz-anfang))))
|
||||
(setq aktueller-punkt
|
||||
(insert-hz-rotated-block-with-ks "Staustrecke_Separator_SP_300_mm" aktueller-punkt
|
||||
hz-anfang 3 300 0))
|
||||
|
||||
;; 4. Gefaellebogen Anfang (hz-anfang, 0 Grad vert, KS_EIN)
|
||||
(princ (ssg-textf "vfe-step4" (list gefaelle-blockname (itoa hz-anfang))))
|
||||
(setq aktueller-punkt
|
||||
(insert-hz-rotated-block-by-ks gefaelle-blockname aktueller-punkt hz-anfang 0))
|
||||
|
||||
;; 5. L_GF1 (3 Grad geneigt)
|
||||
(if (> L_GF1 0.1)
|
||||
(progn
|
||||
(princ (ssg-textf "vfe-step5-strecke" (list (rtos L_GF1 2 2))))
|
||||
(setq aktueller-punkt
|
||||
(insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt L_GF1 3 0.0))
|
||||
)
|
||||
(princ (ssg-text "vfe-step5-skip"))
|
||||
)
|
||||
|
||||
;; 6. Umlenkstation (3 Grad geneigt)
|
||||
(princ (ssg-text "vfe-step6"))
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks "Vario_Umlenkstation_500mm" aktueller-punkt 3 500 0 0.0))
|
||||
|
||||
;; 7. 1. Vertikalbogen (3 Grad geneigt)
|
||||
(if (= richtung "Auf")
|
||||
(progn
|
||||
(setq bogen-name (strcat "Vario_Bogen_auf_" (itoa best-winkel)))
|
||||
(setq bogen-mass (get-bogen-mass bogen-auf best-winkel))
|
||||
)
|
||||
(progn
|
||||
(setq bogen-name (strcat "Vario_Bogen_ab_" (itoa best-winkel)))
|
||||
(setq bogen-mass (get-bogen-mass bogen-ab best-winkel))
|
||||
)
|
||||
)
|
||||
(setq bogen-dx (car bogen-mass) bogen-dz (caddr bogen-mass))
|
||||
(princ (ssg-textf "vfe-step7" (list bogen-name)))
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks bogen-name aktueller-punkt 3 bogen-dx bogen-dz 0.0))
|
||||
|
||||
;; 8. Variable Strecke L_VF
|
||||
(if (> L_VF 0.1)
|
||||
(progn
|
||||
(if (= richtung "Auf")
|
||||
(progn
|
||||
(princ (ssg-textf "vfe-step8-auf" (list (itoa (- (- best-winkel 3))) (rtos L_VF 2 2))))
|
||||
(setq aktueller-punkt
|
||||
(insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt
|
||||
L_VF (- (- best-winkel 3)) 0.0))
|
||||
)
|
||||
(progn
|
||||
(princ (ssg-textf "vfe-step8-ab" (list (itoa (+ best-winkel 3)) (rtos L_VF 2 2))))
|
||||
(setq aktueller-punkt
|
||||
(insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt
|
||||
L_VF (+ best-winkel 3) 0.0))
|
||||
)
|
||||
)
|
||||
)
|
||||
(princ (ssg-text "vfe-step8-skip"))
|
||||
)
|
||||
|
||||
;; 9. 2. Vertikalbogen
|
||||
(if (= richtung "Auf")
|
||||
(progn
|
||||
(setq bogen-name (strcat "Vario_Bogen_ab_" (itoa best-winkel)))
|
||||
(setq bogen-mass (get-bogen-mass bogen-ab best-winkel))
|
||||
)
|
||||
(progn
|
||||
(setq bogen-name (strcat "Vario_Bogen_auf_" (itoa best-winkel)))
|
||||
(setq bogen-mass (get-bogen-mass bogen-auf best-winkel))
|
||||
)
|
||||
)
|
||||
(setq bogen-dx (car bogen-mass) bogen-dz (caddr bogen-mass))
|
||||
(if (= richtung "Auf")
|
||||
(progn
|
||||
(princ (strcat "\n\n9/15: " bogen-name
|
||||
" (" (itoa (- 3 best-winkel)) " Grad geneigt)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks bogen-name aktueller-punkt
|
||||
(- 3 best-winkel) bogen-dx bogen-dz 0.0))
|
||||
)
|
||||
(progn
|
||||
(princ (strcat "\n\n9/15: " bogen-name
|
||||
" (" (itoa (+ best-winkel 3)) " Grad geneigt)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks bogen-name aktueller-punkt
|
||||
(+ best-winkel 3) bogen-dx bogen-dz 0.0))
|
||||
)
|
||||
)
|
||||
|
||||
;; 10. Motorstation (3 Grad geneigt)
|
||||
(princ "\n\n10/15: Motorstation (500mm, 3 Grad geneigt)")
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks "Vario_Motorstation_500mm" aktueller-punkt 3 500 0 0.0))
|
||||
|
||||
;; 11. L_GF2 (3 Grad geneigt)
|
||||
(if (> L_GF2 0.1)
|
||||
(progn
|
||||
(princ (strcat "\n\n11/15: Gefaellestrecke (3 Grad, L=" (rtos L_GF2 2 2) " mm)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt L_GF2 3 0.0))
|
||||
)
|
||||
(princ "\n\n11/15: L_GF2 (uebersprungen)")
|
||||
)
|
||||
|
||||
;; 12. Gefaellebogen Ende (via KS_EIN, 0 Grad vert)
|
||||
(princ (strcat "\n\n12/15: " gefaelle-blockname " (Ende, KS_EIN)"))
|
||||
(setq aktueller-punkt (insert-block-by-ks gefaelle-blockname aktueller-punkt 0.0))
|
||||
|
||||
;; 13. Separator Ende (hz-ende, 3 Grad vert)
|
||||
(princ (strcat "\n\n13/15: Separator (300mm, "
|
||||
(itoa hz-ende) " Grad hz, 3 Grad vert)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-hz-rotated-block-with-ks "Staustrecke_Separator_SP_300_mm" aktueller-punkt
|
||||
hz-ende 3 300 0))
|
||||
|
||||
;; 14. Staustrecke 400mm Ende (hz-ende, 3 Grad vert, KS_EIN)
|
||||
(princ (strcat "\n\n14/15: Staustrecke 400mm ("
|
||||
(itoa hz-ende) " Grad hz, 3 Grad vert, KS_EIN)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-hz-scaled-block-by-ks "Staustrecke_SP_1000_mm" aktueller-punkt
|
||||
400 hz-ende 3))
|
||||
|
||||
;; 15. ES_30 (hz-ende, 0 Grad vert)
|
||||
(princ (strcat "\n\n15/15: " es-block
|
||||
" (Ende, " (itoa hz-ende) " Grad hz, 0 Grad vert)"))
|
||||
(setq endpunkt
|
||||
(insert-hz-rotated-block-with-ks es-block aktueller-punkt
|
||||
hz-ende 0 etage-ein-dx etage-ein-dz))
|
||||
|
||||
(princ "\n\n=========================================")
|
||||
(princ "\n>>> Etage-VarioFoerderer eingefuegt! <<<")
|
||||
endpunkt
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; REGISTRIERUNG
|
||||
;; ============================================================
|
||||
(vf-typ-registrieren
|
||||
"etage"
|
||||
'berechne-etage
|
||||
'etage-foerderanlage-einfuegen
|
||||
"Etage VarioFoerderer (AS/ES 30 Grad, direkt uebereinander)")
|
||||
|
||||
(princ "\n>>> vf_etage.lsp geladen - Typ 'etage' registriert")
|
||||
(princ)
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,712 @@
|
||||
;; ============================================================
|
||||
;; VF_STANDARD - Standard VarioFoerderer (Typ: "standard")
|
||||
;; Version: 26.0
|
||||
;; Abhaengigkeit: vf_core.lsp muss zuerst geladen sein
|
||||
;; Geometrie: AS/ES 90 Grad, horizontal versetzt
|
||||
;; 11-Schritt-Einfuegung
|
||||
;; ============================================================
|
||||
|
||||
;; Sicherstellen, dass vf_core.lsp geladen ist
|
||||
(if (not (car (atoms-family 1 '("VF-TYP-REGISTRIEREN"))))
|
||||
(progn
|
||||
(setq *vf-std-core-pfad*
|
||||
(cond
|
||||
((getenv "DXFM_LISP")
|
||||
(vl-string-translate "\\" "/" (getenv "DXFM_LISP")))
|
||||
((and (boundp '*ssg-lisp-pfad*) *ssg-lisp-pfad*)
|
||||
*ssg-lisp-pfad*)
|
||||
(t nil)
|
||||
)
|
||||
)
|
||||
(if *vf-std-core-pfad*
|
||||
(load (strcat *vf-std-core-pfad* "/vf_core.lsp"))
|
||||
(progn
|
||||
(princ (ssg-text "vfs-warn-lisppfad"))
|
||||
(exit)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; TEIL 1: STANDARD-SPEZIFISCHE GLOBALE VARIABLEN
|
||||
;; ============================================================
|
||||
(setq aus-dx nil aus-dy nil aus-dz nil)
|
||||
(setq ein-dx nil ein-dy nil ein-dz nil)
|
||||
(setq separator-laenge nil umlenk-laenge nil motorstation-laenge nil)
|
||||
(setq staustrecke-basis 1000)
|
||||
(setq FESTE_HORIZONTAL 1600)
|
||||
|
||||
(setq bogen-auf '())
|
||||
(setq bogen-ab '())
|
||||
|
||||
(setq *lib-initialized* nil)
|
||||
(setq *bogen-cache-loaded* nil)
|
||||
(setq *modul-cache* nil)
|
||||
|
||||
;; ============================================================
|
||||
;; TEIL 2: BLOCK-DATEI-PRUEFUNG
|
||||
;; ============================================================
|
||||
;; Prueft ob alle benoetigten Block-Dateien vorhanden sind.
|
||||
;; Gibt t zurueck wenn OK (oder Library-DXF vorhanden), nil wenn Einzeldateien fehlen.
|
||||
(defun vf-check-required-blocks ( / lib-datei bogen-winkel required-blocks missing bname datei)
|
||||
(setq lib-datei
|
||||
(strcat (vl-string-translate "\\" "/" (getenv "DXFM_DATA"))
|
||||
"/block_libraries/ils_library.dxf"))
|
||||
(if (findfile lib-datei)
|
||||
t ;; Library-Datei vorhanden: alle Bloecke darin verfuegbar
|
||||
(progn
|
||||
(setq bogen-winkel (ssg-cfg-or "vario" "bogen_winkel"
|
||||
'(3 6 9 12 15 18 21 27 33 39 45 51)))
|
||||
(setq required-blocks
|
||||
(append
|
||||
(list "AS_Element_90_links" "AS_Element_90_rechts"
|
||||
"ES_Element_90_links" "ES_Element_90_rechts"
|
||||
"Staustrecke_SP_1000_mm" "Staustrecke_Separator_SP_300_mm"
|
||||
"Vario_Umlenkstation_500mm" "Vario_Motorstation_500mm")
|
||||
(mapcar (function (lambda (w) (strcat "Vario_Bogen_auf_" (itoa w)))) bogen-winkel)
|
||||
(mapcar (function (lambda (w) (strcat "Vario_Bogen_ab_" (itoa w)))) bogen-winkel)
|
||||
)
|
||||
)
|
||||
(setq missing '())
|
||||
(foreach bname required-blocks
|
||||
(setq datei (strcat block-pfad bname ".dwg"))
|
||||
(if (not (findfile datei))
|
||||
(setq missing (cons datei missing))
|
||||
)
|
||||
)
|
||||
(if missing
|
||||
(progn
|
||||
(princ (ssg-textf "vfs-block-fehler-pfad" (list block-pfad)))
|
||||
(princ (ssg-text "vfs-block-fehlende-header"))
|
||||
(foreach f (reverse missing)
|
||||
(princ (ssg-textf "vfs-block-fehlende-item" (list f)))
|
||||
)
|
||||
nil
|
||||
)
|
||||
t
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; TEIL 3: BIBLIOTHEK INITIALISIEREN
|
||||
;; ============================================================
|
||||
(defun init-bibliothek ( / temp-obj bogen-winkel ks-data ks-ein-pos ks-aus-pos
|
||||
dx dy dz bogen-name)
|
||||
;; "bereits initialisiert" nur, wenn das Flag gesetzt UND die Bogen-Tabelle
|
||||
;; tatsaechlich befuellt ist. Sonst (Stuck-State: Flag gesetzt, aber bogen-auf
|
||||
;; leer - z.B. nach einer fehlgeschlagenen Extraktion) neu initialisieren.
|
||||
(if (and *lib-initialized* bogen-auf bogen-ab
|
||||
(tblsearch "BLOCK" "AS_Element_90_links"))
|
||||
(progn
|
||||
(princ (ssg-text "vfs-lib-bereits-init"))
|
||||
t
|
||||
)
|
||||
(if (not (vf-check-required-blocks))
|
||||
nil
|
||||
(progn
|
||||
(setq *lib-initialized* nil)
|
||||
(setq *ks-cache* nil)
|
||||
(princ (ssg-text "vfs-lib-init-start"))
|
||||
|
||||
;; AS_90 Masse extrahieren
|
||||
(princ (ssg-text "vfs-extrahiere-aus"))
|
||||
(ensure-block-loaded "AS_Element_90_links")
|
||||
(ensure-block-loaded "AS_Element_90_rechts")
|
||||
(if (tblsearch "BLOCK" "AS_Element_90_links")
|
||||
(progn
|
||||
(setq temp-obj (vla-InsertBlock modelspace
|
||||
(vlax-3D-point '(0 0 0))
|
||||
"AS_Element_90_links" 1.0 1.0 1.0 0))
|
||||
(setq ks-data (extract-ks-from-block temp-obj))
|
||||
(vla-Delete temp-obj)
|
||||
(setq ks-ein-pos nil ks-aus-pos nil)
|
||||
(foreach item ks-data
|
||||
(if (= (car item) "KS_EIN") (setq ks-ein-pos (cadr item)))
|
||||
(if (= (car item) "KS_AUS") (setq ks-aus-pos (cadr item)))
|
||||
)
|
||||
(if (and ks-ein-pos ks-aus-pos)
|
||||
(progn
|
||||
(setq aus-dx (- (caar ks-aus-pos) (caar ks-ein-pos)))
|
||||
(setq aus-dy (- (cadr (car ks-aus-pos)) (cadr (car ks-ein-pos))))
|
||||
(setq aus-dz (- (caddr (car ks-aus-pos)) (caddr (car ks-ein-pos))))
|
||||
(princ (ssg-textf "vfs-as90-mass" (list (rtos aus-dx 2 0) (rtos aus-dz 2 0))))
|
||||
)
|
||||
(princ (ssg-text "vfs-fehler-ks-as90"))
|
||||
)
|
||||
)
|
||||
(princ (ssg-text "vfs-fehler-block-as90"))
|
||||
)
|
||||
|
||||
;; ES_90 Masse extrahieren
|
||||
(princ (ssg-text "vfs-extrahiere-ein"))
|
||||
(ensure-block-loaded "ES_Element_90_links")
|
||||
(ensure-block-loaded "ES_Element_90_rechts")
|
||||
(if (tblsearch "BLOCK" "ES_Element_90_links")
|
||||
(progn
|
||||
(setq temp-obj (vla-InsertBlock modelspace
|
||||
(vlax-3D-point '(0 0 0))
|
||||
"ES_Element_90_links" 1.0 1.0 1.0 0))
|
||||
(setq ks-data (extract-ks-from-block temp-obj))
|
||||
(vla-Delete temp-obj)
|
||||
(setq ks-ein-pos nil ks-aus-pos nil)
|
||||
(foreach item ks-data
|
||||
(if (= (car item) "KS_EIN") (setq ks-ein-pos (cadr item)))
|
||||
(if (= (car item) "KS_AUS") (setq ks-aus-pos (cadr item)))
|
||||
)
|
||||
(if (and ks-ein-pos ks-aus-pos)
|
||||
(progn
|
||||
(setq ein-dx (- (caar ks-aus-pos) (caar ks-ein-pos)))
|
||||
(setq ein-dy (- (cadr (car ks-aus-pos)) (cadr (car ks-ein-pos))))
|
||||
(setq ein-dz (- (caddr (car ks-aus-pos)) (caddr (car ks-ein-pos))))
|
||||
(princ (ssg-textf "vfs-es90-mass" (list (rtos ein-dx 2 0) (rtos ein-dz 2 0))))
|
||||
)
|
||||
(princ (ssg-text "vfs-fehler-ks-es90"))
|
||||
)
|
||||
)
|
||||
(princ (ssg-text "vfs-fehler-block-es90"))
|
||||
)
|
||||
|
||||
;; Bogen-Masse extrahieren
|
||||
(princ (ssg-text "vfs-extrahiere-bogen"))
|
||||
(setq bogen-auf '())
|
||||
(setq bogen-ab '())
|
||||
(setq bogen-winkel (ssg-cfg-or "vario" "bogen_winkel"
|
||||
'(3 6 9 12 15 18 21 27 33 39 45 51)))
|
||||
(foreach w bogen-winkel
|
||||
;; Aufwaertsbogen
|
||||
(setq bogen-name (strcat "Vario_Bogen_auf_" (itoa w)))
|
||||
(ensure-block-loaded bogen-name)
|
||||
(if (tblsearch "BLOCK" bogen-name)
|
||||
(progn
|
||||
(setq temp-obj (vla-InsertBlock modelspace
|
||||
(vlax-3D-point '(0 0 0)) bogen-name 1.0 1.0 1.0 0))
|
||||
(setq ks-data (extract-ks-from-block temp-obj))
|
||||
(vla-Delete temp-obj)
|
||||
(setq ks-ein-pos nil ks-aus-pos nil)
|
||||
(foreach item ks-data
|
||||
(if (= (car item) "KS_EIN") (setq ks-ein-pos (cadr item)))
|
||||
(if (= (car item) "KS_AUS") (setq ks-aus-pos (cadr item)))
|
||||
)
|
||||
(if (and ks-ein-pos ks-aus-pos)
|
||||
(progn
|
||||
(setq dx (- (caar ks-aus-pos) (caar ks-ein-pos)))
|
||||
(setq dy (- (cadr (car ks-aus-pos)) (cadr (car ks-ein-pos))))
|
||||
(setq dz (- (caddr (car ks-aus-pos)) (caddr (car ks-ein-pos))))
|
||||
(setq bogen-auf (cons (list w dx dy dz) bogen-auf))
|
||||
(princ (ssg-textf "vfs-bogen-auf-ok" (list (itoa w) (rtos dx 2 0) (rtos dz 2 0))))
|
||||
)
|
||||
(princ (ssg-textf "vfs-bogen-auf-ks-fehlt" (list (itoa w))))
|
||||
)
|
||||
)
|
||||
(princ (ssg-textf "vfs-bogen-auf-block-fehlt" (list (itoa w))))
|
||||
)
|
||||
;; Abwaertsbogen
|
||||
(setq bogen-name (strcat "Vario_Bogen_ab_" (itoa w)))
|
||||
(ensure-block-loaded bogen-name)
|
||||
(if (tblsearch "BLOCK" bogen-name)
|
||||
(progn
|
||||
(setq temp-obj (vla-InsertBlock modelspace
|
||||
(vlax-3D-point '(0 0 0)) bogen-name 1.0 1.0 1.0 0))
|
||||
(setq ks-data (extract-ks-from-block temp-obj))
|
||||
(vla-Delete temp-obj)
|
||||
(setq ks-ein-pos nil ks-aus-pos nil)
|
||||
(foreach item ks-data
|
||||
(if (= (car item) "KS_EIN") (setq ks-ein-pos (cadr item)))
|
||||
(if (= (car item) "KS_AUS") (setq ks-aus-pos (cadr item)))
|
||||
)
|
||||
(if (and ks-ein-pos ks-aus-pos)
|
||||
(progn
|
||||
(setq dx (- (caar ks-aus-pos) (caar ks-ein-pos)))
|
||||
(setq dy (- (cadr (car ks-aus-pos)) (cadr (car ks-ein-pos))))
|
||||
(setq dz (- (caddr (car ks-aus-pos)) (caddr (car ks-ein-pos))))
|
||||
(setq bogen-ab (cons (list w dx dy dz) bogen-ab))
|
||||
(princ (ssg-textf "vfs-bogen-ab-ok" (list (itoa w) (rtos dx 2 0) (rtos dz 2 0))))
|
||||
)
|
||||
(princ (ssg-textf "vfs-bogen-ab-ks-fehlt" (list (itoa w))))
|
||||
)
|
||||
)
|
||||
(princ (ssg-textf "vfs-bogen-ab-block-fehlt" (list (itoa w))))
|
||||
)
|
||||
)
|
||||
(setq bogen-auf (reverse bogen-auf))
|
||||
(setq bogen-ab (reverse bogen-ab))
|
||||
(setq *lib-initialized* t)
|
||||
(princ (ssg-text "vfs-lib-init-erfolg"))
|
||||
t
|
||||
) ;; end progn (Initialisierung)
|
||||
) ;; end (if not vf-check-required-blocks)
|
||||
) ;; end outer (if and *lib-initialized*)
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; TEIL 3: BOGEN-MASSE
|
||||
;; ============================================================
|
||||
(defun get-bogen-mass (tabelle winkel)
|
||||
(setq result nil)
|
||||
(foreach item tabelle
|
||||
(if (= (car item) winkel) (setq result (cdr item)))
|
||||
)
|
||||
(if (null result)
|
||||
(princ (ssg-textf "vfs-fehler-winkel-tabelle" (list (itoa winkel))))
|
||||
)
|
||||
result
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; TEIL 4: WINKELBERECHNUNG
|
||||
;; ============================================================
|
||||
;; feste-hz: horizontales Budget der festen Elemente (Umlenk+Motor+Separatoren).
|
||||
;; nil => Standardwert FESTE_HORIZONTAL (1600, Standard-VF mit 2 Separatoren).
|
||||
;; Der Linienzug uebergibt 1300 (nur 1 Separator am Einlauf, siehe vf_linienzug).
|
||||
(defun berechne-alle-winkel (deltaL deltaH richtung feste-hz /
|
||||
winkel-list ergebnis-liste A B cos3 sin3
|
||||
bogen-x1 bogen-z1 bogen-x2 bogen-z2
|
||||
abs-dz-AUS abs-dz-EIN L_GF L_VF cosα sinα
|
||||
winkel-eff cosEff sinEff rad5 rad7
|
||||
winkel mass1 mass2 gueltig
|
||||
best-winkel best-L_GF best-L_VF)
|
||||
|
||||
(if (or (not *lib-initialized*) (null aus-dz) (null ein-dz))
|
||||
(progn
|
||||
(princ (ssg-text "vfs-fehler-lib-nicht-init"))
|
||||
(exit)
|
||||
)
|
||||
)
|
||||
(if (null feste-hz) (setq feste-hz FESTE_HORIZONTAL))
|
||||
|
||||
(setq abs-dz-AUS (abs aus-dz) abs-dz-EIN (abs ein-dz))
|
||||
(setq winkel-list (ssg-cfg-or "vario" "bogen_winkel"
|
||||
'(3 6 9 12 15 18 21 27 33 39 45 51)))
|
||||
(setq ergebnis-liste '())
|
||||
(setq cos3 (cos (* (ssg-cfg-or "vario" "gefaelle_winkel" 3) (/ pi 180.0)))
|
||||
sin3 (sin (* (ssg-cfg-or "vario" "gefaelle_winkel" 3) (/ pi 180.0))))
|
||||
|
||||
(princ "\n\n=========================================")
|
||||
(princ (ssg-text "vfs-berechnung-header"))
|
||||
(princ "\n=========================================")
|
||||
(princ (ssg-textf "vfs-berechnung-parameter"
|
||||
(list (rtos deltaL 2 2) (rtos deltaH 2 2) richtung)))
|
||||
|
||||
(foreach winkel winkel-list
|
||||
(if (= richtung "Auf")
|
||||
(progn
|
||||
(setq mass1 (get-bogen-mass bogen-auf winkel))
|
||||
(setq mass2 (get-bogen-mass bogen-ab winkel))
|
||||
)
|
||||
(progn
|
||||
(setq mass1 (get-bogen-mass bogen-ab winkel))
|
||||
(setq mass2 (get-bogen-mass bogen-auf winkel))
|
||||
)
|
||||
)
|
||||
(if (or (null mass1) (null mass2))
|
||||
(setq ergebnis-liste (cons (list winkel nil nil nil) ergebnis-liste))
|
||||
(progn
|
||||
(setq rad5 (* 3.0 (/ pi 180.0)))
|
||||
(setq rad7 (* (float (if (= richtung "Auf") (- 3 winkel) (+ winkel 3)))
|
||||
(/ pi 180.0)))
|
||||
(setq bogen-x1 (+ (* (car mass1) (cos rad5)) (* (caddr mass1) (sin rad5))))
|
||||
(setq bogen-z1 (+ (* (- (car mass1)) (sin rad5)) (* (caddr mass1) (cos rad5))))
|
||||
(setq bogen-x2 (+ (* (car mass2) (cos rad7)) (* (caddr mass2) (sin rad7))))
|
||||
(setq bogen-z2 (+ (* (- (car mass2)) (sin rad7)) (* (caddr mass2) (cos rad7))))
|
||||
(setq cosα (cos (* winkel (/ pi 180.0)))
|
||||
sinα (sin (* winkel (/ pi 180.0))))
|
||||
(setq A (- deltaL aus-dx ein-dx bogen-x1 bogen-x2
|
||||
(* feste-hz cos3)))
|
||||
(setq winkel-eff (if (= richtung "Auf") (- winkel 3) (+ winkel 3)))
|
||||
(setq cosEff (cos (* winkel-eff (/ pi 180.0)))
|
||||
sinEff (sin (* winkel-eff (/ pi 180.0))))
|
||||
(if (= richtung "Auf")
|
||||
(setq B (+ deltaH abs-dz-AUS abs-dz-EIN
|
||||
(- bogen-z1) (- bogen-z2)
|
||||
(* feste-hz sin3)))
|
||||
(setq B (+ (- deltaH abs-dz-AUS abs-dz-EIN
|
||||
(* feste-hz sin3))
|
||||
bogen-z1 bogen-z2))
|
||||
)
|
||||
(if (> (abs sinα) 0.0001)
|
||||
(progn
|
||||
(setq L_GF (/ (- (* A sinEff) (* B cosEff)) sinα))
|
||||
(if (= richtung "Auf")
|
||||
(setq L_VF (/ (+ (* A sin3) (* B cos3)) sinα))
|
||||
(setq L_VF (/ (- (* B cos3) (* A sin3)) sinα))
|
||||
)
|
||||
(if (and (numberp L_GF) (numberp L_VF))
|
||||
(progn
|
||||
(setq gueltig (and (>= L_GF 0) (>= L_VF 0)))
|
||||
(setq ergebnis-liste
|
||||
(cons (list winkel L_GF L_VF gueltig) ergebnis-liste))
|
||||
)
|
||||
(setq ergebnis-liste
|
||||
(cons (list winkel nil nil nil) ergebnis-liste))
|
||||
)
|
||||
)
|
||||
(setq ergebnis-liste (cons (list winkel nil nil nil) ergebnis-liste))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(setq ergebnis-liste (reverse ergebnis-liste))
|
||||
|
||||
(princ "\n\n=================================================================================")
|
||||
(princ (ssg-text "vfs-ergebnistabelle-header"))
|
||||
(princ "\n=================================================================================")
|
||||
(princ (ssg-text "vfs-tabelle-spalten"))
|
||||
(princ "\n=================================================================================")
|
||||
|
||||
(setq best-winkel nil best-L_GF nil best-L_VF nil)
|
||||
(foreach item ergebnis-liste
|
||||
(setq winkel (car item) L_GF (cadr item) L_VF (caddr item) gueltig (cadddr item))
|
||||
(if (and (numberp L_GF) (numberp L_VF))
|
||||
(progn
|
||||
(princ (ssg-textf "vfs-tabelle-zeile"
|
||||
(list (itoa winkel) (chr 176) (fmt L_GF) (fmt L_VF))))
|
||||
(if gueltig
|
||||
(progn
|
||||
(princ (ssg-text "vfs-status-gueltig"))
|
||||
(if (or (null best-winkel) (< winkel best-winkel))
|
||||
(setq best-winkel winkel best-L_GF L_GF best-L_VF L_VF)
|
||||
)
|
||||
)
|
||||
(princ (ssg-text "vfs-status-ungueltig"))
|
||||
)
|
||||
)
|
||||
(princ (ssg-textf "vfs-tabelle-zeile-fehler" (list (itoa winkel) (chr 176))))
|
||||
)
|
||||
)
|
||||
(princ "\n=================================================================================")
|
||||
(if best-winkel
|
||||
(princ (ssg-textf "vfs-empfohlener-winkel" (list (itoa best-winkel) (chr 176))))
|
||||
(princ (ssg-text "vfs-kein-winkel-gefunden"))
|
||||
)
|
||||
(list best-winkel best-L_GF best-L_VF ergebnis-liste)
|
||||
)
|
||||
|
||||
;; Prueft/berechnet die Variante mit HORIZONTALER Zwischenstrecke (Schritt
|
||||
;; 6/11 bei 0 Grad statt geneigt). Die beiden Vertikalboegen sind dabei
|
||||
;; IMMER auf 3 Grad fixiert (Vario_Bogen_auf_3 / Vario_Bogen_ab_3), weil sie
|
||||
;; nur zwischen der festen 3-Grad-Neigung von Umlenk-/Motorstation und der
|
||||
;; horizontalen Mitte vermitteln muessen - unabhaengig von Auf/Ab.
|
||||
;; WICHTIG (geometrische Konsequenz): GF1+GF2 (an AS/ES-Seite, ebenfalls
|
||||
;; fest bei 3 Grad geneigt) sind die einzige nennenswerte Quelle fuer
|
||||
;; Hoehenaenderung, da sich die beiden Boegen gegenseitig fast vollstaendig
|
||||
;; kompensieren. Die feste 3-Grad-Neigung wirkt IMMER absenkend:
|
||||
;; - "Ab": passt zur gewuenschten Absenkung -> deltaH praktisch beliebig
|
||||
;; erreichbar (im Rahmen von deltaL), GF1+GF2 werden einfach laenger.
|
||||
;; - "Auf": wirkt der gewuenschten Steigung entgegen -> nur fuer SEHR
|
||||
;; KLEINE deltaH ueberhaupt gueltig (wenige cm).
|
||||
;; Rueckgabe: (GF_total L_VF gueltig) oder nil falls Boegen nicht messbar.
|
||||
(defun berechne-horizontale-mitte (deltaL deltaH richtung /
|
||||
mass1 mass2 rad3 bogen-x1 bogen-z1
|
||||
bogen-x2 bogen-z2 deltaH-signiert
|
||||
A-hz B-hz GF_total L_VF-hz gueltig)
|
||||
(setq mass1 (get-bogen-mass bogen-auf 3))
|
||||
(setq mass2 (get-bogen-mass bogen-ab 3))
|
||||
(if (or (null mass1) (null mass2))
|
||||
nil
|
||||
(progn
|
||||
(setq rad3 (* 3.0 (/ pi 180.0)))
|
||||
;; Bogen1 (immer auf_3): Eintritt bei 3 Grad (von Umlenkstation), biegt auf 0 Grad
|
||||
(setq bogen-x1 (+ (* (car mass1) (cos rad3)) (* (caddr mass1) (sin rad3))))
|
||||
(setq bogen-z1 (+ (* (- (car mass1)) (sin rad3)) (* (caddr mass1) (cos rad3))))
|
||||
;; Bogen2 (immer ab_3): Eintritt bei 0 Grad (von der horizontalen Mitte), biegt auf 3 Grad
|
||||
(setq bogen-x2 (car mass2))
|
||||
(setq bogen-z2 (caddr mass2))
|
||||
;; Signierte Ziel-Hoehenaenderung: Auf=+deltaH, Ab=-deltaH
|
||||
(setq deltaH-signiert (if (= richtung "Auf") deltaH (- deltaH)))
|
||||
;; Horizontal-Budget: deltaL minus AS/ES minus beide Boegen minus feste Stationen (bei 3 Grad)
|
||||
(setq A-hz (- deltaL aus-dx ein-dx bogen-x1 bogen-x2
|
||||
(* FESTE_HORIZONTAL (cos rad3))))
|
||||
;; Hoehen-Budget: was GF1+GF2 (bei 3 Grad) noch beitragen muessen
|
||||
(setq B-hz (- (+ aus-dz ein-dz (- (* FESTE_HORIZONTAL (sin rad3)))
|
||||
bogen-z1 bogen-z2)
|
||||
deltaH-signiert))
|
||||
(setq GF_total (/ B-hz (sin rad3)))
|
||||
(setq L_VF-hz (- A-hz (* GF_total (cos rad3))))
|
||||
(setq gueltig (and (>= GF_total 0) (>= L_VF-hz 0)))
|
||||
(list GF_total L_VF-hz gueltig)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; TEIL 5: BERECHNE-WRAPPER (Schnittstelle fuer Registry)
|
||||
;; ============================================================
|
||||
;; Initialisiert Standard-Bibliothek und berechnet Winkel.
|
||||
;; seite-Parameter wird fuer Standard-Typ nicht benoetigt (keine Vorab-Geometrie).
|
||||
;; Die Machbarkeitspruefung fuer die horizontale Zwischenstrecke passiert
|
||||
;; separat und VORAB in c:VarioFoerderer (vor der Foerderrichtung-Abfrage),
|
||||
;; deshalb liefert diese Funktion nur noch die normale Winkelsuche zurueck.
|
||||
(defun berechne-standard (deltaL deltaH richtung seite)
|
||||
(setq FESTE_HORIZONTAL (ssg-cfg-or "vario" "feste_horizontal" 1600))
|
||||
(setq staustrecke-basis (ssg-cfg-or "vario" "staustrecke_basis" 1000))
|
||||
(init-bibliothek)
|
||||
(berechne-alle-winkel deltaL deltaH richtung nil)
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; TEIL 6: EINFUEGEN (11 Schritte, ohne VF_*-Block-Erstellung)
|
||||
;; ============================================================
|
||||
;; Gibt endpunkt zurueck (letzter KS_AUS nach ES_90).
|
||||
;; VF_*-Block-Erstellung erfolgt zentral im Dispatcher (vf_core.lsp).
|
||||
;; hz: horizontale Fahrtrichtung in Grad (0=Ost/+X, 90=Nord/+Y, 180=West/-X,
|
||||
;; 270=Sued/-Y). Default 0, falls vom Aufrufer nicht mitgegeben (Etage-
|
||||
;; Registry-Kompatibilitaet - siehe c:VarioFoerderer).
|
||||
;; --- Teil 1/3: AS-Element (Kettenanfang) ---
|
||||
;; Eigenstaendig, damit vf-linienzug (Gemischte GF/VF-Kette) ein VF-Segment
|
||||
;; auch OHNE eigenes AS/ES mitten in der Kette einfuegen kann (vfs-mitte-teil
|
||||
;; alleine), waehrend ein normaler Standard-VarioFoerderer weiterhin alle 3
|
||||
;; Teile nacheinander durchlaeuft (siehe variofoerderer-einfuegen unten).
|
||||
(defun vfs-as-teil (startpunkt seite hz / as-block)
|
||||
(if (null hz) (setq hz 0.0))
|
||||
(setq hz (float hz))
|
||||
(setq as-block (strcat "AS_Element_90_" seite))
|
||||
(if (not *lib-initialized*) (init-bibliothek))
|
||||
(princ (ssg-textf "vfs-schritt-as" (list as-block (rtos hz 2 1) grad-zeichen)))
|
||||
(insert-block-by-ks as-block startpunkt hz)
|
||||
)
|
||||
|
||||
;; --- Teil 2a: VF-Eingang (GF1 + Separator + Umlenkstation) ---
|
||||
;; Beginnt eine reine VF-Einheit: bringt die Kette von der (3-Grad-geneigten)
|
||||
;; AS-Seite ueber GF1 + Separator bis zur Umlenkstation. Wird pro VF-Einheit
|
||||
;; GENAU EINMAL aufgerufen (auch wenn danach mehrere Sub-Segmente folgen).
|
||||
(defun vfs-vf-entry (aktueller-punkt L_GF1 hz)
|
||||
(if (null hz) (setq hz 0.0))
|
||||
(setq hz (float hz))
|
||||
;; 1. Gefaellestrecke GF1 (verbindet AS-Neigung mit Umlenkstation)
|
||||
(if (> L_GF1 0.1)
|
||||
(progn
|
||||
(princ (ssg-textf "vfs-vf-eingang-gf1" (list (rtos L_GF1 2 2))))
|
||||
(setq aktueller-punkt
|
||||
(insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt
|
||||
L_GF1 (ssg-cfg-or "vario" "gefaelle_winkel" 3) hz))
|
||||
)
|
||||
(princ (ssg-text "vfs-vf-eingang-gf1-skip"))
|
||||
)
|
||||
;; 2. Separator (am GF1-Ende / vor Umlenkstation)
|
||||
(princ (ssg-text "vfs-vf-eingang-separator"))
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks "Staustrecke_Separator_SP_300_mm" aktueller-punkt
|
||||
(ssg-cfg-or "vario" "gefaelle_winkel" 3)
|
||||
(ssg-cfg-or "vario" "separator_block_dx" 300)
|
||||
(ssg-cfg-or "vario" "separator_block_dz" 0) hz))
|
||||
;; 3. Umlenkstation
|
||||
(princ (ssg-text "vfs-vf-eingang-umlenk"))
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks "Vario_Umlenkstation_500mm" aktueller-punkt
|
||||
(ssg-cfg-or "vario" "gefaelle_winkel" 3)
|
||||
(ssg-cfg-or "vario" "station_block_dx" 500)
|
||||
(ssg-cfg-or "vario" "station_block_dz" 0) hz))
|
||||
aktueller-punkt
|
||||
)
|
||||
|
||||
;; --- Teil 2b: VF-Koerper (Vertikalbogen + L_VF + Vertikalbogen) ---
|
||||
;; EIN reines VF-Sub-Segment. Wichtig: es BEGINNT und ENDET auf der
|
||||
;; 3-Grad-Basisneigung, weil Ein- und Ausgangsbogen denselben Winkel haben.
|
||||
;; Dadurch lassen sich mehrere Sub-Segmente (und Vario-Kurven dazwischen)
|
||||
;; beliebig aneinanderreihen (siehe doc/VarioFoerderer_Linienzug_Prinzipien.md).
|
||||
;; best-winkel=0 => horizontales Sub-Segment (Boegen fest auf_3/ab_3).
|
||||
(defun vfs-vf-koerper (aktueller-punkt richtung best-winkel L_VF hz /
|
||||
bogen-name bogen-mass bogen-dx bogen-dz)
|
||||
(if (null hz) (setq hz 0.0))
|
||||
(setq hz (float hz))
|
||||
|
||||
;; 5. 1. Vertikalbogen
|
||||
;; Sonderfall best-winkel=0 (horizontale Zwischenstrecke, siehe
|
||||
;; berechne-horizontale-mitte): Boegen IMMER auf_3/ab_3, unabhaengig von
|
||||
;; Auf/Ab, da sie nur zwischen der festen 3-Grad-Neigung und der
|
||||
;; horizontalen Mitte vermitteln muessen.
|
||||
(if (= best-winkel 0)
|
||||
(progn
|
||||
(setq bogen-name "Vario_Bogen_auf_3")
|
||||
(setq bogen-mass (get-bogen-mass bogen-auf 3))
|
||||
)
|
||||
(if (= richtung "Auf")
|
||||
(progn
|
||||
(setq bogen-name (strcat "Vario_Bogen_auf_" (itoa best-winkel)))
|
||||
(setq bogen-mass (get-bogen-mass bogen-auf best-winkel))
|
||||
)
|
||||
(progn
|
||||
(setq bogen-name (strcat "Vario_Bogen_ab_" (itoa best-winkel)))
|
||||
(setq bogen-mass (get-bogen-mass bogen-ab best-winkel))
|
||||
)
|
||||
)
|
||||
)
|
||||
(setq bogen-dx (car bogen-mass) bogen-dz (caddr bogen-mass))
|
||||
(princ (ssg-textf "vfs-schritt5-bogen1" (list bogen-name)))
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks bogen-name aktueller-punkt
|
||||
(ssg-cfg-or "vario" "gefaelle_winkel" 3) bogen-dx bogen-dz hz))
|
||||
|
||||
;; 6. Variable Strecke L_VF
|
||||
(if (> L_VF 0.1)
|
||||
(progn
|
||||
(if (= best-winkel 0)
|
||||
(progn
|
||||
(princ (strcat "\n\n6/11: Horizontale Zwischenstrecke (0 Grad, L="
|
||||
(rtos L_VF 2 2) " mm)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt
|
||||
L_VF 0 hz))
|
||||
)
|
||||
(if (= richtung "Auf")
|
||||
(progn
|
||||
(princ (strcat "\n\n6/11: Steigungsstrecke ("
|
||||
(itoa (- (- best-winkel 3))) " Grad, L=" (rtos L_VF 2 2) " mm)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt
|
||||
L_VF (- (- best-winkel 3)) hz))
|
||||
)
|
||||
(progn
|
||||
(princ (strcat "\n\n6/11: Gefaellestrecke ("
|
||||
(itoa (+ best-winkel 3)) " Grad, L=" (rtos L_VF 2 2) " mm)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt
|
||||
L_VF (+ best-winkel 3) hz))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
(princ "\n\n6/11: (uebersprungen)")
|
||||
)
|
||||
|
||||
;; 7. 2. Vertikalbogen
|
||||
(if (= best-winkel 0)
|
||||
(progn
|
||||
(setq bogen-name "Vario_Bogen_ab_3")
|
||||
(setq bogen-mass (get-bogen-mass bogen-ab 3))
|
||||
)
|
||||
(if (= richtung "Auf")
|
||||
(progn
|
||||
(setq bogen-name (strcat "Vario_Bogen_ab_" (itoa best-winkel)))
|
||||
(setq bogen-mass (get-bogen-mass bogen-ab best-winkel))
|
||||
)
|
||||
(progn
|
||||
(setq bogen-name (strcat "Vario_Bogen_auf_" (itoa best-winkel)))
|
||||
(setq bogen-mass (get-bogen-mass bogen-auf best-winkel))
|
||||
)
|
||||
)
|
||||
)
|
||||
(setq bogen-dx (car bogen-mass) bogen-dz (caddr bogen-mass))
|
||||
(if (= best-winkel 0)
|
||||
(progn
|
||||
(princ (strcat "\n\n7/11: " bogen-name " (3 Grad geneigt)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks bogen-name aktueller-punkt
|
||||
0 bogen-dx bogen-dz hz))
|
||||
)
|
||||
(if (= richtung "Auf")
|
||||
(progn
|
||||
(princ (strcat "\n\n7/11: " bogen-name
|
||||
" (" (itoa (- 3 best-winkel)) " Grad geneigt)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks bogen-name aktueller-punkt
|
||||
(- 3 best-winkel) bogen-dx bogen-dz hz))
|
||||
)
|
||||
(progn
|
||||
(princ (strcat "\n\n7/11: " bogen-name
|
||||
" (" (itoa (+ best-winkel 3)) " Grad geneigt)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks bogen-name aktueller-punkt
|
||||
(+ best-winkel 3) bogen-dx bogen-dz hz))
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
aktueller-punkt
|
||||
)
|
||||
|
||||
;; --- Teil 2c: VF-Ausgang (Motorstation [+ GF2] [+ Separator]) ---
|
||||
;; Schliesst eine reine VF-Einheit mit der Motorstation.
|
||||
;; L_GF2 > 0.1 => GF2 (3 Grad) wird angehaengt (verbindet Motorstation
|
||||
;; mit der Auslauf-Neigung).
|
||||
;; mit-separator T => Separator (300 mm) am Ende (Standard-VF: vor ES).
|
||||
;; Standard-VF: L_GF2 = L_GF/2, mit-separator = t.
|
||||
;; Linienzug: Separator wird NICHT hier gebaut (er sitzt erst vor dem ES bzw.
|
||||
;; optional zwischen Foerderern) -> mit-separator = nil; GF2 je nach Wahl.
|
||||
(defun vfs-vf-exit (aktueller-punkt L_GF2 hz mit-separator)
|
||||
(if (null hz) (setq hz 0.0))
|
||||
(setq hz (float hz))
|
||||
;; Motorstation
|
||||
(princ "\n\n[VF-Ausgang] Motorstation (500 mm, 3 Grad geneigt)")
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks "Vario_Motorstation_500mm" aktueller-punkt
|
||||
(ssg-cfg-or "vario" "gefaelle_winkel" 3)
|
||||
(ssg-cfg-or "vario" "station_block_dx" 500)
|
||||
(ssg-cfg-or "vario" "station_block_dz" 0) hz))
|
||||
;; GF2 (optional, verbindet Motorstation mit der Auslauf-Neigung)
|
||||
(if (> L_GF2 0.1)
|
||||
(progn
|
||||
(princ (strcat "\n[VF-Ausgang] Gefaellestrecke GF2 (3 Grad, L=" (rtos L_GF2 2 2) " mm)"))
|
||||
(setq aktueller-punkt
|
||||
(insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt
|
||||
L_GF2 (ssg-cfg-or "vario" "gefaelle_winkel" 3) hz))
|
||||
)
|
||||
(princ "\n[VF-Ausgang] GF2 (kein / uebersprungen)")
|
||||
)
|
||||
;; Separator (optional, nur Standard-VF)
|
||||
(if mit-separator
|
||||
(progn
|
||||
(princ "\n[VF-Ausgang] Separator (300 mm, 3 Grad geneigt)")
|
||||
(setq aktueller-punkt
|
||||
(insert-rotated-block-with-ks "Staustrecke_Separator_SP_300_mm" aktueller-punkt
|
||||
(ssg-cfg-or "vario" "gefaelle_winkel" 3)
|
||||
(ssg-cfg-or "vario" "separator_block_dx" 300)
|
||||
(ssg-cfg-or "vario" "separator_block_dz" 0) hz))
|
||||
)
|
||||
)
|
||||
aktueller-punkt
|
||||
)
|
||||
|
||||
;; --- Teil 2 (Zusammensetzung): Kettenmitte fuer den Standard-VF ---
|
||||
;; Entry + EIN Koerper + Exit. Verhalten identisch zur bisherigen Fassung.
|
||||
(defun vfs-mitte-teil (aktueller-punkt richtung best-winkel L_GF1 L_GF2 L_VF hz)
|
||||
(if (null hz) (setq hz 0.0))
|
||||
(setq hz (float hz))
|
||||
(setq aktueller-punkt (vfs-vf-entry aktueller-punkt L_GF1 hz))
|
||||
(setq aktueller-punkt (vfs-vf-koerper aktueller-punkt richtung best-winkel L_VF hz))
|
||||
(setq aktueller-punkt (vfs-vf-exit aktueller-punkt L_GF2 hz t))
|
||||
aktueller-punkt
|
||||
)
|
||||
|
||||
;; --- Teil 3/3: ES-Element (Kettenende) ---
|
||||
(defun vfs-es-teil (aktueller-punkt seite hz / es-block)
|
||||
(if (null hz) (setq hz 0.0))
|
||||
(setq hz (float hz))
|
||||
(setq es-block (strcat "ES_Element_90_" seite))
|
||||
(princ (strcat "\n\n11/11: " es-block " (hz=" (rtos hz 2 1) grad-zeichen ")"))
|
||||
(insert-block-by-ks es-block aktueller-punkt hz)
|
||||
)
|
||||
|
||||
;; --- Zusammensetzung: kompletter Standard-VarioFoerderer ---
|
||||
;; Reine Verkettung von Teil 1+2+3, Verhalten identisch zur bisherigen
|
||||
;; monolithischen Fassung. deltaL/deltaH werden hier nicht gebraucht (Teil
|
||||
;; der einfuege-fn-Schnittstelle der Typ-Registry, siehe vf-typ-registrieren).
|
||||
(defun variofoerderer-einfuegen (deltaL deltaH richtung best-winkel
|
||||
L_GF1 L_GF2 L_VF startpunkt seite hz
|
||||
/ aktueller-punkt endpunkt)
|
||||
(if (null hz) (setq hz 0.0))
|
||||
(setq hz (float hz))
|
||||
(setq aktueller-punkt (vfs-as-teil startpunkt seite hz))
|
||||
(setq aktueller-punkt
|
||||
(vfs-mitte-teil aktueller-punkt richtung best-winkel L_GF1 L_GF2 L_VF hz))
|
||||
(setq endpunkt (vfs-es-teil aktueller-punkt seite hz))
|
||||
|
||||
(princ "\n\n=========================================")
|
||||
(princ "\n>>> Standard VarioFoerderer eingefuegt!")
|
||||
endpunkt
|
||||
)
|
||||
|
||||
;; ============================================================
|
||||
;; REGISTRIERUNG
|
||||
;; ============================================================
|
||||
(vf-typ-registrieren
|
||||
"standard"
|
||||
'berechne-standard
|
||||
'variofoerderer-einfuegen
|
||||
"Standard VarioFoerderer (AS/ES 90 Grad, horizontal versetzt)")
|
||||
|
||||
(princ "\n>>> vf_standard.lsp geladen - Typ 'standard' registriert")
|
||||
(princ)
|
||||
@@ -16,7 +16,6 @@ SSG_LIB
|
||||
│ │ ├── BTMT-Beladung → ILS_BTMT_Beladung
|
||||
│ │ └── BTMT-Entladung → ILS_BTMT_Entladung
|
||||
│ ├── Foerderer
|
||||
│ │ ├── ETF Etagenfoerderer → ILS_ETF_Etagenfoerderer
|
||||
│ │ ├── TEF Strecke → ILS_TEF_Strecke
|
||||
│ │ ├── VarioFoerderer → FOERDERANLAGE
|
||||
│ │ ├── Kurven angetr. Aussen → ILS_K{90,60,30}{LA,RA}
|
||||
@@ -60,6 +59,9 @@ SSG_LIB
|
||||
│ │ ├── Antriebst. rechts → OMNI_TEF_AntriebR
|
||||
│ │ └── TEF Gerade → OMNI_TEF_Gerade
|
||||
│ └── KettenFoerderer → OMNI_KettenFoerderer
|
||||
├── Konfiguration
|
||||
│ ├── Umschalten 2D und 3D → SSG_DIM_SWITCH
|
||||
│ └── Sprache → SSG_SPRACHE
|
||||
└── External
|
||||
├── Call Python → CALLPYTHON
|
||||
├── Export Sivas → EXPORTSIVAS
|
||||
@@ -128,6 +130,13 @@ Unterstuetzte Bogenwinkel: 3, 9, 12, 15, 24, 36, 48 Grad
|
||||
| `SSG-LayerOnAll` | Alle ausgeschalteten Layer einschalten |
|
||||
| `SSG-LayerDelete` | Layer und alle Objekte darauf loeschen (mit Bestaetigung) |
|
||||
|
||||
### SSG_LIB_Commands.lsp - Konfiguration
|
||||
|
||||
| Befehl | Beschreibung |
|
||||
| --- | --- |
|
||||
| `SSG_DIM_SWITCH` | Schaltet zwischen 2D- und 3D-Bloecken um |
|
||||
| `SSG_SPRACHE` | Sprache umschalten (Deutsch/Englisch), persistiert ueber `DXFM_LANG` |
|
||||
|
||||
### tests.lsp - Export und Python-Integration
|
||||
|
||||
| Befehl | Beschreibung |
|
||||
@@ -141,6 +150,7 @@ Unterstuetzte Bogenwinkel: 3, 9, 12, 15, 24, 36, 48 Grad
|
||||
| Datei | Beschreibung |
|
||||
| --- | --- |
|
||||
| `ssg_core.lsp` | Kernel: Umgebung, Layer-Ops, Block-Ops, Attribut-Ops, Fehlerbehandlung |
|
||||
| `ssg_lang.lsp` | Sprachumschaltung Deutsch/Englisch (`ssg-text`, `ssg-textf`, `*ssg-lang*`) |
|
||||
| `ssg_dialog.lsp` | Dialog-Vorlagen: Slide-Preview, Modul-Dialog, Block-Einfuegesequenz |
|
||||
| `ssg_layer.lsp` | Layer-Verwaltungsbefehle |
|
||||
| `ssg_load.lsp` | Loader: Laedt alle SSG-Bibliotheken in korrekter Reihenfolge |
|
||||
@@ -181,6 +191,7 @@ dxfmakros/
|
||||
| `DXFM_CFG` | Konfigurationsdateien |
|
||||
| `DXFM_TESTS` | Testverzeichnis |
|
||||
| `DXFM_DATA` | Datenverzeichnis |
|
||||
| `DXFM_LANG` | Aktive Sprache (`de_DE`/`en_GB`), persistiert von `SSG_SPRACHE`; Default `de_DE` |
|
||||
| `BRICSCAD` | Pfad zur BricsCAD-Executable |
|
||||
|
||||
## Einrichtung
|
||||
|
||||
@@ -1,120 +0,0 @@
|
||||
;; ============================================================
|
||||
;; on_start.lsp - SSG_LIB Startup fuer BricsCAD
|
||||
;; Wird beim Start von BricsCAD automatisch ausgefuehrt
|
||||
;; ============================================================
|
||||
|
||||
(defun ssg-lib-safe-load (datei / result)
|
||||
(setq result (vl-catch-all-apply 'load (list datei)))
|
||||
(if (vl-catch-all-error-p result)
|
||||
(progn
|
||||
(princ (strcat "\n[SSG_LIB] FEHLER beim Laden von " datei ":"))
|
||||
(princ (strcat "\n " (vl-catch-all-error-message result)))
|
||||
nil
|
||||
)
|
||||
t
|
||||
)
|
||||
)
|
||||
|
||||
;; ------------------------------------------------------------
|
||||
;; SSG-DBG-FN - Prueft ob ein AutoLISP-Symbol gebunden ist
|
||||
;; Gibt "JA" oder "NEIN" zurueck (atoms-family, BRX-Cmds nicht pruefbar)
|
||||
;; ------------------------------------------------------------
|
||||
(defun ssg-dbg-fn (fname)
|
||||
(if (car (atoms-family 1 (list fname))) "JA" "NEIN")
|
||||
)
|
||||
|
||||
;; ------------------------------------------------------------
|
||||
;; SSG-LIB-REGISTER-CHECK - Verfuegbarkeit aller Befehle ins Debug-Log schreiben
|
||||
;; ------------------------------------------------------------
|
||||
(defun ssg-lib-register-check ()
|
||||
(dbgmsg "[CHECK] --- AutoLISP Funktionen (atoms-family) ---")
|
||||
(dbgmsg (strcat "ssg-start: " (ssg-dbg-fn "SSG-START")))
|
||||
(dbgmsg (strcat "ssg-end: " (ssg-dbg-fn "SSG-END")))
|
||||
(dbgmsg (strcat "ssg-make-layer: " (ssg-dbg-fn "SSG-MAKE-LAYER")))
|
||||
(dbgmsg (strcat "ssg-errhan: " (ssg-dbg-fn "SSG-ERRHAN")))
|
||||
(dbgmsg (strcat "ensure-block-loaded: " (ssg-dbg-fn "ENSURE-BLOCK-LOADED")))
|
||||
(dbgmsg "[CHECK] --- SSG_LIB_Commands (c:...) ---")
|
||||
(dbgmsg (strcat "c:ILS_BTMT_Beladung: " (ssg-dbg-fn "C:ILS_BTMT_BELADUNG")))
|
||||
(dbgmsg (strcat "c:ILS_K90LA: " (ssg-dbg-fn "C:ILS_K90LA")))
|
||||
(dbgmsg (strcat "c:ILS_TEF_Strecke: " (ssg-dbg-fn "C:ILS_TEF_STRECKE")))
|
||||
(dbgmsg (strcat "c:KreiselInsert: " (ssg-dbg-fn "C:KREISELINSERT")))
|
||||
(dbgmsg (strcat "c:KreiselEdit: " (ssg-dbg-fn "C:KREISELEDIT")))
|
||||
(dbgmsg (strcat "c:ILS_Eckrad: " (ssg-dbg-fn "C:ILS_ECKRAD")))
|
||||
(dbgmsg (strcat "c:OMNI_AP60: " (ssg-dbg-fn "C:OMNI_AP60")))
|
||||
(dbgmsg (strcat "c:OMNI_APB_630_90: " (ssg-dbg-fn "C:OMNI_APB_630_90")))
|
||||
(dbgmsg (strcat "c:OMNI_W90_Einfach: " (ssg-dbg-fn "C:OMNI_W90_EINFACH")))
|
||||
(dbgflush)
|
||||
)
|
||||
|
||||
(defun ssg-lib-startup ( / lisp-pfad menu-pfad curr-srch menu-datei lsp-fb-pfad)
|
||||
|
||||
;; Pfade aus Umgebungsvariablen lesen
|
||||
(setq lisp-pfad (getenv "DXFM_LISP"))
|
||||
(setq menu-pfad (getenv "DXFMAKRO"))
|
||||
|
||||
;; Pfadtrenner vereinheitlichen: Backslash -> Forward-Slash
|
||||
(if lisp-pfad (setq lisp-pfad (vl-string-translate "\\" "/" lisp-pfad)))
|
||||
(if menu-pfad (setq menu-pfad (vl-string-translate "\\" "/" menu-pfad)))
|
||||
|
||||
(if (null lisp-pfad)
|
||||
(progn
|
||||
(princ "\n[SSG_LIB] FEHLER: DXFM_LISP nicht gesetzt!")
|
||||
(princ "\n[SSG_LIB] Bitte zuerst bin\\setenv.bat ausfuehren.")
|
||||
)
|
||||
(progn
|
||||
;; Debug-Logging so frueh wie moeglich starten
|
||||
(if (findfile (strcat lisp-pfad "/ssg_dbg.lsp"))
|
||||
(progn
|
||||
(load (strcat lisp-pfad "/ssg_dbg.lsp"))
|
||||
(dbgopen "debugfile.dbg" "DXFM_LOG")
|
||||
(dbgmsg "[on_start] Startup begonnen")
|
||||
(dbgmsg (strcat "[on_start] DXFM_LISP=" lisp-pfad))
|
||||
(dbgmsg (strcat "[on_start] DXFMAKRO=" (if menu-pfad menu-pfad "nicht gesetzt")))
|
||||
(dbgflush)
|
||||
)
|
||||
)
|
||||
|
||||
(princ "\n[SSG_LIB] Lade SSG_LIB Umgebung...")
|
||||
|
||||
;; Library laden (direkt, damit Fehler sichtbar sind)
|
||||
;; Kein SRCHPATH-Aendern noetig - alle Dateien werden ueber
|
||||
;; absolute Pfade (Umgebungsvariablen) geladen
|
||||
(if (findfile (strcat lisp-pfad "/ssg_load.lsp"))
|
||||
(progn
|
||||
(load (strcat lisp-pfad "/ssg_load.lsp"))
|
||||
(princ "\n[SSG_LIB] ssg_load.lsp geladen.")
|
||||
)
|
||||
(princ "\n[SSG_LIB] WARNUNG: ssg_load.lsp nicht gefunden!")
|
||||
)
|
||||
|
||||
;; Menue laden
|
||||
(if menu-pfad
|
||||
(progn
|
||||
(setq menu-datei (strcat menu-pfad "/menu/SSG_LIB.mnu"))
|
||||
(if (findfile menu-datei)
|
||||
(progn
|
||||
(command "_.MENULOAD" menu-datei)
|
||||
(menucmd "P13=+SSG_LIB.POP1")
|
||||
(princ "\n[SSG_LIB] Menue SSG_LIB geladen und eingebunden.")
|
||||
)
|
||||
(princ (strcat "\n[SSG_LIB] WARNUNG: " menu-datei " nicht gefunden!"))
|
||||
)
|
||||
)
|
||||
(princ "\n[SSG_LIB] WARNUNG: DXFMAKRO nicht gesetzt, Menue nicht geladen!")
|
||||
)
|
||||
|
||||
;; DBLCLKEDIT deaktivieren (Block-Editor nicht bei Doppelklick oeffnen)
|
||||
(setvar "DBLCLKEDIT" 0)
|
||||
|
||||
(dbgflush)
|
||||
|
||||
(ssg-lib-register-check)
|
||||
|
||||
(princ "\n[SSG_LIB] Startup abgeschlossen.")
|
||||
)
|
||||
)
|
||||
(princ)
|
||||
)
|
||||
|
||||
;; Startup ausfuehren
|
||||
(ssg-lib-startup)
|
||||
+6
-50
@@ -3,16 +3,12 @@ REM ================================================================
|
||||
REM run_tests.bat - Testausfuehrung fuer SSG_LIB
|
||||
REM
|
||||
REM Schalter:
|
||||
REM --create Erzeugt Basis-DXF-Dateien (Testgrundlage)
|
||||
REM --check Fuehrt pytest-Validierung aus
|
||||
REM (ohne) Zeigt Hilfe an
|
||||
REM
|
||||
REM Beispiele:
|
||||
REM bin\run_tests.bat --create
|
||||
REM bin\run_tests.bat --create kreisel
|
||||
REM bin\run_tests.bat --check
|
||||
REM bin\run_tests.bat --check test_kreisel.py
|
||||
REM bin\run_tests.bat --create --check
|
||||
REM ================================================================
|
||||
|
||||
REM Umgebung setzen
|
||||
@@ -25,26 +21,15 @@ if exist "%DXFMAKRO%\.venv\Scripts\activate.bat" (
|
||||
echo WARNUNG: .venv nicht gefunden - pytest muss im PATH sein!
|
||||
)
|
||||
|
||||
set DO_CREATE=0
|
||||
set DO_CHECK=0
|
||||
set CREATE_ARG=
|
||||
set CHECK_ARG=
|
||||
|
||||
REM Argumente parsen
|
||||
:parse_args
|
||||
if "%~1"=="" goto :after_args
|
||||
if "%~1"=="--create" (
|
||||
set DO_CREATE=1
|
||||
if not "%~2"=="" if not "%~2"=="--check" (
|
||||
set "CREATE_ARG=%~2"
|
||||
shift
|
||||
)
|
||||
shift
|
||||
goto :parse_args
|
||||
)
|
||||
if "%~1"=="--check" (
|
||||
set DO_CHECK=1
|
||||
if not "%~2"=="" if not "%~2"=="--create" (
|
||||
if not "%~2"=="" (
|
||||
set "CHECK_ARG=%~2"
|
||||
shift
|
||||
)
|
||||
@@ -55,32 +40,7 @@ echo Unbekannter Schalter: %~1
|
||||
goto :show_help
|
||||
|
||||
:after_args
|
||||
if %DO_CREATE%==0 if %DO_CHECK%==0 goto :show_help
|
||||
|
||||
REM ================================================================
|
||||
REM --create: Basis-DXF erzeugen
|
||||
REM ================================================================
|
||||
if %DO_CREATE%==1 (
|
||||
echo.
|
||||
echo ================================================================
|
||||
echo TESTBASE ERZEUGEN
|
||||
echo ================================================================
|
||||
if not "%CREATE_ARG%"=="" (
|
||||
echo Modul: %CREATE_ARG%
|
||||
python "%DXFM_TESTS%\create_testbase.py" %CREATE_ARG%
|
||||
) else (
|
||||
echo Alle Module
|
||||
python "%DXFM_TESTS%\create_testbase.py"
|
||||
)
|
||||
if errorlevel 1 (
|
||||
echo.
|
||||
echo FEHLER: create_testbase.py fehlgeschlagen!
|
||||
exit /b 1
|
||||
)
|
||||
echo.
|
||||
echo Basis-DXF erfolgreich erstellt.
|
||||
echo Naechster Schritt: BricsCAD oeffnen und TESTRUN ausfuehren.
|
||||
)
|
||||
if %DO_CHECK%==0 goto :show_help
|
||||
|
||||
REM ================================================================
|
||||
REM --check: pytest-Validierung
|
||||
@@ -123,18 +83,14 @@ exit /b 0
|
||||
|
||||
:show_help
|
||||
echo.
|
||||
echo Aufruf: bin\run_tests.bat [--create [modul]] [--check [testdatei]]
|
||||
echo Aufruf: bin\run_tests.bat --check [testdatei]
|
||||
echo.
|
||||
echo Schalter:
|
||||
echo --create Erzeugt Basis-DXF-Dateien fuer alle Module
|
||||
echo --create kreisel Erzeugt nur Kreisel-Basis-DXF
|
||||
echo --check Fuehrt pytest-Validierung fuer alle Module aus
|
||||
echo --check Fuehrt pytest-Validierung fuer alle Module aus
|
||||
echo --check test_kreisel.py Validiert nur Kreisel-Tests
|
||||
echo --create --check Beides nacheinander
|
||||
echo.
|
||||
echo Workflow:
|
||||
echo 1. bin\run_tests.bat --create
|
||||
echo 2. In BricsCAD: TESTRUN "kreisel"
|
||||
echo 3. bin\run_tests.bat --check
|
||||
echo 1. In BricsCAD: SSG_RUN_ALL_TESTS ausfuehren
|
||||
echo 2. bin\run_tests.bat --check
|
||||
echo.
|
||||
exit /b 1
|
||||
|
||||
+18
-2
@@ -25,8 +25,8 @@ set "DXFM_LISP=%DXFMAKRO%\Lisp"
|
||||
set "DXFM_DCL=%DXFMAKRO%\dcl"
|
||||
set "DXFM_RESULTS=%DXFMAKRO%\results"
|
||||
|
||||
REM 2D/3D-Modus: Standard ist 2D
|
||||
set "DXFM_DIM=2D"
|
||||
REM 2D/3D-Modus: Standard ist 3D (alle Module nutzen data\ils\3D\)
|
||||
set "DXFM_DIM=3D"
|
||||
|
||||
set BRICSCAD="C:\Program Files\Bricsys\BricsCAD V25 de_DE\bricscad.exe"
|
||||
|
||||
@@ -69,6 +69,22 @@ if not exist "%DXFM_TESTDATA%" mkdir "%DXFM_TESTDATA%"
|
||||
if not exist "%DXFM_TESTOUT%" mkdir "%DXFM_TESTOUT%"
|
||||
if not exist "%DXFM_TESTREF%" mkdir "%DXFM_TESTREF%"
|
||||
|
||||
REM Hinweis: setx (dauerhaft) wird hier nicht verwendet.
|
||||
REM Variablen gelten nur fuer diesen Prozess und Kindprozesse (z.B. BricsCAD).
|
||||
REM Falls dauerhafte Registry-Eintraege benoetigt werden: setenv.bat --persist aufrufen.
|
||||
if /i "%1"=="--persist" (
|
||||
echo Setze Umgebungsvariablen dauerhaft in der Registry ^(setx^)...
|
||||
setx DXFMAKRO "%DXFMAKRO%" >nul
|
||||
setx DXFM_LISP "%DXFM_LISP%" >nul
|
||||
setx DXFM_DATA "%DXFM_DATA%" >nul
|
||||
setx DXFM_DCL "%DXFM_DCL%" >nul
|
||||
setx DXFM_CFG "%DXFM_CFG%" >nul
|
||||
setx DXFM_LOG "%DXFM_LOG%" >nul
|
||||
setx DXFM_DIM "%DXFM_DIM%" >nul
|
||||
setx DXFM_BLOCKS "%DXFM_BLOCKS%" >nul
|
||||
echo Dauerhaft gesetzt. Gilt fuer alle neuen Prozesse.
|
||||
)
|
||||
|
||||
REM Umgebungsvariablen anzeigen
|
||||
echo.
|
||||
echo ================================================================
|
||||
|
||||
+41
-2
@@ -32,9 +32,31 @@ weiche_45 = "A-2"
|
||||
# Weichenbatterien / Parallel (KurvenWinkel=0)
|
||||
weichenbatterie = "A-2"
|
||||
# Weichenkombinationen (Deltaweiche, Sternweiche, Dreifachweiche)
|
||||
weichenkombination = "L-2"
|
||||
weichenkombination = "A-2"
|
||||
# Weichenkoerper (KurvenWinkel=22.5)
|
||||
weichenkoerper = "L-2"
|
||||
weichenkoerper = "A-2"
|
||||
# Kreuzungsweichen (800, 300) - Layer L für Stahlstrecke (alt)
|
||||
kreuzungsweiche = "L-2"
|
||||
|
||||
# PNEUMATISCH GESCHALTET
|
||||
# Weichen pneumatisch 90 Grad (Einzelweiche/Doppelweiche/Dreiwegeweiche, KurvenWinkel=90)
|
||||
weiche_pn_90 = "A-3"
|
||||
# Weichen 45 Grad (Einzelweiche/Doppelweiche/Dreiwegeweiche, KurvenWinkel=45)
|
||||
weiche_pn_45 = "A-3"
|
||||
# Weichenbatterien / Parallel (KurvenWinkel=0)
|
||||
weichenbatterie_pn = "A-3"
|
||||
# Weichenkombinationen (Deltaweiche, Sternweiche, Dreifachweiche)
|
||||
weichenkombination_pn = "A-3"
|
||||
# Weichenkoerper (KurvenWinkel=22.5)
|
||||
weichenkoerper_pn = "A-3"
|
||||
# Kreuzungsweichen (300) - Layer L für Stahlstrecke (alt)
|
||||
kreuzungsweiche_pn = "L-3"
|
||||
|
||||
# TEF Förderer
|
||||
TEF_gerade = "F-1"
|
||||
TEF_bogen = "F-1"
|
||||
TEF_antriebstation = "F-1"
|
||||
TEF_umlenkspannstation = "F-1"
|
||||
|
||||
[bogen]
|
||||
BESCHR = ProfilTyp
|
||||
@@ -64,3 +86,20 @@ SIVASNR_TEF = SivasnrTEF
|
||||
HOEHE = ""
|
||||
DREHUNG = ""
|
||||
|
||||
|
||||
[gerade]
|
||||
ARTINR = Sivasnr
|
||||
TEILEART = "Omniflo Gerade"
|
||||
ID = ""
|
||||
LAENGE = Laenge
|
||||
LAYER = "A-2"
|
||||
HOEHE = ""
|
||||
DREHUNG = ""
|
||||
|
||||
|
||||
[container]
|
||||
0_BG071090 = 0_B10071, 0_B10090, 0_B10090
|
||||
0_BG080090 = 0_B10080, 0_B10090,
|
||||
0_BG081090 = 0_B10081, 0_B10090,
|
||||
0_BG090090 = 0_B10090, 0_B10090,
|
||||
0_BG190090 = 0_B10090, 0_B10090
|
||||
|
||||
@@ -0,0 +1,29 @@
|
||||
# ============================================================
|
||||
# export.cfg - Konfiguration fuer Lisp/export.lsp UND lib/export_csv.py,
|
||||
# lib/export_sivas.py (gemeinsame Blockname-Muster, siehe
|
||||
# lib/export_blockpatterns.py)
|
||||
#
|
||||
# Format: INI-Style
|
||||
# [ABSCHNITT]
|
||||
# Key = Wert (einzelner Wert)
|
||||
# Key = Wert1, Wert2, Wert3 (Musterliste fuer wcmatch/fnmatch, kommagetrennt)
|
||||
#
|
||||
# Zeilen mit # sind Kommentare. Leerzeilen werden ignoriert.
|
||||
#
|
||||
# pattern_kreisel/pattern_strecke sind fuer Lisp's Block-SAMMLUNG grob
|
||||
# gehalten (nur "gehoert das ueberhaupt zum Export"). Die uebrigen
|
||||
# pattern_eckrad/pattern_variofoerderer/pattern_gefaellestrecke/
|
||||
# pattern_strecke_module-Keys sind Teilmengen davon fuer die feinere
|
||||
# TeileArt-KLASSIFIKATION in Python (eigene Zeile je Teileart) -
|
||||
# Aenderungen an Blocknamen bitte in beiden Stellen nachziehen.
|
||||
# ============================================================
|
||||
|
||||
[blockpattern]
|
||||
pattern_kreisel= KR_*, KREISEL_*, ECKRAD_*
|
||||
pattern_eckrad= ECKRAD_*
|
||||
pattern_gerade= AP110*, AP_110*
|
||||
pattern_strecke= Vario*, Staustrecke*, AUS_Element*, EIN_Element*, VF_*, GF_*
|
||||
pattern_variofoerderer= VF_*
|
||||
pattern_gefaellestrecke= GF_*
|
||||
pattern_strecke_module= Vario*, Staustrecke*, AUS_Element*, EIN_Element*
|
||||
pattern_ks_subblocks= KS_EIN, KS_AUS, K1, K2, K3, K4
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
-143002
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user