Files
dxfmakros/Lisp/ssg_dialog.lsp
m.stangl 9f78ff7f0a Alle LISP-Module auf ssg-cfg-or umgestellt (hardcodierte Konstanten entfernt)
Alle bisher hart codierten Geometrie-, Farb- und Default-Werte in den
LISP-Modulen werden jetzt ueber ssg-cfg-or aus component_defaults.json
gelesen (mit Fallback auf den bisherigen Wert als Sicherheitsnetz).

Lisp/KreiselInsert.lsp:
  - Geometrie-Konstanten: *kreisel-durchmesser*, *kreisel-pin-abstand*,
    *kreisel-default-laenge*, *kreisel-default-hoehe*, *eckrad-default-hoehe*
  - Beschriftungs-Einstellungen: Texthöhe, Farbe, Abstand
  - Linienfarben (color_linie_1/2, color_pin) fuer Layer/CECOLOR
  - Toleranzen: toleranz_kollinear, toleranz_winkel

Lisp/OmniModulInsert.lsp:
  - Default-Werte fuer HOEHE und DREHUNG beim Einfuegen und Bearbeiten
  - Textgroessen (textHeight, textGap) fuer Vorschau-Dialog
  - Max-Laengen fuer AP60, AP110, APG110

Lisp/VarioFoerderer.lsp:
  - staustrecke-basis, FESTE_HORIZONTAL
  - bogen-winkel Liste (zweifach, in Bibliotheks-Extraktion und Berechnung)
  - gefaelle_winkel (3°) an allen Stellen im Anlagen-Aufbau
  - skalierung_basis fuer Block-Skalierung
  - separator_block_dx/dz, station_block_dx/dz fuer Blockeinfuegung

Lisp/Gefaellestrecke.lsp:
  - Default-Wert fuer deltaL, default_winkel
  - separator_breite fuer Laengenberechnung

Lisp/export.lsp:
  - default_hoehe fuer HOEHE-Attribut-Fallback in Bogen/Weiche/Gerade
  - default_gerade_laenge fuer Laenge-Fallback
  - mm_pro_meter (1000.0) fuer Umrechnung mm->m bei Laengenangaben

Lisp/ssg_dialog.lsp:
  - dialog_preview_bg_color (-18) fuer fill_image Hintergrundfarbe

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-12 11:26:22 +02:00

166 lines
5.9 KiB
Common Lisp

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