| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY wird von NVIDIA zum Händler des Jahres gewählt – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: Referenzen eines Blocks ermitteln (578 / mal gelesen)
|
BerryB Mitglied
Beiträge: 3 Registriert: 29.03.2015
|
erstellt am: 13. Dez. 2021 12:31 <-- editieren / zitieren --> Unities abgeben:
Hallo Leute, ich versuche auf alle Referenzen einer Blockdefinition zuzugreifen. Diese befinden sich vor allem auf den Layouts. Ich möchte die Attribute dann auslesen und ändern. Dazu brauche ich auch die Info, auf welchem Layout/Modelspace sich die Blockreferenz befindet. Die Variante, alle Layouts zu aktivieren und dann alle Objekte druchzulaufen, halte ich für zeitintensiv und unpraktisch. Gibt es eine sinnvollere Variante z.B. über die Blockdefinitionen (ACAD.Blocks)? Diesen Artikel https://ww3.cad.de/foren/ubb/Forum259/HTML/002246.shtml habe ich schon gelesen. Da gibt es einen Hinweis Blockdefinition -> Referenzen. Da steht aber nicht, wie das funktioniert. Gruß Berry Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CADmium Moderator Maschinenbaukonstrukteur
Beiträge: 13529 Registriert: 30.11.2003 ACAD 2008 Mechanical
|
erstellt am: 13. Dez. 2021 13:08 <-- editieren / zitieren --> Unities abgeben: Nur für BerryB
|
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2812 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 13. Dez. 2021 18:22 <-- editieren / zitieren --> Unities abgeben: Nur für BerryB
Zitat: Original erstellt von BerryB: ... ich versuche auf alle Referenzen einer Blockdefinition zuzugreifen ... Die Variante, alle Layouts zu aktivieren und dann alle Objekte durchzulaufen, halte ich für zeitintensiv und unpraktisch.
Hallo Berry, Ist doch die Frage wie Du das Durchlaufen gestaltest. Zum reinen Durchlaufen mußt Du ja nicht mal das Layout aktivieren Code:
Dim lay As AcadLayout Dim oBlockRef As AcadBlockReference Dim varAttributes As VariantFor Each lay In ThisDrawing.Layouts If lay.Name = "Model" Then ' skip falls der Modellbereich nicht untersucht werden soll Else For Each entity In lay.Block If TypeOf entity Is AcadBlockReference Then Set oBlockRef = entity If oBlockRef.Name = "myBlockname" Then If oBlockRef.HasAttributes Then varAttributes = oBlockRef.GetAttributes For L = LBound(varAttributes) To UBound(varAttributes) If varAttributes(L).TagString = "SUCHNAME" Then _ varAttributes(L).TextString = lay.Name ' oder was Du möchtest ' .... Next L End If ' HasAttributes End If ' entity.name = "myBlockname" then End If ' TypeOf Next entity End If ' lay.name Next lay
Alternative: Layout aktivieren und SelectionSet mit dem Namen der BlockReference Dann hast Du schon mal nur die gesuchten .. (Könnte aber je nach Layoutgestaltung wirklich lange brauchen bis das Regenerieren abgeschlossen ist) Grüße Klaus
[Diese Nachricht wurde von KlaK am 13. Dez. 2021 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 22298 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 13. Dez. 2021 22:10 <-- editieren / zitieren --> Unities abgeben: Nur für BerryB
Zu dem Alternativen Weg, wenn ich nicht wieder über VBA Besonderheiten stolpere dabei, braucht man auch keine Layouts aktiv setzen und wo die Referenzen platziert sind bekommt man auch von der Referenz heraus. Aber: Nur für normale Blöcke. Den Auswahlsatz kannst du nur für Referenzen des eigentlichen Blockes erstellen, das Filtern geht nicht für dynamische Ableitungen - die haben ihre eigene Blockdefinition(mit anderem Blocknamen) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2812 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 14. Dez. 2021 13:21 <-- editieren / zitieren --> Unities abgeben: Nur für BerryB
Im Prinzip hast Du schon recht, wenn man einen Selectionset mit acSelectionSetAll macht bekommt man alle Blockreferencen auf allen Layouts. Aber mir ist keine Möglichkeit in VBA bekannt, wie ich herausbekomme ob sich das Element im Modellbereich oder in welchem Layout befindet. Habe ich noch nicht gebraucht und auch jetzt keinen direkten Zugriff vom Selectionset.item auf das Layouts-Element gesehen. Grüße Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rexxitall Mitglied Dipl. -Ing. Bau
Beiträge: 270 Registriert: 07.06.2013 Various: systems, Operating systems, cad systems, cad versions, programming languages.
|
erstellt am: 17. Dez. 2021 00:58 <-- editieren / zitieren --> Unities abgeben: Nur für BerryB
Layouts und Co sind auch nur Blöcke. Ob ein Block ein Layout ist dafür gibt es im Blockapi eine Eigenschaft isLayout. Nun kann man einmal über alle Blöcke und alle Entities in diesen laufen. So Blockref ist ja auch nur ein Entity(Wesen). Wenn diese dynamisch ist - auch dafür gibt es diesmal bei der Blockref eine Eigenschaft isdynamicBlock. So dies der Fall ist bekommt man den zugehörigen *Ursprungsblock* mit blockref.effective Name heraus. Also ist der Algo wie folgt: Wandere durch alle Blöcke die ein Layout sind. Wandere dort REKURSIV durch alle Entitys. Sprich wenn Blockref dann zugehörigen Block aufrufen und dort wieder alle Entitys durchlaufen usw. Das machen bis keine Blockrefs mehr enthalten sind (Rekursionsabbruchskriterium). OBACHT: Für diese Blocknamen aber blockref.name verwenden, wir laufen auch durch die automatischen dynamischen Blockkopien (*UNummer). Wenn man nun clever ist, hat man sich vorher ein SCRIPTING.DICTIONARY (siehe VBS) angelegt (Gibt es im Betriebssystem bei den VBS Bibliotheken (Im Projekt Referenz anlegen nicht vergessen)). Nun kann man je nach Geschmack z.b. Den blockref.effektivenname oder den Layoutblocknamen als Schlüssel verwenden um Listen für diese Blöcke zu erstellen. (Das gemeine Handle ist dein Kumpel um später darauf zuzugreifen) Z.B.bei einem Key Blockname - Einträge wie Blockref.handle Leerzeichen LayoutName vblf. Wer mag sortiert das denn auch noch hinterher. So bekommt man schöne Listen welcher Block sich wo befindet. Selectionsets kann man bei so etwas nicht gebrauchen. Die sind zu unflexibel Und das ganze ist auch noch recht flott. Auch wenn es wirklich durch die gesamte Zeichnung hechelt. ------------------ Wer es nicht versucht, hat schon verlorn Und bei 3 Typos gibts den vierten gratis ! <<< not for sale ! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rexxitall Mitglied Dipl. -Ing. Bau
Beiträge: 270 Registriert: 07.06.2013 Various: systems, Operating systems, cad systems, cad versions, programming languages.
|
erstellt am: 23. Mrz. 2022 12:53 <-- editieren / zitieren --> Unities abgeben: Nur für BerryB
Für einfache Fälle reicht die entity.Ownerid. Die verweist ja auf den Eigentümer sprich Block. Wenn man dessen Namen kennt kann man auch herausfinden ob es ein Layoutblock ist. Bei geschachtelten Blöcken wird es dann wieder komplex. ------------------ Wer es nicht versucht, hat schon verlorn Und bei 3 Typos gibts den vierten gratis ! <<< not for sale ! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |