b8e8d0b0a0
Neues Modul KettenFoerderer.lsp: baut aus KF_UM_<winkel>, KF_LAENGE und KF_AN_<winkel> (je KS_AUS auf KS_EIN) plus der Draufsicht KF_2D einen Block KF_<n>. Die Bausteine werden aufgerichtet eingebaut (Rz*Rx(90)*Rz), die Hoehe laeuft in Z; KF_2D liegt deckungsgleich mit der Kette. Der Einbauwinkel jedes Folgebausteins wird aus der Richtung des KS_AUS seines Vorgaengers gemessen, KF_LAENGE ueber die Einbauhoehe skaliert. - Dialog (DCL-Vorlage, Typ als Radiobuttons), Hoehe per Zahl oder aus zwei Punkten, Doppelklick auf KF_n oeffnet KF_EDIT mit Neuaufbau - eigenstaendiges Attribut-Schema, Auswahllisten mit Sivas-Optionstexten in data/json/kettenfoerderer.json - Sivas-Export: Merkmale 350, 353-357, 359-361, 391, baugleiche Foerderer werden zu einer Zeile zusammengefasst (Artikelnummer 6120) - ssg_ks_insert.lsp: neue Primitiven ks-xy-winkel, ks-block-messen, insert-block-ks-skaliert und insert-block-ks-matrix (freie 3x3-Rotation); ensure-block-loaded nimmt Bloecke ohne Dimensionssuffix unveraendert - Menueeintrag KettenFoerderer aktiviert, toter Dummy OMNI_KettenFoerderer entfernt; KF_* im Export-Pattern, in der ID-Vergabe und im Dispatcher SSG_BLOCKEDIT (vor dem Omniflo-Zweig) - Unit-Tests tu-tests-kf fuer die reinen Rechenkerne; Modul wird in der MNL vorgeladen, dbg-Schalter kf-zeit zur Laufzeitmessung Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
203 lines
7.3 KiB
Plaintext
203 lines
7.3 KiB
Plaintext
;; ============================================================
|
||
;; SSG_LIB.mnl - Automatisch geladen beim MENULOAD von SSG_LIB.mnu
|
||
;;
|
||
;; Definiert den Lazy-Loader (ssg-ensure) und laedt alle Module.
|
||
;; Kern-Module: ssg_core, ssg_lang, ssg_dbg, ssg_dialog, ssg_layer, ssg_id, ssg_input
|
||
;; Feature-Module: KreiselInsert, Gefaellestrecke, VarioFoerderer, ...
|
||
;; ============================================================
|
||
|
||
;; Globale Variable: Pfad zu den LISP-Dateien
|
||
;; Zuerst Umgebungsvariable, dann Heuristik aus MNL-Datei-Pfad
|
||
(setq *ssg-lisp-pfad* (getenv "DXFM_LISP"))
|
||
(if *ssg-lisp-pfad*
|
||
(setq *ssg-lisp-pfad* (vl-string-translate "\\" "/" *ssg-lisp-pfad*))
|
||
;; Fallback: Pfad aus MNL-Datei ableiten – menu/SSG_LIB.mnl → Lisp/
|
||
(progn
|
||
(setq *ssg-mnl-datei* (findfile "SSG_LIB.mnl"))
|
||
(if *ssg-mnl-datei*
|
||
(progn
|
||
(setq *ssg-mnl-datei* (vl-string-translate "\\" "/" *ssg-mnl-datei*))
|
||
(setq *ssg-menu-pos* (vl-string-search "/menu/" *ssg-mnl-datei*))
|
||
(if *ssg-menu-pos*
|
||
(progn
|
||
(setq *ssg-lisp-pfad*
|
||
(strcat (substr *ssg-mnl-datei* 1 *ssg-menu-pos*) "/Lisp"))
|
||
(if (not (findfile (strcat *ssg-lisp-pfad* "/ssg_core.lsp")))
|
||
(progn
|
||
(setq *ssg-lisp-pfad* nil)
|
||
(princ "\n[SSG_LIB] Heuristik fehlgeschlagen: ssg_core.lsp nicht gefunden.")
|
||
)
|
||
)
|
||
)
|
||
)
|
||
)
|
||
)
|
||
)
|
||
)
|
||
|
||
;; ------------------------------------------------------------
|
||
;; ssg-ensure - Lazy-Loader fuer SSG_LIB Module
|
||
;;
|
||
;; Laedt ein Modul einmalig. Setzt Flag *ssg-<modul>-loaded*.
|
||
;; Laedt Kern-Abhaengigkeiten (core/dbg/dialog/layer) automatisch.
|
||
;; ------------------------------------------------------------
|
||
(defun ssg-ensure (modul / flag-sym)
|
||
(setq flag-sym (read (strcat "*ssg-" modul "-loaded*")))
|
||
(if (not (eval flag-sym))
|
||
(progn
|
||
;; Pfad nachschlagen falls noch nicht gesetzt
|
||
(if (null *ssg-lisp-pfad*)
|
||
(progn
|
||
(setq *ssg-lisp-pfad* (getenv "DXFM_LISP"))
|
||
(if *ssg-lisp-pfad*
|
||
(setq *ssg-lisp-pfad* (vl-string-translate "\\" "/" *ssg-lisp-pfad*))
|
||
)
|
||
)
|
||
)
|
||
|
||
(if (null *ssg-lisp-pfad*)
|
||
(progn
|
||
(alert "SSG_LIB: DXFM_LISP nicht gesetzt!\nBitte zuerst setenv.bat ausfuehren.")
|
||
(princ "\n[SSG_LIB] FEHLER: DXFM_LISP nicht gesetzt!")
|
||
)
|
||
(progn
|
||
;; Kern-Module als Abhaengigkeit laden (je nur einmal)
|
||
;; WICHTIG: auch den modul-spezifischen Flag setzen, sonst Doppelladen
|
||
(if (not *ssg-core-loaded*)
|
||
(progn
|
||
(ssg-ensure-load "ssg_core")
|
||
(set '*ssg-core-loaded* t)
|
||
(set '*ssg-ssg_core-loaded* t)
|
||
(ssg-load-config)
|
||
)
|
||
)
|
||
(if (not *ssg-lang-loaded*)
|
||
(progn
|
||
(ssg-ensure-load "ssg_lang")
|
||
(set '*ssg-lang-loaded* t)
|
||
(set '*ssg-ssg_lang-loaded* t)
|
||
)
|
||
)
|
||
(if (not *ssg-dbg-loaded*)
|
||
(progn
|
||
(ssg-ensure-load "ssg_dbg")
|
||
(set '*ssg-dbg-loaded* t)
|
||
(set '*ssg-ssg_dbg-loaded* t)
|
||
(if (and (atoms-family 1 '("DBGOPEN")) (getenv "DXFM_LOG"))
|
||
(dbgopen "debugfile.dbg" "DXFM_LOG")
|
||
)
|
||
)
|
||
)
|
||
(if (not *ssg-dialog-loaded*)
|
||
(progn
|
||
(ssg-ensure-load "ssg_dialog")
|
||
(set '*ssg-dialog-loaded* t)
|
||
(set '*ssg-ssg_dialog-loaded* t)
|
||
)
|
||
)
|
||
(if (not *ssg-layer-loaded*)
|
||
(progn
|
||
(ssg-ensure-load "ssg_layer")
|
||
(set '*ssg-layer-loaded* t)
|
||
(set '*ssg-ssg_layer-loaded* t)
|
||
)
|
||
)
|
||
|
||
;; Angefordertes Feature-Modul laden (falls noch nicht via Kern-Flags gesetzt)
|
||
(if (not (eval flag-sym))
|
||
(progn
|
||
(ssg-ensure-load modul)
|
||
(set flag-sym t)
|
||
)
|
||
)
|
||
)
|
||
)
|
||
)
|
||
)
|
||
(princ)
|
||
)
|
||
|
||
;; Hilfsfunktion: Datei laden mit Fehlerbehandlung (ohne eigene Lademeldung)
|
||
(defun ssg-ensure-load (modul / datei result)
|
||
(setq datei (strcat *ssg-lisp-pfad* "/" modul ".lsp"))
|
||
(if (findfile datei)
|
||
(progn
|
||
(setq result (vl-catch-all-apply 'load (list datei)))
|
||
(if (vl-catch-all-error-p result)
|
||
(princ (strcat "\n[SSG_LIB] FEHLER beim Laden von " modul ": "
|
||
(vl-catch-all-error-message result)))
|
||
)
|
||
)
|
||
(princ (strcat "\n[SSG_LIB] WARNUNG: " datei " nicht gefunden!"))
|
||
)
|
||
)
|
||
|
||
;; ------------------------------------------------------------
|
||
;; Beim MNL-Laden: Kern-Module + Feature-Module laden
|
||
;; ------------------------------------------------------------
|
||
(if *ssg-lisp-pfad*
|
||
(progn
|
||
;; 1) Kern-Module (Core)
|
||
(ssg-ensure "ssg_core")
|
||
(ssg-ensure "ssg_lang")
|
||
(ssg-ensure "ssg_dbg")
|
||
(ssg-ensure "ssg_dialog")
|
||
(ssg-ensure "ssg_layer")
|
||
(ssg-ensure "ssg_id")
|
||
;; Generische Eingabe-Wrapper (ssg-in-*), von den Werkzeug-Modulen genutzt
|
||
(ssg-ensure "ssg_input")
|
||
;; Gemeinsame KS-Extraktion + Block-Einfuegeprimitiven (von Gefaellestrecke
|
||
;; UND VarioFoerderer genutzt) - MUSS vor beiden geladen sein.
|
||
(ssg-ensure "ssg_ks_insert")
|
||
|
||
;; 2) Feature-Module in Anzeigereihenfolge
|
||
(ssg-ensure "KreiselInsert")
|
||
(ssg-ensure "Gefaellestrecke")
|
||
(ssg-ensure "VarioFoerderer")
|
||
(ssg-ensure "EtageVarioFoerderer")
|
||
(ssg-ensure "export")
|
||
(ssg-ensure "external_call")
|
||
(ssg-ensure "OmniModulInsert")
|
||
;; Kettenfoerderer vorladen statt lazy: der erste Menueklick musste sonst
|
||
;; das Laden des Moduls mitbezahlen, der Dialog erschien dadurch spuerbar
|
||
;; verzoegert. Das Modul ist klein, der Startaufschlag faellt nicht ins
|
||
;; Gewicht. (Zum Nachmessen: Schalter "kf-zeit", siehe KettenFoerderer.lsp)
|
||
(ssg-ensure "KettenFoerderer")
|
||
;; Tro_Edit wird nicht vorgeladen - der Dispatcher SSG_BLOCKEDIT und die
|
||
;; Menuemakros holen es per (ssg-ensure "Tro_Edit") bei Bedarf nach.
|
||
(ssg-ensure "SSG_LIB_Commands")
|
||
;; Werkzeuge (Reihenfolge: ssg_texttools nutzt ssg_blocktools)
|
||
(ssg-ensure "ssg_blocktools")
|
||
(ssg-ensure "ssg_texttools")
|
||
(ssg-ensure "ssg_stueckliste")
|
||
|
||
;; Menue einhaengen
|
||
(menucmd "P13=+SSG_LIB.POP1")
|
||
(setvar "DBLCLKEDIT" 1)
|
||
(princ "\n[SSG_LIB] Alle Module geladen. Menue aktiv.")
|
||
;; Beim Start immer auf globalen Default 3D zuruecksetzen.
|
||
;; Hintergrund: AutoLISP-setenv schreibt in die BricsCAD-Profilregistry.
|
||
;; Ohne diesen Reset wuerde ein alter SSG_DIM_SWITCH-Wert aus der Vorsitzung
|
||
;; ueber setenv.bat gewinnen - unabhaengig davon, wie BricsCAD gestartet wurde.
|
||
;; Die Modus-Meldung gibt S:STARTUP aus (einmal, nach allen Lade-Meldungen) -
|
||
;; hier bewusst NICHT, um die Doppelausgabe zu vermeiden.
|
||
(setenv "DXFM_DIM" "3D")
|
||
)
|
||
(princ "\n[SSG_LIB] WARNUNG: DXFM_LISP nicht gesetzt - Befehle nicht verfuegbar.")
|
||
)
|
||
|
||
;; S:STARTUP: wird von BricsCAD nach vollstaendiger Dokument-Initialisierung
|
||
;; aufgerufen - also NACH allen anderen Lade-Meldungen und Duplikaten.
|
||
;; defun-q haengt an eine bestehende S:STARTUP-Definition an (kein Ueberschreiben).
|
||
(defun-q S:STARTUP ()
|
||
(if (car (atoms-family 1 '("SSG-ILS-DIM-AKTUELL")))
|
||
(progn
|
||
(princ (strcat "\n[SSG_LIB] Einfuege-Modus: " (ssg-ils-dim-aktuell)
|
||
" (Umschalten global: SSG_DIM_SWITCH im Menue)"))
|
||
(princ)
|
||
)
|
||
)
|
||
)
|
||
|
||
(princ)
|