Autor
|
Thema: 2D Array sortieren (797 mal gelesen)
|
Booyaka Mitglied
Beiträge: 122 Registriert: 22.06.2012 CATIA V5 R19, 24, 26, 28, 29
|
erstellt am: 17. Jan. 2019 12:26 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich hätte da wieder einmal ein Problem. Aufgabe: Koordinaten der Endpunkte von Linien auslesen (nach Möglichkeit sortiert). und in .txt-Datei überführen Momentaner Stand: Wegen dieser Aufgabe beschäftige ich mich seit ein paar Tagen mit Arrays und versuche rauszufinden wie das so funktioniert ^^'.
Also ein Array aufzubauen krieg ich jetzt schonmal hin (s. Anhang). Und hier mal noch ein Auszug aus dem Code: Code:
'------------ Anzahl der Linien ermitteln oSearch = oSel.Search("Type=Line,sel") oCountLine = oSel.Count 'MsgBox ("Anzahl der Linien: " & oCountLine) '------------ Erzeugen des GeoSets für die Punkte Set oRefPointGeoset = oHybridBodies.Add() oRefPointGeoset.Name = "RefPoints" Set oHybridShapePoints = oRefPointGeoset.HybridShapes
'------------ Referenzlinien Set oRefLineGeoSet = oHybridBodies.Item(oSelName) Set oHybridShapes = oRefLineGeoSet.HybridShapes
'------------ Vorbereitung für die Schleife Dim oPoint1Coords(2) Dim oPoint2Coords(2) Dim oP1, oP2, oArrY, oArrYMax As Integer oP1 = -1 oP2 = 0 oArrY = -1 oArrYMax = oCountLine - 1 Dim oArr() ReDim oArr(5, oArrYMax) '------------ Schleife zum Erzeugen der Endpunkte und schreiben in ein Array For i = 1 To oCountLine oP1 = oP1 + 2 oP2 = oP2 + 2 oArrY = oArrY + 1 Set oRefLine = oHybridShapes.Item(i) Set oReference = oPart.CreateReferenceFromObject(oRefLine) Set oPoint1 = oHybridShapeFactory.AddNewPointOnCurveFromDistance(oReference, 0, False) oRefPointGeoset.AppendHybridShape oPoint1 oPart.UpdateObject (oPoint1) Set oPoint2 = oHybridShapeFactory.AddNewPointOnCurveFromPercent(oReference, 1, False) oRefPointGeoset.AppendHybridShape oPoint2 oPart.UpdateObject (oPoint2) oHybridShapePoints.Item(oP1).GetCoordinates oPoint1Coords oHybridShapePoints.Item(oP2).GetCoordinates oPoint2Coords oX1 = Round(oPoint1Coords(0), 3) oY1 = Round(oPoint1Coords(1), 3) oZ1 = Round(oPoint1Coords(2), 3) oX2 = Round(oPoint2Coords(0), 3) oY2 = Round(oPoint2Coords(1), 3) oZ2 = Round(oPoint2Coords(2), 3) oArr(0, oArrY) = oX1 oArr(1, oArrY) = oY1 oArr(2, oArrY) = oZ1 oArr(3, oArrY) = oX2 oArr(4, oArrY) = oY2 oArr(5, oArrY) = oZ2 Next
(für Verbesserungsvorschläge für den Code wär ich auch dankbar ^^') Dazu hätt ich dann jetzt auch mal eine Frage beim googeln bin ich da nicht so schlau drauss geworden. Fragen: Ich werd aus dem sortieren noch nicht ganz so schlau.
1. Wenn ich jetzt nach X1 sortieren würd (aufsteigend), würden sich dann dementsprechend die anderen spalten mit verschieben? Also sind die Spalten (pro Zeile) immer mit einander "verbunden"?
2. Wenn es denn dann Sortiert ist kann man dann auch direkt ne ganze Zeile raus schreiben lassen oder muss ich jede Zelle einzeln auslesen (über Schleife zum Beispiel) 3. Die wohl wichtigste Frage ist wie funktioniert das Sortieren? Ich find zwar ne Menge aber das bezieht sich meist alles auf Excel und da wirkt es so als ob sie da Zellen sortieren (in nem Sheet) und die dann entnehmen das gibts ja bei mir net. Oder versteh ich das falsch.
Ok ich hoffe jemand kann mir folgen ^^' MfG Sascha ------------------ „Nicht Erfolg ist der Schlüssel zum Glück, sondern Glück ist der Schlüssel zum Erfolg. Wenn du gerne tust, was du tust, wirst du auch erfolgreich sein.“ ― Albert Schweitzer [Diese Nachricht wurde von Booyaka am 17. Jan. 2019 editiert.] [Diese Nachricht wurde von Booyaka am 17. Jan. 2019 editiert.] [Diese Nachricht wurde von Booyaka am 17. Jan. 2019 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Booyaka Mitglied
Beiträge: 122 Registriert: 22.06.2012 CATIA V5 R19, 24, 26, 28, 29
|
erstellt am: 17. Jan. 2019 13:04 <-- editieren / zitieren --> Unities abgeben:
Langsam steig ich durch ^^' Anscheind funktioniert das so: Code:
First = LBound(oArr) Last = UBound(oArr) For k = First To Last - 1 For kk = k + 1 To Last If oArr(0, k) > oArr(0, kk) Then 'X1 Temp = oArr(0, kk) oArr(0, kk) = oArr(0, k) oArr(0, k) = Temp 'Y1 Temp = oArr(1, kk) oArr(1, kk) = oArr(1, k) oArr(1, k) = Temp 'Z1 Temp = oArr(2, kk) oArr(2, kk) = oArr(2, k) oArr(2, k) = Temp 'X2 Temp = oArr(3, kk) oArr(3, kk) = oArr(3, k) oArr(3, k) = Temp 'Y2 Temp = oArr(4, kk) oArr(4, kk) = oArr(4, k) oArr(4, k) = Temp 'Z2 Temp = oArr(5, kk) oArr(5, kk) = oArr(5, k) oArr(5, k) = Temp End If Next kk Next k
Ich hab den Code mal Erweitert und es Funktioniert auch soweit nach mehrmaligem Kontrollieren immer noch kein fehler gefunden in dem Array. Ich habe aber das Gefühl das das umständlich geschrieben ist. kann man das irgendwie vereinfachen? ^^' ------------------ „Nicht Erfolg ist der Schlüssel zum Glück, sondern Glück ist der Schlüssel zum Erfolg. Wenn du gerne tust, was du tust, wirst du auch erfolgreich sein.“ ― Albert Schweitzer [Diese Nachricht wurde von Booyaka am 17. Jan. 2019 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 17. Jan. 2019 13:32 <-- editieren / zitieren --> Unities abgeben: Nur für Booyaka
Servus Willst du jede Spalte für sich sortieren? Was für ein Sinn hat den das, dann geht doch die Zuordnung der Koordinaten pro Punkt verloren. Verbesserungsvorschläge: - Vergleich und Austausch in extra Funktion auslagern und pro Spalte diese dann aufrufen - Array in 6 Arrays zerlegen, diese dann sortieren (Bubbelsort, Quicksort), Gesamtarray wieder zusammensetzen Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Booyaka Mitglied
Beiträge: 122 Registriert: 22.06.2012 CATIA V5 R19, 24, 26, 28, 29
|
erstellt am: 17. Jan. 2019 13:50 <-- editieren / zitieren --> Unities abgeben:
Erstmal danke für die Infos, Ich möchte natülich nicht jede Spalte einzeln sortieren, wie du schon sagst ich will das die zugehörigkeit der Koordinaten vorhanden bleibt. Bsp: Wenn ich den kleinsten Wert der Spalte 1 in Zeile 3 stehen hab und möchte das dieser in Zeile 1 rutscht (aufsteigend sortieren), dann soll dementsprechend der jeweilige Wert der 3. Zeile aus den Spalten 2-6 ebenfalls an in die erste Zeile gesetzt werden. Deswegen dachte ich halt das ich wie beim 2. Post von mir beschrieben das wenn ich nach Spalte gucke welcher wert größer ist (If-Befehl) und dann dem entsprechen d die 1. Spalte sortire muss ich das selbe Sortieren ja nur auf die anderen Spalten übertragen um die Zugehörigkeiten bei zu behalten. Oder ist der Denkansatz falsch? Zu deinen Verbesserungsvorschlägen: das mit dem Vergleichen und Austauschen versteh ich nicht so ganz wie du das meinst? hab ich da nicht ebenfalls das Problem das die Zugehörigkeit mir flöten geht? Wenn ich den Array in 6 einzelen zerlege habe ich doch auch keine zusammengehörigkeit der Spalten mehr oder? Sorry für die blöden Fragen ^^' ------------------ „Nicht Erfolg ist der Schlüssel zum Glück, sondern Glück ist der Schlüssel zum Erfolg. Wenn du gerne tust, was du tust, wirst du auch erfolgreich sein.“ ― Albert Schweitzer Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 17. Jan. 2019 14:09 <-- editieren / zitieren --> Unities abgeben: Nur für Booyaka
Servus Sorry, ich hab dein Code falsch interpretiert. Somit sind meine Vorschläge nicht zielführend. Du könntest: - dir bestehende Sortierfunktionen mal anschauen (zB hier) - den Austausch der Elemente für die einzelnen Spalten auch mit einer Schleife abarbeiten (wäre dann auch unabhängig von der Spaltenzahl) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|