Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  AutoCAD VBA
  Koordinaten von BlockObjekten 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
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Koordinaten von BlockObjekten auslesen (1253 mal gelesen)
Parsifal
Mitglied



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

Beiträge: 12
Registriert: 06.04.2020

erstellt am: 22. Apr. 2020 18:07    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


Visio1.JPG

 
Hallo zusammen 

Ich bin recht neu in AutoCad und VBA und möchte von Objekten, die ich in AutoCad zeichne, die Koordinaten auslesen können. Leider klappt der Zugriff darauf nicht richtig  . Was ich bereits geschafft habe, ist den Layer oder auch den Objektnamen auszulesen. Ich habe bereits in einem anderen Beitrag gefunden, dass man eine Variable definieren soll als:

Dim blockref As AcadBlockReference

und im Anschluss dann diese "blockref" als einen entity setzt.

Set blockref = entity

Leider weiß ich nicht, was dieser 'entity' sein soll, da dieser Eintrag bei mir als solches nicht verfügbar ist. Ich bekomme in Folge dann den 'Laufzeitfehler 424 - Objekt erforderlich'. Weiß jemand wie ich auf die Koordinaten der Objekte zugreifen kann, bzw. was an meinem Code falsch ist?


Danke vorab und liebe Grüße


P.S. Hier der Code und noch ein Bild von meiner Arbeitsoberfläche:

Private Sub CommandButton1_Click()

Dim j As Integer
Dim x As Integer

Dim Objekt(0 To 2)


UserForm1.Hide


Dim startpt(0 To 2) As Double

'startpt(0) = 0: startpt(1) = 0: startpt(2) = 0
'endpt = ThisDrawing.Utility.GetPoint(, "Wähle Endpunkt: ")

'ThisDrawing.ModelSpace.AddLine startpt, endpt

        Dim blockref As AcadBlockReference
        Set blockref = entity

Set allblocks = ThisDrawing.Blocks

x = ThisDrawing.ModelSpace.Count

For j = 0 To x - 1

Objekt(0) = ThisDrawing.ModelSpace.Item(j).ObjectName
Objekt(1) = ThisDrawing.ModelSpace.Item(j).Layer
Objekt(2) = ThisDrawing.ModelSpace.Item(j).Layer


        koord = blockref.InsertionPoint

ListBox1.AddItem Objekt(0)
ListBox1.AddItem Objekt(1)
ListBox1.AddItem Objekt(2)

ListBox1.AddItem koord(0)

ListBox1.AddItem


Next

UserForm1.Show


End Sub

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: 4171
Registriert: 17.05.2001

ACAD20XX, defun-tools

erstellt am: 22. Apr. 2020 19:07    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 Parsifal 10 Unities + Antwort hilfreich

Hallo Parsifal,

kennst du dich in AutoCAD grundsätzlich aus? (Hast du schon etwas gezeichnet und kennst Blöcke und die anderen Elementtypen und Möglichkeiten der Interaktion mit den Elementen in der Zeichnung?)

Falls du die Frage mit Nein beantwortest, dann wird's schwierig. Das Objektmodell ist in der AutoCAD-VBA-Hilfe recht gut beschrieben - wenn man aber so gar keine Erfahrung mit AutoCAD hat, dann ist auch diese schwer zu verstehen.

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

Parsifal
Mitglied



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

Beiträge: 12
Registriert: 06.04.2020

erstellt am: 23. Apr. 2020 10:39    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!

Also das Zeichnen an sich ist kein großes Problem für mich - allgemein kenne ich mich mit CAD aus. Ich habe auch schon ein paar Blockelemente mit VBA gezeichnet.

Es ging mir jetzt nur darum, auf die Koordinaten der händisch gezeichneten Blockelemente zugreifen zu können - die man auch im "Eigenschaften - Fenster" auf der linken Seite sieht wenn man ein Element anklickt.
Was der Code ansich machen soll ist mir soweit klar.

Mein Fehler muss in der eingerückten Zeile liegen, da ich nicht weiß, welcher Eintrag für den Platzhalter 'entity' stehen muss.

  Dim blockref As AcadBlockReference
      Set blockref = entity
  koord = blockref.InsertionPoint

Oder dieser Ansatz ist nunmal falsch. Ich habe bisher noch keine Koordinaten ausgelesen mit VBA.

Gruß Parsifal

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: 4171
Registriert: 17.05.2001

