CATIA V5 | 3DEXPERIENCE
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le deal à ne pas rater :
Funko POP! Jumbo One Piece Kaido Dragon Form : où l’acheter ?
Voir le deal

Compter les éléments dans l'arbre

3 participants

Aller en bas

Compter les éléments dans l'arbre Empty Compter les éléments dans l'arbre

Message par Liocco08 Mer 2 Nov 2022 - 21:10

Plus généralement en commençant par les bases, comment compter exactement le nombre d'éléments dans l’arbre de construction ? (sous-produit aussi)

Typiquement avec cette image, ça me sort 10 alors qu'il y en a plus...

Compter les éléments dans l'arbre Captur13


Sub SupContraintes(MonDocument As Document, MonProduit As Product)


MsgBox MonProduit.Products.Count

'Comment lister les éléments d'un arbre complet

End Sub

Merci,


Liocco08
actif
actif

Messages : 39
Date d'inscription : 07/04/2022
Localisation : Toulouse

Revenir en haut Aller en bas

Compter les éléments dans l'arbre Empty Re: Compter les éléments dans l'arbre

Message par lumpazepfel Jeu 3 Nov 2022 - 13:17

Salut Julien,

La fonction WalkDownTree(myProduct) que tu utilises déjà te permet de le faire.
Tu pourras compter soit le nombre de fichiers différents (PartNumber) soit le nombre d'instances totales.
lumpazepfel
lumpazepfel
Fédérateur
Fédérateur

Messages : 316
Date d'inscription : 02/11/2015
Localisation : Ensisheim

Liocco08 aime ce message

Revenir en haut Aller en bas

Compter les éléments dans l'arbre Empty Re: Compter les éléments dans l'arbre

Message par Liocco08 Jeu 3 Nov 2022 - 14:51

J'avais du mal à comprendre le fonctionnement de cette fonction, car elle s'appelle elle-même ? C'est ça la récursivité ?

Mes compétences en informatiques sont limités, c'est pour ça que je voulais décomposer en éléments plus simple mais je devrais pouvoir me débrouiller.

Je te remercie Marc,


Liocco08
actif
actif

Messages : 39
Date d'inscription : 07/04/2022
Localisation : Toulouse

Revenir en haut Aller en bas

Compter les éléments dans l'arbre Empty Re: Compter les éléments dans l'arbre

Message par lumpazepfel Jeu 3 Nov 2022 - 16:02

Oui c'est bien ça.
Lorsque la macro trouve un sous product dans le product de tête, elle se rappelle elle même pour scanner le contenu de se sous product et ainsi de suite.
Que veux tu compter : les partnumber unique ou les instances?

Tu peux aussi utiliser la fonction "BillOfMateria"

Code:

Language="VBSCRIPT"

Sub CATMain()

Dim productDocument1 As Document
Set productDocument1 = CATIA.ActiveDocument

Dim product1 As Product
Set product1 = productDocument1.Product

Dim assemblyConvertor1 As CATBaseDispatch
Set assemblyConvertor1 = product1.GetItem("BillOfMaterial")

'Composition de chaque composant / sous-produit
Dim arrayOfVariantOfBSTR1(4) 'change number if you have more custom columns/array...
arrayOfVariantOfBSTR1(0) = "Quantity" 'si CATIA en Français "Quantité"
arrayOfVariantOfBSTR1(1) = "Part Number" 'si CATIA en Français "Référence"
arrayOfVariantOfBSTR1(2) = "Type"
arrayOfVariantOfBSTR1(3) = "Nomenclature"
arrayOfVariantOfBSTR1(4) = "Revision"

'Nomenclature globale du CATProduct
assemblyConvertor1.SetCurrentFormat arrayOfVariantOfBSTR1

Dim arrayOfVariantOfBSTR2(1) 'change number if you have more custom columns/array...
arrayOfVariantOfBSTR2(0) = "Quantity" 'si CATIA en Français "Quantité"
arrayOfVariantOfBSTR2(1) = "Part Number" 'si CATIA en Français "Référence"

assemblyConvertor1.SetSecondaryFormat arrayOfVariantOfBSTR2

assemblyConvertor1.Print "TXT", "c:\temp\Custom_BOM.txt", product1

End Sub

lumpazepfel
lumpazepfel
Fédérateur
Fédérateur

Messages : 316
Date d'inscription : 02/11/2015
Localisation : Ensisheim

Liocco08 aime ce message

Revenir en haut Aller en bas

Compter les éléments dans l'arbre Empty Re: Compter les éléments dans l'arbre

Message par Liocco08 Ven 4 Nov 2022 - 11:05

Je te remercie !

En fait je suis en train de développer sur mon temps perso un fichier catvba qui va regrouper toutes les macros utiles lors de ma conception 3D.

Je commence par la gestion des contraintes. Je n'ai pas beaucoup de temps en ce moment c'est pour ça que je poste si jamais des personnes ont déjà ça en stocke.

Notre géant français de l'aéro n'accepte aucune contrainte dans nos assemblages, donc je souhaitais avoir un moyen simple de supprimer toutes les contraintes à tous les niveaux, et les remplacer paf une fixité.

Voici mon code, complètement bourrin qui ne fonctionne que pour 4 niveau de sous-assemblage car je n'ai pas réussi à utiliser la récursivité de ma fonction...Si vous avez un moyen simple, je suis preneur.

Je saurais me débrouiller pour tout fixer ensuite.

https://servimg.com/view/20418618/5

Module principal :

Code:


'*************************************************************************
'*****  Création de toutes les macro utiles
'*****  Author: Julien M.
'*****  Date de commencement:  02/11/2022
'*****  Date de fin:  XX/XX/XXXX
'*****  https://catiav5.forumactif.org/t1759-trier-une-listebox-macro-tri-arbre-de-construction-catia
'*****  http://cao-3d-pro.com/catia-vba-lister-references-et-instances/
'*****  https://cao-3d-pro.com/catia-vba-lister-references-et-fichiers/
'*****  https://cao-3d-pro.com/catia-catdua/
'*************************************************************************
'-----------------------------------------------------------------------------------------------------------------------------------------------------------
' ----- Déclaration des variables -----
'-----------------------------------------------------------------------------------------------------------------------------------------------------------

Option Explicit ' Obligation de définir chqaque variable

' ----- Déclaration des strings -----
Public ContenuFichier As String ' Permet de stocker le contenu du fichier
Public MotDePasse As String

' ----- Déclaration des éléments CATIA -----
Public MyDocument As Document
Public MyProductDocument As ProductDocument
Public MyPartDocument As PartDocument
Public MainProduct As Product

Sub CATMAIN()

ExempleLectureFichierTexte ' Lance la lecture du mot de passe

' ----- Initialisation des variables -----
Set MyDocument = CATIA.ActiveDocument
Set MainProduct = MyDocument.Product


' ----------------------------------------------------------------------------------------------------------------------------
'***** Protection des données
' ----------------------------------------------------------------------------------------------------------------------------
If ContenuFichier = MotDePasse Then

    'Call SupContraintes(MyDocument, MainProduct)
    Call Essai(MyDocument, MainProduct)
   

Else
   
    MsgBox ("Si ce message s'affiche, cela signifie qu'un dossier est manquant pour l'exécution de la MACRO. Si vous utiliser cette MACRO dans le cadre de votre travail en entreprise, veuillez envoyer un mail ici : Julien.Malve@laroche-group.com "), vbCritical, ("Erreur de lancement (fichier manquant/utilisation non légal). 2022 ©")

End If


End Sub



Code:


Sub SupContraintes(MonDocument As Document, MonProduit As Product)

' Déclaration des variables
Dim ConstraintsProduits As Variant
Dim i, k, m, o As Integer

' Initialisation des variables
Set ConstraintsProduits = MonProduit.Connections("CATIAConstraints")

'Supression des contraintes du produit principal
For k = 1 To ConstraintsProduits.Count

    ConstraintsProduits.Remove (ConstraintsProduits.Count)

Next

'Suppressions des contraintes des autres produits pour 4 niiveaux de sous-ensemble
For i = 1 To MonProduit.Products.Count
   
    If (InStr(1, MonProduit.Products.Item(i).ReferenceProduct.Parent.Name, "CATProduct") > 0) Then
           
        For m = 1 To MonProduit.Products.Item(i).Products.Count
           
            If (InStr(1, MonProduit.Products.Item(i).Products.Item(m).ReferenceProduct.Parent.Name, "CATProduct") > 0) Then
           
                For o = 1 To MonProduit.Products.Item(i).Products.Item(m).Products.Count
               
                    If (InStr(1, MonProduit.Products.Item(i).Products.Item(m).Products.Item(o).ReferenceProduct.Parent.Name, "CATProduct") > 0) Then
                   
                        Set ConstraintsProduits = MonProduit.Products.Item(i).Products.Item(m).Products.Item(o).Connections("CATIAConstraints")
                       
                        For k = 1 To ConstraintsProduits.Count
               
                            ConstraintsProduits.Remove (ConstraintsProduits.Count)
               
                        Next
                       
                    Else
                             
   
                        Set ConstraintsProduits = MonProduit.Products.Item(i).Products.Item(m).Connections("CATIAConstraints")
                       
                        For k = 1 To ConstraintsProduits.Count
               
                            ConstraintsProduits.Remove (ConstraintsProduits.Count)
               
                        Next
                       
                    End If
                   
                Next o
               
           
            Else
                   
                        Set ConstraintsProduits = MonProduit.Products.Item(i).Connections("CATIAConstraints")
                   
                        For k = 1 To ConstraintsProduits.Count
                       
                                ConstraintsProduits.Remove (ConstraintsProduits.Count)
                   
                        Next
                   
                End If
       
        Next m
       
    Else
   
    'S'il n'y a pas de product dans le sous-assemblage, alors on supprime ses contraintes
               
        Set ConstraintsProduits = MonProduit.Products.Item(i).Connections("CATIAConstraints")
               
        For k = 1 To ConstraintsProduits.Count
       
            ConstraintsProduits.Remove (ConstraintsProduits.Count)
       
        Next
               

    End If

   
Next i


End Sub




Liocco08
actif
actif

Messages : 39
Date d'inscription : 07/04/2022
Localisation : Toulouse

Revenir en haut Aller en bas

Compter les éléments dans l'arbre Empty Re: Compter les éléments dans l'arbre

Message par lumpazepfel Sam 5 Nov 2022 - 15:22

Salut Julien,

Voici un petit code pour supprimer les contraintes en utilisant la recherche.
J'ai  testé sur un produit à 3 niveaux avec composants.

Code:

Sub CATMain()

Dim productDocument1 As ProductDocument
Set productDocument1 = CATIA.ActiveDocument

Dim selection1 As Selection
Set selection1 = productDocument1.Selection
selection1.Search "(CATProductSearch.MfConstraint),all"
selection1.Delete
selection1.Clear

End Sub

lumpazepfel
lumpazepfel
Fédérateur
Fédérateur

Messages : 316
Date d'inscription : 02/11/2015
Localisation : Ensisheim

Revenir en haut Aller en bas

Compter les éléments dans l'arbre Empty Re: Compter les éléments dans l'arbre

Message par Xavier KLEIN Lun 14 Nov 2022 - 8:40

Bonjour
une solution est utiliser la fonction Nomenclature de catia,
tu peux verifier en interactif que tu compte bien ce que tu veux
(le nombre d'inqtance , de fichier différents ...)
ensuite utilise la methode GetItem("BillOfMaterial")
et AssemblyConvertor1.[Print] "XLS", MyBomFile, MyProduct
exemple de script



' Extraction BOM depuis CATProduct
'
' - creation du fichier .txt avec le contenu de la BOM
' - Remplir une table avee la liste des composants : SCM_BOM

Sub StartAnalysisBOM(MyProduct As Product, MyBomFile As String)


' Check Produit actif
If UCase(Right(MyProduct.Parent.name, 10)) <> "CATPRODUCT" Then
Exit Sub
End If


' check output file ' delete if already exist
If Fso.FileExists(MyBomFile) Then
Fso.DeleteFile (MyBomFile)
End If


' create table
Dim AssemblyConvertor1 As AssemblyConvertor
Dim AssemblyConvertor1Variant ' need to be a variant
Set AssemblyConvertor1 = MyProduct.GetItem("BillOfMaterial")

'Dim arrayOfVariantOfBSTR1(4)
'arrayOfVariantOfBSTR1(0) = "Quantity"
'arrayOfVariantOfBSTR1(1) = "Part Number"
'arrayOfVariantOfBSTR1(2) = "Revision"
'arrayOfVariantOfBSTR1(3) = "Definition"

'Dim arrayOfVariantOfBSTR1(16)
'arrayOfVariantOfBSTR1(0) = "Quantity"
'arrayOfVariantOfBSTR1(1) = "Part Number"
'arrayOfVariantOfBSTR1(2) = "Type"
'arrayOfVariantOfBSTR1(3) = "Nomenclature"
'arrayOfVariantOfBSTR1(4) = "Revision"
'arrayOfVariantOfBSTR1(5) = "Source"
'arrayOfVariantOfBSTR1(6) = "Number"
'arrayOfVariantOfBSTR1(7) = "Definition"
'arrayOfVariantOfBSTR1(Cool = "Product Description"
'arrayOfVariantOfBSTR1(9) = "Component Description"
'arrayOfVariantOfBSTR1(10) = "Source"
'arrayOfVariantOfBSTR1(11) = "Default Representation Source"
'arrayOfVariantOfBSTR1(12) = "Name"
'arrayOfVariantOfBSTR1(13) = "Owner"
'arrayOfVariantOfBSTR1(14) = "Comment"
'arrayOfVariantOfBSTR1(15) = "List Of Named URLs"
'arrayOfVariantOfBSTR1(16) = "Children"


' Dim arrayOfVariantOfBSTR1(Cool
Dim arrayOfVariantOfBSTR1(Cool
On Error GoTo 0

arrayOfVariantOfBSTR1(0) = "Quantité"
arrayOfVariantOfBSTR1(1) = "Référence"
arrayOfVariantOfBSTR1(2) = "Définition"
arrayOfVariantOfBSTR1(3) = "Numéro"
arrayOfVariantOfBSTR1(4) = "Description du produit"
arrayOfVariantOfBSTR1(5) = "Révision"
arrayOfVariantOfBSTR1(6) = "Commentaire"
arrayOfVariantOfBSTR1(7) = "Source de la représentation par défaut"


Set AssemblyConvertor1Variant = AssemblyConvertor1
AssemblyConvertor1Variant.SetCurrentFormat arrayOfVariantOfBSTR1
' AssemblyConvertor1.SetCurrentFormat arrayOfVariantOfBSTR1

'Dim arrayOfVariantOfBSTR2(15)
'arrayOfVariantOfBSTR2(0) = "Quantity"
'arrayOfVariantOfBSTR2(1) = "Part Number"
'arrayOfVariantOfBSTR2(2) = "Type"
'arrayOfVariantOfBSTR2(3) = "Source"
'arrayOfVariantOfBSTR2(4) = "Number"
'arrayOfVariantOfBSTR2(5) = "Revision"
'arrayOfVariantOfBSTR2(6) = "Definition"
'arrayOfVariantOfBSTR2(7) = "Nomenclature"
'arrayOfVariantOfBSTR2(Cool = "Product Description"
'arrayOfVariantOfBSTR2(9) = "Source"
'arrayOfVariantOfBSTR2(10) = "Default Representation Source"
'arrayOfVariantOfBSTR2(11) = "Name"
'arrayOfVariantOfBSTR2(12) = "Owner"
'arrayOfVariantOfBSTR2(13) = "Comment"
'arrayOfVariantOfBSTR2(14) = "List Of Named URLs"
'arrayOfVariantOfBSTR2(15) = "Children"


' Dim arrayOfVariantOfBSTR2(Cool
Dim arrayOfVariantOfBSTR2(11)
arrayOfVariantOfBSTR2(0) = "Quantité"
arrayOfVariantOfBSTR2(1) = "Référence"
arrayOfVariantOfBSTR2(2) = "Définition"
arrayOfVariantOfBSTR2(3) = "Numéro"
arrayOfVariantOfBSTR2(4) = "Référence"
arrayOfVariantOfBSTR2(5) = "Référence"
arrayOfVariantOfBSTR2(6) = "Référence"
arrayOfVariantOfBSTR2(7) = "Référence"
arrayOfVariantOfBSTR2(Cool = "Référence"
arrayOfVariantOfBSTR2(9) = "Référence"
arrayOfVariantOfBSTR2(10) = "Source de la représentation par défaut"


AssemblyConvertor1Variant.SetSecondaryFormat arrayOfVariantOfBSTR2

' Create File
'Dim catConvertor As AssemblyConvertor
'Set catConvertor = AssemblyConvertor1
' AssemblyConvertor1.[Print] "TXT", MyBomFile, MyProduct
' assemblyConvertor1Variant.[Print] "TXT", MyBomFile, MyProduct

' Export au format Excel
AssemblyConvertor1.[Print] "XLS", MyBomFile, MyProduct

' Export au format .txt
' AssemblyConvertor1.[Print] "TXT", MyBomFile, MyProduct


End Sub

Xavier KLEIN
timide
timide

Messages : 4
Date d'inscription : 10/04/2018
Localisation : Haute Savoie

Revenir en haut Aller en bas

Compter les éléments dans l'arbre Empty Re: Compter les éléments dans l'arbre

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum