Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  AutoCAD VBA
  Referenzen eines Blocks ermitteln

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
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Referenzen eines Blocks ermitteln (440 / mal gelesen)
BerryB
Mitglied


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

Beiträge: 3
Registriert: 29.03.2015

erstellt am: 13. Dez. 2021 12:31    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 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




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

Beiträge: 13508
Registriert: 30.11.2003

ACAD 2008 Mechanical

erstellt am: 13. Dez. 2021 13:08    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 BerryB 10 Unities + Antwort hilfreich

via activX kann man IMHO von der Blockdefinition nicht direkt auf die Referenzen zu greifen ( in Lisp gibt es eine Möglichkeit sich durchzuhangeln )

Attribute bekommst du mittels der Methode GetAttributes der Blockreferenz, die Kenntnis des übergeordneten Eigentümers ist dafür nicht erforderlich ... den bekommst du aber über die Property OwnerID und die Umwandlung der ID mittels der Methode ObjectIdToObject ....

------------------
Also ich finde Unities gut ... und andere sicher auch
---------------------------------------
  - Thomas -          
"Bei 99% aller Probleme ist die umfassende Beschreibung des Problems bereits mehr als die Hälfte der Lösung desselben."

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



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: 2624
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 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 BerryB 10 Unities + Antwort hilfreich

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 Variant

For 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.
良い精神



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: 21533
Registriert: 03.06.2002

System: F1
und Google

erstellt am: 13. Dez. 2021 22:10    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 BerryB 10 Unities + Antwort hilfreich

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



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: 2624
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 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 BerryB 10 Unities + Antwort hilfreich

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


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: 266
Registriert: 07.06.2013

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

erstellt am: 17. Dez. 2021 00: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 BerryB 10 Unities + Antwort hilfreich

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


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: 266
Registriert: 07.06.2013

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

erstellt am: 23. Mrz. 2022 12:53    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 BerryB 10 Unities + Antwort hilfreich

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

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)2023 CAD.de | Impressum | Datenschutz