Aller au contenu

Gestion d\'accrocha et de Grille


Messages recommandés

Posté(e)

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

Posté(e)

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

 

./__\.
(.°=°.)
Posté(e)

Salut

En 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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

Posté(e)

Pour récuperer les valeurs de ta boite de dialogue, il faut attribuer une action à chacune des clés dans ton dcl

un (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 Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

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

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é