From bc09b23c23dacbb9dbb11805965bdfc3df9371e3 Mon Sep 17 00:00:00 2001 From: Yuelin Wang Date: Mon, 20 Jul 2026 13:06:50 +0200 Subject: [PATCH] =?UTF-8?q?=C3=9Cberprf=C3=BCng=20Funktion=20f=C3=BCr=20An?= =?UTF-8?q?zahl=20der=20Separatoren=20und=20Scanner=20wurde=20gebaut?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lisp/count_sep_scan.lsp | 356 +++++++++++++++++++++++++++++++++++ data/ils/3D/Separator_SP.dwg | Bin 0 -> 22758 bytes 2 files changed, 356 insertions(+) create mode 100644 Lisp/count_sep_scan.lsp create mode 100644 data/ils/3D/Separator_SP.dwg diff --git a/Lisp/count_sep_scan.lsp b/Lisp/count_sep_scan.lsp new file mode 100644 index 0000000..c5acbc0 --- /dev/null +++ b/Lisp/count_sep_scan.lsp @@ -0,0 +1,356 @@ +;;; ============================================================ +;;; count_sep_scan.lsp - Eigenstaendiges Zaehl-Werkzeug +;;; ------------------------------------------------------------ +;;; Zaehlt die manuell platzierten Bloecke "Scanner" und +;;; "Separator_SP" je ILS-Block (Kreisel / VarioFoerderer / +;;; Gefaellestrecke) und schreibt die Anzahlen in die Attribute +;;; des jeweiligen ILS-Blocks. Anschliessend QSAVE. +;;; +;;; Zuordnung eines Sensors zu einem ILS-Block: +;;; - Der geometrische Mittelpunkt (X/Y) des Sensors (Zentrum +;;; seiner eigenen Bounding-Box, unabhaengig vom $INSBASE) +;;; muss in der achsparallelen Bounding-Box des ILS-Blocks +;;; liegen (Z wird ignoriert). +;;; - Liegt der Punkt in mehreren Boxen (Ueberlappung), wird +;;; der ILS-Block mit dem naechstgelegenen Box-Zentrum gewaehlt. +;;; - Ein optionaler Toleranzrand (*senstol*) vergroessert die +;;; Box, damit Sensoren knapp am Rand noch erfasst werden. +;;; +;;; Aufruf: ZAEHLE_SEP_SCAN +;;; Laden: per APPLOAD oder (load "count_sep_scan") +;;; ============================================================ + +(vl-load-com) + +;;; ------------------------------------------------------------ +;;; KONFIGURATION (bei Bedarf anpassen) +;;; ------------------------------------------------------------ + +;; Toleranzrand um die ILS-Block-Box in Zeichnungseinheiten (mm). +;; 0.0 = exakte Box. Groesserer Wert = Sensoren knapp ausserhalb +;; werden noch dem ILS-Block zugerechnet. +(if (null *senstol*) (setq *senstol* 0.0)) + +;; Blockname-Muster (wcmatch, Grossschreibung) fuer die manuell +;; platzierten Sensoren. +(setq *scanner-pattern* "SCANNER,SCANNER_*") +(setq *separator-pattern* "SEPARATOR_SP,SEPARATOR_SP_*") + +;; Blockname-Muster fuer die INTERN im ILS-Block (in der Kette) +;; gezeichneten Separatoren. Diese bilden die Basis fuer +;; ANZAHL_SEPARATOR und werden bei jedem Lauf frisch gezaehlt. +(setq *intern-separator-pattern* "STAUSTRECKE_SEPARATOR_SP*") + +;;; ------------------------------------------------------------ +;;; ILS-Block-Erkennung und zugehoerige Attribut-Tags +;;; Alle ILS-Bloecke (Kreisel / VF / GF) verwenden einheitlich +;;; ANZAHL_SCANNER und ANZAHL_SEPARATOR. +;;; Rueckgabe: (scanner-tag separator-tag) oder nil +;;; ------------------------------------------------------------ +(defun cs-carrier-tags (nm / up) + (setq up (strcase nm)) + (if (or (wcmatch up "KREISEL_*") + (wcmatch up "VF_*") + (wcmatch up "GF_*")) + (list "ANZAHL_SCANNER" "ANZAHL_SEPARATOR") + nil + ) +) + +;;; ------------------------------------------------------------ +;;; Sensor-Erkennung +;;; Rueckgabe: 'scanner | 'separator | nil +;;; ------------------------------------------------------------ +(defun cs-sensor-kind (nm / up) + (setq up (strcase nm)) + (cond + ((wcmatch up *scanner-pattern*) 'scanner) + ((wcmatch up *separator-pattern*) 'separator) + (t nil) + ) +) + +;;; ------------------------------------------------------------ +;;; Punkt-Rueckgabe von vla-getboundingbox in eine Liste wandeln. +;;; BricsCAD liefert ein Safearray, AutoCAD ein Variant mit +;;; Safearray - beide Faelle werden hier abgedeckt. +;;; ------------------------------------------------------------ +(defun cs-pt->list (v) + (cond + ((= (type v) 'variant) (vlax-safearray->list (vlax-variant-value v))) + ((= (type v) 'safearray) (vlax-safearray->list v)) + ((listp v) v) + (t nil) + ) +) + +;;; ------------------------------------------------------------ +;;; Bounding-Box eines INSERT holen (WCS, achsparallel). +;;; Erzwingt vorher ein vla-update (Regen des Objekts), da +;;; vla-getboundingbox sonst auf nicht-regenerierten oder auf +;;; eingefrorenen Layern liegenden Bloecken scheitert. +;;; Rueckgabe: (minx miny maxx maxy) oder nil bei Fehler. +;;; *cs-last-error* enthaelt bei Fehler den echten COM-Fehlertext. +;;; ------------------------------------------------------------ +(defun cs-bbox (ent / obj res) + (setq *cs-last-error* nil) + (setq obj (vlax-ename->vla-object ent)) + ;; Objekt regenerieren (Fehler ignorieren) + (vl-catch-all-apply 'vla-update (list obj)) + (setq res + (vl-catch-all-apply + '(lambda ( / ll ur) + (vla-getboundingbox obj 'll 'ur) + (list (cs-pt->list ll) (cs-pt->list ur))))) + (if (vl-catch-all-error-p res) + (progn + (setq *cs-last-error* (vl-catch-all-error-message res)) + nil) + (list (car (car res)) (cadr (car res)) ;; minx miny + (car (cadr res)) (cadr (cadr res))) ;; maxx maxy + ) +) + +;;; ------------------------------------------------------------ +;;; Referenzpunkt eines Sensors: geometrischer Mittelpunkt seiner +;;; eigenen Bounding-Box (X/Y). Unabhaengig vom $INSBASE der +;;; Sensor-DWG. Fallback auf den Einfuegepunkt, falls die Box +;;; nicht ermittelbar ist. +;;; ------------------------------------------------------------ +(defun cs-sensor-point (ent ed / bb) + (setq bb (cs-bbox ent)) + (if bb + (list (/ (+ (nth 0 bb) (nth 2 bb)) 2.0) + (/ (+ (nth 1 bb) (nth 3 bb)) 2.0)) + (cdr (assoc 10 ed)) + ) +) + +;;; ------------------------------------------------------------ +;;; Liegt Punkt pt (X/Y) in ILS-Block-Record rec (mit Toleranz)? +;;; rec = (ename tagScan tagSep minx miny maxx maxy cx cy) +;;; ------------------------------------------------------------ +(defun cs-in-box (pt rec / x y) + (setq x (car pt) y (cadr pt)) + (and (>= x (- (nth 3 rec) *senstol*)) + (<= x (+ (nth 5 rec) *senstol*)) + (>= y (- (nth 4 rec) *senstol*)) + (<= y (+ (nth 6 rec) *senstol*))) +) + +;;; ------------------------------------------------------------ +;;; Sensor-Punkt einem ILS-Block zuordnen. +;;; Rueckgabe: ILS-Block-Record oder nil (keine Zuordnung). +;;; Bei mehreren Treffern: naechstes Box-Zentrum (X/Y). +;;; ------------------------------------------------------------ +(defun cs-assign (pt carriers / matches best bestd d) + (setq matches nil) + (foreach rec carriers + (if (cs-in-box pt rec) (setq matches (cons rec matches)))) + (cond + ((null matches) nil) + ((= (length matches) 1) (car matches)) + (t + (setq best nil bestd nil) + (foreach rec matches + (setq d (distance (list (car pt) (cadr pt)) + (list (nth 7 rec) (nth 8 rec)))) + (if (or (null bestd) (< d bestd)) + (setq bestd d best rec))) + best) + ) +) + +;;; ------------------------------------------------------------ +;;; Zaehler in einer Assoc-Liste (Schluessel = ename) erhoehen. +;;; ------------------------------------------------------------ +(defun cs-bump (alist key / pair) + (setq pair (assoc key alist)) + (if pair + (subst (cons key (1+ (cdr pair))) pair alist) + (cons (cons key 1) alist)) +) + +;;; ------------------------------------------------------------ +;;; Attributwert an einem INSERT setzen (Tag ohne Gross/Klein). +;;; Rueckgabe: T wenn Tag gefunden und gesetzt, sonst nil. +;;; ------------------------------------------------------------ +(defun cs-set-att (ins tag val / e ed done ok) + (setq e (entnext ins) done nil ok nil) + (while (and e (not done)) + (setq ed (entget e)) + (cond + ((= (cdr (assoc 0 ed)) "ATTRIB") + (if (= (strcase (cdr (assoc 2 ed))) (strcase tag)) + (progn + (entmod (subst (cons 1 val) (assoc 1 ed) ed)) + (entupd e) + (setq ok t)))) + ((= (cdr (assoc 0 ed)) "SEQEND") (setq done t)) + ) + (setq e (entnext e)) + ) + ok +) + +;;; ------------------------------------------------------------ +;;; Zaehlt rekursiv, wie oft ein Block (Muster pat) in der +;;; Definition des Blocks bname verwendet wird - inklusive +;;; verschachtelter Unterbloecke. Damit wird die interne Anzahl +;;; der Kette-Separatoren aus der Geometrie ermittelt. +;;; ------------------------------------------------------------ +(defun cs-count-nested (bname pat / e ed nm n stop) + (setq n 0 stop nil) + (setq e (tblobjname "BLOCK" bname)) + (if e + (progn + (setq e (entnext e)) + (while (and e (not stop)) + (setq ed (entget e)) + (cond + ((= (cdr (assoc 0 ed)) "ENDBLK") (setq stop t)) + ((= (cdr (assoc 0 ed)) "INSERT") + (setq nm (cdr (assoc 2 ed))) + (if (wcmatch (strcase nm) pat) + (setq n (1+ n)) + (setq n (+ n (cs-count-nested nm pat))))) + ) + (if (not stop) (setq e (entnext e))) + ) + ) + ) + n +) + +;;; ============================================================ +;;; HAUPTBEFEHL +;;; ============================================================ +(defun c:ZAEHLE_SEP_SCAN ( / ss i ent ed nm tags bb cx cy + carriers scanpts seppts kind pt + scanCounts sepCounts + rec en nm2 ns nsep internSep newS newP + n-scan-unassigned n-sep-unassigned + okS okP) + (setq carriers nil scanpts nil seppts nil) + + ;; Vor der Extents-Berechnung einmal regenerieren, damit + ;; vla-getboundingbox verlaessliche Werte liefert. + (vl-catch-all-apply '(lambda () (command "_.REGEN"))) + + ;; --- 1. Alle INSERTs sammeln und klassifizieren --- + (setq ss (ssget "_X" '((0 . "INSERT")))) + (if (null ss) + (progn (princ "\n>>> Keine Bloecke in der Zeichnung gefunden.") (princ)) + (progn + (setq i 0) + (while (< i (sslength ss)) + (setq ent (ssname ss i)) + (setq ed (entget ent)) + (setq nm (cdr (assoc 2 ed))) + (setq tags (cs-carrier-tags nm)) + (cond + ;; --- ILS-Block --- + (tags + (setq bb (cs-bbox ent)) + (if bb + (progn + (setq cx (/ (+ (nth 0 bb) (nth 2 bb)) 2.0)) + (setq cy (/ (+ (nth 1 bb) (nth 3 bb)) 2.0)) + (setq carriers + (cons (list ent (car tags) (cadr tags) + (nth 0 bb) (nth 1 bb) (nth 2 bb) (nth 3 bb) + cx cy) + carriers))) + (princ (strcat "\n! Bounding-Box fehlgeschlagen fuer ILS-Block '" nm "'" + (if *cs-last-error* + (strcat " (" *cs-last-error* ")") ""))) + ) + ) + ;; --- Sensor --- + (t + (setq kind (cs-sensor-kind nm)) + (if kind + (progn + (setq pt (cs-sensor-point ent ed)) + (if (eq kind 'scanner) + (setq scanpts (cons pt scanpts)) + (setq seppts (cons pt seppts))))) + ) + ) + (setq i (1+ i)) + ) + + ;; --- 2. Sensoren den ILS-Bloecken zuordnen --- + (setq scanCounts nil sepCounts nil + n-scan-unassigned 0 n-sep-unassigned 0) + + (foreach pt scanpts + (setq rec (cs-assign pt carriers)) + (if rec + (setq scanCounts (cs-bump scanCounts (car rec))) + (setq n-scan-unassigned (1+ n-scan-unassigned)))) + + (foreach pt seppts + (setq rec (cs-assign pt carriers)) + (if rec + (setq sepCounts (cs-bump sepCounts (car rec))) + (setq n-sep-unassigned (1+ n-sep-unassigned)))) + + ;; --- 3. Attribute setzen und Bericht ausgeben --- + (princ "\n============================================") + (princ "\n Sensor-Zaehlung je ILS-Block") + (princ "\n============================================") + (if (null carriers) + (princ "\n (Keine ILS-Bloecke KREISEL_/VF_/GF_ gefunden)") + (foreach rec carriers + (setq en (car rec)) + (setq nm2 (cdr (assoc 2 (entget en)))) + (setq ns (cond ((assoc en scanCounts) (cdr (assoc en scanCounts))) (t 0))) + (setq nsep (cond ((assoc en sepCounts) (cdr (assoc en sepCounts))) (t 0))) + ;; interne Kette-Separatoren frisch aus der Blockdefinition zaehlen + (setq internSep (cs-count-nested nm2 *intern-separator-pattern*)) + ;; Scanner = nur neu zugeordnete + ;; Separator = interne Kette-Separatoren + neu zugeordnete + (setq newS ns) + (setq newP (+ internSep nsep)) + ;; gefundene Anzahlen melden + (princ (strcat "\n " nm2 + ": Scanner(neu)=" (itoa ns) + ", Separator intern=" (itoa internSep) + " + manuell=" (itoa nsep))) + ;; Werte schreiben und Ergebnis bestaetigen + (setq okS (cs-set-att en (nth 1 rec) (itoa newS))) + (setq okP (cs-set-att en (nth 2 rec) (itoa newP))) + (if (and okS okP) + (princ (strcat "\n -> geschrieben: " + "ANZAHL_SCANNER=" (itoa newS) + ", ANZAHL_SEPARATOR=" (itoa newP))) + (princ (strcat "\n -> FEHLER beim Schreiben: " + (if okS "" "ANZAHL_SCANNER fehlt ") + (if okP "" "ANZAHL_SEPARATOR fehlt")))) + ) + ) + (princ (strcat "\n--------------------------------------------" + "\n ILS-Bloecke gesamt: " (itoa (length carriers)) + "\n Scanner gesamt: " (itoa (length scanpts)) + " (nicht zugeordnet: " (itoa n-scan-unassigned) ")" + "\n Separator gesamt: " (itoa (length seppts)) + " (nicht zugeordnet: " (itoa n-sep-unassigned) ")")) + (if (or (> n-scan-unassigned 0) (> n-sep-unassigned 0)) + (princ (strcat "\n Hinweis: Nicht zugeordnete Sensoren liegen" + "\n ausserhalb aller ILS-Block-Boxen. Ggf. *senstol*" + "\n erhoehen oder Platzierung pruefen."))) + + ;; --- 4. Zeichnung speichern --- + (princ "\n--------------------------------------------") + (princ "\n Speichere Zeichnung (QSAVE) ...") + (command "_.QSAVE") + (princ "\n>>> Fertig.") + (princ) + ) + ) + (princ) +) + +(princ "\n>>> count_sep_scan.lsp geladen. Befehl: ZAEHLE_SEP_SCAN") +(princ) diff --git a/data/ils/3D/Separator_SP.dwg b/data/ils/3D/Separator_SP.dwg new file mode 100644 index 0000000000000000000000000000000000000000..1885a226565d062f314085efd2636137283b4f8a GIT binary patch literal 22758 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 literal 0 HcmV?d00001