[ADD] Block- und Text-Werkzeuge aus Walz (ACADSST) uebernommen
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>
This commit is contained in:
@@ -0,0 +1,162 @@
|
||||
;; ============================================================
|
||||
;; 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)
|
||||
Reference in New Issue
Block a user