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