Compare commits

...

51 Commits

Author SHA1 Message Date
m.stangl ab7fc92e23 Ausgabeverzeichnis nur über Lisp Variable festlegen. Anscheinend speichert Bricscad Umgebungen über die Sessions hinweg. Die Ausgaben der Tests landen woanders als der generelle Export 2026-07-10 21:26:41 +02:00
m.stangl bde2380490 Merge branch 'master' of https://gitea.schoenenberger.de/Schoenenberger_Systeme_GmbH/dxfmakros 2026-07-10 21:22:53 +02:00
m.stangl 2767897158 Aufruf von explizitem Python Call rausgeworfen. War nur zu testzwecken 2026-07-10 20:16:46 +02:00
s.hensch 444d643dd3 [ADD] Attribute für ILS 2d/3d ergänzt und neu angeordnet 2026-07-10 14:16:30 +02:00
m.stangl 554e9bee99 Format der SivasNummer ohne + 2026-07-10 13:34:10 +02:00
m.stangl fe283a0bf3 ABP 60 und APB 100 als eigenes AUswahlkriterium in die Oberfläche der 90Grad Bögen hinzugefügt. Beide APB60 Bögen und die Sternweiche dazu 2026-07-10 13:32:52 +02:00
m.stangl 6bf6b00e13 neue APB 60 Bögen dazu 2026-07-10 13:31:18 +02:00
m.stangl f7933df5a4 Attribute mit SKript angeordnet. Test des Einfügens 2026-07-10 11:17:11 +02:00
m.stangl 0b89ed6c5e Dispogruppe-Header korrigiert, Container-Referenzen und --type 2D/3D fuer set_attributs.py
Sivasnr-Werte mit 0_BGxxxxxx-Mustern werden jetzt ueber die neue
[container]-Config-Sektion in kommaseparierte Listen aufgeloest.
set_attributs.py kann nun explizit zwischen data/omniflo/2D und /3D
als Quellverzeichnis waehlen.
2026-07-09 16:03:22 +02:00
m.stangl 335c6d7875 erste FAssung der reference Dateien dazu 2026-07-09 16:01:12 +02:00
s.hensch 8a7521572d Merge branch 'master' of https://gitea.schoenenberger.de/m.stangl/dxfmakros 2026-07-09 15:44:08 +02:00
s.hensch 1d3191b84b [ADD] Staustrecke Gerade mit Vario links/rechts 3D hinzugefügt 2026-07-09 15:43:58 +02:00
y.wang 6073eb1d78 Merge branch 'master' of https://gitea.schoenenberger.de/Schoenenberger_Systeme_GmbH/dxfmakros 2026-07-09 10:59:00 +02:00
y.wang 96788e7244 TEST_LINIENZUG in eigene tests/test_linienzug.lsp auslagern + eigenen Menuepunkt Foerderer-Linienzug anlegen (Foerderer-Eintrag zurueckgesetzt), Menü neu laden nötig, damit Foerderer-Linienzug in Menü erscheint. 2026-07-09 10:58:56 +02:00
s.hensch 72a4637bd2 [CHANGE] Attribute für ARTINR und SIVASNR_TEF zu kommaseparierter liste geändert für vereinheitlichung; Unnötige dxf-Dateien entfernt oder umbenannt 2026-07-09 10:41:11 +02:00
y.wang 7a1444439c Merge branch 'master' of https://gitea.schoenenberger.de/Schoenenberger_Systeme_GmbH/dxfmakros 2026-07-08 13:45:15 +02:00
y.wang 3897581dc9 Die Funktion bei VF_Linienzug wurde optimiert. Und TEST_LINIENZUG wurde in test_foerdererer.lsp eingebaut. 2026-07-08 13:45:12 +02:00
m.stangl 8ae55d171e Merge branch 'master' of https://gitea.schoenenberger.de/Schoenenberger_Systeme_GmbH/dxfmakros 2026-07-07 09:05:19 +02:00
m.stangl 6a487433e2 Auflösung der 0_BG Nummern durch Sivas Nummern in den container Abschnitt der attradd.cfg eingepflegt. Für die programmgesteuerte Auflösung 2026-07-07 09:05:14 +02:00
y.wang 80ec7043b8 Merge branch 'master' of https://gitea.schoenenberger.de/Schoenenberger_Systeme_GmbH/dxfmakros 2026-07-06 15:54:49 +02:00
y.wang 9ce739fb35 3D-Linienzug (gemischte Gefaellestrecke/VarioFoerderer-Kette, Modus 1: manuelle Eingabe) wurde bei Variofoerder gabaut. Die Block-Attribute für GF und VF wurde angepasst wie erfoerdert bei EXPORT. 2026-07-06 15:54:46 +02:00
s.hensch 5eb0acd446 Merge branch 'master' of https://gitea.schoenenberger.de/m.stangl/dxfmakros 2026-07-03 14:09:03 +02:00
s.hensch fd63e4c3ad Scanner für ILS hinzugefügt (2d-Block in beide Verzeichnisse 2d und 3d eingefügt); attribut und layer definitionen für Omniflo erweitert und korrigiert 2026-07-03 14:08:47 +02:00
y.wang acdf735e00 ATTREQ/ATTDIA vor GF-Block-Insert auf 0 setzen, um fehlende Attribute zu beheben; Horizontale Variofoerderer-Mittelsektion als zusaetzlichen Testfall in TEST_FOERDERER pruefen und bauen 2026-07-03 13:43:55 +02:00
y.wang 17d5bfc539 Merge branch 'master' of https://gitea.schoenenberger.de/Schoenenberger_Systeme_GmbH/dxfmakros 2026-07-03 13:05:20 +02:00
y.wang 027b377b84 Testaufrufe an neue Signatur (L_GF-Halbierung + horizontale Fahrrichtung) anpassen 2026-07-03 13:05:08 +02:00
y.wang cc3cb9f160 horizontale Fahrrichtung (0°/90°/180°/270°) fuer Variofoederer manuelle Werteingabe ergänzen. die Möglichkeit des Horizontal-Varioföerderes wurde bei Ab-Förderrichtung geprüft. 2026-07-03 12:59:24 +02:00
s.hensch da1ffb27a4 Definitionen für Layerbelegung zur Information hinzugefügt; Nicht mehr notwendige Block Libraries entfernt 2026-07-03 09:06:03 +02:00
s.hensch d2d51e4415 _setenv auf die gitignore Liste gesetzt, damit diese nicht mehr verwaltet wird 2026-07-03 08:19:33 +02:00
m.stangl 2abcd0964c Test für alle Elemente ist jetzt interativ. Man kann jeden Test in einem Reiter offen lassen und ansehen (csv Export aller Files ist dann manuell zu machen), oder auch automatisch schliessen, dafür ist aber der csv Export anschliessend auch mit automatisch. 2026-07-02 16:35:16 +02:00
m.stangl 3c5d8be08d Doku angepasst 2026-07-02 14:06:44 +02:00
m.stangl f87260c605 .cfg Parser hinzu implementieren lassen. Spezifische Omniflo export routine die syncron in Lisp lief entfernt 2026-07-02 14:06:05 +02:00
m.stangl f73f0c123a omniflo csv Export lisp routine entfernt. 2026-07-02 14:04:32 +02:00
m.stangl 3869f8b624 omniflo unittest liest aktuell nur die json Exports von Bricscad 2026-07-02 14:03:55 +02:00
m.stangl 8a424d292e Dokumentation aktualisiert: omniflo csv Export raus. Alles nur noch über eine Funktion 2026-07-02 14:02:43 +02:00
m.stangl ca8543cca3 omniflo SumZeile jetzt nur über Python erzeugt. 2026-07-02 14:02:06 +02:00
m.stangl 05a7000d33 Gefällestrecke in Sivas und csv Exports eingebaut 2026-07-02 13:19:30 +02:00
m.stangl 3dd6e091e0 Gefällestrecke nach dem gleichen Muster bedaten wie die anderen Tests. Eingabedaten aus dem Test in json Datei gezogen. Ergänzung des Testsfalls durch Ergänzung des testsdata/*_tests.json möglich 2026-07-02 12:43:23 +02:00
y.wang 11555ace8e Attribut-Entities-Bug bei GF-Blockerstellung und VF-Blockerstellung in TEST-Funktionen beheben. 2026-07-02 10:12:30 +02:00
y.wang b915980540 die 3 Modus für Gefällestrecke wurden angepasst.Gemeinsamkeit aller Modi: Innere Elemente (Separator, Gefällebogen) werden immer per vollständiger KS_EIN→KS_AUS-3D-Rahmen-Kettung verkettet (insert-block-ks-to-ks) — nur bei AS/ES-Element (wegen des seitlichen Drehteller-Versatzes) wird die Position in X/Y und Z getrennt behandelt.Unterschied Modus 1/2 vs. Modus 3: In Modus 1/2 gibt es keinen vorgegebenen Endpunkt — die Endhöhe ist ein Ergebnis. In Modus 3 sind Start und Endpunkt (mit Höhen) vorgegeben, und die gesamte Geometrie (Winkel, Bogenauswahl, Segmentlängen) wird so berechnet, dass beide Punkte exakt erreicht werden. Test-Gefällestrecke wurde gebaut 2026-07-01 16:06:16 +02:00
y.wang 649857a9dd Merge branch 'master' of https://gitea.schoenenberger.de/Schoenenberger_Systeme_GmbH/dxfmakros 2026-06-30 12:29:38 +02:00
y.wang 0bee5ad8d0 die DWG sind bereinigt. Die bisherige positionsbasierte Block-Einfügung (Punkt + Winkel) wurde durch eine vollständige 3D-Frame-Kettung über KS_EIN/KS_AUS-Koordinatensysteme ersetzt, sodass beliebige räumliche Orientierungen korrekt durch die gesamte VarioFoerderer- und Gefaellestrecke-Anlage propagiert werden. 2026-06-30 12:29:33 +02:00
m.stangl 2e72f17806 Neue Testklassen für den Förderer gebaut: Status, Mathematik, ExportCSV und ExportSivas. Lisp/export.lsp wurde um VF_1, VF_2 Blöcke erweitert, um ein csv zu erhalten. Export_sivas und export_csv entsprechend um die nötigen Daten ergänzt 2026-06-30 11:21:06 +02:00
m.stangl b7025e5523 aktuelle OMniflo Export Liste als Referenz für den Test eingestellt 2026-06-30 11:19:01 +02:00
m.stangl 9b2bfed255 Debug Erzeugung aus dem Foerderer lisp Test entfernt 2026-06-30 11:05:16 +02:00
m.stangl 2009eb1a2c Readme der lisp Tests aktualisiert. Foerderer Tests korrigiert. Flaches .json benötigt. 2026-06-30 11:04:50 +02:00
m.stangl 8db7b2bfbf Veraltetes Menü Etagenförderer entfernt. Testdaten für den Förderertest wird jetzt aus .json Datei geladen. Testfunktionen des Förderers bauen jetzt auch Block um jeden Förderer, damit ein Export möglich ist . Fix einiger Funktionsaufrufe in den Varioförderer Funktionen. 2026-06-30 10:35:31 +02:00
m.stangl 68affdaa82 Merge branch 'master' of https://gitea.schoenenberger.de/Schoenenberger_Systeme_GmbH/dxfmakros 2026-06-30 10:03:49 +02:00
y.wang 4a9d29f243 Merge branch 'master' of https://gitea.schoenenberger.de/Schoenenberger_Systeme_GmbH/dxfmakros 2026-06-30 10:01:04 +02:00
y.wang d92b723e8c Blocknamen ohne Gradzeichen 2026-06-30 10:01:00 +02:00
m.stangl bf3996435a Weitere TOS Nummern für Zusatzmodul, Weichen Strecke und Automation in den Code für Export eingepflegt 2026-06-30 10:00:17 +02:00
301 changed files with 73549 additions and 2738936 deletions
+1
View File
@@ -135,6 +135,7 @@ venv/
ENV/
env.bak/
venv.bak/
_setenv.bat
# cui folder for briscad
aiassist_next_command/
+1 -1
View File
@@ -92,7 +92,7 @@ Detaillierte Dokumentation aller Funktionen und Befehle: siehe `Lisp/README.md`.
| `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 |
| `menu-inventory.lsp` | MenuInventory | BricsCAD Diagnostik (Menuegruppen, Plugins, Startdateien) |
+551 -247
View File
File diff suppressed because it is too large Load Diff
+6 -6
View File
@@ -19,8 +19,9 @@
;; 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"))
;; Block-Pfad: primaer aus DXFMAKRO + DXFM_DIM, dann *ssg-lisp-pfad*-Heuristik
(setq block-pfad
;; 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")))
@@ -34,7 +35,6 @@
nil)
)
)
(setq *block-path* 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"))))
@@ -401,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)
@@ -1288,6 +1288,6 @@
(princ "\n>>> KREISELINSERT v7.0 geladen <<<")
(princ "\n>>> Befehle: KreiselInsert, KreiselConnect, KreiselRedraw,")
(princ "\n KreiselEdit, KreiselQuick, KreiselParams, ILS_Eckrad")
(if block-pfad (princ (strcat "\n Block-Pfad: " block-pfad)))
(if *block-path* (princ (strcat "\n Block-Pfad: " *block-path*)))
(princ "\n=========================================")
(princ)
+45 -133
View File
@@ -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)
)
@@ -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)
)
@@ -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,27 @@
;; 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."))
" Grad"
(if profiltyp (strcat " (" profiltyp ")") "")
" gefunden."))
nil
)
(progn
@@ -521,8 +423,18 @@
;; ============================================================
;; --- Omniflo / Boegen ---
(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)
)
(defun c:OMNI_APB_630_90 ( / dlg-result)
(setq dlg-result (omni:bogen-dialog 90 nil nil))
(setq dlg-result (omni:bogen-dialog 90 nil nil "APB 110"))
(if dlg-result
(omni:insert-from-entry dlg-result)
(princ "\n[BOGEN] Abgebrochen.")
@@ -531,7 +443,7 @@
)
(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.")
@@ -540,7 +452,7 @@
)
(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.")
@@ -549,7 +461,7 @@
)
(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.")
@@ -558,7 +470,7 @@
)
(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.")
@@ -1287,7 +1199,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)))
+20 -6
View File
@@ -238,16 +238,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.
---
-5
View File
@@ -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)
+98 -265
View File
@@ -4,10 +4,69 @@
;; 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 (strcat "\n[export] WARNUNG: " cfg-pfad " nicht gefunden/leer, verwende Vorgaben."))
)
(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)
@@ -60,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) "\""
@@ -84,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"))))
@@ -95,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)
@@ -124,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)
@@ -143,7 +204,7 @@
;; 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..."))
(ssg-id-check-all)
@@ -162,8 +223,23 @@
(setq count (sslength ss))
(princ (strcat "\n[" label "] " (itoa count) " Bloecke gefunden."))
;; 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 (strcat "\n[" label "] Ausgabeordner: " 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
@@ -190,7 +266,7 @@
(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") "\""
@@ -211,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 ---
@@ -249,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,
@@ -512,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))
@@ -576,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)
+141 -1
View File
@@ -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.
@@ -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)
+1 -1
View File
@@ -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)
+625 -145
View File
File diff suppressed because it is too large Load Diff
+39 -36
View File
@@ -47,7 +47,7 @@
;; ============================================================
(defun init-bibliothek-etage ( / temp-obj ks-data ks-ein-pos ks-aus-pos
gefaelle-blockname)
(if (and *etage-lib-initialized* (not (tblsearch "BLOCK" "_3D_AS_30_rechts")))
(if (and *etage-lib-initialized* (not (tblsearch "BLOCK" "AS_Element_30_rechts")))
(setq *etage-lib-initialized* nil))
(if *etage-lib-initialized*
(progn (princ "\n Etage-Bibliothek bereits initialisiert.") t)
@@ -61,13 +61,13 @@
;; AS_30_rechts Masse extrahieren
(princ "\n Extrahiere AS_30_rechts Masse...")
(ensure-block-loaded "_3D_AS_30_rechts")
(ensure-block-loaded "_3D_AS_30_links")
(if (tblsearch "BLOCK" "_3D_AS_30_rechts")
(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))
"_3D_AS_30_rechts" 1.0 1.0 1.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)
@@ -89,20 +89,20 @@
)
)
(progn
(princ "\n WARNUNG: Block _3D_AS_30_rechts fehlt - Standardwerte")
(princ "\n WARNUNG: Block AS_Element_30_rechts fehlt - Standardwerte")
(setq etage-aus-dx 525.8 etage-aus-dz -72.9)
)
)
;; ES_30_rechts Masse extrahieren
(princ "\n Extrahiere ES_30_rechts Masse...")
(ensure-block-loaded "_3D_ES_30_rechts")
(ensure-block-loaded "_3D_ES_30_links")
(if (tblsearch "BLOCK" "_3D_ES_30_rechts")
(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))
"_3D_ES_30_rechts" 1.0 1.0 1.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)
@@ -124,14 +124,13 @@
)
)
(progn
(princ "\n WARNUNG: Block _3D_ES_30_rechts fehlt - Standardwerte")
(princ "\n WARNUNG: Block ES_Element_30_rechts fehlt - Standardwerte")
(setq etage-ein-dx 576.2 etage-ein-dz -54.6)
)
)
;; Gefaellebogen_links_60 Masse extrahieren
(setq gefaelle-blockname
(strcat "Gefaellebogen_links_60" grad-zeichen "_R500"))
(setq gefaelle-blockname "Gefaellebogen_links_60_R500")
(princ (strcat "\n Extrahiere " gefaelle-blockname " Masse..."))
(ensure-block-loaded gefaelle-blockname)
(if (tblsearch "BLOCK" gefaelle-blockname)
@@ -165,8 +164,7 @@
" dz=" (rtos etage-gef-dz-links 2 2) " mm"))
;; Gefaellebogen_rechts_60 Masse extrahieren
(setq gefaelle-blockname
(strcat "Gefaellebogen_rechts_60" grad-zeichen "_R500"))
(setq gefaelle-blockname "Gefaellebogen_rechts_60_R500")
(princ (strcat "\n Extrahiere " gefaelle-blockname " Masse..."))
(ensure-block-loaded gefaelle-blockname)
(if (tblsearch "BLOCK" gefaelle-blockname)
@@ -604,9 +602,14 @@
;; ============================================================
;; 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
startpunkt seite hz
/ aktueller-punkt bogen-name endpunkt
bogen-mass bogen-dx bogen-dz
as-block es-block gefaelle-blockname
@@ -618,21 +621,21 @@
(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 "_3D_AS_30_" seite))
(setq es-block (strcat "_3D_ES_30_" seite))
(setq as-block (strcat "AS_Element_30_" seite))
(setq es-block (strcat "ES_Element_30_" seite))
(setq gefaelle-blockname
(if (= seite "rechts")
(strcat "Gefaellebogen_rechts_60" grad-zeichen "_R500")
(strcat "Gefaellebogen_links_60" grad-zeichen "_R500")
"Gefaellebogen_rechts_60_R500"
"Gefaellebogen_links_60_R500"
))
;; Sentinel: Bibliothek neu initialisieren wenn Bloecke fehlen
(if (and *etage-lib-initialized* (not (tblsearch "BLOCK" "_3D_AS_30_rechts")))
(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 (strcat "\n\n1/15: " as-block " (0 Grad)"))
(setq aktueller-punkt (insert-block-by-ks as-block aktueller-punkt))
(setq aktueller-punkt (insert-block-by-ks as-block aktueller-punkt 0.0))
;; 2. Staustrecke 400mm (hz-anfang, 3 Grad vert, KS_EIN)
(princ (strcat "\n\n2/15: Staustrecke 400mm ("
@@ -659,7 +662,7 @@
(progn
(princ (strcat "\n\n5/15: Gefaellestrecke (3 Grad, L=" (rtos L_GF1 2 2) " mm)"))
(setq aktueller-punkt
(insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt L_GF1 3))
(insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt L_GF1 3 0.0))
)
(princ "\n\n5/15: L_GF1 (uebersprungen)")
)
@@ -667,23 +670,23 @@
;; 6. Umlenkstation (3 Grad geneigt)
(princ "\n\n6/15: Umlenkstation (500mm, 3 Grad geneigt)")
(setq aktueller-punkt
(insert-rotated-block-with-ks "Vario_Umlenkstation_500mm" aktueller-punkt 3 500 0))
(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) grad-zeichen))
(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) grad-zeichen))
(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 (strcat "\n\n7/15: " bogen-name " (3 Grad geneigt)"))
(setq aktueller-punkt
(insert-rotated-block-with-ks bogen-name aktueller-punkt 3 bogen-dx bogen-dz))
(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)
@@ -694,14 +697,14 @@
(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))))
L_VF (- (- best-winkel 3)) 0.0))
)
(progn
(princ (strcat "\n\n8/15: 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)))
L_VF (+ best-winkel 3) 0.0))
)
)
)
@@ -711,11 +714,11 @@
;; 9. 2. Vertikalbogen
(if (= richtung "Auf")
(progn
(setq bogen-name (strcat "Vario_Bogen_ab_" (itoa best-winkel) grad-zeichen))
(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) grad-zeichen))
(setq bogen-name (strcat "Vario_Bogen_auf_" (itoa best-winkel)))
(setq bogen-mass (get-bogen-mass bogen-auf best-winkel))
)
)
@@ -726,35 +729,35 @@
" (" (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))
(- 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))
(+ 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))
(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))
(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))
(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, "
File diff suppressed because it is too large Load Diff
+258 -98
View File
@@ -60,17 +60,17 @@
'(3 6 9 12 15 18 21 27 33 39 45 51)))
(setq required-blocks
(append
(list "_3D_AS_90_links" "_3D_AS_90_rechts"
"_3D_ES_90_links" "_3D_ES_90_rechts"
(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) grad-zeichen))) bogen-winkel)
(mapcar (function (lambda (w) (strcat "Vario_Bogen_ab_" (itoa w) grad-zeichen))) bogen-winkel)
(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 ".dxf"))
(setq datei (strcat block-pfad bname ".dwg"))
(if (not (findfile datei))
(setq missing (cons datei missing))
)
@@ -95,7 +95,11 @@
;; ============================================================
(defun init-bibliothek ( / temp-obj bogen-winkel ks-data ks-ein-pos ks-aus-pos
dx dy dz bogen-name)
(if (and *lib-initialized* (tblsearch "BLOCK" "_3D_AS_90_links"))
;; "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 "\n Standard-Bibliothek bereits initialisiert.")
t
@@ -109,13 +113,13 @@
;; AS_90 Masse extrahieren
(princ "\n Extrahiere AUS_Element Masse...")
(ensure-block-loaded "_3D_AS_90_links")
(ensure-block-loaded "_3D_AS_90_rechts")
(if (tblsearch "BLOCK" "_3D_AS_90_links")
(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))
"_3D_AS_90_links" 1.0 1.0 1.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)
@@ -134,18 +138,18 @@
(princ "\n FEHLER: KS_EIN/KS_AUS fehlt im AS_90!")
)
)
(princ "\n FEHLER: Block _3D_AS_90_links nicht geladen!")
(princ "\n FEHLER: Block AS_Element_90_links nicht geladen!")
)
;; ES_90 Masse extrahieren
(princ "\n Extrahiere EIN_Element Masse...")
(ensure-block-loaded "_3D_ES_90_links")
(ensure-block-loaded "_3D_ES_90_rechts")
(if (tblsearch "BLOCK" "_3D_ES_90_links")
(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))
"_3D_ES_90_links" 1.0 1.0 1.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)
@@ -164,7 +168,7 @@
(princ "\n FEHLER: KS_EIN/KS_AUS fehlt im ES_90!")
)
)
(princ "\n FEHLER: Block _3D_ES_90_links nicht geladen!")
(princ "\n FEHLER: Block ES_Element_90_links nicht geladen!")
)
;; Bogen-Masse extrahieren
@@ -175,7 +179,7 @@
'(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) grad-zeichen))
(setq bogen-name (strcat "Vario_Bogen_auf_" (itoa w)))
(ensure-block-loaded bogen-name)
(if (tblsearch "BLOCK" bogen-name)
(progn
@@ -203,7 +207,7 @@
(princ (strcat "\n FEHLER auf_" (itoa w) ": Block nicht geladen!"))
)
;; Abwaertsbogen
(setq bogen-name (strcat "Vario_Bogen_ab_" (itoa w) grad-zeichen))
(setq bogen-name (strcat "Vario_Bogen_ab_" (itoa w)))
(ensure-block-loaded bogen-name)
(if (tblsearch "BLOCK" bogen-name)
(progn
@@ -259,7 +263,10 @@
;; ============================================================
;; TEIL 4: WINKELBERECHNUNG
;; ============================================================
(defun berechne-alle-winkel (deltaL deltaH richtung /
;; 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α
@@ -273,6 +280,7 @@
(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"
@@ -312,16 +320,16 @@
(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_HORIZONTAL cos3)))
(* 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_HORIZONTAL sin3)))
(* feste-hz sin3)))
(setq B (+ (- deltaH abs-dz-AUS abs-dz-EIN
(* FESTE_HORIZONTAL sin3))
(* feste-hz sin3))
bogen-z1 bogen-z2))
)
(if (> (abs sinα) 0.0001)
@@ -383,16 +391,66 @@
(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)
(berechne-alle-winkel deltaL deltaH richtung nil)
)
;; ============================================================
@@ -400,81 +458,121 @@
;; ============================================================
;; Gibt endpunkt zurueck (letzter KS_AUS nach ES_90).
;; VF_*-Block-Erstellung erfolgt zentral im Dispatcher (vf_core.lsp).
(defun variofoerderer-einfuegen (deltaL deltaH richtung best-winkel
L_GF1 L_GF2 L_VF startpunkt seite
/ aktueller-punkt bogen-name endpunkt
bogen-mass bogen-dx bogen-dz
as-block es-block)
(setq aktueller-punkt startpunkt)
(setq as-block (strcat "_3D_AS_90_" seite))
(setq es-block (strcat "_3D_ES_90_" seite))
;; 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 (strcat "\n\n1/11: " as-block " (hz=" (rtos hz 2 1) grad-zeichen ")"))
(insert-block-by-ks as-block startpunkt hz)
)
;; 1. AUS_Element
(princ (strcat "\n\n1/11: " as-block " (0 Grad)"))
(setq aktueller-punkt (insert-block-by-ks as-block aktueller-punkt))
;; 2. 1. Gefaellestrecke
;; --- 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 (strcat "\n\n2/11: Gefaellestrecke (3 Grad, L=" (rtos L_GF1 2 2) " mm)"))
(princ (strcat "\n\n[VF-Eingang] Gefaellestrecke GF1 (3 Grad, L=" (rtos L_GF1 2 2) " mm)"))
(setq aktueller-punkt
(insert-inclined-scaled-block "Staustrecke_SP_1000_mm" aktueller-punkt
L_GF1 (ssg-cfg-or "vario" "gefaelle_winkel" 3)))
L_GF1 (ssg-cfg-or "vario" "gefaelle_winkel" 3) hz))
)
(princ "\n\n2/11: (uebersprungen)")
(princ "\n\n[VF-Eingang] Gefaellestrecke GF1 (uebersprungen)")
)
;; 3. Separator
(princ "\n\n3/11: Separator (300 mm, 3 Grad geneigt)")
;; 2. Separator (am GF1-Ende / vor Umlenkstation)
(princ "\n[VF-Eingang] 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)))
;; 4. Umlenkstation
(princ "\n\n4/11: Umlenkstation (500 mm, 3 Grad geneigt)")
(ssg-cfg-or "vario" "separator_block_dz" 0) hz))
;; 3. Umlenkstation
(princ "\n[VF-Eingang] Umlenkstation (500 mm, 3 Grad geneigt)")
(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)))
(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
(if (= richtung "Auf")
;; 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 (strcat "Vario_Bogen_auf_" (itoa best-winkel) grad-zeichen))
(setq bogen-mass (get-bogen-mass bogen-auf best-winkel))
(setq bogen-name "Vario_Bogen_auf_3")
(setq bogen-mass (get-bogen-mass bogen-auf 3))
)
(progn
(setq bogen-name (strcat "Vario_Bogen_ab_" (itoa best-winkel) grad-zeichen))
(setq bogen-mass (get-bogen-mass bogen-ab best-winkel))
(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 (strcat "\n\n5/11: " bogen-name " (3 Grad geneigt)"))
(setq aktueller-punkt
(insert-rotated-block-with-ks bogen-name aktueller-punkt
(ssg-cfg-or "vario" "gefaelle_winkel" 3) bogen-dx bogen-dz))
(ssg-cfg-or "vario" "gefaelle_winkel" 3) bogen-dx bogen-dz hz))
;; 6. Variable Strecke L_VF
(if (> L_VF 0.1)
(progn
(if (= richtung "Auf")
(if (= best-winkel 0)
(progn
(princ (strcat "\n\n6/11: Steigungsstrecke ("
(itoa (- (- best-winkel 3))) " Grad, L=" (rtos L_VF 2 2) " mm)"))
(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 (- (- best-winkel 3))))
L_VF 0 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)))
(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))
)
)
)
)
@@ -482,64 +580,126 @@
)
;; 7. 2. Vertikalbogen
(if (= richtung "Auf")
(if (= best-winkel 0)
(progn
(setq bogen-name (strcat "Vario_Bogen_ab_" (itoa best-winkel) grad-zeichen))
(setq bogen-mass (get-bogen-mass bogen-ab best-winkel))
(setq bogen-name "Vario_Bogen_ab_3")
(setq bogen-mass (get-bogen-mass bogen-ab 3))
)
(progn
(setq bogen-name (strcat "Vario_Bogen_auf_" (itoa best-winkel) grad-zeichen))
(setq bogen-mass (get-bogen-mass bogen-auf best-winkel))
(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")
(if (= best-winkel 0)
(progn
(princ (strcat "\n\n7/11: " bogen-name
" (" (itoa (- 3 best-winkel)) " Grad geneigt)"))
(princ (strcat "\n\n7/11: " bogen-name " (3 Grad geneigt)"))
(setq aktueller-punkt
(insert-rotated-block-with-ks bogen-name aktueller-punkt
(- 3 best-winkel) bogen-dx bogen-dz))
0 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))
(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))
)
)
)
;; 8. Motorstation
(princ "\n\n8/11: Motorstation (500 mm, 3 Grad geneigt)")
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)))
;; 9. 2. Gefaellestrecke
(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\n9/11: Gefaellestrecke (3 Grad, L=" (rtos L_GF2 2 2) " mm)"))
(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)))
L_GF2 (ssg-cfg-or "vario" "gefaelle_winkel" 3) hz))
)
(princ "\n\n9/11: (uebersprungen)")
(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
)
;; 10. Separator 2
(princ "\n\n10/11: Separator (300 mm, 3 Grad geneigt)")
;; --- 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
(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)))
;; 11. EIN_Element
(princ (strcat "\n\n11/11: " es-block " (0 Grad)"))
(setq endpunkt (insert-block-by-ks es-block 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!")
-1
View File
@@ -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}
+31 -2
View File
@@ -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
@@ -74,3 +96,10 @@ 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
+29
View File
@@ -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.
File diff suppressed because it is too large Load Diff
-143002
View File
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.
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