Petites questions
2 participants
Page 1 sur 1
Petites questions
Bonjour,
Je suis toujours bloqué avec mes problèmes de macro, n'ayant pas eu de réponses, cependant j'essaie de me débrouiller tout seul.
Cependant j'ai une question cruciale qui se pose à moi, mais d'abord petite remise en contexte: j'ai une macro pour exporter sur Excel les coordonnées d'un RUN de tuyauterie (module Piping spécial), ainsi que le diamètre de la tuyauterie et son rayon de courbure.
J'ai également une macro (qui ne marche pas trop) pour exporter sur Excel le matériau, le nom, la masse et la densité mais qui est censée sur un Part, celle-ci ayant la fonction permettant de sélectionner les éléments qui nous intéressent.
Ma question est: est-il possible de faire une combinaison des 2 macros, tout en sachant que le Run n'a que des données géométriques et non pas physique comme la masse? Est-ce que le fait que ce soit un Run, cela va gêner lors de la selection, sachant que je veux sélectionner le Run mais également les éléments de fixation qui sont des Part
Merci d'avance
Cordialement
Je suis toujours bloqué avec mes problèmes de macro, n'ayant pas eu de réponses, cependant j'essaie de me débrouiller tout seul.
Cependant j'ai une question cruciale qui se pose à moi, mais d'abord petite remise en contexte: j'ai une macro pour exporter sur Excel les coordonnées d'un RUN de tuyauterie (module Piping spécial), ainsi que le diamètre de la tuyauterie et son rayon de courbure.
J'ai également une macro (qui ne marche pas trop) pour exporter sur Excel le matériau, le nom, la masse et la densité mais qui est censée sur un Part, celle-ci ayant la fonction permettant de sélectionner les éléments qui nous intéressent.
Ma question est: est-il possible de faire une combinaison des 2 macros, tout en sachant que le Run n'a que des données géométriques et non pas physique comme la masse? Est-ce que le fait que ce soit un Run, cela va gêner lors de la selection, sachant que je veux sélectionner le Run mais également les éléments de fixation qui sont des Part
Merci d'avance
Cordialement
Nico_atomique- actif
- Messages : 38
Date d'inscription : 19/04/2016
Localisation : Marseille/Aix-en-Provence
Re: Petites questions
Bonjour,
Je ne connais pas le module Piping mais il est possible dans avec une macro d'exporter des valeurs des paramètres d'une Part et des valeurs géométriques (dans les Set géométrique) comme les coordonnées d'un point, le rayon d'un arc...
Peux tu poster tes codes et une image de ton "RUN" pour voir à quoi ça ressemble?
Je ne connais pas le module Piping mais il est possible dans avec une macro d'exporter des valeurs des paramètres d'une Part et des valeurs géométriques (dans les Set géométrique) comme les coordonnées d'un point, le rayon d'un arc...
Peux tu poster tes codes et une image de ton "RUN" pour voir à quoi ça ressemble?
lumpazepfel- Fédérateur
- Messages : 319
Date d'inscription : 02/11/2015
Localisation : Ensisheim
Re: Petites questions
Bien sur, je poste ça!
Code extraction matériaux trouvé sur internet:
(Ce code marche bizarrement: lorsque je sélectionne les éléments à extraire, ça ne marche pas, mais quand je sélectionne dans l'arbre, et appuie sur "échap" alors là j'ai toutes les données extraites...)
Merci d'avance
Code extraction matériaux trouvé sur internet:
- Code:
Sub CATMain()
'--Créer un tableau vide
Dim table()
'--Declarer Excel et l'ouvrir
Dim Excel As Object
Dim objWorkbook
Dim objSheet
Dim workbooks As workbooks
Dim workbook As workbook
Dim Sheets As Object
Dim Sheet As Object
Dim worksheet As Excel.worksheet
Dim myworkbook As Excel.workbook
Dim myworksheet As Excel.worksheet
'--Verification de l'ouverture d'Excel
On Error Resume Next
Set Excel = GetObject(, "Excel.Application")
If Excel Is Nothing Then
IsExcelRunning = False ' l'utilisateur n'a pas ouvert Excel
Err.Clear
Else
IsExcelRunning = True ' l'utilisateur a ouvert Excel
End If
'--Ouvrir Excel
On Error Resume Next
Set Excel = GetObject(, "Excel.Application")
If Excel Is Nothing Then
Set Excel = CreateObject("Excel.Application")
Err.Clear
Excel.Visible = True
End If
On Error GoTo 0
'--Ouvrir l'archive de la macro
Set objWorkbook = Excel.Workbooks.Open("C:\Users\nmichelet\Desktop\Macro de estimado de costos")
objWorkbook.Activate
Set objSheet = objWorkbook.WorkSheets.Item(1)
'--Selectionner le produit
Dim oSel As Selection
Set oSel = CATIA.ActiveDocument.Selection
ReDim strArray(0)
strArray(0)="Part"
Dim sStatus As String
sStatus = oSel.SelectElement3(strArray, "Select parts", False, CATMultiSelTriggWhenUserValidatesSelection, false)
'oSel.Search "'Assembly Design'.Part,all"
Dim prdProduct as Part
Dim iProduct
'--Redimensionner le tableau
ReDim table(oSel.Count,4)
'--Compter le numero de produit et les recompter
For iProduct=1 to oSel.Count
Set prdProduct=oSel.Item(iProduct).Value
'--Charger la part
Dim objInertia as Inertia
On Error Resume Next
Set objInertia=prdProduct.GetTechnologicalObject("Inertia")
Dim getMass As String
getMass = objInertia.Mass
Dim getDensity As String
getDensity = objInertia.Density
Dim partName As String
partName=prdProduct.Name
Dim mat As Object
Dim oManager As MaterialManager
Set oManager = prdProduct.GetItem("CATMatManagerVBExt")
oManager.GetMaterial
OnPart prdProduct,mat
matName=mat.Name
'MsgBox mat.Name
'--Remplir la ligne correspondante
table (iProduct,1)=partName
table (iProduct,2)=getMass
table(iProduct,3)=matName
table (iProduct,4)=getDensity
Next
'--Remplir Excel
objSheet.Cells(3,1)="Part Number"
objSheet.Cells(3,2)="Mass"
objSheet.Cells(3,3)="Material"
objSheet.Cells(3,4)="Density"
For r=1 to oSel.Count
objSheet.Cells(r+5,1)=table(r,1)
objSheet.Cells(r+5,2)=table(r,2)
objSheet.Cells(r+5,3)=table(r,3)
objSheet.Cells(r+5,4)=table(r,4)
MsgBox "Masse = " & getMass & "kg"
Next
End Sub
(Ce code marche bizarrement: lorsque je sélectionne les éléments à extraire, ça ne marche pas, mais quand je sélectionne dans l'arbre, et appuie sur "échap" alors là j'ai toutes les données extraites...)
Merci d'avance
Dernière édition par Nico_atomique le Mer 4 Mai 2016 - 15:48, édité 1 fois
Nico_atomique- actif
- Messages : 38
Date d'inscription : 19/04/2016
Localisation : Marseille/Aix-en-Provence
Re: Petites questions
Bonjour Nicolas,
Pour le premier code avec la commande "sStatus = oSel.SelectElement3(strArray, "Select parts", False, CATMultiSelTriggWhenUserValidatesSelection, False)", tu devrais avoir la barre d'outil "palette d'outil" qui s'affiche:
Tu sélectionnes alors tes Part soit dans l'arbre soit dans la géométrie en maintenant la touche CTRL enfoncée.
En cliquant sur le bouton 1 tu peux visualiser la liste des éléments sélectionnés.
En cliquant sur le bouton 2 tu valide ta sélection et la macro continue.
Pour interrompre la sélection avec la touche ECHAP, il faut rajouter dans le code :
sStatus = oSel.SelectElement3(strArray, "Select parts", False, CATMultiSelTriggWhenUserValidatesSelection, False)
If (sStatus = "Cancel") Then
Exit Sub ' ou autre action
End If
Je n'ai pas pu tester la macro en entier car il me manque la fonction
Je ne peux pas tester, pas de module Piping
Pour le premier code avec la commande "sStatus = oSel.SelectElement3(strArray, "Select parts", False, CATMultiSelTriggWhenUserValidatesSelection, False)", tu devrais avoir la barre d'outil "palette d'outil" qui s'affiche:
Tu sélectionnes alors tes Part soit dans l'arbre soit dans la géométrie en maintenant la touche CTRL enfoncée.
En cliquant sur le bouton 1 tu peux visualiser la liste des éléments sélectionnés.
En cliquant sur le bouton 2 tu valide ta sélection et la macro continue.
Pour interrompre la sélection avec la touche ECHAP, il faut rajouter dans le code :
sStatus = oSel.SelectElement3(strArray, "Select parts", False, CATMultiSelTriggWhenUserValidatesSelection, False)
If (sStatus = "Cancel") Then
Exit Sub ' ou autre action
End If
Je n'ai pas pu tester la macro en entier car il me manque la fonction
- Code:
OnPart prdProduct,mat
Je ne peux pas tester, pas de module Piping
lumpazepfel- Fédérateur
- Messages : 319
Date d'inscription : 02/11/2015
Localisation : Ensisheim
Re: Petites questions
Salut Marc,
Effectivement, j'ai cette palette selection qui s'affiche et qui me permet de sélectionner mes Part (soit dit en passant, plutôt que de sélectionner chaque pièce dans l'arbre, je te conseille d'utiliser la selection trappe qui est déjà active et qui te permettra de faire un rectangle, et tout ce qui est compris dans ce rectangle sera alors sélectionné). Le problème n'est cependant pas là.
Ce que je ne comprends pas c'est pourquoi cette macro fonctionne "à l'envers": quand je sélectionne mes part avec la palette et fais Valider, je n'obtiens rien, mais quand je sélectionne AVANT de lancer la macro et qu'une fois lancée, je fais "échap" pendant la sélection, alors j'obtiens toutes mes données dans le fichier Excel.
J'ai beau reprendre le code dans tous les sens, ça DEVRAIT marcher, mais ça ne marche pas comme il faut.
Un appel de fonction, j'y avais pas pensé mais ça pourrait marcher effectivement, merci pour l'idée.
Je ne vois pas ce qui cloche avec
Une autre question: dans une macro, est-il possible d'effectuer un changement de module?
Supposons que je veuille faire mon extraction de données de mon run dans le module piping puis après que je veuille changer de module pour aller dans Assembly design pour l'extraction des masses des Parts, tout cela dans une seule macro.
Effectivement, j'ai cette palette selection qui s'affiche et qui me permet de sélectionner mes Part (soit dit en passant, plutôt que de sélectionner chaque pièce dans l'arbre, je te conseille d'utiliser la selection trappe qui est déjà active et qui te permettra de faire un rectangle, et tout ce qui est compris dans ce rectangle sera alors sélectionné). Le problème n'est cependant pas là.
Ce que je ne comprends pas c'est pourquoi cette macro fonctionne "à l'envers": quand je sélectionne mes part avec la palette et fais Valider, je n'obtiens rien, mais quand je sélectionne AVANT de lancer la macro et qu'une fois lancée, je fais "échap" pendant la sélection, alors j'obtiens toutes mes données dans le fichier Excel.
J'ai beau reprendre le code dans tous les sens, ça DEVRAIT marcher, mais ça ne marche pas comme il faut.
Un appel de fonction, j'y avais pas pensé mais ça pourrait marcher effectivement, merci pour l'idée.
Je ne vois pas ce qui cloche avec
- Code:
OnPart prdProduct, mat
Une autre question: dans une macro, est-il possible d'effectuer un changement de module?
Supposons que je veuille faire mon extraction de données de mon run dans le module piping puis après que je veuille changer de module pour aller dans Assembly design pour l'extraction des masses des Parts, tout cela dans une seule macro.
Nico_atomique- actif
- Messages : 38
Date d'inscription : 19/04/2016
Localisation : Marseille/Aix-en-Provence
Re: Petites questions
Salut Nicolas,
Quand tu sélectionnes avant de lancer la macro et que tu appuies sur échap, la macro continue avec ce qui était sélectionné --> il n'y a peut être pas que des Part dans la sélection.
Quand tu utilises la "Palette" il n'y a que des Part.
Pour ma part je récupère bien la valeur "partName" mais pas les autres qui devraient être obtenues par GetTechnologicalObject("Inertia") (à priori il faut une licence DMU). Est ce ton cas?
Tu peux mettre le "On Error Resume Next" en commentaire pour vérifier si la macro bloque à cet endroit.
Pour "OnPart prdProduct, mat", ça fonctionne, j'avais un petit loupé.
Pour changer de module tu peux essayer :
Pour connaître le nom de ton module:
Quand tu sélectionnes avant de lancer la macro et que tu appuies sur échap, la macro continue avec ce qui était sélectionné --> il n'y a peut être pas que des Part dans la sélection.
Quand tu utilises la "Palette" il n'y a que des Part.
Pour ma part je récupère bien la valeur "partName" mais pas les autres qui devraient être obtenues par GetTechnologicalObject("Inertia") (à priori il faut une licence DMU). Est ce ton cas?
Tu peux mettre le "On Error Resume Next" en commentaire pour vérifier si la macro bloque à cet endroit.
Pour "OnPart prdProduct, mat", ça fonctionne, j'avais un petit loupé.
Pour changer de module tu peux essayer :
- Code:
CATIA.StartWorkbench ("Assembly")
Pour connaître le nom de ton module:
- Code:
Sub catmain()
WBName = CATIA.GetWorkbenchId
MsgBox WBName
End Sub
lumpazepfel- Fédérateur
- Messages : 319
Date d'inscription : 02/11/2015
Localisation : Ensisheim
Re: Petites questions
Salut Marc,
Concernant la sélection, moi ça marche à l'envers: je fais la sélection via l'outil palette, je n'obtiens que le partName mais quand je fais echap alors là j'obtiens toutes les données
Pour le "on error resume next" je sais que si je le mets en commentaire ou que je le déplace, il va y avoir une erreur "gettechnologicalobject ne gère pas cette fonction" donc il est nécessaire
Enfin pour les licences, je pense que le gettechnologicalobject ne fonctionne pas en fonction des licences, j'ai 4 licences (ssr, hvac, pip et de base)
Sur le forum COE, ils ont fait un sujet concernant tous les technological object mais là je suis sur téléphone alors je ne peux pas te mettre le lien
Et pour les modules: je savais bien qu'il y avait un lien avec la commande workbench! J'arrivais pas à trouver! Merci, j'essaierai lundi au bureau
Concernant la sélection, moi ça marche à l'envers: je fais la sélection via l'outil palette, je n'obtiens que le partName mais quand je fais echap alors là j'obtiens toutes les données
Pour le "on error resume next" je sais que si je le mets en commentaire ou que je le déplace, il va y avoir une erreur "gettechnologicalobject ne gère pas cette fonction" donc il est nécessaire
Enfin pour les licences, je pense que le gettechnologicalobject ne fonctionne pas en fonction des licences, j'ai 4 licences (ssr, hvac, pip et de base)
Sur le forum COE, ils ont fait un sujet concernant tous les technological object mais là je suis sur téléphone alors je ne peux pas te mettre le lien
Et pour les modules: je savais bien qu'il y avait un lien avec la commande workbench! J'arrivais pas à trouver! Merci, j'essaierai lundi au bureau
Nico_atomique- actif
- Messages : 38
Date d'inscription : 19/04/2016
Localisation : Marseille/Aix-en-Provence
Re: Petites questions
Salut,
Après fusion et modification de ma macro, j'ai testé le changement de module via "CATIA.StartWorkbench ("nom de module"). Ben malheureusement ça ne marche pas comme espéré, c'est-à-dire que ça m'ouvre un nouveau fichier vide dans le module en question au lieu de garder la pièce et de la changer de module.
Une idée sur comment changer ça?
Dans ma macro, j'ai une boucle très pratique qui me permet de sélectionner automatiquement tous les runs au moment de lancer la macro, cette boucle s'écrit comme ça:
Comment je peux "clearer" la sélection pour qu'il sélectionne automatiquement mes Part?
Après fusion et modification de ma macro, j'ai testé le changement de module via "CATIA.StartWorkbench ("nom de module"). Ben malheureusement ça ne marche pas comme espéré, c'est-à-dire que ça m'ouvre un nouveau fichier vide dans le module en question au lieu de garder la pièce et de la changer de module.
Une idée sur comment changer ça?
Dans ma macro, j'ai une boucle très pratique qui me permet de sélectionner automatiquement tous les runs au moment de lancer la macro, cette boucle s'écrit comme ça:
- Code:
If oSel.Count = 0 Then
oSel.Search "(CATLndSearch.ArrangementRun),all")
End If
Comment je peux "clearer" la sélection pour qu'il sélectionne automatiquement mes Part?
Nico_atomique- actif
- Messages : 38
Date d'inscription : 19/04/2016
Localisation : Marseille/Aix-en-Provence
Re: Petites questions
Salut,
Je pense que dans ton cas tu peux rester dans l'atelier Assembly. Essaye la fonction "Getworkbench" qui devrait te permettre de récupérer les données. Voici un exemple de code trouvé dans l'aide CATIA:
Sub CATMain()
Dim doc As Document
Set doc=CATIA.ActiveDocument
Dim wkb As ArrWorkbench
Set wkb=doc.GetWorkbench("ArrWorkbench")
Dim arr As ArrNomenclatureTree
Set arr=wkb.ArrNomenclatureTree
End Sub
Pour vider le contenu de ta sélection : osel.clear
Je pense que dans ton cas tu peux rester dans l'atelier Assembly. Essaye la fonction "Getworkbench" qui devrait te permettre de récupérer les données. Voici un exemple de code trouvé dans l'aide CATIA:
Sub CATMain()
Dim doc As Document
Set doc=CATIA.ActiveDocument
Dim wkb As ArrWorkbench
Set wkb=doc.GetWorkbench("ArrWorkbench")
Dim arr As ArrNomenclatureTree
Set arr=wkb.ArrNomenclatureTree
End Sub
Pour vider le contenu de ta sélection : osel.clear
lumpazepfel- Fédérateur
- Messages : 319
Date d'inscription : 02/11/2015
Localisation : Ensisheim
Re: Petites questions
J'ai essayé GetWorkbench, effectivement, c'est plus adapté à ce que je cherche merci
Par contre j'ai essayé Set oSel = Nothing, Set oSel = null, Set oSel = 0, oSel.Clear et rien de tout ça ne marche
Edit: en fait je le mettais pas au bon endroit, donc en fait ça marche, merci
Par contre j'ai essayé Set oSel = Nothing, Set oSel = null, Set oSel = 0, oSel.Clear et rien de tout ça ne marche
Edit: en fait je le mettais pas au bon endroit, donc en fait ça marche, merci
Nico_atomique- actif
- Messages : 38
Date d'inscription : 19/04/2016
Localisation : Marseille/Aix-en-Provence
Re: Petites questions
Par contre j'ai un dernier problème: je n'arrive pas à faire une extraction de matériau, quelle que soit la façon dont je m'y prends
Et ça ne me sort pas le matériau (tout le reste oui), pourtant j'ai bien des matériaux affectés aux part
Info supplémentaire: quand je mets les On Error Resum Next en commentaire, ça me sort "la Méthode GetItem a échoué" ligne "Set oManager = objProductMat.GetItem("CATMatManagerVBExt")"
- Code:
Dim objProduct As Product
Dim objProductMat 'As Product
'Dim strInstName As String
Dim intNbParts As Integer
Dim k As Integer
intNbParts = objGCATIASelection1.Count
For k = 1 To intNbParts
Set objProduct = Nothing
Set objProductMat = Nothing
Set objProduct = objGCATIASelection1.Item(k).Value
Set objProductMat = objGCATIASelection1.Item(k)
Err.Clear
On Error Resume Next
Dim objInertia As Inertia
On Error Resume Next
Set objInertia = objProduct.GetTechnologicalObject("Inertia")
Dim getMass As String
getMass = objInertia.Mass
Dim partName As String
partName = objProduct.Name
Dim Mat As Material
Dim oManager As MaterialManager
Set oManager = objProductMat.GetItem("CATMatManagerVBExt")
oManager.GetMaterialOnPart objProductMat,Mat
matName = Mat.Name
'MsgBox matName
Dim Coordinates(2)
objInertia.GetCOGPosition Coordinates
Et ça ne me sort pas le matériau (tout le reste oui), pourtant j'ai bien des matériaux affectés aux part
Info supplémentaire: quand je mets les On Error Resum Next en commentaire, ça me sort "la Méthode GetItem a échoué" ligne "Set oManager = objProductMat.GetItem("CATMatManagerVBExt")"
Nico_atomique- actif
- Messages : 38
Date d'inscription : 19/04/2016
Localisation : Marseille/Aix-en-Provence
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum