export_csv: sepliste-Koordinaten (x/y) entfernen, nur noch typ/lfdnr/id

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>
This commit is contained in:
Michael Stangl
2026-09-24 10:58:53 +02:00
co-authored by Claude Sonnet 5
parent 42309c77d2
commit 4f1a0e0b5b
4 changed files with 71 additions and 22 deletions
+19 -12
View File
@@ -21,7 +21,6 @@ von export_raw.json bis zur fertigen CSV-Zeile) siehe doc/csv-export.md.
"""
import json
import math
import sys
import os
@@ -567,19 +566,29 @@ def map_sepliste_kette_items(items, sep_kette, dbg=None):
Fallback (kein "id"-Feld - Altbestand-Export ohne Marker/Kopie-ID, oder
deren Zuweisung ist in Lisp fehlgeschlagen): NUR fuer SEP-Eintraege
weiterhin per naechstem INSERT-Punkt gegen die per Zuordnung
vorgefilterten Separator-Items. AS/ES ohne "id" bleiben unaufgeloest -
fuer sie existiert seit dem Wegfall der Kreisel<->Strecke-Kollisions-
erzeugung (frueher compute_strecke_kreisel_schleus/
build_strecke_schleus_items) ohnehin kein Item mehr, das sie vertreten
koennte.
weiterhin gegen die per Zuordnung vorgefilterten Separator-Items, je
Strecke der erste noch nicht verbrauchte Kandidat (Baureihenfolge in
items). AS/ES ohne "id" bleiben unaufgeloest - fuer sie existiert seit
dem Wegfall der Kreisel<->Strecke-Kollisionserzeugung (frueher
compute_strecke_kreisel_schleus/build_strecke_schleus_items) ohnehin
kein Item mehr, das sie vertreten koennte.
Der Fallback matchte frueher per naechstem sepliste-Koordinatenpunkt
(x/y) - die sepliste-XDATA traegt seit 2026-09-25 kein x/y mehr, weil
diese Koordinaten der rohe, teils gespiegelte/verschobene Gruppencode-10-
Punkt des jeweiligen Bau-Primitivs waren (siehe export.lsp-Kommentar bei
sepliste-teile) und keine verlaessliche Zuordnungsgrundlage. Der
ID-Abgleich oben deckt praktisch jeden aktuellen Export ab; dieser
Fallback ist reine Altbestands-Kompatibilitaet.
Rueckgabe: sep_kette_by_key (neues dict).
"""
sep_kette_by_key = {}
by_teileid = {it.get("teileid", ""): it for it in items if it.get("teileid", "")}
# Kandidatenpool nur noch fuer den Koordinaten-Fallback (SEP ohne "id").
# Kandidatenpool nur noch fuer den Fallback (SEP ohne "id"); verbrauchte
# Kandidaten werden entfernt, damit zwei Sepliste-Eintraege nicht auf
# dasselbe Item fallen.
sep_items_by_zuordnung = {}
for it in items:
if it.get("teileart", "") != "ILS 2.0 Separator":
@@ -620,13 +629,11 @@ def map_sepliste_kette_items(items, sep_kette, dbg=None):
dbg(f" {key}: kein Separator-Item mit Zuordnung "
f"{eintrag['strecke_id']!r} gefunden - uebersprungen")
continue
sx, sy = eintrag.get("x", 0.0), eintrag.get("y", 0.0)
best = min(kandidaten,
key=lambda it: math.hypot(it.get("_x", 0.0) - sx, it.get("_y", 0.0) - sy))
best = kandidaten.pop(0)
sep_kette_by_key[key] = best
per_fallback += 1
if dbg:
dbg(f" {key} (x={sx:.0f},y={sy:.0f}) -> Naehe-Fallback auf "
dbg(f" {key} -> Fallback (erster unverbrauchter Kandidat) auf "
f"Separator-Item TeileId {best.get('teileid', '')!r}")
if dbg: