Autor
|
Thema: Flächen aus geometrischen Sets auslesen und Referenz erstellen (2873 mal gelesen)
|
Luhukas Mitglied
Beiträge: 13 Registriert: 24.01.2018 CATIA V5 R20
|
erstellt am: 08. Feb. 2018 11:03 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich habe folgende geometrische Sets, in denen Flächen sind: GeoSet.1: -FlächeA.1 -FlächeB.1 -FlächeC.1 -FlächeD.1 -FlächeE.1 usw GeoSet.2 -FlächeA.2 -FlächeC.2 -FlächeD.2 -FlächeE.2 usw GeoSet.3 -FlächeC.3 -FlächeE.3 usw GeoSet4 -Fläche... GeoSet5 -Fläche... usw... In jedem neuen GeoSet fallen (möglicherweise) Flächen heraus, das ganze setzt sich beliebig weit fort. Nun möchte ich eine Referenz jeweils auf die Fläche mit der höchsten Nummer haben. Im Beispiel also auf: -FlächeA.2 -FlächeB.1 -FlächeC.3 -FlächeD.2 -FlächeE.3 Bisher habe ich immer mit dem Makrorekorder gearbeitet und den Rest dann drumherum gebaut, das ist hier leider nicht möglich. Leider habe ich hier keinen Ansatz, wie ich das ganze angehe, kann mir dabei jemand behilflich sein? Lukas 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: 08. Feb. 2018 11:10 <-- editieren / zitieren --> Unities abgeben: Nur für Luhukas
Servus Eine Möglichkeit wäre: - per Selection nach den Flächen suchen (nach Typ und Name (zB Name='FlächeA.*')) - Ergebnis mit zB Bubblesort sortieren - gewünschte Fläche bestimmen - nächste Suche Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KADv5 Mitglied Ingenieur
Beiträge: 13 Registriert: 22.01.2018 Intel Xeon E5-2643 3,4Ghz 12,0 GB Ram Win 7 Enterprise 64-bit Catia V5R26 SP3 HF21
|
erstellt am: 08. Feb. 2018 11:41 <-- editieren / zitieren --> Unities abgeben: Nur für Luhukas
Sind die Namen der Flächen und der Geo-Sets denn immer gleich? Also heißen die Flächen auch in Catia "FlächeA.2" usw.? Heißen die Geo-Sets auch in Catia "GeoSet.2" usw.? Dann könntest du mit einer Schleife durch die Namen der Features "suchen". Folgendes Makro sucht zum Beispiel im "Geometrical Set.1" nach Flächen mit dem namen "Fill.1" ,2,3...99 usw. und blendet die höchste Zählernummer aus: Code:
Sub CATMain()Dim Ref1 As Reference For i = 1 To 99 On Error Resume Next Set Ref1 = CATIA.ActiveDocument.Part.CreateReferenceFromObject(CATIA.ActiveDocument.Part.HybridBodies.Item("Geometrical Set.1").HybridShapes.Item("Fill." & i)) Next Set Factory = CATIA.ActiveDocument.Part.HybridShapeFactory Factory.GSMVisibility Ref1, 0 End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Luhukas Mitglied
Beiträge: 13 Registriert: 24.01.2018 CATIA V5 R20
|
erstellt am: 08. Feb. 2018 12:35 <-- editieren / zitieren --> Unities abgeben:
|
Luhukas Mitglied
Beiträge: 13 Registriert: 24.01.2018 CATIA V5 R20
|
erstellt am: 21. Feb. 2018 16:46 <-- editieren / zitieren --> Unities abgeben:
Hallo, das hat, so wie KADv5 gesagt hat, soweit einigermaßen geklappt, allerdings habe ich noch ein paar Fragen: Wenn ich nun nach allen Flächen aus den Geosets suche: Code: selection1.Add GeoSet1,2,3selection1.Search "(((CATStFreeStyleSearch.Surface + CATPrtSearch.Surface) + CATGmoSearch.Surface) + CATSpdSearch.Surface), sel"
alle Flächen relevanten Flächen werden gefunden (da korrekt hervorgehoben) und dann diese Zeile verwende: Code: Set Ref1 = CATIA.ActiveDocument.Part.CreateReferenceFromObject(CATIA.ActiveDocument.Part.HybridBodies.Item("Geometrical Set.1").HybridShapes.Item("Fill." & i))
und Sie so umschreibe: Code: Set Ref1 = part1.CreateReferenceFromObject(selection1.Item("FlächeA." & i))
Funktioniert das leider nicht, obwohl keine Fehlermeldung erscheint. Außerdem möchte ich den Code noch etwas erweitern: Wenn jetzt im zweiten GeoSet beispielsweise noch eine Fläche hinzukommt, die nicht der vorgeschriebenen Namensgebung entspricht, (z.B. NeueFläche.1), kann ich diese dann mit einer If-Schleife herausfiltern, in etwa so: if selection1 (ungleich) FlächeA,B,C,D,E... then set Ref auf NeueFläche.1 Ich hoffe ihr versteht was ich meine Viele Grüße Lukas 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: 21. Feb. 2018 17:26 <-- editieren / zitieren --> Unities abgeben: Nur für Luhukas
Servus Lukas Du könntest die Suche einschränken dass nur Flächen mit einem bestimmten Namensmuster gefunden werden. zB Code: selection1.Search "+ CATGmoSearch.Surface + Name='Fläche*',sel"
Leider kann mna nicht per Name auf Elemente der Selektion zugreifen. Beispiel zur Erzeugung der Referenz: Code: Set Ref1 = part1.CreateReferenceFromObject(selection1.Item2(1).value) 'bzw statt 1 einen Laufvariable nutzen 'oder Set Ref1 = selection1.Item2(1).Reference
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Luhukas Mitglied
Beiträge: 13 Registriert: 24.01.2018 CATIA V5 R20
|
erstellt am: 27. Feb. 2018 11:14 <-- editieren / zitieren --> Unities abgeben:
Hallo, ist es möglich ein Element innerhalb einer Selection zu kopieren? mit: Code: selection1.Item2(3).Value.Copy
funktioniert das leider nicht, allerdings kann der Name angezeigt werden: Code: MsgBox selection1.Item2(3).Value.Name
Ist es dann möglich den Namen unter einer Variablen zu speichern und dann über eine neue Suche per Selection nach dem Namen (der dann über die Variable aufgerufen wird) zu suchen? Gibt es außerdem eine Möglichkeit für ein Makro, das die Flächen in Geometrische Sets vergleicht, also ob der Name der Fläche in allen Geometrischen Sets vorkommt, auch wenn der Name der Fläche unbekannnt ist. Vieln Dank nochmal für eure Hilfe! 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: 27. Feb. 2018 16:38 <-- editieren / zitieren --> Unities abgeben: Nur für Luhukas
Servus Nein, du kannst immer nur die ganze Selektion kopieren. Ja klar: Code: strFaceName = selection1.Item2(3).Value.Name
per Namen auf Element zugreifen ohne sicher zu sein ob es existiert (ungetestet): Code:
On Error Resume Next 'Fehlerbehandlung ausschalten Set myFace = oHybridbody.HybridShapes.Item("NameDerFläche.1") if myFace is Nothing then MsgBox "Fläche nicht gefunden" exit Sub end if On Error GotTo 0 'Fehlerbehandlung wieder einschalten WICHTIG
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Luhukas Mitglied
Beiträge: 13 Registriert: 24.01.2018 CATIA V5 R20
|
erstellt am: 28. Feb. 2018 12:58 <-- editieren / zitieren --> Unities abgeben:
|
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 28. Feb. 2018 13:12 <-- editieren / zitieren --> Unities abgeben: Nur für Luhukas
Servus Wenn dann eher so: Code: selection2.Search "Name = " & strFaceName & ", sel"
Aber warum nochmal suchen wenn du auch das Objekt (die Fläche) zwischenspeichern könntest: Code: Set MyFace = selection1.Item2(3).Value
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Luhukas Mitglied
Beiträge: 13 Registriert: 24.01.2018 CATIA V5 R20
|
erstellt am: 28. Feb. 2018 13:46 <-- editieren / zitieren --> Unities abgeben:
Da ich die neue Fläche kopieren will, in dem Fall kopiere ich die neue Selection. oder wäre es hier auch möglich Code: Set MyFace = selection1.Item2(3).Value
MyFace einfach zu kopieren? Zu dem anderen Thema: Ich suche nach einer Möglichkeit, dass ein Makro in verschiedenen Geometrischen Sets erkennt, ob zwei Flächen den gleichen Namen haben, ohne dass ich diesen Namen davor definiert habe: GeoSet1 x.1 y.1 z.1 GeoSet2: x.2 z.2 a.1 b.1 in diesem Fall würde er mir ausgeben, dass x und z zwei mal vorhanden sind, die anderen jeweils nur einmal Ich möchte nur die Namen der GeoSets im Vorhinein angeben, die Namen der Flächen sollen frei wählbar sein, es soll nur gesucht werden, ob ein Name in beiden oder nur in einem GeoSet vorkommt.
Viele Grüße Lukas
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. Feb. 2018 13:54 <-- editieren / zitieren --> Unities abgeben: Nur für Luhukas
Servus Nein du kannst nur den gesamten Inhalt der Selektion kopieren. Also zB Element dass du kopieren willst zwischenspeichern, Selektion leeren, gespeichertes Element selektieren und dann kopieren. Das erkennen von Elementen mit doppelten (Teil)Namen wird wohl recht komplex und umständlich. Kennst du nun die Basisnamen und Namen der GeoSets? Ist der Zähler im Namen des GeoSet und im Flächenname immer gleich? Wenn ja könntest du dies über verschachtelte Schleifen und ansprechen der Elemente per Name bewerkstelligen (so ähnlich wie es KADv5 skizziert hat) Wie würdest du manuell vorgehen die Flächen "zu sammeln"? ggf könntest du das auf den Ablauf eines Makros anwenden. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Luhukas Mitglied
Beiträge: 13 Registriert: 24.01.2018 CATIA V5 R20
|
erstellt am: 28. Feb. 2018 14:16 <-- editieren / zitieren --> Unities abgeben:
Deswegen war meine Idee in einer zweiten Suche nach dem dritten Ergebnis der ersten Suche zu suchen: Code: strFaceName = selection1.Item2(3).Value.Name selection2.Search "Name = " & strFaceName & ", sel"
und dann selection2 zu kopieren. Das ist zwar umständlich, sollte aber funktionieren. Das Problem ist, ich kenne nur die Namen der Flächen aus dem ersten GeoSet. Wenn die Flächen nur geändert werden (x.1 zu x.2), die Namen aus den weiteren GeoSets also gleich sind, funktioniert es so wie KADv5 es beschrieben hat. Kommen neue Flächen hinzu (a.1 und die Neue Fläche steht hinter den alten, hat also eine höhere Value in der Selection), hatte ich die Idee über eine Schleife, da mir die Anzahl der Flächen in GeoSet1 bekannt sind (If GeoSet2.Count > GeoSet1.Count Then das mit der Suche nach z.B. der dritten Fläche in GeoSet2 (vorausgesetzt GeoSet1 beinhaltet 2 Flächen)
Wenn nun aber, wie in meinem Beispiel, auch Flächen herausfallen (y.1) weiß ich nicht wie ich das managen kann. Manuell würde ich alles GeoSets durchsuchen und immer die Fläche mit mit der höchsten Nummer kopieren und in ein Neues GeoSet einfügen. 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. Feb. 2018 14:30 <-- editieren / zitieren --> Unities abgeben: Nur für Luhukas
Servus Kleiner Hinweis: es gibt nur eine Selektion. Also wenn du zB suchst sind die Elemente die zuvor selektiert wurden wieder weg (ggf Inhalt der Selektion vorher zwischenspeichern) Wie wäre es mit folgender Vorgehensweise: - Array oder Collection für die Flächen anlegen - GeoSets von hinten nach vorne per Schleife durcharbeiten - Hybridshapes per Schleife durcharbeiten (ggf noch Typ auswerten und ggf Element überspringen) - falls der Name (beim Vergleich Punkt mit Index abschneiden) der Fläche noch nicht im Array/Collection vorkommt diese hinzufügen sonst zur nächsten Fläche gehen - nach Beendigung der verschachtelten Schleifen solltest du einen Array/Collection mit den "höchsten" Flächen haben. Dies kannst du dann zB selektieren und kopieren. (vergleiche auch ähnliche Vorgehensweise hier) Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Luhukas Mitglied
Beiträge: 13 Registriert: 24.01.2018 CATIA V5 R20
|
erstellt am: 28. Feb. 2018 14:57 <-- editieren / zitieren --> Unities abgeben:
|
Luhukas Mitglied
Beiträge: 13 Registriert: 24.01.2018 CATIA V5 R20
|
erstellt am: 07. Mrz. 2018 13:49 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich schon wieder Also ich habe nun einen Array "Flächen" erstellt, alle Flächen aus dem höchsten GeoSet per Selection ausgewählt und dem Array hinzugefügt. Danach habe ich die Flächen aus dem nächsten GeoSet ausgewählt (selection1) und versuche nun nur die Flächen, welche noch nicht in dem Array sind, hinzuzufügen. In dem Post, den du verlinkt hast wird hierauf verwiesen: http://www.vbarchiv.net/tipps/tipp_1650-isinarray-element-in-array-vorhanden.html. Das löst eigentlich genau mein Problem. Allerdings stehe ich gerade total auf dem Schlauch und weiß nicht, wie ich diesen Code auf mein Problem übertragen kann. Ich habe bis jetzt versucht, einfach nur die Variablen zu ändern, allerdings ohne Erfolg. Es wird gar keine Fläche hinzugefügt, dabei habe ich noch nicht einmal versucht die Nummerierung abzuschneiden: Code: Public Function IsInArray(ByRef Flächen() As String, _ ByVal sItem As String, _ Optional ByVal nStart As Variant, _ Optional ByVal nEnd As Variant) As Long ' Prüfen, ob das Element "sItem" im Array "sArray" enthalten ist ' Rückgabewert: Index des Elements bzw. -1, wenn nicht vorhanden Dim i As Long Dim nIndex As Long Dim nLen As Long On Error GoTo ErrHandler nIndex = -1 If IsMissing(nStart) Then nStart = LBound(Flächen) If IsMissing(nEnd) Then nEnd = UBound(Flächen) nLen = Len(sItem) For i = nStart To nEnd If Len(Flächen(i)) = nLen Then If Flächen(i) = sItem Then nIndex = i: Exit For End If End If Next i On Error GoTo 0 ErrHandler: IsInArray = nIndex End Function
Code: For i = 1 to selection1.Count sItem = selection1.Item2(i).Value Dim sData() As String Dim sElement As String ReDim sData(0) If IsInArray(sData(), sElement) < 0 Then ReDim Preserve sData(UBound(sData) + 1) sData(UBound(sData)) = sElement End If Next
Ich habe schon vermutet, dass es nicht so einfach sein wird, allerdings weiß ich gerade gar nicht mehr weiter und wäre über jede Hilfe dankbar! Viele Grüße Lukas 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: 07. Mrz. 2018 14:29 <-- editieren / zitieren --> Unities abgeben: Nur für Luhukas
Servus Einige Hinweise dazu: - Umlaute in Variablennamen? sehr schlechte Idee - Typen der Variablen beachten (ist dein Array nun vom Typ String oder eher HybridShapeSurface) - warum dimensionierst du deinen Array innerhalb der Schleife neu? Nur das ReDim darf innerhalb der Schleife stehen Du hast aber noch viel Arbeit vor dir. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. 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: 07. Mrz. 2018 17:58 <-- editieren / zitieren --> Unities abgeben: Nur für Luhukas
Servus Lukas Ich hab da mal was zusammengebastelt. Der Lösungsansatz unterscheidet sich dabei etwas von deinem. Code: Sub CATMain()Dim oSel as Selection Dim oPartDocument as PartDocument dim oHybridFaceArray() as Variant dim i as Integer Set oPartDocument = Catia.ActiveDocument Set oSel = oPartDocument.Selection 'nach Flächen suchen osel.Search "(((CATStFreeStyleSearch.Surface + CATPrtSearch.Surface) + CATGmoSearch.Surface) + CATSpdSearch.Surface), all" if osel.count2 = 0 then MsgBox "Keine Flächen gefunden" exit Sub end if 'Elemente die nicht Flächen sind aus der Selektion entfernen for i = osel.count2 to 1 Step -1 if InStr(TypeName(osel.item2(i).Value), "HybridShapeSurface") = 0 then osel.Remove i end if next 'Suche in Array speichern ReDim oHybridFaceArray(osel.count2 - 1) for i = 1 to osel.count2 Set oHybridFaceArray(i - 1) = osel.item2(i).Value next osel.clear 'Sortierung aufrufen BubbleSortByName oHybridFaceArray 'Flächen mit höchstem Index selektieren osel.clear for i = Lbound(oHybridFaceArray) to (UBound(oHybridFaceArray) - 1) 'falls der Name beim nächsten Element anders ist, handelt es sich um den höchsten Index -> Element selektieren if Left(oHybridFaceArray(i).Name, InStr(oHybridFaceArray(i).Name,".")) <> Left(oHybridFaceArray(i +1).Name, InStr(oHybridFaceArray(i +1 ).Name,".")) then osel.add oHybridFaceArray(i) end if next 'letztes Element aus dem Array auch selektieren osel.add oHybridFaceArray(UBound(oHybridFaceArray)) End Sub 'modifizierter BubbleSort: Sortiert intern nach .Name 'aus https://en.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Bubble_sort#Visual_Basic entstanden
Sub BubbleSortByName(ArrayIn() As Variant) as Variant Dim i As Integer Dim j As Integer For i = UBound(ArrayIn) To 0 Step -1 For j = 0 To i - 1 If ArrayIn(j).Name > ArrayIn(j + 1).Name Then swap ArrayIn(j), ArrayIn(j + 1) End If Next Next End Sub Sub swap(ByRef data1 As Variant, ByRef data2 As Variant) Dim temp As Variant Set temp = data1 Set data1 = data2 Set data2 = temp End Sub
Viel Spaß beim Analysieren, Verstehen und Verbessern. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Luhukas Mitglied
Beiträge: 13 Registriert: 24.01.2018 CATIA V5 R20
|
erstellt am: 08. Mrz. 2018 14:56 <-- editieren / zitieren --> Unities abgeben:
|
Luhukas Mitglied
Beiträge: 13 Registriert: 24.01.2018 CATIA V5 R20
|
erstellt am: 16. Mrz. 2018 14:09 <-- editieren / zitieren --> Unities abgeben:
Servus, dein Lösungsansatz hat wunderbar funktioniert, vielen Dank nochmals. Ich habe noch eine Frage, um meinen Code ein bisschen schöner zu gestalten: Ist es möglich, Parts und GeoSets mit Hilfe einer For Schleife zu deklarieren. Mein Ansatz bisher lautet: Code: Dim oTeil As String oTeil = InputBox("Bitte Namen des Teils eingeben", oTeil)For i = 2 To 10 Dim partDocument(i) As partDocument Set partDocument(i) = documents1.Item(oTeil & i & ".CATPart") Dim part(i) As part Set part(i) = partDocument(i).part Dim hybridBodies(i) As hybridBodies Set hybridBodies(i) = part(i).hybridBodies Dim hybridBody(i) As hybridBody Set hybridBody(i) = hybridBodies(i).Item("GeoSet." & i) Next
Im Grunde genommen habe ich in verschiedenen Parts immer ein GeoSet mit dem gleichen Namen und möchte mit Hilfe des Makros alle deklarieren. Die Fehlermeldung gibt aus, dass ein konstanter Ausdruck verlangt wird. Gibt es eine andere Möglichkeit die GeoSets zu deklarieren? Viele Grüße Lukas 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: 16. Mrz. 2018 18:22 <-- editieren / zitieren --> Unities abgeben: Nur für Luhukas
Servus Warum willst du denn für jedes GeoSet eine neue Variable erzeugen/anlegen? Willst du auserhalb der Schleife diese nochmal nutzen? Du könntest die GeoSets bzw PartDocuments in einem Array zwischenspeichern. Ich bezweifle aber das dir das nützt. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |