Bred Posté(e) le 8 février 2008 Posté(e) le 8 février 2008 Salut,J'ai un souci sur un type d'erreur que je n'arrive pas à gérer : une "saisie de la boucle d'arrêt clavier"... Voici un lisp test (le gestion d'erreur est inutile, et le lisp pas performant, mais c'est pour l'exemple....)(defun c:ttt (/ I SS) (vla-startundomark (vla-get-activedocument (vlax-get-acad-object))) ;Gestion d'erreur (defun err-ttt (msg) (if (or (= msg "Fonction annulée")(= msg "Function cancelled") (= msg "quitter / sortir abandon")(= msg "quit / exit abort")) (princ) (princ (strcat "\nErreur: " msg))) (princ "\n OK !!!") (setq *error* *error-Acad* *error-Acad* nil) (vla-endundomark (vla-get-activedocument (vlax-get-acad-object))) (princ) ) ; Chargement Gestion d'erreur (setq *error-Acad* *error* *error* err-ttt) (setq ss (ssget)) (repeat (setq i (sslength ss)) (vla-put-color (vlax-ename->vla-object (ssname ss (setq i (1- i)))) 2) ) (setq *error* *error-Acad* *error-Acad* nil) (vla-endundomark (vla-get-activedocument (vlax-get-acad-object))) (princ) ) ... Le but est de créer une erreur avant que la commande se termine, donc lancer le lisp en sélectionnant 4000 lignes par exemple....Si vous faites un "Escape" avant la fin de la commande, la gestion d'erreur ne se lance pas, et donc elle n'est pas réinitialisé ! (taper "!*error* dans la ligne de commande après, vous devrez avoirCommande: !*error*#< USUBR @0a18a848 ERR-TTT >... étant "ma" gestion d'erreur... plus celle d'Acad !!!! ... Vous faites comment ???? merci ! [Edité le 8/2/2008 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 8 février 2008 Posté(e) le 8 février 2008 Salut, Si "Echap" génère une erreur, la "saisie de la boucle d'arrêt clavier" semble ne pas en générer.Je fais le même genre de gestion d'erreur quand je pense que c'est vraiment indispensable (modification de variable par exemple). Mais j'essaye de l'utiliser le moins souvent possible (vl-catch-all-apply permet souvent de "passer en force"). De plus, j'évite aussi, quand je peux, de créer un groupe Undo, si celui-ci n'est refermé et qu'on annule quand même ça plante irrémédiablement AutoCAD. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 9 février 2008 Posté(e) le 9 février 2008 Salut Bred J'ai testé ton lisp et ça fonctionne correctement :casstet: La manière que j'ai utilisé et l'utilisation de la touche echap lors de la sélection Commande: !*error*#<SUBR @0afb53fc *ERROR*>(setq *error-Acad* *error*(_> *error* err-ttt)#<SUBR @0aff95b4 ERR-TTT>Commande: !*error*#<SUBR @0aff95b4 ERR-TTT>Commande: (setq ss (ssget))Choix des objets: *Annuler* OK !!!Commande: !*error*#<SUBR @0afb53fc *ERROR*> Je ne vois pas où est l'erreur ? @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 9 février 2008 Posté(e) le 9 février 2008 Salut Patrick_35, Si tu fais Echap au lieu de sélectionner les objets c'est OK, mais si tu fais Echap pendant le :(setq ss (ssget))(repeat (setq i (sslength ss))(vla-put-color (vlax-ename->vla-object (ssname ss (setq i (1- i)))) 2))(il faut avoir sélectionné suffisamment d'objet pour avoir le temps), tu provoques une "saisie de la boucle d'arrêt clavier" et là ça marche plus. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 11 février 2008 Auteur Posté(e) le 11 février 2008 Salut,merci (gile) pour ta réponsemerci Patrick_35 pour ta participation, mais tu ne dois pas faire la bonne manip.... Je suis obligé d'utiliser une gestion d'erreur dans mon lisp initial car je change des variables qui doivent être absolument remisent en l'état... sans parler du résultat.... Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Patrick_35 Posté(e) le 11 février 2008 Posté(e) le 11 février 2008 mais tu ne dois pas faire la bonne manip.... Si, mais je n'avais pas été jusqu'au changement de couleur.Et si l'erreur vient de cette ligne, la réponse de (gile) est pertinente. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bseb67 Posté(e) le 5 septembre 2008 Posté(e) le 5 septembre 2008 Salut! Je viens aussi de découvrir que la gestion d'erreur est limitée :( .J'ai redéfini *error* par une autre fonction, dans celle-ci j'appelle une autre fonctionqui fait des princ, des if, des commandes et des setvar. Si je fait échap dans une boucle, ma fonction erreur se lance bien, mais stop au premier ifjuste après mon princ. j'ai alors essayer en mettant un vla-catch-all-apply, sur la fonction qui mouline avec des boucles,et bien le résultat et le même, j'ai bien mon princ, puis plus rien. :mad: Ca m'énerve :mad: . Car au début de chaque fonction, je modifie des choses, et veux doncles remettre en ordre à la fin ou en cas d'erreur. Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
Patrick_35 Posté(e) le 5 septembre 2008 Posté(e) le 5 septembre 2008 Salut Tu peux gérer ton erreur avec (vl-catch-all-error-p ...) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bseb67 Posté(e) le 8 septembre 2008 Posté(e) le 8 septembre 2008 salut patrick_35! Tu peux gérer ton erreur avec (vl-catch-all-error-p ...) est bien c'est ce que je fais, mais ca marche pas :mad: un exemple tout bête: (defun c:prout() (foreach elem (selection_to_liste (ssget "x")) (command "zoom" "ob" elem "") ) (getpoint) ) (defun c:lprout() (if (= (vl-catch-all-error-p (setq res (vl-catch-all-apply 'c:prout nil))) t) (*error*) ) ) ; c:lprout avec un remplacement de *error* par ma fonction perso,si je fais un un échap dans la boucle foreach il n'exécute pas complètement ma fonction d'erreur.par contre dans le getpoint c'est ok => ca c'était vendredi, je n'ai rien changé au code, et ce matinj'essaye pendant que j'écris ce post, et là ca marche ! :o Bon, ben j'espère que ca reste comme ca. Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
Bruno_T Posté(e) le 20 septembre 2008 Posté(e) le 20 septembre 2008 bonjour, (defun err-ttt (msg) (vla-endundomark (vla-get-activedocument (vlax-get-acad-object))) (princ (strcat "\nErreur: ")) (princ msg) (setq *error* *error-Acad* *error-Acad* nil) (princ) ) (defun c:ttt (/ ss i *error-Acad*) ; initialization (setq *error-Acad* *error* *error* err-ttt) (vla-startundomark (vla-get-activedocument (vlax-get-acad-object))) ; main test (setq ss (ssget)) (repeat (setq i (sslength ss)) (vla-put-color (vlax-ename->vla-object (ssname ss (setq i (1- i)))) 2) ) ; exit (vla-endundomark (vla-get-activedocument (vlax-get-acad-object))) (setq *error* *error-Acad*) (princ) ) Bruno Toniutti [Edité le 20/9/2008 par Bruno_T]
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant