SolidWorks : Capturer les coordonnées de clic pour placer une annotation en plan

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 :

  1. 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 est MouseSelectNotify, qui fournit les coordonnées x, y, z dans le système de coordonnées du modèle/plan, contrairement à MouseLBtnDownNotify qui 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
      
  2. 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
      
  3. Utiliser les coordonnées capturées pour insérer un bloc ou une annotation :

    • Une fois les coordonnées x, y, z récupérées via MouseSelectNotify (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 MakeSketchBlockFromFile nécessite un point d’insertion (InsertionPoint) sous forme d’un tableau de doubles (x, y, z). Il est crucial de ne pas passer Nothing pour 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)
      
  4. 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.