Autor
|
Thema: Alle Kombinationen aus mehreren Konfigurationstabellen (851 mal gelesen)
|
Mjk Mitglied
Beiträge: 14 Registriert: 17.06.2013 CATIA V5-6 R24 WINDOWS 7
|
erstellt am: 24. Nov. 2016 08:23 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich bin jetzt schon seit einigen Wochen am Verzweifeln, bzw. ich zweifele an mir. Ich habe mir die Aufgabe gestellt eine VBA Macro zu erstellen in dem der User eine oder mehrere Konfigurationstabellen aus dem Strukturbaum auswählen kann. In der Folge soll dann jede mögliche Konfigurationskombination gebildet werden. Anschließend wird die Ergebnisgeometrie verarbeitet. Ich habe die Selektion fertig. Auch die Verarbeitung klappt bereits. Was mir gerade schwer fällt ist das Bilden der Kombinationen. z.Z. liegen die Konfigurationstabellen nach der Selektion als Objekte in einem Array. Ich kann dort also alle Daten finden die mir bisher nötig erscheinen: Anzahl der Tabellen und für jede Tabelle die Anzahl der Konfigurationen, sowie die momentane Konfiguration. Ich bin für jede Hilfe und jeden Denkansatz dankbar. Wenn ich was vergessen habe zu schreiben, dann lasst es mich bitte wissen. Gruß Mjk Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 24. Nov. 2016 12:57 <-- editieren / zitieren --> Unities abgeben: Nur für Mjk
Also - so ganz hab ich das nicht verstanden. Bei Tabellen denk ich immer an Normteile/Normalien etc. Dinge bei denen sich die Varianten gut in einer Tabelle darstellen lassen. Allerdings wird dann immer genau eine Variante angewandt. Was heisst
Zitat: jede mögliche Konfigurationskombination
und wie willst Du die - gleichzeitig - darstellen? Tschau, Joe ------------------ Inoffizielle Catia Hilfeseite Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Mjk Mitglied
Beiträge: 14 Registriert: 17.06.2013 CATIA V5-6 R24 WINDOWS 7
|
erstellt am: 24. Nov. 2016 18:13 <-- editieren / zitieren --> Unities abgeben:
Hallo, Vielen Dank für die Rückmeldung. sorry, dass ich mein Problem nicht ausreichend beschrieben habe. Ein Beispiel aus meiner Welt: Ich bin Optikentwickler und möchte z.B. ein System mit 3 Lichtquellen und 3 passenden Reflektoren erstellen. Jetzt möchte ich die Brennweite jeder Lichtquelle zum Reflektor einstellen. Dieser Wert kann z.B. 10, 15, 20mm annehmen, kann aber für jeden Reflektor unterschiedlich sein. Ich habe mir drei DesignTables mit der Variation für jeden Reflektor angelegt. Jetzt könnte ich manuell die Konfigurationen kombinieren... Kombination 1 Reflektor 1 - 10mm Reflektor 2 - 10mm Reflektor 3 - 10mm ---Berechnung--- Kombination 2 Reflektor 1 - 15mm Reflektor 2 - 10mm Reflektor 3 - 10mm ---Berechnung--- Kombination 3 Reflektor 1 - 20mm Reflektor 2 - 10mm Reflektor 3 - 10mm usw... Ich möchte also nicht jede Kombination gleichzeitig einstellen können sondern nach und nach alle Möglichkeiten durchprobieren... Das Ganze soll dann nicht mit 3 Tabellen, sondern mit n Tabellen mit beliebiger Konfigurationszahl funktionieren. Das Ganze sah auf den ersten Blick nach Schleifen in VBA aus. P.S. das ganze funktioniert bereits mit einer Tabelle also die ganze logik drum herum sollte funktionieren, aber eine Schleife (mehrere Schleifen) die sich selbst durchhangelt will mir einfach nicht gelingen. Vielen Dank.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 24. Nov. 2016 20:03 <-- editieren / zitieren --> Unities abgeben: Nur für Mjk
Hi, So wie ich das jetzt verstehe, willst alle denkbaren Kombinationen durchlaufen. Na denn ...
Code:
Option ExplicitPrivate Sub ScanKombis() 'umbenannt; war FormLoad Dim i As Integer Dim j As Integer Dim k As Integer Dim n As Integer Dim arrRefl 'array der reflektorenwerte arrRefl = Array(10, 15, 20) 'geht genauso gut in einzelanweisungen For i = 0 To UBound(arrRefl) For j = 0 To UBound(arrRefl) For k = 0 To UBound(arrRefl) n = n + 1 'zähler erhöhen 'Variante und Kombi ausgeben Debug.Print "Variante: " & n, "i = " & arrRefl(i), "j = " & arrRefl(j), "k = " & arrRefl(k) Next Next Next End Sub
Lass den Code im VBA-Editor laufen. Der 'Debug.Print' gibt die Variante mit der aktuell verwendeten Kombi aus. Stattdessen kannst auch eine andere Funktion mit den drei Variablen füttern. Hope it helps, Joe ------------------ Inoffizielle Catia Hilfeseite 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: 24. Nov. 2016 21:54 <-- editieren / zitieren --> Unities abgeben: Nur für Mjk
Servus Warum hast du den drei Tabellen? Wäre es nicht einfach alle drei Reflektoren in einer Tabelle steuern? Die verschiedenen Kombinationen könntest du in der Tabelle recht einfach "eingeben" (ist ja ein "Muster") Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Mjk Mitglied
Beiträge: 14 Registriert: 17.06.2013 CATIA V5-6 R24 WINDOWS 7
|
erstellt am: 28. Nov. 2016 07:18 <-- editieren / zitieren --> Unities abgeben:
Hallo, vielen Dank für eure Antworten. @Joe - ja, der Code zielt in die richtige Richtung, aber mein Ziel ist ja, dass der Benutzer die Tabellen auswählen kann - ich weiß also nicht wie viele Tabellen kombiniert werden sollen. Das Ganze soll also allgemeingültiger formuliert werden und genau daran scheitere ich. @Bernd - das Beispiel mit den Reflektoren ist wirklich sehr Simpel - zum Testen. Da könnte ich wirklich alles in eine Tabelle schreiben. Gruß Martin 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: 28. Nov. 2016 10:03 <-- editieren / zitieren --> Unities abgeben: Nur für Mjk
Servus Schöne Aufgabe. (ggf steht in einem Mathematikbuch ein guter Lösungsansatz) Meine Idee wie man das lösen könnte. zB gegeben sind drei Tabellen mit (2, 3, 2) Einträgen. Die Anzahl der Kombinationen ist 2*3*2=12. Einen Array(1 to 12, 1 to 3) erstellen und mit einer Schleife Spalten (Tabellen) ausfüllen. Dabei mathematisch das Muster beschreiben. Code: 1,1,1 2,1,1 1,2,1 2,2,1 1,3,1 2,3,1 1,1,2 2,1,2 1,2,2 2,2,2 1,3,2 2,3,2
Also in der ersten Spalte Wiederholung jeder Variante von 1, in der zweiten 1 * 2 (Anzahl der Varianten aus der ersten Spalte) = 2, in der dritten 1*2*3=6 usw Mit Sicherheit geht das auch mathematisch eleganter. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 28. Nov. 2016 14:53 <-- editieren / zitieren --> Unities abgeben: Nur für Mjk
Hi Martin, die Antwort ist '42'. Wenn Du's genauer brauchst, solltest die Aufgabenstellung genauer formulieren/eingrenzen. Im Ernst: So vage läst sich nicht programmieren. Wenn Du nicht weisst wieviele Tabellen(Schleifen) Du brauchst, musst erstmal für alle denkbaren Tabellenkombinationen/anzahlen eine Programmlösung vorhalten a la If nTables = 3 Then '3 schleifen For n = elseif nTables = 4 then '4 schleifen For n = elseif nTables = 5 then '5 schleifen etc ad infinitum
Das wird irgendwann albern. Tschau, Joe ------------------ Inoffizielle Catia Hilfeseite 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: 28. Nov. 2016 17:51 <-- editieren / zitieren --> Unities abgeben: Nur für Mjk
Servus Ich hab da mal was zusammengebastelt. Die Idee dahinter ist die Varianten der Reihenfolge "durchzuschalten" wie wenn man an einem Nummernschloss alle Kombination durchprobiert. Code: Sub GetComibinations2()Dim intNumberOfCombinations As Integer Dim iRow As Integer Dim iCol As Integer Dim i As Integer Dim aSolution() 'Inputarray, definiert die einzelnen Lösungsmöglichkeiten pro Element Dim aInput(1 To 4) As Integer aInput(1) = 5 aInput(2) = 3 aInput(3) = 4 aInput(4) = 2 'Anzahl der Kombinationen ermitteln intNumberOfCombinations = 1 For i = LBound(aInput) To UBound(aInput) intNumberOfCombinations = intNumberOfCombinations * aInput(i) Next 'Lösungsarray anlegen ReDim aSolution(1 To intNumberOfCombinations, 1 To UBound(aInput)) 'Lösungsarray ausfüllen For iRow = LBound(aSolution, 1) To UBound(aSolution, 1) 'Schleife über alle Zeilen 'erste Reihe initial ausfüllen If iRow = LBound(aSolution, 1) Then For iCol = LBound(aSolution, 2) To UBound(aSolution, 2) aSolution(iRow, iCol) = 1 Next iCol Else 'Werte von vorhergender Reihe übertragen For iCol = LBound(aSolution, 2) To UBound(aSolution, 2) aSolution(iRow, iCol) = aSolution(iRow - 1, iCol) Next iCol 'neue Kombination erstellen: um eins "hochzählen" For iCol = LBound(aSolution, 2) To UBound(aSolution, 2) 'falls letzte Variante schon höchsten indes hat If aSolution(iRow - 1, iCol) + 1 > aInput(iCol) Then aSolution(iRow, iCol) = 1 Else aSolution(iRow, iCol) = aSolution(iRow - 1, iCol) + 1 Exit For End If Next iCol End If Next iRow MsgBox "Fertig" End Sub
Mit Sicherheit geht das auch schöner oder eleganter. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Mjk Mitglied
Beiträge: 14 Registriert: 17.06.2013 CATIA V5-6 R24 WINDOWS 7
|
erstellt am: 28. Nov. 2016 20:13 <-- editieren / zitieren --> Unities abgeben:
Hallo, Vielen Dank für den Lösungsvorschlag. Ich werde wohl ein paar Tage brauchen um ihn zu verstehen und umzusetzen. Ich finde aber die Grundidee genial. Ich melde mich dann bald wieder. Gruß Martin Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Mjk Mitglied
Beiträge: 14 Registriert: 17.06.2013 CATIA V5-6 R24 WINDOWS 7
|
erstellt am: 29. Nov. 2016 16:36 <-- editieren / zitieren --> Unities abgeben:
Hallo, es funktioniert! Vielen, vielen Dank. Sah gleich genial aus und ist es immernoch! Ich habe das Befüllen des Inputarrays angepasst... aDesignTable() enthält die Objekte der Konfigurationstabellen aus der User-Selection Code:
'Inputarray, definiert die einzelnen Lösungsmöglichkeiten pro Element ReDim aInput(LBound(aDesignTable) To UBound(aDesignTable)) As Integer For i = LBound(aInput) To UBound(aInput) aInput(i) = aDesignTable(i).Value.ConfigurationsNb Next
...dann hier und dort ein paar Elemente die zuvor "Fix" waren unabhängig gestaltet... Code:
'Lösungsarray anlegen ReDim aSolution(1 To intNumberOfCombinations, LBound(aInput) To UBound(aInput))
... und am Schluss eine Verarbeitungsschleife gebaut. Code:
For i = 1 To intNumberOfCombinations iCurrentConfiguration = 0 For Each Item In aDesignTable Item.Value.Configuration = aSolution(i, iCurrentConfiguration) iCurrentConfiguration = iCurrentConfiguration + 1 Next 'Code fuer Simulation Next
Viele Grüße Martin [Diese Nachricht wurde von Mjk am 29. Nov. 2016 editiert.] [Diese Nachricht wurde von Mjk am 29. Nov. 2016 editiert.] [Diese Nachricht wurde von Mjk am 20. Dez. 2016 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|