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:
2026-09-28 10:14:02 +02:00
parent 5a13595289
commit 96ca43eff5
10 changed files with 290 additions and 84 deletions
+58 -2
View File
@@ -69,8 +69,8 @@
;; ZZ_ASES_MARKER: die Marker der AS-/ES-Kettenenden (siehe
;; csv:asmark-aktualisieren, export.lsp). Sie brauchen eine ID -
;; sie vertreten das Kettenende im Export ("sepliste"-Feld "id"
;; und eigene JSON-Zeile) und behalten sie ueber Laeufe hinweg,
;; weil der Marker in der Zeichnung stehen bleibt.
;; und eigene JSON-Zeile). Der Marker selbst ist temporaer, seine
;; ID bleibt als reservierte ID am Wrapper (ssg-id-res-*).
(wcmatch bname "ZZ_ASES_MARKER*")
;; ZZ_UNIT_MARKER: die Foerdereinheit-/Gefaelleeinheit-Marker
;; (siehe csv:ketten-verarbeiten, export.lsp) - temporaere
@@ -93,9 +93,64 @@
)
;; ============================================================
;; Reservierte IDs (XDATA "SSG_ID_RES")
;; ============================================================
;; IDs von Objekten, die NICHT dauerhaft in der Zeichnung stehen, aber ueber
;; Laeufe hinweg dieselbe ID behalten sollen - z.B. die AS-/ES-Kettenenden
;; eines VF_n/GF_n-Wrappers: ihr Export-Stellvertreter (ZZ_ASES_MARKER) wird
;; nach jedem Export geloescht, die ID bleibt als XDATA am Wrapper stehen
;; (csv:asmark-*, export.lsp). Format: (("AS|1" . "0032") ("ES|4" . "0033")),
;; Schluessel frei waehlbar, aber ohne "=".
;;
;; ssg-id-max-in-ss rechnet reservierte IDs mit ein: sonst saehe die
;; Neuvergabe die ID eines gerade nicht existierenden Stellvertreters als frei
;; an und vergaebe sie an einen anderen Block.
(defun ssg-id-res-app () "SSG_ID_RES")
;; Rein (file-/zeichnungsfrei): Paare <-> 1000er-Strings "AS|1=0032".
(defun ssg-id-res->strings (paare)
(mapcar (function (lambda (p) (strcat (car p) "=" (cdr p)))) paare)
)
(defun ssg-id-res-parse (strings / s pos out)
(foreach s strings
(if (setq pos (vl-string-search "=" s))
(setq out (cons (cons (substr s 1 pos) (substr s (+ pos 2))) out))))
(reverse out)
)
;; Hoechste numerische ID der Paare (0, wenn keine).
(defun ssg-id-res-max (paare / m n)
(setq m 0)
(foreach p paare
(if (> (setq n (atoi (cdr p))) m) (setq m n)))
m
)
;; Liest die reservierten IDs eines Entities. Rueckgabe: Paare oder nil.
(defun ssg-id-res-lesen (ent / app-data)
(setq app-data (cdr (assoc -3 (entget ent (list (ssg-id-res-app))))))
(if app-data
(ssg-id-res-parse (mapcar 'cdr (cdr (car app-data))))
)
)
;; Schreibt die reservierten IDs eines Entities (ersetzt den bisherigen Stand
;; komplett). paare = nil entfernt die XDATA.
(defun ssg-id-res-schreiben (ent paare)
(regapp (ssg-id-res-app))
(entmod (append (entget ent)
(list (list -3 (cons (ssg-id-res-app)
(mapcar (function (lambda (s) (cons 1000 s)))
(ssg-id-res->strings paare)))))))
ent
)
;; --- Hoechste bereits vergebene ID in einem Auswahlsatz ermitteln ---
;; ss = Auswahlsatz (i.d.R. aus ssg-id-collect-blocks) oder nil.
;; Rueckgabe: Integer (hoechste ID) oder 0 wenn keine gefunden.
;; Beruecksichtigt auch die reservierten IDs (ssg-id-res-lesen) der Bloecke.
;;
;; Bewusst als eigene Funktion: ssg-id-check-all MUSS diesen Wert ueber den
;; GESAMTEN Auswahlsatz kennen, BEVOR es die erste neue ID vergibt (siehe
@@ -118,6 +173,7 @@
)
)
)
(setq max-id (max max-id (ssg-id-res-max (ssg-id-res-lesen ename))))
(setq i (1+ i))
)
)