export: Hilfskopien nach dem Export loeschen, IDs stabil ueber reservierte IDs

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>
This commit is contained in:
Michael Stangl
2026-09-28 10:14:02 +02:00
co-authored by Claude Opus 5.5
parent 5a13595289
commit 96ca43eff5
10 changed files with 290 additions and 84 deletions
+41 -17
View File
@@ -55,7 +55,7 @@ Bounding-Boxen braucht).
`(proxy-ename wrapper-ename typ (x y z))`.
1b. **`csv:asmark-aktualisieren`** — die AS-/ES-Enden derselben Kette
(`AS_Element*`/`ES_Element*`, Muster `pattern_schleuselement`) bekommen
KEINE temporaere Kopie, sondern einen DAUERHAFTEN Marker — siehe eigener
KEINE Kopie des Elements, sondern einen eigenen (ebenfalls temporaeren) Marker — siehe eigener
Abschnitt "Der AS/ES-Marker" unten. Beide Wege teilen sich die
Platzierungsrechnung (`csv:nested-welt-records` liefert die Weltlage jedes
verpackten Fundes, `csv:block-einfuegen-welt` setzt ein Objekt dorthin).
@@ -140,6 +140,26 @@ AS/ES-Marker, Einheiten-Proxies) werden vor `ssg-id-check-all` entlang der
Kette von AS nach ES aufsteigend vergeben (`csv:ketten-verarbeiten`) - die
CSV ist nach TeileId sortiert, die Zeilen stehen damit in Kettenfolge.
**Stabile IDs ueber Exportlaeufe.** Alle diese Objekte sind temporaer und
werden nach dem Export geloescht (ausser mit `csv_leave_proxies`). Ihre ID
bleibt trotzdem gleich: nach `ssg-id-check-all` schreibt
`csv:res-ids-schreiben` sie als **reservierte IDs** an den VF_n/GF_n-Wrapper
(XDATA `SSG_ID_RES`, Helfer `ssg-id-res-*` in `Lisp/ssg_id.lsp`), der naechste
Export gibt sie dem neuen Objekt an derselben Stelle zurueck. Schluessel:
| Schluessel | Objekt |
|---|---|
| `AS\|n` / `ES\|n` | AS-/ES-Marker, n = sepliste-`lfdnr` |
| `K\|i` | Separator-/Element-Kopie des i-ten Bausteins der geordneten Kette (0-basiert, `csv:kette-ordnen`) |
| `U\|n` | n-te Foerder-/Gefaelleeinheit des Wrappers (`group_vf_gf`) |
`ssg-id-max-in-ss` zaehlt die reservierten IDs mit, damit sie in der
Zwischenzeit an keinen anderen Block vergeben werden. Nur Objekte OHNE
reservierte ID (erster Export einer Kette, Modus neu gewaehlt) bekommen eine
neue Nummer - oberhalb aller vorhandenen, also nicht mehr zwingend in
Kettenfolge neben den uebrigen Zeilen der Kette. Ein Edit baut einen neuen
Wrapper ohne diese XDATA; dessen Kettenobjekte werden dann neu nummeriert.
Umgesetzt ueber `csv:baustein-merken`: beim Erzeugen des Stellvertreters
werden K-Punkte (`csv:ks-welt-punkte`) und bbox (kurzlebige Kopie des
Bausteins, `csv:baustein-bbox`) unter seinem Handle gemerkt
@@ -211,7 +231,7 @@ realen Bauteils, das ihn in der Zeichnung vertritt:
```
Das ist dieselbe ID, die die zugehoerige temporaere Kopie (SEP) bzw. der
dauerhafte `ZZ_ASES_MARKER` (AS/ES) in ihrer eigenen JSON-Zeile traegt — die
temporaere `ZZ_ASES_MARKER` (AS/ES) in ihrer eigenen JSON-Zeile traegt — die
Verbindung "Kettenglied <-> reales Teil" steht damit schon im Export und muss
in Python nicht mehr ueber Koordinaten-Naehe geraten werden. `map_sepliste_
kette_items` (siehe Abschnitt 5 unten) loest genau darueber jeden sepliste-
@@ -226,7 +246,9 @@ Die beiden Kettenenden stecken als `AS_Element_*`/`ES_Element_*` verpackt in
der Wrapper-Blockdefinition: in der Zeichnung sind sie weder anklickbar noch
einzeln erkennbar, und `(ssget "X" ...)` findet sie nicht. `csv:asmark-*`
(`Lisp/export.lsp`) setzt darum an jedes Ende ein kleines Rechteck, das nach
dem Export in der Zeichnung STEHEN BLEIBT:
nach dem Export wie alle Hilfskopien wieder GELOESCHT wird (nur der
Debug-Schalter `csv_leave_proxies` bzw. der Haken im Dialog
`CSV_EXPORT_KONFIG` laesst ihn zur Ansicht stehen):
- **Sichtbarmachung** — Kantenlaenge aus `cfg/export.cfg` `[Marker]`
`ases_groesse_mm` (Default 200 mm), mittig auf dem Einfuegepunkt des
@@ -238,20 +260,22 @@ dem Export in der Zeichnung STEHEN BLEIBT:
- **ID-Traeger** — die Attribute (alle unsichtbar) sind
`ID`, `ZUORDNUNG` (Wrapper-ID), `TYP` (`AS`/`ES`), `LFDNR` (sepliste-Eintrag),
`ELEMENT` (Blockname des echten Elements, haelt die Variante 30/90,
links/rechts, 2D/3D fest) und `ARTINR`. `ssg-id-check-all` fuellt die `ID`,
und weil der Marker liegen bleibt, **behaelt ein AS/ES seine TeileId ueber
Exportlaeufe hinweg** — im Unterschied zu den Separator-Kopien, die jeder
Lauf neu erzeugt und neu nummeriert.
links/rechts, 2D/3D fest) und `ARTINR`. `ssg-id-check-all` fuellt die `ID`.
Danach legt `csv:res-ids-schreiben` die ID als **reservierte ID** am
VF_n/GF_n-Wrapper ab (Eintrag `AS|1=0032`, siehe "Stabile IDs ueber
Exportlaeufe" oben). Der naechste Export gibt sie dem neu gesetzten Marker
zurueck, **ein AS/ES behaelt seine TeileId also ueber Exportlaeufe
hinweg**, obwohl der Marker dazwischen nicht existiert.
Der Marker ist abgeleitete Geometrie: jeder Export baut ihn neu auf (die Lage
folgt damit automatisch einer umgebauten Kette) und uebernimmt vom bisherigen
Marker nur dessen `ID`. Wiedergefunden wird er ueber (`ZUORDNUNG`, `TYP`,
`LFDNR`) — bewusst nicht ueber die Position, damit eine verschobene Kette ihre
TeileIds behaelt. Was am Ende keinem Kettenende mehr entspricht (Kette
geloescht, Eintrag entfallen), wird geloescht; Karteileichen entstehen nicht.
Ein frisch gebauter Wrapper hat beim Setzen der Marker noch keine ID — seine
Marker bekommen die `ZUORDNUNG` nach der ID-Vergabe nachgetragen und sind ab
dem naechsten Export wiederfindbar.
folgt damit automatisch einer umgebauten Kette) und uebernimmt die ID ueber
den Schluessel (`TYP`, `LFDNR`) aus der reservierten ID des Wrappers — bewusst
nicht ueber die Position, damit eine verschobene Kette ihre TeileIds behaelt.
Steht noch ein Marker in der Zeichnung (aeltere Zeichnung, in der die Marker
frueher dauerhaft blieben, oder ein Lauf mit `csv_leave_proxies`), wird seine
ID ueber (`ZUORDNUNG`, `TYP`, `LFDNR`) uebernommen, falls der Wrapper noch
keine reservierte ID fuehrt; der alte Marker wird dabei geloescht, ebenso
jeder, der keinem Kettenende mehr entspricht.
Im Export ist der Marker eine eigene Zeile (`pattern_ases_marker` in
`cfg/export.cfg`) und liefert die `id` des AS-/ES-Eintrags in der `sepliste`.
@@ -411,7 +435,7 @@ Zu beachten:
in Baureihenfolge, unabhaengig vom Kreisel-Umlauf.
- Die AS/ES-Enden (`0021`=AS, `0024`=ES) sind eigene Zeilen (Zeilentyp
"ILS Ausschleuselement"/"ILS Einschleuselement"), direkt aus dem
dauerhaften `ZZ_ASES_MARKER` klassifiziert — in diesem gekuerzten Beispiel
`ZZ_ASES_MARKER` klassifiziert — in diesem gekuerzten Beispiel
nicht einzeln aufgefuehrt, aber ihre TeileIds tauchen in `TrackIds` beider
Seiten auf.
- Die Separatoren 3 und 5 (`0012`/`0022`) unterscheiden sich nur durch ihre
@@ -499,7 +523,7 @@ Geometrie bereits klassifizierter Items abgeleitet:
AS/ES-Kettenenden werden NICHT mehr synthetisiert (fruehere Version:
`compute_strecke_kreisel_schleus`/`build_strecke_schleus_items` suchten den
anschliessenden Kreisel per Kollisionstest und erfanden dabei eine eigene,
bei jedem Export neue TeileId). Der dauerhafte `ZZ_ASES_MARKER`
bei jedem Export neue TeileId). Der `ZZ_ASES_MARKER`
(Lisp/export.lsp, siehe oben) ist ein echter Block mit echter Geometrie -
`"ILS Ausschleuselement"`/`"ILS Einschleuselement"` sind darum eine ganz
normale Zeile aus Schritt 1 (Klassifikation), TeileId/Position/Boundingbox