CATIA V5 | 3DEXPERIENCE
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le Deal du moment : -29%
DYSON V8 Origin – Aspirateur balai sans fil
Voir le deal
269.99 €

Trier une listebox (MACRO tri Arbre de Construction CATIA)

2 participants

Aller en bas

R?solu Trier une listebox (MACRO tri Arbre de Construction CATIA)

Message par Liocco08 Jeu 7 Avr 2022 - 9:37

Bonjour à tous,

Je travail actuellement sur une macro CATIA V5 R17 qui permet de trier un arbre de construction. Je me suis inspiré d'une MACRO existante et j'ai souhaiter l'adapter à mes projets.

Concrètement, mon objectif est de trier au sein d'un product toutes les parts par ordre alphabétique (puis je souhaiterais ajouter l'option de trier par ordre croissant, étant donner que j'ai des parts qui peuvent être uniquement des numéros type : 63000 XXXXXXXXXXX).

J'ai essayé plusieurs méthode pour trier mes parts, mais je n'y arrive pas, à chaque fois le tri est incompréhensible. Quelqu'un pourrait m'aider ?

En fait j'ai du mal à comprendre le principe de fonctionnement de ce tri (comme on compare 2 variables string entre elles, et de la même manière, comment je pourrais comparer 2 parts pour faire un tri d'ordre croissant avec des pièces ayant pour nom : 63000D111780052512).

Je n'arrive pas à vous donner la macro, donc voici le code : (NewOrder étant ma ListBox)

