fcb4444ee1
Neue Module ssg_blocktools.lsp (SSG_BLOCK_COUNT, SSG_BLOCK_DELETE, SSG_ATTR_ERSETZEN) und ssg_texttools.lsp (SSG_TEXT_ERSETZEN, SSG_TEXT_PARALLEL, SSG_TEXT_HOEHE, SSG_TEXT_STIL) sowie der generische Eingabe-Wrapper ssg_input.lsp, dazu Menue-/Lade-Integration, zweisprachige Texte und Unit-Tests fuer die reinen Kerne. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
163 lines
5.6 KiB
Common Lisp
163 lines
5.6 KiB
Common Lisp
;; ============================================================
|
|
;; SSG_INPUT.LSP - Generische Eingabe-Wrapper (ssg-in-*)
|
|
;;
|
|
;; Allgemeingueltige Abfragen mit Vorgabewert, Anzeige "<Vorgabe>" im
|
|
;; Prompt und Enter = Vorgabe (Idee von g_in/g_ky aus den ACADSST-
|
|
;; Makros). Steht NEBEN den VF-spezifischen vfl-in-* aus
|
|
;; vf_linienzug.lsp; diese bleiben unveraendert.
|
|
;;
|
|
;; Alle Funktionen liefern den eingegebenen Wert oder die Vorgabe.
|
|
;; ESC bricht wie ueblich ueber *error* ab (z.B. ssg-errhan).
|
|
;; Ist kein Wert eingegeben und keine Vorgabe da, ist die Rueckgabe nil.
|
|
;;
|
|
;; Optionaler Hook (z.B. fuer ein Eingabe-Journal):
|
|
;; (setq *ssg-in-hook* 'meine-funktion)
|
|
;; (defun meine-funktion (art prompt wert) ...) ;; art = "REAL" "INT"
|
|
;; ;; "STRING" "POINT"
|
|
;; ;; "DIST" "KEYWORD"
|
|
;; ;; "YESNO"
|
|
;; Ein Hook, der einen Fehler wirft, wird abgeschaltet.
|
|
;;
|
|
;; Setzt ssg_core.lsp (und fuer ssg-in-yesno ssg_lang.lsp) voraus.
|
|
;; ============================================================
|
|
|
|
(vl-load-com)
|
|
|
|
;; ------------------------------------------------------------
|
|
;; REINE HILFSFUNKTIONEN (ohne Zeichnung, in test_unit getestet)
|
|
;; ------------------------------------------------------------
|
|
|
|
;; Vorgabe einsetzen, wenn kein Wert eingegeben wurde
|
|
(defun ssg-in-default (wert default)
|
|
(if wert wert default)
|
|
)
|
|
|
|
;; Reelle Zahl ohne ueberfluessige Nullen: 5.0 -> "5", 2.50 -> "2.5"
|
|
(defun ssg-in-fmt-real (v / s)
|
|
(setq s (rtos v 2 6))
|
|
(if (vl-string-position 46 s)
|
|
(progn
|
|
(while (= (substr s (strlen s)) "0")
|
|
(setq s (substr s 1 (1- (strlen s))))
|
|
)
|
|
(if (= (substr s (strlen s)) ".")
|
|
(setq s (substr s 1 (1- (strlen s))))
|
|
)
|
|
)
|
|
)
|
|
s
|
|
)
|
|
|
|
;; Punkt als "x,y,z" (fehlende Z-Werte als 0)
|
|
(defun ssg-in-fmt-pt (p)
|
|
(strcat (ssg-in-fmt-real (car p)) ","
|
|
(ssg-in-fmt-real (cadr p)) ","
|
|
(ssg-in-fmt-real (if (caddr p) (caddr p) 0.0)))
|
|
)
|
|
|
|
;; Prompt aufbauen: "<text> <default>: " bzw. "<text>: " ohne Vorgabe
|
|
(defun ssg-in-prompt (text default-str)
|
|
(strcat text
|
|
(if default-str (strcat " <" default-str ">") "")
|
|
": ")
|
|
)
|
|
|
|
;; Erstes Wort eines Schluesselwort-Strings: "Ja Nein" -> "Ja"
|
|
(defun ssg-in-first-word (schluessel / pos)
|
|
(if (setq pos (vl-string-search " " schluessel))
|
|
(substr schluessel 1 pos)
|
|
schluessel
|
|
)
|
|
)
|
|
|
|
;; Zweites Wort: "Ja Nein" -> "Nein"
|
|
(defun ssg-in-second-word (schluessel / pos)
|
|
(if (setq pos (vl-string-search " " schluessel))
|
|
(substr schluessel (+ pos 2))
|
|
""
|
|
)
|
|
)
|
|
|
|
;; ------------------------------------------------------------
|
|
;; HOOK
|
|
;; ------------------------------------------------------------
|
|
(defun ssg-in-notify (art text wert / res)
|
|
(if *ssg-in-hook*
|
|
(progn
|
|
(setq res (vl-catch-all-apply *ssg-in-hook* (list art text wert)))
|
|
(if (vl-catch-all-error-p res) (setq *ssg-in-hook* nil))
|
|
)
|
|
)
|
|
wert
|
|
)
|
|
|
|
;; ------------------------------------------------------------
|
|
;; ABFRAGEN
|
|
;; text = Prompt ohne Doppelpunkt, z.B. "\nHoehe"
|
|
;; ------------------------------------------------------------
|
|
|
|
(defun ssg-in-real (text default / w)
|
|
(setq w (getreal (ssg-in-prompt text (if default (ssg-in-fmt-real default)))))
|
|
(ssg-in-notify "REAL" text (ssg-in-default w default))
|
|
)
|
|
|
|
(defun ssg-in-int (text default / w)
|
|
(setq w (getint (ssg-in-prompt text (if default (itoa default)))))
|
|
(ssg-in-notify "INT" text (ssg-in-default w default))
|
|
)
|
|
|
|
;; String (mit Leerzeichen). Enter ohne Eingabe -> Vorgabe.
|
|
(defun ssg-in-string (text default / w)
|
|
(setq w (getstring T (ssg-in-prompt text default)))
|
|
(if (= w "") (setq w nil))
|
|
(ssg-in-notify "STRING" text (ssg-in-default w default))
|
|
)
|
|
|
|
;; Punkt. base = Gummiband-Basispunkt oder nil, default = Punkt oder nil.
|
|
(defun ssg-in-point (text default base / w)
|
|
(setq w (if base
|
|
(getpoint base (ssg-in-prompt text (if default (ssg-in-fmt-pt default))))
|
|
(getpoint (ssg-in-prompt text (if default (ssg-in-fmt-pt default))))
|
|
))
|
|
(ssg-in-notify "POINT" text (ssg-in-default w default))
|
|
)
|
|
|
|
;; Abstand. base = Basispunkt oder nil.
|
|
(defun ssg-in-dist (text default base / w)
|
|
(setq w (if base
|
|
(getdist base (ssg-in-prompt text (if default (ssg-in-fmt-real default))))
|
|
(getdist (ssg-in-prompt text (if default (ssg-in-fmt-real default))))
|
|
))
|
|
(ssg-in-notify "DIST" text (ssg-in-default w default))
|
|
)
|
|
|
|
;; Schluesselwort ohne Hook (intern, auch von ssg-in-yesno genutzt).
|
|
(defun ssg-in-keyword-raw (text schluessel default / w)
|
|
(initget 0 schluessel)
|
|
(setq w (getkword
|
|
(ssg-in-prompt
|
|
(strcat text " [" (vl-string-translate " " "/" schluessel) "]")
|
|
default)))
|
|
(ssg-in-default w default)
|
|
)
|
|
|
|
;; Schluesselwort. schluessel im initget-Format, z.B. "Alle Auswahl".
|
|
;; Rueckgabe: gewaehltes Schluesselwort (volle Schreibweise) oder default.
|
|
(defun ssg-in-keyword (text schluessel default)
|
|
(ssg-in-notify "KEYWORD" text (ssg-in-keyword-raw text schluessel default))
|
|
)
|
|
|
|
;; Ja/Nein-Abfrage, Rueckgabe T bei Ja, nil bei Nein (anders als ssg-ques,
|
|
;; das T fuer die NICHT-vorgegebene Antwort liefert).
|
|
;; default = T -> Enter bedeutet Ja, nil -> Enter bedeutet Nein.
|
|
;; Die Schluesselwoerter kommen aus ssg-text "in-yesno-keys" (z.B. "Ja Nein").
|
|
(defun ssg-in-yesno (text default / schluessel ja nein w)
|
|
(setq schluessel (ssg-text "in-yesno-keys")
|
|
ja (ssg-in-first-word schluessel)
|
|
nein (ssg-in-second-word schluessel))
|
|
(setq w (ssg-in-keyword-raw text schluessel (if default ja nein)))
|
|
(ssg-in-notify "YESNO" text (= w ja))
|
|
)
|
|
|
|
(princ)
|