Autor
|
Thema: Problem mit der Selektion (2005 mal gelesen)
|
Krischan91 Mitglied
Beiträge: 5 Registriert: 28.05.2015 Catia V5 R19 SP2
|
erstellt am: 28. Mai. 2015 22:39 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, ich bin neu hier im Forum und bin auch Anfänger in der Makroprogrammierung. Ich habe in catvba (also im Visual Basic Editor) programmiert. Ich hatte mir zunächst 2 Makros programmiert als CATScript, nun habe ich Sie in ein Catvba umgeschrieben, da ich noch eine Bedieneroberfläche programmieren muss, in der alle Parameter einzustellen sind und per Knopfdruck alles geupdatet wird und das vollständige Makro durchläuft. In meinem CATMain werden zwei Unterprogramme (meine ursprünglichen CATScripts) aufgerufen. Jedes Unterprogramm greift auf ein anderes Part zu und soll dort jeweils ein "altes" Geoset löschen und das neu hinzugefügte Geoset in den NoShow schieben. Nun zu meinem Problem: Wenn ein übergeordnetes Product im Baum vorselektiert ist, funktioniert das Makro. Wenn aber ein Part selektiert ist, bekomme ich eine Fehlermeldung. Ich verstehe nicht, wie der Selektionsbefehl genau funktioniert. Ich habe schon viel probiert, komme aber einfach nicht auf einen grünen Zweig. Ich möchte nicht den Anwender aufforden, ensprechendes Product vorher auszuwählen. Testskript ist angehängt und ein Bild von meiner Baumstruktur und die Fehlermeldung, die ich bekomme. Da ich dringend zu einer Lösung kommen muss, würde ich mich freuen, wenn mir jemand bei meinem Code helfen kann. Oder gibt es vielleicht eine ganz andere Möglichkeit. Vielen Dank, Christian P.S. Ich hoffe mein Problem ist einigermaßen verständlich
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. Mai. 2015 22:56 <-- editieren / zitieren --> Unities abgeben: Nur für Krischan91
Servus Willkommen im Froum. Vermutlich musst du die Selektion in den Unterroutinen auf das jeweilige PartDocument beziehen. Code: Set selection1 = partDocument1.Selection
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Krischan91 Mitglied
Beiträge: 5 Registriert: 28.05.2015 Catia V5 R19 SP2
|
erstellt am: 28. Mai. 2015 23:07 <-- editieren / zitieren --> Unities abgeben:
|
Krischan91 Mitglied
Beiträge: 5 Registriert: 28.05.2015 Catia V5 R19 SP2
|
erstellt am: 31. Mai. 2015 00:01 <-- editieren / zitieren --> Unities abgeben:
|
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: 31. Mai. 2015 01:47 <-- editieren / zitieren --> Unities abgeben: Nur für Krischan91
Hi Krischan, ich hab die Deklarationen um den Typ erweitert, 'Option Explicit' vorangestellt und die 2. Selektion (unter anderem) gekillt. Es gibt nur eine aktive Selektion. Ausserdem hab ich die Deklarationen um ein paar vergessene ergänzt. Ein paar der Dims sind überflüssig.
Code:
Sub Einstiegskurve() Dim partDocument1 As Document Dim part1 As Part ' Dim productDocument1 As Document Dim hybridBodies1 As hybridBodies ' Dim hybridBodies2 As hybridBodies Dim GS_Makro As HybridBody ' Dim hybridBody_alt As HybridBody Dim selection1 As Selection ' Dim selection2 As Selection Dim visPropertySet1 As VisPropertySet Dim bSTR1 As String ' Set productDocument1 = CATIA.ActiveDocument ' Set Documents = CATIA.Documents ' Set partDocument1 = CATIA.Documents.Item("Part1.CATPart") Set part1 = CATIA.Documents.Item("Part1.CATPart").Part Set hybridBodies1 = part1.hybridBodies'======================================= ' "Makro_alt" löschen '======================================= Set selection1 = CATIA.ActiveDocument.Selection selection1.Clear selection1.Add hybridBodies1.Item("Makro") 'das vorhandene 'makro' löschen selection1.Delete selection1.Clear part1.Update DoEvents '========================== ' Geometrische Sets deklarieren '========================== ' altes GS_Makro in "Makro_alt" umbennen ' Set hybridBody_alt = hybridBodies1.Item("Makro") ' hybridBody_alt.Name = "Makro_alt" Set GS_Makro = hybridBodies1.Add GS_Makro.Name = "Makro_neu" 'um sicher zu gehen, dass es neu erzeugt wurde 'es gibt hier ein Timing-Problem part1.Update DoEvents ' Set hybridBodies2 = GS_Makro.hybridBodies 'welche? '======================================= ' GS_Makro ausblenden '======================================= ' Set selection2 = productDocument1.Selection ' Set visPropertySet1 = selection2.VisProperties ' bSTR1 = hybridBodies2.Name selection1.Add GS_Makro Set visPropertySet1 = selection1.VisProperties '.Parent visPropertySet1.SetShow catVisPropertyNoShowAttr selection1.Clear part1.Update DoEvents End Sub
Hope it helps, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Krischan91 Mitglied
Beiträge: 5 Registriert: 28.05.2015 Catia V5 R19 SP2
|
erstellt am: 31. Mai. 2015 12:41 <-- editieren / zitieren --> Unities abgeben:
Hi Joe, vielen Dank für deine Antwort. Ich habe deinen Code jetz mal getestet. Das löst aber leider mein Problem nicht. Es ist weiterhin so, dass ich eine Fehlermeldung erhalte, wenn ich das Makro starte und dabei in Part2 aktiv bin. Die Fehlermeldung kommt in der Zeile "selection1.Delete" Idee, wie ich es schaffe, das Makro auch erfolgreich durchlaufen zu lassen, wenn ich beim Start in einem anderen Part aktiv bin? Vielen Dank, Christian 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: 31. Mai. 2015 15:25 <-- editieren / zitieren --> Unities abgeben: Nur für Krischan91
dann wechsle halt vorher ins Product. Zwei Methoden kann ich Dir anbieten: - Set beleibt bestehen; alle Elemente im Set werden gelöscht - Set löschen, neu erzeugen (wie bisher) Haken bei der ersten Methode: der nachfolgende Dialog muss noch behandelt werden. Bei der zweiten kanns Probleme beim Timing geben
Code:
Option Explicit Sub CATMain() ClearSet "Part1.CATPart", "Makro" ReCreateSet "Part2.CATPart", "Makro" End SubFunction ClearSet(strParent As String, strHB As String) As Integer Dim oParent As Part Dim oHB As HybridBody Dim oSel As Selection Dim oVPS As VisPropertySet 'in assembly workbench wechseln, falls erf. If CATIA.GetWorkbenchId <> "Assembly" Then CATIA.StartWorkbench "Assembly" End If Set oParent = CATIA.Documents.Item(strParent).Part Set oHB = oParent.hybridBodies.Item(strHB) Set oSel = CATIA.ActiveDocument.Selection oSel.Clear 'set-elemente löschen oSel.Add oHB oSel.Search "(Type=* - Name=" & strHB & "),sel" If oSel.Count2 > 0 Then oSel.Delete ClearSet = oSel.Count2 End If oSel.Clear 'set auf NoShow setzen oSel.Add oHB Set oVPS = oSel.VisProperties oVPS.SetShow catVisPropertyNoShowAttr oSel.Clear oParent.Update DoEvents End Function Sub ReCreateSet(strParent As String, strHB As String) Dim oPart As Part Dim oHB As HybridBody Dim oSel As Selection Dim oVPS As VisPropertySet 'in assembly workbench wechseln, falls erf. If CATIA.GetWorkbenchId <> "Assembly" Then CATIA.StartWorkbench "Assembly" End If Set oPart = CATIA.Documents.Item(strParent).Part Set oSel = CATIA.ActiveDocument.Selection oSel.Clear 'das vorhandene 'makro' löschen oSel.Add oPart.hybridBodies.Item(strHB) oSel.Delete oSel.Clear oPart.Update DoEvents 'neues Set deklarieren Set oHB = oPart.hybridBodies.Add oHB.Name = strHB ' oHB.Name = "Makro_neu" 'um sicher zu gehen, dass es neu erzeugt wurde 'es gibt hier eventuell ein Timing-Problem oPart.Update DoEvents oSel.Add oHB Set oVPS = oSel.VisProperties oVPS.SetShow catVisPropertyNoShowAttr oSel.Clear oPart.Update DoEvents End Sub
Enjoy, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Krischan91 Mitglied
Beiträge: 5 Registriert: 28.05.2015 Catia V5 R19 SP2
|
erstellt am: 01. Jun. 2015 00:32 <-- editieren / zitieren --> Unities abgeben:
|
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: 01. Jun. 2015 10:49 <-- editieren / zitieren --> Unities abgeben: Nur für Krischan91
hab in der Function noch einen kleinen Bug gefunden. Statt: Code:
'set-elemente löschen oSel.Add oHB oSel.Search "(Type=* - Name=" & strHB & "),sel" If oSel.Count2 > 0 Then oSel.Delete ClearSet = oSel.Count2 End If oSel.Clear
muss es Code:
'set-elemente löschen oSel.Add oHB oSel.Search "(Type=* - Name=" & strHB & "),sel" ClearSet = oSel.Count2 If oSel.Count2 > 0 Then oSel.Delete End If oSel.Clear
sonst ist der Rückgabewert immer null. Tschau, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |