J’ai une fonction LISP de gestion d’erreurs qui fonctionne parfaitement dans l’espace objet d’AutoCAD pour réinitialiser mes variables. Cependant, lorsque je l’utilise dans l’espace papier, la réinitialisation échoue et je reçois l’erreur « INTERNAL error in FAIL\nmessage lost, reset to top ». Comment puis-je résoudre ce problème ?
L’erreur « INTERNAL error in FAIL » en espace papier lors de la réinitialisation des variables LISP est généralement due à la tentative de manipuler des variables système ou d’exécuter des commandes (comme _SetDimStyleCurrent) qui sont spécifiques à l’espace objet ou nécessitent un contexte de viewport actif non présent. La gestion d’erreurs globale via initerr/trap est moins robuste que des approches locales.
Solution et Bonnes Pratiques (recommandées par Gilles Chanteau):
- Débogage et identification de la cause racine:
- Pour localiser l’erreur, copiez le contenu de vos fonctions
initerrettrapdirectement dans la console Visual LISP ou la ligne de commande d’AutoCAD depuis l’espace papier. Cela révélera l’instruction exacte qui échoue. - Si
_SetDimStyleCurrentest en cause, sachez qu’elle ne peut pas être spécifiée en espace papier sans qu’une fenêtre flottante (viewport) soit active.
- Pour localiser l’erreur, copiez le contenu de vos fonctions
- Adapter les commandes à l’espace papier:
- Si une commande ou une variable système requiert un viewport actif en espace papier, assurez-vous qu’un viewport est sélectionné. Une astuce consiste à utiliser
(setvar "cvport" (getvar "cvport"))pour forcer la reconnaissance du viewport courant avant l’exécution de la commande problématique. - Évitez de manipuler des variables système spécifiques à l’espace objet si elles n’ont pas de sens ou ne sont pas gérées pour l’espace papier.
- Si une commande ou une variable système requiert un viewport actif en espace papier, assurez-vous qu’un viewport est sélectionné. Une astuce consiste à utiliser
- Optimiser la gestion des variables système avec
ai_sysvar:- Utilisez la fonction
ai_sysvar(disponible dansacaddoc20XX.lspde votre installation AutoCAD, ex:C:\Program Files\Autodesk\AutoCAD 20XX\Support\fr-FR\acaddoc20XX.lsp). Cette fonction permet de modifier des variables système en sauvegardant automatiquement leur valeur précédente pour une restauration facile. - Exemple:
(ai_sysvar "CMDECHO" 0)pour désactiver l’écho, et(ai_sysvar "CMDECHO")sans argument pour restaurer la valeur initiale.
- Utilisez la fonction
- Redéfinir la fonction
*error*localement:- Plutôt que des fonctions globales
initerr/trap, redéfinissez la fonction système*error*au début de votre routine LISP. Cela permet une gestion d’erreurs spécifique à votre programme, isolant les modifications et évitant les effets de bord. - Exemple de structure (par Gilles Chanteau):
(defun c:MaCommande (/ old_error) (setq old_error *error*) ; Sauvegarder l'ancienne fonction *error* (setq *error* (lambda (msg) (if (not (wcmatch (strcase msg) "*BREAK*,*QUIT*,*EXIT*")) (princ (strcat "\nErreur: " msg)) ) ;; Votre code de nettoyage spécifique ici (setq *error* old_error) ; Restaurer l'ancienne fonction *error* (princ) ) ) ;; Votre code principal de commande LISP (princ "\nCommande exécutée avec succès.") (setq *error* old_error) ; Restaurer l'ancienne fonction *error* à la fin normale (princ) )
- Plutôt que des fonctions globales
- Gestion avancée des erreurs et annulations:
- Pour des scénarios d’erreurs plus complexes, explorez les fonctions
vl-catch-all-apply,vl-catch-all-error-petvl-catch-all-error-messagequi permettent de capturer les erreurs sans interrompre le programme. - Pour une gestion robuste des groupes d’annulation, utilisez les fonctions
ai_undo_pushetai_undo_popégalement disponibles dansacaddoc20XX.lsp.
- Pour des scénarios d’erreurs plus complexes, explorez les fonctions