Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  AutoCAD VBA
  Koordinaten von Linien usw. in Blöcken 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
  
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 Linien usw. in Blöcken mit VBA auslesen (8767 mal gelesen)
Siegi1
Mitglied


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

Beiträge: 9
Registriert: 15.03.2005

ACAD Map5, Windows XP Prof. ACAD VBA

erstellt am: 01. Feb. 2006 12:12    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 an alle!

In ACAD Zeichnungen sind mehrere Blöcke enthalten.
Ich möchte die Koordinaten von darin enthaltenen Linien, Text, Attributen, usw. mit VBA auslesen. Um diese dann weiterzuverarbeiten.
Ich habe leider in keiner Hilfe etwas ähnliches gefunden
Ich hoffe es kann mir jemand von euch weiterhelfen!

Danke!

Siegfried

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

mib75
Mitglied
Konstrukteur


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

Beiträge: 11
Registriert: 27.01.2006

AutoCAD 2005, Windows XP

erstellt am: 01. Feb. 2006 12: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 Nur für Siegi1 10 Unities + Antwort hilfreich

Hallo Siegfried,

du mußt zuerstmal dem Block selectieren,

Set AllBlocks = ThisDrawing.Blocks 'Auslistung aller Blocke in der Zeichnung

aus AllBlocks kannst du dann z.B. über den Namen den Block auswählen,

If AllBlocks.Item(j).Name = "Test" Then .....

dann hast du den Block in der Variable und du kannst dann alle Objekte und Eigenschaften auslesen (wie eine normale Linie).

AllBlocks.Item(j).Item(1) -> ist dann z.B. eine Linien im Block
AllBlocks.Item(j).Item(2) -> ist dann z.B. ein Text im Block

mfg

Michael


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

Stelli1
Moderator
Verm.-Ing.


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

Beiträge: 1521
Registriert: 17.08.2005

Map 2000-2014, Rasterdesign,
MapGuide, Autodesk Topobase,
VS6, VS.net 2013

erstellt am: 01. Feb. 2006 12: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 Nur für Siegi1 10 Unities + Antwort hilfreich

Hallo Sigi,

bist du mit VBA vertraut ?
Im AutoCAD werden die Zeichnungsdaten im Modelbereich verwaltet.
Im folgenden Beispiel werden alle Zeichnungselemente des Modellbereichs duchsucht. Hier sind verschiedene Objekttypen zu  finden, die teilweise unterschiedliche Eigenschaften haben.

Code:

Option Explicit

Sub lese_koordinaten()

    Dim entity As AcadEntity
    Dim blockref As AcadBlockReference
    Dim lwpolyline As AcadLWPolyline
    Dim Text As AcadText
    Dim Mtext As AcadMText
    ' usw.
   
    Dim i As Integer
    Dim Koord As Variant
   
    For Each entity In ThisDrawing.ModelSpace
        Select Case LCase(entity.ObjectName)
              Case "acdbpolyline"
                    Set lwpolyline = entity
                    Debug.Print "LW Polyline"
                    Koord = lwpolyline.Coordinates
                    For i = 0 To UBound(Koord) - 1 Step 2
                        Debug.Print "Rechts= " & Koord(i)
                        Debug.Print "Hoch= " & Koord(i + 1)
                    Next i
                Case "acdbblockreference"
                    Set blockref = entity
                    Koord = blockref.InsertionPoint
                    Debug.Print "Blockname= " & blockref.Name
                    Debug.Print "Rechts= " & Koord(0)
                    Debug.Print "Hoch= " & Koord(1)
                    Debug.Print "Z= " & Koord(1)
                   
                Case "acdbmtext"
                    Set Mtext = entity
                    Koord = Mtext.InsertionPoint
                    Debug.Print "MTEXT= " & Mtext.TextString
                    Debug.Print "Rechts= " & Koord(0)
                    Debug.Print "Hoch= " & Koord(1)
                    Debug.Print "Z= " & Koord(1)
                Case Else
                    Debug.Print entity.ObjectName & " wird noch nicht ausgewertet"
        End Select
    Next entity

