Petites questions

Voir le sujet précédent Voir le sujet suivant Aller en bas

Petites questions

Message par Nico_atomique le Sam 30 Avr 2016 - 2:01

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

Nico_atomique
actif
actif

Messages : 38
Date d'inscription : 20/04/2016
Localisation : Marseille/Aix-en-Provence

Revenir en haut Aller en bas

Re: Petites questions

Message par lumpazepfel le Mar 3 Mai 2016 - 8:00

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?

avatar
lumpazepfel
actif
actif

Messages : 143
Date d'inscription : 03/11/2015
Localisation : Ensisheim

Revenir en haut Aller en bas

Re: Petites questions

Message par Nico_atomique le Mar 3 Mai 2016 - 20:55

Bien sur, je poste ça!

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 Jeu 5 Mai 2016 - 1:48, édité 1 fois

Nico_atomique
actif
actif

Messages : 38
Date d'inscription : 20/04/2016
Localisation : Marseille/Aix-en-Provence

Revenir en haut Aller en bas

Re: Petites questions

Message par lumpazepfel le Mer 4 Mai 2016 - 23:15

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
Code:
OnPart prdProduct,mat
Pour la fusion des 2 macros, je pense que c'est possible en appelant ta macro d'extraction de masse depuis la CATMain de l'extraction de run.
Je ne peux pas tester, pas de module Piping Sad
avatar
lumpazepfel
actif
actif

Messages : 143
Date d'inscription : 03/11/2015
Localisation : Ensisheim

Revenir en haut Aller en bas

Re: Petites questions

Message par Nico_atomique le Jeu 5 Mai 2016 - 1:31

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
Code:
OnPart prdProduct, mat
Peux-tu m'aiguiller?

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
actif

Messages : 38
Date d'inscription : 20/04/2016
Localisation : Marseille/Aix-en-Provence

Revenir en haut Aller en bas

Re: Petites questions

Message par lumpazepfel le Jeu 5 Mai 2016 - 8:09

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 :
Code:
CATIA.StartWorkbench ("Assembly")
     
Pour connaître le nom de ton module:
Code:
Sub catmain()
WBName = CATIA.GetWorkbenchId

MsgBox WBName

End Sub
avatar
lumpazepfel
actif
actif

Messages : 143
Date d'inscription : 03/11/2015
Localisation : Ensisheim

Revenir en haut Aller en bas

Re: Petites questions

Message par Nico_atomique le Ven 6 Mai 2016 - 20:00

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 Smile

Nico_atomique
actif
actif

Messages : 38
Date d'inscription : 20/04/2016
Localisation : Marseille/Aix-en-Provence

Revenir en haut Aller en bas

Re: Petites questions

Message par Nico_atomique le Mer 11 Mai 2016 - 23:51

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:
Code:
If oSel.Count = 0 Then
      oSel.Search "(CATLndSearch.ArrangementRun),all")
End If
C'est tellement pratique que je voudrais l'utiliser dans la 2e partie de mon code pour les Part ce coup-ci, seulement, vu que les runs sont déjà sélectionnés, ça ne marche plus.
Comment je peux "clearer" la sélection pour qu'il sélectionne automatiquement mes Part?

Nico_atomique
actif
actif

Messages : 38
Date d'inscription : 20/04/2016
Localisation : Marseille/Aix-en-Provence

Revenir en haut Aller en bas

Re: Petites questions

Message par lumpazepfel le Jeu 12 Mai 2016 - 22:24

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
avatar
lumpazepfel
actif
actif

Messages : 143
Date d'inscription : 03/11/2015
Localisation : Ensisheim

Revenir en haut Aller en bas

Re: Petites questions

Message par Nico_atomique le Jeu 12 Mai 2016 - 23:16

J'ai essayé GetWorkbench, effectivement, c'est plus adapté à ce que je cherche merci Smile

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 Smile

Nico_atomique
actif
actif

Messages : 38
Date d'inscription : 20/04/2016
Localisation : Marseille/Aix-en-Provence

Revenir en haut Aller en bas

Re: Petites questions

Message par Nico_atomique le Ven 13 Mai 2016 - 0:13

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

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
actif

Messages : 38
Date d'inscription : 20/04/2016
Localisation : Marseille/Aix-en-Provence

Revenir en haut Aller en bas

Re: Petites questions

Message par Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

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