| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Koordinaten in dyn. Feld (2181 mal gelesen)
|
andreschubert6 Mitglied
Beiträge: 20 Registriert: 15.11.2009 AutoCad 2006
|
erstellt am: 12. Dez. 2010 12:25 <-- editieren / zitieren --> Unities abgeben:
Hallo liebe Gemeinschaft! Ich bin VBA Anfänger und soll für ein Projekt in AutoCad eine Flächenberechnung eines beliebigen Polygones erstellen. Ich weiß, dass es dafür auch Befehle gibt aber hier geht es um das selber machen :-)! Nun ja zur Zeit bin ich an dem Punkt, dass ich die Koordinaten separiert habe ich sie aber nicht in ein dynamisches Feld rein bekomme. Grund ist das ich ,,coodinates'' als Datei ansehe, was aber vermutlich flasch ist. Was macht man in diesem Fall? Ach ja und ich vermute das mein dyn. Feld auch nicht richtig ist :-/! Ach und bitte habt Nachsicht mit einem Greenhorn... Hier mein jetziger Code: Sub Poly() Dim Ergebnis As Double Dim x() As String Dim y() As String Dim object As Object Dim coordinates As Variant Dim c As Double Set object = Application.ActiveDocument.PickfirstSelectionSet
c = object.Count If c = 0 Then MsgBox " Bitte markieren sie ein Objekt" coordinates = object.Item(0).coordinates 'Eingabe Einlesen der Daten Ergebnis = KoordinatenInFelder(x(), y()) If Ergebnis = 1 Then 'Verarbeitung Berechnung der Fläche Ergebnis = A(x(), y()) 'Ausgabe Anzeigen der berechneten Fläche Ergebnis = Anzeige End If
Erase x() Erase y() End Sub Function KoordinatenInFelder(x() As String, y() As String) As Integer Dim DSatzNr As Integer Dim tmp As String Dim coordinates As Variant KoordinatenInFelder = 0 If coordinates <> "Falsch" Then Open coordinates For Input As #1 DSatzNr = 0 Do While Not EOF(1) ReDim Preserve x(DSatzNr) ReDim Preserve y(DSatzNr) Line Input #1, x(DSatzNr) Line Input #1, y(DSatzNr) If Not EOF(1) Then Line Input #1, tmp DSatzNr = DSatzNr + 1 Loop Close #1 KoordinatenInFelder = 1 Else MsgBox "Keine Datei geoeffnet" End If End Function
[Diese Nachricht wurde von andreschubert6 am 12. Dez. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 12. Dez. 2010 12:52 <-- editieren / zitieren -->
Hi, >> Ach und bitte habt nachsicht mit einem Greenhorn... Nur wenig, sonst lernst Du nichts. Problemstelle 1: >> Set object = Application.ActiveDocument.PickfirstSelectionSet >> c = object.Count
Du prüfst hier nicht, ob 'object' überhaupt etwas enthält, greifst aber gleich auf dessen Eigenschaft 'Count' hin. Existiert das PickFirstSelectionSet nicht in der Zeichnung, kann auch nicht auf .Count hingegriffen werden und Du fliegst ab Problemstelle 2: >> If c = 0 Then MsgBox " Bitte markieren sie ein Objekt" >> coordinates = object.Item(0).coordinates
Du prüfst zwar dann, ob etwas selektiert war, gibts auch eine Meldung aus, wenn nicht, dann fährt Dein Code aber weiter und holt '.Coordiantes' aus etwas heraus, das nicht vorhanden ist. ==> Crash Problemstelle 3: >> Ergebnis = KoordinatenInFelder(x(), y())
Du übergibst an eine Funktion die Arrays x und y ==> in denen steht aber nix drin. Den Punkt verstehe ich leider gar nicht. Problemstelle 4: >> Open coordinates For Input As #1
Da hast Du schon mal richtig getippt, das Array 'coordinates' ist ein Array von Doubles und hat nix mit einer Datei zu tun. Weiters ist die Variable 'coordinates' imho gar nicht in der Funktion KoordinatenInFelder sichtbar, denn die Variable ist in der oberen Sub deklariert, die untere Funktion weiss von dieser daher gar nix. Problemstellen weiters:
Du kannst nicht einfach 'coordinates' aus einem nicht identifizierten Objekt herausholen, denn: a) sind diese Arrays unterschiedlich befüllt, mal 2D-Koordinaten im Objektkoordiantensystem, mal 3D-Koordinaten im Weltkoordinatensystem. b) Du hast noch keine Rücksicht genommen, ob zwischen den Punkten in coordinates gerade Segmente oder Bögen liegen. c) Du hast noch nicht geprüft, ob das selektierte Element überhaupt für eine Flächenbestimmung herhalten kann (z.B. ist es eine Polylinie und ist diese geschlossen?) d) Wenn Du Probleme mit Schriftfeld hast, dann zeig bitte den Code, der sich damit befasst, hier sehe ich nichts von alledem. Ist wohl noch viel Arbeit, jedenfalls viel Erfolg, - alfred - ------------------ www.hollaus.at |
andreschubert6 Mitglied
Beiträge: 20 Registriert: 15.11.2009 AutoCad 2006
|
erstellt am: 12. Dez. 2010 13:37 <-- editieren / zitieren --> Unities abgeben:
Uff! Nun gut, dann versuch ich erst mal auf dieser Grundlage weiter zu machen. Ich hoffe das ich dich damit dann nochmal belasten darf, wenn ich soweit bin um weitere Fragen zu stellen. Auch wenn sie wohlmöglich trivial für dich sind. Danke schonmal für die Mühe.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
andreschubert6 Mitglied
Beiträge: 20 Registriert: 15.11.2009 AutoCad 2006
|
erstellt am: 12. Dez. 2010 15:19 <-- editieren / zitieren --> Unities abgeben:
Ich komme gerade nicht weiter. Irgendwie läuft jetzt nichts mehr :-( Worauf muß ich coordinates untersuchen damit der code weiter läuft? -> <> empty? Gruß [Diese Nachricht wurde von andreschubert6 am 12. Dez. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 12. Dez. 2010 16:06 <-- editieren / zitieren -->
Hi, Code: Dim tSelSet as AcadSelectionSet Dim tEnt as AcadEntityOn Error Resume Next Set tSelSet = Application.ActiveDocument.PickfirstSelectionSet if (tSelSet is Nothing) then call MsgBox("Kein PickFirstSelectionSet vorhanden") ElseIf (tSelSet.Count = 0) then call MsgBox("Kein Objekt selektiert") Else For Each tEnt in tSelSet Select Case tEnt.ObjectName case "AcDbLine" 'Start und Endpunkt" case "AcDbPolyline" 'Coordinates 2D und OCS case "AcDb2dPolyline" 'Coordinates 3D und WCS case "AcDb3dPolyline" 'Coordinates 3D und WCS case "AcDbSpline" 'Coordiantes mit Vorsicht, denn entspricht nur Stützpunkten case .... End Select Next End If
HTH, Alfred ------------------ www.hollaus.at |
andreschubert6 Mitglied
Beiträge: 20 Registriert: 15.11.2009 AutoCad 2006
|
erstellt am: 12. Dez. 2010 18:05 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von a.n.: Hi,[code]Dim tSelSet as AcadSelectionSet Dim tEnt as AcadEntity wozu dient das?
Wie erstellt man aus den Koordinaten ein dyn. Feld? Ich habe bis jetzt immer nur in Excel, Files geöffnet, dewegen fällt mir das gerade etwas schwer. Wie gesagt ich hab bis jetzt nur rudimentäre Grundkenntnisse... Gruß
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 12. Dez. 2010 18:14 <-- editieren / zitieren -->
Hi, >> Dim tEnt as AcadEntity wozu dient das? Damit eine Deklaration erstellt wird, die Variable 'tEnt' mal weiss, dass diese vom Typ 'AcadEntity' ist ==> daher auch die Schleife durch die Elemente (Entities) im SelectionSet durchlaufen werden kann. >> Wie erstellt man aus den Koordinaten ein dyn. Feld?
Beschreib bitte mal ein wenig genauer, was Du eigentlich willst, am besten eine Zeichnung, in der es so aussieht, wie Du es nach dem Durchlauf Deines Makros gerne hättest. Ich vermute, dass da Kommunikationsprobleme aufgetreten sind; denn einerseits sprichst Du von 'Flächenberechnung', was ja nur nebensächlich etwas mit Beschriftung vom Koordinaten zu tun hat, auf der anderen Seite von 'dynamischen Feldern' von Koordinaten (ich könnte zwar interpretieren, dass Du damit Beschriftungsfelder meinst, aber eben kein Bezug zu Flächenberechnung). Zum Thema Beschriftungsfelder solltest Du auch schon einiges an Code finden können, wenn Du die Suche anstartest. - alfred - ------------------ www.hollaus.at |
andreschubert6 Mitglied
Beiträge: 20 Registriert: 15.11.2009 AutoCad 2006
|
erstellt am: 12. Dez. 2010 18:38 <-- editieren / zitieren --> Unities abgeben:
Gut, ich versuch nochmal mein Problem so genau wie möglich zu beschreiben. Ziel: - die Fläche von einem beliebigen geschlossenen 2D Poligonzug in AutoCad mit einer vorgegebenen Formel berechnen Meine Denke: Damit ich die x und y Koordinaten der div. Punkte mit der Formel berechnen kann, muß ich sie als erstes in ein dyn. Feld packen. Anschließend wird auf das Feld zurück gegriffen, wenn es um die Berechnung des Flächeninhaltes geht.
Ich hoffe ich konnte mich verständlich ausdrücken. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 12. Dez. 2010 18:58 <-- editieren / zitieren -->
Hi, ...und Du darfst nicht auf die Polylinien-Eigenschaft '.Area' zurückgreifen? Wenn das so wäre ==> wer stellt denn so eine Aufgabe? >> muß ich sie als erstes in ein dyn. Feld packen Es ist mir leider noch immer nicht klar, zumindest bin ich mir nicht sicher, was Du mit 'dyn. Feld' meinst und was Dir die Felder mit PunktKoordinaten helfen sollte? Und nochmals (siehe beiliegende Zeichnung) ==> zeige mal anhand der Zeichnung, wie Du händisch vorgehen würdest, also manuell das mal machen, was Du nachfolgend automatisieren willst. Mach das auch gleich deswegen mit meiner Zeichnung, weil Du dabei vielleicht selbst erkennst, dass 2 Punkte eine Polylinie nur das alleinige Kriterium für die Berechnung der Fläche ist. - alfred - ------------------ www.hollaus.at |
andreschubert6 Mitglied
Beiträge: 20 Registriert: 15.11.2009 AutoCad 2006
|
erstellt am: 12. Dez. 2010 19:28 <-- editieren / zitieren --> Unities abgeben:
Ich kann deine Zeichnung leider nicht öffnen, da schreibgeschützt?! Ich habe aber mal eine ,,Zeichnung'' von mir angehängt. Ich hoffe daraus wird klar worauf ich hinaus will. [Diese Nachricht wurde von andreschubert6 am 12. Dez. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 12. Dez. 2010 19:54 <-- editieren / zitieren -->
Hi, >> Ich kann deine Zeichnung leider nicht öffnen, da schreibgeschützt?!In AutoCAD kann man auch schreibgeschützt öffnen, das sollte also nicht das Problem sein. Kann es sein, dass Du eine alte AutoCAD-Version zur Hand hast und DWG-2007 noch nicht öffnen kannst? Für diese Fälle gibt es auch >>>SystemInfo ausfüllen<<< Zu Deinen PNG-File ==> wo kommen hier 'dynamische Felder' zum Tragen? Wie Du auf Koordinatenpunkte hinkommst, findest Du bereits in der VBA-Hife, Auszug/gekürzt daraus:
object.Coordinates 3DFace, 3DPolyline , Leader, LightweightPolyline, MLine, Point, PolyfaceMesh, PolygonMesh, Polyline, Solid, Trace The object or objects this property applies to. LightweightPolyline objects: The variant is an array of 2D points in OCS. Polyline objects: The variant is an array of 3D points: the X and Y coordinates are in OCS; the Z coordinate is ignored. All other objects: The variant is an array of 3D points in WCS. Remarks:
This property will replace any existing coordinates for the specified object. Use standard array-handling techniques to process the coordinates contained in this property. You cannot change the number of coordinates in the object by using this property. You can change only the location of existing coordinates. For the following objects, the Z coordinate will always default to 0 on the active UCS: 3DFace, Leader, MLine, PolyfaceMesh, and Trace. 3DPolyline , Polyline, PolygonMesh: For simple polylines (not splined or curve fit), this property specifies simple vertices. For splined or curve-fit polylines, this property specifies control point vertices. When setting the coordinates for a polyline, if you supply fewer coordinates than the object currently possesses, the polyline will be truncated. Any fit points applying to the truncated vertices will also be truncated. If you supply more coordinates than the object currently possesses, the extra vertices will be appended to the polyline. The OCS coordinates for the Polyline and LightweightPolyline objects can be converted to and from other coordinate systems using the TranslateCoordinates method. - alfred - ------------------ www.hollaus.at |
andreschubert6 Mitglied
Beiträge: 20 Registriert: 15.11.2009 AutoCad 2006
|
erstellt am: 12. Dez. 2010 20:07 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von a.n.:In AutoCAD kann man auch schreibgeschützt öffnen, das sollte also nicht das Problem sein. Kann es sein, dass Du eine alte AutoCAD-Version zur Hand hast und DWG-2007 noch nicht öffnen kannst?
*räusper* ja, da hast du wohl voll ins schwarze getroffen :-) So ich werde für heute aber erst mal Schluss machen, denn sonnst dreh ich noch voll am Rad... Danke dir aber trozdem erst einmal und ich melde mich wenn ich weiter gekommen bin. Schönen 3. Advent noch.. Andre Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 12. Dez. 2010 20:22 <-- editieren / zitieren -->
Hi, nun denn, Zeichnung nochmals mit 2004-Format (zur Erkenntnis, dass Deine Formel da nicht funktioniert ) - alfred - ------------------ www.hollaus.at |
andreschubert6 Mitglied
Beiträge: 20 Registriert: 15.11.2009 AutoCad 2006
|
erstellt am: 22. Dez. 2010 18:24 <-- editieren / zitieren --> Unities abgeben:
Hallo! Nach kurzer Pause wollt ich mich mal wieder melden. Ich habe es geschaft, wobei ich aber etwas Hilfe hatte. Nun ja unten seht ihr nun eine Lösung meines Problems. Es ging ja darum X und Y Koordinaten herraus zu filtern und weiter zu verwenden. Vermutlich nicht die sauberste Variante aber es funktioniert. Ich hab jetzt aber noch eine weitere Frage. Ich berechne ja mit meinem Programm unter anderem den Flächenschwerpunkt eines ,,Polylinien-Objektes''. Die Koordinaten desselbigen werden auch schön errechnet und in einer UserForm angezeigt. Jetzt meine Frage: Gibt es die Möglichkeit/Befehl einen Punkt mit den jeweiligen Koordinaten (X,Y) in dem gezeichneten Objekt darstellen zu lassen? Ich habe schon gesucht aber nichts gefunden. Gruß Andre Option Explicit Type tKo X As Double Y As Double End Type Sub main() Dim LwPolyobject As Object Dim Koord() As tKo Dim inspoint As Variant If PolygonAnwahl(LwPolyobject) = 0 Then MsgBox "Objekt ist keine Polylinie" Else KoordinatenAuslesen LwPolyobject, inspoint, Koord() ... 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 'Auslesen der Koordinaten Sub KoordinatenAuslesen(LwPolyobject As Object, inspoint As Variant, Koord() As tKo) Dim i, StpCount As Integer inspoint = LwPolyobject.Coordinates StpCount = UBound(inspoint) For i = 0 To Int(UBound(inspoint) / 2) ReDim Preserve Koord(i)
Koord(i).X = inspoint(2 * i) Koord(i).Y = inspoint(2 * i + 1) Next i End Sub ...
[Diese Nachricht wurde von andreschubert6 am 22. Dez. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 22. Dez. 2010 18:36 <-- editieren / zitieren -->
Hi, >> Gibt es die Möglichkeit/Befehl einen Punkt mit den jeweiligen Koordinaten (X,Y) >> in dem gezeichneten Objekt darstellen zu lassen? Wieso nicht einen AutoCAD-Punkt oder einen Block dort einfügen? Anzeigen alleine wäre ja beim nächsten REDRAW bzw. REGEN wieder weg (und ist in VBA auch ein klein wenig aufwendiger). - alfred - PS: zu 'in dem [...] Objekt' nur vorsichtshalber: der Schwerpunkt einer Fläche liegt zuweilen auch ausserhalb der Flächengrenze. ------------------ www.hollaus.at |
andreschubert6 Mitglied
Beiträge: 20 Registriert: 15.11.2009 AutoCad 2006
|
erstellt am: 22. Dez. 2010 18:50 <-- editieren / zitieren --> Unities abgeben:
|
Ex-Mitglied
|
erstellt am: 22. Dez. 2010 19:17 <-- editieren / zitieren -->
Hi, >> Wie macht man sowas? Code: ThisDrawing.ModelSpace.AddPoint(myPnt)
...wobei <myPnt> für ein Array mit 3 Doubles (WCS) steht.Wenn es im Modellbereich sein soll. - alfred - ------------------ www.hollaus.at |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|