| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Layer eines Layer-Eigenschaftsfilters schnell frieren/tauen (1992 / mal gelesen)
|
archi.archi Mitglied
Beiträge: 77 Registriert: 08.10.2010 Windows 10 AutoCAD 2023 Revit 2023
|
erstellt am: 01. Okt. 2018 11:46 <-- editieren / zitieren --> Unities abgeben:
Verehrtes Forum, wir verwenden im Layereigenschaften-Manager Eigenschaftsfilter u.a. zum Frieren/Tauen. Leider ist die Nutzung dieser Layer-Filter mit "<rechte Maustaste> - Sichtbarkeit - Getaut" bei einer großen Layer-Anzahl sehr langsam. Wie kann man alle Layer der Layer-Filter über deren Namen (z.B. "*Schrott") mittels Lisp schneller Frieren/Tauen? Programmierfreundliche Grüße Archi [Diese Nachricht wurde von archi.archi am 01. Okt. 2018 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 01. Okt. 2018 12:47 <-- editieren / zitieren --> Unities abgeben: Nur für archi.archi
Warum hast du gerade diesen Weg genannt, funktionieren andere (dir bekannte) Wege schneller, welche? Hast du Xrefs in der Datei? Welche Version hast du, wie ist der Updatestand? Befehl INFO oder auch _Vernum In neueren Versionen gab es Probleme die bereits gefixt wurden, daher die Frage. Lisp: Alle Layer des gewünschten Filters ermitteln und dann die Eigenschaft des Layers wie gewünscht ändern, ich wüßte keine direkten Weg. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archi.archi Mitglied
Beiträge: 77 Registriert: 08.10.2010 Windows 10 AutoCAD 2023 Revit 2023
|
erstellt am: 01. Okt. 2018 13:23 <-- editieren / zitieren --> Unities abgeben:
Hallo cadffm, Layer-Filter sind variabel, daher werden sie hier verwendet. Ein schnellerer (und gleichzeitig auch variabler) Weg ist mir leider nicht bekannt. In den Dateien sind diverse Xrefs. An der Version liegt es nicht, die langsame Abarbeitung gibt es schon in Version 2017. Liegt die Geschwindigkeit vielleicht an der Datenstruktur (s. http://ww3.cad.de/foren/ubb/Forum145/HTML/001981.shtml#000003)? Gibt es für die Ermittlung der Layer eines Filters vieleicht schon ein kleines Tool/einen Ansatz? Gruß Archi
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 01. Okt. 2018 13:39 <-- editieren / zitieren --> Unities abgeben: Nur für archi.archi
Die Seite http://internetadressehier/ bringt keine Erkenntnis über die Struktur aber auch mit der richtigen URL habe ich keine Ahnung was das mit dem Fall zutun hat. Teste ob es per Lisp wie gewünscht schnell geht, also alle Laye oder die entsprechend vergleichbare Auswahl frieren/tauen und wenn es geht: Viel Spaß beim coden.
Ansätze? In dem Moment wo du dir etwas denkst kannst du zugleich davon ausgehen: Es gibt dies bereits 100x im Netz was aber nicht bedeutet man würde es auch leicht finden. Ich suche jetzt mal nicht, aber Layer-Eigenschaftenfilter erstellen(nicht per command-Layer) oder auch ändern, dazu sollte man was finden. PS: Da es deine Layer sind(?) sind dir der Filter doch auch ohne Programmierung bekannt und du könntest diesen Teil überspringen. Es sei denn diverse User sollen/dürfen den Filter nach belieben ändern, dann muß man natürlich darüber gehen die Eigenschaften auszulesen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 01. Okt. 2018 14:07 <-- editieren / zitieren --> Unities abgeben: Nur für archi.archi
|
archi.archi Mitglied
Beiträge: 77 Registriert: 08.10.2010 Windows 10 AutoCAD 2023 Revit 2023
|
erstellt am: 01. Okt. 2018 14:49 <-- editieren / zitieren --> Unities abgeben:
|
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13508 Registriert: 30.11.2003 .
|
erstellt am: 01. Okt. 2018 15:07 <-- editieren / zitieren --> Unities abgeben: Nur für archi.archi
|
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 02. Okt. 2018 16:39 <-- editieren / zitieren --> Unities abgeben: Nur für archi.archi
Da an der Stelle (Verweis auf den Link) nur einige Layerfilter zu finden sind, würde ich hier mit starten: (and (setq dicts (vla-GetExtensionDictionary (vla-Get-Layers (vla-get-ActiveDocument (vlax-get-acad-object))))) (setq LayerFilters (vla-item dicts "ACLYDICTIONARY")) (vlax-dump-objects LayerFilters) ) Gruppenfilter oder auch Eigenschaftenfilter mit bestimmten Filterkriterien würde das "ANSATZ" Lisp überhaupt nicht finden - es ist bereits ein paar Jährchen alt, die Möglichkeiten in Acad/DWG haben sich in einigen Bereichen geändert.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archi.archi Mitglied
Beiträge: 77 Registriert: 08.10.2010 Windows 10 AutoCAD 2023 Revit 2023
|
erstellt am: 04. Okt. 2018 09:47 <-- editieren / zitieren --> Unities abgeben:
Hallo cadffm, hallo CADmium, erst einmal Danke für Eure konstruktiven Hilfen! Mit dem (älteren) Ansatz aus dem Verweis bin ich jetzt schon mal bei den Daten des ersten Layerfilters: ((-1 . <Objektname: 162ab793c80> ) (0 . XRECORD) (5 . 3658) (102 . {ACAD_REACTORS) (330 . <Objektname: 162ab793c40> ) (102 . }) (330 . <Objektname: 162ab793c40> ) (100 . AcDbXrecord) (280 . 1) (1 . B_Hilfe) (1 . *_+++_*,*_---_*) (1 . *) (1 . *) (70 . 0) (1 . *) (1 . *)) Daraus müsste ich noch den fett markierten Bereich extrahieren. Habt Ihr dazu noch einen kleinen Hinweis, da jetzt meine Kenntnisse nicht wirklich ausreichen? Mit der zweiten Variante: (vlax-dump-objects LayerFilters) (kleiner Schreibfehler) geht es eleganter? Aber wie bzw. womit dann weiter? Morgentliche Grüße Archi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 04. Okt. 2018 10:25 <-- editieren / zitieren --> Unities abgeben: Nur für archi.archi
Warum denn bitte nur den FETTEN Teil, der Layerfilter umfasst doch "alle" Kriterien und nicht nur die Hälfte einer der Filterkriterien? Noch einmal auch der Hinweis von zuvor: Gruppenfilter oder auch Eigenschaftenfilter mit bestimmten Filterkriterien würde das "ANSATZ" Lisp überhaupt nicht finden Setze zB. einen Farbfilter auf eine nicht-ACI Farbe, also TreueColor Wert oder Farbbuch, dann wirst du über den Weg aus dem Link nichts finden. Zudem sparst du dir auf diesem Weg herausfinden zu müssen wie die einzelnen Filterkriterien/Wert "kodiert" sind, also welche Einstellung im Filter welchen Daten in der Entitiyliste entspricht, oder umgekehrt. "Aber wie bzw. womit dann weiter?" Das ist eigentlich Teil der Arbeit des "programmierens", oder?
Antwort: Ausgehend von (vla-item dicts "ACLYDICTIONARY") durchläufst du alle Filter mit vlax-for oder holst dir nur den Gewünschten vla-item nachdem du die Existenz geprüft hast, je nach Bedarf. Dann fragst du die XData der Filter ab und erhälst Filtername+Definition. GetXRecordData Method (ActiveX) Anschließend gehst du alle Layer der Datei durch und prüfst ob der Layer alle Kriterien erfüllt oder nicht. Wenn man mit verschachtelten Layerfilter zutun hat müßte man auch noch übergeordnete Filter berücksichtigen, bei eigenen Filtern ist einem bekannt ob man verschachtelte hat oder nicht, so kann man sich etwas Arbeit sparen und diesen Fall ignorieren, falls nicht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archi.archi Mitglied
Beiträge: 77 Registriert: 08.10.2010 Windows 10 AutoCAD 2023 Revit 2023
|
erstellt am: 04. Okt. 2018 11:47 <-- editieren / zitieren --> Unities abgeben:
Hallo cadffm, deine Variante wäre dann das Schweitzer Taschenmesser! Zum Glück geht es nur um selbstdefinierte, "einstufige" Filter, die zum Schalten von Referenz-Layern genutzt werden. Wenn ich Zeit habe, werde ich mich an deinen Ansatz versuchen! Ohne ausreichend Zeit bleibt mir ersteinmal nur eine einfache Lösung: alle Layerfilter "*_name" einsammeln und dann ein "-layer FR..." ausführen. Das werde ich nächste Woche hier einstellen. Bis hierher vielen Dank, jetzt muss ich auf die Baustelle. Gruß Archi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archi.archi Mitglied
Beiträge: 77 Registriert: 08.10.2010 Windows 10 AutoCAD 2023 Revit 2023
|
erstellt am: 09. Okt. 2018 11:16 <-- editieren / zitieren --> Unities abgeben:
Hallo Spezialisten, hier nun mein Ergebnis: Code:
(defun LayerFilter (filtermaske aktion / lext-dict ldict lay_entity lay_entity1 lay_filters lay_filters1 lay_filters2 filter_names layerfilter ) ;zulässige aktion: ;FR = FRieren ;TA = TAuen (vl-load-com) (setq layerfilter "") ;Layer Eigenschaftsfilter ermitteln (setq lext-dict (entget (vlax-vla-object->ename (vla-GetExtensionDictionary (vla-get-layers (vla-get-ActiveDocument (vlax-get-acad-object) ) ;vla-get-ActiveDocument ) ;vla-get-layers ) ;vla-GetExtensionDictionary ) ;vlax-vla-object->ename ) ;entget ) ;setq (if (setq ldict (member (cons 3 "ACAD_LAYERFILTERS") lext-dict)) (cdr (assoc 360 ldict)) nil ) ;if (if ldict (progn (setq lay_entity (cdr (assoc 360 ldict))) (setq lay_filters (entget lay_entity)) (while lay_filters (if (= 3 (caar lay_filters)) (if (str-ipos (cdar lay_filters) filtermaske) (progn (setq lay_entity1 (cdr (assoc 350 lay_filters))) (setq lay_filters1 (entget lay_entity1)) ;(280 . 1) (1 . A_Schrott) (1 . *_+++_*,*_---_*) (1 . *) (1 . *) (70 . 0) (1 . *) (1 . *)) (setq lay_filters2 (cdr (nth 10 lay_filters1))) ;11.[=(10+1)].Element (1 . *_+++_*,*_---_*) (setq layerfilter (strcat layerfilter "," lay_filters2)) ;Zusammensetzen der einzelnen Filterkriterien (setq lay_filters (cdr lay_filters)) ;Liste ohne erstes Element = nächstes Element ) ;progn ) ;if ) ;if (setq lay_filters (cdr lay_filters)) ;Liste ohne erstes Element ) ;while ) ;progn ) ;if ;Layer schalten (command "-layer" aktion layerfilter "") (princ) ) ;LayerFilter (defun c:LayerFilter_fr ( / ) ;Layerfilter FRieren (Layerfilter "_schrott" "FR") )
(defun c:LayerFilter_ta ( / ) ;Layerfilter TAuen (Layerfilter "_schrott" "TA") ) ;;;--- (defun str-pos (str c / i l ls lc) ;sucht eine Zeichenkette "c" innerhalb einer anderen "str" ;Zeichenkette c gefunden, Position zurückgegeben, anderenfalls nil ;Suchstring: einzelnes Zeichen oder mehreren Zeichen ;Groß- und Kleinschreibung unterscheiden ;(str-pos "c:\\root" "\\") => 3 (setq i 1) (setq ls (strlen str)) (setq lc (strlen c)) (setq l (1+ (- ls lc))) (while (and (<= i l) (/= (substr str i lc) c)) (setq i (1+ i)) ) (if (<= i l) i ) ) (defun str-ipos (str c /) ;Groß- und Kleinschreibung NICHT unterscheiden ;(str-ipos "Tintenfisch" "Fisch") => 7 (str-pos (strcase str) (strcase c)) ;Großschreibung! ) (princ)
Funktioniert für einstufige Eigenschaftsfilter. Gibt es vielleicht noch Verbesserungsvorschläge? Gruß Archi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joern bosse Ehrenmitglied Dipl.-Ing. Vermessung
Beiträge: 1734 Registriert: 11.10.2004 Window 10 ACAD 2021 CIVIL 2021 BricsCAD V14-V22 Intel(R) Core(TM)i5-8250U CPU @ 1.60GHz 1.80 GHz 16.0GB RAM NVIDIA GeForce GTX 1050<P>
|
erstellt am: 09. Okt. 2018 11:48 <-- editieren / zitieren --> Unities abgeben: Nur für archi.archi
|
cadffm Moderator 良い精神
Beiträge: 21533 Registriert: 03.06.2002 Alles
|
erstellt am: 09. Okt. 2018 12:17 <-- editieren / zitieren --> Unities abgeben: Nur für archi.archi
Zitat: Original erstellt von archi.archi: Funktioniert für einstufige Eigenschaftsfilter. Das kommt ganz auf den Filter an (auf die Filterkriterien)Gibt es vielleicht noch Verbesserungsvorschläge? siehe unten
Zitat: Original erstellt von cadffm: Da an der Stelle (Verweis auf den Link) nur einige Layerfilter zu finden sind, würde ich hier mit starten:(and (setq dicts (vla-GetExtensionDictionary (vla-Get-Layers (vla-get-ActiveDocument (vlax-get-acad-object))))) (setq LayerFilters (vla-item dicts "ACLYDICTIONARY")) (vlax-dump-objects LayerFilters) ) Gruppenfilter oder auch Eigenschaftenfilter mit bestimmten Filterkriterien würde das "ANSATZ" Lisp überhaupt nicht finden - es ist bereits ein paar Jährchen alt, die Möglichkeiten in Acad/DWG haben sich in einigen Bereichen geändert.
Belässt du es so wie es ist, würde ich die Funktion umbenennen: (defun LayOnOffbyOnlyLayernamefilterFromLayerpropertiesfilter_withOnlyACIcolor&withoutTransparency Letzteres ist natürlich nicht ganz ernst gemeint, aber Nonsens ist es auch nicht Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archi.archi Mitglied
Beiträge: 77 Registriert: 08.10.2010 Windows 10 AutoCAD 2023 Revit 2023
|
erstellt am: 09. Okt. 2018 14:05 <-- editieren / zitieren --> Unities abgeben:
Hallo joern, mit den "neueren" vl-Funktionen sollte ich mich (auch als Gelegenheits-Programmierer) langsam mal näher beschäftigen. Es ergeben sich neue, zeitsparende Möglichkeiten! str-ipos/str-pos wurde dankend ersetzt. Gruß Archi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
archi.archi Mitglied
Beiträge: 77 Registriert: 08.10.2010 Windows 10 AutoCAD 2023 Revit 2023
|
erstellt am: 09. Okt. 2018 14:19 <-- editieren / zitieren --> Unities abgeben:
Hallo cadffm, ja, Dein Schweitzer Taschenmesser wird bei mir zum LayOnOffbyOnlyLayernamefilterFromLayerpropertiesfilter_withOnlyACIcolor&withoutTransparency-Messer. Wir nutzen in den Eigenschaftsfiltern (zum Glück) nur Layer on/off. Die Berücksichtigung aller Möglichkeiten der Eigenschaftsfilter übersteigt meine Kenntnisse und auch die verfügbare Zeit. Der Zweck der Funktion wurde erreicht. Danke für die Hilfestellungen und bis zum nächsten Problem. Gruß Archi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |