diff --git a/Lisp/count_sep_scan.lsp b/Lisp/count_sep_scan.lsp index b61cd7e..74e889c 100644 --- a/Lisp/count_sep_scan.lsp +++ b/Lisp/count_sep_scan.lsp @@ -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*)))) diff --git a/lang/de_DE.json b/lang/de_DE.json index 16966e4..c52639c 100644 --- a/lang/de_DE.json +++ b/lang/de_DE.json @@ -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", diff --git a/lang/en_GB.json b/lang/en_GB.json index acf0a13..582a93b 100644 --- a/lang/en_GB.json +++ b/lang/en_GB.json @@ -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",