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 <noreply@anthropic.com>
This commit is contained in:
2026-08-21 15:54:47 +02:00
parent edfba75801
commit 9341d4c5c2
4 changed files with 73 additions and 1 deletions
+62
View File
@@ -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,