Faire des contraintes entre deux pièces

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.

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".

 

2 « J'aime »

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)

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)

 

3 « J'aime »

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,

2 « J'aime »

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.

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,

1 « J'aime »

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é '(

 

 

 

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,

2 « J'aime »

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.

1 « J'aime »

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.

 

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,

2 « J'aime »

Pour mettre les pièces en mode résolu par le code, voir http://help.solidworks.com/2013/English/api/sldworksapi/SolidWorks.Interop.sldworks~SolidWorks.Interop.sldworks.IAssemblyDoc~SetComponentSuppression.html?verRedirect=1 et http://help.solidworks.com/2013/English/api/swconst/SolidWorks.Interop.swconst~SolidWorks.Interop.swconst.swComponentSuppressionState_e.html.

Cordialement,

Oui Monsieur d.roger, j'ai changé le mode des pièces en résolus en cliquant sur l'assemblage et en changement le mode, maintenant, j'ai réussi a assemblé l'origine de la pièce à l'origine de l'assemblage.

Merci beaucoup monsieur pour votre aide et à tous les membres de forum qu'ils ont participé dans ce sujet.

 

1 « J'aime »

Bonjour,

s'il vous plait, j'ai deux petites questions :

1/ je veux assembler deux pièces en utilisant les axes que je les ai crée.

j'ai essayé ce code :

Code 

 FirstSelection = "Axe1@" + strCompName & "@" + AssemblyName
        SecondSelection = "Axe2@" + strCompModelname2 & "@" + AssemblyName

 

'Axe1 et Axe2 sont les noms des axes '

        boolstat = swDocExt.SelectByID2(FirstSelection, "AXIS", 0, 0, 0, True, 1, Nothing, 0)
        boolstat = swDocExt.SelectByID2(SecondSelection, "AXIS", 0, 0, 0, True, 1, Nothing, 0)
        matefeature = swAssemblyDoc.AddMate3(swMateType_e.swMateCOINCIDENT, swMateAlign_e.swMateAlignALIGNED, False, 0, 0, 0, 0, 0, 0, 0, 0, False, mateError)

 

mais, il m' a affiché que la sélection des axes est incorrect.

2/ comment je peux sélectionner une face de la pièce pour assembler deux pièces en utilisant les faces.

 

Bonjour,

Pour trouver les bonnes valeurs à mettre dans les lignes " SelectByID2 " et " AddMate3 " vous pouvez utiliser l'enregistreur de macro de Solidworks (voir ici), ne reste plus alors qu'à copier les lignes en question et adapter les noms des éléments selon votre besoin. 

Cordialement,

1 « J'aime »