J’essaie de développer une macro SolidWorks pour insérer rapidement des annotations ou des blocs dans un plan. Mon principal défi est de capturer la position X, Y du curseur au moment du clic sur la feuille de dessin, afin de pouvoir placer ces éléments avec précision. J’ai envisagé d’utiliser un UserForm non modal pour visualiser ces coordonnées, mais je n’arrive pas à trouver le code VBA adéquat pour les récupérer correctement dans le contexte d’un plan.
Pour capturer les coordonnées de clic souris directement sur une feuille de plan SolidWorks et les utiliser pour positionner des éléments, il est essentiel d’implémenter un gestionnaire d’événements (event listener) qui intercepte les interactions de la souris et récupère les coordonnées du modèle plutôt que les coordonnées écran.
Voici la démarche pour y parvenir :
-
Créer un module de classe pour gérer les événements souris :
- Dans l’éditeur VBA, insérez un nouveau Module de classe (par exemple, nommez-le
SwMouseEventHandler). - Déclarez les variables nécessaires et implémentez l’interface
ISwMouseEvents. L’événement clé à utiliser estMouseSelectNotify, qui fournit les coordonnéesx,y,zdans le système de coordonnées du modèle/plan, contrairement àMouseLBtnDownNotifyqui pourrait donner des coordonnées écran ou incorrectes pour le contexte du plan. - Code pour le module de classe
SwMouseEventHandler(par d_roger, basé sur Maclane) :' SwMouseEventHandler Class Module Option Explicit Public WithEvents SwMouseEvents As SldWorks.SwMouseEvents Public SwApp As SldWorks.SldWorks Private Sub Class_Initialize() Set SwApp = Application.SldWorks End Sub Private Function SwMouseEvents_MouseSelectNotify(ByVal x As Double, ByVal y As Double, ByVal z As Double, ByVal lButton As Long, ByVal lShift As Long, ByVal lControl As Long, ByVal lAlt As Long) As Long ' Ici, x, y, z sont les coordonnées du clic dans le système de coordonnées du modèle/plan. ' Vous pouvez stocker ces valeurs dans des variables globales ou les passer à un UserForm. Debug.Print "Coordonnées de clic (x,y,z) : " & x & ", " & y & ", " & z ' Retourner 0 pour ne pas consommer l'événement de sélection, ' ou 1 si vous voulez empêcher SolidWorks de traiter la sélection. SwMouseEvents_MouseSelectNotify = 0 End Function
- Dans l’éditeur VBA, insérez un nouveau Module de classe (par exemple, nommez-le
-
Créer un module standard pour initialiser et activer le gestionnaire d’événements :
- Dans un Module standard, déclarez une instance de votre classe de gestionnaire d’événements.
- Initialisez cette instance et connectez-la aux événements de la souris de SolidWorks. C’est ce module qui lancera la surveillance des clics.
- Code pour le module standard (par Maclane, adapté par d_roger) :
' Module Standard Option Explicit Public myMouseHandler As SwMouseEventHandler Public SwApp As SldWorks.SldWorks Sub Main() Set SwApp = Application.SldWorks Set myMouseHandler = New SwMouseEventHandler Set myMouseHandler.SwMouseEvents = SwApp.GetMouseEvents ' Le gestionnaire d'événements est maintenant actif. ' Vous pouvez afficher un UserForm non modal ici pour interagir avec l'utilisateur. ' UserForm2.Show vbModeless End Sub Sub StopMouseEvents() Set myMouseHandler = Nothing Set SwApp = Nothing End Sub
-
Utiliser les coordonnées capturées pour insérer un bloc ou une annotation :
- Une fois les coordonnées
x,y,zrécupérées viaMouseSelectNotify(par exemple, stockées dans des variables publiques ou passées à un UserForm), vous pouvez les utiliser pour placer des éléments. - Pour insérer un bloc de croquis dans un plan, la méthode
MakeSketchBlockFromFilenécessite un point d’insertion (InsertionPoint) sous forme d’un tableau de doubles(x, y, z). Il est crucial de ne pas passerNothingpour cet argument. - Exemple de placement de bloc (par Cyril_f) :
' Supposons que X_Coord, Y_Coord, Z_Coord sont les valeurs capturées Dim vPoint(2) As Double vPoint(0) = X_Coord vPoint(1) = Y_Coord vPoint(2) = Z_Coord ' Z sera probablement 0 pour un plan 2D Dim myBlockDefinition As Object ' Assurez-vous que Part est le document de dessin actif (DrawingDoc) Set myBlockDefinition = Part.SketchManager.MakeSketchBlockFromFile(vPoint, REPONSE, False, Echelle, 0)
- Une fois les coordonnées
-
Considérations supplémentaires :
- Assurez-vous que le document actif est bien un document de dessin (
DrawingDoc) lorsque vous travaillez avec des plans. - Si vous utilisez un UserForm, gérez sa visibilité et sa modalité (
vbModeless) pour permettre l’interaction avec le document SolidWorks pendant que le formulaire est ouvert. - N’oubliez pas de désactiver le gestionnaire d’événements (
Set myMouseHandler = Nothing) lorsque vous n’en avez plus besoin pour éviter les fuites de mémoire ou les comportements inattendus.
- Assurez-vous que le document actif est bien un document de dessin (