Communauté
Inventor - Français
Bienvenue sur les forums Inventor d’Autodesk. Partagez vos connaissances, posez des questions, collaborez sur des idées, et explorez les sujets Inventor populaires.
annuler
Affichage des résultats de 
Afficher  uniquement  | Rechercher plutôt 
Vouliez-vous dire : 

Modifier en masse les systèmes des coordonnées pour plusieurs fichiers

22 RÉPONSES 22
RÉSOLU
Répondre
Message 1 sur 23
cyber.anthony
749 Visites, 22 Réponses

Modifier en masse les systèmes des coordonnées pour plusieurs fichiers

Bonjour,

Actuellement en cours de test sur Inventor j'aimerai savoir s'il est possible de modifier l'orientation (système de coordonnées) sur plusieurs fichiers svp?

Traitement en masse sur 500 fichiers par exemple.

D'avance merci pour vos retours


Bien Cordialement

22 RÉPONSES 22
Message 2 sur 23
gmassart
en réponse à: cyber.anthony

Bonjour

Oui c'est possible en VBA et surement en ilogic

Il faut dans un premier temps boucler sur un répertoire qui contient les fichiers

Ensuite pour chaque fichier, l'ouvrir, créer un nouveau SCU qui sera orienté (il faudra déterminer l'orientation et sa position) et ensuite fermer en sauvegardant

 

Sur le papier c'est pas très compliqué à mon avis.

Pour la création du SCU > UCS en anglais > fonction UserCoordinateSystems.add

Dans l'aide d'inventor il y a des exemples dont un avec matrice de transformation qui permet de gérer l'orientation et la position)

 

Guillaume MASSART
AFFIVAL SAS
Inventor Pro 2022

Message 3 sur 23
cyber.anthony
en réponse à: gmassart

Bonsoir,

Un grand merci pour votre retour.

Par contre auriez-vous un exemple svp? J'ai trouvé l'éditeur VBA et je crois avoir compris comment sauvegarder une macro pour tous les projets.

Cependant je suis encore loin du résultat et je ne maîtrise pas la modification du système de coordonnées.

Comment faire pour l'inverser par exemple svp? (Pour retourner un élément)

Merci pour vos lumières

Bien Cordialement

Message 4 sur 23
gmassart
en réponse à: cyber.anthony

La solution que je propose c'est de créer un SCU qui diffère des plans d'origine

Je ne pense pas qu'il soit possible de modifier l'orientation de la pièce si elle a été construite avec comme référence les plans d'origine.

L'idée donc est de créer un SCU différent de l'origine, orienté comme il faut et ensuite utiliser ce SCU pour positionner les pièces dans les assemblages au besoin.

Le code donné par l'API d'INVENTOR 2014 est celui ci

Sub CreateUCSByTransformationMatrix()
    ' Create a new part document
    Dim oDoc As PartDocument
    Set oDoc = ThisApplication.Documents.Add(DocumentTypeEnum.kPartDocumentObject)

    ' Set a reference to the PartComponentDefinition object
    Dim oCompDef As PartComponentDefinition
    Set oCompDef = oDoc.ComponentDefinition

    Dim oTG As TransientGeometry
    Set oTG = ThisApplication.TransientGeometry

    ' Create an identity matrix
    Dim oMatrix As Matrix
    Set oMatrix = oTG.CreateMatrix

    ' Rotate about Z-Axis by 45 degrees
    Call oMatrix.SetToRotation(3.14159 / 4, oTG.CreateVector(0, 0, 1), oTG.CreatePoint(0, 0, 0))

    ' Translate the origin to (2, 2, 2)
    Dim oTranslationMatrix As Matrix
    Set oTranslationMatrix = oTG.CreateMatrix
    Call oTranslationMatrix.SetTranslation(oTG.CreateVector(2, 2, 2))

    Call oMatrix.TransformBy(oTranslationMatrix)

    ' Create an empty definition object
    Dim oUCSDef As UserCoordinateSystemDefinition
    Set oUCSDef = oCompDef.UserCoordinateSystems.CreateDefinition

    ' Set it to be based on the defined matrix
    oUCSDef.Transformation = oMatrix

    ' Create the UCS
    Dim oUCS As UserCoordinateSystem
    Set oUCS = oCompDef.UserCoordinateSystems.Add(oUCSDef)
End Sub

Et une fonction (ya surement plus simple) qui permet de récupérer une liste de fichiers dans une répertoire :

Public Function GetAllFiles(path As String, searchString As String, fileList() As String)
    ' Get the list of files in the current directory.
    Dim fileCount As Integer
    On Error Resume Next
    fileCount = UBound(fileList) + 1
    If err Then
        fileCount = 0
    End If
    On Error GoTo 0
    
    Dim maxCount As Integer
    maxCount = fileCount
    Dim filename As String
    filename = Dir(path & searchString, vbNormal)
    Do While filename <> ""
        If fileCount = maxCount Then
            maxCount = fileCount + 50
            ReDim Preserve fileList(maxCount - 1)
        End If
        
        fileCount = fileCount + 1
        fileList(fileCount - 1) = path & filename
        
        filename = Dir
    Loop
    ReDim Preserve fileList(fileCount - 1)
    
    ' Build a list of the directories.
    Dim directoryList() As String
    Dim maxDirectories As Integer
    maxCount = 0
    Dim directoryCount As Integer
    directoryCount = 0
    
    Dim dirName As String
    dirName = Dir(path, vbDirectory)
    Do While dirName <> ""
        If dirName <> "." And dirName <> ".." And dirName <> "OldVersions" Then
            If (GetAttr(path & dirName) And vbDirectory) Then
                If directoryCount = maxCount Then
                    maxCount = directoryCount + 50
                    ReDim Preserve directoryList(maxCount - 1)
                End If
                
                directoryCount = directoryCount + 1
                directoryList(directoryCount - 1) = path & dirName & "\"
            End If
        End If
        
        dirName = Dir
    Loop
    
    ' Process the subdirectories.
    If directoryCount > 0 Then
        ReDim Preserve directoryList(directoryCount - 1)
        
        Dim i As Integer
        For i = 0 To UBound(directoryList)
            Call GetAllFiles(directoryList(i), searchString, fileList)
        Next
    End If
End Function

Il faut ensuite boucler et faire le traitement pour chaque fichier, je peux y regarder mais pas là tout de suite

Guillaume MASSART
AFFIVAL SAS
Inventor Pro 2022

Message 5 sur 23
gmassart
en réponse à: gmassart

Bon ya effectivement plus simple pour parcourir des fichiers d'un répertoire :

Sub testfichiers()
    Dim FSO As Object
    Dim fichiers As Object
    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set fichiers = FSO.GetFolder("c:\").Files
    MsgBox fichiers.Count
    Set FSO = Nothing
End Sub

la j'affiche le nombre de fichier du répertoire c: (à la racine, pas en récursif)

suffit ensuite de déclarer la variable "fichier" comme object et faire une boucle pour chaque fichier dans fichiers (for each fichier in fichiers) 

https://docs.microsoft.com/fr-fr/office/vba/language/reference/user-interface-help/file-object

Ensuite on peut récupérer tout.

Il faudra après ouvrir chaque fichier, faire la création du SCU, fermer et enregistrer.

Guillaume MASSART
AFFIVAL SAS
Inventor Pro 2022

Message 6 sur 23
cyber.anthony
en réponse à: gmassart

Bonjour,
Merci beaucoup pour votre retour je vais tester.
Si la modification SCU ne fonctionne pas, pensez-vous qu'il serait possible d'automatiser la manipulation ci-dessous svp? (juste pour être sûr de la manipulation)
http://help.autodesk.com/view/INVNTOR/2016/FRA/
Je m'excuse encore mais je suis débutant et je ne demande à apprendre et comprendre.

Bien Cordialement

Message 7 sur 23
gmassart
en réponse à: cyber.anthony

Pas de soucis, on a tous été débutant un jour, nous aussi 🙂

Le lien me renvoie vers l'aide de Inventor 2016 mais pas un article spécifique de l'aide.

Vous cherchiez à afficher quoi ? La création d'un SCU ?

Guillaume MASSART
AFFIVAL SAS
Inventor Pro 2022

Message 8 sur 23
cyber.anthony
en réponse à: gmassart

Merci pour votre compréhension.
Pardon le lien est le suivant:
http://help.autodesk.com/cloudhelp/2016/FRA/Inventor-Help/files/GUID-A3346785-37D7-4E52-B604-02C4F3A...

C'est le "Réalignement du système de coordonnées de l'esquisse"
J'ai l'impression que c'est la manipulation à effectuer pour changer l'angle de vue par défaut mais je n'en suis pas sûr.

 

Message 9 sur 23
gmassart
en réponse à: cyber.anthony

Là c'est une réorientation du système de coordonnées d'une esquisse qui nécessite de pointer des éléments d'un volume type "vertice" et "edge" pour orienter et c'est lié par la suite.

C'est quoi le but derrière ? Vous auriez une image pour montrer ce que vous voulez faire ?

Guillaume MASSART
AFFIVAL SAS
Inventor Pro 2022

Message 10 sur 23
cyber.anthony
en réponse à: gmassart

Merci pour votre retour.

J'ai deux cas de figure:
1) Voici 2 images, celle par défaut avec l'outil qui pointe vers le bas et celle que j'aimerai obtenir qui pointe vers le haut.
Apparemment si l'axe initial Z devient Y et que l'axe initial Y devient Z c'es gagné. 

2) pour les 2ème cas il faut retourner la visualisation à 180°

Le but derrière est d'ouvrir le fichier dans un viewer 3D pour qu'il s'affiche dans le bon sens.
Malheureusement pour moi j'ai environ 200 fichiers qui sont dans ces 2 cas. 😞
Encore merci pour votre aide

Bon week-end

Message 11 sur 23
gmassart
en réponse à: cyber.anthony

Hmmm, dans ce ca là je me demande si un "déplacer le corps" et faire une rotation ne serait pas suffisant.

Je vais regarder l'API pour voir si c'est faisable facilement

Y a t'il un seul corps dans l'assemblage ? Ou sinon faut sélectionner tout peut être

 

Guillaume MASSART
AFFIVAL SAS
Inventor Pro 2022

Message 12 sur 23
cyber.anthony
en réponse à: gmassart

Bonjour,

Oui il y a un seul corps dans l'assemblage.
Si nous pouvons déjà tester une rotation à 180° sur plusieurs fichiers ce serait vraiment top svp. (ce serait ma première automatisation de masse)

Je vais essayer de faire une macro pour tous les fichiers d'un dossier ce soir pour déjà me familiariser avec l'ouverture et la fermeture des fichiers.

Si vous avez un exemple de fichier d'utilisation avec une macro similaire je suis preneur.

Encore merci pour votre aide

Bien Cordialement

Message 13 sur 23
gmassart
en réponse à: cyber.anthony

Alors premier essai sans tout modifier suggéré par @ThomasB44 

Redéfinir la vue de face

Avec le code suivant, ça tourne la vue de face de 90° par rapport à l'axe Y et set la vue nouvelle vue de face

Ca ne modifie pas les axes d'origine etc., juste la vue "prénommée" face

    Dim oCamera As Camera ' Crée un objet Caméra
    Set oCamera = ThisApplication.ActiveView.Camera ' Set la caméra sur la vue active
oCamera.ViewOrientationType = 10764
oCamera.Apply Dim rotAxis As Vector ' Crée un vecteur pour la rotation Set rotAxis = ThisApplication.TransientGeometry.CreateVector(0, 1, 0) 'Set le l'axe Y (0,1,0) comme vecteur Dim upVector As UnitVector ' Crée un vecteur pour la direction Set upVector = ThisApplication.TransientGeometry.CreateUnitVector(0, 1, 0) ' Set l'axe Y (0,1,0) comme vecteur Dim centerPoint As Point ' Crée un point Set centerPoint = ThisApplication.TransientGeometry.CreatePoint(0, 0, 0) ' Set l'origine (0,0,0) comme point Dim matrix As matrix ' Crée une matrice de transformation Set matrix = ThisApplication.TransientGeometry.CreateMatrix Dim offsetRad As Double ' Crée un angle de rotation offsetRad = Math.Atn(1) * 2 ' Met Pi/2 comme valeur de rotation Call matrix.SetToRotation(offsetRad, rotAxis, centerPoint) ' Set la matrice en matrice de rotation en fonction du centre, de l'axe et d'un angle en radian Dim newEye As Point ' Crée un oeil pour modifier la caméra Set newEye = oCamera.Eye ' Set l'oeil de la caméra actuel comme oeil Call newEye.TransformBy(matrix) ' transforme la position / orientation de l'oeil oCamera.Eye = newEye ' Set l'oeil de la caméra avec l'oeil créé oCamera.upVector = upVector ' Set le upVector de la caméra avec le upVector créé Call oCamera.ApplyWithoutTransition ' Transforme la caméra sans transition ThisApplication.ActiveView.SetCurrentAsFront ' Set la vue actuelle de la caméra comme vue de face

 

Guillaume MASSART
AFFIVAL SAS
Inventor Pro 2022

Message 14 sur 23
cyber.anthony
en réponse à: gmassart

Bonsoir,

C'est un début, merci. Je vois bien la pièce passé de "gauche" à "droite" avec la pointe qui reste en bas.
Cependant quand je refais mon export en STEP 214 la vue n'est pas conservée.

Il faudrait vraiment arriver à changer la vue de base apparemment mais je ne sais pas comment m'y prendre... 😞

 

 

 

Message 15 sur 23
gmassart
en réponse à: cyber.anthony

Ok, je pense que dans ce cas il vaut mieux faire un déplacement de corps et donc faire une rotation, là pour le coup c'est sur que la sortie sera correctement orientée.

Par contre je suis absent du pc les 2 prochains jours, Thomas aura peut être le bout de code qu'il faut

Guillaume MASSART
AFFIVAL SAS
Inventor Pro 2022

Message 16 sur 23
ThomasB44
en réponse à: cyber.anthony

Salut @cyber.anthony 

Donc si je résume, tu exportes en fait la pièce en STEP, que tu visionnes ensuite avec un viewer.

On peut faire une rotation du corps avec iLogic, mais le dessin associé à cette pièce sera cassé, et bon à mettre à la poubelle. Idem si tu as fait des dérivées ou autre avec cette pièce.

 

Voici un exemple de code issu de l'aide :

    ' Get the active part document.
    Dim oDoc As PartDocument
    Set oDoc = ThisApplication.ActiveDocument
    
    If oDoc Is Nothing Then
        MsgBox "No part document!" & vbCrLf & "Please open a part with solids in it for this sample to run.", vbCritical, "Autodesk Inventor"
        Exit Sub
    End If
    
    Dim oCompDef As PartComponentDefinition
    Set oCompDef = oDoc.ComponentDefinition
    
    If oCompDef.SurfaceBodies.Count = 0 Then
        MsgBox "No solids to move!" & vbCrLf & "Please open a part with solids in it for this sample to run.", vbCritical, "Autodesk Inventor"
        Exit Sub
    End If
    Dim oBodies As ObjectCollection
    Set oBodies = ThisApplication.TransientObjects.CreateObjectCollection
    ' Specify a body to move.
    oBodies.Add oCompDef.SurfaceBodies(1)
    ' Create a MoveFeatureDefinition.
    Dim oMoveDef As MoveDefinition
    Set oMoveDef = oCompDef.Features.MoveFeatures.CreateMoveDefinition(oBodies)
    ' Set the move operations onto the bodies.
    Dim oFreeDrag As FreeDragMoveOperation
    Set oFreeDrag = oMoveDef.AddFreeDrag(1, 1, 1)
    Dim oMoveAlongRay As MoveAlongRayMoveOperation
    Set oMoveAlongRay = oMoveDef.AddMoveAlongRay(oCompDef.WorkAxes(2), True, 2)
    
    Dim oRotateAboutAxis As RotateAboutLineMoveOperation
    Set oRotateAboutAxis = oMoveDef.AddRotateAboutAxis(oCompDef.WorkAxes(3), True, 0.5)
    
    ' Create the move feature.
    Dim oMoveFeature As MoveFeature
    Set oMoveFeature = oCompDef.Features.MoveFeatures.Add(oMoveDef)

 Pour "sauver" ton dessin, on peut préalablement créer une dérivée de cette pièce, faire la rotation et exporter.