End Sub



Du musst dir für die gewünschten Objekte eine Auswertung "basteln".
Die Daten kannst du anstelle mit Debug.print natürlich auch in eine Datei schreiben.
Wenn nicht alle Elemente gelesen werden sollen, kannt du dir vorher eine Auswahl (z.B. mit selectonscreen) vom Benutzer holen.

Stelli

------------------
Warum lisp'eln wenn's auch anders geht.

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

Stelli1
Moderator
Verm.-Ing.


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

Beiträge: 1521
Registriert: 17.08.2005

Map 2000-2014, Rasterdesign,
MapGuide, Autodesk Topobase,
VS6, VS.net 2013

erstellt am: 01. Feb. 2006 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 Siegi1 10 Unities + Antwort hilfreich

Hallo Sigi,

hatte es nicht genau gelesen.
Du wollest ja die Werte innerhalb der Blockdefinitionen.

Code:

Option Explicit

Sub lese_koordinaten()

    Dim entity As AcadEntity
    Dim blockref As AcadBlockReference
    Dim blockdef As AcadBlock
    Dim lwpolyline As AcadLWPolyline
    Dim Text As AcadText
    Dim Mtext As AcadMText
    ' usw.
   
    Dim i As Integer
    Dim Koord As Variant
   
    For Each blockdef In ThisDrawing.Blocks
        Koord = blockdef.Origin
        Debug.Print "Blockdefinition= " & blockdef.Name
        Debug.Print "Nullpunkt Rechts= " & Koord(0)
        Debug.Print "Nullpunkt Hoch= " & Koord(1)
        If Not blockdef.IsLayout Then
            For Each entity In blockdef
                Select Case LCase(entity.ObjectName)
                      Case "acdbpolyline"
                            Set lwpolyline = entity
                            Debug.Print "LW Polyline"
                            Koord = lwpolyline.Coordinates
                            For i = 0 To UBound(Koord) - 1 Step 2
                                Debug.Print "Rechts= " & Koord(i)
                                Debug.Print "Hoch= " & Koord(i + 1)
                            Next i
                        Case "acdbblockreference"
                            Set blockref = entity
                            Koord = blockref.InsertionPoint
                            Debug.Print "Blockname= " & blockref.Name
                            Debug.Print "Rechts= " & Koord(0)
                            Debug.Print "Hoch= " & Koord(1)
                            Debug.Print "Z= " & Koord(1)
                           
                        Case "acdbmtext"
                            Set Mtext = entity
                            Koord = Mtext.InsertionPoint
                            Debug.Print "MTEXT= " & Mtext.TextString
                            Debug.Print "Rechts= " & Koord(0)
                            Debug.Print "Hoch= " & Koord(1)
                            Debug.Print "Z= " & Koord(1)
                        Case Else
                            Debug.Print entity.ObjectName & " wird noch nicht ausgewertet"
                End Select
            Next entity
        End If
    Next blockdef

End Sub



Stelli

------------------
Warum lisp'eln wenn's auch anders geht.

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

Siegi1
Mitglied


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

Beiträge: 9
Registriert: 15.03.2005

ACAD Map5, Windows XP Prof. ACAD VBA

erstellt am: 01. Feb. 2006 14:36    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 an euch!


In VBA kenne ich mich sehr gut aus. Ich habe mir eure Antworten gelesen und werde diese Tips Testen.

Danke für eure Rasche Unterstützung!

Siegfried

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

Siegi1
Mitglied


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

Beiträge: 9
Registriert: 15.03.2005

ACAD Map5, Windows XP Prof. ACAD VBA

erstellt am: 02. Feb. 2006 09:43    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 noch einmal!

Ich habe das auslesen der Blöcke jetzt getestet, funktioniert soweit einwandfrei. Die Angabe der Koordinaten der Geometrie erfolgt relativ zum Basispunkt des Blocks.
Diese Blöcke sind aber zusätzlich scaliert und gedreht. Die Koordinaten der Linien usw. im Block bleiben aber immer gleich.
Das umrechnen der Koordinaten auf die scalierten Werte ist kein Problem. Aber den absoluten Koordinatenwert berechnen wenn der Block gedreht wurde !?! Keine Ahnung!!


Vieleicht hat jemand eine Möglichkeit.


Danke für eure Hilfe


Siegfried


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

mib75
Mitglied
Konstrukteur


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

Beiträge: 11
Registriert: 27.01.2006

AutoCAD 2005, Windows XP

erstellt am: 02. Feb. 2006 12: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 Siegi1 10 Unities + Antwort hilfreich

Hallo Siegfried,

das geht mit den Winkelfunktionen, -> Sin Beta

    Dim b As Double
    Dim c As Double
    Dim Beta as Double
   
    c = xx 'Lange der Linie bzw. Koordinaten der Linie x Blockscalierung

    Beta = xx 'Winkel in Rad

    b = c * Sin(Beta)
   
Dann hast du die X bzw. Y Koordinaten bezogen auf den InsetPoint des Blocks.

mfg
Michael
   

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

Stelli1
Moderator
Verm.-Ing.


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

Beiträge: 1521
Registriert: 17.08.2005

Map 2000-2014, Rasterdesign,
MapGuide, Autodesk Topobase,
VS6, VS.net 2013

erstellt am: 02. Feb. 2006 13:12    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 Siegi1 10 Unities + Antwort hilfreich

Hallo Siegfried,

was hast du denn eigentlich vor ?

Vielleicht geht das ja auch einfacher, ohne viel rechnen.

Stelli

------------------
Warum lisp'eln wenn's auch anders geht.

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

Siegi1
Mitglied


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

Beiträge: 9
Registriert: 15.03.2005

ACAD Map5, Windows XP Prof. ACAD VBA

erstellt am: 02. Feb. 2006 15: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

Hallo Stelli

Mit einer Software die für ACAD geschrieben wurde werden bei uns sehr viele Pläne gezeichnet und geändert (ca. 200000 Stück).
Die Blöcke, Linien usw. werden über dieses Programm eingetragen.
Im Hintergrund werden Zuordnungen usw. mit X-Data eingetragen.

Ich habe versucht diese Daten direkt zu verändern, bin aber auf sehr viele Probleme gestoßen.
Deswegen habe ich begonnen diese Software mit Access fernzusteuern. Daten aus den Zeichnungen auslesen und in Access in Tabellen eintragen. Diese werden dann in Access geändert und wieder zurückgeschrieben.
Ich verwende dafür die Windows API usw.
Ich rufe damit Fenster des Fremdprogrammes auf und verändere diese Daten dann. Das ganze funktioniert zu etwa 80 Prozent sehr gut.
Zum Aufrufen dieses Fensters ist mit der Maus auf ein bestimmtes Objekt zu Klicken (Blöcke). Ich habe aber gesehen wenn diese Aufrufe nicht funktionieren das der Kursor nicht auf einer Linie oder auf einen Text treffen.

Darum möchte ich jetzt diese Koordinaten der Linien beim auslesen gleich in die Datenbank eintragen. Damit kann ich die Trefferquote verbessern.

Ich hoffe ich habe das einigermassen verständlich beschrieben.

Wenn jemand eine bessere Lösung weiss bin ich jederzeit dafür offen.


freundliche Grüße Siegfried

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

Stelli1
Moderator
Verm.-Ing.


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

Beiträge: 1521
Registriert: 17.08.2005

Map 2000-2014, Rasterdesign,
MapGuide, Autodesk Topobase,
VS6, VS.net 2013

erstellt am: 02. Feb. 2006 16:24    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 Siegi1 10 Unities + Antwort hilfreich

Hallo Siegfried,

hab es noch nicht ganz verstanden.
Was für Daten sind das denn ?
Was für ein Programm ?
Schreibt es ASE Links als Xdaten für eine Datenbank an die Entity's?
Was willst du ändern (Datenbank oder Zeichnung oder beides)?
Warum brauchst du die Linien innerhalb der Blöcke ?

Stelli

------------------
Warum lisp'eln wenn's auch anders geht.

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



Technischen Zeichner / Technischen Systemplaner (m/w/d)

Die KÄLTE-KLIMA Firmengruppe ist ein leistungsstarkes und innovatives Technologieunternehmen. Wir betreu­en ca. 2.000 langjährige Stammkunden mit nahezu 40.000 installierten Kälteanlagen, Klimaanlagen und Wärmepumpen in einem Leistungsbereich von 1 kW bis 2.000 kW. Jährlich werden ca. 600 Projekte realisiert und ca. 1.000 neue Kälte-Klimaanlagen gebaut. Der Grundstein der KÄLTE-KLIMA Firmengruppe wurde bereits 1893 gelegt ? heute ist diese mit ca....

Anzeige ansehenTechnischer Zeichner, Bauzeichner
Siegi1
Mitglied


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

Beiträge: 9
Registriert: 15.03.2005

ACAD Map5, Windows XP Prof. ACAD VBA

erstellt am: 03. Feb. 2006 07: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 Stelli!

Diese Daten sind Adressen (Hausnummern, Strassennamen) die zu Technischen Objekten die in ganz Österreich aufgebaut sind gehören.
Diese Adressen werden Teilweise geändert (EU Vorgabe).
Ich hole die Daten in eine Datenbank um diese einfach zu Ändern. Es gibt eine Adressliste von Gemeinden mit alter und neuer Adresse.
Um diese nicht alle Händisch zu ändern (derzeit mehrere Hundert im Monat), lese ich diese aus ACAD in eine Datenbank ein. Dort importiere ich die Daten aus Excel und mit Abfragen kann ich die meisten zuodnen (Alte Adresse aus ACAD zu alter Adresse aus Excel und somit ist die neue Adresse gefunden).
Einige sich noch händisch zuzuordnen (Schreibweise der Adressen tweilw. anders). Alles passiert in der Datenbank, ist aber dort einfacher und wesentlich schneller zu erledigen als in ACAD. In der Zugehörigen Software ist zu diesem Problem keine Möglichkeit gegeben.
Danach schreibe ich die neuen Adressen (über mein Programm) wieder in die Zeichnungen zurück. Um die Routinen der ACAD Zusatzsoftware zu nützen, muss mein Programm einige Befehle an diese senden. Danach setzt es den Kursor auf ein Objekt (Block), durch anklicken öffnet sich dort ein Dialogfenster. In diesem Fenster werden die Daten geändert (die Adressen) und danach der OK Button gedrückt. Damit ist eine Adresse geändert (alles geschieht über mein Programm). Ich brauche die Linien der Blöcke um den Kursor genau auf diesem zu positionieren, und danach durch Mausklick den Dialog aufzurufen.
Trifft der Kursor nicht genau auf eine Linie wird der Dialog nicht aufgerufen (Damit wird das Objekt selektiert das zu ändern ist).
Die Daten werden in der Datenbank geändert und zugeordnet weil das dort wesentlich schneller und einfacher geht.
Ich habe auch schon versucht die XDaten zu verändern (ist auch kein Problem und auch wesentlich einfacher) aber wenn danach das Zusatzprogramm speichert, kommt es immer wieder zu abstürzen. Ich kann leider bei der Veränderung der XDaten keinen Fehler finden.
Darum habe ich mich zu dieser Variante entschlossen.

Danke für Deine Hilfe!

Gruß Siegfied

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