Faire des contraintes entre deux pièces
  • Topic:
    • SOLIDWORKS

  • 16 réponses
  • 2334 vues

Par Learn More Le 02 août 2018

Bonjour, 
le but de mon travail consiste à ajouter une pièce à un ensemble des pièces ,déjà existé, dans le logiciel solidwoks. En plus , il faut l'assembler avec cet ensemble en utilisant les API de VB.NET.
Donc, j'ai réussi à ajouter la pièce à l'ensemble des pièces dans Solidworks, mais le problème que je n'arrive pas à l'assembler avec VB.NET, j'ai fait plusieurs recherche sur le net et j'ai trouvé cet algorithme, quand je l’exécute il fonctionne sans erreur mais il n'effectue pas l'action d’assemblage.
voilà l'algorithme : 
 

Code:

strCompName = swComponent.Name2()
        Debug.Print(" la pièce est  " & strCompName)
        swModel.ClearSelection2(True)
        swDocExt = swModel.Extension()
        MateName = "Concentric" + strCompName
        FirstSelection = "Point1@Origin@" + strCompName & "@" + AssemblyName
        SecondSelection = "Point1@Origin@" + AssemblyName

        boolstat = swDocExt.SelectByID2(FirstSelection, "CONCENTRIC", 0, 0, 0, True, 1, Nothing, swSelectOption_e.swSelectOptionDefault)
        boolstat = swDocExt.SelectByID2(SecondSelection, "CONCENTRIC", 0, 0, 0, True, 1, Nothing, swSelectOption_e.swSelectOptionDefault)

   
        matefeature = swAssemblyDoc.AddMate3(swMateType_e.swMateCONCENTRIC, swMateAlign_e.swMateAlignALIGNED, False, 0, 0, 0, 0, 0, 0, 0, 0, False, mateError)
        swModel.ClearSelection2(True)


        swModel.ViewZoomtofit2()
en plus j'ai essayé d'ajouter MsgBox(mateError), et il me donne 4 comme résultat.
j'attend vos réponses et merci d'avance.

Meilleure réponse

d.roger | 19616 point(s)

Heu, petite vérification, tes pièces sont bien en mode résolues dans Solidworks sinon ça marche pas puisque les références telles que les origines des pièces ne sont pas chargées !!!!

Cordialement,

Les autres réponses

Gauthik67 | 4665 point(s)

Bonjour, 

Tout d'abord il faut vérifier que cette macro sélectionne bien les faces sur lesquelles vous voulez appliquer les contraintes. C'est à dire, vérifier que les définitions de "FirstSelection" et "SecondSelection" fonctionnent.

Ensuite il faut que la contrainte que vous ajoutez corresponde. Dans l'exemple donné, vous essayez d'appliquer une contrainte "coaxiale".

 

Learn More | 146 point(s)

Bonjour et merci pour votre réponse,

oui, le but de mon algorithme consiste à appliquer une contrainte de coaxialité entre une pièce ajoutée et l'ensemble des pièces.

pour firstselection et secondselection, je pense que tout va bien maintenant , j'ai fit une petite réctification : 

FirstSelection = "Point1@Origin" + strCompName & "@" + AssemblyName
        SecondSelection = "Point1@Origin" + AssemblyName

 

mais le problème reste le même, il n'y a pas des contraintes ajoutées aux pièces.

par contre, je pense que le problème vient de ces lignes : ( c'est juste une proposition en attendant vos aide) : 

boolstat = swDocExt.SelectByID2(FirstSelection, "CONCENTRIC", 0, 0, 0, True, 1, Nothing, swSelectOption_e.swSelectOptionDefault)
        boolstat = swDocExt.SelectByID2(SecondSelection, "CONCENTRIC", 0, 0, 0, True, 1, Nothing, swSelectOption_e.swSelectOptionDefault)

   
        matefeature = swAssemblyDoc.AddMate3(swMateType_e.swMateCONCENTRIC, swMateAlign_e.swMateAlignALIGNED, False, 0, 0, 0, 0, 0, 0, 0, 0, False, mateError)
        swModel.ClearSelection2(True)

David, Innova Systems Tech Support | 919 point(s)

Hi,

You cannot add a concentric mate between two points. so the mate type you should be trying to use is a Coincident. This likely to be your primary issue.

Also I think your SelectByID2 lines need some work

http://help.solidworks.com/2018/english/api/sldworksapi/solidworks.interop.sldworks~solidworks.interop.sldworks.imodeldocextension~selectbyid2.html

This page gives some detail, but I think yours lines should look more like:

boolstat = swDocExt.SelectByID2(FirstSelection, "", 0, 0, 0, True, 1, Nothing, swSelectOption_e.swSelectOptionDefault)

 

d.roger | 19616 point(s)

Bonjour,

Dans le code que tu as récupéré, tu utilises AddMate3 qui est obsolète, remplace le par AddMate5 (voir ici) et comme dit par Gauthik67 et David fait attention à ta fonction SelectByID2, la deuxième valeur correspond au type d'objet que tu sélectionnes, soit vide, soit à prendre dans swSelectType_e Enumeration, et non au type de contrainte comme tu as mis. Fait aussi attention à la contrainte que tu mets en place, celle-ci doit être cohérente avec tes sélections. Tu trouveras un exemple de ce que tu veux faire ici.

Cordialement,

Learn More | 146 point(s)

Bonjour et merci pour vos réponses,

j'ai fait les changments comme vous m'avez demandé de les faire : 

pour le SelectBylD2 : 

 boolstat = swDocExt.SelectByID2(FirstSelection, "", 0, 0, 0, True, 1, Nothing, swSelectOption_e.swSelectOptionDefault)
        boolstat = swDocExt.SelectByID2(SecondSelection, "", 0, 0, 0, True, 1, Nothing, swSelectOption_e.swSelectOptionDefault)

pour le addMate5, il me rend ce message d'erreur : 

Le membre public 'AddMate5' du type 'AssemblyDoc' est introuvable

je pense parce que je suis entrain d'utiliser VB.NET 2013, et je ne pense pas que c'est un grand problème parce que AddMAte3 fait le bolo.

j'ai essayé d'ajouter ce code pour bien définir ou est le problème : 

matefeature = swAssemblyDoc.AddMate3(swMateType_e.swMateCOINCIDENT, swMateAlign_e.swMateAlignALIGNED, False, 0, 0, 0, 0, 0, 0, 0, 0, False, mateError)

 If matefeature Is Nothing Then
            MsgBox(" mate failed! ")
        End If 
 
 

et il me rend le message " mate failed", ça veux dire la fonction matefeature n'a pas fonctionnée.

j'attend vos aides et merci.

d.roger | 19616 point(s)

Bonjour,

Es-tu sur que la sélection de tes éléments se passe bien ? (je pense qu'il manque un "e" à la fin du mot origine dans la déclaration de tes FirstSelection et SecondSelection). Remplace aussi les "" par "EXTSKETCHPOINT" dans les 2 lignes SelectByID2.

Si tu veux contraindre l'origine de ta pièce par rapport à l'origine de ton assemblage alors remplace "swMateType_e.swMateCOINCIDENT" par "swMateType_e.swMateCOORDINATE" et "swMateAlign_e.swMateAlignALIGNED" par "-1" dans la fonction AddMate3.

Pour la fonction AddMate5, tu es sur quelle version de Solidworks ?

Voici un exemple de code :

Dim FirstSelection As String
FirstSelection = "Point1@Origine@Pièce1-1@" & AssemblyName
Dim SecondSelection As String
SecondSelection = "Point1@Origine@" & AssemblyName
        
Part.ClearSelection2 True
boolstatus = swAssemblyDoc.Extension.SelectByID2(FirstSelection, "EXTSKETCHPOINT", 0, 0, 0, False, 1, Nothing, 0)
boolstatus = swAssemblyDoc.Extension.SelectByID2(SecondSelection, "EXTSKETCHPOINT", 0, 0, 0, True, 1, Nothing, 0)
Dim matefeature As Mate2
Set matefeature = swAssemblyDoc.AddMate3(swMateType_e.swMateCOORDINATE, -1, False, 0, 0, 0, 0, 0, 0, 0, 0, False, mateError)
Part.ClearSelection2 True
Part.EditRebuild3

Cordialement,

Learn More | 146 point(s)

Bonjour et merci pour votre réponse,

j'ai la version de 2013 de solidworks.

pour "Point1@Origine@", dans l'aide de solidworks, origine est écrite sans e.

j'ai testé votre version de code, mais je n'ai pas eu des résultats.

pff ce code me rend fou, j'ai presque 1 mois que je suis coincé '(

 

 

 

d.roger | 19616 point(s)

Bonjour,

A la remarque " pour "Point1@Origine@", dans l'aide de solidworks, origine est écrite sans e. " j'aurais tendance à dire que c'est normal puisque l'aide de Solidworks donne des exemple de code pour une version anglophone de Solidworks donc origin sans e mais si ton solidworks est en français alors origine prend un e, regarde comment il est écrit dans ton arbre de construction.

Cordialement,

d.roger | 19616 point(s)

Mets aussi des MsgBox FirstSelection et MsgBox SecondSelection après leurs attributions de valeur pour vérifier que ceux-ci correspondent bien à ce que tu attends.

Learn More | 146 point(s)

Bonjour et merci  beaucoup pour cette remarque,

j'ai trouvé " Origin " dans l'arbre de construction.

et j'ai fait les MsgBox pour

FirstSelection :  " Point1@Origin@Key-1@Assembly "

SecondSelection : " Point1@Origin@Assembly "

je pense qu'ils ont donné des bonnes résultats maintenant.

il me reste que de coïncider ces deux points pour assembler les deux pièces.