Aus den Lisp Daten unter M:\ACADSST\MENU eine neue Standardlibrary mit Codedoku extrahiert

This commit is contained in:
2026-05-08 11:19:36 +02:00
parent 9fee0e1eb4
commit a3011e7c2a
19 changed files with 5509 additions and 0 deletions
+135
View File
@@ -0,0 +1,135 @@
# Lisp AutoLISP-Standardbibliotheken
Allgemeingültige AutoLISP-Routinen für AutoCAD, destilliert aus den historischen ACADSST-Makros (Schönenberger Systeme GmbH). Die drei `ssg_`-Bibliotheken sind projektunabhängig einsetzbar.
---
## Ladereihenfolge
```lisp
(load "pfad/ssg_load.lsp") ; lädt core → dialog → layer
```
Oder einzeln (Abhängigkeit beachten: `ssg_dialog` und `ssg_layer` setzen `ssg_core` voraus):
```lisp
(load "pfad/ssg_core.lsp")
(load "pfad/ssg_dialog.lsp")
(load "pfad/ssg_layer.lsp")
```
---
## Dateien
### `ssg_core.lsp` Kernbibliothek
Grundfunktionen für Umgebungssicherung, Benutzerinteraktion, Layer, Blöcke und Attribute.
| Funktion | Beschreibung |
|---|---|
| `ssg-start titel vars` | Systemvariablen sichern, CMDECHO aus, Undo-Gruppe öffnen |
| `ssg-end` | Systemvariablen wiederherstellen, Undo-Gruppe schließen |
| `ssg-errhan em` | Fehlerhandler räumt auf und ruft `ssg-end` auf |
| `ssg-ques text defa` | Ja/Nein-Abfrage; `defa=T` → Default Ja, `nil` → Default Nein |
| `ssg-emsg text` | Fehlermeldung mit optionalem Signalton (`ssg-bell`) |
| `ssg-get-layer text` | Layer eines angeklickten Objektes ermitteln |
| `ssg-layer-ss name typ` | Auswahlsatz aller Objekte eines Layers (optional nach Typ filtern) |
| `ssg-make-layer name farbe aktiv` | Layer anlegen (falls nicht vorhanden) und optional aktivieren |
| `ssg-ss-foreach ss func` | Iteration über Auswahlsatz `func` wird für jeden Entity-Name aufgerufen |
| `ssg-ss-redraw ss modus` | Alle Elemente eines Auswahlsatzes hervorheben (3), invertieren (4) oder normal (0) |
| `ssg-ss-add src dest` | Auswahlsatz `src` zu `dest` hinzufügen (in-place, mit Highlight) |
| `ssg-make-blockname pt` | Eindeutigen Blocknamen aus Einfügepunkt + Zeitstempel erzeugen |
| `ssg-insert-block layer farbe pfad pt xs ys rot` | Layer anlegen und Block einfügen |
| `ssg-make-block pt rotation ss` | Auswahlsatz als Block definieren und gleich einfügen; Name aus `ssg-make-blockname` |
| `ssg-attrib-set tag wert ersetzen` | Ein Attribut der letzten Einfügung setzen oder anfügen |
| `ssg-attrib-set-many alist` | Mehrere Attribute auf einmal setzen (`'(("TAG" . "Wert") ...)`) |
| `ssg-attrib-by-handle handle tag wert ersetzen` | Attribut eines Blocks anhand seines Entity-Handles suchen und ändern |
| `ssg-dialog-run dcl id init-fn accept-fn` | Generischer DCL-Dialog: laden, initialisieren, starten, entladen |
| `ssg-zoom-save` | Aktuelle View-Größe merken |
| `ssg-zoom-restore` | Auf gemerkte View-Größe zurückschalten (nur wenn verändert) |
---
### `ssg_dialog.lsp` Dialog-Pattern für Modul-Einfüge-Makros
Kapselt das wiederkehrende DCL-Muster: Dialog mit Vorschaubild, Radio-Auswahl, Block einfügen, Attribute setzen.
| Funktion | Beschreibung |
|---|---|
| `ssg-dia-show-slide tile lib name` | Vorschau-Slide im image-Tile aktualisieren (Bibliothek + Slide-Name) |
| `ssg-dia-update-preview tile idx lib liste` | Vorschau anhand Index-String aus Radio-/List-Tile aktualisieren |
| `ssg-modul-dialog dcl id sel-tile start-val prev-tile lib slides extra-init extra-read` | Vollständiger Modul-Dialog: lädt DCL, setzt Tiles, verknüpft Vorschau, liefert gewählten Index zurück |
| `ssg-insert-modul layer farbe pfad attribs rotation` | Standardsequenz: Layer anlegen → Punkt abfragen → Block einfügen → Attribute setzen |
Die Datei enthält außerdem ein auskommentiertes **Template** für neue `c:BEFEHL`-Definitionen nach dem SSG-Muster.
---
### `ssg_layer.lsp` Interaktive Layer-Verwaltung
Benutzerfreundliche AutoCAD-Befehle für Layer-Operationen. Alle Befehle sichern die Umgebung über `ssg-start`/`ssg-end`.
**Hilfsfunktionen (intern):**
| Funktion | Beschreibung |
|---|---|
| `ssg-layer-list-all` | Alle Layernamen als Liste |
| `ssg-layer-info-all` | Alle Layer als Assoziationslisten (Name, Farbe, Linientyp, Flags) |
| `ssg-layer-visible-p name` | Sichtbarkeitsstatus prüfen (T = sichtbar) |
| `ssg-layer-safe-p name gruppe` | Prüfen ob Layer ausgeschaltet werden darf (nicht aktiver Layer) |
| `ssg-layer-group name` | Gruppen-Kennung aus Layernahme extrahieren (Position 23) |
| `ssg-layer-rename-group name neu` | Neuen Layernamen mit geänderter Gruppen-Kennung berechnen |
| `ssg-layer-group-move alt neu` | Alle Objekte einer Layergruppe auf neue Gruppen-Kennung verschieben |
**AutoCAD-Befehle:**
| Befehl | Beschreibung |
|---|---|
| `c:SSG-LayerSet` | Layer des angeklickten Objektes als aktiven Layer setzen |
| `c:SSG-LayerInfo` | Layer des angeklickten Objektes anzeigen |
| `c:SSG-LayerMove` | Auswahlsatz auf Layer eines anderen Objektes verschieben |
| `c:SSG-LayerCopy` | Auswahlsatz kopieren und Kopie auf Ziel-Layer legen |
| `c:SSG-LayerMoveType` | Alle Objekte des gleichen Typs auf dem gleichen Layer verschieben |
| `c:SSG-LayerOff` | Layer durch Anklicken ausschalten (Schleife bis Enter) |
| `c:SSG-LayerFreeze` | Layer durch Anklicken einfrieren (Schleife bis Enter) |
| `c:SSG-FreezeAll` | Alle Layer außer einem einfrieren |
| `c:SSG-ThawAll` | Alle Layer auftauen |
| `c:SSG-LayerOnAll` | Alle ausgeschalteten Layer einschalten |
| `c:SSG-LayerDelete` | Layer mit Sicherheitsabfrage löschen (Objekte + Layer) |
---
### `ssg_load.lsp` Laderoutine
Lädt alle drei Bibliotheken in der richtigen Reihenfolge. Ermittelt den Pfad automatisch über `findfile`.
---
### `SSG_LIB_Commands.lsp` Dummy-Befehle für das SSG-Menü
Platzhalter-Definitionen für alle Menüeinträge des SSG-Menüsystems (ILS-Module, Kurven, Gefällestrecken). Gibt beim Aufruf eine Meldung aus. Wird durch echte Implementierungen ersetzt sobald die jeweiligen Blöcke und DCL-Dialoge vorliegen.
---
### `ILSModulInsert.lsp` ILS Kreisel-Modul-Einfügung
Einfügen von ILS-Kreisel-Modulen mit Abstand- und Typ-Konfiguration (mit/ohne PIN). Enthält Smart-Connect-Logik für automatische Positionierung. Befehl: `c:KreiselInsert`.
---
### `OmniModulInsert.lsp` Omni-Modul-Einfügung
Einfügen von Omni-Modulen. Befehl analog zu `ILSModulInsert`.
---
### `VarioFoerderer.lsp` Vario-Förderer
Umfangreiche Routinen für den Vario-Förderer (Strecken, Kurven, Sonderelemente). Größte Einzeldatei im Projekt.
---
### `tests.lsp` Testskript
Manuelle Tests für die Bibliotheksfunktionen. Nicht für den Produktiveinsatz laden.
+363
View File
@@ -0,0 +1,363 @@
;; ============================================================
;; SSG_CORE.LSP - Kernbibliothek: Umgebung, Fehler, Dialog
;; Allgemeingueltige Hilfsfunktionen fuer AutoCAD-LISP Makros
;; Ursprung: ACADSST/MENU/ssg.lsp, pu1pu2.lsp (Schoenenberger)
;; Bereinigt und verallgemeinert: 2025
;; ============================================================
;; ------------------------------------------------------------
;; UMGEBUNGSSICHERUNG
;; Sichert Systemvariablen vor Makroausfuehrung und stellt
;; sie danach wieder her. Wird immer als Paar verwendet:
;; (ssg-start "Titel" '(("OSMODE") ("ORTHOMODE")))
;; ... Makrocode ...
;; (ssg-end)
;; ------------------------------------------------------------
(defun ssg-start (titel zusatz-vars / xlen xpos xvar)
;; titel - Anzeigename des Makros
;; zusatz-vars - Liste zusaetzlicher Variablen z.B. '(("OSMODE")("ORTHOMODE"))
;; Immer CLAYER und CMDECHO werden automatisch gesichert.
(setq _ssg-olderr *error*
*error* (function ssg-errhan)
_ssg-cavar (append '(("CLAYER") ("CMDECHO")) zusatz-vars)
xlen (length _ssg-cavar)
xpos 0
)
(repeat xlen
(setq xvar (car (nth xpos _ssg-cavar))
_ssg-cavar (subst (cons xvar (getvar xvar))
(nth xpos _ssg-cavar) _ssg-cavar)
xpos (1+ xpos)
)
)
(setvar "CMDECHO" 0)
(command "_undo" "_G")
(graphscr)
(if titel (prompt (strcat "\n***** " titel " *****\n")))
(princ)
)
(defun ssg-end (/ xpos xlen xvar)
(if _ssg-cavar
(progn
(command)
(command "_undo" "_E")
(setq xpos 1
xlen (length _ssg-cavar)
)
(if (/= (getvar "CLAYER") (caar _ssg-cavar))
(command "_LAYER" "_SE" (cdar _ssg-cavar) "")
)
(repeat (1- xlen)
(setq xvar (nth xpos _ssg-cavar)
xpos (1+ xpos)
)
(setvar (car xvar) (cdr xvar))
)
)
)
(if _ssg-olderr (setq *error* _ssg-olderr))
(princ)
)
(defun ssg-errhan (em)
(if (= em "Function cancelled")
(princ)
(progn (princ "\nFehler: ") (princ em))
)
(command)
(command)
(ssg-end)
)
;; ------------------------------------------------------------
;; BENUTZER-ABFRAGEN
;; ------------------------------------------------------------
;; Ja/Nein-Abfrage mit konfigurierbarem Default
;; defa = T -> Default ist "Yes" (Eingabe noetig um "No" zu waehlen)
;; defa = nil -> Default ist "No"
;; Rueckgabe: T wenn "No" gewaehlt (also Ablehnung), nil wenn "Yes"
(defun ssg-ques (prompt-text defa)
(if defa
(progn
(initget 1 "Yes No Yes")
(= (getkword (strcat "\n" prompt-text " Y/N <Y>: ")) "No")
)
(progn
(initget 1 "Yes No No")
(= (getkword (strcat "\n" prompt-text " Y/N <N>: ")) "Yes")
)
)
)
;; Fehlermeldung mit optionalem Signalton
;; ssg-bell = T -> kein Ton; nil -> Ton ausgeben
(defun ssg-emsg (text)
(if (not ssg-bell) (prompt "\007"))
(terpri)
(prompt text)
(terpri)
)
;; ------------------------------------------------------------
;; LAYER-HILFSFUNKTIONEN
;; ------------------------------------------------------------
;; Layer eines angeklickten Objektes ermitteln
;; txt = Prompt-Text fuer Objektauswahl
;; Rueckgabe: Layername als String, nil wenn Abbruch
(defun ssg-get-layer (txt / sel)
(if (setq sel (entsel txt))
(cdr (assoc 8 (entget (car sel))))
)
)
;; Alle Objekte eines bestimmten Layers als Auswahlsatz liefern
;; lay-name = Layername; ent-typ = Entitaetstyp z.B. "LINE" (nil = alle)
(defun ssg-layer-ss (lay-name ent-typ)
(if ent-typ
(ssget "X" (list (cons 0 ent-typ) (cons 8 lay-name)))
(ssget "X" (list (cons 8 lay-name)))
)
)
;; Layer anlegen (falls nicht vorhanden) und optional setzen
;; lay-name = Name; color = Farbnummer als String z.B. "2"; set-aktiv = T/nil
(defun ssg-make-layer (lay-name color set-aktiv)
(if set-aktiv
(command "_LAYER" "_M" lay-name "_CO" color lay-name "")
(command "_LAYER" "_N" lay-name "_CO" color lay-name "")
)
)
;; Auswahlsatz-Iteration: Funktion fuer jedes Element aufrufen
;; ss = Auswahlsatz; func = Funktion mit einem Parameter (entity-name)
(defun ssg-ss-foreach (ss func / i ename)
(if ss
(progn
(setq i 0)
(while (setq ename (ssname ss i))
(func ename)
(setq i (1+ i))
)
)
)
)
;; Alle Elemente eines Auswahlsatzes hervorheben/zuruecksetzen
;; ss = Auswahlsatz; modus = 3 (hervorheben) / 4 (invertiert) / 0 (normal)
(defun ssg-ss-redraw (ss modus / i ename)
(if ss
(progn
(setq i 0)
(while (setq ename (ssname ss i))
(redraw ename modus)
(setq i (1+ i))
)
)
)
)
;; Auswahlsatz zu einem anderen Auswahlsatz hinzufuegen (in-place)
;; src-ss = Quell-Auswahlsatz; dest-ss = Ziel-Auswahlsatz (wird modifiziert)
(defun ssg-ss-add (src-ss dest-ss / i ename)
(if (null dest-ss) (setq dest-ss (ssadd)))
(setq i 0)
(while (setq ename (ssname src-ss i))
(ssadd ename dest-ss)
(redraw ename 3)
(setq i (1+ i))
)
dest-ss
)
;; ------------------------------------------------------------
;; BLOCK-OPERATIONEN
;; ------------------------------------------------------------
;; Eindeutigen Blocknamen aus Einfuegepunkt + Zeitstempel erzeugen
;; pt = Einfuegepunkt (Liste); Rueckgabe: Blockname als String
(defun ssg-make-blockname (pt / k1 k2)
(setq k1 (strcat (itoa (abs (fix (car pt))))
(itoa (abs (fix (cadr pt))))
(itoa (abs (fix (caddr pt)))))
k2 (substr (rtos (getvar "cdate") 2 9) 10 9)
)
(strcat k1 k2)
)
;; Einzel-Block einfuegen mit Layer anlegen
;; lay-name = Ziel-Layer; color = Layerfarbe
;; blk-pfad = vollstaendiger Blockpfad (ohne Erweiterung)
;; pt = Einfuegepunkt; xscale yscale = Skalierung ("" = 1)
;; rotation = Drehwinkel als String oder pause fuer interaktiv
(defun ssg-insert-block (lay-name color blk-pfad pt xscale yscale rotation)
(ssg-make-layer lay-name color T)
(command "_insert" blk-pfad pt xscale yscale rotation)
)
;; Block aus Auswahlsatz erstellen und gleich wieder einfuegen
;; pt = Origin; rotation = Drehwinkel als String
;; ss = Auswahlsatz der Elemente
;; Rueckgabe: Blockname (String)
(defun ssg-make-block (pt rotation ss / bname gefunden)
(setq bname (ssg-make-blockname pt)
gefunden (tblsearch "block" bname)
)
(if (not gefunden)
(progn
(command "_block" bname pt ss "")
(command "_insert" bname pt "" "" rotation)
)
(progn
(alert (strcat "Blockname '" bname "' existiert bereits - wird uebersprungen."))
(setq bname (strcat "x" bname))
(command "_block" bname pt ss "")
(command "_insert" bname pt "" "" rotation)
)
)
bname
)
;; ------------------------------------------------------------
;; ATTRIBUT-OPERATIONEN
;; ------------------------------------------------------------
;; Attribut eines Blocks (letzte Einfuegung) aendern
;; tag = Attributbezeichner (z.B. "ARTINR")
;; wert = neuer Wert
;; ersetzen = T -> vollstaendiger Ersatz; nil -> Anfuegen
(defun ssg-attrib-set (tag wert ersetzen / obj typ attr-tag attr-wert)
(setq obj (entlast))
(while (not (equal (cdr (assoc 0 (entget obj))) "SEQEND"))
(setq typ (cdr (assoc 0 (entget obj))))
(if (equal typ "ATTRIB")
(progn
(setq attr-tag (cdr (assoc 2 (entget obj)))
attr-wert (cdr (assoc 1 (entget obj)))
)
(if (equal attr-tag tag)
(if ersetzen
(entmod (subst (cons 1 wert)
(assoc 1 (entget obj)) (entget obj)))
(entmod (subst (cons 1 (strcat attr-wert wert))
(assoc 1 (entget obj)) (entget obj)))
)
)
)
)
(setq obj (entnext obj))
)
)
;; Mehrere Attribute eines Blocks auf einmal setzen
;; attrib-alist = Assoziationsliste '(("TAG1" . "Wert1") ("TAG2" . "Wert2") ...)
(defun ssg-attrib-set-many (attrib-alist / obj typ tag wert)
(setq obj (entlast))
(while (not (equal (cdr (assoc 0 (entget obj))) "SEQEND"))
(setq typ (cdr (assoc 0 (entget obj))))
(if (equal typ "ATTRIB")
(progn
(setq tag (cdr (assoc 2 (entget obj))))
(setq wert (cdr (assoc tag attrib-alist)))
(if (and wert (> (strlen wert) 0))
(entmod (subst (cons 1 wert)
(assoc 1 (entget obj)) (entget obj)))
)
)
)
(setq obj (entnext obj))
)
)
;; Attribut eines Blocks anhand seines Handle suchen und aendern
;; handle = Entity-Handle (String) des INSERT
;; tag = Attributbezeichner
;; wert = neuer Wert
;; ersetzen = T -> ersetzen; nil -> anhaengen
(defun ssg-attrib-by-handle (handle tag wert ersetzen / e typ blk-tag blk-wert fertig)
(setq e (entnext)
fertig nil
)
(while (and e (not fertig))
(setq typ (cdr (assoc 0 (entget e))))
(if (and (equal (cdr (assoc 5 (entget e))) handle)
(equal typ "INSERT")
(equal (cdr (assoc 66 (entget e))) 1)
)
(progn
(while (not (= (cdr (assoc 0 (entget e))) "SEQEND"))
(if (equal (cdr (assoc 0 (entget e))) "ATTRIB")
(progn
(setq blk-tag (cdr (assoc 2 (entget e)))
blk-wert (cdr (assoc 1 (entget e)))
)
(if (equal blk-tag tag)
(if ersetzen
(entmod (subst (cons 1 wert)
(assoc 1 (entget e)) (entget e)))
(entmod (subst (cons 1 (strcat blk-wert wert))
(assoc 1 (entget e)) (entget e)))
)
)
)
)
(setq e (entnext e))
)
(setq fertig T)
)
)
(setq e (entnext e))
)
)
;; ------------------------------------------------------------
;; DIALOG-STANDARD-PATTERN
;; Vorlage fuer DCL-Dialoge: laden, initialisieren, starten
;; Verwendung:
;; (ssg-dialog-run "pfad/dialog.dcl" "dialog-name" init-fn accept-fn)
;;
;; init-fn = Funktion ohne Parameter, setzt Tiles und Actions
;; accept-fn = Funktion ohne Parameter, liest Tiles aus
;; ------------------------------------------------------------
(defun ssg-dialog-run (dcl-pfad dialog-name init-fn accept-fn / dat)
(setq dat (load_dialog dcl-pfad))
(if (not (new_dialog dialog-name dat))
(progn (alert "Dialog konnte nicht geladen werden.") (exit))
)
(if init-fn (init-fn))
(action_tile "accept" "(if accept-fn (accept-fn)) (done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")
(start_dialog)
(unload_dialog dat)
)
;; ------------------------------------------------------------
;; ZOOM-HILFSFUNKTIONEN
;; ------------------------------------------------------------
;; Aktuelle View-Groesse merken
(defun ssg-zoom-save ()
(setq _ssg-view-size (getvar "VIEWSIZE"))
)
;; Auf gespeicherte View-Groesse zurueckschalten (wenn veraendert)
(defun ssg-zoom-restore ()
(if (and _ssg-view-size (/= (getvar "VIEWSIZE") _ssg-view-size))
(command "_ZOOM" "_P")
)
)
(prompt "\nssg_core.lsp geladen.")
(princ)
+165
View File
@@ -0,0 +1,165 @@
;; ============================================================
;; 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)
+315
View File
@@ -0,0 +1,315 @@
;; ============================================================
;; SSG_LAYER.LSP - Layer-Verwaltungsroutinen
;; Interaktive Layer-Operationen: verschieben, ein/ausschalten,
;; einfrieren, Gruppen-Management.
;; Ursprung: ACADSST/MENU/laymr14.lsp (Schoenenberger)
;; Bereinigt und verallgemeinert: 2025
;; Setzt ssg_core.lsp voraus.
;; ============================================================
;; ------------------------------------------------------------
;; LAYER-INFORMATION
;; ------------------------------------------------------------
;; Alle Layer als Liste von Layernamen liefern
;; Rueckgabe: Liste von Strings
(defun ssg-layer-list-all (/ result entry first)
(setq result nil
first T
)
(while (setq entry (tblnext "LAYER" first))
(setq result (cons (cdr (assoc 2 entry)) result)
first nil
)
)
(reverse result)
)
;; Layer-Infos als Assoziationsliste liefern
;; Rueckgabe: Liste von (name . layer-alist) Paaren
(defun ssg-layer-info-all (/ result entry first)
(setq result nil
first T
)
(while (setq entry (tblnext "LAYER" first))
(setq result (cons (cons (cdr (assoc 2 entry)) (cdr entry)) result)
first nil
)
)
(reverse result)
)
;; Layer-Sichtbarkeitsstatus pruefen
;; lay-name = Layername; Rueckgabe: T wenn sichtbar, nil wenn aus/gefroren
(defun ssg-layer-visible-p (lay-name / entry flags color)
(setq entry (tblsearch "LAYER" lay-name))
(if entry
(progn
(setq flags (cdr (assoc 70 entry))
color (cdr (assoc 62 entry))
)
(and (not (minusp color)) ; nicht ausgeschaltet (negativ = aus)
(= (logand flags 1) 0) ; nicht gefroren (bit 0)
)
)
)
)
;; Pruefen ob Objekt-Layer der aktive Layer ist (Schutz vor Ausschalten)
;; lay-name = zu pruefender Layer; ist-gruppe = T wenn Gruppen-Layer
;; Rueckgabe: T wenn sicher (nicht aktiver Layer), nil wenn Problem
(defun ssg-layer-safe-p (lay-name ist-gruppe)
(if ist-gruppe
(/= (substr (getvar "CLAYER") 2 2) lay-name)
(/= (getvar "CLAYER") lay-name)
)
)
;; ------------------------------------------------------------
;; EINFACHE LAYER-OPERATIONEN
;; ------------------------------------------------------------
;; Layer eines angeklickten Objektes ermitteln und setzen (aktiv machen)
;; Rueckgabe: neuer Layername oder nil bei Abbruch
(defun c:SSG-LayerSet (/ sel lay)
(ssg-start "Layer setzen" nil)
(if (setq lay (ssg-get-layer "\nObjekt auf dem Ziel-Layer waehlen: "))
(progn
(command "_LAYER" "_SET" lay "")
(prompt (strcat "\nAktiver Layer: " lay))
)
(ssg-emsg "Kein Objekt gewaehlt.")
)
(ssg-end)
lay
)
;; Layer eines Objektes anzeigen
(defun c:SSG-LayerInfo (/ sel lay)
(ssg-start "Layer-Info" nil)
(if (setq lay (ssg-get-layer "\nObjekt waehlen: "))
(prompt (strcat "\nObjekt liegt auf Layer: " lay))
(ssg-emsg "Kein Objekt gewaehlt.")
)
(ssg-end)
lay
)
;; Objekte auf einen anderen Layer verschieben (interaktiv)
(defun c:SSG-LayerMove (/ elem ziel-lay)
(ssg-start "Layer wechseln" nil)
(if (setq elem (ssget))
(if (setq ziel-lay (ssg-get-layer "\nObjekt auf dem Ziel-Layer waehlen: "))
(command "_CHANGE" elem "" "_PROP" "_LA" ziel-lay "")
(ssg-emsg "Kein Ziel-Layer gewaehlt.")
)
(ssg-emsg "Kein Objekt gewaehlt.")
)
(ssg-end)
)
;; Objekte auf einen anderen Layer kopieren und dort ablegen
(defun c:SSG-LayerCopy (/ elem ziel-lay)
(ssg-start "Layer-Kopie" nil)
(if (setq elem (ssget))
(if (setq ziel-lay (ssg-get-layer "\nObjekt auf dem Ziel-Layer waehlen: "))
(command "_COPY" elem "" "@" "@" "_CHANGE" elem "" "_PROP" "_LA" ziel-lay "")
(ssg-emsg "Kein Ziel-Layer gewaehlt.")
)
(ssg-emsg "Kein Objekt gewaehlt.")
)
(ssg-end)
)
;; Alle Objekte eines Typs auf dem gleichen Layer auf neuen Layer verschieben
;; (nach Auswahl eines Referenz-Objektes dieses Typs)
(defun c:SSG-LayerMoveType (/ ref-lay ref-typ elem ziel-lay ss ref-sel)
(ssg-start "Layer-Typ verschieben" nil)
(if (setq ref-lay (ssg-get-layer "\nReferenz-Objekt waehlen (bestimmt Typ und Layer): "))
(progn
(setq ref-sel (entsel "\nNochmals fuer Typ-Ermittlung anklicken: "))
(if ref-sel
(progn
(setq ref-typ (cdr (assoc 0 (entget (car ref-sel))))
ss (ssg-layer-ss ref-lay ref-typ)
)
(if ss
(if (setq ziel-lay (ssg-get-layer "\nObjekt auf dem Ziel-Layer waehlen: "))
(progn
(ssg-zoom-save)
(ssg-ss-redraw ss 3)
(if (not (ssg-ques (strcat "Layer dieser " ref-typ "-Objekte wechseln?") nil))
(command "_CHANGE" ss "" "_PROP" "_LA" ziel-lay "")
(ssg-ss-redraw ss 4)
)
(ssg-zoom-restore)
)
(ssg-emsg "Kein Ziel-Layer.")
)
(ssg-emsg "Keine passenden Objekte gefunden.")
)
)
(ssg-emsg "Abgebrochen.")
)
)
(ssg-emsg "Kein Referenz-Objekt gewaehlt.")
)
(ssg-end)
)
;; ------------------------------------------------------------
;; LAYER EIN-/AUSSCHALTEN UND EINFRIEREN
;; ------------------------------------------------------------
;; Layer durch Anklicken ausschalten
(defun c:SSG-LayerOff (/ lay)
(ssg-start "Layer ausschalten" nil)
(while (setq lay (ssg-get-layer "\nLayer zum Ausblenden anklicken (Enter=Ende): "))
(if (ssg-layer-safe-p lay nil)
(command "_LAYER" "_OFF" lay "")
(ssg-emsg "Aktiven Layer nicht ausschalten!")
)
)
(ssg-end)
)
;; Layer durch Anklicken einfrieren
(defun c:SSG-LayerFreeze (/ lay)
(ssg-start "Layer einfrieren" nil)
(while (setq lay (ssg-get-layer "\nLayer zum Einfrieren anklicken (Enter=Ende): "))
(if (ssg-layer-safe-p lay nil)
(command "_LAYER" "_FR" lay "")
(ssg-emsg "Aktiven Layer nicht einfrieren!")
)
)
(ssg-end)
)
;; Alle Layer ausser dem aktiven einfrieren
(defun c:SSG-FreezeAll (/ aktiv)
(ssg-start "Alle anderen Layer einfrieren" nil)
(setq aktiv (ssg-get-layer "\nObjekt auf dem Layer waehlen, der AKTIV bleibt: "))
(if aktiv
(progn
(command "_LAYER" "_SET" aktiv "_FR" "*" "")
(prompt (strcat "\nNur Layer '" aktiv "' ist sichtbar."))
)
(ssg-emsg "Abgebrochen.")
)
(ssg-end)
)
;; Alle ausgefrorenen Layer wieder auftauen
(defun c:SSG-ThawAll ()
(ssg-start "Alle Layer auftauen" nil)
(command "_LAYER" "_T" "*" "")
(ssg-end)
)
;; Alle ausgeschalteten Layer einschalten
(defun c:SSG-LayerOnAll ()
(ssg-start "Alle Layer einschalten" nil)
(command "_LAYER" "_ON" "*" "")
(ssg-end)
)
;; ------------------------------------------------------------
;; LAYER UMBENENNEN / VERSCHIEBEN (Gruppenkonzept)
;; Im Schoenenberger-System haben Layer die Form "X-XX-Name"
;; wobei Position 2-3 die Gruppe identifiziert.
;; Diese Funktionen erlauben das Umbenennen der Gruppen-Kennung.
;; ------------------------------------------------------------
;; Gruppen-Buchstaben aus Layernamen extrahieren (Position 2-3)
(defun ssg-layer-group (lay-name)
(substr lay-name 2 2)
)
;; Neuen Layernamen mit geaenderter Gruppen-Kennung erzeugen
;; lay-name = original; new-grp = neue Gruppen-Kennung (2 Zeichen)
(defun ssg-layer-rename-group (lay-name new-grp)
(strcat (substr lay-name 1 1) new-grp (substr lay-name 4))
)
;; Alle Objekte eines Gruppen-Layers auf neuen Gruppen-Layer verschieben
;; old-grp = alte Gruppen-Kennung; new-grp = neue Gruppen-Kennung
(defun ssg-layer-group-move (old-grp new-grp / all-layers entry lay-info new-name
lay-color lay-ltyp c ss i e ed)
(setq all-layers (ssg-layer-info-all))
(foreach entry all-layers
(if (= (ssg-layer-group (car entry)) old-grp)
(progn
(setq lay-info (cdr entry)
new-name (ssg-layer-rename-group (car entry) new-grp)
c (cdr (assoc 62 lay-info))
lay-color (if (minusp c) (abs c) c)
lay-ltyp (cdr (assoc 6 lay-info))
)
(if (not (tblsearch "LAYER" new-name))
(command "_LAYER" "_N" new-name "_CO" (itoa lay-color) new-name
"LT" lay-ltyp new-name "")
)
(setq ss (ssg-layer-ss (car entry) nil))
(if ss
(progn
(setq i 0)
(while (setq e (ssname ss i))
(setq ed (entget e))
(entmod (subst (cons 8 new-name) (assoc 8 ed) ed))
(setq i (1+ i))
)
)
)
)
)
)
)
;; ------------------------------------------------------------
;; LAYER LOESCHEN (mit Sicherheitsabfrage)
;; Loescht alle Objekte auf einem Layer und danach den Layer selbst.
;; Nur interaktiv verwenden!
;; ------------------------------------------------------------
(defun c:SSG-LayerDelete (/ lay ss)
(ssg-start "Layer loeschen" nil)
(initget 1)
(setq lay (getstring "\nLayername zum Loeschen: "))
(if (tblsearch "LAYER" lay)
(progn
(setq ss (ssg-layer-ss lay nil))
(if ss
(progn
(ssg-ss-redraw ss 4)
(if (not (ssg-ques (strcat "Alle Objekte auf Layer '" lay "' loeschen?") nil))
(progn
(command "_ERASE" ss "")
(command "_LAYER" "_OFF" lay "")
(command "_PURGE" "_LA" lay "N")
(prompt (strcat "\nLayer '" lay "' geloescht."))
)
(progn
(ssg-ss-redraw ss 0)
(prompt "\nAbgebrochen.")
)
)
)
(progn
(command "_LAYER" "_OFF" lay "")
(command "_PURGE" "_LA" lay "N")
(prompt (strcat "\nLeerer Layer '" lay "' geloescht."))
)
)
)
(ssg-emsg (strcat "Layer '" lay "' existiert nicht."))
)
(ssg-end)
)
(prompt "\nssg_layer.lsp geladen.")
(princ)
+30
View File
@@ -0,0 +1,30 @@
;; ============================================================
;; SSG_LOAD.LSP - Laderoutine fuer die SSG-Standardbibliotheken
;;
;; Laedt alle SSG-Kernbibliotheken in der richtigen Reihenfolge.
;; In acad.lsp oder manuell aufrufen:
;; (load "pfad/ssg_load.lsp")
;;
;; Alternativ nur einzelne Bibliotheken laden:
;; (load "pfad/ssg_core.lsp")
;; (load "pfad/ssg_layer.lsp")
;; (load "pfad/ssg_dialog.lsp")
;; ============================================================
(defun ssg-load-libs (/ base-path)
;; Pfad dieser Datei als Basis verwenden (AutoCAD 2000+)
(setq base-path
(if (findfile "ssg_core.lsp")
(substr (findfile "ssg_core.lsp") 1
(- (strlen (findfile "ssg_core.lsp")) (strlen "ssg_core.lsp")))
(strcat (getvar "DWGPREFIX"))
)
)
(load (strcat base-path "ssg_core.lsp") "ssg_core.lsp nicht gefunden")
(load (strcat base-path "ssg_dialog.lsp") "ssg_dialog.lsp nicht gefunden")
(load (strcat base-path "ssg_layer.lsp") "ssg_layer.lsp nicht gefunden")
(prompt "\nSSG-Bibliotheken geladen: ssg_core, ssg_dialog, ssg_layer")
(princ)
)
(ssg-load-libs)