Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1216 connectés 

 


 Mot :   Pseudo :  
  Aller à la page :
 
 Page :   1  2  3  4  5  ..  221  222  223  ..  233  234  235  236  237  238
Auteur Sujet :

[Support] Catia : trucs, astuces, conseils, aide

n°1167531
arno894
Posté le 11-06-2014 à 11:08:20  profilanswer
 

Reprise du message précédent :

arno894 a écrit :

Bonjour
Je cherche par macro à récupérer le nom des elements geometriques (plan, point etc) sur lesquelles s 'appuie une contrainte. Si quelqu'un a une idée...Merci pour ce forum bien utile au quotidien


Personne n'a eu d'idée car je sèche tjrs sur ce pb...

mood
Publicité
Posté le 11-06-2014 à 11:08:20  profilanswer
 

n°1167532
arno894
Posté le 11-06-2014 à 15:22:28  profilanswer
 

arno894 a écrit :


Personne n'a eu d'idée car je sèche tjrs sur ce pb...


Finalement j'ai trouvé ma réponse. Si ça peut aider qqn, il faut utiliser la méthode GetConstraintElement

n°1167535
alexv17
Posté le 11-06-2014 à 19:54:11  profilanswer
 

Guss_ a écrit :


 
met une copie d'écran ou met ta vidéo sur un site dédié, perso elle ne marche pas sur ma machine.


 
Ah mince là ca devrait etre mieux :) :http://youtu.be/Mx3DmltFYFs
 
je recite mon probleme:
 
Bonjour à tous,  
Je suis tout nouveau sur ce forum et je vient pour avoir quelques astuce sur catia.  
 
Alors voila mon problème, j'ai réalisé un moteur et je suis en train de mettre en place la simulation dans DMU kinematics sauf que je butte sur la liaison entre l'arbre à came et le culbuteur, j'ai mis une liaison courbe glissante mais le culbuteur traverse la cames, voyez la video ci dessous:  
 
(infos: le culbuteur et l'arbre a came sont en pivot sur le bati et l'arbre a came est commandé en engrenage a distance avec le vilo.)  
 
 

Message cité 1 fois
Message édité par alexv17 le 11-06-2014 à 19:54:57
n°1167546
Guss_
Posté le 12-06-2014 à 11:08:33  profilanswer
 

alexv17 a écrit :


 
Ah mince là ca devrait etre mieux :) :http://youtu.be/Mx3DmltFYFs
 
je recite mon probleme:
 
Bonjour à tous,  
Je suis tout nouveau sur ce forum et je vient pour avoir quelques astuce sur catia.  
 
Alors voila mon problème, j'ai réalisé un moteur et je suis en train de mettre en place la simulation dans DMU kinematics sauf que je butte sur la liaison entre l'arbre à came et le culbuteur, j'ai mis une liaison courbe glissante mais le culbuteur traverse la cames, voyez la video ci dessous:  
 
(infos: le culbuteur et l'arbre a came sont en pivot sur le bati et l'arbre a came est commandé en engrenage a distance avec le vilo.)  
 
 


 
 
De tête, j'ai du rencontré ce soucis, utiliser une liaison point sur courbe, la courbe du la créé en extrayant le profil de ta came et tu la met dans une esquisse de ta part représentant ta came.
Si tu utilises directement le profil que tu vois en 3D ça ne va suivre qu'un segment.
 
Ou alors il faut utiliser une loi qui va gérer la position de la came en fonction de la position angulaire de l'axe de rotation de la came.

n°1167547
alexv17
Posté le 12-06-2014 à 13:41:11  profilanswer
 

Guss_ a écrit :

 


De tête, j'ai du rencontré ce soucis, utiliser une liaison point sur courbe, la courbe du la créé en extrayant le profil de ta came et tu la met dans une esquisse de ta part représentant ta came.
Si tu utilises directement le profil que tu vois en 3D ça ne va suivre qu'un segment.

 

Ou alors il faut utiliser une loi qui va gérer la position de la came en fonction de la position angulaire de l'axe de rotation de la came.

 

Salut,
Merci de ta réponse, le point sur courbe j'avais essayé mais il n'y a pas de point sur le culbuteur qui est toujours en contact avec la came....

 



Message édité par alexv17 le 12-06-2014 à 13:41:24
n°1167548
Guss_
Posté le 12-06-2014 à 14:41:50  profilanswer
 

Oui le voit, après suivant ton besoin soit tu triche et tu dit qu'il y a un point en contact soit tu créées un loi qui régie les mouvements
 
Sinon, essayes aussi la courbe glissante mais en utilisant des esquisses des formes en contact (voir même ne les mettant n composant de sortie), mais pas directement la forme 3D

n°1167550
alexv17
Posté le 12-06-2014 à 15:40:48  profilanswer
 


Comment fait tu pour: extraire le profil de la came et la mettre dans une esquisse de la part représentant la came?
 


Message édité par alexv17 le 12-06-2014 à 15:41:32
n°1167551
Guss_
Posté le 12-06-2014 à 15:50:00  profilanswer
 

Tu créé une esquisse dans le plan perpendiculaire au profil de came, tu clic sur "projection des éléments 3D" (en dessous de relimitation, arrondi, symétrie ...) et tu sélectionne le profil de ta came, et automatiquement ça dessine le trait d'esquisse