En fonction de tes choix, on pourra adapter le code ci-dessus.


Thomas
Mechanical Designer / Inventor Professionnal 2023
Inventor Professional EESignature

Message 17 sur 23
ThomasB44
en réponse à: cyber.anthony

Re-bonjour @cyber.anthony 

J'ai testé ce bout de code, pour moi il fonctionne.

Il permet :

  1. De sélectionner un dossier
  2. De boucler sur tous les IPT présents dedans
  3. De créer une fonction "Déplacer les corps" en réglant une rotation de 90° par rapport à l'axe Y
  4. D'exporter au format STEP
  5. De ne pas sauvegarder le fichier

Voici la fonction qui est créée :

Capture.JPG

 

Et voici le code que j'ai créé, au format iLogic, il suffit de l'insérer dans n'importe quel fichier et de lancer le code.

Imports System.Windows.Forms

'[ Choose the directory
Dim oPath As String Dim Dialog = New FolderBrowserDialog() 'Define folder browser dialog Dialog.SelectedPath = "C:\" Dialog.ShowNewFolderButton = False 'Set options for folder browser dialog Dialog.Description = "Choisir un répertoire :" If DialogResult.OK = Dialog.ShowDialog() Then 'User clicked OK oPath = Dialog.SelectedPath & "\" 'Capture the export path Else 'User clicked cancel Return 'exit End If '] '[ Filter IPT files oFiles = System.IO.Directory.GetFiles(oPath, "*.ipt", _ System.IO.SearchOption.TopDirectoryOnly) '] '[ Iterate through each files in folder For Each oFile In oFiles oDoc = ThisApplication.Documents.Open(oFile) '[Rotate body Dim oCompDef As PartComponentDefinition oCompDef = oDoc.ComponentDefinition If oCompDef.SurfaceBodies.Count = 0 Then GoTo ResumeNext: End If Dim oBodies As ObjectCollection oBodies = ThisApplication.TransientObjects.CreateObjectCollection 'Specify a body to move. oBodies.Add(oCompDef.SurfaceBodies(1)) 'Create a MoveFeatureDefinition. Dim oMoveDef As MoveDefinition oMoveDef = oCompDef.Features.MoveFeatures.CreateMoveDefinition(oBodies) Dim oRotateAboutAxis As RotateAboutLineMoveOperation 'oCompDef.WorkAxes(2) = Axe Y 'Math.PI = 180° en radians oRotateAboutAxis = oMoveDef.AddRotateAboutAxis(oCompDef.WorkAxes(2), True, Math.PI/2) 'Create the move feature. Dim oMoveFeature As MoveFeature oMoveFeature = oCompDef.Features.MoveFeatures.Add(oMoveDef) '] '[ Get the STEP translator Add-In Dim oSTEPAddIn As TranslatorAddIn oSTEPAddIn = ThisApplication.ApplicationAddIns.ItemById("{90AF7F40-0C01-11D5-8E83-0010B541CD80}") 'Set up the context to define an output file Dim TransObjs As TransientObjects TransObjs = ThisApplication.TransientObjects Dim oContext As TranslationContext oContext = TransObjs.CreateTranslationContext oContext.Type = kFileBrowseIOMechanism 'Get the available options from the translator Dim oOptions As NameValueMap oOptions = TransObjs.CreateNameValueMap If oSTEPAddIn.HasSaveCopyAsOptions(oDoc, oContext, oOptions) Then 'Set application protocol. '2 = AP 203 - Configuration Controlled Design '3 = AP 214 - Automotive Design oOptions.Value("ApplicationProtocolType") = 3 'Other options... 'oOptions.Value("Author") = "" 'oOptions.Value("Authorization") = "" 'oOptions.Value("Description") = "" 'oOptions.Value("Organization") = "" End If 'Set the output filename, using a DataMedium object Dim oDataMedium As DataMedium oDataMedium = TransObjs.CreateDataMedium oDataMedium.FileName = Left(oFile, Len(oFile) -3) & "stp" 'Call the SaveCopyAs method of the translator add-in Call oSTEPAddIn.SaveCopyAs(oDoc, oContext, oOptions, oDataMedium) '] ResumeNext: oDoc.Close(True) 'Close document WITHOUT saving Next ']

La dernière commande "oDoc.Close(True)" permet de fermer le fichier sans le sauvegarder.

A toi de choisir si tu souhaites ou non conserver cette fonction en changeant True en False.


Thomas
Mechanical Designer / Inventor Professionnal 2023
Inventor Professional EESignature

Message 18 sur 23
cyber.anthony
en réponse à: ThomasB44

Hello @ThomasB44 ,
Déjà merci pour ton aide, j'apprécie vraiment et je suis impressionné par ce code.
Malheureusement je n'ai pas réussi à faire fonctionner le code pour l'instant


Je l'ai copié dans une macro et j'ai la ligne suivante qui est apparaît en rouge.
Dim Dialog = New FolderBrowserDialog() 'Define folder browser dialog

Quand je lance la macro elle s'arrête sur  le code: 
Imports System.Windows.Forms

J'ai tout de suite pensé que c'était un problème de Références et j'ai ajouté "System_Windows_Forms" (avec Outils>Références) mais sans succès.
J'ai essayé de voir si cela venait d'une erreur de synthaxe mais je n'ai pas trouvé. 😞


Est-ce que tu aurais une idée stp?

La démarche est vraiment la bonne, le seul ajout est que vu que je n'avais pas encore accès à Inventor, je pars directement du fichier STEP 214 et que je l'importe en mode "Solides" et "Fils".
Mais si ton code me permet de faire des rotations à 90° j'enregistrai tous les fichier en .ipl


Et du coup si le code fonctionne et que je l'utilise 2 fois cela permettra de faire une rotation à 180° stp? (désolé si la réponse est évidente mais j'ai pas encore toute la logique CAO)

 

Dans tous les cas si cela permet de modifier la vue de la pièce à l'ouverture du fichier STEP (donc ensuite du viewer) c'est vraiment Génial, ça me sauve la vie et ça me fait gagner un temps fou.


Donc encore Merci pour ton aide

 

Message 19 sur 23
ThomasB44
en réponse à: cyber.anthony

Salut @cyber.anthony 

Lors de mes tests, le code fonctionnait très bien et pour une raison que j'ignore, j'ai eu une erreur de déclaration sur

Dim Dialog = New FolderBrowserDialog()

Pour corriger cette erreur, j'ai ajouté :

Imports System.Windows.Forms

Je pense que tu peux supprimer cette ligne de code et réessayer.

 

Ce code est au format iLogic (VB.NET), pas au format macro (VBA). Il y a peu de différences entre ces 2 formats...

Pour utiliser le code que je t'ai fourni, il faut créer une règle dans un fichier Inventor :

Capture.JPG


Thomas
Mechanical Designer / Inventor Professionnal 2023
Inventor Professional EESignature

Message 20 sur 23
ThomasB44
en réponse à: cyber.anthony

Pour faire une rotation à 180°, il faut corriger cette ligne :

'oCompDef.WorkAxes(2) = Axe Y
'Math.PI = 180° en radians
oRotateAboutAxis = oMoveDef.AddRotateAboutAxis(oCompDef.WorkAxes(2), True, Math.PI/2)

Comme ceci :

oRotateAboutAxis = oMoveDef.AddRotateAboutAxis(oCompDef.WorkAxes(2), True, Math.PI)

 

Puisque PI = 180° en radians


Thomas
Mechanical Designer / Inventor Professionnal 2023
Inventor Professional EESignature

Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.

Publier dans les forums  

Autodesk Design & Make Report