diff --git a/Lisp/ssg_ks_insert.lsp b/Lisp/ssg_ks_insert.lsp index 85a8a7c..983d390 100644 --- a/Lisp/ssg_ks_insert.lsp +++ b/Lisp/ssg_ks_insert.lsp @@ -413,13 +413,32 @@ (reverse liste) ) +;; Koordinate mit GENAU 2 Nachkommastellen formatieren - bewusst OHNE rtos. +;; rtos haengt an den Zeichnungs-Systemvariablen DIMZIN (Nullunterdrueckung), +;; LUPREC und LUNITS: bei dem hier verbreiteten DIMZIN=8 wuerde rtos die +;; abschliessenden Nullen wegwerfen (10.00 -> 10), und dieselben Koordinaten +;; serialisierten je nach Zeichnungsprofil unterschiedlich. Die Sepliste +;; landet als XDATA/Journal PERSISTENT am Block - die Serialisierung muss +;; darum reproduzierbar und profilunabhaengig sein. Rundung kaufmaennisch, +;; mit Uebertrag (9.999 -> 10.00), Vorzeichen bleibt erhalten. +(defun ssg-sepliste-fmt-koord (x / neg i f s) + (setq neg (< x 0.0) x (abs x)) + (setq i (fix x)) + (setq f (fix (+ 0.5 (* 100.0 (- x i))))) + (if (>= f 100) (progn (setq i (1+ i)) (setq f (- f 100)))) + (setq s (strcat (itoa i) "." + (if (< f 10) (strcat "0" (itoa f)) (itoa f)))) + (if neg (strcat "-" s) s) +) + ;; Serialisiert die Sepliste zu "TYP:LFDNR:X:Y,TYP:LFDNR:X:Y,...". (defun ssg-sepliste->string (liste / eintrag out first) (setq out "" first t) (foreach eintrag liste (setq eintrag (strcat (nth 0 eintrag) ":" (itoa (nth 1 eintrag)) ":" - (rtos (nth 2 eintrag) 2 2) ":" (rtos (nth 3 eintrag) 2 2))) + (ssg-sepliste-fmt-koord (nth 2 eintrag)) ":" + (ssg-sepliste-fmt-koord (nth 3 eintrag)))) (if first (progn (setq out eintrag) (setq first nil)) (setq out (strcat out "," eintrag))) ) diff --git a/tests/test_unit.lsp b/tests/test_unit.lsp index 6b76493..d998b62 100644 --- a/tests/test_unit.lsp +++ b/tests/test_unit.lsp @@ -401,6 +401,17 @@ (tu-eq "ssg-sepliste-split-feld/normal" '("SEP" "1" "10.00" "20.00") (ssg-sepliste-split-feld "SEP:1:10.00:20.00" ":")) + ;; ssg-sepliste-fmt-koord: GENAU 2 Nachkommastellen, DIMZIN-unabhaengig. + ;; Ersetzt rtos (das bei DIMZIN=8 abschliessende Nullen verschluckt und die + ;; XDATA-Serialisierung zeichnungsprofilabhaengig gemacht hat). + (tu-eq "sepliste-fmt/ganz" "10.00" (ssg-sepliste-fmt-koord 10.0)) + (tu-eq "sepliste-fmt/eine-stelle" "30.50" (ssg-sepliste-fmt-koord 30.5)) + (tu-eq "sepliste-fmt/rundung-ab" "5.01" (ssg-sepliste-fmt-koord 5.007)) + (tu-eq "sepliste-fmt/uebertrag" "10.00" (ssg-sepliste-fmt-koord 9.999)) + (tu-eq "sepliste-fmt/negativ" "-5.00" (ssg-sepliste-fmt-koord -5.0)) + (tu-eq "sepliste-fmt/negativ-rund" "-5.01" (ssg-sepliste-fmt-koord -5.007)) + (tu-eq "sepliste-fmt/null" "0.00" (ssg-sepliste-fmt-koord 0.0)) + ;; ssg-sepliste->string: Serialisierung eines Eintrags (tu-eq "ssg-sepliste->string/ein-eintrag" "SEP:1:10.00:20.00"