marionsname Posté(e) le 12 mars 2007 Posté(e) le 12 mars 2007 Bonjour à tous, j'ai une fonction qui appelle d'autres fonctions comme suit : (defun c:f1 ()...(f2)...) (defun f2 ()...(f3)...) (defun f3 ()...(f4)...) et ainsi de suite. la fonction *error* est redéfinie différemment dans certaines des fonction (f2) (f3) (f4).... lorsque j'appuie sur ECHAPP ou sur ANNULER en cours d'exécution de la fonction c:f1 je voudrais qu'un fichier soit copié dans un endroit spécifique, le chemin du fichier original étant stocké dans une variable. quand je définie une fonction *error* à l'intérieur de la fonction c:f1 et comme la fonction *error est redefinie dans une des fonctions appelée, elle ne marche pas. y-a-t il d'autre alternative à la fonction *error* ? Merci
Patrick_35 Posté(e) le 12 mars 2007 Posté(e) le 12 mars 2007 SalutAvec les fonctions (vl-catch-all-apply ...) et (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
marionsname Posté(e) le 12 mars 2007 Auteur Posté(e) le 12 mars 2007 est-ce que ces fonctions s'appliquent aux évenements comme ECHAPP. Si j'ai bien compris ces fonctions s'appliquent à des fonctions dont le résultat peut être une erreur comme l'exemple dans l'aide de la division par zéro, et c'est surtout pour afficher des messages d'erreurs.ce que je veux quand la fonction est interrompue par un évenement quelconque comme ECHAPP qu'elle fasse la copie dont j'ai parlé. comment le faire avec ces deux fonctions. merci
Patrick_35 Posté(e) le 12 mars 2007 Posté(e) le 12 mars 2007 Oui, Esc génère un message d'erreur. Pour traiter l'erreur il faut utiliser (vl-catch-all-error-message ...) Un exemple dans lequel il est impossible de sortir de la boucle avec esc mais en tapant "Fin"(while (/= rep "Fin") (princ "\nEntrez un texte (Fin pour quitter) : ") (setq rep (vl-catch-all-apply 'getstring)) ) Un autre exemple pour traiter la sortie par "ESC"(setq rep nil) (while (/= rep "Fin") (princ "\nEntrez un texte (Fin/Esc pour quitter) : ") (setq rep (vl-catch-all-apply 'getstring)) (if (vl-catch-all-error-p rep) (if (member (vl-catch-all-error-message rep) (list "Fonction annulée" "Function cancelled")) (progn (princ "\nVous sortez de la fonction par ESC") (setq rep "Fin") ) (princ (strcat "\nErreur : " (vl-catch-all-error-message rep))) ) ) (princ) ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
marionsname Posté(e) le 14 mars 2007 Auteur Posté(e) le 14 mars 2007 Salut Patrick, je suppose la fonction suivante : (defun c:essai () (setq n (getstring "Tapez votre nom : ")) (setq p (getstring "Tapez votre prénom : ")) (princ (strcat "Votre nom complet est : " n " " p)) (princ) );defun je voudrais que si j'appuie sur ECHAPP en cours d'exécution soit au premier getstring soit au deuxième que la fonction c:essai exécute une tache en l'occurence affiche un message. avec ce qui suit ça ne marche pas (setq rep (vl-catch-all-apply 'essai)) (if (member (vl-catch-all-error-message rep) (list "Fonction annulée" "Function cancelled")) (princ "\nVous sortez de la fonction par ESC") (princ) );if (defun c:essai () (setq n (getstring "Tapez votre nom : ")) (setq p (getstring "Tapez votre prénom : ")) (princ (strcat "Votre nom complet est : " n " " p)) (princ) );defun comment faire?Merci Patrick
Patrick_35 Posté(e) le 14 mars 2007 Posté(e) le 14 mars 2007 SalutDe cette manière par exemple(defun question (msg / rep) (princ msg) (while (vl-catch-all-error-p (setq rep (vl-catch-all-apply 'getstring))) (alert "Vous devez effectuer la saisie.") (princ msg) ) rep ) (defun c:essai () (setq n (question "\nTapez votre nom : ")) (setq p (question "Tapez votre prénom : ")) (princ (strcat "Votre nom complet est : " n " " p)) (princ) ) Et si tu veux quelque chose de plus évolué(defun InputBox (Title Message Default / users1 value) (setq users1 (getvar "users1")) (acad-push-dbmod) (vla-eval (vlax-get-acad-object) (strcat "ThisDrawing.SetVariable \"USERS1\"," "InputBox (\"" Message "\", \"" Title "\", \"" Default "\")")) (setq value (getvar "users1")) (setvar "users1" users1) (acad-pop-dbmod) value ) (defun question (msg / rep) (setq rep "") (while (eq (setq rep (inputbox "Titre" msg "")) "") (alert "Vous ne pouvez pas annuler") ) rep ) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
marionsname Posté(e) le 15 mars 2007 Auteur Posté(e) le 15 mars 2007 Merci beaucoup Patrick, dans le premier exemple cette routine ne s'applique qu'à cette simple fonction de saisie de texte. mes fonctions sont plus complexes. Est-il possible d'ecrire du code qui s'applique à 1 ou plusieurs fonctions c: au moment de l'interruption de son exécution par Echap. ce code peut-il etre valable (while (vl-catch-all-error-p (setq rep (vl-catch-all-apply 'fonction c:))) Merci encore une fois
Patrick_35 Posté(e) le 15 mars 2007 Posté(e) le 15 mars 2007 Il faudrait plutôt l'écrire de cette manière (while (vl-catch-all-error-p (setq rep (vl-catch-all-apply 'ma_fonction)))) Ou si tu as des paramètres à transmettre à ta fonction (while (vl-catch-all-error-p (setq rep (vl-catch-all-apply 'ma_fonction (list param1 param2 ...))))) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
marionsname Posté(e) le 18 mars 2007 Auteur Posté(e) le 18 mars 2007 salut Patrick,je l'ai fait comme ça mais ça ne marche pas (defun essai () (command "_line") (princ) );defun essai (defun c:000 () (while (vl-catch-all-error-p (setq rep (vl-catch-all-apply 'essai))) (if (member (vl-catch-all-error-message rep) (list "Fonction annulée" "Function cancelled")) (princ "\nVous sortez de la fonction c:000 par ESC") (princ) );if ) );defun c:000
Patrick_35 Posté(e) le 21 mars 2007 Posté(e) le 21 mars 2007 SalutL'erreur il faut la gérer au niveau de la commande @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
marionsname Posté(e) le 22 mars 2007 Auteur Posté(e) le 22 mars 2007 dans le cas que j'ai donné, est-ce à l'interieur de la commande ligne ? si oui ça va être compliqué.sinon ne serait-il pas possible de gérer ça à l'intérieur de la commande c:essai? Merci Patrick
Patrick_35 Posté(e) le 26 mars 2007 Posté(e) le 26 mars 2007 Avec un peu de retard, désolé... (defun essai() (vl-catch-all-apply 'vl-cmdf (list "_.line")) )et sans le princ afin de renvoyer un message d'erreur éventuel @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
marionsname Posté(e) le 30 mars 2007 Auteur Posté(e) le 30 mars 2007 ça ne marche ni avec ça ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun F1 () (command "_line") (F2) );defun F1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun F2 () (command "_circle") );defun F2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun c:000 () (while (vl-catch-all-error-p (setq rep (vl-catch-all-apply 'essai))) (if (member (vl-catch-all-error-message rep) (list "Fonction annulée" "Function cancelled")) (princ "\nVous sortez de la fonction c:000 par ESC") (princ) );if ) );defun c:000 ni comme ça ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun F1 () (vl-catch-all-apply 'vl-cmdf (list "_.line")) (F2) );defun F1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun F2 () (vl-catch-all-apply 'vl-cmdf (list "_.circle")) );defun F2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun c:000 () (while (vl-catch-all-error-p (setq rep (vl-catch-all-apply 'essai))) (if (member (vl-catch-all-error-message rep) (list "Fonction annulée" "Function cancelled")) (princ "\nVous sortez de la fonction c:000 par ESC") (princ) );if ) );defun c:000 en fait (vl-catch-all-error-p (setq rep (vl-catch-all-apply 'essai))) ça donne comme resultat T pour rep et je ne vois pas l'utilité du 'vl-cmdf car ce dernier n'a d'utilité que si la fonction en question contient des arguments qui peuvent générer des erreurs, ce n'est pas le cas d'ECHAP. Merci
marionsname Posté(e) le 30 mars 2007 Auteur Posté(e) le 30 mars 2007 désolé F1 au lieu de essaiça ne marche ni avec ça ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun F1 () (command "_line") (F2) );defun F1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun F2 () (command "_circle") );defun F2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun c:000 () (while (vl-catch-all-error-p (setq rep (vl-catch-all-apply 'F1))) (if (member (vl-catch-all-error-message rep) (list "Fonction annulée" "Function cancelled")) (princ "\nVous sortez de la fonction c:000 par ESC") (princ) );if ) );defun c:000 ni comme ça ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun F1 () (vl-catch-all-apply 'vl-cmdf (list "_.line")) (F2) );defun F1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun F2 () (vl-catch-all-apply 'vl-cmdf (list "_.circle")) );defun F2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun c:000 () (while (vl-catch-all-error-p (setq rep (vl-catch-all-apply 'F1))) (if (member (vl-catch-all-error-message rep) (list "Fonction annulée" "Function cancelled")) (princ "\nVous sortez de la fonction c:000 par ESC") (princ) );if ) );defun c:000 en fait (vl-catch-all-error-p (setq rep (vl-catch-all-apply 'F1))) ça donne comme resultat T pour rep et je ne vois pas l'utilité du 'vl-cmdf car ce dernier n'a d'utilité que si la fonction en question contient des arguments qui peuvent générer des erreurs, ce n'est pas le cas d'ECHAP. Merci
Patrick_35 Posté(e) le 30 mars 2007 Posté(e) le 30 mars 2007 Ah oui, exactJe n'ai pas été jusqu'au bout :( J'utilise le vl-cmdf afin qu'il fonctionne avec vl-catch-all-apply, ce qui n'est pas le cas avec un command.Dans l'utilisation de ton command, désolé, mais je n'ai pas de solution pour l'instant. @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
marionsname Posté(e) le 3 avril 2007 Auteur Posté(e) le 3 avril 2007 ça à l'ai pas compliqué comme même, j'ai parcouru l'aide mais j'ai rien trouvé. dommage que cela ne soit pas possible en lisp.merci Patrick ;)
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