| |
| 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
Beiträge: 9 Registriert: 15.03.2005 ACAD Map5, Windows XP Prof. ACAD VBA
|
erstellt am: 01. Feb. 2006 12:12 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 11 Registriert: 27.01.2006 AutoCAD 2005, Windows XP
|
erstellt am: 01. Feb. 2006 12:34 <-- editieren / zitieren --> Unities abgeben: Nur für Siegi1
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.
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 / zitieren --> Unities abgeben: Nur für Siegi1
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 ExplicitSub 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.
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 / zitieren --> Unities abgeben: Nur für Siegi1
Hallo Sigi, hatte es nicht genau gelesen. Du wollest ja die Werte innerhalb der Blockdefinitionen.
Code:
Option ExplicitSub 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
Beiträge: 9 Registriert: 15.03.2005 ACAD Map5, Windows XP Prof. ACAD VBA
|
erstellt am: 01. Feb. 2006 14:36 <-- editieren / zitieren --> Unities abgeben:
|
Siegi1 Mitglied
Beiträge: 9 Registriert: 15.03.2005 ACAD Map5, Windows XP Prof. ACAD VBA
|
erstellt am: 02. Feb. 2006 09:43 <-- editieren / zitieren --> Unities abgeben:
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
Beiträge: 11 Registriert: 27.01.2006 AutoCAD 2005, Windows XP
|
erstellt am: 02. Feb. 2006 12:10 <-- editieren / zitieren --> Unities abgeben: Nur für Siegi1
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.
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 / zitieren --> Unities abgeben: Nur für Siegi1
|
Siegi1 Mitglied
Beiträge: 9 Registriert: 15.03.2005 ACAD Map5, Windows XP Prof. ACAD VBA
|
erstellt am: 02. Feb. 2006 15:07 <-- editieren / zitieren --> Unities abgeben:
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.
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 / zitieren --> Unities abgeben: Nur für Siegi1
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 betreuen 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 ansehen | Technischer Zeichner, Bauzeichner |
|
Siegi1 Mitglied
Beiträge: 9 Registriert: 15.03.2005 ACAD Map5, Windows XP Prof. ACAD VBA
|
erstellt am: 03. Feb. 2006 07:34 <-- editieren / zitieren --> Unities abgeben:
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 |