| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Umfang aus Length verwenden (1048 mal gelesen)
|
andreschubert6 Mitglied
Beiträge: 20 Registriert: 15.11.2009 AutoCad 2006
|
erstellt am: 26. Dez. 2010 12:14 <-- editieren / zitieren --> Unities abgeben:
Hallo und frohes Fest. Ich möchte mir gern den Umfang eines Polylinienobjektes in einer Userform anzeigen lassen. Das Objekt wurde in einer vorhergehenden Prozedur bereits ausgewählt. Nun bin ich der Meinung, dass ich Length für den Umfang verwenden kann. Zumal der korrekte Wert bei überwachen schon angezeigt wird. Wenn ich die Prozedur aber debugge erscheint ein Laufzeitfehler '438' mit dem ich nichts anfangen kann. Kann man das in etwa gar nicht so machen? Ach ja und kann es sein, dass bei AutoCad- Versionen nach 2006 der Umfang nicht mehr unter Length sonder unter Perimeter hinterlegt ist? Gruß Andre 'Umfang Private Sub CommandButton3_Click() Dim U As Double U = ThisDrawing.ModelSpace.Item1.Length Me.ListBox1.Clear Me.ListBox1.AddItem (U) End Sub Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 26. Dez. 2010 14:40 <-- editieren / zitieren -->
Hi, .Length sollte für Polylinien gelten, .Perimeter für Objekte des Typs 'REGION' (finde ich zumindest so in der ACAD-VBA-Hilfe). Wenn Du jetzt mit Deinem Code abfliegst, dann folgender Tip: - Prüfe zuerst den Typ des Objekts bevor Du die Eigenschaft .Length davon abfragst - ich weiß zwar nicht, was ThisDrawing.ModelSpace.Item1 sein sollte, den Codeteil solltest Du auch mal prüfen. HTH, - alfred - ------------------ www.hollaus.at |
andreschubert6 Mitglied
Beiträge: 20 Registriert: 15.11.2009 AutoCad 2006
|
erstellt am: 26. Dez. 2010 15:23 <-- editieren / zitieren --> Unities abgeben:
Zitat:
- Prüfe zuerst den Typ des Objekts bevor Du die Eigenschaft .Length davon abfragst
Zuvor wird der Typ "IAcadLWPolyline" mit einer If-Abfrage untersucht, was auch funktioniert. Zitat:
- ich weiß zwar nicht, was ThisDrawing.ModelSpace[b].Item1 sein sollte, den Codeteil solltest Du auch mal prüfen.
Da hab ich noch eine Frage dazu: Wenn man in dem Fall "Item" nimmt, bezieht es sich dann immer noch auf das ausgewählte Objekt? Objektauswahl wird im übrigen auch getroffen. Gruß und Danke Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 26. Dez. 2010 19:23 <-- editieren / zitieren -->
Hi, >> Zuvor wird der Typ "IAcadLWPolyline" mit einer If-Abfrage untersucht, was auch funktioniert. Ganz ernst? Nee, denn ThisDrawing.ModelSpace.Item1 bringt schon einen Fehler, es kann gar nicht sein, dass dieses ein Objekt retourniert. >> Wenn man in dem Fall "Item" nimmt, bezieht es sich dann immer noch auf das ausgewählte Objekt?
.Item(<Index> ) bezieht sich auf ein Element in einer Auflistung. Hat nix mit selektiert zu tun, solange Du nicht von einer Auflistung eines SelectionSets sprichst. >> Objektauswahl wird im übrigen auch getroffen.
Den Zusammenhang versteh ich (bezogen auf Dein obiges Codeschnippsel) gar nicht mehr. Entweder mehr Code (den Du zuvor bitte auch probierst) oder mehr Beschreibung, sonst kann ich (und ich nehme auch an, sonst können andere) nicht weiterhelfen. - alfred - ------------------ www.hollaus.at |
andreschubert6 Mitglied
Beiträge: 20 Registriert: 15.11.2009 AutoCad 2006
|
erstellt am: 26. Dez. 2010 20:15 <-- editieren / zitieren --> Unities abgeben:
Gut dann hier nochmal der Teil des Codes der scheinbar auch wichtig ist. -------------------------------------------------------------------------------------------------------------------- Option Explicit 'Interpreteranweisung: Programmierer übernimmt Variablendeklaration 'Deklaration eines Types Type tKo X As Double Y As Double End Type Public A As Double Public Xs As Double Public Ys As Double Sub main() Dim LwPolyobject As Object Dim Koord() As tKo 'dyn. Feld für abzuholende Koordinatenwerte eines Polygonzugs Dim inspunkt As Variant Dim Geschlossen As Integer 'EINGABE 'Aufruf Sub Polygonanwahl If PolygonAnwahl(LwPolyobject) = 0 Then MsgBox "Objekt ist keine Polylinie" 'Verarbeitung Else 'Aufruf Sub Auslesen der Koordinaten des Polygonzuges Geschlossen = KoordinatenAuslesen(LwPolyobject, inspunkt, Koord()) If Geschlossen = 2 Then 'Aufrufen Sub zur Berechnung des Flächeninhaltes Call Flaechenberechnung(LwPolyobject, inspunkt, Koord()) Call Koordinate_Xs(LwPolyobject, inspunkt, Koord()) Call Koordinate_Ys(LwPolyobject, inspunkt, Koord()) 'Ausgabe Call KoordinatenAusgabe End If If Geschlossen = 1 Then MsgBox "Enden liegen in Z verschoben übereinander" End If If Geschlossen = 0 Then MsgBox "Polygonzug nicht geschlossen" End If End If End Sub 'Auswahl des Polygonzuges Function PolygonAnwahl(LwPolyobject As Object) As Integer Dim Prompt As String Dim PickedPoint As Variant On Local Error Resume Next Prompt = "Polylinie anklicken:" ThisDrawing.Utility.GetEntity LwPolyobject, PickedPoint, Prompt If TypeName(LwPolyobject) = "IAcadLWPolyline" Then PolygonAnwahl = 1 Else PolygonAnwahl = 0 End If End Function
-------------------------------------------------------------------------------------------------------------------- funktioniert Ich dachte das "ThisDrawing.ModelSpace.Item1.Length" unabhängig davon ist. Kann es daran liegen, dass die "Length- Abfrage" in einer UserForm (Private Sub) statt findet? ...aber warum seh ich dann den korrekten Umfangswert beim debuggen und überwachen von "ThisDrawing"?
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 27. Dez. 2010 01:48 <-- editieren / zitieren -->
Hi, darf ich aus dem Wort 'funktioniert' am Ende Deines Codes schliessen, dass der gezeigte Code funktioniert? Sollte das so sein (und so schliesse ich es jetzt mal auch wegen der anderen Fragen am Ende Deines Beitrags), dann hast Du ja nicht die Stelle mitgezeigt, die Auslöser des Problems ist (zumindest kann ich keinen Zusammenhang aus den beiden Codeteilen erkennen). >> Kann es daran liegen, dass die "Length- Abfrage" in einer UserForm (Private Sub) statt findet?
Ich sehe nicht, wie Du aus Deinem Form-Objekt auf die Sub main hingreifst, daher kann ich nur raten: Dein Objekt 'LWPolyobject' hast Du nur innerhalb dieser Sub main deklariert, damit wird diese zu dem Zeitpunkt hinfällig, wenn Du End Sub erreichst. >> ...aber warum seh ich dann den korrekten Umfangswert beim debuggen und überwachen von "ThisDrawing"?
Nochmals nehme mal an (bald glüht die Glaskugel ), dass Du beim Debuggen noch in der Sub main drin stehst, darum hast Du auch noch Zugriff auf das Objekt LWPolyobject. Wenn ich jetzt weiters aus den obigen Teilen rückschliesse und diese Zeile heranziehe: U = ThisDrawing.ModelSpace.Item1.Length
...kann es sein, dass Du nach Durchlauf der Sub main annimmst, dass das zuletzt selektierte Element über ThisDrawing.ModelSpace.Item1 ansprechen kannst? ==> Sorry, so geht's nicht, denn nochmals: - die Eigenschaft .Item1 gibt es nicht - auch richtig geschrieben ThisDrawing.ModelSpace.Item(1) würde es nicht lösen, denn das vom User gewählte Element bei ThisDrawing.Utility.GetEntity LwPolyobject, PickedPoint, Prompt ist nicht zwangsweise das erste Element im Modellbereich. Mach also eine Funktion aus Deiner Sub main, die die Fläche der Polylinie retourniert - oder im Fehlerfall z.B. -1. Dann hast Du mit der Gültigkeit/Lebensdauer der Variable LWPolyobject kein Problem mehr.
- alfred - ------------------ www.hollaus.at |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|