Aucun accés à Solidworks lors de l'exécution de ma macro avec un bouton

Bonjour,

je souhaiterai lancer ma macro à partir d'un "bouton de macro" directement dans Solidworks. Lorsque j'exécute ma macro à partir de visual basic 6 je n'ai aucun soucis alors que si je la lance à partir du bouton que j'ai créé dans Solidworks la rien ne fonctionne. En effet je souhaite sélectionner plusieurs faces mais je n'ai aucun accés à Solidworks une fois la macro lancée.

Voici un bout de mon code:

 

Dim swApp           As SldWorks.SldWorks
Dim swModel         As SldWorks.ModelDoc2
Dim swSelMgr        As SldWorks.SelectionMgr
Dim matefeature     As SldWorks.Mate2
Dim swFace1         As SldWorks.Face2
Dim swFace2         As SldWorks.Face2

Dim bool1           As Boolean
Dim bool2           As Boolean

Dim CurFaceName     As String
Dim FaceName1       As String
Dim FaceName2       As String

Dim MateName        As String
Dim MateName2       As String

Dim Part            As Object

 

Sub Equerre90XL()

    Set swApp = Application.SldWorks
    Set swModel = swApp.ActiveDoc
    Set swSelMgr = swModel.SelectionManager
    
    bool1 = False
    Do Until bool1 = True
        If swSelMgr.GetSelectedObjectType3(1, -1) = swSelFACES Then
            Set swFace1 = swSelMgr.GetSelectedObject6(1, -1)
            bool1 = True
        End If
    Loop
    swModel.ClearSelection
        
    bool2 = False
    Do Until bool2 = True
        If swSelMgr.GetSelectedObjectType3(1, -1) = swSelFACES Then
            Set swFace2 = swSelMgr.GetSelectedObject6(1, -1)
            bool2 = True
        End If
    Loop
    
    Do
    swFace2.Select (0)
    Rotation.Show
    Loop Until value2 = True
    
    swFace1.Select (1)
    swFace2.Select (1)
    Set Part = swApp.ActiveDoc
    Set matefeature = Part.AddMate3(swMateCOINCIDENT, swMateAlignCLOSEST, True, 0, 0, 0, 0, 0, 0, 0, 0, False, mateError)
    matefeature.name = MateName
    Part.ClearSelection

...

 

Merci d'avance,

 

Gael

quel version de solidworks utilisez vous?

la version de vba utiliser sur solidworks 2013 est vba7, peut-être que le soucis viens de là mais je ne suis pas expert sur le dévelloppement.

4 « J'aime »

Bonjour,

Pour complèter la réponse de fthomas, je vous propose cet article que nous avions publié et qui explique le problème de compatibilité entre les niveaux de version de SW et VBA.

Cordialement

3 « J'aime »

Bonjour,

 

Je pense qu'il faut que tu modifies ces lignes de codes :

    Set swApp = Application.SldWorks

 

Par celles ci :
    Set swApp = SldWorks.SldWorks

 

L'objet Application ne renvoi pas la session Solidworks courante mais un nouvel objet Solidworks

2 « J'aime »

Bonjour,

 

Si votre macro affiche une fenetre assurez vous quelle ne soit pas modal

 

Si ce n'est pas le cas je ne peux pas vous en dire plus avec l'extrait que vous placez ici,

mais si vous joingnez votre macro en piece jointe, je pourrai y jeter un coup d'oeil

 

cordialement,

8 « J'aime »

Bonjour à tous,

Merci pour vos réponse!!

 

@ jmsavoyat et @ fthomas Alors j'utilise encore Solidworks 2010 64 bits donc pas de problèmes avec vb7

 

@ etienne.canuel Lorsque je change la ligne de code par ce que tu me dis j'ai un mess d'erreur ...

 

@ jfaradon Je pense que ce n'est pas un problème de fenètre ouverte ou pas puisque j'y ai accès, je peux cliquer dessus et elle se ferme bien. J'ai essayé avec d'autres programmes et j'ai le même soucis uniquement lorsque je lance ma macro à l'aide d'un bouton de commande (que j'ai créé) situé dans l'onglet assemblage. Si je la lance de VB6 pas de soucis. Le soucis est que je n'ai aucun accès à Solidworks ce qui est essentiel dans mon programme je dois cliquer sur 2 faces... Le seul recours que j'ai est le ctrl + pause...

 

Je met en pièce jointe mon code.

Pour ceux qui le télécharge j'ai mis avec les pièces qui doivent s'insérer (faudra changer le chemin pour l'ouverture de la pièce dans le programme dans les userforms "equerre" et "table").

En gros c'est une insertion de pièce avec une contrainte de coincidence.

L'userform insertion ne fonctionnera qu'avec table et equerre. Le module main est "insertion_contrainte". La table doit être insérée en 1er!!

Je n'ai pas mis la fin de mon code car c'est inutile c'est quasiment la même chose et si ça marche pour le début ça marchera pour la suite!

 

Merci à vous,

 

Gael

 


programme.7z

Dsl j'avais pas vu mais y'a 2 erreues dans mon programmes

Voici en PJ le programme corrigé

 

Gael


programme.7z

Tu n'as surement pas référencé les bonnes bibliothèques/dll à ta macro.

Pour être sûr qu'elles soient bien activées, le plus simple est de créer une nouvelle macro à partir du menu  solidworks, de supprimer les lignes de codes crées automatiquement par solidworks puis de coller ton code.

 

Sinon, si tu t'y connais un peu, tu peux aller dans VBA puis dans le menu outils->références puis choisir les bibliothèques/dll solidworks correspondant à ta version.

De mémoire, il faut cocher celles-ci :

SldWorks xxxx Type Library

SolidWorks xxxx Constant type library

SolidWorks xxxx Command type library

(Remplacer xxxx par la version de Solidworks)

Merci de ta réponse mais ce n'est toujours pas ça...

Je continu de chercher

Bonjour,

Si j'ai bien compris, ta macro sert à créer une contrainte, et lorsque tu lances ta macro dans Microsoft Visual Basic (celui de SW on est d'accord) elle fonctionne et tu peux sélectionner tes faces.

 

Mais lorsque tu la lances depuis SlidWorks, "rien ne fonctionne" :

Qu'est ce que cela veut dire ? Que'est ce qu'il se passe ?

La macro va tellement vite que tu n'as pas le temps de sélectionner les surfaces ?

 

 

Une solution qui pourrait marcher : selectionne tes deux faces AVANT de lancer ta macro.

Peut-être qu'à cause de la vitesse d'exécution, tu ne peux pas sélectionner la face dans SolidWorks lorsque tu lances la macro avec un bouton, la solution : une pause.

Il faut insérer cette ligne dans ton code :

Application.Wait Time + TimeSerial(0, 0, 1)  'pause d'une seconde

 

Le résultat :

 

bool1 = False

    Do Until bool1 = True
        If swSelMgr.GetSelectedObjectType3(1, -1) = swSelFACES Then
            Set swFace1 = swSelMgr.GetSelectedObject6(1, -1)
            bool1 = True
        End If

        Application.Wait Time + TimeSerial(0, 0, 1)  'pause d'une seconde
    Loop
    swModel.ClearSelection
        
    bool2 = False
    Do Until bool2 = True
        If swSelMgr.GetSelectedObjectType3(1, -1) = swSelFACES Then
            Set swFace2 = swSelMgr.GetSelectedObject6(1, -1)
            bool2 = True
        End If

        Application.Wait Time + TimeSerial(0, 0, 1)  'pause d'une seconde
    Loop

 

 

Ca fonctionne ainsi ? A voir pour réduire le temps de pause en dessous d'une seconde si c'est trop long pour toi.

Dsl pour le retard mais j'étais en vacances..

Non ce n'est pas du tout ça mon problème vu que j'utilise un do until j'ai tout mon temps pour sélectionner ma face.

En fait je veux lancer une macro à partir d'un bouton de macro que j'ai créé dans Solidworks mais lorsque je clic dessus mon programme se lance correctement mais je ne peux pas sélectionner une face alors que quand je lance ma macro de VB6 je peux sélectionner mes faces.

Du coup je suis bloquer j'ai contacté Solidworks et j'attends leur réponse.

Merci

Bonjour,

 

"Non ce n'est pas du tout ça mon problème vu que j'utilise un do until j'ai tout mon temps pour sélectionner ma face."

=> FAUX !

 

Je viens de tester avec une pause et ça marche !

Par contre, la pause que j'ai proposé ne fonctionne pas, il faut utiliser un "do events".

La macro qui fonctionne est en pièce-jointe.

 

Ou un exemple du code est ici :

    swModel.ClearSelection
   bool1 = False
   Do Until bool1 = True
       If swSelMgr.GetSelectedObjectType3(1, -1) = swSelFACES Then
           Set swFace1 = swSelMgr.GetSelectedObject6(1, -1)
           bool1 = True
       End If
        For Y = 1 To 50000
            DoEvents
        Next Y
    Loop
 


insertion__contrainte.swp