Meldung der unkorrekten Zuordnungen von Separatoren

This commit is contained in:
2026-08-25 11:31:51 +02:00
parent c1802630c4
commit f5d0e57132
3 changed files with 61 additions and 24 deletions
+57 -24
View File
@@ -18,9 +18,17 @@
;;; ein Separator_SP/S-LP-Symbol.
;;;
;;; Zuordnung eines Sensors zu einem Carrier (Z wird ignoriert):
;;; 0. Traegt der Sensor bereits ein ZUORDNUNG-Attribut, wird das
;;; respektiert (nicht ueberschrieben) - er zaehlt mit, wenn die
;;; dort stehende ID zu einem bekannten Carrier passt.
;;; 0. Die Zuordnung wird bei jedem Lauf rein GEOMETRISCH neu
;;; bestimmt (Schritte 1-4). Ein bereits gesetztes ZUORDNUNG-
;;; Attribut wird NICHT mehr blind vertraut: stimmt es mit dem
;;; geometrischen Ergebnis ueberein, bleibt es unveraendert;
;;; weicht es ab (eingefrorene Fehl-Zuordnung, nachtraeglich
;;; verschobener Sensor oder ID eines nicht mehr existierenden
;;; Carriers), wird es ueberschrieben und die Korrektur in
;;; *cs-korrekturen* vermerkt (Konsolen-Report, siehe
;;; sens-korrektur-*). Frueher blieb eine einmal geschriebene
;;; falsche ZUORDNUNG dauerhaft "kleben" und wurde weiter
;;; mitgezaehlt - das ist behoben.
;;; 1. Scanner: der Einfuegepunkt (X/Y) muss in der Bounding-Box
;;; des Carriers liegen. Die 3D-Geometrie des Scanners kann
;;; weit vom Einfuegepunkt entfernt sein, daher zaehlt hier der
@@ -329,27 +337,21 @@
)
)
;;; --- Carrier-Record mit gegebener ID aus carriers heraussuchen ---
(defun cs-find-carrier-by-id (carriers id / found rec)
(setq found nil)
(foreach rec carriers
(if (and (not found) (= (nth 9 rec) id)) (setq found rec))
)
found
)
;;; ------------------------------------------------------------
;;; Ordnet einen Sensor-Punkt (Scanner oder Separator) einem Carrier
;;; zu (Reihenfolge siehe Datei-Kopfkommentar Schritte 0/1-3/4).
;;; Ordnet einen Sensor-Punkt (Scanner oder Separator) rein
;;; GEOMETRISCH einem Carrier zu (Reihenfolge siehe Datei-Kopf-
;;; kommentar Schritte 1-3 = BBox, Schritt 4 = naechster Carrier).
;;; Ein bereits am Sensor stehendes ZUORDNUNG-Attribut geht hier
;;; bewusst NICHT mehr ein - der Vergleich Alt/Neu und das
;;; Ueberschreiben abweichender Werte passiert in cs-zuordnung-lauf
;;; (Schritt 0 im Kopfkommentar). Dadurch heilt eine einmal falsch
;;; gesetzte oder verwaiste ZUORDNUNG bei jedem Lauf selbst aus.
;;; Rueckgabe: (modus rec best-d second-rec second-d)
;;; modus = 'manual | 'bbox | 'distance | 'none (keine Carrier vorhanden)
;;; modus = 'bbox | 'distance | 'none (keine Carrier vorhanden)
;;; best-d/second-rec/second-d sind nur bei modus='distance gesetzt.
;;; ------------------------------------------------------------
(defun cs-resolve-sensor (sent spt carriers grid / existing rec nearest)
(setq existing (cs-get-att-str sent *zuordnung-tag*))
(defun cs-resolve-sensor (spt carriers grid / rec nearest)
(cond
((and existing (/= existing ""))
(list 'manual (cs-find-carrier-by-id carriers existing) nil nil nil))
((setq rec (cs-assign spt grid))
(list 'bbox rec nil nil nil))
((null carriers)
@@ -587,12 +589,16 @@
;;; *cs-scanner-warnung-by-handle* - Assoc-Liste (handle . warnungstext)
;;; fuer strittige Scanner-Zuordnungen,
;;; von csv:block-to-json ausgelesen.
;;; *cs-korrekturen* - Liste (typ-wort sensor-id alt-id
;;; neu-id) je Sensor, dessen gespeicherte
;;; ZUORDNUNG nicht zur Geometrie passte
;;; und ueberschrieben wurde (Report).
;;; ============================================================
(defun cs-zuordnung-lauf (label verbose /
mss ss i ent ed nm bb cx cy lbl carrier-id
carriers grid scanlist seplist sk pt
scanCounts sepCounts n-scan-unassigned n-sep-unassigned
n-strittig n-zuordnung-fehlt
n-strittig n-zuordnung-fehlt alt
s sent spt res mode rec best-d second-rec second-d
scanner-id contested handle
en nm2 ns nsep newS newP okS okP eintrag)
@@ -600,6 +606,7 @@
n-zuordnung-fehlt 0 n-scan-unassigned 0 n-sep-unassigned 0 n-strittig 0)
(setq *cs-scanner-ergaenzt* nil)
(setq *cs-scanner-warnung-by-handle* nil)
(setq *cs-korrekturen* nil)
(setq *senstol* (cs-senstol))
;; Alte Markierungskreise entfernen (Idempotenz - Sensoren, die in
@@ -656,16 +663,24 @@
;; --- Scanner zuordnen (inkl. Distanz-Fallback + Strittig-Erkennung) ---
(foreach s scanlist
(setq sent (car s) spt (cadr s))
(setq res (cs-resolve-sensor sent spt carriers grid))
(setq res (cs-resolve-sensor spt carriers grid))
(setq mode (nth 0 res) rec (nth 1 res)
best-d (nth 2 res) second-rec (nth 3 res) second-d (nth 4 res))
(cond
((eq mode 'none)
(setq n-scan-unassigned (1+ n-scan-unassigned))
(cs-mark-unassigned sent))
((null rec) nil) ;; manuell zugeordnet, ID unbekannt -> unangetastet
((null rec) nil) ;; Sicherheitsnetz - tritt bei bbox/distance nicht auf
(t
(setq scanCounts (cs-bump scanCounts (car rec)))
;; Abweichende gespeicherte ZUORDNUNG als Korrektur vermerken,
;; bevor sie unten ueberschrieben wird (Selbstheilung eingefrorener
;; oder verwaister Zuordnungen).
(setq alt (cs-get-att-str sent *zuordnung-tag*))
(if (and alt (/= alt "") (/= alt (nth 9 rec)))
(setq *cs-korrekturen*
(cons (list "Scanner" (cs-get-att-str sent "ID") alt (nth 9 rec))
*cs-korrekturen*)))
(if (member mode '(bbox distance))
(if (not (cs-set-att sent *zuordnung-tag* (nth 9 rec)))
(setq n-zuordnung-fehlt (1+ n-zuordnung-fehlt))))
@@ -704,15 +719,20 @@
;; ANZAHL_SEPARATOR-Summe auch bei Sonderfaellen stimmt). ---
(foreach s seplist
(setq sent (car s) spt (cadr s))
(setq res (cs-resolve-sensor sent spt carriers grid))
(setq res (cs-resolve-sensor spt carriers grid))
(setq mode (nth 0 res) rec (nth 1 res))
(cond
((eq mode 'none)
(setq n-sep-unassigned (1+ n-sep-unassigned))
(cs-mark-unassigned sent))
((null rec) nil)
((null rec) nil) ;; Sicherheitsnetz - tritt bei bbox/distance nicht auf
(t
(setq sepCounts (cs-bump sepCounts (car rec)))
(setq alt (cs-get-att-str sent *zuordnung-tag*))
(if (and alt (/= alt "") (/= alt (nth 9 rec)))
(setq *cs-korrekturen*
(cons (list "Separator" (cs-get-att-str sent "ID") alt (nth 9 rec))
*cs-korrekturen*)))
(if (member mode '(bbox distance))
(if (not (cs-set-att sent *zuordnung-tag* (nth 9 rec)))
(setq n-zuordnung-fehlt (1+ n-zuordnung-fehlt))))
@@ -765,6 +785,19 @@
(if (> n-strittig 0)
(princ (ssg-textf "sens-strittig-summary" (list label (itoa n-strittig)))))
;; --- Korrigierte (nicht zur Geometrie passende) ZUORDNUNG melden ---
(if *cs-korrekturen*
(progn
(setq *cs-korrekturen* (reverse *cs-korrekturen*))
(princ (ssg-textf "sens-korrektur-header"
(list label (itoa (length *cs-korrekturen*)))))
(foreach eintrag *cs-korrekturen*
(princ (ssg-textf "sens-korrektur-zeile"
(list (nth 0 eintrag) (nth 1 eintrag)
(nth 2 eintrag) (nth 3 eintrag)))))
)
)
(if (> (+ n-scan-unassigned n-sep-unassigned) 0)
(princ (ssg-textf "sens-unassigned-marked"
(list label (itoa (+ n-scan-unassigned n-sep-unassigned)) *mark-layer*))))
+2
View File
@@ -523,6 +523,8 @@
"sens-ergaenzt-zeile": "\n Scanner %1 -> %2 (%3mm)",
"sens-strittig-suffix": " STRITTIG: auch nah an %1 (%2mm)",
"sens-strittig-summary": "\n[%1] WARNUNG: %2 der obigen Zuordnungen sind strittig (Abstand zu zwei Kandidaten fast gleich) - siehe Spalte 'Warnungen' im CSV-Export.",
"sens-korrektur-header": "\n[%1] %2 gespeicherte ZUORDNUNG(en) passten nicht zur Geometrie und wurden korrigiert:",
"sens-korrektur-zeile": "\n %1 %2: ZUORDNUNG %3 -> %4 (Geometrie-Korrektur)",
"sens-unassigned-marked": "\n[%1] %2 Sensor(en) ohne jeglichen Kreisel/Strecke markiert (Layer '%3').",
"sens-zuordnung-fehlt": "\n[%1] WARNUNG: %2 zugeordnete(r) Sensor(en) ohne Attribut 'ZUORDNUNG' - Wert nicht schreibbar.",
"id-new-assigned": "\n[ID] Neue ID zugewiesen: %1",
+2
View File
@@ -523,6 +523,8 @@
"sens-ergaenzt-zeile": "\n Scanner %1 -> %2 (%3mm)",
"sens-strittig-suffix": " CONTESTED: also close to %1 (%2mm)",
"sens-strittig-summary": "\n[%1] WARNING: %2 of the above assignments are contested (distance to two candidates nearly equal) - see column 'Warnungen' in the CSV export.",
"sens-korrektur-header": "\n[%1] %2 stored ZUORDNUNG(s) did not match the geometry and were corrected:",
"sens-korrektur-zeile": "\n %1 %2: ZUORDNUNG %3 -> %4 (geometry correction)",
"sens-unassigned-marked": "\n[%1] %2 sensor(s) without any Kreisel/track marked (layer '%3').",
"sens-zuordnung-fehlt": "\n[%1] WARNING: %2 assigned sensor(s) without a 'ZUORDNUNG' attribute - value not writable.",
"id-new-assigned": "\n[ID] New ID assigned: %1",