Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  CATIA V5 Programmierung
  Vom Sruckturbaum Teile Zählen und die Gesamtstückzahl auslesen.

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
Autor Thema:  Vom Sruckturbaum Teile Zählen und die Gesamtstückzahl auslesen. (4088 mal gelesen)
K.Siebert
Mitglied
Tech Zeichner


Sehen Sie sich das Profil von K.Siebert an!   Senden Sie eine Private Message an K.Siebert  Schreiben Sie einen Gästebucheintrag für K.Siebert

Beiträge: 415
Registriert: 19.05.2007

Win XP
Catia V5 R19
Catia V5 R24

erstellt am: 07. Mrz. 2009 15:08    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo liebe CAD.de Gemeinde,

Ich sitze gerade an einem CATScript und stehe vor dem Problem das ich Elemente (Parts/Producte) im Sruckturbaum Zählen möchte und die Gesamtstückzahl mir ausgeben möchte aber wie.

Hat jemand ein paar Codezeilen für mich ?
Oder weiß jemand wo so was steht?

------------------
Sei Schlau bleib Dumm !!?!! 

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

zoltan.bekesi
Mitglied



Sehen Sie sich das Profil von zoltan.bekesi an!   Senden Sie eine Private Message an zoltan.bekesi  Schreiben Sie einen Gästebucheintrag für zoltan.bekesi

Beiträge: 321
Registriert: 22.10.2006

Job:
CATIA V5R19 / XP 32bit
MS Office 2003
Microstation V8 2004 Edition
DELL Precision M6300

erstellt am: 07. Mrz. 2009 15:25    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für K.Siebert 10 Unities + Antwort hilfreich

Hallo,

anbei eine Lösung für Excel. Für CATIA brauchst du die Ein- und Ausgabezeilen ändern.

Code:
Sub StuliEintraegeZaehlen()

    Dim iAssyCount As Integer
    Dim i1stLoop As Integer
    Dim i2ndLoop As Integer
    Dim sSearchString As String
    Dim s2ndLoopString As String
    Dim iSearchStringCount As Integer
    Dim iStuliArrayCount As Integer
   
    Dim aAssyArray() 'input array
    Dim aStuliArray() 'output array
   
    iStuliArrayCount = 0
    ReDim aStuliArray(1 To 3000, 1 To 2)
   
    'Hat in Excel die letzte belegte Zeile gesucht
    iAssyCount = LastRowOfSheet(ActiveWorkbook.Sheets.Item("eingangsdaten"), "A", 1)
       
    aAssyArray = Sheets.Item("eingangsdaten").Range("A1:A" + CStr(iAssyCount)).Value
   
    'Algorithmus:
    'Es wird die aAssyArray durchgelaufen. Jede Zeile dieser Array wird in aStuliArry
    'geschrieben, falls es noch nicht existiert. Falls ein Eintrag mit der selber Name
    'schon vorhanden war, wird der Zähler (2. Spalte) inkrementiert
    'Bei jeder Treffer wird der Eintrag aus der Originalarray gelöscht
    For i1stLoop = 1 To iAssyCount
        iSearchStringCount = 0
        sSearchString = CStr(aAssyArray(i1stLoop, 1))
        If Len(sSearchString) > 0 Then
            iSearchStringCount = iSearchStringCount + 1
            iStuliArrayCount = iStuliArrayCount + 1
            For i2ndLoop = i1stLoop + 1 To iAssyCount
                s2ndLoopString = CStr(aAssyArray(i2ndLoop, 1))
                If Len(s2ndLoopString) > 0 Then
                    If s2ndLoopString = sSearchString Then
                        iSearchStringCount = iSearchStringCount + 1
                        aAssyArray(i2ndLoop, 1) = ""
                    End If
                End If
            Next
            aStuliArray(iStuliArrayCount, 1) = sSearchString
            aStuliArray(iStuliArrayCount, 2) = iSearchStringCount
        End If
    Next
 
    'Am Ende wird alles ausgegeben
    Sheets.Item("ergebnist_mit_stueckzahlen").Range("A1:B3000").Value = aStuliArray
End Sub



Ist nicht die schönste Lösung, hatte aber funktioniert.

Obere Teil ist für das Zählen und für eine Ebene. Ich würde z.B. die Dateinamen oder Partnumber in die Eingangsliste nehmen. Dafür (rekursives Einlesen der CATIA-Baum) gibt es hier schon einige Einträge.
Ich hoffe, es hilft dir weiter.

Gruß,
Zoltan

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

K.Siebert
Mitglied
Tech Zeichner


Sehen Sie sich das Profil von K.Siebert an!   Senden Sie eine Private Message an K.Siebert  Schreiben Sie einen Gästebucheintrag für K.Siebert

Beiträge: 415
Registriert: 19.05.2007

Win XP
Catia V5 R19
Catia V5 R24

erstellt am: 07. Mrz. 2009 19:21    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo zoltan.bekesi

Danke für deine schnelle Antwort!


Das Hilft mir bestimmt zur Zeit lese ich zwar nur Bahnhof

Ich versuche dann mal das auf Catia anzupassen

Könntest du mit noch einen gefallen tun und mit einer msgbox mit dem Ergebnis der Zahl einbauen denn ich muss zugeben ich bin noch nicht der Beste Programmierer

hier ist (sind) beiträge zum rekursive durchgehen des Baumes
http://ww3.cad.de/foren/ubb/Forum137/HTML/001796.shtml
oder hier
http://ww3.cad.de/foren/ubb/Forum137/HTML/002334.shtml#000000

PS: dennoch Dankeschön

------------------
Sei Schlau bleib Dumm !!?!! 

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

zoltan.bekesi
Mitglied



Sehen Sie sich das Profil von zoltan.bekesi an!   Senden Sie eine Private Message an zoltan.bekesi  Schreiben Sie einen Gästebucheintrag für zoltan.bekesi

Beiträge: 321
Registriert: 22.10.2006

Job:
CATIA V5R19 / XP 32bit
MS Office 2003
Microstation V8 2004 Edition
DELL Precision M6300

erstellt am: 08. Mrz. 2009 13:21    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für K.Siebert 10 Unities + Antwort hilfreich

Hallo K.Sieber,

anbei die ganze für CATIA adaptiert und etwas ausgiebiger kommentiert.
Ich habe es in VBA unter R16 getestet. Die Arrays habe ich global deklariert und die zweidimensionale aus den alten auf zwei eindimensonale ersetzt.

Code:
Option Explicit

'arrays fangen beim Index 0 an...
Dim aAssyArray() As String    'input array
Dim iAssyArrayCount As Integer
Dim aStuliPartNumbers() As String    'output array, Benennung
Dim aStuliCounts() As Integer  'output array, Anzahl

Sub CATMain()
    Dim oActDoc As Document
    If CATIA.Documents.Count = 0 Then
        MsgBox ("Kein Dokument geöffnet!")
        Exit Sub
    End If
    Set oActDoc = CATIA.ActiveDocument
    If TypeName(oActDoc) <> "ProductDocument" Then
        MsgBox ("Kein Product geladen!")
        Exit Sub
    End If

    'Array wird auf 100 Einträge initialisiert
    'im RekursivDurchBaum ist die Redimensionierung vorhanden
    ReDim aAssyArray(100)
    iAssyArrayCount = 0

    Dim oProduct As Product
    Set oProduct = oActDoc.Product
    Dim oProducts As Products
    Set oProducts = oProduct.Products

    'Alle CATParts aus Baum ins globale Array sammeln
    RekursivDurchBaum oProducts

    If iAssyArrayCount > 0 Then
    'Arraydimension zurechtschneiden
        ReDim Preserve aAssyArray(iAssyArrayCount - 1)

        StuliEintraegeZaehlen

    'Ausgabe der Ergebnis ins Immedate Window (VBA)
        Dim i As Integer
        Dim sTemp As String
        For i = LBound(aStuliPartNumbers) To UBound(aStuliPartNumbers)
            sTemp = CInt(aStuliCounts(i)) & " St. von " & aStuliPartNumbers(i)
            Debug.Print sTemp
    'hier kann auch ein Msgbox stehen
    '        MsgBox (sTemp)
        Next
    End If

End Sub

Function RekursivDurchBaum(oProducts As Products)
    Dim oProduct As Product
    Dim oRefProduct As Product
    Dim oRefDocument As Document
    For Each oProduct In oProducts
        If oProduct.Products.Count > 0 Then
            RekursivDurchBaum oProduct.Products
        Else
            Set oRefProduct = oProduct.ReferenceProduct
            Set oRefDocument = oRefProduct.Parent
            If TypeName(oRefDocument) = "PartDocument" Then
    'Du bist an einen Part
    'jetzt kannst du entscheiden, nach was du zählen willst:

    '                'Dateiname
    '                aAssyArray(iAssyArrayCount) = oRefDocument.Name

    'PartNumber
                aAssyArray(iAssyArrayCount) = oRefProduct.PartNumber

                iAssyArrayCount = iAssyArrayCount + 1

    'dieser Block ist nur da, falls die Anzahl der Products über 100 kommen sollte
                If UBound(aAssyArray) <= iAssyArrayCount Then
                    ReDim Preserve aAssyArray(iAssyArrayCount + 20)
                End If
            End If
        End If
    Next
End Function

Sub StuliEintraegeZaehlen()
    Dim i1stLoop As Integer
    Dim i2ndLoop As Integer
    Dim iSearchStringCount As Integer
    Dim sSearchString As String
    Dim iStuliArrayCount As Integer
    Dim s2ndLoopString As String

    ReDim aStuliPartNumbers(20)    'output array, Benennung
    ReDim aStuliCounts(20)    'output array, Anzahl
    iStuliArrayCount = 0

    'Algorithmus:
    'Es wird die aAssyArray durchgelaufen. Jede Zeile dieser Array wird in aStuli*
    'geschrieben, falls es noch nicht existiert. Falls ein Eintrag mit der selber Name
    'schon vorhanden war, wird der Zähler (2. Spalte) inkrementiert
    'Bei jeder Treffer wird der Eintrag aus der Originalarray gelöscht
    'habe im Vergleich zur Vorgänger lieber zwei Eindimensionale Arrays genommen, somit sind die
    'einfacher zu handhaben

    'äußere Schleife
    For i1stLoop = 0 To iAssyArrayCount - 1
        iSearchStringCount = 0
        sSearchString = CStr(aAssyArray(i1stLoop))    'nach diesen wird weitergesucht
        If Len(sSearchString) > 0 Then    'also Eintrag im Original noch nicht gelöscht
            iSearchStringCount = iSearchStringCount + 1    'ein Eintrag haben wir jedenfalls schon gefunden

    'innere Schleife
            For i2ndLoop = i1stLoop + 1 To iAssyArrayCount - 1
                s2ndLoopString = CStr(aAssyArray(i2ndLoop))
                If Len(s2ndLoopString) > 0 Then    'also Eintrag im Original noch nicht gelöscht
                    If s2ndLoopString = sSearchString Then    'wir haben noch ein Exemplar gefunden
                        iSearchStringCount = iSearchStringCount + 1
                        aAssyArray(i2ndLoop) = ""    'OriginalEintrag löschen
                    End If
                End If
            Next

    'nachdem die Gesamtstückzahl ermittelt wurde, wird es ins Ausgangsarray geschreiben
            aStuliPartNumbers(iStuliArrayCount) = sSearchString
            aStuliCounts(iStuliArrayCount) = iSearchStringCount

    'wieder der Array Dimensionscheck
            iStuliArrayCount = iStuliArrayCount + 1
            If UBound(aStuliPartNumbers) <= iStuliArrayCount Then
                ReDim Preserve aStuliPartNumbers(iStuliArrayCount + 5)
                ReDim Preserve aStuliCounts(iStuliArrayCount + 5)
            End If
        End If
    Next

    If iStuliArrayCount > 0 Then
    'Arraydimension zurechtschneiden
        ReDim Preserve aStuliPartNumbers(iStuliArrayCount - 1)
        ReDim Preserve aStuliCounts(iStuliArrayCount - 1)
    End If
End Sub


Das müsste es tun.

Gruß,
Zoltan

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

K.Siebert
Mitglied
Tech Zeichner


Sehen Sie sich das Profil von K.Siebert an!   Senden Sie eine Private Message an K.Siebert  Schreiben Sie einen Gästebucheintrag für K.Siebert

Beiträge: 415
Registriert: 19.05.2007

Win XP
Catia V5 R19
Catia V5 R24

erstellt am: 09. Mrz. 2009 10:50    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Nochmals vielen DANK!! Funktioniert wunderbar.

------------------
Sei Schlau bleib Dumm !!?!! 

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

moppesle
Ehrenmitglied V.I.P. h.c.
Konstrukteur


Sehen Sie sich das Profil von moppesle an!   Senden Sie eine Private Message an moppesle  Schreiben Sie einen Gästebucheintrag für moppesle

Beiträge: 3418
Registriert: 28.05.2009

CATIA V5 R19 SP9
WIN 7 64bit

erstellt am: 05. Jul. 2016 13:59    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für K.Siebert 10 Unities + Antwort hilfreich

Hallo Zoltan,

dein Beitrag ist ja schon ne Weile her.
Hoffe du bist noch aktiv hier im Forum.

Wie könnte man deaktivierte Parts und Produkte aus der Zählung ausschließen?

------------------
Gruß Uwe

Auch Catia ist nur ein Mensch!    

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

bgrittmann
Moderator
Konstrukteur


Sehen Sie sich das Profil von bgrittmann an!   Senden Sie eine Private Message an bgrittmann  Schreiben Sie einen Gästebucheintrag für bgrittmann

Beiträge: 11780
Registriert: 30.11.2006

CATIA V5R19

erstellt am: 05. Jul. 2016 14:55    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für K.Siebert 10 Unities + Antwort hilfreich

Servus Uwe
Du könntest den entsprechenden Parameter "Component Activation State" (siehe zb hier) des Exemplars auswerten.

Gruß
Bernd

------------------
Warum einfach, wenn es auch kompliziert geht.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

moppesle
Ehrenmitglied V.I.P. h.c.
Konstrukteur


Sehen Sie sich das Profil von moppesle an!   Senden Sie eine Private Message an moppesle  Schreiben Sie einen Gästebucheintrag für moppesle

Beiträge: 3418
Registriert: 28.05.2009

CATIA V5 R19 SP9
WIN 7 64bit

erstellt am: 06. Jul. 2016 07:26    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für K.Siebert 10 Unities + Antwort hilfreich

Moin Bernd,

danke für den Link.

hab das ganze jetzt mal eingebunden.
Funktioniert auch,leider werden dann alle folgenden Produkte nicht mehr gezählt.

Kannst du mir unter die Arme greifen?

Code:
Function RekursivDurchBaum(oProducts As Products)

    Dim Paras As Parameters
    Dim oProduct As Product
    Dim oRefProduct As Product
    Dim oRefDocument As Document
    For Each oProduct In oProducts
        If oProduct.Products.Count > 0 Then
            RekursivDurchBaum oProduct.Products
        Else
            Set Paras = oProduct.Parameters
            If Paras.Item(Paras.Count).ValueAsString = "false" Then
            Exit Function
            'MsgBox "Deactivated"

            End If
           
            Set oRefProduct = oProduct.ReferenceProduct
            Set oRefDocument = oRefProduct.Parent
            If TypeName(oRefDocument) = "PartDocument" Then
    'Du bist an einen Part
    'jetzt kannst du entscheiden, nach was du zählen willst:

    '                'Dateiname
    '                aAssyArray(iAssyArrayCount) = oRefDocument.Name

    'PartNumber
                aAssyArray(iAssyArrayCount) = oRefProduct.PartNumber

                iAssyArrayCount = iAssyArrayCount + 1

    'dieser Block ist nur da, falls die Anzahl der Products über 100 kommen sollte
                If UBound(aAssyArray) <= iAssyArrayCount Then
                    ReDim Preserve aAssyArray(iAssyArrayCount + 20)
                End If
            End If
        End If
    Next
End Function


------------------
Gruß Uwe

Auch Catia ist nur ein Mensch!    

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

bgrittmann
Moderator
Konstrukteur


Sehen Sie sich das Profil von bgrittmann an!   Senden Sie eine Private Message an bgrittmann  Schreiben Sie einen Gästebucheintrag für bgrittmann

Beiträge: 11780
Registriert: 30.11.2006

CATIA V5R19

erstellt am: 06. Jul. 2016 09:29    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für K.Siebert 10 Unities + Antwort hilfreich

Servus Uwe
Du musst dir an der Stelle an dem du den Parameter abfragst den String des Parameters zusammensetzen (bitte mal im Watchfenster prüfen).
Im groben (ungetestet) müsste es so sein:
Code:

Set Paras = oProducts.Parent.Parameters
StrParameter = oProducts.Parent.Name & "\" & oProduct.Name & "\Component Activation State"
If Not Paras.Item(StrParameter) Then
    Exit function
end if
Achtung der Name des Parameters ist abhängig von der Spracheinstellung. ggf kann es in einer Componente Probleme geben

Gruß
Bernd

Edit: Die Parameter sind in der enstprechenden Baugruppe/Comonente angesiedelt und nicht im Product 8Unterbaugruppe/Einzelteil) selbst. Ich hab das oben im Code ergänzt.

------------------
Warum einfach, wenn es auch kompliziert geht.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

moppesle
Ehrenmitglied V.I.P. h.c.
Konstrukteur


Sehen Sie sich das Profil von moppesle an!   Senden Sie eine Private Message an moppesle  Schreiben Sie einen Gästebucheintrag für moppesle

Beiträge: 3418
Registriert: 28.05.2009

CATIA V5 R19 SP9
WIN 7 64bit

erstellt am: 06. Jul. 2016 14:23    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für K.Siebert 10 Unities + Antwort hilfreich

Hallo Bernd,

habe das in dem Beitrag so verstanden das

Code:
If Paras.Item(Paras.Count).ValueAsString = "false" Then

Eindeutiger ist.

Zitat:
das funktioniert natürlich auch, aber der Zugriff ist dann nicht eindeutig. Wenn in der Parameter-Collection des Products mehrere SubProducts/Parts stecken, dann erfolgt der Zugriff immer auf den ersten Parameter der gefunden wird. Eindeutig wird es erst, wenn man den gesamten Pfad angibt, oder eben aber mit count. So kann ich bei der Rekursion immer das aktuelle Produkt abfragen.

Eigentlich funktioniert es wohl auch.
Leider werden die Inhalte von deaktivierten Produkten trotzdem gezählt.

Habe deine Variante auch getestet, aber leider mit folgender Fehlermeldung.

Code:
Object doesn´t support this property or method

in folgender Zeile.
Code:
If Not Paras.Item(StrParameter) Then

------------------
Gruß Uwe

Auch Catia ist nur ein Mensch!      

[Diese Nachricht wurde von moppesle am 06. Jul. 2016 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

bgrittmann
Moderator
Konstrukteur


Sehen Sie sich das Profil von bgrittmann an!   Senden Sie eine Private Message an bgrittmann  Schreiben Sie einen Gästebucheintrag für bgrittmann

Beiträge: 11780
Registriert: 30.11.2006

CATIA V5R19

erstellt am: 06. Jul. 2016 14:35    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für K.Siebert 10 Unities + Antwort hilfreich

Servus Uwe
Kann sein dass bei dem Code schon der richtige Parameter ausgewertet wurde (ich hab es nicht getestet), aber das "Exit Function" ist dort falsch.
Du musst nicht die Funktion beenden, sondern den nächsten Aufruf der Schleife auslösen (zB "Next oProduct")

Gruß
Bernd

EDIT: In meinem Code ist ein Fehler: es wird nicht der Wert des Parameters angesprochen: Paras.Item(StrParameter).Value

------------------
Warum einfach, wenn es auch kompliziert geht.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

moppesle
Ehrenmitglied V.I.P. h.c.
Konstrukteur


Sehen Sie sich das Profil von moppesle an!   Senden Sie eine Private Message an moppesle  Schreiben Sie einen Gästebucheintrag für moppesle

Beiträge: 3418
Registriert: 28.05.2009

CATIA V5 R19 SP9
WIN 7 64bit

erstellt am: 06. Jul. 2016 20:59    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für K.Siebert 10 Unities + Antwort hilfreich

Hallo Bernd,

hab das so weit, das in einem Produkt die Parts richtig gezählt werden.

Wenn nun ein Produkt hinzukommt bleibt das Makro mit Automations error stehen.

Code:
If Paras.Item(StrParameter).Value Then

Code:
Function RekursivDurchBaum(oProducts As Products)

    Dim Paras As Parameters
    Dim oProduct As Product
    Dim oRefProduct As Product
    Dim oRefDocument As Document
    Dim StrParameter 'As Parameter
   
    For Each oProduct In oProducts
        If oProduct.Products.Count > 0 Then
            RekursivDurchBaum oProduct.Products
        Else
           
            Set Paras = oProducts.Parent.Parameters
            StrParameter = oProducts.Parent.Name & "\" & oProduct.Name & "\Component Activation State"
            'If Not Paras.Item(StrParameter).Value Then
                If Paras.Item(StrParameter).Value Then
           
                Set oRefProduct = oProduct.ReferenceProduct
                Set oRefDocument = oRefProduct.Parent
                    If TypeName(oRefDocument) = "PartDocument" Then
           
                    'PartNumber
                        aAssyArray(iAssyArrayCount) = oRefProduct.PartNumber

                        iAssyArrayCount = iAssyArrayCount + 1
                    End If
            Else
    'dieser Block ist nur da, falls die Anzahl der Products über 100 kommen sollte
                If UBound(aAssyArray) <= iAssyArrayCount Then
                    ReDim Preserve aAssyArray(iAssyArrayCount + 20)
                End If
            End If
        End If
    Next
End Function



hast du ne Idee?

------------------
Gruß Uwe

Auch Catia ist nur ein Mensch!    

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

bgrittmann
Moderator
Konstrukteur


Sehen Sie sich das Profil von bgrittmann an!   Senden Sie eine Private Message an bgrittmann  Schreiben Sie einen Gästebucheintrag für bgrittmann

Beiträge: 11780
Registriert: 30.11.2006

CATIA V5R19

erstellt am: 07. Jul. 2016 08:09    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für K.Siebert 10 Unities + Antwort hilfreich

Servus Uwe
Ändere mal folgende Zeile:
Code:
If oProduct.Products.Count > 0 Then
  RekursivDurchBaum oProduct.ReferenceProduct.Products
Else
Erklärung: Beim Pfad benötigst du hier für die Unterbaugruppe den Namen und nicht den Exemplarnamen.

Gruß
Bernd

------------------
Warum einfach, wenn es auch kompliziert geht.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

moppesle
Ehrenmitglied V.I.P. h.c.
Konstrukteur


Sehen Sie sich das Profil von moppesle an!   Senden Sie eine Private Message an moppesle  Schreiben Sie einen Gästebucheintrag für moppesle

Beiträge: 3418
Registriert: 28.05.2009

CATIA V5 R19 SP9
WIN 7 64bit

erstellt am: 07. Jul. 2016 08:43    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für K.Siebert 10 Unities + Antwort hilfreich

Servus Bernd,

danke dir nun läufts durch.
Leider werden aber Parts die sich in einem Produkt befinden das deaktiviert ist mitgezählt.
Könnte man das beheben?

------------------
Gruß Uwe

Auch Catia ist nur ein Mensch!    

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

bgrittmann
Moderator
Konstrukteur


Sehen Sie sich das Profil von bgrittmann an!   Senden Sie eine Private Message an bgrittmann  Schreiben Sie einen Gästebucheintrag für bgrittmann

Beiträge: 11780
Registriert: 30.11.2006

CATIA V5R19

erstellt am: 07. Jul. 2016 08:52    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für K.Siebert 10 Unities + Antwort hilfreich

Servus
Indem du "RekursivDurchBaum" für die Unterbaugruppe erst aufrufst nachdem du geprüft hast ob die Baugruppe aktiv ist (über den Parameter).

Gruß
Bernd

------------------
Warum einfach, wenn es auch kompliziert geht.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

moppesle
Ehrenmitglied V.I.P. h.c.
Konstrukteur


Sehen Sie sich das Profil von moppesle an!   Senden Sie eine Private Message an moppesle  Schreiben Sie einen Gästebucheintrag für moppesle

Beiträge: 3418
Registriert: 28.05.2009

CATIA V5 R19 SP9
WIN 7 64bit

erstellt am: 07. Jul. 2016 09:12    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für K.Siebert 10 Unities + Antwort hilfreich

Hi

muss ich denn nicht während ich mich durch den Baum hangele prüfen ob ein PART/PRODUKT aktiv ist?

------------------
Gruß Uwe

Auch Catia ist nur ein Mensch!    

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

bgrittmann
Moderator
Konstrukteur


Sehen Sie sich das Profil von bgrittmann an!   Senden Sie eine Private Message an bgrittmann  Schreiben Sie einen Gästebucheintrag für bgrittmann

Beiträge: 11780
Registriert: 30.11.2006

CATIA V5R19

erstellt am: 07. Jul. 2016 13:15    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für K.Siebert 10 Unities + Antwort hilfreich

Servus Uwe
Vermutlich reicht es wenn du die Zeilen "If oProduct.Products.Count > ..." in die Schleife "If Paras.Item(StrParameter).Value Then ..." verschiebst.

Gruß
Bernd

------------------
Warum einfach, wenn es auch kompliziert geht.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

moppesle
Ehrenmitglied V.I.P. h.c.
Konstrukteur


Sehen Sie sich das Profil von moppesle an!   Senden Sie eine Private Message an moppesle  Schreiben Sie einen Gästebucheintrag für moppesle

Beiträge: 3418
Registriert: 28.05.2009

CATIA V5 R19 SP9
WIN 7 64bit

erstellt am: 08. Jul. 2016 08:52    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für K.Siebert 10 Unities + Antwort hilfreich

Hallo Bernd,

du kennst ja mein Programmierkenntnisse.

Funktioniert nicht.
Liegt aber wohl an mir.

Habe das folgendermaßen eingesetzt.
bleibt aber wiederum in der Zeile:

Code:
If Paras.Item(StrParameter).Value Then

hängen.

Code:
Function RekursivDurchBaum(oProducts As Products)

    Dim Paras As Parameters
    Dim oProduct As Product
    Dim oRefProduct As Product
    Dim oRefDocument As Document
    Dim StrParameter 'As Parameter
   
    For Each oProduct In oProducts
        If oProduct.Products.Count > 0 Then
            RekursivDurchBaum oProduct.Products
        Else
           
            Set Paras = oProducts.Parent.Parameters
            StrParameter = oProducts.Parent.Name & "\" & oProduct.Name & "\Component Activation State"
            'If Not Paras.Item(StrParameter).Value Then
                If oProduct.Products.Count > 0 Then
                    RekursivDurchBaum oProduct.Products
                    End If
                If Paras.Item(StrParameter).Value Then
               
                Set oRefProduct = oProduct.ReferenceProduct
                Set oRefDocument = oRefProduct.Parent
                    If TypeName(oRefDocument) = "PartDocument" Then
           
                    'PartNumber
                        aAssyArray(iAssyArrayCount) = oRefProduct.PartNumber

                        iAssyArrayCount = iAssyArrayCount + 1
                    End If
            Else
    'dieser Block ist nur da, falls die Anzahl der Products über 100 kommen sollte
                If UBound(aAssyArray) <= iAssyArrayCount Then
                    ReDim Preserve aAssyArray(iAssyArrayCount + 20)
                End If
            End If
        End If
    Next
End Function


------------------
Gruß Uwe

Auch Catia ist nur ein Mensch!    

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

bgrittmann
Moderator
Konstrukteur


Sehen Sie sich das Profil von bgrittmann an!   Senden Sie eine Private Message an bgrittmann  Schreiben Sie einen Gästebucheintrag für bgrittmann

Beiträge: 11780
Registriert: 30.11.2006

CATIA V5R19

erstellt am: 08. Jul. 2016 09:07    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für K.Siebert 10 Unities + Antwort hilfreich

Servus Uwe
Der Aufruf der Rekursion ist an der falschen Stelle und das "ReferenceProduct" fehlt wieder.
Zum Test ist es besser eine kleine Testbaugruppe zu erstellen (zB nur mit dem Sonderfall) und mit dem Formeleditor prüfen wie die Parameter heißen.
Probier es mal so (ungetestet):
Code:
Function RekursivDurchBaum(oProducts As Products)

    Dim Paras As Parameters
    Dim oProduct As Product
    Dim oRefProduct As Product
    Dim oRefDocument As Document
    Dim StrParameter 'As Parameter
 
    'Schleife über alle Products
    For Each oProduct In oProducts     
        'Parameter Activation-State prüfen 
        Set Paras = oProducts.Parent.Parameters
        'Name des Paramters zusammensetzen.ACHTUNG Name ist sprachabhängig!!
        StrParameter = oProducts.Parent.Name & "\" & oProduct.Name & "\Component Activation State"
        'Wenn der Parameter true ist ist das Teil/Baugruppe aktiv
        If Paras.Item(StrParameter).Value Then
            'Bei einer Komponente oder Unterbaugruppe Rekursion starten
            If oProduct.Products.Count > 0 Then
                RekursivDurchBaum oProduct.ReferenceProduct.Products
            End If
               
            'Part oder CATProduct 
            Set oRefProduct = oProduct.ReferenceProduct
            Set oRefDocument = oRefProduct.Parent
            If TypeName(oRefDocument) = "PartDocument" Then         
                'PartNumber in Array schreiben
                aAssyArray(iAssyArrayCount) = oRefProduct.PartNumber
                iAssyArrayCount = iAssyArrayCount + 1
            End If
        Else
        'dieser Block ist nur da, falls die Anzahl der Products über 100 kommen sollte
            If UBound(aAssyArray) <= iAssyArrayCount Then
                ReDim Preserve aAssyArray(iAssyArrayCount + 20)
            End If
        End If
    Next
End Function


Gruß
Bernd

------------------
Warum einfach, wenn es auch kompliziert geht.

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

moppesle
Ehrenmitglied V.I.P. h.c.
Konstrukteur


Sehen Sie sich das Profil von moppesle an!   Senden Sie eine Private Message an moppesle  Schreiben Sie einen Gästebucheintrag für moppesle

Beiträge: 3418
Registriert: 28.05.2009

CATIA V5 R19 SP9
WIN 7 64bit

erstellt am: 08. Jul. 2016 10:20    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für K.Siebert 10 Unities + Antwort hilfreich

Danke dir Bernd. 
Funktioniert.

Testbaugruppe hatte ich, auf den Dreh bin ich schon gekommen. Leider haperts bei mir der Logik des strukturellen Aufbaus.
Dazu Programmiere ich zu wenig. Habe halt in der Regel ein anderes Geschäft zu tun.


------------------
Gruß Uwe

Auch Catia ist nur ein Mensch!      

[Diese Nachricht wurde von moppesle am 08. Jul. 2016 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz