| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Textobjekt --> Inhalt ausgeben (2226 mal gelesen)
|
Hoppla83 Mitglied Student
Beiträge: 8 Registriert: 14.03.2012
|
erstellt am: 14. Mrz. 2012 22:34 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, die Frage ist mir fast peinlich, aber was soll es: ich habe eine Zeichnung zu Ergänzen. Es geht um Temperaturenwerte und Sonnenscheindauern, die auf einer geographischen Karte mit Messstationen eingetragen werden sollen. Die Messwerte kommen aus einer Textdatei und sollen entsprechend ihrer Station auch in der Karte richtig platziert werden. Nun habe ich den Ablauf des Programms soweit aufgestellt und hänge nur an einer Kleinigkeit: wenn ich ein Objekt (Text mit dem Ortsnamen der Messstation z.B. "Boltenhagen") suchen lasse, dann muss dieser Name mit dem Inhalt der Messwerte-Datei verglichen werden, damit über Schleifen usw dann die richtigen Messwerte in die Zeichnung kommen. ----> Wie kann ich den Inhalt des gefundenen Objekts ansprechen? Hier der Programmcode:
Code: Option ExplicitSub vba() Dim Txt As AcadText Dim obj As AcadEntity Dim i As Integer Dim TKoord() As Double Dim Dateiname, Ort As String Dim mittel_T, mittel_S As Double Dateiname = "Ergebnisse_fuerGrafik.txt" Open Dateiname For Input As #100 While Not EOF(100) Input #100, Ort, mittel_T, mittel_S If Ort <> "Ort" Then For Each obj In ThisDrawing.ModelSpace MsgBox (Ort) MsgBox (mittel_T) If TypeOf obj Is AcadText Then If obj Like Ort Then 'da hängt es obj wird nicht korrekt mit Ort verglichen TKoord = obj.InsertionPoint TKoord(1) = TKoord(1) - 4000 Set Txt = ThisDrawing.ModelSpace.AddText("mittel_T", TKoord, 3000) TKoord = obj.InsertionPoint TKoord(1) = TKoord(1) - 8000 Set Txt = ThisDrawing.ModelSpace.AddText("mittel_S", TKoord, 3000) End If End If Next obj Else End If Set Txt = Nothing Wend End Sub
Schon mal vielen Dank für jede Art von Hilfe :-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
runkelruebe Ehrenmitglied V.I.P. h.c. Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 sw: Win7-x64 Office 365 ProPlus C3D (& LT ) ET; DACH; Extensions ------------------- hw: FX3800 i5 CPU 670 8GB RAM
|
erstellt am: 15. Mrz. 2012 07:52 <-- editieren / zitieren --> Unities abgeben: Nur für Hoppla83
Moin, Tipp: Nimm Dir das Lokalfenster her und beobachte dort das obj. Dort siehst Du die Eigenschaften, die Dein Objekt haben kann. hier die korrigierte Zeile:
Code: If obj.TextString = Ort Then
Ein LIKE würde ich verwenden, wenn ich Platzhalter brauche, also so etwas:
Code: If obj.TextString Like "*hagen*" Then
HTH------------------ Gruß, runkelruebe Herr Kann-ich-nich wohnt in der Will-ich-nich-Straße... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Ehrenmitglied V.I.P. h.c. CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 ACAD20XX, defun-tools
|
erstellt am: 15. Mrz. 2012 07:52 <-- editieren / zitieren --> Unities abgeben: Nur für Hoppla83
Hallo, du kannst nur Objekte gleichen Typs vergleichen. Du prüfst ja sogar noch, ob das Object vom Typ AcadText ist - und vergleichst selbiges dann mit einem String. Du musst vom obj die TextEigenschaft[String] ermitteln und kannst die dann vergleichen. (so aus der Kalten ohne Test und Wissen, ob das in VBA so funktioniert - das Prinzip müsste passen) Dim AcTextObject As AcadText Dim TextContent As String AcTextObject = obj TextContent = AcTextObject.Text ... 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 |
Hoppla83 Mitglied Student
Beiträge: 8 Registriert: 14.03.2012
|
erstellt am: 15. Mrz. 2012 18:13 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank euch beiden. Diesen Code-Fetzen hatte ich auch schon am Wickel, aber durch zu häufiges Hin- und Herschreiben habe ich wohl die richtige Version nie getroffen. Toll, wie schnell das hier geht 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: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 15. Mrz. 2012 18:25 <-- editieren / zitieren --> Unities abgeben: Nur für Hoppla83
Nur mal so als Überlegung, Denkanstoß .. Wenn Du AutoCAD Map hast gäbe es auch die Möglichkeit Blöcke mit Datenbanken zu verknüpfen und daraus die aktuellen Werte abzufragen und anzeigen zu lassen. Damit könnte man sich das Programm sparen (aber mir macht programmieren auch manchmal Spaß ) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Hoppla83 Mitglied Student
Beiträge: 8 Registriert: 14.03.2012
|
erstellt am: 15. Mrz. 2012 19:42 <-- editieren / zitieren --> Unities abgeben:
Mir bleibt da keine Wahl. Ist für einen Uni-Beleg und es ist der harte Code gefordert ;-) Aber ich habe noch ein anderes Problem. Ich habe die Zeile so weit geändert, wie vorgeschlagen
Code: If obj.TextString = Ort Then
Nun geht Ort in dieser Abfrage mit dem Inhalt "Boltenhagen" ein. Und wenn er ein obj findet, dass auch Boltenhagen heißt, müsste er ja in die if-Bedingung eintauchen, aber der Debugger beschimpft mich mit: Zitat: Laufzeitfehler '438': Objekt unterstützt diese Eigenschaft oder Methode nicht
Dabei schränke ich ja die Auswahl an Objekten schon auf Textobjekte ein. Und bis auf die Textobjekte und einige Polylinien und Texturen ist nichts in der Zeichnung enthalten Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Ehrenmitglied V.I.P. h.c. CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 ACAD20XX, defun-tools
|
erstellt am: 15. Mrz. 2012 21:58 <-- editieren / zitieren --> Unities abgeben: Nur für Hoppla83
Zitat: Original erstellt von Hoppla83: ... aber der Debugger beschimpft mich mit: Dabei schränke ich ja die Auswahl an Objekten schon auf Textobjekte ein. Und bis auf die Textobjekte und einige Polylinien und Texturen ist nichts in der Zeichnung enthalten
Ein Object hat keine Eigenschaft TextString. Schau dir meinen obigen Beitrag noch einmal an, da ist schon die Umwandlung von Object in AcadText drinn enthalten. 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 |
Hoppla83 Mitglied Student
Beiträge: 8 Registriert: 14.03.2012
|
erstellt am: 15. Mrz. 2012 22:12 <-- editieren / zitieren --> Unities abgeben:
Also dein Prinzip habe ich verstanden, aber an der Umsetzung hapert es noch. Ich weiß einfach nicht, wie ich ein Objekt in der Zeichnung finden kann und dessen Inhalt (in meinem Fall eben der Text in dem Objekt) extrahieren kann. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Ehrenmitglied V.I.P. h.c. CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 ACAD20XX, defun-tools
|
erstellt am: 15. Mrz. 2012 23:13 <-- editieren / zitieren --> Unities abgeben: Nur für Hoppla83
Deine Frage lässt darauf schließen, dass du nicht wirklich weißt, was der von dir gepostete Code tatsächlich anstellt. Den Objektzugriff hast du doch schon .. du musst nur noch Object In AcadText umwandeln. 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 |
Hoppla83 Mitglied Student
Beiträge: 8 Registriert: 14.03.2012
|
erstellt am: 15. Mrz. 2012 23:21 <-- editieren / zitieren --> Unities abgeben:
Wie gesagt, der Ablauf des Programms ist völlig klar. Ich kenne mich ziemlich gut mit VBA Excel aus. Nur weiß ich nicht, wie obj die Info über den Inhalt entlockt werden kann. Wenn ich deine Code-Fragmente einfüge, evtl. auch falsch oder an falscher Stelle, kommt es wieder zum Abbruch des Programms. Wie soll ich die Variable obj, die dann mit einem Zeichenobjekt aus der Zeichnung gefüllt ist denn umwandeln? Da brauche ich ja wieder den einen, mir unbekannten, Befehl, um obj eine Textinfo zu entlocken. Das Problem hatte ich schon beim ersten Post. Oder wir reden aneinander vorbei. Auf jeden Fall schonmal einen Dank für deine Geduld :-) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Ehrenmitglied V.I.P. h.c. CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 ACAD20XX, defun-tools
|
erstellt am: 16. Mrz. 2012 07:56 <-- editieren / zitieren --> Unities abgeben: Nur für Hoppla83
Zitat: Original erstellt von Hoppla83: Wie gesagt, der Ablauf des Programms ist völlig klar. Ich kenne mich ziemlich gut mit VBA Excel aus. ...
Dein Problem, was du zu lösen hast, hat rein gar nichts mit Excel oder AutoCAD zu tun - das ist pures VBA (egal in welchem Programm) und gehört meines Erachtens zu den Grundlagen, die man wissen muss. Mal grundsätzlich: Du hast Tyoen von Variablen, die du alle mit Dim * As * deklarierst. Der Typ (hinter dem As) bestimmt dann auch, was du mit den Objekten machen kannst, denn jeder Typ bringt nun mal nur ganz bestimmte Eigenschaften/Methoden/Events mit. VB(A) ist Objektorientiert, das heißt auch, dass die Typen durch Vererbung von anderen Typen abgeleitet werden können (und auch sind). Die oberste TypDefinition ist ein Objekt, davon erben alle anderen Typen. In einer Vererbungshierarchie kannst du die einzelnen Objekte dann von Oben nach Unten umwandeln. Wenn du nun also weißt, dass der Typ AcadText die Eigenschaft TextString besitzt, du daher (richtigerweise) deine Objekte des Modellbereichs durchläufst und auch prüfst, ob diese von diesem Typ sind, dann musst du lediglich noch die Typspezifikation für deine Variable obj ändern. Da allerdings eine Typzuweisung für die Lebensdauer des Objektes fix ist, musst du dir eine neue Variable anlegen, die dem Zieltyp(AcadText) entspricht und diese dann mit dem Wert deiner Variablen obj instanzieren. Als Code sieht das nun so aus: Dim AcTextObject As AcadText Set AcTextObject = obj Fast genau so (lediglich das Set hat gefehlt) steht es bereits in meiner ertsen Antwort. Grüße Holger PS: Meine Geduld ist nun aber erschöpft - das muss reichen.
------------------ 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 |
runkelruebe Ehrenmitglied V.I.P. h.c. Straßen- / Tiefbau
Beiträge: 8075 Registriert: 09.03.2006 sw: Win7-x64 Office 365 ProPlus C3D (& LT ) ET; DACH; Extensions ------------------- hw: FX3800 i5 CPU 670 8GB RAM
|
erstellt am: 16. Mrz. 2012 08:57 <-- editieren / zitieren --> Unities abgeben: Nur für Hoppla83
Moin, interessanterweise läuft bei mir ja der ein verkürzte Code in einer Zeichnung mit lediglich 3 Linien, 2 MTexten und 3 Texten durch, der Text mit dem Inhalt Boltenhagen wird gefunden und die Debug.Print-Zeile geschrieben. Code: Sub vba()Dim Txt As AcadText Dim obj As AcadEntity Dim i As Integer Dim TKoord() As Double Dim Dateiname$, Ort As String Dim mittel_T As Double, mittel_S As Double Ort = "Boltenhagen" 'ZUSATZZEILE, da die txt nicht vorliegt 'Dateiname = "Ergebnisse_fuerGrafik.txt" 'Open Dateiname For Input As #100 'While Not EOF(100) 'Input #100, Ort, mittel_T, mittel_S ' If Ort <> "Ort" Then For Each obj In ThisDrawing.ModelSpace ' MsgBox (Ort) ' MsgBox (mittel_T) If TypeOf obj Is AcadText Then If obj.TextString = Ort Then 'da hängt es obj wird nicht korrekt mit Ort verglichen TKoord = obj.InsertionPoint Debug.Print obj.Handle & "-->" & obj.TextString & "-->" & TKoord(0) & ";" & TKoord(1) '& ";" & obj.InsertionPoint(2) ' TKoord(1) = TKoord(1) - 4000 ' Set Txt = ThisDrawing.ModelSpace.AddText("mittel_T", TKoord, 3000) ' TKoord = obj.InsertionPoint ' TKoord(1) = TKoord(1) - 8000 ' Set Txt = ThisDrawing.ModelSpace.AddText("mittel_S", TKoord, 3000) End If End If Next obj ' Else ' End If 'Set Txt = Nothing 'Wend End Sub
Ich weiß also derzeit leider nicht, was bei Dir anders ist, es ist jedenfalls irgendetwas anders als Du hier schreibst. Der debugger beschimpft u.U. nicht das obj.Textstring, sondern kommt beim nächsten Schritt nicht weiter.BTW, Deine Variablendeklaration ist u.U. falsch: Dim Dateiname, Ort As String deklariert Ort zwar as String, aber Dateiname as Variant. Die Zusammenfassung in einer Zeile geht in VBA nicht. Verkürzte Schreibweise ohne As wäre: Dim Dateiname$, Ort$ Ich erwähne das deswegen, weil ich das anfangs auch immer so gemacht hab, ohne es zu wissen, wenn das bei Dir Absicht war, vergiß diesen Absatz wieder PS: Ich komme ebenfalls aus dem xls-Bereich, ACAD-VBA hab ich mich nie richtig hintergeklemmt, hoffe daher, ich hab oben nix übersehen.
------------------ Gruß, runkelruebe Herr Kann-ich-nich wohnt in der Will-ich-nich-Straße... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Hoppla83 Mitglied Student
Beiträge: 8 Registriert: 14.03.2012
|
erstellt am: 16. Mrz. 2012 12:21 <-- editieren / zitieren --> Unities abgeben:
Danke für deine Bemühungen, es gab einen Schleifenfehler, der mir dann doch irgendwann auffiel. Der verkürzte Code hat mir dann auch gereicht. Vielen Dank für die schnelle Hilfe :-) @Birschke: Versuche vielleicht nicht Blinde mit Farben zu bewerfen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Goofy007 Mitglied Vermessungstechniker
Beiträge: 578 Registriert: 06.11.2004 Map3D 2018 und Civil3D 2018
|
erstellt am: 20. Mrz. 2012 13:36 <-- editieren / zitieren --> Unities abgeben: Nur für Hoppla83
|
Hoppla83 Mitglied Student
Beiträge: 8 Registriert: 14.03.2012
|
erstellt am: 22. Mrz. 2012 08:13 <-- editieren / zitieren --> Unities abgeben:
|
Brischke Ehrenmitglied V.I.P. h.c. CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 ACAD20XX, defun-tools
|
erstellt am: 23. Mrz. 2012 11:39 <-- editieren / zitieren --> Unities abgeben: Nur für Hoppla83
Zitat: Original erstellt von Hoppla83: ... Seine Hinweise waren nur leider unvollständig ...
Es ist ja nicht so, dass ich nicht darauf hingewiesen hätte - Und als Ansatz zur Lösungsfindung taugt es (aus meiner Sicht).: Zitat: Original erstellt von Brischke: ... (so aus der Kalten ohne Test und Wissen, ob das in VBA so funktioniert - das Prinzip müsste passen) Dim AcTextObject As AcadText Dim TextContent As String AcTextObject = obj TextContent = AcTextObject.Text ...
Zitat: Original erstellt von Hoppla83: ... und wesentlich komplizierter, als die Tipps, die vorher kamen.
Ja, das ist sicher so. Hat aber auch den Hintergrund, dass ich es mir versuche abzugewöhnen immer fertigen, funktionierenden Code zu posten. Damit habe ich die Erfahrung gemacht, dass dieser blind übernommen wird und seltenst auf die Unterschiede zum eigenen Code hin untersucht wird, damit die Fehlerursache nicht nur behoben sondern auch verstanden wird. Nur wenn der Code auch verstanden wird, kann der Fragesteller a) etwas lernen und b) den Fehler beim nächsten Mal auch vermeiden. 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 |
Hoppla83 Mitglied Student
Beiträge: 8 Registriert: 14.03.2012
|
erstellt am: 24. Mrz. 2012 13:11 <-- editieren / zitieren --> Unities abgeben:
|