API probleme selection & contraintes
  • Topic:
    • SOLIDWORKS

  • 4 réponses
  • 1209 vues

Par DirectorKrennic Le 16 mai 2019

Bonjour, 

pour un projet je dois réaliser une macro SolidWorks afin d'automatiser une certaine tache. Jusqu'à présent j'ai réussi à créer les pièces automatiquement, et a les rassembler dans une assemblage.

Néanmoins, je suis maintenant confronté à un problème: je dois lier les pièces entre-elles avec des contraintes. J'essaye donc de le faire de façon automatique. Voici le code:

 

Dim swApp As Object

Dim Part As Object
Dim boolstatus As Boolean
Dim longstatus As Long, longwarnings As Long

Sub main()

Set swApp = Application.SldWorks

Set Part = swApp.ActiveDoc

' Mate
Part.ClearSelection2 True
boolstatus = Part.Extension.SelectByID2("Enlèv. mat.-Extru.1@disque1-1@Assemblage1", "BODYFEATURE", 0, 0, 0, False, 1, Nothing, 0)
boolstatus = Part.Extension.SelectByID2("Boss.-Extru.6@Pièce1-1@Assemblage1", "BODYFEATURE", 0, 0, 0, True, 1, Nothing, 0)
Dim swMate As Mate2
Set swMate = Part.AddMate5(1, 0, False, 3.90150366882658E-02, 0.001, 0.001, 0.001, 0.001, 0, 0.5235987755983, 0.5235987755983, False, False, 0, longstatus)
Part.ClearSelection2 True
Part.EditRebuild3

End Sub

 

(sur deux pièces.)

Le problème est le suivant:

Lorsque j'essaye de faire la contrainte manuellement ( donc en enlevant la ligne associée dans le code ci-dessus), j'ai deux choix en fonction des markers que le mets dans mon code ( les arguments des méthode SelectID2)

  • -Si J'utilise le marker 0, les pièces ne sont pas réellement selectionnées dans le menu contraintes (capture d'écran 1)
  • - Si j'utilise le marker 1, je n'ai qu'un chois de contrainte!

Je pense donc qu'il doit y avoir un paramètre des mes méthodes qui n'est pas la bon, mais malgré de longues recherches je n'ai pas trouvé. Je viens donc vous poser la question: comment réaliser cette contrainte automatiqueement?

 

Merci d'avance pour l'aide que vous pourrez m'apporter.

 

 

 

Meilleure réponse

d.roger | 19558 point(s)

Bonjour,

Si tu cherches à mettre une contrainte de concentricité entre des faces alors il va falloir que tu nommes tes faces puis que tu les sélectionnes par la fonction "GetEntityByName" comme c'est marqué dans les remarques sur la page suivante ("To get IFace2, IEdge or IVertex objects by name, use IPartDoc::GetEntityByName or IPartDoc::IGetEntityByName.").

Mettre une contrainte de pivot entre des faces par les API n'est pas forcément si simple que ça,  il peut être préférable de mettre des axes de référence dans tes pièces et de construire celles-ci en pensant déjà aux contraintes que tu veux mettre de façon à créer ta fonction pivot par une coïncidence entre les 2 axes et une autre entre 2 plans par exemple, ces éléments pouvant être directement sélectionnés dans la fonction "SelectById2" en tant que "AXIS" et "PLANE".

Il est par contre vrai que dans ce que je pense être un projet d'étude (licence SW étudiante) il est plus intéressant et plus propre de passer par la sélection de faces !!!!

Cordialement,

Les autres réponses

d.roger | 19558 point(s)

Bonjour,

C'est normal que tu n'aies qu'un type de contrainte disponible sur l'image 2 avec les sélections que tu fais car ce sont des corps que tu sélectionnes ("bodyfeature") donc tu ne peux que les "bloquer" entre eux. Il faut donc que tu changes le type de sélection par des faces ou autres suivant ton besoin, regarde par ICI.

Cordialement,

DirectorKrennic | 105 point(s)

Bonjour, 

je reviens vers vous car j'avais déjà essayé de changer ces paramètres sans succès.Par acquis de conscience j'ai refait les essais (avec beaucoup de types présent dans le lien que vous m'avez envoyé) mais le problème persiste. Ceci dit, je me trompe peut-être sur la nature des objets .

Je vous mets en pièce joint mon assemblage afin que vous puissiez m'aider plus facilement. Je souhaite simplement réaliser la liaison pivot.

 

Merci d'avance pour votre aide!

d.roger | 19558 point(s)

Bonjour,

Si tu cherches à mettre une contrainte de concentricité entre des faces alors il va falloir que tu nommes tes faces puis que tu les sélectionnes par la fonction "GetEntityByName" comme c'est marqué dans les remarques sur la page suivante ("To get IFace2, IEdge or IVertex objects by name, use IPartDoc::GetEntityByName or IPartDoc::IGetEntityByName.").

Mettre une contrainte de pivot entre des faces par les API n'est pas forcément si simple que ça,  il peut être préférable de mettre des axes de référence dans tes pièces et de construire celles-ci en pensant déjà aux contraintes que tu veux mettre de façon à créer ta fonction pivot par une coïncidence entre les 2 axes et une autre entre 2 plans par exemple, ces éléments pouvant être directement sélectionnés dans la fonction "SelectById2" en tant que "AXIS" et "PLANE".

Il est par contre vrai que dans ce que je pense être un projet d'étude (licence SW étudiante) il est plus intéressant et plus propre de passer par la sélection de faces !!!!

Cordialement,