Ich möchte mein Problem etwas genauer erläutern:
- In meiner Zeichnung verwende ich mehrere dynamische Blöcke (1-4), die alle dieselben Attribute (A-Z) enthalten.
- Diese Blöcke ordne ich in der Zeichnung ähnlich einer Konzertbestuhlung an.
- Jeder Block besitzt unterschiedliche Attributwerte, darunter eine Sektorbezeichnung und eine Nummer, die nach Zeilen und Spalten aufgeschlüsselt sind.
- Ein Beispiel für diese Werte wäre: Sektor-Nummer (F-A005), wobei F für den Sektor, A für die Zeile und 005 für die Spalte steht.
- Es gibt noch weitere Attribute, aber diese sind für die Duplikatsuche nicht relevant.
- Ziel ist es, die Zeichnung nach Duplikaten zu durchsuchen, die möglicherweise durch menschliche Fehler entstanden sind. Diese Duplikate dürfen nie vorkommen.
- Das bedeutet, ich suche nach Blöcken, bei denen die Kombination aus Sektor und Nummer mehrfach vorhanden ist. Wenn ein Duplikat gefunden wird, soll ein Block namens „Achtung“ am Basispunkt des dynamischen Blocks mit den gleichen Attributen eingefügt werden.
- Der „Achtung“-Block dient als visuelle Markierung, damit ich von weitem erkenne, wo es Duplikate gibt.
- In der Zeichnung gibt es auch andere Blöcke ohne die relevanten Attribute (Sektor und Nummer). Diese sollen bei der Überprüfung ignoriert werden.
- Aktuell funktioniert die Duplikatsuche gut, und der „Achtung“-Block wird korrekt an den dynamischen Block angehängt.
- Das Problem ist jedoch, dass der erste platzierte dynamische Block z.B Block3 bei der Überprüfung nicht als Duplikat erkannt wird. Wenn ich z. B. einen Block 10-mal kopiere und alle die gleichen Attributwerte (wie F-A005) haben, werden nur 9 Duplikate erkannt. Der ursprünglich gesetzte Block wird nicht als Duplikat angezeigt.
- Zudem füge ich den Block Achtung auf einem entsprechenden Layer (Duplikate) ein.
- Ich habe bereits auch schon eine Schleife eingebaut, mit der Hoffnung, dass der erste Block erkannt wird. Leider ist dem jedoch nicht so.
Die lisp Datei sieht inetwa so aus:
(defun replace-umlauts (text)
;; Ersetze Umlaute durch ihre ASCII-Äquivalente
(setq text (vl-string-subst "ae" "ä" text))
(setq text (vl-string-subst "oe" "ö" text))
(setq text (vl-string-subst "ue" "ü" text))
(setq text (vl-string-subst "Ae" "Ä" text))
(setq text (vl-string-subst "Oe" "Ö" text))
(setq text (vl-string-subst "Ue" "Ü" text))
(setq text (vl-string-subst "ss" "ß" text))
text ; Rückgabe des umgewandelten Textes
)
(defun ensure-layer-active (layer-name)
;; Überprüfen und aktivieren des Layers
(if (tblobjname "LAYER" layer-name) ; Überprüfen, ob der Layer existiert
(progn
;; Setze den Layer "Duplikate" aktiv
(command "_.layer" "SE" layer-name "")
;; Tau den Layer auf
(command "_.layer" "T" layer-name "")
;; Entsperren des Layers
(command "_.layer" "EN" layer-name "")
)
(progn
;; Erstelle den Layer, falls nicht vorhanden
(command "_.layer" "M" layer-name "")
;; Setze den Layer
(command "_.layer" "SE" layer-name "")
)
)
)
(defun c:SUCHESEKTORNUMMER ()
;; Suche nach Blöcken mit den Attributen SEKTOR und NUMMER
(setq ss (ssget "X" '((0 . "INSERT")))) ; Alle Blöcke suchen
(if ss
(progn
(setq count (sslength ss))
(setq found-blocks '()) ; Liste für die gefundenen Blöcke
(setq feld-grab-kombi '()) ; Liste für die kombinierten Werte
(setq valid-block-names '("BLOCK1" "Block2" "Block3" "Block4")) ; Gültige Blocknamen
;; Phase 1: Durchlaufe alle Blockreferenzen und speichere die Duplikate
(repeat count
(setq ent (ssname ss (setq count (1- count))))
;; Wandeln des Block-Handles in ein VLA-Objekt um
(setq blockObj (vlax-ename->vla-object ent))
;; Hole die Attribute des Blocks
(setq attlist (vlax-invoke blockObj 'GetAttributes))
;; Initialisiere Variablen für die Attributwerte
(setq sektor-wert nil)
(setq nummer-wert nil)
;; Durchsuche die Attributdaten nach den Tags SEKTOR und NUMMER
(foreach att attlist
(if (equal (strcase (vla-get-tagstring att)) "SEKTOR") ; Suche nach SEKTOR
(setq sektor-wert (vla-get-textstring att)) ; Wert des Attributs SEKTOR
)
(if (equal (strcase (vla-get-tagstring att)) "NUMMER") ; Suche nach NUMMER
(setq grabnummer-wert (vla-get-textstring att)) ; Wert des Attributs NUMMER
)
)
;; Kombiniere SEKTOR und NUMMER
(if (and sektor-wert nummer-wert)
(setq kombi (strcat (strcase sektor-wert) "-" (strcase nummer-wert)))
)
;; Speichern der gefundenen Kombinationen, wenn der Blockname gültig ist
(if (and kombi
(member (strcase (vla-get-effectivename blockObj)) valid-block-names)) ; Nur gültige Blocknamen
(progn
;; Überprüfen, ob die Kombination bereits existiert
(if (member kombi sektor-nummer-kombi)
(progn
;; Duplikat gefunden - Block aktivieren
(setq found-blocks (cons ent found-blocks))
)
;; Wenn kein Duplikat, zur Liste hinzufügen
(setq sektor-nummer-kombi (cons kombi sektor-nummer-kombi))
)
)
)
)
;; ACHTUNG Block für die gefundenen Duplikate einfügen
(if found-blocks
(progn
(ensure-layer-active "Duplikate") ; Layer sicherstellen
(foreach block found-blocks
;; Berechne den Einfügepunkt für den ACHTUNG Block
(setq insert-point (vlax-get (vlax-ename->vla-object block) 'insertionPoint))
;; ACHTUNG Block einfügen
(command "_.insert" "ACHTUNG" insert-point 1 1 0)
)
)
)
;; Prüfen auf Ursprungsblock
(foreach ent ss
(setq blockObj (vlax-ename->vla-object ent))
;; Hole die Attribute des Blocks
(setq attlist (vlax-invoke blockObj 'GetAttributes))
;; Initialisiere Variablen für die Attributwerte
(setq sektor-wert nil)
(setq nummer-wert nil)
;; Durchsuche die Attributdaten nach den Tags SEKTOR und NUMMER
(foreach att attlist
(if (equal (strcase (vla-get-tagstring att)) "SEKTOR") ; Suche nach SEKTOR
(setq feld-wert (vla-get-textstring att)) ; Wert des Attributs SEKTOR
)
(if (equal (strcase (vla-get-tagstring att)) "NUMMER") ; Suche nach NUMMER
(setq grabnummer-wert (vla-get-textstring att)) ; Wert des Attributs NUMMER
)
)
;; Kombiniere SEKTOR und NUMMER
(if (and sektor-wert nummer-wert)
(setq kombi (strcat (strcase sektor-wert) "-" (strcase nummer-wert)))
)
;; Überprüfen, ob die Kombination in der Liste der gefundenen Blöcke ist
(if (and kombi (member kombi sektor-nummer-kombi))
(progn
;; Ursprungsblock als Duplikat erkennen
(setq insert-point (vlax-get (vlax-ename->vla-object ent) 'insertionPoint))
;; ACHTUNG Block einfügen
(command "_.insert" "ACHTUNG" insert-point 1 1 0)
)
)
)
;; Ergebnisanzeige
(if found-blocks
(princ (strcat "\nDuplikate gefunden: " (itoa (length found-blocks))))
)
(if (null found-blocks)
(princ "\nKeine Duplikate gefunden.")
)
)
(princ "\nKeine Blöcke mit SEKTOR und NUMMER gefunden.")
)
(princ)
)
------------------
Mfg Rivella
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP