Hot News aus dem CAD.de-Newsletter:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  AutoCAD VBA
  Gruppenfilterinhalte mit VBA auslesen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:   Gruppenfilterinhalte mit VBA auslesen (659 mal gelesen)
michimueller85
Mitglied



Sehen Sie sich das Profil von michimueller85 an!   Senden Sie eine Private Message an michimueller85  Schreiben Sie einen Gästebucheintrag für michimueller85

Beiträge: 18
Registriert: 06.12.2010

erstellt am: 26. Jun. 2018 03:40    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo CAD Team  ,

Wenn ich meinen Layereigenschafte-Manager öffne hab ich mir dort einige Gruppenfilter und Untergruppenfilter angelegt.
Wie kann ich nun mit VBA diesen Gruppenfilterbaum und deren Layerinhalt auslesen?
Ich habe bisher vergebens nach einem Code gesucht. 

Vielen Dank

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

KlaK
Ehrenmitglied
Dipl. Ing. Vermessung, CAD- und Netz-Admin


Sehen Sie sich das Profil von KlaK an!   Senden Sie eine Private Message an KlaK  Schreiben Sie einen Gästebucheintrag für KlaK

Beiträge: 1991
Registriert: 02.05.2006

AutoCAD LandDesktop R2 bis 2004
Civil 3D 2005 - 2017
Plateia, Canalis
Visual Basic

erstellt am: 26. Jun. 2018 08:27    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für michimueller85 10 Unities + Antwort hilfreich

Hallo michimueller,

Selber habe ich es noch nicht programmiert aber beschrieben ist der Zugriff auf das Dictionary in diesem Buch (entweder kaufen, falls es es noch gibt oder nach "Layer Filter" suchen, Seite 206)

Grüße
Klaus 

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

silcono
Mitglied
Planer


Sehen Sie sich das Profil von silcono an!   Senden Sie eine Private Message an silcono  Schreiben Sie einen Gästebucheintrag für silcono

Beiträge: 79
Registriert: 19.12.2014

AutoCAD 2010 LT
AutoCAD 2014
AutoCAD 2018
AutoCAD MAP 3D 2017
Intel(R) Core(TM) i5-4570 CPU @ 3.20GhZ 3.20Ghz
16,00GB Ram
Windows 7- Prof. 64-Bit
ASUS EAH6450 Series

erstellt am: 26. Jun. 2018 09:42    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für michimueller85 10 Unities + Antwort hilfreich

Hallo michimueller85,

ich hätte da zwei Ansätze.

1. Hier eine VBA-Lösung um die Layer auszulesen:

Code:

Sub Layerauslesen()

Dim strLayer As String
Open "C:\Users\BENUTZERNAME\Desktop\Layer.txt" For Output As #1

For Each objLayer In ThisDrawing.Layers
    strLayer = strLayer & objLayer.Name & ";"
Next

Print #1, strLayer & vbCr
Close #1

'MsgBox strLayer

End Sub


2. Eine VBA-Lösung um die Gruppenfilter auszulesen, dafür habe ich mir den Code aus dem Beitrag Layerfilter loeschen vorgenommen und umgebastelt:

Code:

Sub Layerfilterauslesen()

Dim strLayer As String
Dim objLayer As Variant
Dim dict As AcadDictionary
Dim TrackingDictionary As AcadDictionary, TrackingXRecord As AcadXRecord
Dim XRecordDataType As Variant, XRecordData As Variant
Dim ArraySize As Long, iCount As Long
Dim DataType As Integer, Data As String, msg As String

Set dict = ThisDrawing.Layers.GetExtensionDictionary("ACLYDICTIONARY")
Set TrackingDictionary = dict

If dict.Count > 0 Then

    Open "C:\Users\BENUTZERNAME\Desktop\Layerfilter.txt" For Output As #1
   
    For Each objLayer In dict
        Set TrackingXRecord = TrackingDictionary.GetObject(objLayer.Name)
        TrackingXRecord.GetXRecordData XRecordDataType, XRecordData
        ArraySize = UBound(XRecordDataType)
        For iCount = 0 To ArraySize
            DataType = XRecordDataType(iCount)
            Data = XRecordData(iCount)
            Debug.Print DataType; " : "; Data
            If DataType = 300 Then
                strLayer = strLayer & Data & ";"
            End If
        Next
    Next objLayer
End If
   
Print #1, strLayer & vbCr
Close #1

End Sub


Vielleicht hilft dir das weiter.
Bei Fragen gerne melden.

Grüße Silcono

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

michimueller85
Mitglied



Sehen Sie sich das Profil von michimueller85 an!   Senden Sie eine Private Message an michimueller85  Schreiben Sie einen Gästebucheintrag für michimueller85

Beiträge: 18
Registriert: 06.12.2010

erstellt am: 26. Jun. 2018 10:20    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo ihr zwei oh das ging ja echt schnell mit den Antworten. 

also ich hab nun gleich mal den Code von silcono kopiert und ausgeführt.
Ich hab einfach mal eine neue leere Datei angelegt, mit zwei Gruppenfiltern und in jedem Gruppenfilter je einen Layer angelegt.
Jedoch kommt bei mir dann in der Zeile: Data = XRecordData(iCount) die Fehlermeldung Typen unverträglich.

woran kann es liegen?!

ich nutze autocad 2014


Grüße


Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

silcono
Mitglied
Planer


Sehen Sie sich das Profil von silcono an!   Senden Sie eine Private Message an silcono  Schreiben Sie einen Gästebucheintrag für silcono

Beiträge: 79
Registriert: 19.12.2014

AutoCAD 2010 LT
AutoCAD 2014
AutoCAD 2018
AutoCAD MAP 3D 2017
Intel(R) Core(TM) i5-4570 CPU @ 3.20GhZ 3.20Ghz
16,00GB Ram
Windows 7- Prof. 64-Bit
ASUS EAH6450 Series

erstellt am: 26. Jun. 2018 10:45    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für michimueller85 10 Unities + Antwort hilfreich

Hallo,

da du Acad 2014 benutzt, könnte man noch eins versuchen.

Tausche "ACLYDICTIONARY" gegen "ACAD_LAYERFILTERS"

Vielleicht hilft das.
Grüße Silcono

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

michimueller85
Mitglied



Sehen Sie sich das Profil von michimueller85 an!   Senden Sie eine Private Message an michimueller85  Schreiben Sie einen Gästebucheintrag für michimueller85

Beiträge: 18
Registriert: 06.12.2010

erstellt am: 26. Jun. 2018 11:32    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


autocadbild.PNG


autocadbild3.PNG


layer_auslesen.dwg

 
Hallo Silcono,

also wenn ich das mache kommt sofort eine Fehlermeldung, ich hab gelesen das in neueren
Autocad Version glaube ab 2008 das ACLYDICTIONARY richtig wäre, daher würde es schon passen.
Also ich hab nun mal drei Gruppenfilter erstellt und in den zweiten Gruppenfilter einen Layer gelegt.
Dort wo der Layer liegt bleibt das Programm auch hängen. 

ich hab dir die Datei und zwei Screens angehängt.

vielleicht kannst du mir damit weiterhelfen 

Danke dir


Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

silcono
Mitglied
Planer


Sehen Sie sich das Profil von silcono an!   Senden Sie eine Private Message an silcono  Schreiben Sie einen Gästebucheintrag für silcono

Beiträge: 79
Registriert: 19.12.2014

AutoCAD 2010 LT
AutoCAD 2014
AutoCAD 2018
AutoCAD MAP 3D 2017
Intel(R) Core(TM) i5-4570 CPU @ 3.20GhZ 3.20Ghz
16,00GB Ram
Windows 7- Prof. 64-Bit
ASUS EAH6450 Series

erstellt am: 26. Jun. 2018 13:25    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für michimueller85 10 Unities + Antwort hilfreich

Hallo michi,

da habe ich wohl noch zu viel Code aus dem anderen übernommen. Probiers mal so:

Code:

Sub Layerfilterauslesen()

Dim strLayer As String
Dim objLayer As Variant
Dim dict As AcadDictionary
Dim TrackingDictionary As AcadDictionary, TrackingXRecord As AcadXRecord
Dim XRecordDataType As Variant, XRecordData As Variant
Dim ArraySize As Long, iCount As Long
Dim DataType As Integer, Data As String
Dim blnLayFilter As Boolean

Set dict = ThisDrawing.Layers.GetExtensionDictionary("ACLYDICTIONARY")
Set TrackingDictionary = dict

If dict.Count > 0 Then

    Open "C:\Users\michi\Desktop\Layerfilter.txt" For Output As #1
   
    For Each objLayer In dict
        Set TrackingXRecord = TrackingDictionary.GetObject(objLayer.Name)
        TrackingXRecord.GetXRecordData XRecordDataType, XRecordData
        ArraySize = UBound(XRecordDataType)
        DataType = XRecordDataType(2)
        Data = XRecordData(2)
        Debug.Print DataType; " : "; Data
        If DataType = 300 Then
            strLayer = strLayer & Data & ";"
        End If
    Next objLayer
End If
   
Print #1, strLayer & vbCr
Close #1

End Sub


Grüße
Silcono

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

michimueller85
Mitglied



Sehen Sie sich das Profil von michimueller85 an!   Senden Sie eine Private Message an michimueller85  Schreiben Sie einen Gästebucheintrag für michimueller85

Beiträge: 18
Registriert: 06.12.2010

erstellt am: 26. Jun. 2018 16:01    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Silcono,

vielen Dank läuft nun einwandfrei durch   , nur muss ich nun noch wissen welche Layer sich in den Layerfilter befinden. Hab ich vielleicht zu Anfangs schlecht beschrieben. Kann man das noch irgendwie einbauen?


Gruß

Michi

