Bonjour,
j'ai un problème qui perdure depuis pas mal de temps :
Je travaille sur l'automatisation d'un assemblage mécanique et mon but est d'assembler des pièces et sous-ensemble en créant des contraintes via un programme.
Le but est simplement d'ouvir un ensemble vide, insérer les composants puis de les contraindre.
les contraintes restent simples, je ne veux faire que des Mates et Flush en utilisant les plans et axes des pièces et sous-ensembles.
Je me suis penché sur plusieurs langages de programation (Editeur VBA d'inventor, C# et python) mais je rencontre des problèmes dans chacun d'eux. (voir photo ci-dessous)
Avec Ilogic tout fonctionne, mais il me faut un programme externe donc pas ilogic 😞 .
J'ai également consulté le INVENTOR® 2024 API Object Model mais sans trop de succès.
Pour l'instant, Python est le seul langage avec lequel j'ai réussi à contraindre des plans. Le problème c'est que ça fonctionne uniquement avec les 3 plans et 3 axes de base mais pas avec ceux que j'ai créé.
Je n'ai pas réussi à aller jusqu'ici avec les 2 autres langages mais il y a quelques fonctions intéressantes comme extraire les nom des plans avec l'éditeur VBA.
Les 3 plans de base suffisents sur des ensembles simples mais dès que l'assemblage se complexifie, je ne peux pas le gérer en automatique.
Selon moi, tout ce qu'on peut faire à la souris (voir vidéo jointe qui montre ce que je veux faire avec la souris), on peut le faire avec des lignes de codes.
Le problème est donc ici : Est-il possible d'ajouter des contraintes automatiquement entre des axes et plans créés par l'utilisateur ?
(PS : Je ne sais pas si j'ai été très clair dans l'énoncé de mon problème donc je mets des extraits de code juste en dessous)
## PYTHON
CODE FONCTIONNEL POUR INSERER 2 ELEMENTS ET LES CONTRAINDRE AVEC LES 3 WP DE BASE
inv_doc = ouvrir_doc_vide('ensemble') # fonction qui permet d'ouvrir un ensemble ou une pièce
# réccupérer le document actif
try:
ensemble = inv.ActiveDocument.ComponentDefinition
except AttributeError as e:
print(f"Erreur : Impossible de récupérer la définition du composant. Détail de l'erreur : {e}")
return
# Insérer les 2 sous-ensembles
support1 = ensemble.Occurrences.Add(chemin_fichier_support1, inv.TransientGeometry.CreateMatrix())
support1.Grounded = False
support1.Name = "Support 1"
support2 = ensemble.Occurrences.Add(chemin_fichier_support2, inv.TransientGeometry.CreateMatrix())
support2.Grounded = False
support2.Name = "Support 2"
# Définition des plans de travail de l'assemblage
try:
EnsYZ = inv_doc.ComponentDefinition.WorkPlanes.Item(1)
EnsXZ = inv_doc.ComponentDefinition.WorkPlanes.Item(2)
EnsXY = inv_doc.ComponentDefinition.WorkPlanes.Item(3)
except AttributeError as e:
print(f"Erreur : Impossible de récupérer les plans de travail. Détail de l'erreur : {e}")
return
sup1YZ, sup1XZ, sup1XY = getWP(support1) # fonction pour extraire les workplanes du sous-ensemble et créer des proxys pour les exploiter
sup2YZ, sup2XZ, sup2XY = getWP(support2)
AssCons = ensemble.Constraints
# contraintes support 1
AssCons.AddFlushConstraint(sup1YZ, EnsYZ, 0)
AssCons.AddFlushConstraint(sup1XZ, EnsXZ, 0)
AssCons.AddFlushConstraint(sup1XY, EnsXY, 0)
# contraintes support 2
AssCons.AddMateConstraint(sup2YZ, EnsYZ, 3700)
AssCons.AddMateConstraint(sup2XZ, EnsXZ, 0)
AssCons.AddFlushConstraint(sup2XY, EnsXY, 0)
' VBA
CODE FONCTIONNEL POUR EXTRAIRE LES NOMS DES WORKPLANES
Sub ListWorkPlanes()
Dim assemblyDoc As AssemblyDocument
Dim compOcc1 As ComponentOccurrence
Dim compOcc2 As ComponentOccurrence
Set assemblyDoc = ThisApplication.ActiveDocument
Set comp1 = assemblyDoc.ComponentDefinition.Occurrences.Item(1)
Set comp2 = assemblyDoc.ComponentDefinition.Occurrences.Item(2)
Dim wp As WorkPlane
Dim i As Integer
' List WorkPlanes for the first component
Debug.Print "WorkPlanes du composant 1:"
For i = 1 To comp1.Definition.WorkPlanes.Count
Set wp = comp1.Definition.WorkPlanes.Item(i)
Debug.Print "WorkPlane " & i & ": " & wp.Name
Next i
' List WorkPlanes for the second component
Debug.Print "WorkPlanes du composant 2:"
For i = 1 To comp2.Definition.WorkPlanes.Count
Set wp = comp2.Definition.WorkPlanes.Item(i)
Debug.Print "WorkPlane " & i & ": " & wp.Name
Next i
' List WorkPlanes for the assembly
Debug.Print "WorkPlanes de l'assemblage:"
For i = 1 To assemblyDoc.ComponentDefinition.WorkPlanes.Count
Set wp = assemblyDoc.ComponentDefinition.WorkPlanes.Item(i)
Debug.Print "WorkPlane " & i & ": " & wp.Name
Next i
End Sub
-----
' VBA
CODE PAS FONCTIONNEL POUR CONTRAINDRE DES COMPOSANTS A L'ORIGINE
Sub EnsembleSimple()
' Référence à l'application Autodesk Inventor
Dim invApp As Application
Set invApp = ThisApplication
' Créer un nouvel assemblage
Dim assemblyDoc As AssemblyDocument
Set assemblyDoc = invApp.Documents.Add(kAssemblyDocumentObject, , True)
' Chemins des deux composants à importer
Dim component1Path As String
Dim component2Path As String
component1Path = "...\Support_207-45.iam"
component2Path = "...\Arm_207-45-1.iam"
' Créer une matrice de transformation identitaire
Dim transGeom As TransientGeometry
Set transGeom = invApp.TransientGeometry
Dim matrix As matrix
Set matrix = transGeom.CreateMatrix()
' Importer le premier composant
Dim compOcc1 As ComponentOccurrence
Set compOcc1 = assemblyDoc.ComponentDefinition.Occurrences.Add(component1Path, matrix)
' Débloquer le premier composant
compOcc1.Grounded = False
' Importer le deuxième composant
Dim compOcc2 As ComponentOccurrence
Set compOcc2 = assemblyDoc.ComponentDefinition.Occurrences.Add(component2Path, matrix)
' Débloquer le deuxième composant
compOcc2.Grounded = False
' Obtenez les WorkPlanes des composants
Dim comp1WorkPlaneXY As WorkPlane
Dim comp1WorkPlaneXZ As WorkPlane
Dim comp1WorkPlaneYZ As WorkPlane
Set comp1WorkPlaneXY = compOcc1.Definition.WorkPlanes.Item(3) ' WorkPlane XY
Set comp1WorkPlaneXZ = compOcc1.Definition.WorkPlanes.Item(2) ' WorkPlane XZ
Set comp1WorkPlaneYZ = compOcc1.Definition.WorkPlanes.Item(1) ' WorkPlane YZ
Dim comp2WorkPlaneXY As WorkPlane
Dim comp2WorkPlaneXZ As WorkPlane
Dim comp2WorkPlaneYZ As WorkPlane
Set comp2WorkPlaneXY = compOcc2.Definition.WorkPlanes.Item(1) ' WorkPlane XY
Set comp2WorkPlaneXZ = compOcc2.Definition.WorkPlanes.Item(2) ' WorkPlane XZ
Set comp2WorkPlaneYZ = compOcc2.Definition.WorkPlanes.Item(3) ' WorkPlane YZ
' Obtenez les WorkPlanes de l'assemblage
Dim assemblyWorkPlaneXY As WorkPlane
Dim assemblyWorkPlaneXZ As WorkPlane
Dim assemblyWorkPlaneYZ As WorkPlane
Set assemblyWorkPlaneXY = assemblyDoc.ComponentDefinition.WorkPlanes.Item(3) ' WorkPlane XY
Set assemblyWorkPlaneXZ = assemblyDoc.ComponentDefinition.WorkPlanes.Item(2) ' WorkPlane XZ
Set assemblyWorkPlaneYZ = assemblyDoc.ComponentDefinition.WorkPlanes.Item(1) ' WorkPlane YZ
' Contraindre les WorkPlanes du premier composant à l'origine de l'assemblage
Dim flushConstraint1 As flushConstraint
Set flushConstraint1 = assemblyDoc.ComponentDefinition.Constraints.AddFlushConstraint( _
comp1WorkPlaneXY, _
assemblyWorkPlaneXY, _
0)
' il n'arrive pas à faire cette contrainte
----
J'espère que c'est assez clair et compréhensible...
Un grand merci a ceux qui prendrons le temps de m'aider ! 🙂
Résolu ! Accéder à la solution.
Résolu par ThomasB44. Accéder à la solution.
Salut @oscar_dls
Quel que soit le langage que tu souhaites utiliser, c'est possible en iLogic, VBA, et VB.NET pour l'avoir réalisé. Je ne connais pas avec Python, mais c'est surement réalisable également.
La documentation est disponible dans l'API, comme tu places des composants dans un ensemble, il faut définir la géométrie de référence (celle du sous-ensemble) dans le contexte de l'ensemble, et donc créer une "GeometryProxy"
Comme dans cet exemple sur le forum, en VB.NET :
Ou cet exemple sur l'aide de l'API, en VBA :
Public Sub MateConstraintOfWorkPlanes()
Dim oAsmCompDef As AssemblyComponentDefinition
Set oAsmCompDef = ThisApplication.ActiveDocument.ComponentDefinition
' Get references to the two occurrences to constrain.
' This arbitrarily gets the first and second occurrence.
Dim oOcc1 As ComponentOccurrence
Set oOcc1 = oAsmCompDef.Occurrences.Item(1)
Dim oOcc2 As ComponentOccurrence
Set oOcc2 = oAsmCompDef.Occurrences.Item(2)
' Get the XY plane from each occurrence. This goes to the
' component definition of the part to get this information.
' This is the same as accessing the part document directly.
' The work plane obtained is in the context of the part,
' not the assembly.
Dim oPartPlane1 As WorkPlane
Set oPartPlane1 = oOcc1.Definition.WorkPlanes.Item(3)
Dim oPartPlane2 As WorkPlane
Set oPartPlane2 = oOcc2.Definition.WorkPlanes.Item(3)
' Because we need the work plane in the context of the assembly
' we need to create proxies for the work planes. The proxies
' represent the work planes in the context of the assembly.
Dim oAsmPlane1 As WorkPlaneProxy
Call oOcc1.CreateGeometryProxy(oPartPlane1, oAsmPlane1)
Dim oAsmPlane2 As WorkPlaneProxy
Call oOcc2.CreateGeometryProxy(oPartPlane2, oAsmPlane2)
' Create the constraint using the work plane proxies.
Call oAsmCompDef.Constraints.AddMateConstraint(oAsmPlane1, oAsmPlane2, 0)
End Sub
Thomas
Mechanical Designer / Inventor Professionnal 2025
Ok merci @ThomasB44 , ça me débloque une partie du VBA :). Mais est ce que je peux faire la même chose avec des plans que j'ai créé? Comme ceux-ci :
Oui c'est possible.
Par exemple les commandes :
oPartPlane1 = oOcc1.Definition.WorkPlanes.Item(3)
Et :
oPartPlane1 = oOcc1.Definition.WorkPlanes.Item("Plan XY")
Retournent le même objet
Les plans de construction utilisateur fonctionnent à l'identique.
Thomas
Mechanical Designer / Inventor Professionnal 2025
Vous n'avez pas trouvé ce que vous recherchiez ? Posez une question à la communauté ou partagez vos connaissances.