;; ============================================================ ;; SSG_INPUT.LSP - Generische Eingabe-Wrapper (ssg-in-*) ;; ;; Allgemeingueltige Abfragen mit Vorgabewert, Anzeige "" 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: " : " bzw. ": " 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)