Aller au contenu

(ma) Gestion d\'Erreur ...


Messages recommandés

Posté(e)

Salut,

ce message fait suite à celui-ci http:// http://www.cadxp.com/XForum+viewthread-fid-100-tid-10775-page-2.html qui commençait à denenir "chargé" ...

 

Le but de ce message étant de réaliser une routine de gestion des erreur+Remise initial de l'environnement en fin de programme...

 

Donc, grâce à l'aide de [surligneur] (gile) et de Patrick_35[/surligneur], je suis arrivé à ceci (il ne reste plus grand chose de mon code original, mais c'est tellement bien ce que l'on me propose que je suis obligé de m'en servir) :

 

 ;;; INTRODUCTION du PROGRAMME - Redéfinition de *error*
(defun INTRO_PRG_ERR ()
 (SAVE&SET_VAR "cmdecho" 0)
  [b] (command "_.undo" "_m")  ;;; marque undo[/b]
 
 (setq Sauv_EXerror *error*) ; enregistrement *error* autocad
 
 ; Enregistrement du environnement Actif (SCU / Calque /...
 (setq list_env_actif (list (getvar "ucsicon")
		     (getvar "clayer")
		     (getvar "orthomode")
		     (getvar "osmode")))
 ;Enregistrement su SCU
 (if (= "" (getvar "UCSNAME"))
   (setq scu_init
   (vla-add (vla-get-UserCoordinateSystems
	      (vla-get-ActiveDocument (vlax-get-acad-object)))
	    (vlax-3d-point (trans '(0 0 0) 1 0))
	    (vlax-3d-point (trans '(1 0 0) 1 0))
	    (vlax-3d-point (trans '(0 1 0) 1 0)) "SCU_init"))
   (setq scu_init (vla-get-ActiveUCS
	     (vla-get-ActiveDocument (vlax-get-acad-object)))))  
 ; 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))
   )
 (mapcar 'eval SavedSysVarLst)
   [b] (command "_.undo" "_b")   [/b]  
)

;;; 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)))
   )
)

;;; FIN de PROGRAMME - ; retour *error* initial
(defun END_PRG_ERR ()
 ; Restauration des Variables modifiables enregistrer avec SAVE&SET_VAR
 (mapcar 'eval SavedSysVarLst)
 
 ; Restauration de l'environnement Actif enregistré
 (vla-put-activeucs (vla-get-activedocument (vlax-get-acad-object)) scu_init)
 (vla-delete scu_init)
 
 (setvar "ucsicon" (nth 0 list_env_actif))
 (setvar "clayer" (nth 1 list_env_actif))
 (setvar "orthomode"(nth 2 list_env_actif))
 (setvar "osmode" (nth 3 list_env_actif))
 
 (setq *error* Sauv_EXerror
list_env_actif nil
SavedSysVarLst nil
Sauv_EXerror nil
scu_init nil)
 
  (command "_.undo" "_end")  ; fin undo
)

 

... il suffit de mettre (INTRO_PRG_ERR) en début de lisp, puis (END_PRG_ERR) en fin, en utilisant dans le lisp (SAVE&SET_VAR "variable" nouv-valeur) pour modifier des variables...

 

... et bien j'ai une erreur que je ne comprend pas : si je fais déroulé mon lisp jusqu'à la fin sans erreur, il en active une, et donc annule tout la dernière commande.

L'erreur en ligne de commande est :

Erreur: Erreur Automation Objet référencé par un ou plusieurs autres

objets_.undo Paramètres courants: Auto = Activé, Contrôle = Tous, Associer = Oui

Entrez le nombre d'opérations à annuler ou

[Auto/Contrôle/Début/Fin/Marque/Retour] <1>: _b

 

... merci de votre aide

 

 

 

[Edité le 5/7/2006 par Bred]

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Salut,

 

Il me semble qu'il y a deux erreurs, celle qui provoque le lancement de ta routine d'erreur c'est :

 

(vla-put-activeucs (vla-get-activedocument (vlax-get-acad-object)) scu_init)

(vla-delete scu_init)

 

J'avais précisé ici (réponse 7 deuxième page) :

- le SCU ne pas être actif sinon, impossible de le supprimer.

 

Ensuite dans ta redéfinition de *error*, tu fais (command "_.undo" "_b") ce qui démarre un nouveau groupe undo au lieu de fermer celui qui est ouvert.

 

Sinon ta gestion des erreurs ne restaure pas le SCU initial par exemple, je disais qu'en règle générale la fin de la routine de gestion d'erreur et de la routine principale sont semblables, tu pourrais par exemple glisser (END_PRG_ERR ) à la fin de ta routine de gestion d'erreur.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

merci (gile)

mea-culpa, je me suis précipité sur les commandes -vl sans faire attention ... par souci de compréhension je vais revenir avec les (command ...) ...

 

Par contre, concernant les undo : j'ai mis un (command "_.undo" "_b") , en pensant que _b" était pour "beginning" (retour)... donc je fait une "marque" en introduction du lisp (command "_.undo" "_m"), et si le message d'erreur se lance, le _undo "_b" fait un retour à ma marque précédente (en tout début de lisp donc), et rétablis toutes les modifs faites jusque-là, donc je n'ai pas besoin de lancer une procédure "compliqué" de remise de SCU ou autre, vu que le _undo le fait.

 

... j'ai tort ???

 

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Pour la compréhension du code, il vaut mieux mettre les options en entier.

"_.Undo" "_begin" -> debut

"_.Undo" "_back" -> retour

 

"_begin" va avec "_end"

et

"_mark" avec "_back"

 

Avec "_Undo", il est bien aussi de controler la variable "UndoCtl" (lecture seule) et suivant sa valeur, parametrer la commande "_.Undo" avec "_Control", sous peine de voir les appels à la commande "_.undo" échouer dans le lisp.

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

- merci bonuscad -

 

... alors, en "tripatouillant" tout ça et en faisant quelque tests, je pense être arrivé à quelque chose de pas mal (en fait c'est une synthèse de tous vos conseils que j'ai remis à plat petit à petit...):

 

 ;;; 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)
  [b] (command "_undo" "_mark")[/b]
 
 (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))
   )
  [b] (command "_undo" "_back")
 (END_PRG_ERR)[/b]
)

;;; 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)))
   )
)

;;; 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)))
 
)

 

Donc, pour expliquer ma logique (que j'espère juste) :

1 - Je lance une routine d'introduction (INTRO_PRG_ERR) qui me créé un départ d'undo en -vl (donc pas écrit en ligne de commande), je met "cmdecho à 0, et je créé une marque d'annulation, puis enregistrement des variables actives et remplacement de *error* ...

 

2- J'écris mon lisp en rentrant les variables modifiés avec SAVE&SET_VAR (gile) ...

 

3 - Si le lisp se passe bien, je vais jusqu'à (END_PRG_ERR) qui me réinitialise toutes mes modification d'état d'autocad, et créé une fin d'undo en -vl (pas écrit en ligne de commande donc)...

 

4 - Si j'ai une erreur (echap...) ma routine (REDEF_ERROR) se lance, [surligneur] retourne à la marque undo de (INTRO_PRG_ERR) et puis lance à la suite (END_PRG_ERR) [/surligneur](voir ci-dessus) ... afin de supprimer toutes les actions réaliser depuis le début du lisp (dessins, modifications, etc...)

 

... en fait j'avais un doute sur : retour à la marque / puis le (END_PRG_ERR), mais ça à l'air de fonctionner ...

 

Je suis prêt aux critiques... (heu... soyez sympa quand-même !!!!....)

merci

 

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

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é