| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Bemaßung Wert auslesen (3420 mal gelesen)
|
82.lagrima Mitglied
Beiträge: 14 Registriert: 11.05.2013 Win 7, Autocad 2011 64 Bit
|
erstellt am: 11. Mai. 2013 14:36 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich noch nicht viel Erfahrung mit VBA in Autocad habe mich aber vor einer Weile aber schon (Learning by Doing) mit VBA in Excel auseinandergesezt. Jetzt würde ich gerne den Wert (in den Eigenschaften heißt es Maßeinheit) von Bemaßungen auslesen. Nach einiger Suche bin ich bereits auf folgenden Verweis in einer anderen Disskussion gestoßen: http://forums.augi.com/archive/index.php/t-35912.html Aber das ist auch nicht das, was ich suche (wenn ich das denn richtig verstanden habe, mein Englisch ist nicht sooo gut). Ich möchte nur den Wert wissen, um damit weitere If Then Else Abfragen durchführen zu können. Das muss doch möglich sein, oder? Aber .value gibt es da scheinbar nicht... Freue mich über jede Hilfe! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
82.lagrima Mitglied
Beiträge: 14 Registriert: 11.05.2013 Win 7, Autocad 2011 64 Bit
|
erstellt am: 11. Mai. 2013 14:49 <-- editieren / zitieren --> Unities abgeben:
Edit: Hab gerade rausgefunden, dass das eigentlich mit Measurment gehen müsste, oder? Aber da heißt es bei mir "Objekt unterstützt diese Eigenschaft oder Methode nicht" Da ich lineare und ausgerichtete Bemaßungen habe, habe ich es bisher mit AcadDimension probiert, muss ich da was anderes nehmen? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
82.lagrima Mitglied
Beiträge: 14 Registriert: 11.05.2013 Win 7, Autocad 2011 64 Bit
|
erstellt am: 11. Mai. 2013 16:57 <-- editieren / zitieren --> Unities abgeben:
Ok, meine Fragestellung hat sich etwas geändert aber die Überschrift passt dennoch, denke ich. Ich möchte alle Bemaßungen in einer Zeichnung in ein Auswahlset laden, den Wert auslesen und je nachdem welchen Wert sie haben, weiter vorgehen. Bisher habe folgende Variablen deklariert: Dim Sset As AcadSelectionSet Dim Auswahl As AcadObject Dim Bemass As AcadDimension Dim FilterType(0) As Integer Dim FilterData(0) As Variant und einen Filter mit 0 und "Dimension" erstellt Sset wird bei mir über eine Funktion "gesettet" und mit: Sset.SelectOnScreen FilterType, FilterData For Each Auswahl In Sset Set Bemass = Auswahl Bemass.TextOverride = ... kann ich alle Bemassungstexte überschreiben. Das funktioniert auch soweit. Nur gibt es für "Bemass" eben die Funktion Measurment nicht, die gäbe es aber jeweils für Dim objAligned As AcadDimAligned Dim objRotated As AcadDimRotated Leider weiß ich nicht, wie ich diese beiden Bemaßungstypen in ein Auswahlset bekomme und sie wie einen Typen weiter behandeln kann. Ich hoffe, ich habe das einigermaßen verständlich formuliert... 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: 11. Mai. 2013 19:31 <-- editieren / zitieren --> Unities abgeben: Nur für 82.lagrima
Hallo und willkommen im Forum Du hast Dir ja eine ungünstige Zeit herausgesucht, am WE ist hier fast nichts los. Dafür hast Du schon selber ein paar Erfahrungen gemacht, was ja auch nicht verkehrt ist. So ganz verstehe ich nicht was Du eigentlich machen möchtest, aber vielleicht ein Hinweis: Measurement ist keine Funktion sondern eine Eigenschaft, die noch dazu schreibgeschützt ist. D.h. Du könntest sie dir mit debug.print bemass.measurement auch anzeigen lassen Textoverride überschreibt diesen Wert vorübergehend, diese Überschreibung kann mit "" wieder rückgängig gemacht werden. Wenn Du im Überwachungsfenster einmal die Variable Bemass ansiehst, wirst Du feststellen, dass sie abhängig vom aktuellen Element im Selectionset verschiedene Typen annimmt, d.h. Du hast sie schon im Auswahlset. Zugriff darauf bekommst Du z.B. über:
Code: Select Case Bemass.ObjectName Case "AcDbAlignedDimension": Case "AcDbRotatedDimension": End Select
Aber beschreib doch mal was Du wirklich vorhast, vielleicht hast Du ja den ganz verkehrten Ansatz .. Grüße Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
82.lagrima Mitglied
Beiträge: 14 Registriert: 11.05.2013 Win 7, Autocad 2011 64 Bit
|
erstellt am: 11. Mai. 2013 20:38 <-- editieren / zitieren --> Unities abgeben:
Hey, gut zu wissen, dass die wenigen Antworten mit dem WE zusammen hängen könnten! Mein Plan ist folgender: Wähle sämtliche Bemaßungsobjekte (bzw. entweder alle Bemaßungsobjekte oder durch Markierung des Nutzers SelectOnScreen) Wenn Wert der Bemaßung kleiner 1 und Wert geteilt durch 0,005 eine gerade Zahl Dann mach A Oder Wenn Wert kleiner 1 und Wert / 0,005 ungerade oder Rest von Wert / 0,005 ungleich 0 (geht bestimmt auch einfacher oder? Es geht darum ob die dritte Nachkommastelle eine Null oder eben nicht ist) Dann mach B Oder Wenn Wert großer gleich 1 und wie in Fall 1 Dann mach C Oder Wenn Wert größer gleich 1 und wie in Fall 2 Dann mach D Zitat: Select Case Bemass.ObjectName Case "AcDbAlignedDimension": Case "AcDbRotatedDimension": End Select
Um genau sagen, können ob mir das hilft, muss ich mir das noch mal in Ruhe anschauen bzw. ausprobieren. Aber mit den zwei Cases wären das ja also statt vier schon acht Fälle bzw. durch die Auswahlmöglichkeit am Anfang genaugenommen 16... Puh. Kann also gut sein, dass der Ansatz nicht der aller beste ist. 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: 11. Mai. 2013 23:18 <-- editieren / zitieren --> Unities abgeben: Nur für 82.lagrima
Nachdem Bemass global als AcadDimension definiert ist kannst für alle Fälle dort die Measurement Eigenschaft abrufen, also bleiben es vier Fälle. Bedenke aber die Double Ungenauigkeit, also keine Abfrage auf 0,005 sondern besser vorher auf Integerwert runden und dann vergleichen (nur mal so als Tip) Wenn die daraus folgende Aktion allerdings eine Korrektur der Abstände sein soll, kann das natürliche doch zu acht Aktionen führen .. Grüße Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
82.lagrima Mitglied
Beiträge: 14 Registriert: 11.05.2013 Win 7, Autocad 2011 64 Bit
|
erstellt am: 11. Mai. 2013 23:56 <-- editieren / zitieren --> Unities abgeben:
Für Bemass gibt es die Eigenschaft Measurement eben leider nicht ?! Das mit dem Runden versuche ich auch gerade Eigentlich möchte ich die Originalzahl in zwei Zahlen aufsplitten: Einmal die Originalzahl mit zwei Nachkommastellen (Rest abgeschnitten) und die Dritte Nachkommazahl x 100 als einstellige ganze Zahl. Aber das gehört glaub ich woanders hin. 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: 12. Mai. 2013 13:19 <-- editieren / zitieren --> Unities abgeben: Nur für 82.lagrima
Doch, Du kannst die Bemass.Measurement Eigenschaft abrufen (aber nicht ändern) Zu dem Runden: dritte Nachkommastelle mal 100 ? Eher mal 1000 oder? Egal hier mal ein Beispiel wie man das lösen könnte: Code: Function MTRunden(wert As Double) As String Dim sh As String sh = Format(wert, "0.000") If Right(sh, 1) = "0" Then sh = Left(sh, Len(sh) - 1) Else sh = Left(sh, Len(sh) - 1) & " +" & Right(sh, 1) End If MTRunden = shEnd Function
Im Hauptcode käme dann noch ein:
Code: Bemass.TextOverride = MTRunden(Bemass.Measurement)
eingefügt.Probiers einfach aus und lass uns wissen ob das Dein gewünschtes Ergebnis wäre. Grüße Klaus
[Diese Nachricht wurde von KlaK am 12. Mai. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
82.lagrima Mitglied
Beiträge: 14 Registriert: 11.05.2013 Win 7, Autocad 2011 64 Bit
|
erstellt am: 12. Mai. 2013 16:15 <-- editieren / zitieren --> Unities abgeben:
Hm... bei mir heißt es aber, dass es diese Eigenschaft dafür nicht gibt. Jedenfalls nicht für Bemass so wie es deklariert ist. Ich komme an diese Eigenschaft nur, bei dim as AcadDimAligned oder as AcadDimRotated. Danke für den Code zum Runden, den werde ich gleich mal ausprobieren und mit den mal 1000 hast du natürlich recht 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: 12. Mai. 2013 19:16 <-- editieren / zitieren --> Unities abgeben: Nur für 82.lagrima
Na gut, dann werde ich das morgen mal mit Autocad testen Bei mir (unter Bricscad, die Autocad Homeuse ist noch nicht erneuert) gibt es da keine Probleme. Hatte Deine Vorgaben nur kopiert und ergänzt. Hier mal mein Hauptcode: Code:
Sub test_Bem() Dim Sset As AcadSelectionSet Dim Auswahl As AcadObject Dim Bemass As AcadDimension Dim FilterType(0) As Integer Dim FilterData(0) As Variant On Error Resume Next Set Sset = ThisDrawing.SelectionSets.Add("TEST_SSET") If Err <> 0 Then Set Sset = ThisDrawing.SelectionSets("Test_SSet") Sset.Clear Err.Clear End If On Error GoTo 0 FilterType(0) = 0 FilterData(0) = "Dimension" Sset.Select acSelectionSetAll, , , FilterType, FilterData For Each Auswahl In Sset Set Bemass = Auswahl Bemass.TextOverride = MTRunden(Bemass.Measurement) 'Bemass.TextOverride = "" Next Auswahl End Sub
Evtl. kannst Du die Bemass-Variable ja auch einfach als Variant definieren Grüße Klaus
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
82.lagrima Mitglied
Beiträge: 14 Registriert: 11.05.2013 Win 7, Autocad 2011 64 Bit
|
erstellt am: 12. Mai. 2013 20:16 <-- editieren / zitieren --> Unities abgeben:
Wahrscheinlich liegt es daran, dass Measurement schreibgeschützt ist, wie du sagtest (was ja auch Sinn macht). Einer anderen Variable den Wert Bemass.Measurment zuzuweisen scheint in gewissen Fällen tatsächlich zu funktionieren. So gaaanz hab ich noch nicht raus, warum es das eine mal geht und das andere mal nicht aber ich probier mal weiter rum. Danke jedenfalls schon mal, das hat mir sehr weiter geholfen. 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: 12. Mai. 2013 21:17 <-- editieren / zitieren --> Unities abgeben: Nur für 82.lagrima
|
82.lagrima Mitglied
Beiträge: 14 Registriert: 11.05.2013 Win 7, Autocad 2011 64 Bit
|
erstellt am: 18. Mai. 2013 14:12 <-- editieren / zitieren --> Unities abgeben:
Das mit den unities ist gut zu wissen schöne Idee. Was ich noch sagen wollte: ich hab auch rausgefunden, warum das mit dem measurement mal ging und mal nicht - es war ein blöder Tippfehler! Ich habe manchmal einfach das zweite "e" vergessen!! Kann ich den Beitrag eigentlich irgendwo auf "gelöst" stellen? 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: 18. Mai. 2013 20:13 <-- editieren / zitieren --> Unities abgeben: Nur für 82.lagrima
Ist mir jetzt nichts bekannt, aber der Hinweis, dass die Frage gelöst wurde ist schon ein guter und wichtiger Hinweis der manchmal leider vergessen wird. Theoretisch wäre es zwar möglich den Beitrag löschen zu lassen, wird aber nur in Ausnahmefällen gemacht, da wir ja auch unser Nachschlagewerk nicht verlieren wollen. Viele Fragen kann man dann unter Benutzung der Suchfunktion schnell lösen. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |