Aller au contenu

Messages recommandés

Posté(e)

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

Posté(e)

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

Posté(e)

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 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,

 

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

 

Posté(e)

Salut

De 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 Patrick

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

Joseph Joubert, 1754-1824

Posté(e)

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

Posté(e)

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 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,

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

 

 

Posté(e)

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

 

Posté(e)

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 Patrick

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

Joseph Joubert, 1754-1824

Posté(e)

ç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

Posté(e)

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

 

Posté(e)

Ah oui, exact

Je 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 Patrick

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

Joseph Joubert, 1754-1824

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é