| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
 | PNY: der unverzichtbare Partner für umfassende KI-Lösungen von Workstations bis zu Edge Computing und KI-Cluster-Bereitstellung, eine Pressemitteilung
|
Autor
|
Thema: Koord auslesen und sortieren (1730 mal gelesen)
|
ThebigH Mitglied
 Beiträge: 5 Registriert: 04.03.2010 AutoCAD2007
|
erstellt am: 04. Mrz. 2010 17:50 <-- editieren / zitieren --> Unities abgeben:         
Hallo liebe Community!! Das ist mein erster Beitrag (hoffentlich nicht der letzte) und ich hab gleich ein paar schwere Probleme. Ich soll aus einer CAD Zeichnung alle Koordinaten der vorhandenen Punkte auslesen, mit Bubblesort sortieren und hübsch formatiert in eine txt ausgeben. Einlesen, formatieren und ausgeben funktioniert schon ganz gut, aber der Bubblesort sortiert einfach nicht. Bin für jede Hilfe dankbar. Hier mein Code: Sub Bam() Dim obj As AcadEntity Dim Dateiname As String Dim PktKoord As Variant Dim Abstand As Double Dim x(1 To 100) As Double Dim Anz As Integer Dim Mark As Long, I As Long, EndIdx As Long, StartIdx As Long Dim Temp As Variant Dateiname = "D:\Ablage\Bam.txt" Open Dateiname For Output As #1 Anz = 0 For Each obj In ThisDrawing.ModelSpace If TypeOf obj Is AcadPoint Then PktKoord = obj.Coordinates PktKoord(0) = Round(PktKoord(0), 2) PktKoord(1) = Round(PktKoord(1), 2) Anz = Anz + 1 EndIdx = UBound(PktKoord) StartIdx = LBound(PktKoord) Do While EndIdx > StartIdx Mark = StartIdx For I = StartIdx To EndIdx - 1 If PktKoord(I) > PktKoord(I + 1) Eqv Ascending Then Temp = PktKoord(I) PktKoord(I) = PktKoord(I + 1) PktKoord(I + 1) = Temp Mark = I End If Next I EndIdx = Mark Loop Write #1, PktKoord(0); PktKoord(1), n End If Next obj Close #1
End Sub
[Diese Nachricht wurde von ThebigH am 04. Mrz. 2010 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 04. Mrz. 2010 18:35 <-- editieren / zitieren -->
Hi, zugegeben, den Code hab ich nicht probiert, darum könnten die Rückfragen jetzt auch aus der Flüchtigkeit heraus anfechtbar sein. Folgender Gedanke (nur dass ich Deinen Code richtig interpretiere) zuerst holst Du von einem Punkt die Koordinaten, die liegen dann in der Variable PktKoord(0 to 2) und dann überprüfst Du, ob der X-Wert kleiner als der Y-Wert ist, ob der Y-Wert kleiner als der Z-Wert ist und bei Bedarf vertauscht Du X mit Y bzw Y mit Z. So lese ich zumindest diesen Bereich:
Code: For I = StartIdx To EndIdx - 1 '==> da steht ja eigentlich For I = 0 to 1 If PktKoord(I) > PktKoord(I + 1) Then '==> wenn X > Y Temp = PktKoord(I) PktKoord(I) = PktKoord(I + 1) '==> Y=X PktKoord(I + 1) = Temp Mark = I End If Next I
Der Code
Code: Do While EndIdx > StartIdx Mark = StartIdx ... EndIdx = Mark Loop
...läuft in meinen Augen auch nur ein einziges mal, oder? Seh ich das falsch? Oder ist das ev. auch schon Dein Problem?
- alfred - ------------------ www.hollaus.at |
ThebigH Mitglied
 Beiträge: 5 Registriert: 04.03.2010 AutoCAD2007
|
erstellt am: 04. Mrz. 2010 19:13 <-- editieren / zitieren --> Unities abgeben:         
Hallo! Danke für die schnelle Antwort. Also ich lese mehrere Punktkoordinaten aus (in meinem Fall 5), und ich will nach der Größe der x-Werte sortieren, sodass der größte x Wert am anfang steht und der kleinste x Wert am Ende in der Ausgabe. Ich hoffe es ist jetzt verständlich. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 04. Mrz. 2010 19:36 <-- editieren / zitieren -->
Hi, >> und ich will nach der Größe der x-Werte sortieren Das ging aber meinem Verständnis nach mit Deinem Code nicht, Du hast nicht X-Werte unterschiedlicher Punkte verglichen, sondern nur X mit Y des gleichen Punkts verglichen. Von einer Punktliste sehe ich in Deinem Code gar nix. Du verzeihst daher auch, wenn ich auf das Vokabel 'BubbleSort' nicht eingehe (auch weil es sich um ganze 5 Punkte handelt) und stell Dir das Beispiel mal zur Verfügung. - alfred - Code: Public Sub ModuleTemp() Dim i As Integer Dim tPntColl As Collection Set tPntColl = New Collection 'mal eine Liste mit von Koordinaten erstellen For i = 0 To 10 Dim tPnt(2) As Double tPnt(0) = Rnd() tPnt(1) = Rnd() tPnt(2) = Rnd() Call tPntColl.Add(tPnt) Next 'und jetzt sortieren lassen Dim tSortedColl As Collection Set tSortedColl = sortCoords(tPntColl) 'und das sollte es gewesen sein End Sub Private Function sortCoords(ByRef SourceColl As Collection) As Collection Dim tDestColl As Collection Set tDestColl = New Collection Dim tSourceIndex As Integer Dim tDestIndex As Integer For tSourceIndex = 1 To SourceColl.Count Dim tSourcePnt As Variant tSourcePnt = SourceColl.Item(tSourceIndex) If tDestColl.Count = 0 Then Call tDestColl.Add(tSourcePnt) Else Dim tPntAddedOK As Boolean: tPntAddedOK = False Dim tDestPnt As Variant For tDestIndex = 1 To tDestColl.Count tDestPnt = tDestColl.Item(tDestIndex) If tDestPnt(0) < tSourcePnt(0) Then Call tDestColl.Add(tSourcePnt, , tDestIndex) tPntAddedOK = True Exit For End If Next If Not tPntAddedOK Then 'dann am Ende einfügen Call tDestColl.Add(tSourcePnt) End If End If Next Set sortCoords = tDestColl End Function
------------------ www.hollaus.at |
ThebigH Mitglied
 Beiträge: 5 Registriert: 04.03.2010 AutoCAD2007
|
erstellt am: 04. Mrz. 2010 19:50 <-- editieren / zitieren --> Unities abgeben:         
Oh, da seh ich gar nich durch. Ich hab BubbleSort leider als Vorgabe. Und in meinem Beispiel sind es nur 5 Punkte, es muss aber auch mit beliebig vielen Punkten der Zeichnung gehen. Ich hab die 2 dimensionalen Koordinaten der Punkte For Each obj In ThisDrawing.ModelSpace If TypeOf obj Is AcadPoint Then PktKoord = obj.Coordinates PktKoord(0) = Round(PktKoord(0), 2) PktKoord(1) = Round(PktKoord(1), 2) In diesem Fall sind PktKoord(0) meine x Werte und PktKoord(1) meine y Werte. Die x Werte würde ich gerne als Array haben und danach mit BubbleSort der Größe nach sortieren. Ich weiß nicht wie ich die x Werte als array darstellen kann. Ich hoffe das ist irgendwie machbar. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 04. Mrz. 2010 20:00 <-- editieren / zitieren -->
Hi, lies Dir mal das zu 'BubbleSort' durch. Ich finde es immer wieder bei diesem Begriff interessant, wie ein triviales Irgendwas zu einem vermeintlich hochtechnologischem Vokabel mutiert, und das schwirrt dann herum als wärs extrem kompliziert. >> PktKoord = obj.Coordinates >> ... >> In diesem Fall sind PktKoord(0) meine x Werte
Sorry, PktKoord(0) ist genau ein X-Wert, und zwar nur vom aktuellen Punkt <obj> >> Ich weiß nicht wie ich die x Werte als array darstellen kann
Ist Dir Array auch vorgegeben, wenn nein, dann nimm meinen Vorschlag mit Collection. Die Einstiegsroutine mit der Erzeugung von Zufallspunkten kannst Du ja austauschen gegen Deine Einleseroutine. Wie Du die 3 Koordinatenwerten (X/Y/Z) in einer Liste sammelst, steht ja eigentlich da. - alfred - ------------------ www.hollaus.at [Diese Nachricht wurde von a.n. am 04. Mrz. 2010 editiert.] |
ThebigH Mitglied
 Beiträge: 5 Registriert: 04.03.2010 AutoCAD2007
|
erstellt am: 04. Mrz. 2010 20:53 <-- editieren / zitieren --> Unities abgeben:         
Ich weiß das BubbleSort nich so doll is. Aber ich muss das nehmen. Kann denn hier niemand sowas mit BubbleSort?? Und gibt es einen anderen Weg als For Each obj In ThisDrawing.ModelSpace If TypeOf obj Is AcadPoint Then PktKoord = obj.Coordinates um an die Koordinaten zu kommen?? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 04. Mrz. 2010 21:42 <-- editieren / zitieren -->
Hi, >> Kann denn hier niemand sowas mit BubbleSort?? Oh doch, aber ich schreibe Code, den ich brauche. Ich schreibe auch manchmal Code für das Forum. Ich schreibe aber immer nur sinnvollen Code, direkt verwendbar oder als Vorlage zum Ankupfern/Abwandeln für eigene Bedürfnisse, der zielführend ist - für das Ergebnis in der Praxis, nicht für theoretische Ansätze a la Hausaufgaben. >> Und gibt es einen anderen Weg als >> ... >> um an die Koordinaten zu kommen??
Ja, ein SelectionSet machen, das mir nur die Punkte retourniert, damit ich nicht für 5 Punkte eine ganze Zeichnung durchscannen muss. Last-but-not-least kommt dazu, dass ich mit 'kann denn hier niemand' ein kritisches Verhältnis aufgebaut habe.
Somit bin ich out. - alfred -
------------------ www.hollaus.at |
ThebigH Mitglied
 Beiträge: 5 Registriert: 04.03.2010 AutoCAD2007
|
erstellt am: 04. Mrz. 2010 21:50 <-- editieren / zitieren --> Unities abgeben:         
Ich wollte dir nicht zu nahe treten. Aber wenn du mir mit dem BubbleSort Problem nicht helfen möchtest ... dann lass es doch einfach sein. Das mit dem Selection.Set werde ich weiterverfolgen. Danke! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Knerstin Mitglied
 Beiträge: 7 Registriert: 05.03.2010
|
erstellt am: 05. Mrz. 2010 18:00 <-- editieren / zitieren --> Unities abgeben:          Nur für ThebigH
Hi, ich habe die gleiche Aufgabe, hänge aber zurzeit an einem anderen Problem. und zwar habe ich die txt datei und muss ja diese x und y-werte einlesen, wenn ich schreibe Input #100, x, y liest er jedoch nur die 1. zeile aus *ist ja auch logisch wie kann ich ihm sagen dass er die nächste zeile auch auslesen soll? bei der bubblesort funktion, will er ja den ersten wert mit dem zweiten wert vergleichen, jedoch hapert es daran dass er den zweiten wert nicht liest, hat jemand eine idee wie ich das tun kann? Dachte schon an Input #100, x(i), y(i) oder irgendwas mit array....aber funktionieren will das alles nich :-( Vielleicht hat ja jemand eine idee! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 05. Mrz. 2010 18:13 <-- editieren / zitieren -->
Hi, herzlich willkommen bei CAD-de! Ich kann mir und Dir eine Frage leider nicht ersparen: was hat einlesen von einer ASCII-Datei mit dem Forum-Thema AutoCAD VBA zu tun? Ich hätte als erstes mal dieses >>>klick<<< gemacht. Und wenn Ansätze in Richtung AutoCAD-Steuerung mit VBA vorhanden sind und Du an einem bestimmten Punkt (oder ev. mehreren Punkten) hängst, dann zeig uns das Code-Schnippsel, markiere die Problemzeile, und sei Dir der Hilfe hier sicher. - alfred - PS: Meine Auffassung des Forums ist es, bei Problemen im Fortschritt bei der Arbeit zu unterstützen. Dieses Forum ist kein Hausaufgabenlöser. ------------------ www.hollaus.at [Diese Nachricht wurde von a.n. am 05. Mrz. 2010 editiert.] |
Knerstin Mitglied
 Beiträge: 7 Registriert: 05.03.2010
|
erstellt am: 05. Mrz. 2010 18:24 <-- editieren / zitieren --> Unities abgeben:          Nur für ThebigH
hey....ich kann dich ja verstehen und ehrlich gesagt will ich es auch verstehen und googlen tu ich schon seid 3 tagen....habe jede menge sachen gelesen und ausprobiert und komme dennoch nich weiter. mein "derzeitiges" problem-da hast du recht- hat nicht wirklich etwas mit autocad zu tun....dennoch läuft das VBA unter Autocad. vielleicht hast du ja dennoch ein tipp für mich, wie ich die x werte (welche zur zwischenspeicherung in einer textdatei untereinander stehen) nach und nach einlesen und dann vergleichen kann....(das mit dem vergleichen bekomm ich hoffentlich hin) danke schonmal für die schnelle antwort! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 05. Mrz. 2010 18:44 <-- editieren / zitieren -->
Hi, bin gespannt, was jetzt passiert
Code:
Public Sub myImport() Dim tFNr As Integer tFNr = FreeFile Dim X As Double Dim Y As Double Dim Z As Double Dim tArr() As Variant Dim tArrIndex As Integer Open "C:\TEMP\XYZ.TXT" For Input As #tFNr ' Datei zum Einlesen öffnen. Do While Not EOF(tFNr) ' Auf Dateiende abfragen. Input #tFNr, X, Y, Z Dim tPnt(2) As Double tPnt(0) = X tPnt(1) = Y tPnt(2) = Z ReDim Preserve tArr(tArrIndex) tArr(tArrIndex) = tPnt tArrIndex = tArrIndex + 1 Loop Close #tFNr End Sub
- alfred - ------------------ www.hollaus.at |
Knerstin Mitglied
 Beiträge: 7 Registriert: 05.03.2010
|
erstellt am: 08. Mrz. 2010 21:35 <-- editieren / zitieren --> Unities abgeben:          Nur für ThebigH
DAAAAAAAAAANKESCHÖN. Leider bleibt noch eine Frage offen, wenn ich jetzt mit den Koordinaten weiterarbeiten möchte und z.B mit UBound die Anzahl bestimme, schreibe ich doch UBound(X) dann sagt er jedoch, "Erwartet Datenfeld"... ob du mir das noch erklären kannst. es ist doch eindeutig gesagt dass tPnt(0)=X ist.... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 08. Mrz. 2010 22:42 <-- editieren / zitieren -->
Hi, X ist ein Double-Wert und kein Array, daher kannst Du auch den Wert X nicht befragen, aus wie vielen Elementen es/er besteht. Ausgenommen, Du bezeichnest mit X nicht das, was ich oben im Code mit X bezeichnet habe (X-Koordinate), in diesem Fall wäre der Zusammenhang von X mit meinem Beispiel zu erklären. - alfred - ------------------ www.hollaus.at |
Knerstin Mitglied
 Beiträge: 7 Registriert: 05.03.2010
|
erstellt am: 12. Mrz. 2010 15:16 <-- editieren / zitieren --> Unities abgeben:          Nur für ThebigH
So habe es nun soweit hinbekommen, nun habe ich ein anderes Problem, er möchte einfach keinen Kreis zeichnen und sagt andauernd: Laufzeitfehler Die Methode 'Document' für das Objekt 'IAcadModelSpace' ist fehlgeschlagen bei folgendem Quelltext: Dim PKoord(0 To 1) As Double 'PKoord als Array Dim Kreis As AcadCircle Dim Radius As Double Open "D:\Ergebnis.txt" For Input As #100 'Datei für Koordinaten öffnen Input #100, PKoord(0), PKoord(1) Radius = 30 Set Kreis = ThisDrawing.ModelSpace.AddCircle(PKoord, Radius) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 12. Mrz. 2010 15:21 <-- editieren / zitieren -->
Hi, >> Die Methode 'Document' für das Objekt 'IAcadModelSpace' ist fehlgeschlagen Wundert mich, denn die Fehlermeldung passt nicht zu Deinem Code (zu dem Teil, den Du hier gezeigt hast), d.h. der Code bricht wohl woanders ab (oder es sind in den Verweisen des Projekts falsche Einstellungen). Und der ersichtliche Fehler: Der Einfügepunkt des Kreises muss ein 3D-Punkt sein, Du hast aber nur als Array aus 2 Doubles definiert ==> PKoord(0 to 1)
- alfred - ------------------ www.hollaus.at [Diese Nachricht wurde von a.n. am 12. Mrz. 2010 editiert.] |
Knerstin Mitglied
 Beiträge: 7 Registriert: 05.03.2010
|
erstellt am: 12. Mrz. 2010 15:29 <-- editieren / zitieren --> Unities abgeben:          Nur für ThebigH
|
Knerstin Mitglied
 Beiträge: 7 Registriert: 05.03.2010
|
erstellt am: 14. Mrz. 2010 17:59 <-- editieren / zitieren --> Unities abgeben:          Nur für ThebigH
Soooo mal wieder eine Frage :-) ich möchte eine textdatei auslesen und vorerst in einer messagebox fragen, welche zeile aus der textdatei eingelesen wird. sprich mein quelltext sieht so aus: Szenario = InputBox("Was soll dargestellt werden?") Open "D:\E.txt" For Input As #100 If Szenario=1 then open 'dann soll er die erste zeile einlesen und so weiter Input #100, S, h, St, ta, te, c, maxW 'Eingeben der Ergebnisse Close #100 Vielleicht kannst du mir einen tipp geben, wie ich ihm sage, welche zeile er einlesen soll? Gruß und vielen dank Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 14. Mrz. 2010 18:08 <-- editieren / zitieren -->
Hi, Diese Zeile: Open "D:\E.txt" For Input As #100 öffnet eine Datei im sequentiellen Lesemodus, damit kann diese nur von vorne lesen, sprich von 1 beginnen. Mit dieser Öffnungsmethode würde das bedeuten: Vorne anfangen, so lange lesen bis die gewünschte Zeilennummer erzielt ist. Schau Dir daher in der VB/VBA-Hilfe mal die anderen Parameter (und Lesemethoden) von OPEN an, damit Du diese nicht sequentiell liest. - alfred - PS: Du siehst immer #100 als Dateizugriffsnummer an, die könnte aber schon reserviert sein. Vergleich dieses mit meinem Code oben. ------------------ www.hollaus.at |
Knerstin Mitglied
 Beiträge: 7 Registriert: 05.03.2010
|
erstellt am: 14. Mrz. 2010 19:55 <-- editieren / zitieren --> Unities abgeben:          Nur für ThebigH
hmm so richtig komm ich nich voran, auch nich mit google und der hilfe... ich denke ich würde es schaffen mit einer do schleife und der funktion line input die richtige zeile einzulesen. aber wie kann ich dann die ganze zeile in ihre einzelnen komponenten zerlegen? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |

| |
Ex-Mitglied
|
erstellt am: 14. Mrz. 2010 20:32 <-- editieren / zitieren -->
Hi, >>>probier mal<<<, was würde dann helfen, wenn hier nochmals eine Anleitung gemacht wird, die schon tausendfach im Internet existiert? >> aber wie kann ich dann die ganze zeile in ihre einzelnen komponenten zerlegen?
SPLIT könnte hier helfen, nur kommt da zu wenig Info. Der Begriff 'Komponenten' verrät nichts über Deinen Zeilenaufbau, wie soll man/Frau Dir helfen? - alfred - ------------------ www.hollaus.at |