Autor
|
Thema: Reihenfolge der Subelemente eines Geosets (1785 mal gelesen)
|
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 11. Feb. 2014 09:32 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich möchte eine Baumstruktur als Result exportieren. Hierbei soll die komplette Baumstruktur erhalten bleiben. Paste Special As Result übernimmt nur das oberste Geoset, deshalb möchte ich elementweise vorgehen. Allerdings wie bekomme ich die richtige Reihenfolge der Subelemente eines Geoset in ein Objekt Array? Catia zerlegt die einzelnen Elemente eines Geosets nach HybridBodies, HybridShapes und HybridSketches und somit geht die Reihenfolge verloren. Hat jemand eine Idee? Vielen Dank
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
xam0560 Mitglied Konstruktion / Administration
Beiträge: 445 Registriert: 11.08.2008
|
erstellt am: 11. Feb. 2014 09:45 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
Hi, dies ist ganz einfach, klick auf dein gewünschtes GeoSet, RMT --> Objekt"XYZ" --> Kinder neu ordnen.
------------------ Gruß,
Maximilian
[Diese Nachricht wurde von xam0560 am 11. Feb. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Hamlet Mitglied Konstruktions- und Entwicklungsingenieur
Beiträge: 57 Registriert: 14.05.2013 Catia V5 R21 Windows 7 64bit using: Microsoft Visual Basic
|
erstellt am: 11. Feb. 2014 09:48 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
Moin, also ich hab mir mal kurz irgendein Part erstellt. Im Partbody gibts nen Pad1 (sketch1) und ein Pocket1(sketch2). Parallel zum PartBody gibts ein Geoset mit nem Punkt1 und ner Linie1. Jetzt hab ich mal geguckt, ob ich irgendwo die Reihenfolge finden kann. Unter Part.Parameters scheint es die richtige Reihenfolge zu geben, ABER hier gibt es pro Element sehr viele Parameter. Gefundene Reihenfolge: Sketch1 Pad1 Sketch2 Pocket1 Punkt1 Linie1 Parameter-Liste hat eine angezeigte Länge von 56 Einträgen. Vielleicht hilft es dir aber trotzdem. Gruß Hamlet Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 11. Feb. 2014 09:49 <-- editieren / zitieren --> Unities abgeben:
Autosort liefert mir leider nicht die gewünschte Reihenfolge. Ich möchte das Makro für jede benutzerdefinierte Struktur nutzbar machen @Hamlet danke, habe das ganze probiert. Die Struktur ist die richtige. Jedoch konnte den Geosetnamen der einzelnen Elemente nicht finden. Die Items beinhalten nur die Subelemente bei mir. Hat jemand noch eine Idee? [Diese Nachricht wurde von N2high am 11. Feb. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Hamlet Mitglied Konstruktions- und Entwicklungsingenieur
Beiträge: 57 Registriert: 14.05.2013 Catia V5 R21 Windows 7 64bit using: Microsoft Visual Basic
|
erstellt am: 11. Feb. 2014 10:08 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
Den GeoSet-Namen findest du im Namenspfad des jeweiligen Elements. z.B.: Part1\GeoSet1\Line.1\xxx Oder Part1\PartBody\Sketch.1\xx Den String musste dann nur abfragen und überprüfen. Oder hab ich dich falsch verstanden? Gruß Hamlet Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 11. Feb. 2014 10:25 <-- editieren / zitieren --> Unities abgeben:
|
xam0560 Mitglied Konstruktion / Administration
Beiträge: 445 Registriert: 11.08.2008
|
erstellt am: 11. Feb. 2014 10:42 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
|
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 11. Feb. 2014 10:50 <-- editieren / zitieren --> Unities abgeben:
ich möchte ein Geoset als Result in eine neues Part kopieren. Soweit kein Problem. Die Struktur muss dabei die gleiche bleiben, deshalb muss ich elementweise vorgehen (as Result nimmt die Struktur nicht mit, wenn weiter Geosets enthalten sind) Das Problem ist wie bekomme ich die korrekte Reihenfolge der Subelemente eines Geosets von verschiedenen Elementen, damit ich elementweise vorgehn kann. Autosort scheidet aus. [Diese Nachricht wurde von N2high am 11. Feb. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Hamlet Mitglied Konstruktions- und Entwicklungsingenieur
Beiträge: 57 Registriert: 14.05.2013 Catia V5 R21 Windows 7 64bit using: Microsoft Visual Basic
|
erstellt am: 11. Feb. 2014 11:12 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
|
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 11. Feb. 2014 11:54 <-- editieren / zitieren --> Unities abgeben:
danke jetzt hab ichs gecheckt das auslesen der Reihenfolge ist ein wenig kompliziert, aber geht. Hab mal einen Prototyp gebaut: Code: Sub testv3() Dim partDocument1 As PartDocument Dim part1 As Part Dim product1 As Product Dim parameters1 As Parameters Set partDocument1 = CATIA.ActiveDocument Set part1 = partDocument1.Part Set product1 = partDocument1.Product Set parameters1 = part1.Parameters Dim search_str As String search_str = "Geometrical Set.1" Dim name_current_item As String Dim name_subelem_unsort() As String Dim j As Integer j = 1 'Laufvariable des Array name_subelem_unsort Dim place_str_start As Integer Dim temp_str As String For i = 1 To parameters1.Count name_current_item = parameters1.Item(i).Name place_str_start = InStr(name_current_item, search_str) 'Wenn search_str gefunden If place_str_start > 1 Then ReDim Preserve name_subelem_unsort(1 To j) temp_str = Mid(name_current_item, place_str_start + Len(search_str) + 1) name_subelem_unsort(j) = Left(temp_str, InStr(temp_str, "\") - 1) j = j + 1 End If Next 'Array name_subelem_unsort filtern --> jedes Element nur einmal Dim name_subelem() As String Dim m As Integer m = 1 'Laufvariable des Array name_subelem For n = 1 To UBound(name_subelem_unsort) If n = 1 Then ReDim Preserve name_subelem(1 To 1) name_subelem(n) = name_subelem_unsort(n) Else If name_subelem(m) <> name_subelem_unsort(n) Then ReDim Preserve name_subelem(1 To (m + 1)) name_subelem(m + 1) = name_subelem_unsort(n) m = m + 1 End If End If Next End Sub
Im Array name_subelem stehen dann die Namen [Diese Nachricht wurde von N2high am 11. Feb. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Hamlet Mitglied Konstruktions- und Entwicklungsingenieur
Beiträge: 57 Registriert: 14.05.2013 Catia V5 R21 Windows 7 64bit using: Microsoft Visual Basic
|
erstellt am: 11. Feb. 2014 13:04 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
|
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 11. Feb. 2014 13:38 <-- editieren / zitieren --> Unities abgeben:
mhh das Makros funktioniert einwandfrei solange sich in dem zu untersuchenden Geoset nicht ausschließlich Results befinden. Besteht ein Geoset nur aus Results findet das Makro es nicht, da es keine Parameters gibt. Hat noch jemand einen Tipp? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Hamlet Mitglied Konstruktions- und Entwicklungsingenieur
Beiträge: 57 Registriert: 14.05.2013 Catia V5 R21 Windows 7 64bit using: Microsoft Visual Basic
|
erstellt am: 11. Feb. 2014 13:46 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
|
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 11. Feb. 2014 14:17 <-- editieren / zitieren --> Unities abgeben:
|
Hamlet Mitglied Konstruktions- und Entwicklungsingenieur
Beiträge: 57 Registriert: 14.05.2013 Catia V5 R21 Windows 7 64bit using: Microsoft Visual Basic
|
erstellt am: 11. Feb. 2014 14:33 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
Hmmm, also gefunden hab ich die Elemente unter "Parameters" schon. Nur leider steht in "name" nicht mehr der gesamte Pfad sondern nur noch der eigentliche Element-Name, wie z.B. Point.2. (es gibt auch nur noch einen parameters-eintrag pro result-element) Wenn ich allerdings direkt in Catia auf die Properties von "Point.2" gehe, steht da unter "Current Selection" der korekte Namenspfad... Leider weiß ich nicht, wie man da rankommt. Möglicherweise musste du deine Produktstruktur rekursiv durchlaufen und immer wenn du auf der untersten Ebene angekommen bist, eine Selektion durchführen. Möglicherweise gibt es bei der "Selection"-Funktion andere Möglichkeiten an den Pfad ranzukommen. (Kenn mich mit Selection leider nicht soooo gut aus) Gruß Hamlet [Diese Nachricht wurde von Hamlet am 11. Feb. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 13. Feb. 2014 11:23 <-- editieren / zitieren --> Unities abgeben:
habe jetzt eine Lösung für mein erstes Problem gefunden: Enthält ein Geoset nur Results erstelle ich in diesen einen Parametrischen Punkt. Somit taucht das Geoset in der Liste auf. Diese Punkte lösche ich in meinem ZielPart am Ende wieder. Jetzt habe ich ein neues Problem: Ich muss meine Struktur komplett durchlaufen. Hat das Master-Geoset noch weitere Sub-Geosets oder Sub-Sub-Geosets usw. muss ich die Logik auf dieses auch anwenden. Sprich meine Schleife erneut starten. Damit es für eine beliebige Struktur möglich ist. Ist ein Geoset kopiert soll es zum nächsten Element springen. Das Programm muss also wissen wo es davor war. Jetzt weiß ich nicht, wie ich das am dümmsten anstelle. Hier mein erster Entwurf: Code: Sub test() Set partDocument1 = CATIA.ActiveDocument Set PartGrundmodell = partDocument1.Part Dim geoset_master As String geoset_master = "Geoset1" Dim subelements01() As String subelements01 = z_functions.subelements(Part1, geoset_master) Dim oCurrent As Object For i = 1 To UBound(subelements01) Set oCurrent = PartGrundmodell.FindObjectByName(subelements01(i)) type_oCurrent = TypeName(oCurrent) If type_oCurrent = "HybridBody" Then 'Fall Geoset If oCurrent.HybridBodies.Count > 0 Then 'weitere Subgeosets enthalten 'Schleife mit Sub-Subelements durchlaufen --> wie??? subelements02 = z_functions.subelements(Part1, oCurrent.name) Else '-->Geoset as Result kopieren End If ElseIf type_oCurrent = "Sketch" Then 'Fall Sketch '-->Disassemble & Copy Else 'Sonstiger Typ '-->Copy as Result End If Next End Sub
[Diese Nachricht wurde von N2high am 13. Feb. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Hamlet Mitglied Konstruktions- und Entwicklungsingenieur
Beiträge: 57 Registriert: 14.05.2013 Catia V5 R21 Windows 7 64bit using: Microsoft Visual Basic
|
erstellt am: 13. Feb. 2014 13:14 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
Ich würde eine extra-Funktion oder Sub schreiben. Dann kannste dein Part rekursiv durchlaufen. Deiner Funktion übergibst du beispielsweise ein Geoset. Sub rekursiv (Dim oGeo as HybridBody) Die Funktion fragt dann alle HybridShapes ab, welche im GeoSet sein. Anschließend prüfst du, ob es noch einen HybridBody gibt, wenn ja wird dieser an durch Funktionsaufruf wieder übergeben. Das Makro erstellt dann automatisch eine neue Instanz der Funktion und überprüft das GeoSet des nächsten Levels. Bis es keine GeoSets mehr gibt und auch alle HybridShapes gefunden worden sind. Hoffe ich hab mich nicht zu umständlich ausgedrückt. ^^' Gruß Hamlet [Diese Nachricht wurde von Hamlet am 13. Feb. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 13. Feb. 2014 13:38 <-- editieren / zitieren --> Unities abgeben:
gute Idee. Der Punkt "Bis es keine GeoSets mehr gibt und auch alle HybridShapes gefunden worden sind." ist mir noch unklar. Mein Problem ist das zurückspringen. Wenn eine Sub-Ebene erfolgreich abgearbeitet ist, muss das Makro wieder in die nächst höhere Ebene zurückspringen. Die Prozedur kann dann beim nächsten Element erneut beginnen. Aber woher weiß das Makro was es schon durchlaufen hat. Die Elemente sind ja nach wie vor da (Copy) Ich steh grad auf dem Schlauch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Hamlet Mitglied Konstruktions- und Entwicklungsingenieur
Beiträge: 57 Registriert: 14.05.2013 Catia V5 R21 Windows 7 64bit using: Microsoft Visual Basic
|
erstellt am: 13. Feb. 2014 13:54 <-- editieren / zitieren --> Unities abgeben: Nur für N2high
Wenn ich Catia dahingehend richtig verstanden habe, funktioniert es wie folgt. Sub rekursiv (Dim oGeo as HybridBody) - Alle HybridShapes im GeoSet oGeo auslesen - Gibt es Hybrid Bodies? -> JA: Dann rekuriv (oGeo.Hybridbodies.Item(1)) -> NEIN: dann Ende End Sub Jetzt fängst du mit deinem Part an und rufst das erste mal die Sub "rekusiv" auf. (Das ist die 1. Instanz -> alles darin enthaltenen Variablen [wie z.b. Laufvariablen für Schleifen] sind auf diese Instanz festgelegt) Nun wird ein Unter-GeoSet gefunden, die if-Abfrage greift ein und startet wieder die Sub "rekursiv". (Das ist dann die 2. Instanz) PartBody 'Start Makro -> Geo1 'Sub "rekusiv" wird benutzt => 1. Instanz -> Punkt1 'HybridShape wird gefunden -> Geo2 'Unter-GeoSet wird gefunden, also wieder rekursiv starten => 2. Instanz -> Punkt2 'HybridShape wird gefunden, aber kein weiteres GeoSet, also ist die 2. Instanz beendet 'es geht also wieder in die 1. Instanz zurück -> Geo3 'In der 1. Instanz, wird ein zweites GeoSet gefunden und wieder startet Sub "rekursiv" -> Linie1 'etc. pp. Schlauch frei, bzw. Fuß weg? Gruß Hamlet [Diese Nachricht wurde von Hamlet am 13. Feb. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
N2high Mitglied
Beiträge: 44 Registriert: 09.09.2013 Catia V5R19 SP9
|
erstellt am: 17. Feb. 2014 15:10 <-- editieren / zitieren --> Unities abgeben:
|