Sepliste-Serialisierung DIMZIN-unabhaengig machen

ssg-sepliste->string formatierte die Separator-Koordinaten mit
(rtos x 2 2). rtos respektiert die Zeichnungs-Systemvariable DIMZIN
(Nullunterdrueckung): bei dem verbreiteten DIMZIN=8 wird 10.00 zu 10
gekuerzt, das Praezisions-Argument hilft nicht. Dieselben Koordinaten
serialisierten damit je nach Zeichnungsprofil unterschiedlich - fatal
fuer die PERSISTENTE XDATA/Journal-Ablage am Block (verlustfrei im
Roundtrip, aber umgebungsabhaengig).

Neue Helferfunktion ssg-sepliste-fmt-koord (fix-basiert, kaufmaennische
Rundung mit Uebertrag und Vorzeichen) ersetzt rtos - reproduzierbar,
unabhaengig von DIMZIN/LUPREC/LUNITS. Plus 7 Kantenfall-Tests.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Michael Stangl
2026-09-18 14:31:35 +02:00
co-authored by Claude Opus 4.8
parent d4260acb45
commit 52d92f0da6
2 changed files with 31 additions and 1 deletions
+20 -1
View File
@@ -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)))
)