n°1167553
alexv17
Posté le 12-06-2014 à 16:34:48  profilanswer
 

Guss_ a écrit :

Tu créé une esquisse dans le plan perpendiculaire au profil de came, tu clic sur "projection des éléments 3D" (en dessous de relimitation, arrondi, symétrie ...) et tu sélectionne le profil de ta came, et automatiquement ça dessine le trait d'esquisse


 
 
J'ai réussis a trouvé. Par contre j'ai un petit soucis, étant donné que la came est tangente et bien quand je projette sa me sort pas une courbe du contour :  
 
http://img4.hostingpics.net/pics/589946CATIAV5ArbrecamesCATPart.jpg
 
Tu aurait une solution?

Message cité 1 fois
Message édité par alexv17 le 12-06-2014 à 16:35:11
n°1167554
Guss_
Posté le 12-06-2014 à 16:52:30  profilanswer
 

alexv17 a écrit :

 


J'ai réussis a trouvé. Par contre j'ai un petit soucis, étant donné que la came est tangente et bien quand je projette sa me sort pas une courbe du contour :

 

http://img4.hostingpics.net/pics/5 [...] ATPart.jpg

 

Tu aurait une solution?

 

bah tu dessine le reste, et tu peux projeter aussi le cylindre ...
le but est de dessiner le chemin qui va être ne contact avec le poussoir;)

Message cité 1 fois
Message édité par Guss_ le 12-06-2014 à 16:53:11
mood
Publicité
Posté le 12-06-2014 à 16:52:30  profilanswer
 

n°1167555
alexv17
Posté le 12-06-2014 à 17:05:53  profilanswer
 

Guss_ a écrit :


 
bah tu dessine le reste, et tu peux projeter aussi le cylindre ...
le but est de dessiner le chemin qui va être ne contact avec le poussoir;)


 
Et oui c'est vrai...
Mais je pense que je vais toute la redessiné car j'ai essayé de projeté les deux mais sa me fait la courbe de la photo plus un cercle et je ne peut pas éditer pour enlever les traits en trop (au milieu)

n°1167557
Guss_
Posté le 12-06-2014 à 17:26:27  profilanswer
 

alexv17 a écrit :


 
Et oui c'est vrai...
Mais je pense que je vais toute la redessiné car j'ai essayé de projeté les deux mais sa me fait la courbe de la photo plus un cercle et je ne peut pas éditer pour enlever les traits en trop (au milieu)


 
Tout dépend ce que tu sélectionnes comme objet à projeter (la surface où les arrêtes de contour ) ;)
 
Si c'est la surface effectivement tu n'auras qu'un seul trait, (mais il me semble qu'avec les outils de relimitation et découpe on peu arriver à quelque chose)

n°1167558
alexv17
Posté le 12-06-2014 à 17:44:32  profilanswer
 

Guss_ a écrit :


 
Tout dépend ce que tu sélectionnes comme objet à projeter (la surface où les arrêtes de contour ) ;)
 
Si c'est la surface effectivement tu n'auras qu'un seul trait, (mais il me semble qu'avec les outils de relimitation et découpe on peu arriver à quelque chose)


 
 
Je vais tester, au pire je redessine  
merci encore :)

n°1167559
alexv17
Posté le 12-06-2014 à 18:10:42  profilanswer
 

Bon, j'ai réussi a refaire ma courbe en projetant et en relimitant :)  
mais la simulation ne fonctionne toujours pas (J'ai mis une courbe glissante entre l'arrete du culbuteur et la courbe de la came :pt1cable:
 
Enfaite je croit que j'ai un souci au niveau de la partie plate de la came. Je m'explique: il doit y avoir un moment ou l'arrete du culbuteur ne touche plus la came (seul le sommet touche la came) du coup je ne sait pas trop comment faire....
 
 
Edit:
Merci pour ton aide pour les courbes ;)
au final j'ai réussi en trichant un peu, au lieu de laisser plat sur la courbe j'ai mis un arc de cercle avec un graaaand rayon du coup sa marche et on a l'illusion que c'est droit haha


Message édité par alexv17 le 12-06-2014 à 20:13:03
n°1167615
clem200
Posté le 18-06-2014 à 11:13:29  profilanswer
 

Bonjour à tous,  
 
Depuis plusieurs semaines certains d'entre vous m'ont aidé à faire des macros de vérification de la provenance d'une pièce (je veux être sur que la pièce vient de notre BE).  
 
J'ai maintenant 4 macros qui fonctionnent très bien sur des Part :)  
 
Ce que je veux faire c'est appliquer ces macros de manière automatique sur chaque pièce d'un CatProduct.  
Pour faire ça il va falloir que je passe par une boucle "For each" je suppose mais je n'y arrive pas.  
 
En fait si j'y arrive mais je voudrais travailler sur ce qu'il y a dans l'arbre, et non sur le CatProduct qui les contient. Hors la macro en "For each" commence toujours par le Product en lui même.  
 
Pour le moment j'ai ça (je vérifie ce qu'il y a écrit dans la description de la pièce) :  
 

