Aller au contenu

mise à zero valeur et pb case vide dcl


Messages recommandés

Posté(e)

bonjour, et bon année 2012

 

dans un dcl j'ai 16 cases a remplir

quand le les remplis toute la premiere dois pas de probleme

par contre quand j'en laisse des vides ca plante

de plus il ne reinitialise pas les valeurs, il me semble pourtant l'avoir fais

donc quand je relance le lisp il y a des restes

si quelqu'un peux m'aider a trouver mon erreur

 

le code dcl (nom du fichier :massifdcl.dcl)

massif : dialog 
{label="massif";
:boxed_radio_column {label="Hypothèses";key= "hypo";edit_width=1;fixed_width=true;height=1;fixed_height=false;
		
:row {	:radio_button {label="carre";key= "carre";edit_width = 6;}
:radio_button {label="rond";key= "rond";edit_width = 6;}
	}
:row {	:edit_box {label="taux de travail du sol:2.5";key=tauxd;edit_width = 6;}
	:edit_box {label="Profondeur en m:2.5";key=profd;edit_width = 6;}
	}}		
		
:boxed_column {label="Lg1";edit_width=1;fixed_width=true;height=1;fixed_height=false;

:row {	:edit_box {label="Longueur du vide:";key=lglg1d;edit_width = 6;}
	:edit_box {label="Charge G:";key=chg1d;edit_width = 6;}
	:edit_box {label="Charge Q:";key=chq1d;edit_width = 6;}
	      }}
:boxed_column {label="Lg2";edit_width=1;fixed_width=true;height=1;fixed_height=false;

:row {	:edit_box {label="Longueur du vide:";key=lglg2d;edit_width = 6;}
	:edit_box {label="Charge G:";key=chg2d;edit_width = 6;}
	:edit_box {label="Charge Q:";key=chq2d;edit_width = 6;}
	      }}
:boxed_column {label="Lg3";edit_width=1;fixed_width=true;height=1;fixed_height=false;

:row {	:edit_box {label="Longueur du vide:";key=lglg3d;edit_width = 6;}
	:edit_box {label="Charge G:";key=chg3d;edit_width = 6;}
	:edit_box {label="Charge Q:";key=chq3d;edit_width = 6;}
	      }}
:boxed_column {label="Lg4";edit_width=1;fixed_width=true;height=1;fixed_height=false;

:row {	:edit_box {label="Longueur du vide:";key=lglg4d;edit_width = 6;}
	:edit_box {label="Charge G:";key=chg4d;edit_width = 6;}
	:edit_box {label="Charge Q:";key=chq4d;edit_width = 6;}
	      }}
:boxed_column {label="charge complementaire";edit_width=1;fixed_width=true;height=1;fixed_height=false;

:row {	:edit_box {label="Charge G:";key=chgad;edit_width = 6;}
	:edit_box {label="Charge Q:";key=chqad;edit_width = 6;}
	      }}
   			            
    :row {ok_cancel;}
    :row {errtile;}
} 

 

le lisp (non du fichier: massif.lsp)

(defun massif()


  	(setq dcl (load_dialog "massifdcl.dcl")) 			
  	(if (not (new_dialog "massif" dcl)) (exit))
     		(action_tile "carre"  "(setq choix \"carre\")")
 		(action_tile "rond"  "(setq choix \"rond\")")
 		(action_tile "tauxd" "(setq tauxda $value)")
 		(action_tile "profd" "(setq profda $value)")
		(action_tile "lglg1d" "(setq lglg1da $value)")
 		(action_tile "chg1d" "(setq chg1da $value)")
		(action_tile "chq1d" "(setq chq1da $value)")
		(action_tile "lglg2d" "(setq lglg2da $value)")
 		(action_tile "chg2d" "(setq chg2da $value)")
		(action_tile "chq2d" "(setq chq2da $value)")
		(action_tile "lglg3d" "(setq lglg3da $value)")
 		(action_tile "chg3d" "(setq chg3da $value)")
		(action_tile "chq3d" "(setq chq3da $value)")
		(action_tile "lglg4d" "(setq lglg4da $value)")
 		(action_tile "chg4d" "(setq chg4da $value)")
		(action_tile "chq4d" "(setq chq4da $value)")
		(action_tile "chgad" "(setq chgada $value)")
		(action_tile "chqad" "(setq chqada $value)")
		(action_tile "accept" "(done_dialog 1)") 
 		(action_tile "cancel" "(done_dialog 0)")
		(setq test 1)

(setq ok  (start_dialog)) 						
(unload_dialog dcl)
  
  (princ)
  
)

;;; Routine principale

(defun c:maa(/ lglg1 chg1 chq1 lglg2 chg2 chq2 lglg3 chg3 chq3 lglg4 chg4 chq4 chga chqa)
;; Sauvegarder les variables AutoCAD 
 (defun svgvar	()
   (setq cc  (getvar "clayer")
  cmd (getvar "cmdecho")
  osm (getvar "osmode")
   )
   (setq test 2)
    )
;; Restaurer les variables AutoCAD 
 (defun resvar	()
   (setvar "clayer" cc)
   (setvar "cmdecho" cmd)
   (setvar "osmode" osm)
     )
;; Redéfinition de la fonction *error*
 (defun *error* ()
  (princ (strcat "\nErreur: " msg))	; renvoie un msg d'erreur
   (resvar)				; Restore les variables AutoCAD 
   (princ)				; Quitte silencieusement
 )
;; Début du programme principal
 (svgvar)


	(setvar "OSMODE" 0) ;; pas d'accrochage aux objets
 

   (massif)


(command "filedia" "1")
 	;(setq choix 1)
(setq taux(atoi tauxda))
(setq prof(atoi profda))
(setq lglg1(atoi lglg1da))
(setq chg1(atoi chg1da))
(setq chq1(atoi chq1da))
(setq lglg2(atoi lglg2da))
(setq chg2(atoi chg2da))
(setq chq2(atoi chq2da))
(setq lglg3(atoi lglg3da))
(setq chg3(atoi chg3da))
(setq lglg4(atoi lglg4da))
(setq chg4(atoi chg4da))
(setq chq4(atoi chq4da))
(setq chga(atoi chgada))
(setq chq3(atoi chq3da))
(setq chqa(atoi chqada))
(setq mabe 2500);;masse volumique beton
 	(setq test 5)
   	(if (= taux 0)
  (progn;alors
    (setq taux 2.5))
  (progn;sinon
    (setq test1 1)))
 	(if (= prof 0)
  (progn;alors
    (setq prof 2.5))
  (progn;sinon
    (setq test1 2)))
 
(setq mapt(getpoint "\npoint d'insertion : "))
(command "scu" mapt "")
(if (and (> chg1 0) (> chg2 0))
  (progn;alors
    (setq atest 6)
    (setq cg1(+(+(*(+(*(/ lglg1 2) chg1 0.01) (*(/ lglg2 2) chg2 0.01)) 1.15))))
    (setq cq1(+(+(*(+(*(/ lglg1 2) chq1 0.01) (*(/ lglg2 2) chq2 0.01)) 1.15))))
         )
  (progn;sinon
    (setq atest 7)
    (setq cg1(+(+(+(*(/ lglg1 2) chg1 0.01) (*(/ lglg2 2) chg2 0.01)))))
    (setq cq1(+(+(+(*(/ lglg1 2) chq1 0.01) (*(/ lglg2 2) chq2 0.01)))))
  )
)
   	(if (and (> chg3 0) (> chg4 0))
  (progn;alors
    (setq atest 8)
    (setq cg2(+(+(*(+(*(/ lglg3 2) chg3 0.01) (*(/ lglg4 2) chg4 0.01)) 1.15))))
    (setq cq2(+(+(*(+(*(/ lglg3 2) chq3 0.01) (*(/ lglg4 2) chq4 0.01)) 1.15))))
         )
  (progn;sinon
    (setq atest 9)
           (setq cg2(+(+(+(*(/ lglg3 2) chg3 0.01) (*(/ lglg4 2) chg4 0.01)))))
    (setq cq2(+(+(+(*(/ lglg3 2) chq3 0.01) (*(/ lglg4 2) chq4 0.01)))))
  )
)
       (setq ch(+ cg1 cg2 chga))
   	(setq cq(+ cq1 cq2 chqa))
   	(setq cht(+ ch cq))
(setq test 10)
;surface en cm²
 	(setq s50 5027)
 	(setq s60 7854)
 	(setq s70 9503)
 	(setq s90 15394)
 	(setq s110 22698)
 	;volume
 	(setq v50 (*(/ s50 10000)prof))
	(setq v60 (*(/ s60 10000)prof))
 	(setq v70 (*(/ s70 10000)prof))
 	(setq v90 (*(/ s90 10000)prof))
 	(setq v110 (*(/ s110 10000)prof))
 	;F pour prof m
 	(setq F50 (+ ch cq (* v50 2500)))
 	(setq F60 (+ ch cq (* v60 2500)))
 	(setq F70 (+ ch cq (* v70 2500)))
 	(setq F90 (+ ch cq (* v90 2500)))
 	(setq F110 (+ ch cq (* v110 2500)))
 	;FS pour
 	(setq FS50 (/ F50 S50))
 	(setq FS60 (/ F50 S60))
 	(setq FS70 (/ F50 S70))
 	(setq FS90 (/ F50 S90))
 	(setq FS110 (/ F50 S110))
(if (<= FS50 taux)
(progn;alors
    (cond
      	((eq choix "carre")
	(command "inserer" "MC50C" "0,0" "1" "1" "0"))
	((eq choix "rond")
	(command "inserer" "MC50R" "0,0" "1" "1" "0"))
       	))
(progn;sinon
    	(if (<= FS60 taux)
  	(progn;alors
   		 (cond
      			((eq choix "carre")
			(command "inserer" "MC60C" "0,0" "1" "1" "0"))
			((eq choix "rond")
			(command "inserer" "MC60R" "0,0" "1" "1" "0"))
       			))
     	(progn;sinon
    			(if (<= FS70 taux)
  			(progn;alors
   				(cond
      				((eq choix "carre")
				(command "inserer" "MC70C" "0,0" "1" "1" "0"))
				((eq choix "rond")
				(command "inserer" "MC70R" "0,0" "1" "1" "0"))
       				))
  			(progn;sinon
    				(if (<= FS90 taux)
  				(progn;alors
   				(cond
      				((eq choix "carre")
				(command "inserer" "MC90C" "0,0" "1" "1" "0"))
				((eq choix "rond")
				(command "inserer" "MC90R" "0,0" "1" "1" "0"))
       				))
				(progn;sinon
    					(if (<= FS110 taux)
  					(progn;alors
   					(cond
      					((eq choix "carre")
					(command "inserer" "MC110C" "0,0" "1" "1" "0"))
					((eq choix "rond")
					(command "inserer" "MC110R" "0,0" "1" "1" "0"))
       					))
					(progn;sinon
					(command "inserer" "arecalculer" "0,0" "1" "1" "0"))
					)	  
				))
			))
	  ))
  )) 				


   
 (resvar)
(princ)
)

Posté(e)

Salut,

 

Sans décortiquer ton code, je remarque que tu ne déclares pas toutes tes variables en local (loin de là). Ceci explique peut-être pourquoi à partir du deuxième lancement certaines valeurs ne sont pas réinitialisées.

 

Il est impératif de déclarer *error* en local, sinon tu modifies globalement la définition de la fonction *error*.

 

Pour récupérer les valeurs de ta boite de dialogue, tu as deux solutions :

- soit la fonction massif retourne une liste avec les valeurs entrées dans les cases (les variables étant déclarées dans massif).

- soit tu imbrique la fonction massif dans la fonction principale (les variables étant déclarées dans la fonction principale).

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

Posté(e)

Salut,

Merci gile

 

en fait je declarais les valeurs qui sont demandées dans le dcl

car theoriquement si celle la sont a zero le reste devrait suivre

-j' ai tout declarer

-ok pour error modifié aussi

-j'ai deplacer massif dans le programme principal

pas d'incidence

par contre forcement maintenant si je ne rentre pas des valeurs dans chaque case du dcl ca plante :"; erreur: une erreur est survenue dans la fonction *erreur*nombre

d'arguments trop important"

 

comment on peux faire pour pour autoriser des cellules vide?

code dcl inchangé

code lisp:

;;; Routine principale

(defun c:maa(/ lglg1 chg1 chq1 lglg2 chg2 chq2 lglg3 chg3 chq3 lglg4 chg4 chq4 chga chqa cg1 cg2 cq1 cq2 ch cq cht test2 test3 test4 *error* svgvar resvar choix lglg1da chq1da lglg2da chg2da chq2da lglg3da chg3da chq3da lglg4da chg4da chq4da chgada chqada test test2 test3 test4 mapt s50 s60 s70 s90 s110 v50 v60 v70 v90 v110 f50 f60 f70 f90 f110 fs50 fs60 fs70 fs90 fs110)
;; Sauvegarder les variables AutoCAD 
 (defun svgvar	(/ cc cmd osm)
   (setq cc  (getvar "clayer")
  cmd (getvar "cmdecho")
  osm (getvar "osmode")
   )
   (setq test 2)
    )
;; Restaurer les variables AutoCAD 
 (defun resvar	()
   (setvar "clayer" cc)
   (setvar "cmdecho" cmd)
   (setvar "osmode" osm)
     )
;; Redéfinition de la fonction *error*
 (defun *error* ()
  (princ (strcat "\nErreur: " msg))	; renvoie un msg d'erreur
   (resvar)				; Restore les variables AutoCAD 
   (princ)				; Quitte silencieusement
 )


 (setq dcl (load_dialog "massifdcl.dcl")) 			
  	(if (not (new_dialog "massif" dcl)) (exit))
     		(action_tile "carre"  "(setq choix \"carre\")")
 		(action_tile "rond"  "(setq choix \"rond\")")
 		(action_tile "tauxd" "(setq tauxda $value)")
 		(action_tile "profd" "(setq profda $value)")
		(action_tile "lglg1d" "(setq lglg1da $value)")
 		(action_tile "chg1d" "(setq chg1da $value)")
		(action_tile "chq1d" "(setq chq1da $value)")
		(action_tile "lglg2d" "(setq lglg2da $value)")
 		(action_tile "chg2d" "(setq chg2da $value)")
		(action_tile "chq2d" "(setq chq2da $value)")
		(action_tile "lglg3d" "(setq lglg3da $value)")
 		(action_tile "chg3d" "(setq chg3da $value)")
		(action_tile "chq3d" "(setq chq3da $value)")
		(action_tile "lglg4d" "(setq lglg4da $value)")
 		(action_tile "chg4d" "(setq chg4da $value)")
		(action_tile "chq4d" "(setq chq4da $value)")
		(action_tile "chgad" "(setq chgada $value)")
		(action_tile "chqad" "(setq chqada $value)")
		(action_tile "accept" "(done_dialog 1)") 
 		(action_tile "cancel" "(done_dialog 0)")
		(setq test 1)

(setq ok  (start_dialog)) 						
(unload_dialog dcl)
 ;; Début du programme principal
 (svgvar)


	(setvar "OSMODE" 0) ;; pas d'accrochage aux objets
 

  

(command "filedia" "1")
 	(setq taux(atoi tauxda))
(setq prof(atoi profda))
(setq lglg1(atoi lglg1da))
(setq chg1(atoi chg1da))
(setq chq1(atoi chq1da))
(setq lglg2(atoi lglg2da))
(setq chg2(atoi chg2da))
(setq chq2(atoi chq2da))
(setq lglg3(atoi lglg3da))
(setq chg3(atoi chg3da))
(setq lglg4(atoi lglg4da))
(setq chg4(atoi chg4da))
(setq chq4(atoi chq4da))
(setq chga(atoi chgada))
(setq chq3(atoi chq3da))
(setq chqa(atoi chqada))
(setq mabe 2500)
 	(setq test 5)
   	(if (= taux 0)
  (progn;alors
    (setq taux 2.5)
    (setq test2 25))
  (progn;sinon
    	(if (= prof 0)
 	 	(progn;alors
    		(setq prof 2.5)
 	 	(setq test3 26))
	  	(progn;sinon
    		(setq test4 27)
		)
	)
  ))
 
(setvar "OSMODE" osm)
 	(setq mapt(getpoint "\npoint d'insertion : "))
(setvar "OSMODE" 0)
 	(command "scu" mapt "")
(if (and (> chg1 0) (> chg2 0))
  (progn;alors
    (setq atest 6)
    (setq cg1(+(+(*(+(*(/ lglg1 2) chg1 0.01) (*(/ lglg2 2) chg2 0.01)) 1.15))))
    (setq cq1(+(+(*(+(*(/ lglg1 2) chq1 0.01) (*(/ lglg2 2) chq2 0.01)) 1.15))))
         )
  (progn;sinon
    (setq atest 7)
    (setq cg1(+(+(+(*(/ lglg1 2) chg1 0.01) (*(/ lglg2 2) chg2 0.01)))))
    (setq cq1(+(+(+(*(/ lglg1 2) chq1 0.01) (*(/ lglg2 2) chq2 0.01)))))
  )
)
   	(if (and (> chg3 0) (> chg4 0))
  (progn;alors
    (setq atest 8)
    (setq cg2(+(+(*(+(*(/ lglg3 2) chg3 0.01) (*(/ lglg4 2) chg4 0.01)) 1.15))))
    (setq cq2(+(+(*(+(*(/ lglg3 2) chq3 0.01) (*(/ lglg4 2) chq4 0.01)) 1.15))))
         )
  (progn;sinon
    (setq atest 9)
           (setq cg2(+(+(+(*(/ lglg3 2) chg3 0.01) (*(/ lglg4 2) chg4 0.01)))))
    (setq cq2(+(+(+(*(/ lglg3 2) chq3 0.01) (*(/ lglg4 2) chq4 0.01)))))
  )
)
       (setq ch(+ cg1 cg2 chga))
   	(setq cq(+ cq1 cq2 chqa))
   	(setq cht(+ ch cq))
(setq test 10)
;surface en cm²
 	(setq s50 5027)
 	(setq s60 7854)
 	(setq s70 9503)
 	(setq s90 15394)
 	(setq s110 22698)
 	;volume
 	(setq v50 (*(/ s50 10000)prof))
	(setq v60 (*(/ s60 10000)prof))
 	(setq v70 (*(/ s70 10000)prof))
 	(setq v90 (*(/ s90 10000)prof))
 	(setq v110 (*(/ s110 10000)prof))
 	;F pour prof m
 	(setq F50 (+ ch cq (* v50 2500)))
 	(setq F60 (+ ch cq (* v60 2500)))
 	(setq F70 (+ ch cq (* v70 2500)))
 	(setq F90 (+ ch cq (* v90 2500)))
 	(setq F110 (+ ch cq (* v110 2500)))
 	;FS pour
 	(setq FS50 (/ F50 S50))
 	(setq FS60 (/ F50 S60))
 	(setq FS70 (/ F50 S70))
 	(setq FS90 (/ F50 S90))
 	(setq FS110 (/ F50 S110))
(if (<= FS50 taux)
 (progn;alors
    (cond
      	((eq choix "carre")
	(command "inserer" "MC50C" "0,0" "1" "1" "0"))
	((eq choix "rond")
	(command "inserer" "MC50R" "0,0" "1" "1" "0"))
       	))
(progn;sinon
    	(if (<= FS60 taux)
  	(progn;alors
   		 (cond
      			((eq choix "carre")
			(command "inserer" "MC60C" "0,0" "1" "1" "0"))
			((eq choix "rond")
			(command "inserer" "MC60R" "0,0" "1" "1" "0"))
       			))
     	(progn;sinon
    			(if (<= FS70 taux)
  			(progn;alors
   				(cond
      				((eq choix "carre")
				(command "inserer" "MC70C" "0,0" "1" "1" "0"))
				((eq choix "rond")
				(command "inserer" "MC70R" "0,0" "1" "1" "0"))
       				))
  			(progn;sinon
    				(if (<= FS90 taux)
  				(progn;alors
   				(cond
      				((eq choix "carre")
				(command "inserer" "MC90C" "0,0" "1" "1" "0"))
				((eq choix "rond")
				(command "inserer" "MC90R" "0,0" "1" "1" "0"))
       				))
				(progn;sinon
    					(if (<= FS110 taux)
  					(progn;alors
   					(cond
      					((eq choix "carre")
					(command "inserer" "MC110C" "0,0" "1" "1" "0"))
					((eq choix "rond")
					(command "inserer" "MC110R" "0,0" "1" "1" "0"))
       					))
					(progn;sinon
					(command "inserer" "arecalculer" "0,0" "1" "1" "0"))
					)	  
				))
			))
	  ))
  )) 				


   
 (resvar)
(princ)
)

Posté(e)

Première chose, la fonction *error* requiert un argument (le message retourné) :

(defun *error* (msg) ...)

 

Si tu corriges ça, tu devrais avoir un message du type :

  Citation
; erreur: type d'argument incorrect: stringp nil

 

Explication :

tes variables ne sont initialisées que par les expression (action_tile ...) donc, s'il n'y a eu aucune action sur une text_box la variable reste à nil et (atoi nil) provoque une erreur.

 

Donc soit tu initialises les variables (même avec une chaîne vide) soit tu récupères toutes les valeurs dans le (action_tile "accept"...)

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

Posté(e)

Avant le (setq dcl ...), tu fais :

(foreach var '(tauxda	 profda	   lglg1da   chg1da    chq1da	 lglg2da   chg2da    chq2da
       lglg3da	 chg3da	   chq3da    lglg4da   chg4da	 chq4da	   chgada    chqada
      )
 (set var "")
)

 

Les variables correspondant aux edit_box seront initialisée avec une chaine vide ce qui devrait t'éviter les erreurs au cas où la case reste vide :

(atoi "") retourne 0.

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

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é