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:
co-authored by
Claude Opus 4.8
parent
d4260acb45
commit
52d92f0da6
+20
-1
@@ -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)))
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user