SSG_RUN_ALL_TESTS_EXPORT setzte *export-test-override* nicht, dadurch
landeten CSV/Sivas-Exporte trotz Automatik-Modus in DXFM_RESULTS statt in
tests/output wie die DXF/DWG-Dateien selbst - jetzt analog zu
TEST_EXPORT_ALL behoben.
EXPORTSIVAS schrieb bisher immer zusaetzlich eine "_mit_bezeichnung.csv"
(Klartext-Kopie). Neuer Schalter "Sivas Export mit Bezeichner" im Dialog
CSV_EXPORT_KONFIG (Standard aus) macht das optional.
Die Attribut->Sivas-Merkmal-Zuordnung der build_*_details-Funktionen in
export_sivas.py (Gefaellestrecke/Kreisel/Eckrad/Geruest/VarioFoerderer,
soweit nicht von der Segmentanzahl abhaengig) liegt jetzt deklarativ in
cfg/sivas.cfg statt hartcodiert im Python - neuer Loader
lib/sivas_mapping.py. Ablauflogik (Gruppierung, Automation-Summenzeile,
Segment-Zaehlung) bleibt Code. Gegen den alten Code mit synthetischen
Testblöcken verifiziert: identische Ausgabe.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Neue Schluesselwoerter (Reihenfolge beliebig, neben all/flow):
mflow - <name>_material_flow.svg erzeugen (--tosvg) und oeffnen
track - <name>_track.svg erzeugen (--track --tosvg) und oeffnen
Beide brauchen Graphviz; fehlt die SVG, gibt es nur eine Warnung.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ZUORDNUNG: ssg-id-check-all laeuft jetzt ZUERST, danach sind die
Wrapper-IDs endgueltig - Separator-Kopien, AS/ES- und Einheiten-Marker
bekommen ZUORDNUNG direkt beim Erzeugen. Entfallen:
csv:sep-proxies-zuordnung-setzen, csv:asmark-ids-setzen,
csv:unitmark-ids-setzen. zuordnung_fix/*cs-sep-fix-by-handle* bleibt
(count_sep_scan rechnet eigenstaendige Sensoren bewusst neu).
- sepliste-IDs: Zuordnung ueber die KS-Kettenfolge je Typ
(csv:sepliste-kette-paare) statt ueber die teils gespiegelten
sepliste-Koordinaten (csv:sepliste-paare, csv:sepliste-ids-setzen
entfallen). Die Kette wird je Lauf einmal berechnet (csv:kette-von);
die ID liest csv:block-to-json erst beim Schreiben. Behebt vertauschte
TrackIds/Nachbarn in HundM05 VF_1 (0031/0029).
- Element-Klassifizierung: eine Tabelle csv:element-familien (cfg-Muster)
fuer Suche und Klassifizierung; csv:proxy-typ entfaellt.
- Einheiten-Marker: K1/K2 nur noch in *csv-baustein-by-handle*
(csv:geometrie-merken), K1/K2-Attribute und
csv:unitmark-k-kos-strings entfallen.
Geprueft: HundM05-Export alt/neu headless verglichen - einzige Abweichung
ist die korrigierte Reihenfolge in VF_1. LISP-Unit-Tests 303/303.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Der Typ (Merkmal "Typ") jeder Separator-Zeile kommt jetzt an EINER Stelle
aus der Einheiten-Schneidung csv:kette-einheiten (neu: csv:kette-sep-typen,
eingetragen in csv:ketten-verarbeiten) - dieselbe Quelle wie die
Einheiten-Boundingbox. VF = Separator direkt vor der Umlenkstation bzw.
zwischen Umlenk- und Motorstation, sonst GF.
Die bauzeitige XDATA SSG_SEP_TYP (ssg-sep-typ-xdata-schreiben/-lesen,
15 Einfuegestellen) entfaellt. Sie war teils falsch: der Separator vor dem
ES hinter einer Motorstation bekam "VF", und ein sep_nach-Separator einer
GF, den die folgende VF-Einheit als Einlauf nutzt, blieb "GF"
(HundM05: Sep1/5/7/9/11 und Sep2).
Unit-Tests csv:kette-sep-typen in tests/test_unit.lsp.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
AS/ES-Marker werden wie alle Hilfskopien geloescht (ausser csv_leave_proxies). IDs von AS/ES, Separator-Kopien und Einheiten bleiben ueber reservierte IDs (XDATA SSG_ID_RES) am VF_n/GF_n-Wrapper stabil: AS|n/ES|n, K|i, U|n.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- csv_leave_proxies ist der einzige Schalter, der Export-Hilfskopien
(Separator-/Element-Kopien, Einheiten-Proxies) stehen laesst; Standard
jetzt 0 = aufraeumen. Die zwei gleichwirkenden Dialog-Haken
(*csv-export-pruef-zuordnung*/*csv-export-elemente-behalten*) entfallen,
CSV_EXPORT_KONFIG schaltet mit einem Haken denselben Debug-Schalter.
- Unit-Test fuer csv:hilfskopien-behalten-p/-setzen
- Test-Menue: (load ...) (c:TEST_...) statt Befehlsname direkt nach dem
load - BricsCAD registriert den per load definierten Befehl erst nach
Rueckkehr zur Kommandozeile ("Befehl nicht erkannt" bei TEST_EXPORT_ALL)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
K1/K2 und Boundingbox je Export-Zeile folgen jetzt dem echten
Kettenbaustein statt seinem Stellvertreter:
- Separator (all_elements): KS + bbox des 300-mm-Trennstegs statt des
Sensor-Symbols; separator_track/group_vf_gf behalten das Symbol
- AS/ES (all_elements, group_vf_gf): KS + bbox des AS-/ES-Elements statt
des 200x200-Markers ohne K
- gemeinsamer Kern csv:ks-welt-punkte; VF/GF-Wrapper-K1/K2 = K1 des AS
bzw. K2 des ES
Gruppierter Export neu (sepliste-/XDATA-Algorithmus entfernt):
- Bausteine je Wrapper als Vektorkette K2 -> K1 ordnen (Start am AS)
- Foerdereinheit = Separator vor der Umlenkstation bis Motorstation,
alles dazwischen Gefaelleeinheit (csv:kette-einheiten, Unit-Tests)
- je Einheit ein temporaerer Proxy mit 3D-Boundingbox, K1/K2, Laenge und
Anzahl Boegen; wird nach dem Export geloescht (ausser csv_leave_proxies)
- IDs neuer Export-Objekte entlang der Kette AS -> ES aufsteigend
Weiteres:
- ssg-make-layer ohne _LAYER-Befehl fuer bestehende Layer (Konsole)
- einheitliche, zweisprachige Meldungen fuer behaltene Hilfskopien
- bin/show_exportcsv.bat: Export-CSV als Boundingbox-SVG (sps_skel)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
CSV-Export traegt jetzt selbst den schliessenden <- Marker (wie bei den
anderen Konfiguration-Eintraegen) - die alte Schliessen-Zeile erschien
sonst als eigener sichtbarer Menuepunkt zwischen Konfiguration und Tests.
Neuer Menuepunkt Konfiguration > CSV-Export (CSV_EXPORT_KONFIG) mit DCL-
Dialog: drei sich ausschliessende Export-Modi (group_vf_gf/all_elements/
separator_track, letzterer neu - nur AS/ES/Separator) ueber die zentrale
Variable *csv-export-modus*, sowie zwei unabhaengige Haken fuer sichtbare
Element-Proxy-Kopien (Zuordnung pruefen / Kopien behalten).
Die Einzelteil-Proxy-Zeilen (Boegen, Streckenelemente, Umlenk-/Motorstation)
aus der letzten Session sind fuer den Normalfall zu granular. Standardmaessig
(*csv-export-alle-elemente* = nil) fasst csv:unitmark-aktualisieren sie jetzt
zu je einer "Foerdereinheit"/"Gefaelleeinheit"-Zeile pro zusammenhaengendem
VF-/GF-Abschnitt einer Kette zusammen, mit einem persistenten Rechteck-Marker
(ZZ_UNIT_MARKER, analog ZZ_ASES_MARKER) auf der Bounding-Box-Vereinigung
aller enthaltenen Elemente. Der bisherige Rohdaten-Export bleibt ueber
(csv:export-alle-elemente-an) weiterhin verfuegbar.
Einheiten-Grenzen kommen rein export-seitig aus der sepliste (SEP/AS/ES in
echter Bau-Reihenfolge) plus dem bereits vorhandenen SSG_SEP_TYP je
Separator - eine bauzeitige Markierung in vf_linienzug.lsp/vf_standard.lsp/
vf_etage.lsp waere deutlich invasiver gewesen (3 unabhaengige Baupfade ohne
gemeinsamen Einstiegspunkt). csv:sepliste-partition (Lauflaengen-Kodierung
ueber die typisierte sepliste) und csv:element-unit-zuordnung (Zuordnung der
gesammelten Elemente per Kettenrichtungs-Projektion statt der nachweislich
unzuverlaessigen csv:nested-welt-records-Listenreihenfolge) sind reine,
dateifrei getestete Funktionen.
Korrigiert nebenbei eine falsche Annahme: L_VF_m/L_GF_m zaehlen pro Segment,
nicht pro Einheit - die tatsaechliche Einheiten-Anzahl kommt nur aus der
sepliste-Typfolge.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Bisher tauchten nur der Wrapper selbst, verpackte Separatoren und AS/ES-
Kettenenden als eigene CSV-Zeilen auf - die uebrigen Kettenbausteine
(Boegen, gerade Foerderer-/Gefaellestrecken-Segmente, Umlenk-/Motorstation)
blieben nur in der Wrapper-Blockdefinition verpackt. csv:element-proxies-
erzeugen (analog zu csv:sep-proxies-erzeugen) fuegt fuer jeden Fund eine
temporaere Kopie ein, K1/K2 kommen aus dem EIGENEN KS_EIN/KS_AUS jedes
Elements (nicht dem Gesamt-AS/ES der Kette) und bleiben leer, wo keines
existiert (z.B. das nie tatsaechlich eingefuegte Vario_Kurve_*).
Zusaetzlicher Fix: csv:get-k-kos-strings ignorierte bisher die Skalierung
des Top-Level-Inserts - fuer Staustrecke_SP_1000_mm (das per Laenge nicht-
uniform skaliert wird) waere K2 damit falsch gewesen, unabhaengig von der
tatsaechlich gebauten Segmentlaenge.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Validiert (Nutzer-Befund): die sepliste-XDATA-Koordinaten sind der rohe
Gruppencode-10-Punkt des jeweiligen Bau-Primitivs und teils gespiegelt/um
mehrere 100mm verschoben (z.B. Separator 0037: x=-5070.1 statt 5070.1,
ausserhalb der VF_1-Boundingbox). Die eigene Export-Zeile jedes Bauteils
(x/y aus der echten Proxy-Kopie) ist dagegen verlaesslich und liegt korrekt
in der Boundingbox. sepliste dient nur noch der ID-Zuordnung/Reihenfolge,
nicht mehr als Koordinatenquelle.
Der Python-Faellback in map_sepliste_kette_items (nur fuer SEP-Eintraege
ohne aufloesbares "id"-Feld, Altbestand) matchte bisher per naechstem
sepliste-Punkt - jetzt erster unverbrauchter Kandidat je Zuordnung, da keine
Koordinate mehr vorliegt. lib/dump_vf_kette_inhalt.py zeigt Position/Typ
jetzt ueber die ID-Verknuepfung zur eigenen Bauteil-Zeile statt ueber die
entfernten sepliste-Felder.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Der letzte Fix markierte bauzeitig korrekt den aeusseren
Staustrecke_Separator_SP_300_mm-Trennsteg, csv:sep-proxies-erzeugen las den
Marker aber vom inneren Separator_SP-Symbol - das ist als Teil EINER
gemeinsamen DWG-Blockdefinition zwischen ALLEN Separatoren der Zeichnung
geteilt und kann keinen individuellen Marker tragen. Export sucht jetzt
zusaetzlich den aeusseren Trennsteg (eigene Instanz je Separator) und
ordnet ihn dem Symbol ueber die naechstliegende Weltposition zu.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
csv:wrapper-strecke-typ (voriger Ansatz) las den Streckentyp aus dem
VF_n/GF_n-Wrapper-Blocknamen - falsch, weil ein einzelner Wrapper intern
mehrfach zwischen Foerderer- und Gefaellestrecke-Abschnitten wechseln kann
(HundM05 VF_1: 4 Separatoren, 2x VF, 2x GF). Jede Separator-Einfuegestelle in
vf_linienzug.lsp/Gefaellestrecke.lsp/vf_standard.lsp/vf_etage.lsp markiert
das frisch eingefuegte Staustrecke_Separator_SP_300_mm-Insert jetzt direkt
per XDATA (ssg-sep-typ-xdata-schreiben/-lesen, ssg_ks_insert.lsp). Der Export
liest den Marker am verpackten Original (nested-ent), nicht mehr am Wrapper.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Zeigen die Spec- bzw. Blockdefinitions-Struktur einer VF-/GF-Linienzugkette
in der Konsole, um sichtbar zu machen, dass ein einzelner VF_n-Wrapper
intern zwischen VF- und GF-Abschnitten wechseln kann (Grundlage fuer den
noch ausstehenden Separator-TYP-Fix).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Stufe 2 (Python-Seite von "sepliste: Bauteil-IDs eintragen"): AS/ES-Kettenenden
sind jetzt ganz normale Items, direkt aus dem dauerhaften ZZ_ASES_MARKER
klassifiziert (TeileId/Position/Boundingbox vom Marker-Block selbst) - keine
Kollisionsberechnung mehr, die sie erfindet.
- lib/export_neighbors.py: compute_strecke_kreisel_schleus entfernt (suchte
bisher per Kollisionstest den anschliessenden Kreisel und erzeugte dabei bei
JEDEM Export eine neue TeileId fuer denselben physischen Punkt). AUSSCHLEUS_/
EINSCHLEUS_TEILEART sind jetzt Teil von KREISEL_UMLAUF_TEILEARTEN - ein AS/ES
bringt seine eigene Bounding-Box vom Marker mit und wird dadurch, wie jeder
freie Separator, ueber die normale BBox-Ueberschneidung einem Kreisel
zugeordnet; die gesonderte "naechster Kreisel per sep_kette"-Suche in
compute_kreisel_umlauf (dessen sep_kette-Parameter damit entfaellt) ist
ueberfluessig geworden. compute_sep_kette gibt je Eintrag zusaetzlich das
Feld "id" weiter (Bauteil-TeileId, siehe vorheriger Commit).
- lib/export_csv.py: process_blocks klassifiziert ZZ_ASES_MARKER direkt (TYP-
Attribut waehlt Ausschleus-/Einschleuselement); build_strecke_schleus_items
entfaellt komplett. map_separator_kette_items -> map_sepliste_kette_items:
ordnet jetzt AS/SEP/ES exakt per ID-Gleichheit zu (sepliste-Feld "id" gegen
die TeileId der klassifizierten Items) statt per Koordinaten-Naehe - SEP
faellt bei fehlendem "id"-Feld weiterhin auf den alten Naehe-Abgleich zurueck
(Altbestand), AS/ES ohne "id" bleiben unaufgeloest.
- Neu: pruefe_ases_in_beiden_containern prueft am Ende von process_blocks, ob
jede AS-/ES-Zeile sowohl in den TrackIds ihrer eigenen Strecke als auch in
denen mindestens eines Kreisels auftaucht, und traegt bei Abweichung eine
Warnung ein (Spalte "Warnungen") - Konsistenzpruefung fuer genau die beiden
"Container", zu denen ein AS/ES gehoert.
- Aufgeraeumt (tote Routinen): _strecke_ends, _closest_pt_on_segment,
_distinct_kreisel_ids (nur von den entfernten Funktionen genutzt), sowie der
temporaere Diagnose-Filter DEBUG_HIGHLIGHT_TEILEIDS/dbg_highlight (an die
jetzt behobene Koordinaten-Matching-Ambiguitaet gebunden, in seinem eigenen
Kommentar bereits als Wegwerf-Code markiert). LISP-seitiger Dead-Code-Scan
(export.lsp, ssg_ks_insert.lsp - die diese Woche bearbeiteten Module):
keine Funde.
Verifiziert an den echten HundM05-Daten (results/export_raw.json, 45 Bloecke):
TeileId-Bereich luecken- und duplikatfrei 1-45 (vorher 1-55 mit Luecke 24-33 +
Zusatz-IDs 46-55), alle 10 AS/ES-IDs korrekt in ihrer Strecke UND im Kreisel
06 TrackIds, keine Warnungen der neuen Pruefung. Zwei Testdateien auf die neue
Architektur umgestellt (test_export_kreisel_umlauf.py: AS/ES als Item statt
Kollisions-Erzeugung, neue Klasse TestAsEsImKreiselUmlauf fuer die BBox-
Teilnahme; test_export_separatorliste.py: id-basierte Zuordnung, Klasse
TestMarkerIdWiederverwendung durch TestMapSeplisteKetteItemsFallback ersetzt
- die alte testete inzwischen entfernte Mint-Logik). Volle Suite: 224 bestanden
(4 vorbestehende, unabhaengige Fixture-Failures unveraendert).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
build_strecke_schleus_items erfand bisher fuer jede AS/ES-Zeile eine neue
TeileId, obwohl der zugehoerige ZZ_ASES_MARKER (Lisp/export.lsp) laengst
eine stabile ID traegt (im sepliste-Eintrag als Feld "id" gespiegelt).
Ergebnis in der Praxis (HundM05): TeileIds 24-33 blieben ungenutzt
(Marker bekommt bis heute keine eigene CSV-Zeile), waehrend fuer dieselben
Punkte bei jedem Export zusaetzlich frische, hoehere IDs (46-55) minted
wurden - eine sichtbare Luecke plus unnoetige ID-Inflation.
Jetzt: liest die Marker-ID aus sepliste[0]["id"] (AS) bzw. sepliste[-1]["id"]
(ES) und uebernimmt sie unveraendert; fehlt sie (Altbestand ohne Marker),
bleibt das bisherige Mint-Verhalten unangetastet. Der laufende Zaehler wird
auf die wiederverwendete ID hochgezogen, damit ein spaeterer Mint in
derselben Kette sie nicht erneut vergibt. ZZ_ASES_MARKER selbst bekommt in
process_blocks jetzt einen expliziten, dokumentierten Skip (statt stillem
Durchfallen durch alle Muster).
Verifiziert an den echten HundM05-Daten: export.csv lief vorher 1-55 mit
Luecke 24-33, jetzt luecken- und duplikatfrei 1-45 (results/export.csv neu
erzeugt). 2 neue Tests in tests/test_export_separatorliste.py (Wiederver-
wendung + unveraenderter Fallback), volle Suite unveraendert bis auf 4
vorbestehende, unabhaengige Fixture-Failures (stale tests/output/*.dxf).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Stufe 1 (LISP-Export-Pfad): export_raw.json enthaelt jetzt fuer jeden
sepliste-Eintrag (AS/SEP/ES) einer VF_n/GF_n-Kette die ID des realen
Bauteils, das ihn vertritt.
- csv:sep-proxies-erzeugen (Separatoren) und die neuen AS/ES-Marker teilen
sich csv:nested-welt-records/csv:block-einfuegen-welt zur Platzierung.
- csv:sepliste-paare ordnet sepliste-Eintraege ihrem Bauteil exklusiv nach
Abstand zu (kuerzester zuerst, dann verbraucht) statt "jeder Eintrag
nimmt sich das naechste" - ein einzelner fehlerhafter Koordinatenwert
(bekannter Bug: gespiegeltes x bei lfdnr=2) verschiebt dadurch keine
andere Zuordnung mehr.
- Neu: ZZ_ASES_MARKER - ein kleines Rechteck an jedem AS/ES-Kettenende,
das nach dem Export STEHEN BLEIBT (anders als die temporaeren
Separator-Kopien). Macht das sonst unsichtbare, in der Wrapper-
Blockdefinition verpackte Kettenende in BricsCAD sichtbar/anklickbar
und traegt seine ID unsichtbar am Attribut ID - dadurch behaelt ein
AS/ES seine TeileId ueber Exportlaeufe hinweg. Wird bei jedem Export
neu aufgebaut (Lage folgt der Kette), Wiederfund ueber ZUORDNUNG+TYP+
LFDNR, verwaiste Marker werden entfernt.
In BricsCAD verifiziert (5 HundM05-Ketten, zwei Exportlaeufe: gleiche
Marker-IDs, korrekte sepliste-"id"-Felder). Dabei einen realen Bug
gefunden und behoben: die Blockdefinition des Markers uebernahm ueber
einen ungefilterten entnext-Walk versehentlich auch die Attribute des
zuletzt eingefuegten Blocks (VF_5 verlor dadurch alle Attribute inkl.
ID) - jetzt auf LWPOLYLINE/ATTDEF gefiltert.
9 neue zeichnungsfreie Unit-Tests (csv:sepliste-paare/*, csv:asmark-
finden/*, csv:proxy-typ/*), 4 neue de/en-Textschluessel (Paritaet
geprueft). bin\run_tests.bat --lisp: 257/257 bestanden.
Noch nicht enthalten (Stufe 2, Python): map_separator_kette_items nutzt
das neue "id"-Feld noch nicht, build_strecke_schleus_items synthetisiert
AS/ES-Zeilen weiterhin selbst statt die exportierten zu lesen.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Der SSG_LIB-Start gab ~50 Zeilen aus (mehrzeilige >>> ...geladen <<<-Banner mit
Befehlslisten/Block-Pfaden, ===-Trenner, Core-Modul-Auflistung, VarioFoerderer-
Typenliste). Fuer einen einfachen _QNEW-Start zu viel Rauschen.
Gekuerzt (nur die dicksten Bloecke, je Modul bleibt EINE knappe Zeile;
Fehler/Warnungen ALLE unveraendert erhalten):
- Kern-Module (ssg_core/dbg/dialog/layer/id): reine "X geladen"-Zeilen entfernt.
- Feature-Module: KreiselInsert/Gefaellestrecke/VarioFoerderer je auf eine
">>> X geladen"-Zeile; Befehlslisten, Modus-/Typen-Aufzaehlungen, Block-Pfade
und ===-Trenner raus. VF-Submodule (vf_konstanten/standard/etage/linienzug/
spec) Lade-Banner ganz entfernt (der Sammel-Header deckt sie ab).
- SSG_LIB_Commands "Dummy-Befehle registriert" entfernt.
- menu/SSG_LIB.mnl: ===-Trenner + Core-Auflistung raus; die doppelte
"Einfuege-Modus 3D"-Zeile entfernt (S:STARTUP gibt sie ohnehin einmal aus).
Behalten (informativ / diagnostisch): [CFG] Config geladen: N Sektionen,
[LANG] N Texte geladen, alle FEHLER/WARNUNG-Zeilen, die Abschlusszeilen
"Alle Module geladen. Menue aktiv." + "Einfuege-Modus: 3D".
Reine Ausgabe-Reduktion, keine Logik geaendert. 243/243 LISP-Unit-Tests gruen;
alle Module laden fehlerfrei (Klammerbalance gegen HEAD unveraendert).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
test_export_separatorliste.py (2 Failures, KeyError 'Separatorlist'): der Test
pruefte noch das alte Merkmal "Separatorlist" (nur SEP-Eintraege). write_
separatorliste_merkmale fuellt seit dem Umbau das Top-Level-Feld item["trackids"]
(CSV-Spalte "TrackIds") mit AS + Separatoren + ES in Baureihenfolge. Tests auf
die neue API/Semantik angepasst (empirisch verifiziert: "0054, 0052, 0053, 0055").
vf_linienzug.lsp - echter Fund des statischen Waechters: vfl-body-abschluss
setzte am "Kettenende nicht baubar"-Zweig ein (alert ...) im BAU-Pfad (blockiert
Batch/Headless). Auf vfl-meldung umgestellt (zeigt alert nur bei erlaubter GUI,
sonst princ) - genau die Regel, die der Waechter erzwingt.
test_vf_headless_statisch.py (2 Failures): Soll-Inventar an den aktuellen Code
angeglichen - 18 legitime neue Wizard-/Frage-Dialoge (vflw-gruppe-*-impl,
vflw-m2-*-impl, vfl-frage-ist-*) + vfl-ks-aus-hz-an-punkt (ssget, Zeichnung
durchsuchen) ergaenzt, vflw-gruppe-horizontal-impl entfernt (weg im Code),
vfl-edit-ent auf alert:2 (linienzug2-Abweisung, harter Schnitt).
Suite: 11 -> 7 failed. Verbleibend NICHT hier: test_hundm05.py (auf Wunsch
ausgenommen) + test_vf_geometrie.py (6x, gebautes HundM05-DXF weicht von der
Referenz ab - braucht fachliches Urteil ueber die neue Geometrie, nicht blind
die Referenz ueberschreiben). 243/243 LISP-Unit-Tests gruen.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
vf-block-erstellen (vf_core, Standard/Etage) und vfl-block-erstellen
(vf_linienzug) hatten denselben ~25-Zeilen-Rumpf wortgleich: ATTDEFs am
Startpunkt, Entity-Sweep seit lastEnt, Sepliste sichern, ssg-block-wrap-welt,
Layer setzen, Sepliste-XDATA, Attribute setzen, ID + Dim-XDATA. Jetzt in
vf-wrapper-bauen (vf_core) zusammengefasst; beide Aufrufer bauen nur noch ihre
FERTIGE Attributliste (Standard/Etage: feste Werte; Linienzug: *vfl-acc-*-
Komma-Listen) und uebergeben sie - der Rumpf kennt die Attribut-Semantik nicht.
ATTDEF-FORMAT VEREINHEITLICHT auf den kanonischen Stil: 3 von 4 Wrapper-Bauern
(vfl-block-erstellen, Gefaellestrecke, Vario_Kette_Merge) nutzten bereits
identisch (10/11=startpunkt, 40, 70/72/74, alle am selben Punkt). vf-block-
erstellen war der Ausreisser mit Layer-0/Model-Space-Zwang, y-Dekrementierung
je Zeile und fehlenden Ausrichtungscodes - historischer Drift OHNE Effekt bei
unsichtbaren ATTDEFs (Flag 70=1, reine Attribut-Container). Standard/Etage
bauen die ATTDEFs damit jetzt im kanonischen Format.
Toter Code entfernt: *vfk-attdef-zeilenabstand* (einzige Nutzung war die
entfernte y-Dekrementierung). *vfk-attdef-texthoehe* jetzt in vf-wrapper-bauen
zentral genutzt.
Die ATTRIBUTWERTE sind unveraendert (Diff-Review: Bezeichnung wertgleich,
Etage-Bogen-Extra nur von zweitem ssg-attrib-set-on in die Hauptliste gezogen).
Verhaltensneutral fuer den Linienzug (hatte schon das kanonische Format);
fuer Standard/Etage aendert sich nur das (unsichtbare) ATTDEF-Format.
243/243 LISP-Unit-Tests gruen; Python-Suite unveraendert (11 Baseline);
Klammerbalance geprueft. Der Attribut-/Geometrie-Gleichstand von Standard/Etage
ist interaktiv in BricsCAD bzw. per SSG_RUN_ALL_TESTS gegenzupruefen.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Konvention ergaenzt: Subagenten sollen nur mit Rueckfrage an den Nutzer
gestartet werden; wenn moeglich die leichteren Modelle waehlen (i.d.R.
Code-Recherche).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Punkt 2 (vf_linienzug.lsp) - die drei Modi teilen jetzt zwei Praeambel-Helfer
statt sie wortgleich auszuschreiben:
- vfl-dbg-session-start (schalter datei funcname sessiontext): oeffnet die
dbg-Datei + schreibt Kopf/Session-Start. M1 haengt seinen Replay-Queue-
Diagnose-Zusatz danach an (M1-spezifisch).
- vfl-dbg-hook-installieren: der fruehe duenne dbg-*error*-Hook (M2/M3),
Lambda mit dynamic-scope-Vertrag wie vfl-abbruch-handler-installieren.
- vfl-frage-punkt-hoehe (punkt-key hoehe-key abbruch-key wizard-prompt):
Startpunkt/Hoehe-Praeambel (Wizard-Hook + vfl-in-point + vfl-in-real + Z
uebernehmen, (exit) bei Abbruch). Genutzt fuer Startpunkt in M1/M2/M3 UND
den Endpunkt in M2 (vier Aufrufstellen, vorher 4x strukturgleich).
Punkt 3 (vf_standard.lsp / vf_etage.lsp) - der wortgleiche Attribut-Lese- +
prefill-basis-Aufbau der beiden Edit-Bodies (c:VARIOFOERDERER_EDIT,
vfe-edit-ent) in vfs-edit-basis-lesen (ent xd default-deltah default-seite)
zusammengefasst; die zwei abweichenden Defaults sind Parameter. Gibt eine
Alist (prefill-basis + Rohwerte attribs/startpunkt/hz/z-start) zurueck.
vf-konvertiere-ent BEWUSST nicht mit zusammengelegt - andere Zielstruktur
(Einzelwerte + L_VF/L_GF fuer den Batch-Konverter), Zusammenfuehrung wuerde
beide verkomplizieren.
243/243 LISP-Unit-Tests gruen; Python-Suite unveraendert zur Baseline
(11 failed); Klammerbalance geprueft. Verhaltensneutrale Extraktionen.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Modus 2 Hauptbug: Motorstation+GF2 nutzen jetzt den bereits im Winkel-Solve
geplanten Wert (br-gf2-exp) statt einer zweiten, unabhaengigen Loesung aus
gemessener Resthoehe - behebt Laengs-/Querversatz am Kettenende.
- Modus 2 Bug C: Separator/ES-Hoehenreservierung (vfl3-dback/z-junction) auch
bei "Motorstation ohne ES" korrigiert (vorher nur bei komplett offenem Ende).
- Modus 2 Bug D: fehlender Separator/ES-Laengsanteil im Solve-Budget bei
Einzel-Kletterer ohne flache Zone (hor-pairs=0) ergaenzt, ausschliesslich
ueber das Laengenbudget (nicht ueber feste-hz, sonst Hoehen-Doppelzaehlung).
- Modus 1 Option 6 ("Neue Linie BIS Kettenende"): Vorzeichenfehler bei der
Separator/ES-Hoehenreservierung fuer Richtung "Auf" behoben (musste addiert
statt subtrahiert werden).
- Vario_Kette_Merge: VF_WINKEL-Attribut liest den Winkel jetzt direkt aus dem
Blockname statt aus einer ungenauen Chord-Messung ueber den ganzen
S-Bogen-Tripel (verwaesserte den Winkel Richtung 3-Grad-Basis).
- ES-/AS-Element-Winkel-Dialog: neuer schlanker Dialog ohne die dort nie
gueltige "60 Grad"-Option (statt nur ausgegraut).
- Modus 2 Lauf-Abschluss-Dialog: roher i18n-Key statt uebersetztem Text
behoben; Option 3 ("Motorstation + ES-Element") ausgeblendet, wenn die
Upfront-ES-Frage bereits mit "Nein" beantwortet wurde.
Alle Fixes einzeln in BricsCAD nachgestellt und bestaetigt (dX/dZ exakt).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Diagnose + Umbauplan fuer die U-Form-Abweichung im Modus-2-Solver als
doc/TODO-modus2-achsenweise-bilanz.md festgehalten (mit dem Entwickler zu
besprechen, noch nicht umgesetzt). Enthaelt: Symptom (test_modus2.dxf),
praezise Ursache (skalare climber-span statt achsenweiser Bilanz, Fundstellen
9990/10070), Beleg als dokumentiertes v1-Limit, 5-Etappen-Umbauplan mit
Regressionsnetz zuerst, Risiko-Einschaetzung und Zwischenloesung (abweisen).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Eine Rechteck-Auswahl kann winzige Geister-/Artefakt-Objekte miterfassen (real:
ein 14-mm-Mini-Bogen). gf-sortiere-objekte haengte sie per Nearest-Neighbor
stumm in die Kette -> ein Geister-Bauteil (im test_modus2.dxf: eine 90-Grad-
Kurve vor dem Motor, die der Nutzer nie gezeichnet hat; im SEGS-Journal als
7. Segment mit Sehne 14 mm sichtbar).
vfl-in-segmente wirft jetzt VOR der Sortierung alle Objekte unter
*vfk-pfad-min-segmentlaenge* (100 mm) aus und meldet Anzahl + Grund
(vfl-m3-mini-objekte-verworfen, de/en). Schwelle konservativ deutlich unter
jedem realen Bauteil (kleinstes: Separator 300 mm; kleinster echter Eck-Bogen
R500/30 Grad hat Sehne ~259 mm) und knapp ueber dem Restlaengen-Clamp (100 mm),
damit kein legitimes Segment faelschlich verworfen wird.
Neue Helfer: vfl-obj-2d-laenge (LINE-Laenge / ARC-Sehne), vfl-filter-mini-objekte
(-> (behalten . verworfen-anzahl)). Neue Konstante *vfk-pfad-min-segmentlaenge*.
Der Bug lag NICHT im SEGS-Umbau (gf-sortiere-objekte/-analysiere-kette
unveraendert) - der SEGS-Journal machte ihn nur erstmals sichtbar.
243/243 LISP-Unit-Tests gruen; JSON valide + de/en-Paritaet geprueft. Der
Geometrie-Effekt (Geister-Segment weg) ist interaktiv zu bestaetigen.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Zwei kleine Aenderungen am VF-Linienzug-Cluster:
1. Modus-2-Abweisung "nur EIN VF-Lauf moeglich" jetzt als sichtbare Meldung.
Bislang ging die Grenze (vf-count != 1 -> M3b spaeter) nur ueber drei
princ-Zeilen in die Konsole und war dort leicht zu uebersehen. Neuer
zweisprachiger Text vfl-m3-vf-lauf-alert, gezeigt ueber vfl-meldung (alert-
Box bei erlaubter GUI, headless nur princ - blockiert also keinen Batch).
Die [M3a]-Konsolendiagnose bleibt zusaetzlich fuer den Log.
2. insert-hz-incl-scaled-block (vf_etage.lsp) entfernt - toter Code, kein
Aufrufer im gesamten Repo (byte-genaue Pruefung + grep). Der zugehoerige,
nur dort genutzte i18n-Key vfe-hz-incl-status ebenfalls aus de/en entfernt.
Die anderen drei insert-hz-*-Funktionen BLEIBEN bewusst: sie unterscheiden
sich in Platzierungssemantik (KS_EIN vs. Block-Ursprung) bzw. der
Skalierung+KS+Vertikale-Kombination von den ssg_ks_insert-Primitiven, ein
Ersatz wuerde die Geometrie verschieben (Kommentar an der Fundstelle).
243/243 LISP-Unit-Tests gruen; JSON valide + de/en-Paritaet geprueft.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Modus 2 journalisiert die Segment-Essenz (SEGS) statt der Objekt-Handles
(OBJS) - identische Umstellung wie Modus 3. Damit ist der Block selbst-
enthalten und der Doppelklick-Neubau unabhaengig von den Original-LINE/ARC.
Behebt den beobachteten Modus-2-Desync (Winkel wurde beim Neuaufbau interaktiv
nachgefragt + Abweichung, weil der OBJS-Replay an den - ggf. verschobenen -
Pfad-Objekten hing).
- vfl-in-selection + obj-liste im Modus-2-Ablauf durch vfl-in-segmente ersetzt
(Live: ssget -> gf-sortiere-objekte -> gf-analysiere-kette -> Eck-Vorpruefung
-> SEGS; Replay: fertige Essenz aus dem Journal). Objektauswahl steht jetzt
NACH der Startpunkt-Praeambel (vfl-in-segmente braucht den startpunkt).
- segmente9 (9-Feld-Essenz) eingefuehrt, 5-Feld-segmente daraus abgeleitet;
seg-ent -> nil (kein Live-Highlight mehr, wie Modus 3).
- Marker bleibt "linienzug2".
HARTER SCHNITT fuer Altbestand: alte OBJS-"linienzug2"-Bloecke (ohne SEGS)
werden beim Doppelklick klar abgewiesen (neuer Text vfl-edit-m2-obsolet, de/en)
statt mit falschen Daten in den Bau zu laufen; der Batch-Konverter ueberspringt
sie. Erkennung: vfl-journal-hat-segs-p.
Tests: 3 file-freie Unit-Tests fuer vfl-journal-hat-segs-p (SEGS erkannt,
OBJS/leer nicht). 243/243 LISP-Unit-Tests gruen in BricsCAD; test-neutral gegen
HEAD (11=11 Python-Failures); lang-Paritaet geprueft. End-to-end (Neubau +
deckungsgleicher Doppelklick) wie bei Modus 3 interaktiv zu bestaetigen.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Der scharfe *error*-Abbruch-Handler (wickelt Teil-Geometrie bei ESC/(exit) zu
einem VF_n-Block mit vollem Journal) stand in Modus 1/2/3 dreimal WORTGLEICH,
nur der Marker-String unterschied sich. Jetzt eine gemeinsame Funktion
vfl-abbruch-handler-installieren (marker), die *error* als Lambda-Liste mit
eingebautem Marker-Literal setzt (list-Konstruktion, kein globaler Zwischen-
zustand). Der fragile Wickel-Rumpf existiert damit nur noch EINMAL - kuenftige
Fixes an einer Stelle statt drei.
Die je-Modus unterschiedliche old-error-Quelle bleibt an der Aufrufstelle
(M1: *error*, M2/M3: dbg-old-error via fruehem dbg-Hook) - nur der wortgleiche
Handler-Rumpf wird geteilt. Alle vom Handler zur Abbruchzeit dynamisch
aufgeloesten Locals (old-error/lastEnt/vfl-nummer/... /dbg-an) sind unveraendert
im Modus-Frame gebunden (VERTRAG in der Funktion dokumentiert).
Tests (tests/test_unit.lsp, tu-tests-vfl-abbruch): der Konstruktor erzeugt eine
gueltige (lambda (msg) ...)-Struktur und baut GENAU den uebergebenen Marker als
letztes Argument des vfl-modus-abbruch-sichern-Aufrufs ein (linienzug2 vs
linienzug3 geprueft). 240/240 LISP-Unit-Tests gruen in BricsCAD; keine neuen
Python-Failures (11 = HEAD-Baseline). Modus-1-ESC-Abbruch interaktiv bestaetigt
(Teilkette bleibt als editierbarer VF_n-Block stehen).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Der Ergebnis-Banner des VF-Linienzug-Vorwaerts-Nachbaus (vfl-vwnb-*-Keys =
Modus 3) trug den falschen Text "Modus 2". Korrigiert in de_DE.json und
en_GB.json (Paritaet geprueft).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Modus 3 (Vorwaerts-Nachbau) hat jetzt dieselbe XDATA-Editierbarkeit +
Doppelklick-Neubau wie Modus 1/2. Statt der Pfad-Objekt-Handles wird die
abgeleitete Segment-ESSENZ journalisiert (neuer Journal-Typ SEGS): der VF_n-
Block ist damit selbst-enthalten, der Neubau unabhaengig davon, ob die
urspruenglichen LINE/ARC noch existieren - robuster als der OBJS-Weg von Modus 2.
Journal-Kern (vf_linienzug.lsp):
- Neuer Typ SEGS: Segmentliste (typ hz laenge bwinkel bseite spx spy epx epy)
serialisiert als ";"-getrennte Segmente, Felder per "|". Eingebunden in
vfl-entry->string / vfl-string->entry / vfl-entry->json.
- vfl-in-segmente: Live (ssget -> gf-sortiere-objekte -> gf-analysiere-kette ->
Eck-Vorpruefung -> 9-Feld-Essenz) ODER Replay (Essenz direkt aus SEGS-Journal).
Ersetzt vfl-in-selection im Modus-3-Ablauf.
- vfl-kette->segmente9 fuehrt Bau-Segmente + Start/Endpunkte zusammen; Soll-Ende
kommt jetzt aus der Essenz statt aus den Original-Entities.
Modus-3-Umbau:
- Abbruch-Wickler + vfl-journal-xdata-schreiben mit Marker "linienzug3" (analog
Modus 2). Kopf-Kommentar/Fehler-Handler-Variablen an Modus 2 angeglichen.
- Kein Live-Segment-Highlight mehr (Essenz-Bau reicht keine Entity mehr durch) -
bewusst, im Code dokumentiert.
Doppelklick/Batch:
- vfl-edit-ent2 zu vfl-edit-ent-voll parametrisiert; vfl-edit-ent3 ruft
vf-linienzug-modus3. vfl-edit-ent / vfl-konvertiere-ent / vfl-journal-xdata-
lesen dispatchen "linienzug3".
Tests:
- 8 file-freie SEGS-Roundtrip-Unit-Tests (tests/test_unit.lsp, tu-tests-vfl-segs);
234/234 LISP-Unit-Tests gruen in BricsCAD.
- vfl-in-segmente im statischen Headless-Waechter registriert.
- Verifiziert an einer echten linienzug3-Kette (results/test.dwg): SEGS-Journal
korrekt geschrieben, Doppelklick-Neubau geometrisch deckungsgleich zum Original.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Zwei Konventionen ergaenzt (Abschnitt Konventionen):
- Neue LISP-Routinen nach Moeglichkeit in die Testsuite aufnehmen; Vorrang fuer
file-/zeichnungsfreie Routinen als tu-*-Block in tests/test_unit.lsp (TEST_UNIT).
- Headless-Testlauf ueber bin/run_tests.bat --lisp; BricsCAD steht dafuer ueber
die Umgebungsvariable BRICSCAD (aus bin/setenv.bat) zur Verfuegung.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Der Extrusions-Fix (d4260ac) hat csv:local-to-world von parent-rot-rad
(Winkel) auf parent-R (3x3-Rotationsmatrix) umgestellt. tu-tests-export
uebergab noch den Winkel und lief in "bad argument type <0.0>
expected <CONS>". Jetzt per (mat3-rz winkel) die Matrix bilden;
erwartete Ergebnisse unveraendert (Identitaet bzw. 90-Grad-Z-Drehung).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
cs-zuordnung-lauf (~230 Zeilen, ~26 Locals) in sieben benannte
Routinen zerlegt (cs-sammle-bloecke, cs-scanner-zuordnen,
cs-separatoren-zuordnen, cs-korrektur-vermerken, cs-scanner-distanz-
melden, cs-anzahl-schreiben, cs-bericht-ausgeben); die Engine ist
jetzt ein schlanker Orchestrator. Verhalten unveraendert.
Dadurch ist die rein geometrische Zuordnungslogik von den Entity-
Zugriffen getrennt und unittest-faehig: neuer Block tu-tests-sepscan
mit 30 Tests fuer cs-in-box/cs-bump/cs-carrier-by-id/cs-assign/
cs-nearest-two/cs-resolve-sensor (Carrier-Records als plain Listen,
keine Zeichnung noetig).
Testarchitektur (Laden) vereinheitlicht: lazy Feature-Module
(GeruestInsert, count_sep_scan) werden AUSSCHLIESSLICH in test_unit.scr
auf .scr-Top-Level geladen. Grund: in BricsCAD werden per load
definierte Funktionen erst nach Rueckkehr zum Top-Level sichtbar - ein
load in c:TEST_UNIT oder einem gecatchten Testblock bindet sie im
selben Durchlauf nicht. Die Testbloecke laden nichts mehr, sie pruefen
nur per atoms-family. Runner gehaertet (tu-run-block faengt harte
Fehler je Block ab -> FAIL statt Suite-Abbruch, Report immer da).
Nebenbei aufgeraeumt: tote tests.lsp-Referenz in ssg_load.lsp entfernt
(Datei laengst geloescht, blockierte headless den kompletten Testlauf).
Voller LISP-Unit-Lauf jetzt 226/226 gruen.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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>
csv:block-to-json las Gruppe-10/-50 eines exportierten Blocks direkt als
flache Welt-x/y + Z-Drehwinkel. Ein top-level Separator-Proxy, der ueber
ssg-collect-nested-inserts aus dem geneigten ("Auf") Abschnitt einer
VF-/GF-Kette neu zusammengesetzt wird (csv:sep-proxies-erzeugen), kann
dabei selbst eine echt gekippte Extrusion (Gruppe 210) tragen - Gruppe-10
ist dann OCS-lokal, nicht Welt. Dadurch landeten "x"/"y"/"z" und darueber
K1/K2 (csv:get-k-kos-strings) an einem falschen, am Vorzeichen gespiegelten
Weltpunkt (beobachtet: Separator :4/6/8/10/12 in HundM05, K1 exakt am
Vorzeichen von X/Y gespiegelt weit ausserhalb der eigenen Boundingbox -
deshalb kein K-Kreuz in sps_skel/HundM05_bbs.svg trotz gefuelltem K1 in
der CSV).
csv:block-to-json wandelt pt jetzt erst per Arbitrary Axis Algorithm
(mat3-ocs-matrix) in echte Weltkoordinaten um und reicht die volle
3x3-Orientierung (mat3-from-normal-rotation) statt eines Z-Drehwinkels an
csv:get-k-kos-strings/csv:local-to-world weiter. csv:local-to-world nimmt
entsprechend eine Matrix statt eines Winkels; csv:vfgf-k-kos-strings ruft
es weiterhin mit reiner Rz-Matrix (VF_n/GF_n-Wrapper stehen an ihrem
top-level INSERT dokumentiert immer flach). Fuer Extrusion=(0 0 1) (der
Normalfall) reduziert sich alles exakt auf das bisherige Verhalten.