;; ============================================================
;; 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 -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)
