'--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
'-------------------------------------------------SelectTheParent------------------------------------------------------------------------------------------------------
'Author:           Daniel Frauenrath
'Mail:             daniel.frauenrath@gmx.com
'Release:          25.11.2008
'
'*************************************************************************************************************************************************************************
'<<<<<<<<<<<<<<<<Beschreibung / Discription>>>>>>>>>>>>>>>>>>>>
'**************************************************************************************************************************************************************************
'
'DE:    Das Makro selektiert alle Eltern eine selektierten Produkts innerhalb einer Produktstruktur
'
'\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
'
'EN:    The macro select all parents from an selected product included in a product structure
'
'************************************************************************************************************************************************
'
'===> Change Log <===
'
'Nr. /no.     Autor/author                           Datum/date          Zeile/line          Anmerkung/comment
'-------------------------------------------------------------------------------------------------------------------------------------------------
'1            Daniel Frauenrath (denyo_1)           26. Nov. 2008       116 - 123           Komponenten werden erkannt
'2
'3
'
'
'**********************************Definition globale Variablen**********************************
Public Z As Integer

'****************************************************************************************************************************************************
'<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Hauptmakro>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
'****************************************************************************************************************************************************

Sub CATMain()

    Dim otype(0)
    Dim Auswahl
    Dim Check As Boolean

    Set oDoc = CATIA.ActiveDocument
    Set oSel = oDoc.Selection
    oSel.Clear
    otype(0) = "Product"
    oSel.Clear
    Box = MsgBox("Bitte wählen Sie ein Product aus", vbInformation + vbOKCancel, "Product auswählen")
    If Box = vbCancel Then
        Box = MsgBox("Sie haben die Selektion abgebrochen" + Chr(10) + _
        "Das Makro wird nun beendet!", vbCritical, "Abbruch durch Nutzer")
        Exit Sub
    End If
    Do
    Auswahl = oSel.SelectElement2(otype, "Bitte wählen Sie ein Product aus", False)
    If Auswahl = "Normal" Then
        Set oProd = oSel.Item(1).Value
        If TypeName(oProd.ReferenceProduct.Parent) <> "ProductDocument" Then
            Box = MsgBox("Bitte wählen Sie nur ein Product aus!", vbInformation, "Falsche Auswahl")
        Else
            Check = True
        End If
    Else
        Box = MsgBox("Sie haben die Selektion abgebrochen" + Chr(10) + _
        "Das Makro wird nun beendet!", vbCritical, "Abbruch durch Nutzer")
        Exit Sub
    End If
    Loop Until Check = True
    oSel.Clear
    
    Zaehlen
    
    For i = 1 To Z
        On Error Resume Next
        oSel.Add oProd
        If Err.Number <> 0 Then
            Exit For
        Else
            Set oProd = oProd.Parent.Parent
            j = j + 1
        End If
    Next
    
    Box = MsgBox("Es wurden " & j & " Produkte selektiert", vbInformation + vbOKOnly, "Makro erfolgreich beendet")
    
End Sub


Sub Zaehlen()

On Error Resume Next

Z = 1
Dim oProduct
Dim oProducts
Dim bIsAComponent As Boolean

Set oRoot = CATIA.ActiveDocument

Set oProduct = oRoot.Product
oProduct.Activate
Set oProducts = oProduct.Products

Set oSelection = CATIA.ActiveDocument.Selection

SUB_ProdScan oProducts, False

End Sub

Sub SUB_ProdScan(oProducts, bIsAComponent) 'Rekursive Funktion: Scant alle Subs

On Error Resume Next

For X = 1 To oProducts.Count 'zaehlt die Children des aktuellen Subs

  If TypeName(oProducts.Item(X).ReferenceProduct.Parent) = "PartDocument" Then 'Check ob PartDoc
      ' passiert gar nix
  ElseIf TypeName(oProducts.Item(X).ReferenceProduct.Parent) = "ProductDocument" Then
      Err.Number = 0
      Z = Z + 1
      Set oMasterShape = oProducts.Item(X).GetMasterShapeRepresentation(True)
      If Err.Number <> 0 Then  'it s a others
        Err.Number = 0
        If oProducts.Item(X).Products.Count > 0 Then
            Set oProductsUebergabe = oProducts.Item(X).Products
            SUB_ProdScan oProductsUebergabe, False
        End If
      End If

      'ElseIf oProducts.Item(X).ReferenceProduct.Parent.Name <> oProducts.Item(X).Parent.Parent.ReferenceProduct.Parent.Name Then  '---its a Product
       ' Err.Number = 0
        'If oProducts.Item(X).Products.Count > 0 Then
         '   Set oProductsUebergabe = oProducts.Item(X).Products
          '  SUB_ProdScan oProductsUebergabe, False
        'End If
      'End If
      Err.Number = 0
  End If
Next

End Sub