[Diese Nachricht wurde von michimueller85 am 26. Jun. 2018 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

silcono
Mitglied
Planer


Sehen Sie sich das Profil von silcono an!   Senden Sie eine Private Message an silcono  Schreiben Sie einen Gästebucheintrag für silcono

Beiträge: 79
Registriert: 19.12.2014

AutoCAD 2010 LT
AutoCAD 2014
AutoCAD 2018
AutoCAD MAP 3D 2017
Intel(R) Core(TM) i5-4570 CPU @ 3.20GhZ 3.20Ghz
16,00GB Ram
Windows 7- Prof. 64-Bit
ASUS EAH6450 Series

erstellt am: 27. Jun. 2018 11:23    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für michimueller85 10 Unities + Antwort hilfreich

Hi Michi,

leider konnte ich bisher keine Lösung für deine Frage finden, werde aber am Ball bleiben.

Vielleicht meldet sich ja noch jemand zu Wort.

Grüße
Silcono 

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

michimueller85
Mitglied



Sehen Sie sich das Profil von michimueller85 an!   Senden Sie eine Private Message an michimueller85  Schreiben Sie einen Gästebucheintrag für michimueller85

Beiträge: 18
Registriert: 06.12.2010

erstellt am: 28. Jun. 2018 01:34    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Silcono,

vielen dank für deine Mühen, ich hab auch nochmal den ganzen Tag damit verbracht eine Lösung zu finden, aber ohne Erfolg. 
Hat noch irgendjemand eine Idee wie ich die Layer aus einen Gruppenfilter auslesen kann?

Danke euch 

Gruß

Michi

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

cadffm
Ehrenmitglied V.I.P. h.c.
良い精神



Sehen Sie sich das Profil von cadffm an!   Senden Sie eine Private Message an cadffm  Schreiben Sie einen Gästebucheintrag für cadffm

Beiträge: 18312
Registriert: 03.06.2002

System: F1
und Google

erstellt am: 28. Jun. 2018 02:55    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für michimueller85 10 Unities + Antwort hilfreich

Schau dir mal die erweiterten Daten eines Layers an welcher in deinem Layergruppenfilter steckt.
Am besten neue Datei, ein Layer, ein Gruppenfilter welcher den Layer enthält.
So kannst du gut den Daten folgen.

Hoffe ich schicke dich nicht falsch, ich sitze gerade nicht am Acad.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

michimueller85
Mitglied



Sehen Sie sich das Profil von michimueller85 an!   Senden Sie eine Private Message an michimueller85  Schreiben Sie einen Gästebucheintrag für michimueller85

Beiträge: 18
Registriert: 06.12.2010

erstellt am: 28. Jun. 2018 10:49    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


autocad.PNG

 
hallo cadffm,

danke für deine Antwort! wie komme ich denn zu den erweiterten Daten eines Layers?
wenn ich mir mit VBA einen Layer anschaue gehe ich immer folgend vor:

dim objLayer as ACADLayer
dim layer_name as variant

for each objLayer in ThisDrawing.layers

layer_name= objLayer.name

nun kann ich im VBA Lokalfenster guggen was der Layer alles für Informationen enhält.
Es es befindet sich dort keine Information welchem Gruppenfilter der Layer zugeordnet ist.

anbei bei Auszug von Autocad mit den Layerinformationen.

Gruß

Michi

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

silcono
Mitglied
Planer


Sehen Sie sich das Profil von silcono an!   Senden Sie eine Private Message an silcono  Schreiben Sie einen Gästebucheintrag für silcono

Beiträge: 79
Registriert: 19.12.2014

AutoCAD 2010 LT
AutoCAD 2014
AutoCAD 2018
AutoCAD MAP 3D 2017
Intel(R) Core(TM) i5-4570 CPU @ 3.20GhZ 3.20Ghz
16,00GB Ram
Windows 7- Prof. 64-Bit
ASUS EAH6450 Series

erstellt am: 28. Jun. 2018 10:56    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für michimueller85 10 Unities + Antwort hilfreich

Hallo Michi,

ich glaube cadffm meint es andersrum.

Die erweiterten Daten für den Layer innerhalb der Daten des Gruppenfilters.
Bisher habe ich rausgefunden, dass der XRecordDataType '330' sich auf einen Layer im Gruppenfilter bezieht.

Nun muss man schauen, wie man weiter vorgeht.

Grüße Silcono

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

michimueller85
Mitglied



Sehen Sie sich das Profil von michimueller85 an!   Senden Sie eine Private Message an michimueller85  Schreiben Sie einen Gästebucheintrag für michimueller85

Beiträge: 18
Registriert: 06.12.2010

erstellt am: 28. Jun. 2018 11:16    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


layer.PNG

 
Hallo Silcono,

ah ok alles klar hab ich verstanden.
ich hab da auch schon bisschen rumgespielt, immer wenn ich einen Layer zu dem Gruppenfilter hinzufüge,
kommt so ein XRecordData hinzu.
Aber dort stehen nur irgendwelche Zahlen drin?! 

anbei nochmal ein Auszug von den XRecordData (zwei Layer befinden sich in dem Gruppenfilter1)

Gruß

Michi

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

silcono
Mitglied
Planer


Sehen Sie sich das Profil von silcono an!   Senden Sie eine Private Message an silcono  Schreiben Sie einen Gästebucheintrag für silcono

Beiträge: 79
Registriert: 19.12.2014

AutoCAD 2010 LT
AutoCAD 2014
AutoCAD 2018
AutoCAD MAP 3D 2017
Intel(R) Core(TM) i5-4570 CPU @ 3.20GhZ 3.20Ghz
16,00GB Ram
Windows 7- Prof. 64-Bit
ASUS EAH6450 Series

erstellt am: 28. Jun. 2018 11:25    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für michimueller85 10 Unities + Antwort hilfreich

Richtig Michi,

da bin ich nun auch und versuch noch rauszufinden, wie man zum Layernamen kommt.
Vielleicht meldet sich aber noch jemand zu Wort, der einen Weg kennt 

Grüße Silcono

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

michimueller85
Mitglied



Sehen Sie sich das Profil von michimueller85 an!   Senden Sie eine Private Message an michimueller85  Schreiben Sie einen Gästebucheintrag für michimueller85

Beiträge: 18
Registriert: 06.12.2010

erstellt am: 01. Jul. 2018 05:55    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo CAD-Freunde,

kann keiner weiterhelfen? ich komme einfach nicht weiter 

Gruß

Michi

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

rexxitall
Mitglied
Dipl. -Ing. Bau


Sehen Sie sich das Profil von rexxitall an!   Senden Sie eine Private Message an rexxitall  Schreiben Sie einen Gästebucheintrag für rexxitall

Beiträge: 211
Registriert: 07.06.2013

Various: systems, Operating systems, cad systems, cad versions, programming languages.

erstellt am: 02. Jul. 2018 10:30    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für michimueller85 10 Unities + Antwort hilfreich

Könnte es vielleicht sein, das der ominöse Zahlenverhau die ObjektID des Layers angibt ? Autocad kennt 2 Wege ein Objekt zu addressieren HANDLES (hex String) und die ObjektID ein LONG Word. Nur so mal als Idee in den raum gewürfelt ohne es zu testen.
Lieben Gruß aus Finnland

------------------
Wer es nicht versucht, hat schon verlorn 
Und bei 3 Typos gibts den vierten gratis !
<<< for sale !

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Brischke
Ehrenmitglied V.I.P. h.c.
CAD on demand GmbH



Sehen Sie sich das Profil von Brischke an!   Senden Sie eine Private Message an Brischke  Schreiben Sie einen Gästebucheintrag für Brischke

Beiträge: 4086
Registriert: 17.05.2001

ACAD20XX, defun-tools

erstellt am: 02. Jul. 2018 12:04    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für michimueller85 10 Unities + Antwort hilfreich

Hallo,
da ich das ganze Thema in c#.Net bereits gelöst habe, ff Hinweise zum Aufbau, wie die Layerfilter in einer Zeichnung gespeichert sind.

In der Zeichnungsdatenbank (Database) gibt es die Eigenschaft LayerFilters
Dort musst du auf die Root-Eigenschaft zugreifen, Das ist der Einstiegsfilter unter dem alle anderen verschachtelt sind.
Die verschachtelten Elemente dieses Root-Laxyerfilters können Eigenschaftenfilter oder Gruppenfilter sein.
Da du die Verschachtelungstiefe nicht kennst, solltest du die Funktion zum Auslesen des Inhalts eines Filters als rekursiv arbeitende Funktion gestalten.

Hast du einen Gruppenfilter gefunden (was du anhand des Objekttypes ermitteln kannst) besitz dieser die Eigenschaft: LayerIds
Darin enthalten ist eine LayerCollection, die eine Liste der ObjektId's der LayertableRecords, also der Layer, beinhaltet. Darüber hast du also Zugriff auf die Layer, von denen du dann eben auch alle Eigenschaften (Name, Farbe, Linientyp ...) ermitteln kannst.

Falls du nur auslesen möchtest ist das folgende nicht wichtig, ich möchte es dennoch nicht vorenthalten. Namen der Layerfilter müssen eindeutig sein. Erzeugt man Layerfilter im Programm, dann muss diese Prüfung im Code erfolgen. AutoCAD meckert nicht, wenn ein neuer Layerfilter den Namen eines bereits existierenden Filters zugewiesen bekommt. Dieser wird auch im AutoCAD angezeigt. ABER: Wählt man diesen im AutoCAD aus, so wird immer der zuerst angelegte namensgleiche Filter ausgeführt, egal welche Eigenschaften oder Filter tatsächlich definiert sind. Möchte man dennoch namensgleiche Filter anlegen, muss man mit unsichtbaren Zeichen im Namen arbeiten, die den Namen dann eindeutig machen.

Grüße!
Holger

------------------
Holger Brischke
CAD on demand GmbH
Individuelle Lösungen von Heute auf Morgen.


defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!


Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

silcono
Mitglied
Planer


Sehen Sie sich das Profil von silcono an!   Senden Sie eine Private Message an silcono  Schreiben Sie einen Gästebucheintrag für silcono

Beiträge: 79
Registriert: 19.12.2014

AutoCAD 2010 LT
AutoCAD 2014
AutoCAD 2018
AutoCAD MAP 3D 2017
Intel(R) Core(TM) i5-4570 CPU @ 3.20GhZ 3.20Ghz
16,00GB Ram
Windows 7- Prof. 64-Bit
ASUS EAH6450 Series

erstellt am: 02. Jul. 2018 13:58    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für michimueller85 10 Unities + Antwort hilfreich

Hi Michi,

vielleicht kannst du aus Holger's Beitrag auch noch etwas mitnehmen. Ich wird mir seinen Beitrag direkt mal ausdrucken und wo ablegen :P

Aber noch was anderes. Mittlerweile habe ich ex hinbekommen, alle Gruppenfilter mit ihren ersten genannten Layer auszugeben und das ganze so:

Code:

Sub Layerfilterauslesen()

Dim strFilter As String
Dim strLayer As String
Dim objFilter As Variant
Dim dict As AcadDictionary
Dim TrackingDictionary As AcadDictionary, TrackingXRecord As AcadXRecord
Dim XRecordDataType As Variant, xRecordData As Variant
Dim ArraySize As Long ', iCount As Long
Dim DataType As Integer, Data As String
Dim blnLayFilter As Boolean
Dim objLayer As AcadLayer
Dim DataLayer As String


Set dict = ThisDrawing.Layers.GetExtensionDictionary("ACLYDICTIONARY")
Set TrackingDictionary = dict

If dict.Count > 0 Then

    Open "C:\Users\NAME\Desktop\Layerfilter.txt" For Output As #1
   

On Error Resume Next
    For Each objFilter In dict
      Set TrackingXRecord = TrackingDictionary.GetObject(objFilter.Name)
        TrackingXRecord.GetXRecordData XRecordDataType, xRecordData
        DataType = XRecordDataType(3)
        Data = xRecordData(2)
        DataLayer = xRecordData(3)(0)
        Set objLayer = ThisDrawing.ObjectIdToObject(DataLayer)

                If DataType = 330 Then
                    strFilter = strFilter & Data & ":  " & objLayer.Name & ";" & vbCrLf
                End If

    Next objFilter
End If
   
Print #1, strFilter
Close #1

End Sub


jetzt bin ich gerade noch dabei, das ganze so umzuschreiben, das es alle Layer in einem Gruppenfilter ausgibt.

Grüße Silcono

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

michimueller85
Mitglied



Sehen Sie sich das Profil von michimueller85 an!   Senden Sie eine Private Message an michimueller85  Schreiben Sie einen Gästebucheintrag für michimueller85

Beiträge: 18
Registriert: 06.12.2010

erstellt am: 03. Jul. 2018 06:50    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Holger,

vielen Dank für deine Mithilfe, ich hab verstanden was du meinst aber um das umzusetzen fehlen mir viel zu viele tiefere Informationen wie ich auf Root usw. zugreifen kann. Ich bin leider kein Programmierer, ich wurstel immer nur bisschen im VBA rum.   
könntest du mir ein bisschen VBA Code zu Verfügung stellen, dann könnte ich es zugleich nachvollziehen und versuchen zu verstehen?! 

Hallo Silcono,

also ich hab deinen Code mal ausprobiert.
Leider funktioniert er bei mir nicht 
Mit DataLayer = xRecordData(3)(0) hab ich verstanden das du die LayerID ermitteln willst. Ich hab das mal im Debugger beobachtet dort wird bei mir für  -1266639904 bei xRecordData(3)(0) eingetragen.
Aber ich glaube mit dieser Zahl handelt es sich nicht um eine ObjectID von dem Layer. Du kannst ja einfach mal deine Layer abfragen:
mit:

dim objlayer as acadlayer
For Each objlayer in thisdrawing.layers
    objlayer.objectid
next

leider hat keine ID mit dem Inhalt von xRecordData(3)(0) übereingestimmt. Auch war die objlayer.objectid viel länger (15 Stellen) als die aus xRecordData(3)(0).

Vielleicht kann Holger was erkennen 

Danke dir

Gruß

Michi

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

silcono
Mitglied
Planer


Sehen Sie sich das Profil von silcono an!   Senden Sie eine Private Message an silcono  Schreiben Sie einen Gästebucheintrag für silcono

Beiträge: 79
Registriert: 19.12.2014

AutoCAD 2010 LT
AutoCAD 2014
AutoCAD 2018
AutoCAD MAP 3D 2017
Intel(R) Core(TM) i5-4570 CPU @ 3.20GhZ 3.20Ghz
16,00GB Ram
Windows 7- Prof. 64-Bit
ASUS EAH6450 Series

erstellt am: 03. Jul. 2018 07:02    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für michimueller85 10 Unities + Antwort hilfreich

Hallo michi,

also bei mir hat es funktioniert.
Ich bekomme in die Textdatei die Gruppenfilter und die ersten Layer der Gruppenfilter genannt.
Bei der Ausführung des Makros muss man auch darauf achten, dass kein Gruppenfilter selektiert ist, sondern "Alle".

Vielleicht schickst du mir mal deine Test-DWG, vielleicht ist diese anders aufgebaut.

Grüße
Silcono

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

michimueller85
Mitglied



Sehen Sie sich das Profil von michimueller85 an!   Senden Sie eine Private Message an michimueller85  Schreiben Sie einen Gästebucheintrag für michimueller85

Beiträge: 18
Registriert: 06.12.2010

erstellt am: 03. Jul. 2018 08:09    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


layer_filter.PNG


layer_filter_object_ID_layer_gruppe2.PNG


layer_auslesen.dwg

 
Hallo Silcono,

ok sehr merkwürdig, anbei die meine Test DWG Datei und nochmal zwei Bilder. Auf dem einen Bild ein Debug Auszug von dem zweiten Gruppenfilter mit den Record IDS. Auf dem anderen Bild wird die richtige Object id von dem Layer in Gruppe 2 angezeigt.
Ich hab das direkt mit einem AutoCAD Datenbank-Tool ausgelesen.

Gruß

Michi

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Brischke
Ehrenmitglied V.I.P. h.c.
CAD on demand GmbH



Sehen Sie sich das Profil von Brischke an!   Senden Sie eine Private Message an Brischke  Schreiben Sie einen Gästebucheintrag für Brischke

Beiträge: 4086
Registriert: 17.05.2001

ACAD20XX, defun-tools

erstellt am: 03. Jul. 2018 12:35    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für michimueller85 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von michimueller85:
... könntest du mir ein bisschen VBA Code zu Verfügung stellen, dann könnte ich es zugleich nachvollziehen und versuchen zu verstehen?! 


.. nein, weil wie gesagt, ich arbeite mit c#.Net und nicht VBA.

Grüße!
Holger

------------------
Holger Brischke
CAD on demand GmbH
Individuelle Lösungen von Heute auf Morgen.


defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!


Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

michimueller85
Mitglied



Sehen Sie sich das Profil von michimueller85 an!   Senden Sie eine Private Message an michimueller85  Schreiben Sie einen Gästebucheintrag für michimueller85

Beiträge: 18
Registriert: 06.12.2010

erstellt am: 05. Jul. 2018 04:17    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Holger,

ok alles klar, könnest du mir den c#.Net Code zur Verfügung stellen vielleicht kann ich mir etwas daraus ableiten 
Ich hatte im Studium mal C++ vielleicht komm ich noch damit zurecht.

@Silcono,

bist du weitergekommen? bzw. konntest du mit meiner DWG Datei was anfangen.

Gruß

Michi

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

silcono
Mitglied
Planer


Sehen Sie sich das Profil von silcono an!   Senden Sie eine Private Message an silcono  Schreiben Sie einen Gästebucheintrag für silcono

Beiträge: 79
Registriert: 19.12.2014

AutoCAD 2010 LT
AutoCAD 2014
AutoCAD 2018
AutoCAD MAP 3D 2017
Intel(R) Core(TM) i5-4570 CPU @ 3.20GhZ 3.20Ghz
16,00GB Ram
Windows 7- Prof. 64-Bit
ASUS EAH6450 Series

erstellt am: 06. Jul. 2018 08:33    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für michimueller85 10 Unities + Antwort hilfreich

Hallo Michi,

also weitergekommen nicht direkt. Das Auslesen von Layerfilter und Layer funktioniert, aber bisher nur einzeln.

Bzgl. deiner Zeichnung habe ich kein Problem gehabt, da hat das Programm die Layerfilter ohne Probleme ausgelesen.

Grüße Silcono

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

silcono
Mitglied
Planer


Sehen Sie sich das Profil von silcono an!   Senden Sie eine Private Message an silcono  Schreiben Sie einen Gästebucheintrag für silcono

Beiträge: 79
Registriert: 19.12.2014

AutoCAD 2010 LT
AutoCAD 2014
AutoCAD 2018
AutoCAD MAP 3D 2017
Intel(R) Core(TM) i5-4570 CPU @ 3.20GhZ 3.20Ghz
16,00GB Ram
Windows 7- Prof. 64-Bit
ASUS EAH6450 Series

erstellt am: 06. Jul. 2018 09:45    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für michimueller85 10 Unities + Antwort hilfreich


Layerfilter-txt.jpg


Layermanager.jpg

 
Hallo Michi,

also ich hab jetzt noch ein bisschen rumgetüfftelt und siehe da, es funktioniert  

Probier mal den folgenden Code bei dir aus und achte darauf, dass du im Layermanager "ALLE" selektiert hast:

Code:

Sub readfilter()

        Dim oDict As AcadDictionary
        Dim TrackingoDict As AcadDictionary
       
        Dim LayFlt As Variant
        Dim oXrec As AcadXRecord
        Dim strLayer As String
        Dim objLayer As AcadLayer
        Dim DataLayer As String
        Dim ArraySize As Long

        Set oDict = ThisDrawing.Layers.GetExtensionDictionary("ACLYDICTIONARY")
        Set TrackingoDict = oDict
       
        Open "C:\Users\NAME\Desktop\Layerfilter.txt" For Output As #1
       
On Error Resume Next
    For Each LayFlt In oDict
   
            Set oXrec = TrackingoDict.GetObject(LayFlt.Name)
            oXrec.GetXRecordData xtype, XValue
           
            strFilter = XValue(2)
            ArraySize = UBound(XValue)
            Print #1, strFilter
           
            strFilter = ""
                      
        'On Error Resume Next
        For i = 3 To ArraySize
            DataLayer = XValue(i)(0)
            Set objLayer = ThisDrawing.ObjectIdToObject(DataLayer)
            strLayer = objLayer.Name & ";" & vbCrLf
           
            Print #1, strLayer
           
            strLayer = ""
        Next

    Next LayFlt
Close #1

End Sub


Anbei findest du noch meine Ergebnisse->

Grüße Silcono

[Diese Nachricht wurde von silcono am 06. Jul. 2018 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2018 CAD.de | Impressum | Datenschutz