GR_-Bloecke werden jetzt wie BTMT eigenstaendig gesammelt (LISP: neues
pattern_geruest in cfg/export.cfg, csv:collect-export-blocks,
ssg-id-collect-blocks + ID-ATTDEF in *geruest-attrib-defs*) und in beiden
Python-Exporten als eigene TeileArt-Zeile ausgegeben: ARTINR/BEZEICHNUNG/
TEILEART/LAENGE in festen Spalten, restliche Attribute (FARBE/LAYER) im
Merkmale-/details-JSON.
Dabei zwei Bugs behoben, die beim ersten echten GR_-Export sichtbar wurden:
- csv:json-escape nutzte vl-string-subst (ersetzt nur das erste Vorkommen)
statt des global ersetzenden ssg-str-replace-all - bei Attributwerten mit
mehreren Anfuehrungszeichen blieb ein Zeichen unescaped und brach die
JSON-Struktur beim Python-Parsen.
- Gradzeichen (°) in data/json/geruest.json durch "Grad" ersetzt, um das
Encoding-Risiko (cp1252 vs. UTF-8 beim LISP-Export) zu vermeiden.
data/json/component_defaults.json: Neue zentrale Konfigurationsdatei
mit Standardwerten fuer alle Komponenten (kreisel, eckrad, omniflo,
vario, gefaelle, infrastruktur). Bisher waren Konstanten (Masse,
Farben, Toleranzen, Defaults) hart im LISP-Code eingebettet.
Lisp/ssg_core.lsp: JSON-Parser und Config-Zugriff hinzugefuegt:
- ssg-read-file-lines: Datei zeilenweise einlesen
- ssg-cfg-trim, ssg-cfg-split-comma: String-Hilfsfunktionen
- ssg-cfg-parse-value, ssg-cfg-parse-array: JSON-Wert-Parser
(unterstuetzt String, Zahl, Boolean, Array, null)
- ssg-cfg-parse-section: JSON-Sektion zu Assoziationsliste parsen
- ssg-load-config: Laedt component_defaults.json in *ssg-config*
- ssg-cfg: Wert aus *ssg-config* lesen, nil wenn nicht vorhanden
- ssg-cfg-or: Wert aus Config lesen mit Fallback-Default
Lisp/ssg_load.lsp: (ssg-load-config) wird direkt nach dem Laden von
ssg_core.lsp aufgerufen, sodass die Config beim Laden aller weiteren
Module bereits verfuegbar ist.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>