coxsurf56 Posté(e) le 3 janvier 2012 Posté(e) le 3 janvier 2012 bonjour, et bon année 2012 dans un dcl j'ai 16 cases a remplirquand le les remplis toute la premiere dois pas de problemepar contre quand j'en laisse des vides ca plantede plus il ne reinitialise pas les valeurs, il me semble pourtant l'avoir faisdonc quand je relance le lisp il y a des restessi 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) )
(gile) Posté(e) le 3 janvier 2012 Posté(e) le 3 janvier 2012 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
coxsurf56 Posté(e) le 4 janvier 2012 Auteur Posté(e) le 4 janvier 2012 Salut,Merci gile en fait je declarais les valeurs qui sont demandées dans le dclcar 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 principalpas d'incidencepar 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) )
(gile) Posté(e) le 4 janvier 2012 Posté(e) le 4 janvier 2012 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
coxsurf56 Posté(e) le 5 janvier 2012 Auteur Posté(e) le 5 janvier 2012 ok pour error c'est modifé par contre je vois pas comment faire pour initialiser mes variables
(gile) Posté(e) le 5 janvier 2012 Posté(e) le 5 janvier 2012 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
coxsurf56 Posté(e) le 6 janvier 2012 Auteur Posté(e) le 6 janvier 2012 j'ai une erreur "Erreur: type d'argument incorrect: stringp 0"rien a voir avec la modifj'ai rempli toute les cases et pareilje vais regarder ce webon we et merci Gile
(gile) Posté(e) le 6 janvier 2012 Posté(e) le 6 janvier 2012 Tu peux utiliser la méthode donnée ici pour localiser l'erreur. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
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