Aller au contenu

Messages recommandés

Posté(e)

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 avoir

Commande: !*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...

Posté(e)

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

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

Posté(e)

Salut,

merci (gile) pour ta réponse

merci 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...

Posté(e)

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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

  • 6 mois après...
Posté(e)

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 fonction

qui 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 if

juste 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 donc

les remettre en ordre à la fin ou en cas d'erreur.

 

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Posté(e)

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 matin

j'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...

  • 2 semaines après...
Posté(e)

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]

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité