From 9341d4c5c29ae2cdf733944fde8b1c5c2849c390 Mon Sep 17 00:00:00 2001 From: Michael Stangl Date: Fri, 21 Aug 2026 15:54:47 +0200 Subject: [PATCH] Sensor-Zuordnung: billiger Schnelltest vor teurem Lauf cs-zuordnung-noetig-p prueft ohne jede Boundingbox (nur Attribute lesen + interne Ketten-Separatoren aus der Blockdefinition zaehlen), ob der teure cs-zuordnung-lauf (Boundingbox+Regen je Carrier und Sensor) ueberhaupt noetig ist. Voller Lauf nur bei leeren ZUORDNUNG-Eintraegen oder wenn die Summe ANZAHL_SCANNER/ANZAHL_SEPARATOR ueber alle Carrier nicht zur Anzahl der Scanner-/Separator-Symbole (+ interne Ketten-Separatoren) passt. Sonst wird uebersprungen (neue Meldung sens-skip). csv:run-export ruft die Zuordnung jetzt nur noch bei Bedarf auf. Der interaktive Befehl ZAEHLE_SEP_SCAN rechnet weiterhin immer komplett neu (deckt auch den Fall ab, dass ein Sensor ohne Summenaenderung von einem Carrier zu einem anderen verschoben wurde). Co-Authored-By: Claude Opus 4.8 --- Lisp/count_sep_scan.lsp | 62 +++++++++++++++++++++++++++++++++++++++++ Lisp/export.lsp | 10 ++++++- lang/de_DE.json | 1 + lang/en_GB.json | 1 + 4 files changed, 73 insertions(+), 1 deletion(-) diff --git a/Lisp/count_sep_scan.lsp b/Lisp/count_sep_scan.lsp index 5495751..160fa51 100644 --- a/Lisp/count_sep_scan.lsp +++ b/Lisp/count_sep_scan.lsp @@ -513,6 +513,68 @@ (cons 40 r))) ) +;;; ------------------------------------------------------------ +;;; Schnelltest: Ist ein vollstaendiger cs-zuordnung-lauf ueberhaupt +;;; noetig? Der eigentliche Lauf ist teuer (vla-getboundingbox + Regen +;;; je Carrier UND je Sensor). Diese Vorpruefung kommt ohne jede +;;; Bounding-Box aus - sie liest nur Attribute (entget) und zaehlt die +;;; internen Ketten-Separatoren aus der Blockdefinition (cs-count-nested, +;;; reine Tabellen-Traversierung, kein Regen). +;;; +;;; Rueckgabe T (Lauf noetig), wenn EINE der Bedingungen zutrifft: +;;; a) Ein Scanner-/Separator-Symbol hat ein leeres ZUORDNUNG-Attribut +;;; (noch nicht zugeordnet). +;;; b) Die Summe der ANZAHL_SCANNER ueber alle Carrier weicht von der +;;; Anzahl der Scanner-Symbole in der Zeichnung ab. +;;; c) Die Summe der ANZAHL_SEPARATOR ueber alle Carrier weicht von +;;; (Anzahl Separator-Symbole + interne Ketten-Separatoren) ab. +;;; Sonst nil - die vorhandenen Attribute sind konsistent, der teure +;;; Lauf wird uebersprungen. +;;; +;;; Grenze (bewusst in Kauf genommen): Wird ein Sensor von einem Carrier +;;; zu einem anderen verschoben, OHNE dass sich die GESAMTzahlen aendern +;;; (z.B. ein Scanner von Kreisel A nach Kreisel B), faellt das hier +;;; nicht auf - ZUORDNUNG bleibt ja gesetzt und die Summen stimmen +;;; weiter. In so einem Fall ZAEHLE_SEP_SCAN manuell aufrufen, um die +;;; Zuordnung komplett neu zu berechnen. +;;; ------------------------------------------------------------ +(defun cs-zuordnung-noetig-p ( / ss i ent ed nm sk zuord + sumScan sumSep sumIntern nScanSym nSepSym noetig) + (setq sumScan 0 sumSep 0 sumIntern 0 nScanSym 0 nSepSym 0 noetig nil) + (setq ss (ssget "_X" '((0 . "INSERT")))) + (if (null ss) + nil ;; keine Bloecke -> nichts zu tun + (progn + (setq i 0) + (while (< i (sslength ss)) + (setq ent (ssname ss i)) + (setq ed (entget ent)) + (setq nm (cdr (assoc 2 ed))) + (cond + ((cs-carrier-p nm) + (setq sumScan (+ sumScan (atoi (cs-get-att-str ent "ANZAHL_SCANNER")))) + (setq sumSep (+ sumSep (atoi (cs-get-att-str ent "ANZAHL_SEPARATOR")))) + (setq sumIntern (+ sumIntern (cs-count-nested nm *intern-separator-pattern*)))) + (t + (setq sk (cs-sensor-kind nm)) + (if sk + (progn + (setq zuord (cs-get-att-str ent *zuordnung-tag*)) + (if (or (null zuord) (= zuord "")) (setq noetig T)) + (if (eq sk 'scanner) + (setq nScanSym (1+ nScanSym)) + (setq nSepSym (1+ nSepSym))))) + ) + ) + (setq i (1+ i)) + ) + (or noetig + (/= sumScan nScanSym) + (/= sumSep (+ sumIntern nSepSym))) + ) + ) +) + ;;; ============================================================ ;;; ENGINE - wird sowohl von ZAEHLE_SEP_SCAN als auch automatisch ;;; vor jedem CSV-/Sivas-Export aufgerufen (siehe export.lsp, diff --git a/Lisp/export.lsp b/Lisp/export.lsp index 1ec560b..6ec8403 100644 --- a/Lisp/export.lsp +++ b/Lisp/export.lsp @@ -638,9 +638,17 @@ ;; Block im JSON an. verbose=nil haelt die Export-Konsole kompakt ;; (die ausfuehrliche Detailzeile je Carrier gibt es nur beim ;; interaktiven Befehl ZAEHLE_SEP_SCAN). + ;; + ;; Der Lauf ist teuer (Boundingbox+Regen je Carrier und Sensor), + ;; darum vorher der billige Schnelltest cs-zuordnung-noetig-p (nur + ;; Attribute lesen, keine Boundingboxen): nur bei leeren ZUORDNUNG- + ;; Eintraegen oder abweichenden Summen wird tatsaechlich neu gerechnet. (ssg-ensure "count_sep_scan") (if (atoms-family 1 '("cs-zuordnung-lauf")) - (cs-zuordnung-lauf label nil) + (if (cs-zuordnung-noetig-p) + (cs-zuordnung-lauf label nil) + (princ (ssg-textf "sens-skip" (list label))) + ) ) (princ (ssg-textf "exp-collect-blocks" (list label))) diff --git a/lang/de_DE.json b/lang/de_DE.json index d5bbebc..9746c61 100644 --- a/lang/de_DE.json +++ b/lang/de_DE.json @@ -512,6 +512,7 @@ "exp-csv-missing": "\n[%1] FEHLER: Python meldete Erfolg, aber die CSV fehlt: %2. Log: %3", "exp-omni-no-inserts": "\n[OMNI_UPDATE] Keine INSERT-Bloecke in der Zeichnung.", "exp-omni-updated": "\n[OMNI_UPDATE] %1 Elemente aktualisiert (HOEHE, DREHUNG).", + "sens-skip": "\n[%1] Separator-/Scanner-Zuordnung aktuell (ZUORDNUNG gesetzt, Summen stimmen) - Neuberechnung uebersprungen.", "sens-start": "\n[%1] Pruefe Separator-/Scanner-Zuordnung (ANZAHL_SEPARATOR/ANZAHL_SCANNER)...", "sens-no-inserts": "\n[%1] Keine Bloecke in der Zeichnung gefunden - Sensor-Zuordnung uebersprungen.", "sens-bbox-fehler": "\n ! Bounding-Box fehlgeschlagen fuer ILS-Block '%1'", diff --git a/lang/en_GB.json b/lang/en_GB.json index 4d74fe2..9098337 100644 --- a/lang/en_GB.json +++ b/lang/en_GB.json @@ -512,6 +512,7 @@ "exp-csv-missing": "\n[%1] ERROR: Python reported success but the CSV is missing: %2. Log: %3", "exp-omni-no-inserts": "\n[OMNI_UPDATE] No INSERT blocks in the drawing.", "exp-omni-updated": "\n[OMNI_UPDATE] %1 elements updated (HEIGHT, ROTATION).", + "sens-skip": "\n[%1] Separator/scanner assignment up to date (ZUORDNUNG set, sums match) - recomputation skipped.", "sens-start": "\n[%1] Checking separator/scanner assignment (ANZAHL_SEPARATOR/ANZAHL_SCANNER)...", "sens-no-inserts": "\n[%1] No blocks found in the drawing - sensor assignment skipped.", "sens-bbox-fehler": "\n ! Bounding box failed for ILS block '%1'",