grosseel Posté(e) le 23 août 2006 Posté(e) le 23 août 2006 je viens de mettre au point un programme, avec l'interface DCL, me permettant de gére les mode d'accrochage sur la grille (idem à l'interface AutoCAD, dans le but de simplifier par la suite en ajoutant des boutons pour une modification plus rapîde ( 'x1' , 'x2' , etc). Mais il existe un bug dans mon programme que je n'arrive pas à résoudre.Merci d'avance poiur votre aide. ;;---------------------------------------------------------------------------------------------------------------------------------------------------------------------- ;***** Fonction Création d'une grille d'aide ***** ;chargement de la boite de dialogue (defun c:ac-grille (/ dcl_id snapmode snapunit gridmode gridunit espx espy espax espay unitaccr unitgrid) (setq id (load_dialog "ERAS-EL.dcl")) (new_dialog "grille" dcl_id) ;Extraction des valeurs existantes des variables snapmode et snapunit et écriture dans la boite de dialogue (setq snapmode (getvar "snapmode")) (if (=1 snapmode) (set_tile "accractif" "1") (set_tile "accractif" "0") ) ; (setq unitaccr (getvar "snapunit")) (setq espx (car unitaccr)) (setq espy (cadr unitaccr)) (set_tile "espx" (rtos espx)) (set_tile "espy" (rtos espy)) ; ;Extraction des valeurs existantes des variables gridmode et gridunit et écriture dans la boite de dialogue (setq gridmode (getvar "gridmode")) (if (=1 gridmode) (set_tile "griactif" "1") (set_tile "griactif" "0") ) ; (setq unitgri (getvar "gridunit")) (setq espax (car unitgri)) (setq espay (cadr unitgri)) (set_tile "espax" (rtos espax)) (set_tile "espay" (rtos espay)) ; ;Lecture des valeurs entrées dans la boite de dialogue et changementdu contenu des variables correspondantes (defun defvar () (setq espx (atof (get_tile "espx"))) (setq espy (atof (get_tile "espy"))) (setvar "snapunit" (list espx espy)) (if (= "1" (get_tile "accractif")) (setvar "snapmode" 1)) (setvar "snapmode" 0)) (setq espax (atof (get_tile "espax")) (setq espay (atof (get_tile "espay")) (setvar "gridunit" (list espax espay)) (if (= "1" (get_tile "griactif")) (progn (setvar "gridmode" 0) (setvar "gridmode" 1)) (setvar "gridmode" 0) ) (action_tile "accept" "(done_dialog 1)") (start_dialog) (princ) ) // Grille de points et accrochage à la Grille grille : dialog { label = "Création d'une grille d'aide"; : row { : boxed_column { label = "Accrochage"; fixed_width = true; width = 22; : toggle { label = "Actif"; mnemonic = "A"; key = "accractif";} : edit_box { label = "Espacement en X"; mnemonic = "E"; key = "espx"; edit_width = 10;} : edit_box { label = "Espacement en Y"; mnemonic = "s"; key = "espy"; edit_width = 10;} } : boxed_column { label = "Grille"; fixed_width = true; width = 22; : toggle { label = "Actif"; mnemonic = "c"; key = "griactif";} : edit_box { label = "Espacement en X"; mnemonic = "p"; key = "espax"; edit_width = 10;} : edit_box { label = "Espacement en Y"; mnemonic = "a"; key = "espay"; edit_width = 10;} } } ok_cancel; }
Tramber Posté(e) le 23 août 2006 Posté(e) le 23 août 2006 Il faut d'abord que tu corriges tes parenthèses dans le lisp, car on est un perdu si on veut regarder rapidement. Ca ne colle pas. J'ai corrigé des "=1" en "= 1" mais c'est probablement CADxp qui modifie un peu le texte. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
Patrick_35 Posté(e) le 23 août 2006 Posté(e) le 23 août 2006 SalutEn lisant ton lisp, j'ai remarqué plusieurs choses qui me surprenne ;;------------------------------------------------------------------------ --------------------------------------------------------------------------- ------------------- ;***** Fonction Création d'une grille d'aide ***** ;chargement de la boite de dialogue (defun c:ac-grille (/ dcl_id snapmode snapunit gridmode gridunit espx espy espax espay unitaccr unitgrid) (setq id (load_dialog "ERAS-EL.dcl")) (new_dialog "grille" dcl_id) ;Extraction des valeurs existantes des variables snapmode et snapunit et écriture dans la boite de dialogue (setq snapmode (getvar "snapmode")) (if (=1 snapmode) (set_tile "accractif" "1") (set_tile "accractif" "0") ) ; (setq unitaccr (getvar "snapunit")) (setq espx (car unitaccr)) (setq espy (cadr unitaccr)) (set_tile "espx" (rtos espx)) (set_tile "espy" (rtos espy)) ; ;Extraction des valeurs existantes des variables gridmode et gridunit et écriture dans la boite de dialogue (setq gridmode (getvar "gridmode")) (if (=1 gridmode) (set_tile "griactif" "1") (set_tile "griactif" "0") ) ; (setq unitgri (getvar "gridunit")) (setq espax (car unitgri)) (setq espay (cadr unitgri)) (set_tile "espax" (rtos espax)) (set_tile "espay" (rtos espay)) ; ;Lecture des valeurs entrées dans la boite de dialogue et changementdu contenu des variables correspondantes [surligneur][b] (defun defvar () [/b][/surligneur] <--- Aucun appel sur cette fonction (setq espx (atof (get_tile "espx"))) (setq espy (atof (get_tile "espy"))) (setvar "snapunit" (list espx espy)) (if (= "1" (get_tile "accractif")) (setvar "snapmode" 1)) (setvar "snapmode" 0)) ) (setq espax (atof (get_tile "espax")) (setq espay (atof (get_tile "espay")) (setvar "gridunit" (list espax espay)) (if (= "1" (get_tile "griactif")) (progn (setvar "gridmode" 0) (setvar "gridmode" 1)[surligneur][b])[/b][/surligneur]<--- Cette parenthèse est en trop ? [surligneur][b](setvar "gridmode" 0)[/b][/surligneur] <--- Encore une fois ? ) (action_tile "accept" "(done_dialog 1)") (start_dialog) (princ) ) Et une astuce pour que le code soit plus court(if (=1 snapmode) (set_tile "accractif" "1") (set_tile "accractif" "0") )Tu peux faire (set_tile "accractif" (itoa snapmode))Et si on pousse plus loin, on peux éviter la variable snapmode en faisant (set_tile "accractif" (itoa (getvar "snapmode"))) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
grosseel Posté(e) le 24 août 2006 Auteur Posté(e) le 24 août 2006 Merci pour votre aide. j'ai modifier mon progamme en tenat compte de vos remarques mais u probléme persiste :- La partie lecture des variables et ecriture dans la boite de dialogue fonctionne parfaitement- La partie ecriture des nouvelles variables saisie dans la boite de dialogue ne fonctionne pas (Pas de changement de Mode ou de résolution)Voici le programme revue et corrigé ;***** Fonction Création d'une grille d'aide ***** ;chargement de la boite de dialogue (defun c:ac-grille (/ dcl_id snapmode snapunit gridmode gridunit espx espy espax espay unitaccr unitgrid) (setq dcl_id (load_dialog "ERAS-EL.dcl")) (new_dialog "grille" dcl_id) ;Extraction des valeurs existantes des variables snapmode et snapunit et écriture dans la boite de dialogue (setq snapmode (getvar "snapmode")) (if (= 1 snapmode) (set_tile "accractif" "1") (set_tile "accractif" "0") ) ; (setq unitaccr (getvar "snapunit")) (setq espx (car unitaccr)) (setq espy (cadr unitaccr)) (set_tile "espx" (rtos espx)) (set_tile "espy" (rtos espy)) ; ;Extraction des valeurs existantes des variables gridmode et gridunit et écriture dans la boite de dialogue (setq gridmode (getvar "gridmode")) (if (= 1 gridmode) (set_tile "griactif" "1") (set_tile "griactif" "0") ) ; (setq unitgri (getvar "gridunit")) (setq espax (car unitgri)) (setq espay (cadr unitgri)) (set_tile "espax" (rtos espax)) (set_tile "espay" (rtos espay)) ; ;Lecture des valeurs entrées dans la boite de dialogue et changementdu contenu des variables correspondantes (setq espx (atof (get_tile "espx"))) (setq espy (atof (get_tile "espy"))) (setvar "snapunit" (list espx espy)) (if (= "1" (get_tile "accractif")) (setvar "snapmode" 1)) (setq espax (atof (get_tile "espax"))) (setq espay (atof (get_tile "espay"))) (setvar "gridunit" (list espax espay)) (if (= "1" (get_tile "griactif")) (setvar "gridmode" 1)) (action_tile "accept" "(done_dialog 1)") (start_dialog) (princ) )
Patrick_35 Posté(e) le 24 août 2006 Posté(e) le 24 août 2006 Pour récuperer les valeurs de ta boite de dialogue, il faut attribuer une action à chacune des clés dans ton dclun (action_tile "accractif" "(je_vais_dans_ma_sous_routine)") permet de traduire l'action de "accractif" (et dans le cas présent, via un toggle) sur ma routine Je constate que tu fais un done_dialog 1 alors que tu ne prends en compte que l'action sur accept et non sur cancel et de plus, tu ne récupère pas la valeur qui serait retournée par (start_dialog)Donc, le 1 du done_dialog ne sert à rien. Il existe le boutton ok_button et cancel_button, en fonction de ton choix afin d'éviter un ok_cancel qui ne sert que partiellement @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
grosseel Posté(e) le 25 août 2006 Auteur Posté(e) le 25 août 2006 Merci pour ton aide, j'ai réussi à corriger mon code dont voici l'exmplaire qui marche trés bien.Une autre petite question j'ai bidouillé une menu + un code lisp pour gérere directement le grille (X1, X2, X5, X10) mais je suis obligé de gérer une fonction lisp par grille, il ne serait pas plus simple de gérer un seul et même code avec une variable que l'on mettrait à 1, 2, 5, 10 à l'aide des boutoons de la barre de menu? ;***** Fonction Création d'une grille d'aide ***** ;chargement de la boite de dialogue (defun c:ac-grille (/ dcl_id snapmode snapunit gridmode gridunit espx espy espax espay unitaccr unitgrid) (setq dcl_id (load_dialog "ERAS-EL.dcl")) ;Création de la boite de dialogue (new_dialog "grille" dcl_id) ;Extraction des valeurs existantes des variables snapmode et snapunit et écriture dans la boite de dialogue (setq snapmode (getvar "snapmode")) (if (= 1 snapmode) (set_tile "accractif" "1") (set_tile "accractif" "0") ) ; (setq unitaccr (getvar "snapunit")) (setq espx (car unitaccr)) (setq espy (cadr unitaccr)) (set_tile "espx" (rtos espx)) (set_tile "espy" (rtos espy)) ; ;Extraction des valeurs existantes des variables gridmode et gridunit et écriture dans la boite de dialogue (setq gridmode (getvar "gridmode")) (if (= 1 gridmode) (set_tile "griactif" "1") (set_tile "griactif" "0") ) ; (setq unitgri (getvar "gridunit")) (setq espax (car unitgri)) (setq espay (cadr unitgri)) (set_tile "espax" (rtos espax)) (set_tile "espay" (rtos espay)) ; ;Lecture des valeurs entrées dans la boite de dialogue et changement du contenu des variables correspondantes (defun defvar () (setq espx (atof (get_tile "espx"))) (setq espy (atof (get_tile "espy"))) (setvar "snapunit" (list espx espy)) (if (= "1" (get_tile "accractif")) (setvar "snapmode" 1) (setvar "snapmode" 0)) (setq espax (atof (get_tile "espax"))) (setq espay (atof (get_tile "espay"))) (setvar "gridunit" (list espax espay)) (if (= "1" (get_tile "griactif")) (setvar "gridmode" 1) (setvar "gridmode" 0)) ) (action_tile "accept" "(defvar) (done_dialog 1)") ;Affichage de la boite (start_dialog) ;Mise à jour des variables suivant Type d'accrochage et de grille (princ) )
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