| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY präsentiert die neue NVIDIA RTX A400 und die A1000 Grafikkarte, eine Pressemitteilung
|
Autor
|
Thema: nach Blocksichtbarkeit filtern (2969 mal gelesen)
|
Steff179 Mitglied Geomatiker
Beiträge: 266 Registriert: 09.08.2007 AutoCAD 2014
|
erstellt am: 06. Mai. 2011 11:48 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen Ich habe mich ja mit dem Sichtbarkeitsstatus von Blöcken herumgeplagt. Das ist dabei herausgekommen. Ich hoffe es ist leserlich und das ich keine bösen Fehler eingebaut habe. Gruss Steff Code:
(defun c:FILTER-SICHTBARKEIT ( / Blocksichtbarkeit Kill-Doppelte ss i sss auswahllist a auswahl) ; Gibt also Ergebniss nil oder den Sichtbarkeitsparameter zurück ; ent = Elementname (defun Blocksichtbarkeit ( ent / i sarray sarray-ele Ergebniss) (if (and (= (cdr (assoc 0 (entget ent))) "INSERT") (vla-get-IsDynamicBlock (vlax-ename->vla-object ent)) ) (progn (setq sarray (vlax-variant-value (vla-getdynamicblockproperties(vlax-ename->vla-object ent))) ) (setq i (vlax-safearray-get-l-bound sarray 1)) (while (<= i (vlax-safearray-get-u-bound sarray 1)) (setq sarray-ele (vlax-safearray-get-element sarray i)) (if (= (vla-get-PropertyName sarray-ele) "Sichtbarkeit") (setq ergebniss (vlax-variant-value (vla-get-value sarray-ele))) );end if (setq i (1+ i)) );end while );end progn );end if ergebniss );end defun ; löscht doppelte Listenelemente und gibt die Liste sortiert zurück ; Liste = einfache Liste bsp. (1 2 3 4 5) ("A" "B" "C") (defun Kill-Doppelte (Liste / NeueListe) (foreach x Liste (if (not(member x NeueListe)) (setq NeueListe (cons x NeueListe)) ) ) (vl-sort (reverse NeueListe) (function (lambda (e1 e2)(< e1 e2)))) );end defun
(setq ss (ssget '((0 . "Insert"))) i 0 sss (ssadd) ) ;Erstellt eine Auswahlliste mit allen Sichtbarkeitsstatus (if ss (repeat (sslength ss) (if (Blocksichtbarkeit (ssname ss i)) (setq Auswahllist (cons (Blocksichtbarkeit (ssname ss i)) Auswahllist)) );end if (setq i (1+ i)) );end repeat (setq Auswahllist (Kill-Doppelte Auswahllist)) );end if ;---------------------------------------- (if (And Auswahllist ss) (progn ;Erstellt einen Filterstring für initget (setq a "" i 1) (repeat (length auswahllist) (setq a (strcat (itoa i) " " a)) (setq i (1+ i)) ) ;---------------------------------------- ;Fordert zur auswahl des zu Filternden Sichtbarkeitsstatus auf (setq i 1) (foreach x Auswahllist (princ (strcat "\n" (itoa i) ". " x))(setq i (1+ i))) (initget 1 a) (setq auswahl (getkword "\nBitte die Auswahl (Position) eingeben: ")) ;---------------------------------------- ;Filtert alle im Auswahlset enthaltenen Objekte mit dem ;Ausgewählten Sichtbarkeitsstatus (setq i 0) (repeat (sslength ss) (setq ent (ssname ss i)) (if (= (Blocksichtbarkeit ent) (nth (- (atoi auswahl) 1) Auswahllist)) (setq sss (ssadd ent sss)) );end if (setq i (1+ i)) );end repeat (sssetfirst sss sss) ;----------------------------------------
);end progn (princ "\nKeine Blöcke mit Sichtbarkeitsparameter gefunden!") );end if (princ) );end defun
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Andreas Kraus Mitglied Elektrotechniker
Beiträge: 1455 Registriert: 11.01.2006 WIN 10 ACAD 2022 BricsCAD V23
|
erstellt am: 06. Mai. 2011 16:56 <-- editieren / zitieren --> Unities abgeben: Nur für Steff179
Ich würde die Auswahlliste "bereinigen" also doppelte rausschmeißen. Stell dir mal vor jemand wählt 2000 Objekte und nur zwei haben eine andere Sichtbarkeit . Die Idee find ich aber gut. Ich hab ja auch schon eine Filterfunktion gebaut http://ww3.cad.de/foren/ubb/Forum54/HTML/015389.shtml#000038 die greift aber nur auf die Daten eines Objektes zu um den Filter zu erstellen. Aber eine "Schnellauswahl" mit Attributinhalten, EEDs, Parameterwerten,... das macht sicher Spass. Ich glaub da meldet sich der Basteltrieb bei mir Schönes Wochenende ------------------ Geht nicht, gibts nicht Gruß Andreas http://kraus-cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Steff179 Mitglied Geomatiker
Beiträge: 266 Registriert: 09.08.2007 AutoCAD 2014
|
erstellt am: 09. Mai. 2011 15:38 <-- editieren / zitieren --> Unities abgeben:
Hallo Andreas UUUUPPPPSSSS Sollte natürlich schon nicht so sein das die Auswahl so lang ist Hab irgendwie ein "progn" rauseditiert :s Darum hats die Zeile "(setq Auswahllist (Kill-Doppelte Auswahllist))" übersprungen. Danke für die Anmerkung. Gruss Steff Code:
(defun c:FILTER-SICHTBARKEIT ( / Blocksichtbarkeit Kill-Doppelte ss i sss auswahllist a auswahl) ; Gibt also Ergebniss nil oder den Sichtbarkeitsparameter zurück ; ent = Elementname (defun Blocksichtbarkeit ( ent / i sarray sarray-ele Ergebniss) (if (and (= (cdr (assoc 0 (entget ent))) "INSERT") (vla-get-IsDynamicBlock (vlax-ename->vla-object ent)) ) (progn (setq sarray (vlax-variant-value (vla-getdynamicblockproperties(vlax-ename->vla-object ent))) ) (setq i (vlax-safearray-get-l-bound sarray 1)) (while (<= i (vlax-safearray-get-u-bound sarray 1)) (setq sarray-ele (vlax-safearray-get-element sarray i)) (if (= (vla-get-PropertyName sarray-ele) "Sichtbarkeit") (setq ergebniss (vlax-variant-value (vla-get-value sarray-ele))) );end if (setq i (1+ i)) );end while );end progn );end if ergebniss );end defun ; löscht doppelte Listenelemente und gibt die Liste sortiert zurück ; Liste = einfache Liste bsp. (1 2 3 4 5) ("A" "B" "C") (defun Kill-Doppelte (Liste / NeueListe) (foreach x Liste (if (not(member x NeueListe)) (setq NeueListe (cons x NeueListe)) ) ) (vl-sort (reverse NeueListe) (function (lambda (e1 e2)(< e1 e2)))) );end defun
(setq ss (ssget '((0 . "Insert"))) i 0 sss (ssadd) ) ;Erstellt eine Auswahlliste mit allen Sichtbarkeitsstatus (if ss (progn (repeat (sslength ss) (if (Blocksichtbarkeit (ssname ss i)) (setq Auswahllist (cons (Blocksichtbarkeit (ssname ss i)) Auswahllist)) );end if (setq i (1+ i)) );end repeat (setq Auswahllist (Kill-Doppelte Auswahllist)) );end progn );end if ;---------------------------------------- (if (And Auswahllist ss) (progn ;Erstellt einen Filterstring für initget (setq a "" i 1) (repeat (length auswahllist) (setq a (strcat (itoa i) " " a)) (setq i (1+ i)) ) ;---------------------------------------- ;Fordert zur auswahl des zu Filternden Sichtbarkeitsstatus auf (setq i 1) (foreach x Auswahllist (princ (strcat "\n" (itoa i) ". " x))(setq i (1+ i))) (initget 1 a) (setq auswahl (getkword "\nBitte die Auswahl (Position) eingeben: ")) ;---------------------------------------- ;Filtert alle im Auswahlset enthaltenen Objekte mit dem ;Ausgewählten Sichtbarkeitsstatus (setq i 0) (repeat (sslength ss) (setq ent (ssname ss i)) (if (= (Blocksichtbarkeit ent) (nth (- (atoi auswahl) 1) Auswahllist)) (setq sss (ssadd ent sss)) );end if (setq i (1+ i)) );end repeat (sssetfirst sss sss) ;----------------------------------------
);end progn (princ "\nKeine Blöcke mit Sichtbarkeitsparameter gefunden!") );end if (princ) );end defun
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Britt Mitglied
Beiträge: 154 Registriert: 21.03.2002
|
erstellt am: 12. Jan. 2012 11:17 <-- editieren / zitieren --> Unities abgeben: Nur für Steff179
|
Balrok Mitglied Technischer Zeichner
Beiträge: 437 Registriert: 02.06.2005 Win10, 64Bit AutoCad 2024 AutoCad Architectur 2024 LiNear 2024 EPLAN P8 2024
|
erstellt am: 27. Apr. 2016 10:32 <-- editieren / zitieren --> Unities abgeben: Nur für Steff179
Hallo, ich möchte das Thema nochmal aufgreifen. Bei mir gibt es die Meldung nach der Auswahl des Blockes "Keine Blöcke mit Sichtbarkeitsparameter gefunden!", obwohl die Blöcke definitiv Sichtbarkeitsparameter haben. Was mache ich falsch??? Grüße Balrok Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 22275 Registriert: 03.06.2002 Alles
|
erstellt am: 27. Apr. 2016 11:20 <-- editieren / zitieren --> Unities abgeben: Nur für Steff179
Der Code ist an dieser Stelle leider wenig allgemeingültig gehalten und geht von einem Parameternamen "Sichtbarkeit" aus, anstatt zu ermitteln wie DEIN Sichtbarkeitsparameter benannt ist. Nur zum testen, aber nicht zwingend als Lösung zu empfehlen: Ändere im Code mal "Sichtbarkeit" auf "wohersollenwirwissenwiedudeineParameterbenennst", lade den Code neu und teste.. Wobei "wohersollenwirwissenwiedudeineParameterbenennst" vermutlich "Sichtbarkeit1" sein wird in deinem Fall. ------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Balrok Mitglied Technischer Zeichner
Beiträge: 437 Registriert: 02.06.2005 Win10, 64Bit AutoCad 2024 AutoCad Architectur 2024 LiNear 2024 EPLAN P8 2024
|
erstellt am: 27. Apr. 2016 11:32 <-- editieren / zitieren --> Unities abgeben: Nur für Steff179
|
Bernd P Ehrenmitglied V.I.P. h.c. cook-general
Beiträge: 3424 Registriert: 07.06.2001 W10-64bit, AMD Ryzen 7 3700X,32GB RAM, Sapphire Pulse Radeon RX 570 8G G5, Canon TX-3000 MFP, Maus Cherry MW4500, Sub:Infrastructure Design Suite, Office 365
|
erstellt am: 28. Apr. 2016 09:15 <-- editieren / zitieren --> Unities abgeben: Nur für Steff179
Servus, einfach das "Sichtbarkeit" auf den Standard "Sichtbarkeit1" ändern..... (schreib das auch nie um) ------------------ <----- Bitte Systeminfo eintragen, warum siehst du hier. Wünsche: Tabllen (XLS,ODS) FDO nativ einbinden, FDO-WMTS, richtige Ebenen für Layer, Erweiterter Attribut-Editor "auffrischen", dyn. Xrefs, mehrere modell Bereiche, Halo4Texte, verschränkte Attribute, Linientypen überarbeiten (doppellinien) , XREF>VISRETAIN pro XREF Fehler: FDORasterdaten im Layout Richtigen Maßstab verwenden, funktionierende updates u. erweiterungen inkl. installationsroutinen, Fehler zwischen Normal MAP Civil beheben Schöne Grüsse aus der Steiermark Bernd P. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |