Aller au contenu

Messages recommandés

Posté(e)

Salut

Je ne connais pas grand chose en lisp

j'ai recupere un lisp

pour memoriser l'etat du calque courant

cote dans un autre calque (cotation)et revenir ensuite au precedent calque

le probleme c'est en utilsant escape

il reste dans le calque cotation

j'ai vu sur le forum differentes reponses mais moi ca marche pas chez moi

le 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 cotation

il me met

Commande: ; erreur: Fonction annulée

mystere pour moi

donc si quelqu'un peut m'aider

Posté(e)

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

Posté(e)

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

Posté(e)

effectivement j'ai plus d'option et c'est plus clair

merci

je viens de changer tous ca

par contre j'ai voulu faire pareil pour la commande qdim

et il ne reagit pas comme la commande qdim direct autocad quand je passe par le lisp

le 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 coter

alors que par le lisp c'est un objet unique :casstet:

Posté(e)

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

Posté(e)

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

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é