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:
@@ -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,
|
||||
|
||||
+9
-1
@@ -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)))
|
||||
|
||||
|
||||
@@ -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'",
|
||||
|
||||
@@ -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'",
|
||||
|
||||
Reference in New Issue
Block a user