SendKeys inefficace après StartCommand dans macro Catia V5

Pourquoi la fonction SendKeys ne fonctionne-t-elle pas pour valider une boîte de dialogue interactive (ex: désassemblage) dans une macro Catia V5 (VBA) lancée via un CatScript, alors qu’elle fonctionne depuis l’éditeur Visual Basic ?

Le problème de l’inefficacité de SendKeys après l’exécution d’une commande interactive via CATIA.StartCommand est une limitation connue dans Catia V5, particulièrement lorsque la macro est lancée depuis un exécutable (CatScript) plutôt que l’éditeur VBA.

Voici l’explication et la solution :

  1. Compréhension du Problème :

    • La fonction SendKeys simule une frappe clavier. Elle est dépendante de la fenêtre active et de la réactivité de l’application.
    • Lorsqu’une macro est lancée depuis l’éditeur VBA, l’environnement de développement peut maintenir une certaine « attention » sur l’application Catia, permettant parfois à SendKeys de fonctionner même dans des situations limites.
    • Cependant, lorsque la macro est lancée via un CatScript (ou tout autre exécutable externe), Catia peut ne pas être la fenêtre active au moment précis où SendKeys est exécuté, ou la commande lancée par StartCommand peut bloquer l’interaction.
  2. Limitation de CATIA.StartCommand (selon la documentation Dassault Systèmes) :

    • La méthode StartCommand est conçue pour lancer une commande et l’exécuter jusqu’à sa première interaction. Elle n’est pas fiable pour les commandes interactives qui nécessitent des sélections ou des validations ultérieures (comme une boîte de dialogue de confirmation).
    • Extrait de la documentation DS : « StartCommand is useful to execute one-shot (not interactive) commands, it is not safe for interactive commands. » (Traduction : StartCommand est utile pour exécuter des commandes « à usage unique » (non interactives), elle n’est pas sûre pour les commandes interactives).
  3. Pourquoi SendKeys échoue :

    • Après CATIA.StartCommand("Désassemblage"), Catia affiche une boîte de dialogue qui attend une interaction utilisateur (clic sur OK, Entrée). StartCommand a fait son travail en lançant la commande et en affichant la boîte. Le code VBA suivant, y compris SendKeys, est exécuté, mais la boîte de dialogue n’est pas toujours prête à recevoir l’entrée simulée, ou le focus n’est pas correctement géré par SendKeys dans ce contexte.
  4. Solution Experte : Utiliser l’API Catia Automation :

    • La bonne pratique est d’éviter SendKeys pour interagir avec les boîtes de dialogue ou les commandes interactives dans Catia. SendKeys est une méthode de dernier recours, fragile et non robuste.
    • Pour automatiser des actions qui impliquent des boîtes de dialogue ou des interactions, il est impératif d’utiliser directement l’API (Application Programming Interface) de Catia Automation.
    • Chaque commande interactive de Catia a généralement des méthodes ou des propriétés équivalentes dans l’API qui permettent de la contrôler directement sans simuler d’interface utilisateur. Par exemple, pour un désassemblage, il faudrait rechercher les objets et méthodes liés aux assemblages (Product, ProductDocument, ProductService, etc.) et aux opérations de structure (comme RemoveComponent, Unlink, etc.) pour effectuer l’action de manière programmatique.

En résumé, le comportement observé est une conséquence de la conception de StartCommand et de la nature peu fiable de SendKeys pour l’automatisation d’interfaces graphiques. La solution robuste consiste à utiliser les méthodes et objets de l’API Catia Automation pour contrôler directement les fonctionnalités de Catia.