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>