coxsurf56 Posté(e) le 5 janvier 2007 Posté(e) le 5 janvier 2007 SalutJe ne connais pas grand chose en lispj'ai recupere un lisp pour memoriser l'etat du calque courantcote dans un autre calque (cotation)et revenir ensuite au precedent calquele probleme c'est en utilsant escapeil reste dans le calque cotationj'ai vu sur le forum differentes reponses mais moi ca marche pas chez moile code (defun c:CB () (setq Calq (getvar "CLAYER")) (setvar "CLAYER" "COTATION") (command "_DIMLINEAR" Pause Pause Pause) (setvar "CLAYER" Calq) (princ) ) la modification suivant les info recupere sur le forum ;;; INTRODUCTION du PROGRAMME - Redéfinition de *error* (defun INTRO_PRG_ERR () (vla-StartUndoMark (vla-get-ActiveDocument (vlax-get-acad-object))) (SAVE&SET_VAR "cmdecho" 0) (command "_undo" "_mark") (setq Sauv_EXerror *error*) ; enregistrement *error* autocad ; Enregistrement du environnement Actif (SCU / Calque /... (setq list_env_actif (list (getvar "ucsorg") (getvar "ucsxdir") (getvar "ucsydir") (getvar "ucsicon") (getvar "clayer") (getvar "orthomode") (getvar "osmode"))) ; Gestion des Erreur remplaçant celle d'Autocad (setq *error* REDEF_ERROR) ) ;;; ROUTINE de GESTION des ERREURS remplaçant celle d'Autocad (defun REDEF_ERROR (msg) (if (or (= msg "Fonction annulée") (= msg "Function cancelled") (= msg "quitter / sortir abandon") (= msg "quit / exit abort")) (princ) (princ (strcat "\nErreur: " msg)) ) (command "_undo" "_back") (END_PRG_ERR) ) ;;; ROUTINE ENREGISTREMENT VARIABLE+MODIF VARIABLE ((gile) cadXP) (defun SAVE&SET_VAR (var val) (cond ((getvar var) (setq SavedSysVarLst (cons (list 'setvar var (getvar var)) SavedSysVarLst)) (if val (setvar var val))) ) ) (defun c:CB () (setq Calq (getvar "CLAYER")) (setvar "CLAYER" "COTATION") (command "_DIMLINEAR" Pause Pause Pause) (setvar "CLAYER" Calq) (princ) ) ;;; RESTORE_VAR ;;; Restaure leurs valeurs initiales aux variables système de "SavedSysVarLst" ;;; ;;; ex: (RESTORE_VAR) ;;; -> (getvar "orthomode") : 0 ;;; -> (getvar "autosnap") : 63 ;;; -> SavedSysVarLst : nil (defun restore_var () (mapcar 'eval SavedSysVarLst) (setq SavedSysVarLst nil) ) ;;; FIN de PROGRAMME - ; retour *error* initial (defun END_PRG_ERR () ; Restauration de l'environnement Actif enregistré (command "_ucs" "_w" "_ucs" "_3" "_non" '(0 0 0) "_non" (nth 1 list_env_actif) "_non" (nth 2 list_env_actif) "_ucs" "_o" "_non" (trans (nth 0 list_env_actif) 0 1)) (setvar "ucsicon" (nth 3 list_env_actif)) (setvar "clayer" (nth 4 list_env_actif)) (setvar "orthomode"(nth 5 list_env_actif)) (setvar "osmode" (nth 6 list_env_actif)) (mapcar 'eval SavedSysVarLst) ;remise à nil (setq *error* Sauv_EXerror list_env_actif nil SavedSysVarLst nil Sauv_EXerror nil scu_init nil) (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-acad-object))) )quand je l'utilise ,ca ne marche pas quand je fais escape ,il reste dans cotationil me met Commande: ; erreur: Fonction annuléemystere pour moidonc si quelqu'un peut m'aider
Bred Posté(e) le 5 janvier 2007 Posté(e) le 5 janvier 2007 Salut,tout ce que tu as copier à pour principe de créer une gestion d'erreur "universel"....si tu à beaucoup de lisp, tu peux t'en servir en routine, mais il faut que tu modifies ton code comme suit : (defun c:CB () (INTRO_PRG_ERR) (setq Calq (getvar "CLAYER")) (SAVE&SET_VAR "CLAYER" "COTATION") (command "_DIMLINEAR" Pause Pause Pause) (setvar "CLAYER" Calq) (princ) (END_PRG_ERR) ) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
bonuscad Posté(e) le 5 janvier 2007 Posté(e) le 5 janvier 2007 Je pense pas que tu ais besoin d'une gestion d'erreur si complexe pour ton petit programme, ton problème étant seulement de remettre la variable "CLAYER" a son état initial.Je te conseille aussi l'usage de la variable "CMDACTIVE" au lieu des 3 pauses, cela te laissera plus de liberté dans la commande cotation Voici ce que ton prog aurait pu être simplement (defun c:CB ( / Calq old_err) (defun err_cb (ch / ) (setvar "CLAYER" Calq) (setq *error* old_err) (prin1) ) (setq Calq (getvar "CLAYER") old_err *error* *error* err_cb ) (setvar "CLAYER" "COTATION") (command "_.DIMLINEAR") (while (not (zerop (getvar "CMDACTIVE"))) (command pause) ) (setvar "CLAYER" Calq) (setq *error* old_err) (princ) ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
coxsurf56 Posté(e) le 5 janvier 2007 Auteur Posté(e) le 5 janvier 2007 effectivement j'ai plus d'option et c'est plus clairmercije viens de changer tous ca par contre j'ai voulu faire pareil pour la commande qdimet il ne reagit pas comme la commande qdim direct autocad quand je passe par le lisple code (defun c:QD ( / Calq old_err) (defun err_QD (ch / ) (setvar "CLAYER" Calq) (setq *error* old_err) (prin1) ) (setq Calq (getvar "CLAYER") old_err *error* *error* err_QD ) (setvar "CLAYER" "COTATION") (command "_qdim") (while (not (zerop (getvar "CMDACTIVE"))) (command pause) ) (setvar "CLAYER" Calq) (setq *error* old_err) (princ) ) dans autocad qdim ou _qdim je peux faire une fenetre de selection pour choisir les objet a coteralors que par le lisp c'est un objet unique :casstet:
bonuscad Posté(e) le 5 janvier 2007 Posté(e) le 5 janvier 2007 En effet la commande Qdim n'accepte pas une selection multiple :( Mai on peut contourner le problème comme suit: (defun c:QD ( / Calq old_err js) (defun err_QD (ch / ) (setvar "CLAYER" Calq) (setq *error* old_err) (prin1) ) (setq Calq (getvar "CLAYER") old_err *error* *error* err_QD ) (setvar "CLAYER" "COTATION") (princ "\nChoix des objet à coter.") (setq js (ssget)) (if js (progn (command "_.qdim" js "") (while (not (zerop (getvar "CMDACTIVE"))) (command pause) ) ) ) (setvar "CLAYER" Calq) (setq *error* old_err) (princ) ) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
Bred Posté(e) le 5 janvier 2007 Posté(e) le 5 janvier 2007 ... un autre manière sans utiliser de gestion erreur (defun c:CB () (command "_.DIMLINEAR") (while (not (zerop (getvar "CMDACTIVE"))) (command pause) ) (command "_change" (entlast) "" "p" "ca" "cotation" "") (princ) ) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
coxsurf56 Posté(e) le 5 janvier 2007 Auteur Posté(e) le 5 janvier 2007 :)TOP Rien a direreste plus qu'a trouver un lisp qui me serve un cafe!!!
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