;; ============================================================ ;; SSG_DIALOG.LSP - Standard-Pattern fuer Modul-Einfuege-Dialoge ;; Kapselt das wiederkehrende Muster aus den ACADSST-Makros: ;; - DCL-Dialog mit Vorschaubild ;; - Radio-/List-Auswahl -> Blockname + Parameter setzen ;; - Block einfuegen + Attribute befuellen ;; ;; Setzt ssg_core.lsp voraus. ;; Ursprung: ILS2100/*.lsp, HFS/hfs_mod.lsp (Schoenenberger) ;; Bereinigt und verallgemeinert: 2025 ;; ============================================================ ;; ------------------------------------------------------------ ;; VORSCHAU-BILD im Dialog aktualisieren ;; tile-name = Name des image-Tiles im DCL (z.B. "anzeige") ;; slide-lib = Pfad zur .slb-Datei ohne Erweiterung (z.B. "m:/acadsst/ils2100") ;; slide-name = Name des Slides in der Bibliothek ;; Hintergrundfarbe -18 = AutoCAD-Grafik-Hintergrund ;; ------------------------------------------------------------ (defun ssg-dia-show-slide (tile-name slide-lib slide-name / breite hoehe) (setq breite (dimx_tile tile-name) hoehe (dimy_tile tile-name) ) (start_image tile-name) (fill_image 0 0 breite hoehe (ssg-cfg-or "infrastruktur" "dialog_preview_bg_color" -18)) (slide_image 0 0 breite hoehe (strcat slide-lib "(" slide-name ")")) (end_image) ) ;; Vorschau mit Index-basierter Auswahl aktualisieren ;; tile-name = image-Tile-Name ;; idx-str = aktueller Auswahlindex als String (wie get_tile liefert) ;; slide-lib = Pfad zur Slide-Bibliothek ;; slide-list = Liste der Slide-Namen, Index entspricht dem Radio-Index (defun ssg-dia-update-preview (tile-name idx-str slide-lib slide-list / idx) (setq idx (atoi idx-str)) (if (and (>= idx 0) (< idx (length slide-list))) (ssg-dia-show-slide tile-name slide-lib (nth idx slide-list)) ) ) ;; ------------------------------------------------------------ ;; GENERISCHER MODUL-DIALOG ;; Vereinfacht das haeufige Muster: ;; 1. DCL laden, Tiles initialisieren ;; 2. ACTION_TILE fuer Auswahl-Tile (aktualisiert Vorschau) ;; 3. accept/cancel ;; 4. Rueckgabe: ausgewaehlter Index oder nil bei Abbruch ;; ;; dcl-pfad = vollstaendiger Pfad zur .dcl-Datei ;; dialog-id = Name des Dialogs in der .dcl ;; select-tile= Name des List/Radio-Tiles fuer die Auswahl ;; start-val = Start-Auswahl als String (z.B. "0") ;; preview-tile= Name des image-Tiles (nil = kein Vorschaubild) ;; slide-lib = Pfad der Slide-Bibliothek (nil = kein Vorschaubild) ;; slide-list = Liste der Slide-Namen entsprechend Auswahl-Index ;; extra-init = Funktion fuer weitere Tile-Initialisierungen (nil = keine) ;; extra-read = Funktion zum Auslesen weiterer Tiles bei accept (nil = keine) ;; ------------------------------------------------------------ (defun ssg-modul-dialog (dcl-pfad dialog-id select-tile start-val preview-tile slide-lib slide-list extra-init extra-read / dat ergebnis aktuell) (setq dat (load_dialog dcl-pfad) aktuell start-val ) (if (not (new_dialog dialog-id dat)) (progn (alert "Dialog nicht verfuegbar.") (exit)) ) (set_tile select-tile start-val) (if (and preview-tile slide-lib slide-list) (ssg-dia-update-preview preview-tile start-val slide-lib slide-list) ) (if extra-init (extra-init)) (action_tile select-tile (strcat "(setq aktuell (get_tile \"" select-tile "\"))" (if (and preview-tile slide-lib slide-list) (strcat "(ssg-dia-update-preview \"" preview-tile "\" aktuell \"" slide-lib "\" slide-list)") "" ) ) ) (action_tile "accept" (strcat "(setq ergebnis aktuell)" (if extra-read "(extra-read)" "") "(done_dialog 1)" ) ) (action_tile "cancel" "(done_dialog 0)") (start_dialog) (unload_dialog dat) ergebnis ) ;; ------------------------------------------------------------ ;; BLOCK-MODUL EINFUEGEN - Standardsequenz ;; Kapselt das immer gleiche Muster: ;; 1. Layer anlegen ;; 2. Einfuegepunkt abfragen ;; 3. Block-Kennung (eindeutiger Name) erstellen ;; 4. Block einfuegen (mit Winkel-Abfrage oder fest) ;; 5. Attribute setzen ;; ;; lay-name = Ziel-Layer ;; lay-color = Layerfarbe als String ;; blk-pfad = vollstaendiger Blockpfad (Laufwerk + Verzeichnis + Dateiname) ;; attrib-alist= Assoziationsliste der Attribute '(("TAG" . "Wert") ...) ;; rotation = Drehwinkel als String oder pause fuer Benutzerabfrage ;; Rueckgabe = Einfuegepunkt ;; ------------------------------------------------------------ (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: ")) (command "_insert" blk-pfad pt "" "" rotation) (if attrib-alist (ssg-attrib-set-many attrib-alist) ) pt ) ;; ------------------------------------------------------------ ;; HAUPT-MAKRO TEMPLATE ;; Vorlage fuer c:BEFEHL-Definitionen nach dem SSG-Muster. ;; Kopieren und anpassen. ;; ;; Beispiel-Aufruf eines konkreten Moduls (nicht ausfuehren): ;; ;; (defun c:MEIN_MODUL ( / pt ergebnis) ;; (ssg-start "MEIN MODUL" '(("OSMODE"))) ;; (setq ergebnis ;; (ssg-modul-dialog ;; (strcat lw "/acadsst/pfad/mein_dialog.dcl") ;; "DIALOG_NAME" ;; "DWG_NAME" ; Radio/List-Tile ;; (if (null m_DWG_NAME) "0" m_DWG_NAME) ;; "anzeige" ; Vorschau-Tile ;; (strcat lw "/acadsst/pfad/slb_bibliothek") ;; '("slide0" "slide1" "slide2") ;; nil ; extra-init ;; nil ; extra-read ;; ) ;; ) ;; (if ergebnis ;; (progn ;; (setq m_DWG_NAME ergebnis) ;; (setq pt (ssg-insert-modul "LAYER-NAME" "3" ;; (strcat lw "/acadsst/pfad/block_" ergebnis) ;; (list (cons "GRUPPE" "G1") (cons "ARTINR" "123456")) ;; pause)) ;; ) ;; ) ;; (ssg-end) ;; ) ;; ------------------------------------------------------------ (prompt "\nssg_dialog.lsp geladen.") (princ)