(Je voulais vous montrer à quoi ressemble ma MACRO et le résultat mais je ne peux pas mettre de lien ou de fichier (ou alors je n'ai pas compris comment faire)).

Code:



Private Sub AtoZ_button_Click()
' A REVOIR CAR FONCTIONNE PAS

'Déclaration des variables
Dim i As Long
Dim j As Long
Dim temp As String


'sort the spec tree order from A to Z

For i = 0 To NewOrder.ListCount - 1

    For j = 0 To NewOrder.ListCount - 1
    
        If NewOrder.List(i) < NewOrder.List(j) Then
        
            temp = NewOrder.List(i)
            NewOrder.List(i) = NewOrder.List(j)
            NewOrder.List(j) = temp
            
        End If
        
    Next j
    
Next i


'MsgBox (NewOrder.List(0) & NewOrder.List(1) & NewOrder.List(2) & NewOrder.List(3))


End Sub



Voici ce qui se passe quand je clique sur mon bouton (A to Z)

Merci d'avance,

Julien

Liocco08
actif
actif

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

Liocco08 aime ce message

Revenir en haut Aller en bas

R?solu UPDATE

Message par Liocco08 Jeu 7 Avr 2022 - 11:05

Bon apparemment ce tri fonctionne pour des pièces ayant des noms type 630000 XXXX mais dès que j'ai une pièce entièrement nommé en string (chaîne de caractères) ça déconne. Une idée du pourquoi du comment ?

Merci !

Liocco08
actif
actif

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

Revenir en haut Aller en bas

R?solu Re: Trier une listebox (MACRO tri Arbre de Construction CATIA)

Message par lumpazepfel Ven 8 Avr 2022 - 13:06

Bonjour Julien,

La comparaison <, va comparer les valeurs ASCII de ta chaîne de caractère.
Tout dépend ce qu'il y a dans tes noms de pièces. Par exemple en ASCII les lettres majuscules sont avant les minuscules, donc si tu as du mélange minuscule/ majuscule ça peut poser des problèmes, de même pour les caractères spéciaux.
Peut tu indiquer quelque exemple de nom de pièces?
A+
Marc
lumpazepfel
lumpazepfel
Fédérateur
Fédérateur

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

Revenir en haut Aller en bas

R?solu Re: Trier une listebox (MACRO tri Arbre de Construction CATIA)

Message par Liocco08 Ven 8 Avr 2022 - 14:25

Merci pour ta réponse.

Alors pour prendre des exemples précis, je vais avoir des products sous la forme "63000D11178005C044/63000D11178005A044" et des pièces au format "63000D111780050000" ou "63000D111780054010" mais aussi des "JTT19G4ZNS0IRJ8100/JTTA5HJ1HJP90B3800".

Mon objectif avec cette macro est de trier dans l'ordre suivant :

- En premier je veux nécessairement les products trié par ordre alphabétique (en réalité le tri se fait sur les 4 derniers digits qui sont les seuls éléments qui changent). Avec les products au dessus ça donnerait 63000D11178005A044 puis 63000D11178005C044.

- Ensuite il me faut les pièces dites "fabriquées", c'est-à-dire celles au format "63000D111780050000". Pareil toujours par ordre numérique puisque les pièces vont évoluer en 63000D111780050002 puis 63000D111780050004 puis 63000D111780050006 etc...

- Puis je veux les pièces du commerce type 63000D111780054010 puis 63000D111780054012 etc...

- Enfin en dernier il me faut les pièces types JTTA5HJ1HJP90B3800 qui se trie aussi (ici peut importe l'ordre). Pour être précis je veux qu'elle se regroupe ensemble et qu'elles suivent un ordre alphanumérique, mais ce n'est pas important si en premier c'est les pièces contenant un caractère ou un chiffre au 4 digits :  JTTA5HJ1HJP90B3800 ou la JTT19G4ZNS0IRJ8100.

J'espère avoir été clair, j'aimerais te fournir une photo de ce que fait actuellement la macro mais je n'ai pas le droit de poster de lien (je suis nouveau).

J'essaye en message privé si ça existe ^^

Merci de ton aide !  Smile  Smile  Smile  Smile

Liocco08
actif
actif

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

Revenir en haut Aller en bas

R?solu Re: Trier une listebox (MACRO tri Arbre de Construction CATIA)

Message par lumpazepfel Ven 8 Avr 2022 - 14:40

OK, je vois la complexité du truc...
Personnellement je passerais par des tableaux (array) intermédiaires:
-tu répartis tes partnumber dans trois tableaux (produit, pièces fabriquées, pièces du commerce)
-tu classes chaque tableau par ordre alphabétique
-tu reconstruis ta listebox avec les 3 tableaux.
lumpazepfel
lumpazepfel
Fédérateur
Fédérateur

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

Revenir en haut Aller en bas

R?solu Re: Trier une listebox (MACRO tri Arbre de Construction CATIA)

Message par Liocco08 Ven 8 Avr 2022 - 14:49

lumpazepfel a écrit:OK, je vois la complexité du truc...
Personnellement je passerais par des tableaux (array) intermédiaires:
-tu répartis tes partnumber dans trois tableaux (produit, pièces fabriquées, pièces du commerce)
-tu classes chaque tableau par ordre alphabétique
-tu reconstruis ta listebox avec les 3 tableaux.


D'accord je comprends ce que tu veux faire, dans ce cas je travail directement en identifiant chaque part/product plutôt que de travailler avec la ListBox (pour l'opération de tri) c'est ça ?

Et désolé j'ai pas beaucoup d'expérience en VBA, mais pour séparer les parts en fonction de leur nature, il existe une fonction de ce type ? Du genre

Si la part contient une partie "63000D111780050XXX" alors elle ira dans ce tableau.

Liocco08
actif
actif

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

Revenir en haut Aller en bas

R?solu Re: Trier une listebox (MACRO tri Arbre de Construction CATIA)

Message par lumpazepfel Ven 8 Avr 2022 - 15:00

Je ne sais pas ce que tu veux faire avec la listbox, si tu l'utilises uniquement pour créer la liste alors elle n'est pas utile sauf tu veux l'afficher à l'utilisateur pour vérification et validation par exemple.
Oui il existe une fonction pour rechercher tout ou partie de chaine de caractère c'est INSTR,
voir ici https://www.excel-pratique.com/fr/astuces_vba/instr
Tu as aussi dans le dossier où est installé CATIA une aide sur le VBA CATIA : "V5Automation.chm" sous \tondossier\RxxSPx\win_b64\code\bin\V5Automation.chm

Exemple classique:
Dim oActiveDoc As Document
Set oActiveDoc = CATIA.ActiveDocument

' Check whether the document is a CATPart
If (InStr(oActiveDoc.Name,".CATPart")) <> 0 Then
lumpazepfel
lumpazepfel
Fédérateur
Fédérateur

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

Revenir en haut Aller en bas

R?solu Problème Instance pour trier

Message par Liocco08 Ven 15 Avr 2022 - 12:49

Bonjour @lumpazepfel

J'ai pas mal avancé sur ma macro mais je suis encore bloqué. En effet, aujourd'hui la macro fonctionne correctement si il n'y a qu'une seule instance de chaque élément. Cependant dès qu'il y a plusieurs instances d'une même part ça ne marche plus...

Pour expliquer la méthodo du code :

- Je commence par trier, comme tu me l'as dit, les part et les products dans 2 tableaux différents.
- J'assemble ces deux tableaux pour les afficher dans ma listebox

Puis dans un second temps, avec un bouton activable par ma Userform, l'utilisateur peut lancer le tri et valider si cela lui convient.

Mon problème interviens dans l'identification des éléments de l'arbre. En effet, le remplissage se fait par le nom de l'élément dans l'assemblage (le nom du product ou le nom de la part), mais pas en fonction de son INSTANCE Exclamation De ce fait, si j'ai la même part avec une instance différente, pour lui c'est pareil (donc ça fou la merde).

Mon problème est que je n'arrive pas à accéder à l'instance avec ma fonction de tri des parts et des products. Car je sais identifier l'instance des éléments de l'arbre, mais pas pendant ce tri.

Ici toutes mes variables :

Code:

' Déclaration des variables
Option Explicit
Public Response As Integer 'Variable qui permet de stocker la réponse d'erreur si il n'y a rien à ordonner
Public TableauTriProduct() As String ' tableau contenant le nom des part et des products
Public TableauTriPart() As String ' tableau contenant le nom des part et des products
Public TableauAffichageNonTri() As String
Public TableauAffichageTri() As String
Public NomDocCatia As String
Public ExtensionFichier As String
Public NDocCatia As Document
Public NombreProduct, NombrePart, NombreTotalDocument As Integer
Public ProductDocCatia As ProductDocument
Public NomActif As String
Public PartDocCatia As PartDocument
Public MyProductDocument As ProductDocument ' Permet d'attraper le product actif pour le passer en design mode
Public MainProduct As Product
Public ListComposants As Products

Voici la suite du code :

Code:

Public Function ListeDoc()

'-----------------------------------------------------------------------------------------------------------------------------------------------------------
' ----- Déclaration des variables -----
'-----------------------------------------------------------------------------------------------------------------------------------------------------------

'-----------------------------------------------------------------------------------------------------------------------------------------------------------
' ----- Remplissage des tableaux de Part et de Product -----
'-----------------------------------------------------------------------------------------------------------------------------------------------------------

NombreProduct = 0
NombrePart = 0

For Each NDocCatia In DocCatia
    
    NomDocCatia = NDocCatia.Name
        
    If (InStr(1, NomDocCatia, "CATProduct") > 0) Then
        ExtensionFichier = "CATProduct"
        Set ProductDocCatia = NouveauDocCatia.Item(NomDocCatia)
            If NomDocActif = NDocCatia.Name Then
            Else
            ReDim Preserve TableauTriProduct(NombreProduct)
                
            TableauTriProduct(NombreProduct) = SousReference.Name
                    
            NombreProduct = NombreProduct + 1
            End If
    End If
        
    If (InStr(1, NomDocCatia, "CATPart") > 0) Then
        ExtensionFichier = "CATPart"
        Set PartDocCatia = NouveauDocCatia.Item(NomDocCatia)
        ReDim Preserve TableauTriPart(NombrePart)
        TableauTriPart(NombrePart) = PartDocCatia.Product.PartNumber
            
        NombrePart = NombrePart + 1
            
    
    End If
    
Next


NombreTotalDocument = NombrePart + NombreProduct

'-----------------------------------------------------------------------------------------------------------------------------------------------------------
' ----- Les parts et les products sont dans 2 tableaux différents -----
'-----------------------------------------------------------------------------------------------------------------------------------------------------------
'-----------------------------------------------------------------------------------------------------------------------------------------------------------
' ----- Assemblage des 2 tableaux -----
'-----------------------------------------------------------------------------------------------------------------------------------------------------------

TableauAffichageNonTri = Split(Join(TableauTriProduct, ",") & "," & Join(TableauTriPart, ","), ",")

End Function

Ce code permet de trier des éléments en fonction de si c'est un part ou un product mais pas d'identifier les instances.
Je peux très bien remplir mon tableau avec les instances des parts avec le code suivant :

Code:

Public NDocCatia As Document

Set NDocCatia = CATIA.ActiveDocument
Set MainProduct = NDocCatia.Product ' Il s'agit du product principal
Set ListComposants = MainProduct.Products ' Cet élément stocke tous les éléments de l'arbre de construction

For k = 0 To ListComposants.Count

        'Une solution pour trier des parts et des products ici QuestionQuestion

        UserForm_ArbreDeConstruction.CurrentOrder.AddItem ListComposants.Item(k).Name
        UserForm_ArbreDeConstruction.NewOrder.AddItem ListComposants.Item(k).Name
        
Next k


Du coup pour moi 2 "solutions" pourrait résoudre mon problème (avec 2 architectures de code différentes) :

- Est-ce que tu connais un moyen de trier les parts et les products de ma ListComposants ? (car aujourd'hui pour trier je vais lire directement l'extension du fichier, et j'y accède uniquement avec la méthode de tri qui fonctionne avec le nom de part, je n'arrive pas a y accéder avec listcomposant)

- Est-ce que tu connais un moyen d'accéder à l'instance de mon produit dans ma fonction de tri des part et products ? (qui serait le plus simple mais j'y arrive pas, pour obtenir l'instance je suis obligé de passé par ListComposant).

C'est compliqué à expliquer, alors j'espère que tu as compris (le fait qu'il faille effectuer l'identification de l'instance pendant le tri des parts et des products, et non pas avant ou après).

Merci d'avance,

Julien


PS : SI BESOIN JE TE DONNE MON FICHIER

Liocco08
actif
actif

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

Revenir en haut Aller en bas

R?solu Re: Trier une listebox (MACRO tri Arbre de Construction CATIA)

Message par lumpazepfel Mer 20 Avr 2022 - 8:10

Bonjour Julien,

Pour vérifier si un document est une part ou un product, tu peux vérifier s'il contient lui même des documents:

if ListComposants.Item(k).Products.count = 0 then
'c'est une part
else
'c'est un product
endif

Si tu veux, tu peux m'envoyer ton code complet je pourrais le tester, mon adresse mail est dans les messages privés
lumpazepfel
lumpazepfel
Fédérateur
Fédérateur

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

Revenir en haut Aller en bas

R?solu Re: Trier une listebox (MACRO tri Arbre de Construction CATIA)

Message par Liocco08 Mer 20 Avr 2022 - 10:04

Update,

J'ai enfin réussis Exclamation J'ai encore une incertitude quand on est en présence de "COMPOSANTS" dans l'arbre de construction donc je vais étudier ce détail, mais la MACRO semble fonctionner !

Je te remercie pour ton aide !

Si tu veux y jeter un coup d’œil je te l'envoie en MP du coup ?

Merci beaucoup, bonne journée Wink !

Liocco08
actif
actif

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

Revenir en haut Aller en bas

R?solu Re: Trier une listebox (MACRO tri Arbre de Construction CATIA)

Message par lumpazepfel Mer 20 Avr 2022 - 10:13

Salut,

Pour vérifier si c'est un composant, il faut comparer le nom du parent avec le nom du produit de tête, si c'est le même c'est un composant.
Comme tu utilises les instances, il sera peut être nécessaire de les renommer avant de lancer ta macro de trie.
Il y a une macro disponible ici http://www.eng-tips.com/viewthread.cfm?qid=365400.

Je veux bien que tu me transmettes la macro complète, c'est toujours interessant.
Merci
lumpazepfel
lumpazepfel
Fédérateur
Fédérateur

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

Revenir en haut Aller en bas

R?solu Re: Trier une listebox (MACRO tri Arbre de Construction CATIA)

Message par Liocco08 Mer 20 Avr 2022 - 16:54

3


Dernière édition par Liocco08 le Mer 20 Avr 2022 - 16:55, édité 2 fois

Liocco08
actif
actif

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

Revenir en haut Aller en bas

R?solu Macro disponible

Message par Liocco08 Mer 20 Avr 2022 - 16:54

Je te remercie, cette macro est vraiment super utile. J'ai pu intégrer les composants dans ma macro pour trier mon arbre de construction comme je le souhaitais.

Aujourd'hui la macro fonctionne parfaitement comme je le souhaitais !

À tout ceux qui souhaite l'avoir, vous pouvez m'envoyer un message privé avec votre mail pour que je puisse vous partager le fichier (je n'y arrive pas sur le forum).

Merci à toi Lumpazepfel !

Julien

Liocco08
actif
actif

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

Revenir en haut Aller en bas

R?solu Re: Trier une listebox (MACRO tri Arbre de Construction CATIA)

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