ACAD20XX, defun-tools

erstellt am: 23. Apr. 2020 11: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 Parsifal 10 Unities + Antwort hilfreich

alle AutoCAD-Elemente (Linien/Bögen/.../Blockreferenzen) erben vom Object Entity.
Das Entity (in deinem Fall die Blockreferenz musst du erst einmal ermitteln. Anscheinend willst du das Objekt am Bildschirm wählen. Dies fehlt in deinem Code! In VBA gibt's sicher irgendwo eine Funktion die Entsel oder GetEntity (oder irgendwie in diese Richtung) heißt. Die gibt dann u.a. auch das gewählte Objekt (ein Entity) zurück und wenn du eine Blockreferenz gewählt hast, dann kannst dieses Entity in eine Blockreferenz casten und von dieser dann die Position abfragen.

Soweit klar? (ich programmiere nicht mit VBA - weshalb ich nur den Weg beschreibe, der in den verschiedenen API's aber doch immer irgendwie gleich ist)

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

Parsifal
Mitglied



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

Beiträge: 12
Registriert: 06.04.2020

erstellt am: 23. Apr. 2020 11: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

Hallo Holger!

Danke für den Denkanstoß. Jetzt habe ich verstanden wo der Haken ist bei dem ganzen 
Ich probiere das gleich mal aus und melde mich, wenn ich die richtige Lösung gefunden habe

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: 23. Apr. 2020 14:28    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 Parsifal 10 Unities + Antwort hilfreich

Hallo Parsifal,

Ich weiß ja nicht voher Du den Code hast aber hier scheint es ja (noch) am prinzipiellen Verständnis der Blöcke zu liegen.
Zum anderen ist mir nicht klar was Du eigentlich machen möchtest, alle Koordinaten aller Zeichenelemente ausgeben?
Aber egal.

Du hast eine eine Zeile im Sub mit "Set allblocks = ThisDrawing.Blocks"
Hier greifst Du auf die Definitionen der Blöcke zu (Zeichnungsdarstellung der BlockReferenzen)
Für das Auslesen der Koordinaten brauchst Du das nicht, außer Du willst bei einem bestimmten Block noch irgendwelche Detailangaben bekommen

Danach durchsuchst Du die Zeichnung (ModelSpace), hast aber keinerlei Abfragen um welchen Elementtyp es sich dabei handelt. Dies wäre aber erforderlich da die Einfügepunkte immer anders lauten.
- StartPoint, EndPoint bei Linien
- CirclePoint bei Kreisen
- InsertionPoint bei Texten, Blöcken
- Coordinates bei Polylinien (mit 2 XY- oder 3 XYZ- Werten je nach Typ)

Du brauchst also eine Unterscheidung nach den Elementen (entities). Ich mache das meist über den ObjectName
Für Dein Beispiel könnte es also z.B. so gehen:

Code:

Private Sub CommandButton1_Click()
  Dim j As Integer
  Dim x As Integer

  Dim Objekt(0 To 2)
  Dim startpt(0 To 2) As Double
  Dim Entity As AcadObject
  Dim koord As Variant
  Dim blockref As AcadBlockReference

  UserForm1.Hide
  x = ThisDrawing.ModelSpace.Count
  For j = 0 To x - 1
    ' Der einfachheit halber könnte man hier das Element zuweisen
    Set Entity = ThisDrawing.ModelSpace.Item(j)  ' Allgemeines Acad Objekt
    Objekt(0) = ThisDrawing.ModelSpace.Item(j).ObjectName
    Objekt(1) = ThisDrawing.ModelSpace.Item(j).Layer
    Objekt(2) = ThisDrawing.ModelSpace.Item(j).Layer
    ListBox1.AddItem Objekt(0)
    ListBox1.AddItem Objekt(1)
    ListBox1.AddItem Objekt(2)
    ' In Objekt(0) steht bereits der ObjectName deshalb muß er nicht extra bestimmt werden
    Select Case Objekt(0)  ' oder Entity.ObjectName
      Case "AcDbBlockReference":
                        Set blockref = Entity
                        koord = blockref.InsertionPoint
                        ListBox1.AddItem koord(0)
                        ListBox1.AddItem koord(1)
      Case "AcDbLine":  ' Hier Code für Linie
    End Select
    ListBox1.AddItem
  Next
  UserForm1.show
End Sub


Grüße
Klaus 

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