Code :
  1. Sub CATMain()
  2. Dim partDocument1 As Document
  3. Set partDocument1 = CATIA.ActiveDocument
  4. Dim product1 As Product
  5. Set product1 = partDocument1.Product
  6.     For Each ProductDocument In CATIA.Documents
  7.    
  8.         Dim piece As Document
  9.         Dim description As String
  10.         Set piece = CATIA.ActiveDocument
  11.         Dim test As String
  12.         NomAChercher= "test"
  13.        
  14.         description = piece .Parameters.Item(piece .Name & "\Description du produit" ).Value
  15.        
  16.         MsgBox description   'ligne que doit afficher le contenu de la desciption du produit
  17.        
  18.             If description = NomAChercher Then
  19.            
  20.                 MsgBox ("Pièce reconnue" )
  21.             Else
  22.                 MsgBox ("Pièce inconnue !" )
  23.          
  24.             End If
  25.    
  26.    
  27.    
  28.         Next
  29.    
  30.    
  31. End Sub


 
 
Je suis preneur de toutes idées pour mon sujet ;)
Merci d'avance.


Message édité par clem200 le 23-06-2014 à 09:15:48
n°1167684
clem200
Posté le 23-06-2014 à 08:49:21  profilanswer
 

Personne ne sait pour le "For each" ? :(


Message édité par clem200 le 23-06-2014 à 09:15:18
n°1167686
Guss_
Posté le 23-06-2014 à 09:40:41  profilanswer
 

documents regroupe tout ce qui est ouvert, du coup c'est sur que ça prends les product
Il faut qu'a un moment ta macros repère si le document qu'elle ouvre est un product ou une part
 

n°1167687
clem200
Posté le 23-06-2014 à 11:02:39  profilanswer
 

Merci de votre réponse !  
 
Sinon n'y a t-il pas moyen de choisir soit même les pièces dans l'arbre en cliquant dessus avec un .selection  ?


Message édité par clem200 le 23-06-2014 à 11:02:55
n°1167691
Guss_
Posté le 23-06-2014 à 11:45:20  profilanswer
 

Si en utilisant l'objet selection (il y a un exemple dans l'aide "automation.chm" de catia qui montre ça.)

 

tien voilà une fonction que j'ai codé qui me permet de sélectionner un produit

Code :
  1. Function select_(texte As String, type_ As String) As Object ' fonction séléctionant un porduit
  2.     Dim EnableSelectionFor(0), UserSelection
  3.    
  4.     EnableSelectionFor(0) = type_
  5.     Set selection = CATIA.ActiveDocument.selection
  6.     selection.Clear
  7.     MsgBox texte
  8.     UserSelection = selection.SelectElement2(EnableSelectionFor, texte, False)
  9.    
  10.    
  11.     If UserSelection <> "Normal" Then
  12.         message = MsgBox("Erreur avec la sélèction!", vbCritical, "Error" )
  13.         End
  14.     Else
  15.         Set sel = selection.Item(1)
  16.         Set select_ = sel.Value 'retourne la part séléctioner
  17.     End If
  18. End Function
 


Et je l'appel comme ça dans mon code principale

 
Code :
  1. Dim Product_origine As Part
  2.     Set Product_origine = select_("selectioner depart", "Part" )


Message édité par Guss_ le 23-06-2014 à 11:49:00
n°1167692
clem200
Posté le 23-06-2014 à 15:25:11  profilanswer
 

Merci !  
 
Quand je lance votre programme j'ai une erreur étrange (peut être une référence à activer) :  
 
http://img4.hostingpics.net/pics/572904blme.png


Message édité par clem200 le 23-06-2014 à 15:27:37
n°1167693
Guss_
Posté le 23-06-2014 à 15:32:32  profilanswer
 

Quelles sont les valeurs des variables avec lesquelles tu appelles la fonction select_ ?

n°1167694
clem200
Posté le 23-06-2014 à 15:49:25  profilanswer
 

Heu ... désolé mais je ne suis pas sur de comprendre la question ... que sont pour vous les variables que j'appelle ?

n°1167695
Guss_
Posté le 23-06-2014 à 16:08:17  profilanswer
 

En gros au lieu de réécrire tout un bloc de code qui va te servir plusieurs fois tu fais une fonction, et tu n'auras plus qu'a donner les nom de la fonction avec éventuellement des paramètres s'il y en a besoin,  et la fonction te renverra une valeur

 

Donc ce que je t'ai filé comme code ne peut pas être utiliser sans quelque chose qui l'appelle, à moins de remplacer les variables texte  et type_ par les valeurs que tu veux traiter

 

Ma fonction permet des renvoyer le nom de quelque chose qui sera sélectionné à la souris
le 1er paramètre est un texte, qui va apparaitre avant de sélectionner, pour indiquer à l'utilisateur qui devra sélectionner quelque chose
le deuxième paramètre est le type d'objet à sélectionner "part", "product" ...

 


j'ai donnée le code d'une fonction, ici j'ai nommé la fonction "select_ "

 

Pour fonctionne les fonction à besoin de deux variables
(texte As String, type_ As String)

 

donc dans ton code principale à un moment tu doit avoir la ligne

 

Dim Ma_selection As Part
Set Ma_selection = select_("Coucou faut que tu sélectionnes une Part", "Part" )

 


ça veut dire qu'a cette ligne select_ va revoyer vers le code de la fonction "select_" faire sont traitement en fonction des deux variable entre parenthèses

 

donc dans la fonction texte vaudra "selectioner depart" et type_ vaudra "Part"

  



Message édité par Guss_ le 23-06-2014 à 16:08:31
n°1167696
Guss_
Posté le 23-06-2014 à 16:46:41  profilanswer
 

Bonjour
 
Pour des soucis de mise a jour des versions, connaissez vous une manière de pouvoir récupérer le nom d'une macro en cours d'exécution, un peut comme pour les variable d'environnement.
 
 
ça me permet d'une part de faire suivre facilement le versionnage de mes macros lorsqu'elles génèrent leurs fichiers de configuration.
ça me permet également dans certain cas de pouvoir piloter Excel en lui envoyant du code à exécuter qui permet en retour d'appeler la macro en question
 
Actuellement je fais ça en partie manuellement via l'utilisateur qui renseigne le chemin, et d'autre par en dur pour le nom de la macro
 
Le fait de pouvoir récupérer cette variable automatiquement simplifierait grandement les choses pour la mise en place par les utilisateurs.

n°1167710
clem200
Posté le 24-06-2014 à 10:05:00  profilanswer
 

Merci de votre explication détaillée, je comprends mieux le code.  
 
Mais en quoi le problème affiché vient des variables ? J'ai mis la fonction dans un module, votre code qui l'appelle dans un autre. Et quand je lance le code j'ai directement l'erreur. Il fonctionne sur votre Catia ?  
 
Je suis dans un product de test avec 5-6 part en dessous vide, pour débuter.
 
Autre chose : j'essaye (toujours dans le même objectif) de trier mes pièces selon leur type. Je me sert donc d'un exemple de l'aide CATIA mais il me dit que toutes mes pièce sont des product ... PartDocument = ProductDocument ?  
 
http://img4.hostingpics.net/pics/455793blme2.png

Message cité 1 fois
Message édité par clem200 le 24-06-2014 à 12:09:40
n°1167718
ptittom
Posté le 24-06-2014 à 14:02:07  profilanswer
 

clem200 a écrit :

Merci de votre explication détaillée, je comprends mieux le code.  
 
Mais en quoi le problème affiché vient des variables ? J'ai mis la fonction dans un module, votre code qui l'appelle dans un autre. Et quand je lance le code j'ai directement l'erreur. Il fonctionne sur votre Catia ?  
 
Je suis dans un product de test avec 5-6 part en dessous vide, pour débuter.
 
Autre chose : j'essaye (toujours dans le même objectif) de trier mes pièces selon leur type. Je me sert donc d'un exemple de l'aide CATIA mais il me dit que toutes mes pièce sont des product ... PartDocument = ProductDocument ?  
 


Bonjour,
 
1. Problème avec l'objet Selection: il y a deux solutions.

  • le plus propre est de ne prendre que les références nécessaires. Typiquement: InfInterfaces, MecModInterfaces, PartInterfaces, ProductInterfaces
  • sinon ne pas donner le type lors de la déclaration de l'objet Selection: Dim oSel 'as Selection (avec As Selection en commentaire). CATIA s'en sort parfois un peu mieux ensuite.


2. Pas de Part dans un Product. C'est normal. Le Product ouvert ne contient que des products. Les part ne sont pas directement accessibles. Il faut tester si le product en court est une part ou pas. J'utilise le code suivant pour ca( dernière function notamment). En gros, c'est une fonction recursive qui navige de haut en bas dans le product principal:

Code :
  1. Sub CATMain() 'a product with sub-structure must be opened
  2.     Dim oDoc As Document
  3.     Dim oProd As Product
  4.     Dim cProd As New Collection
  5.    
  6.     Set oDoc = CATIA.ActiveDocument
  7.     Set oProd = oDoc.Product
  8.    
  9.     cProd.Add oProd.PartNumber
  10.     ProdStructure oProd, 2, cProd
  11.    
  12.     '### display the product structure ###
  13.     Dim I As Integer
  14.     For I = 1 To cProd.Count
  15.         Debug.Print cProd.Item(I)
  16.     Next
  17. End Sub
  18. Sub ProdStructure(oProd As Product, NbLvl As Integer, cCollection As Collection) 'recurvise sub to go through a product structure
  19.     Dim cSubProds As Products
  20.     Dim oChildProd As Product
  21.     Dim OutputStr As String
  22.     Dim J As Integer
  23.     Dim I As Integer
  24.     OutputStr = Space((NbLvl - 1) * 2)
  25.    
  26.     Set cSubProds = oProd.Products 'get the sub products
  27.     If cSubProds.Count >= 1 Then
  28.         For I = 1 To cSubProds.Count 'go through the sub-Product
  29.             If IsItAPart(cSubProds.Item(I)) = True Then 'if part
  30.                 cCollection.Add OutputStr & cSubProds.Item(I).PartNumber & " (Part)" 'add to the collection
  31.             Else 'if product
  32.                 cCollection.Add OutputStr & cSubProds.Item(I).PartNumber & " (Product)" 'add to the collection
  33.                 Set oChildProd = cSubProds.Item(I) 'for the product I
  34.                 ProdStructure oChildProd, NbLvl + 1, cCollection 'call the recurvise sub
  35.             End If
  36.         Next
  37.     End If
  38. End Sub
  39. Function IsItAPart(oProd As Product) As Boolean 'check if a product in a structure is a part (-> true) or not (-> False)
  40.     Dim oPartDoc As Document
  41.     Dim oPart As Part
  42.    
  43.     Set oPartDoc = oProd.ReferenceProduct.Parent 'get the reference document
  44.     If TypeName(oPartDoc) = "PartDocument" Then 'check the document type
  45.         Set oPart = oPartDoc.Part
  46.         IsItAPart = True 'part
  47.     Else
  48.         IsItAPart = False 'product
  49.     End If
  50. End Function

n°1167719
ptittom
Posté le 24-06-2014 à 14:15:35  profilanswer
 

Guss_ a écrit :

Bonjour
 
Pour des soucis de mise a jour des versions, connaissez vous une manière de pouvoir récupérer le nom d'une macro en cours d'exécution, un peut comme pour les variable d'environnement.


 
Bonjour,
 
Il y moyen en utilisant la référence Microsoft APC 6.2 Object library.
Ci-dessous un exemple pour récupérer le chemin vers la macro où s'excute ce code.
On peut assez facilement modifier pour obtenir le nom de la macro. Ce sera un Right(...) à la ligne 12 au lieu du Left(...) avec les bons arguments.
 

Code :
  1. Function ReturnMacroPath() As String
  2.     'ATTENTION
  3.     'Require the reference Microsoft APC 6.2 Object library
  4.    
  5.     Dim oAPC As New MSAPC.Apc
  6.     Dim MacroPath As String
  7.    
  8.     MacroPath = oAPC.VBE.ActiveVBProject.FileName
  9.     For i = 1 To Len(MacroPath)
  10.             ChrI = Left(Right(MacroPath, i), 1)
  11.             If ChrI = "\" Then
  12.                 MacroPath = Left(MacroPath, Len(MacroPath) - i + 1)
  13.                 Exit For
  14.             End If
  15.     Next
  16.     ReturnMacroPath = MacroPath
  17. End Function

Message cité 1 fois
Message édité par ptittom le 24-06-2014 à 14:16:34
n°1167721
Guss_
Posté le 24-06-2014 à 16:12:46  profilanswer
 

ptittom a écrit :

 

Bonjour,

 

Il y moyen en utilisant la référence Microsoft APC 6.2 Object library.
Ci-dessous un exemple pour récupérer le chemin vers la macro où s'excute ce code.
On peut assez facilement modifier pour obtenir le nom de la macro. Ce sera un Right(...) à la ligne 12 au lieu du Left(...) avec les bons arguments.

 
Code :
  1. Function ReturnMacroPath() As String
  2.     'ATTENTION
  3.     'Require the reference Microsoft APC 6.2 Object library
  4.    
  5.     Dim oAPC As New MSAPC.Apc
  6.     Dim MacroPath As String
  7.    
  8.     MacroPath = oAPC.VBE.ActiveVBProject.FileName
  9.     For i = 1 To Len(MacroPath)
  10.             ChrI = Left(Right(MacroPath, i), 1)
  11.             If ChrI = "\" Then
  12.                 MacroPath = Left(MacroPath, Len(MacroPath) - i + 1)
  13.                 Exit For
  14.             End If
  15.     Next
  16.     ReturnMacroPath = MacroPath
  17. End Function


 

Merci bien pour ça, je vais testé de ce pas !

 


Edit :  Impeccable, c'est ce que je cherchais

 


Du coup en faisant des recherches sur l'objet APC j'ai pu simplifié le code

 
Code :
  1. Sub CATMain()
  2.     Dim APC As Object
  3.     Set APC = CreateObject("MSAPC.Apc" )
  4.     MsgBox APC.VBE.ActiveVBProject.FileName
  5. End Sub

Message cité 1 fois
Message édité par Guss_ le 24-06-2014 à 16:35:46
n°1167733
ptittom
Posté le 25-06-2014 à 08:08:26  profilanswer
 

Guss_ a écrit :


Merci bien pour ça, je vais testé de ce pas !
Edit :  Impeccable, c'est ce que je cherchais
 
Du coup en faisant des recherches sur l'objet APC j'ai pu simplifié le code  
 

Code :
  1. Sub CATMain()
  2.     Dim APC As Object
  3.     Set APC = CreateObject("MSAPC.Apc" )
  4.     MsgBox APC.VBE.ActiveVBProject.FileName
  5. End Sub



 
De rien.
On retombe sur la discussion Early vs Late binding.
C'est vrai que comme ca, tu n'as pas besoin de la référence. Il faudra que j'y pense pour le prochain update de la macro où j'utilise ce code.

n°1167738
clem200
Posté le 25-06-2014 à 08:58:28  profilanswer
 

Bonjour,  
 
Merci de votre réponse. Je vais être franc je ne comprends pas comment exploiter votre macro.
 

Code :
  1. 39.Function IsItAPart(oProd As Product) As Boolean 'check if a product in a structure is a part (-> true) or not (-> False)
  2. 40.    Dim oPartDoc As Document
  3. 41.    Dim oPart As Part
  4. 42. 
  5. 43.    Set oPartDoc = oProd.ReferenceProduct.Parent 'get the reference document
  6. 44.    If TypeName(oPartDoc) = "PartDocument" Then 'check the document type
  7. 45.        Set oPart = oPartDoc.Part
  8. 46.        IsItAPart = True 'part
  9. 47.    Else
  10. 48.        IsItAPart = False 'product
  11. 49.    End If
  12. 50.End Function


La fonction c'est bon pour moi, je comprends.  
 

Code :
  1. 1.Sub CATMain() 'a product with sub-structure must be opened
  2. 2.    Dim oDoc As Document
  3. 3.    Dim oProd As Product
  4. 4.    Dim cProd As New Collection
  5. 5. 
  6. 6.    Set oDoc = CATIA.ActiveDocument
  7. 7.    Set oProd = oDoc.Product
  8. 8. 
  9. 9.    cProd.Add oProd.PartNumber
  10. 10.    ProdStructure oProd, 2, cProd
  11. 11. 
  12. 12.    '### display the product structure ###
  13. 13.    Dim I As Integer
  14. 14.    For I = 1 To cProd.Count
  15. 15.        Debug.Print cProd.Item(I)
  16. 16.    Next
  17. 17.End Sub


 

Code :
  1. 18.Sub ProdStructure(oProd As Product, NbLvl As Integer, cCollection As Collection) 'recurvise sub to go through a product structure
  2. 19.    Dim cSubProds As Products
  3. 20.    Dim oChildProd As Product
  4. 21.    Dim OutputStr As String
  5. 22.    Dim J As Integer
  6. 23.    Dim I As Integer
  7. 24.    OutputStr = Space((NbLvl - 1) * 2)
  8. 25. 
  9. 26.    Set cSubProds = oProd.Products 'get the sub products
  10. 27.    If cSubProds.Count >= 1 Then
  11. 28.        For I = 1 To cSubProds.Count 'go through the sub-Product
  12. 29.            If IsItAPart(cSubProds.Item(I)) = True Then 'if part
  13. 30.                cCollection.Add OutputStr & cSubProds.Item(I).PartNumber & " (Part)" 'add to the collection
  14. 31.            Else 'if product
  15. 32.                cCollection.Add OutputStr & cSubProds.Item(I).PartNumber & " (Product)" 'add to the collection
  16. 33.                Set oChildProd = cSubProds.Item(I) 'for the product I
  17. 34.                ProdStructure oChildProd, NbLvl + 1, cCollection 'call the recurvise sub
  18. 35.            End If
  19. 36.        Next
  20. 37.    End If
  21. 38.End Sub


La par contre je suis perdu ... Comment puis je exploiter ces deux codes ? Lorsque je lance il ne se passe rien.  
 
Je vois que vous ajoutez des données à des collections. Je dois maintenant venir lire les données dedans avec un autre code ?

n°1167740
clem200
Posté le 25-06-2014 à 09:18:01  profilanswer
 

Du coup j'ai essayé de "jouer" avec ce qui était à ma porté, la function. J'ai fait une boucle en For Each qui vient l'appeller et qui regarde le résultat mais la function donne toujours False ...

n°1167744
Guss_
Posté le 25-06-2014 à 10:40:11  profilanswer
 

ptittom a écrit :

 

De rien.
On retombe sur la discussion Early vs Late binding.
C'est vrai que comme ca, tu n'as pas besoin de la référence. Il faudra que j'y pense pour le prochain update de la macro où j'utilise ce code.

 

Par contre sans ajouter la références, dans l'éditeur t'as pas la complétion automatiques du texte, qui est parfois bien pratique ;)

 

Du coup voilà une petite fonction permettant d'extraire soit le chemin avec nom ou le nom ou uniquement le chemin

 


Code :
  1. Sub catmain()
  2.     'code de test d'appel de la fonction
  3.    msgbox Info_Macro()
  4.    msgbox Info_Macro("chemin" )
  5.    msgbox Info_Macro("nom" )
  6. end Sub
  7. Function Info_Macro(Optional Genre As String) As String
  8.     Dim APC As Object
  9.     Dim ChrI, i, t
  10.     Set APC = CreateObject("MSAPC.Apc" )
  11.     Info_Macro = APC.VBE.ActiveVBProject.FileName
  12.    
  13.     If Genre = "nom" Then
  14.             For i = 1 To Len(Info_Macro)
  15.             ChrI = Left(Right(Info_Macro, i), 1)
  16.                 If ChrI = "\" Then
  17.                     Info_Macro = Right(Info_Macro, i - 1)
  18.                     Exit For
  19.                 End If
  20.             Next
  21.     Else
  22.         If Genre = "chemin" Then
  23.             For i = 1 To Len(Info_Macro)
  24.             ChrI = Left(Right(Info_Macro, i), 1)
  25.                 If ChrI = "\" Then
  26.                     Info_Macro = Left(Info_Macro, Len(Info_Macro) - i + 1)
  27.                     Exit For
  28.                 End If
  29.             Next
  30.         End If
  31.     End If
  32. End Function


Message édité par Guss_ le 25-06-2014 à 10:51:45
n°1167745
ptittom
Posté le 25-06-2014 à 11:03:30  profilanswer
 

Bonjour,
 
 Je tente d'expliquer un peu mon code. Le but est de lister les élements d'un produit en indiquant s'il s'agit de part ou de produits:
- la fonction IsItAPart indique si un sub-product dans un product contient est en fait une part ou part. Par défaut, un Produit CATIA ne contient que des product (c'est le noeud supplémentaire au dessus de l'obejt Part). En argument, j'ai un product. Toute l'astuce réside dans la ligne 43, où je cherche le parent du document de référence (donc le fichier sur le disque dur). Il suffit de vérifier ensuite si c'est un document de type part ou non en utilisant la fonction typename(). Pour accéder à la part, on pourrait utiliser:

Code :
  1. Dim oPart as Part
  2. Set oPart = oPartDocument.Part


 
- dans la sub CATMain(), je fais assez peu de chose: je récupère (sans vérification, j'ai écrit cette macro pour quelques tests) le ActiveDocument et le product principal (lignes 6 et 7). Je crée auparavant une collection (ligne 4) où je stockerai ma liste des composants du produit au fur et à mesure. Je met le nom du produit principal en premier dans la collection (ligne 9) puis je démarre ma Sub. A la fin du CATMain, j'ai une boucle For pour afficher dans la fenêtre Immediate le contenu de ma collection (donc ma liste de composants)(lignes 12 à 16).
 
- la partie un peu plus compliquée: Sub ProdStructure. Comme le commentaire l'indique, c'est une fonction récursive. La fonction liste les sous-produits contenus dans le premier argument oProd de type Product. Pour chaque sous-produit, il y a une vérification (fonction IsItAPart):
   * si c'est une part, je l'ajoute à ma collection avec le tag (Part) à la fin.
   * si c'est un produit, je l'ajoute à ma collection avec le tag (Product) à la fin ET je démarre la Sub ProdStructure avec ce sous-Produit. C'est là que ca devient récursif.
Cette fonction permet donc de naviguer dans un product du produit principale jusqu'au derniers niveaux. Elle stocke les noms (PartNumber) de chaque composant dans ma collection et vérifie s'il s'agit de part ou de product. L'argument Lvl est juste là pour savoir à quel niveau hiérarchique de ma structure la sub se trouve actuellement. la liste est plus facile à lire ensuite (j'ajoute 2 espaces devant le nom pour le niveau 2, 4 espaces pour le niveau 3, etc.).
 
Pour tester la macro, ouvre (en design mode, pas en visualisation mode) un produit avec quelques sous-produits et parts. Ensuite démarre la macro pas-à-pas (touche F8) pour voir ce qui se passe.

n°1167751
clem200
Posté le 25-06-2014 à 16:22:09  profilanswer
 

Merci de l'explication, le programme devient moins obscure  ;) Bha on peut dire qu'il est ... capillotracté ! J'aurai jamais pu trouver ça tout seul ... Tout ça pour différencier Part de Product ...  
 
Donc en gros =>  
 
Le programme vient vérifier le type de chaque sous produit du produit principal ouvert grâce aux documents de référence. Il analyse aussi chaque sous produit des produits dans l'arbre (*). Le type, Part ou Product, est inscrit sous le nom "PartNumber" dans la collection appellé "cProd".  
Donc dans cette collection (qui est un tableau d'après ce que j'ai compris des collections) je vais avoir une colonne "part" et une colonne "product" avec le nom de mes pièces.  
J'ai bon ? :)  
 
 
Maintenant il "suffit" (faut encore que je comprenne ça ;) )que je vienne lire cette collection. J'applique les bonnes macros de vérification aux part et les bonnes au product et c'est fini ...  
 
Pfiou le VBA est pas mon truc je crois ^^  
 
 
* But de la fonction récursive, mais je crois que je ne m'en servirai pas.  J'ai besoin d'analyser les produits comme les part, pas besoin d'analyser chaque pièce dedans  
 
 

n°1167752
ptittom
Posté le 25-06-2014 à 16:46:45  profilanswer
 

Presque: la collection cProd ne contient "que" des string avec le nom des composants suivis de (Part) ou (Product).
J'ai d'autres macros où je case directement les objects Part ou Product dans la collection. Ca marche bien aussi. Là, je voulais juste les noms.

 

Si tu souhaites vérifier tous les documents ouverts, tu peux aussi faire une simple boucle sur la collection Documents. Dans ce genre là (pas testé sous CATIA):

Code :
  1. Dim oDoc As document
  2. For Each oDoc in CATIA.Documents
  3.    If typename(oDoc) = "PartDocument" then
  4.       'vérification pour une part
  5.    Elseif Typename(oDoc) ="ProductDocument" then
  6.       'vérification pour un produit
  7.    End If
  8. Next
 



Message édité par ptittom le 25-06-2014 à 16:47:20
n°1167753
clem200
Posté le 25-06-2014 à 17:10:51  profilanswer
 

Ha ce n'est "que" des string.  
 
Mais alors ce n'est pas ce qu'il me faut je pense.
 
En fait voila ma problématique :  
Je veux vérifier sur chaque part dans un Product la présence des 4 points suivant (cadre orange) :  
 
http://img11.hostingpics.net/pics/644993pitipom.png
 
Je vérifie la même chose sur un product, la présence de l'equisse "Esquisse.37" en moins.  
 
Au début j'avais naïvement pensé qu'une simple boucle :  
 

Code :
  1. For Each document in CATIA.Documents
  2.        
  3.         Call macro_de_verification_1
  4.         Call macro_de_verification_2
  5.         Call macro_de_verification_3
  6.         Call macro_de_verification_4
  7.         Next


 
suffirait à mouliner mon arbre. Mais non car les macros que j'ai fait (enfin surtout vous aux pages précédentes ...) marchent pour des Part, pas pour des Product. C'est à partir de la que j'ai pensé qu'il faudrai faire la différence entre les part et product de l'arborescence et ne pas appliquer le même programme pour les deux.  
 
Voila ou j'en suis ... du coup si je n'ai accès qu'à des string indiquant par exemple "vis.part" ça ne permet pas de lancer la bonne macro sur la bonne pièce je pense.

n°1167757
ptittom
Posté le 26-06-2014 à 08:12:59  profilanswer
 

Bonjour,
 
Si tu souhaite vérifier tous les documents ouverts, tu peux effectivement partir sur une boucle for each. Ensuite, je ferais une vérification du type de document et lancerais les macros nécessaires, eventuellement avec les bons arguments.

Code :
  1. Dim oDoc As Document
  2. For each oDoc in CATIA.Documents
  3.    if TypeName(oDoc) = "PartDocument" then
  4.       Call macro_de_verification_1 oDoc, "Part"
  5.       Call macro_de_verification_2 oDoc, "Part"
  6.       Call macro_de_verification_3 oDoc, "Part"
  7.       Call macro_de_verification_4 oDoc 'de toute facon seulement pour les parts
  8.    ElseIf TypeName(oDoc) ="ProductDocument" then
  9.       Call macro_de_verification_1 oDoc, "Product"
  10.       Call macro_de_verification_2 oDoc, "Product"
  11.       Call macro_de_verification_3 oDoc, "Product"
  12.    Else
  13.       MsgBox oDoc.Name  & ": Ni part ni product."
  14.    End iF
  15. Next


 
J'ignore pourquoi tes macros de vérifications ne sont pas dans le même projet VBA, ce serait peur être plus simple à gérer. Tu pourrais caser tes vérifications dans des routine Sub ou dans des modules appartenant au projet principal.


Message édité par ptittom le 26-06-2014 à 08:14:15
n°1167767
HPIR40
Posté le 26-06-2014 à 16:21:27  profilanswer
 

Bonjour
 
J'ai un soucis avec les licences reseau:
 
Pas de soucis coté gestionnaire de licence notre unique licence ME2 est libre.
 
Par contre c'est coté client que cela se complique, car il ping sans soucis le serveur de licence, mais au niveau du setting management, la fenêtre est totalement vide. j'ai beau cliquer sur options, je n'ai aucune réaction.
Donc bien entendu quand j'ouvre catia, il me dit qu'il ne trouve pas de licence car il cherche la licence en local et non sur le reseau.
 
Comment je peux forcer Catia a aller chercher la licence sur le reseau??
 
Par avance merci pour votre aide

Message cité 1 fois
Message édité par HPIR40 le 26-06-2014 à 16:21:51
n°1167769
ptittom
Posté le 26-06-2014 à 16:49:35  profilanswer
 

HPIR40 a écrit :

Bonjour
 
J'ai un soucis avec les licences reseau:
...
Par avance merci pour votre aide


 
LUM ou DSLS ?

n°1167770
HPIR40
Posté le 26-06-2014 à 16:57:38  profilanswer
 

Bonjour

 

c'est du LUM et pour la version de catia c'est V5-R19

 

Edit: ca fonctionne, j'ai rebooté la machine et le miracle a eu lieu .... allelouiaaa ^^

 

Désolé pour le dérangement

Message cité 1 fois
Message édité par HPIR40 le 26-06-2014 à 17:16:32
n°1167777
clem200
Posté le 27-06-2014 à 09:03:25  profilanswer
 

Citation :

J'ignore pourquoi tes macros de vérifications ne sont pas dans le même projet VBA, ce serait peur être plus simple à gérer. Tu pourrais caser tes vérifications dans des routine Sub ou dans des modules appartenant au projet principal.


J'ai bien tout dans le même projet Catia. C'est juste que je commence seulement à apprendre le passage d'argument d'une sub à une autre ;)
 
En tout cas merci :) j'avais pourtant essayé ça mais avec moi ça marchait pas.
 
PS : j'ai d'ailleurs mes 1er problèmes de passage d'arguments .... je veux déclarer la part active pour que la macro que j'appelle puisse lire sa description mais il bloque à l'encadré noir avec un "Object doesn't support this property". J'ai essayé de mettre oDoc bien sur mais ça ne fonctionne pas pour la macro que j'apelle.
 
http://img4.hostingpics.net/pics/573186Sanstitre2.png

Message cité 1 fois
Message édité par clem200 le 27-06-2014 à 15:32:13
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  ..  221  222  223  ..  233  234  235  236  237  238

Aller à :
Ajouter une réponse
 

Sujets relatifs
Transfert de donnees 3D texturees entre Catia et 3DSMAX6[Blender] Besoin d'aide !
De l'aide sur une Recherche..:: Topic des Publivores ::..
[Toshop] Besoin d'aide pour faire un dégradéCatia - Commande pour masquer tous les plans?!!!
Conseils / remarques sur ma maquette (site geo expert)topic unique de l' acréatique-chronique
[REGLE][FLASH]Demande de conseils 
Plus de sujets relatifs à : [Support] Catia : trucs, astuces, conseils, aide


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR