Aller au contenu

[DCL] et (lisp] Désactiver un bouton


Messages recommandés

Posté(e)

salut à tous,

 

j'ai réalisé une boîte de dialogue en lisp et j'ai mis un bouton dessus.

 

J'aimerais pouvoir désactiver (is_enabled) ou desafficher ce bouton par une méthode lisp

mais comment faire je n'ai pas trouvé !

 

Avez vous la solution

 

Merci car je suis un peu à la bourre

 

 

A ++

 

Posté(e)

Salut,

 

Dans ton LISP qui commande la boite de dialogue, tu ajoute une conditionnelle :

 

(if ([i]condition[/i])
(mode_tile "cle_bouton" 1) ; le bouton est désactivé
(mode_tile "cle_bouton" 0) ; le bouton est activé
)

 

Le tout devant être inclus dans une boucle pour remettre à jour l'activation du bouton après les interventions de l'utilisateur.

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

Posté(e)
Le tout devant être inclus dans une boucle pour remettre à jour l'activation du bouton après les interventions de l'utilisateur.

Tout dépend de ton fonctionnement.Par exemple, un bouton peut en activer d'autres ou selon certaines conditions.

 

Extrait de l'aide

(mode_tile key mode)

 

Arguments

 

key

 

A string that specifies the tile. The key argument is case-sensitive.

 

mode

 

An integer that can be one of the following:

0 Enable tile

1 Disable tile

2 Set focus to tile

3 Select edit box contents

4 Flip image highlighting on or off

 

@+

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 beaucoup gile cela fonctionne

 

mais il y a quelquechose que je ne comprends pas:

 

Pourquoi autodesk donne une API graphique DCL avec des attributs disponibles si on ne peut pas les changer directement ?

Je m'explique une méthode du genre : Set_Attribut (Key NomDeAttirbut ValeurAttibute)

Exemple pour mon cas: Set_Attribut("btn_test" "is_enabled" "true")

 

en tout cas merci

Posté(e)
Pourquoi autodesk donne une API graphique DCL avec des attributs disponibles si on ne peut pas les changer directement ?

je ne suis pas sûr d'avoir bien compris la question, mais les attributs en .dcl définissent la boite de dialogue initiale, c'est par le LISP qu'on peut modifier leurs valeurs.

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

Posté(e)

Une autre façon, avec 1 exemple.

fichier test.dcl

test	: dialog {
label = "Essai de bouton";
: toggle {
label    = "Bouton bascule";
mnemonic = "B";
key      = "btn";
}
ok_cancel_err;
}

Comme définie, la touche B active ou désactive la case

 

le fichier lisp

(defun c:test_bouton ( / dcl_id what_next v_btn)
(setq dcl_id (load_dialog "test") v_btn "")
(setq what_next 2)
(while (< 1 what_next)
	(if (not (new_dialog "test" dcl_id)) (exit))
	(set_tile "btn" v_btn)
	(action_tile "btn" "(setq v_btn $value)")
	(action_tile "accept" "(done_dialog 1)")
	(action_tile "cancel" "(done_dialog 0)")
	(setq what_next (start_dialog))
)
(unload_dialog dcl_id)
(prin1)
)

 

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Ok mais quelle est cette méthode ?

Les fonctions (action_tile key action-expression) (get_attr key attribute) (get_tile key)

(mode_tile key mode) (set_tile key value) sont décrites dans l'Aide aux développeurs

-> AutoLISP Reference -> AutoLISP Functions ou

-> AutoLISP Developer's Guide -> Working with Programmable Dialog Boxes -> Programmable Dialog Box Reference -> Programmable Dialog Box Function Synopsis -> Tile and Attribute-Handling Functions

 

peut on ouvrir une boite de dialogue DCL en modeless et non en modal

Alors là, aucune idée !!!

Je ne sais pas ce que veulent dire "modeless" et "modal".

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

Posté(e)

Modeless veut dire que tu peux continuer à aller sur la carte quand ta fenêtre DCL est ouverte

Modal : tant que ta fenêtre n'est pas fermée tu ne peux rien faire sur la carte

 

voilà

 

 

UNe autre question je suis chiant je sais mais j'ai du mal ......

 

peut-on rendre invisible une boite de dialogue ?

 

merci

Posté(e)

Un petit exemple qui, j'espère répond à tes questions :

la boite de dialogue disparaît le temps de la sélection des objets, puis se ré-ouvre.

 

Définition de la boite :

test:dialog{
 label="Test";
   :button{
     label="Choix des objets       key="objt";
     fixed_width=true;
     alignment=centered;
   }
 ok_cancel;
} 

 

Le LISP qui la controle :

(defun c:test (/ dcl_id boucle objets)
 (setq dcl_id (load_dialog "test.dcl"))
 (setq boucle 2)
 (while (>= boucle 2)
   (if	(not (new_dialog "test" dcl_id))
     (exit)
   )
   (if	objets
     (mode_tile "accept" 0)
     (mode_tile "accept" 1)
   )
   (action_tile "objt" "(done_dialog 3)")
   (action_tile "accept" "(done_dialog 1)")
   (action_tile "cancel" "(done_dialog 0)")
   (setq boucle (start_dialog))
   (cond
     ((= boucle 3)
      (setq objets (ssget))
     )
   )
 )
 (unload_dialog dcl_id)
 (princ)
) 

 

[Edité le 20/9/2005 par (gile)]

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

Posté(e)

En reprenant mon précédent exemple.

Même principe que giles avec un controle un peu plus poussé

 

DCL

test	: dialog {
label = "Essai de bouton";
: row {
	: edit_box {
	label      = "Distance:";
	mnemonic   = "D";
	key        = "e_dist";
	edit_width = 10;
	}
	: button {
	label    = "Saisir <";
	mnemonic = "S";
	key      = "pick_d";
	}
}
: row {
	: edit_box {
	label      = "Angle   :";
	mnemonic   = "A";
	key        = "e_ang";
	edit_width = 10;
	}
	: button {
	label    = "Saisir <";
	mnemonic = "S";
	key      = "pick_a";                 
	}
}
: toggle {
label    = "Bouton bascule";
mnemonic = "B";
key      = "btn";
}
ok_cancel_err;
}

LISP

(defun tstval (val idx_v / val idx_v)
(if (or (distof val) (angtof val))
	(progn
		(if idx_v
			(setq e_dist (distof val))
			(setq e_ang (angtof val))
		)
		(set_tile "error" "")
	)
	(progn
		(set_tile "error" "Valeur numérique incorrecte !")
		(if idx_v
			(set_tile "e_dist" (rtos e_dist))
			(set_tile "e_ang" (angtos e_ang))
		)
	)
)
)
(defun c:test_bouton ( / dcl_id what_next v_btn e_dist e_ang)
(setq dcl_id (load_dialog "test") v_btn "" e_dist 0.0 e_ang 0.0)
(setq what_next 4)
(while (< 1 what_next)
	(if (not (new_dialog "test" dcl_id)) (exit))
	(set_tile "btn" v_btn)
	(set_tile "e_dist" (rtos e_dist))
	(set_tile "e_ang" (angtos e_ang))
	(action_tile "btn" "(setq v_btn $value)")
	(action_tile "e_dist" "(tstval $value T)")
	(action_tile "e_ang" "(tstval $value nil)")
	(action_tile "pick_d" "(done_dialog 3)")
	(action_tile "pick_a" "(done_dialog 2)")
	(action_tile "accept" "(done_dialog 1)")
	(action_tile "cancel" "(done_dialog 0)")
	(setq what_next (start_dialog))
	(cond
		((= what_next 2)
			(initget 1)
			(setq e_ang (getangle "\nAngle?: "))
		)
		((= what_next 3)
			(initget 71)
			(setq e_dist (getdist "\nDistance?: "))
		)
	)
)
(unload_dialog dcl_id)
(prin1)
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

J'ai un peu modifié le code dcl (celui de gile) ci-dessus (enlevé des lignes qui ne servaient à rien)

 

Tu trouvera des explications (en anglais) dans l'Aide aux développeurs -> AutoLISP Developer's Guide -> Working with Programmable Dialog Boxes -> Managing Dialog Boxes -> Functions for Hiding Dialog Boxes

 

peut on ouvrir une boite de dialogue DCL en modeless et non en modal

La réponse me semble être non, mais on peut la faire disparaître momentanément.

 

[Edité le 20/9/2005 par (gile)]

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

Posté(e)

Merci à tous les deux

 

Votre aide + aide autocad lisp m'a beaucoup servi et j'ai réussi à m'en sortir

mais que c'est compliqué de faire de l'interaction entre les boite de dialogue et l'espace papier et le rafraichissement de liste dans la boite de dialogue

 

En toiut cas merci beaucoup

 

j'aurai surement d'autres questions .....;)

  • 9 ans après...
Posté(e)

Bonjour,

 

Bien que le sujet date un peu, il est d'actualité pour moi, je suis en train de me pencher sur les Boites de dialogue qui me passionne beaucoup mais car il y à un mais, j'ai du mal à comprendre comment faire apparaitre (désassombrir) une autre question dans la même boite de dialogue :

 

1) question (dans le dcl) :

: toggle { label = "Hauteur"; key = "Hautok"; height = 1 ; edit_width = 5; alignment = left; }

 

2) Si oui, question 2 (dans le dcl):

: edit_box { label = "Hauteur (m) :"; key = "Question2"; height = 1 ;edit_width = 5; alignment = left; }

 

 

Un truc du genre dans le lisp...

 

(if (= Hautok 0)
  (mode_tile "Question2" 0)
  (mode_tile "Question2" 1)
)

 

 

Si quelqu'un peut m'aider avec un exemple ultra simple

( 1 tick à cocher ou pas qui active ou pas une question avec une donné à saisir )

 

Merci à vous

Posté(e)

Salut,

 

En DCL les boites dialogues sont pilotées par des gestionnaires d'évènement (sortes de réacteurs) en LISP. La fonction action_tile permet de définir le comportement du programme quand un contrôle est sollicité.

 

Dans ton cas, le programme doit réagir quand l'état du toggle (coché/décoché) change.

 

Un exemple (pas testé)

 

(action_tile
 "Hautok"
 (vl-prin1-to-string
   '(if (= $value "1")
     (mode_tile "Question2" 0)
     (mode_tile "Question2" 1)
   )
 )
)

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

Posté(e)

Bonjour Gile,

 

Je te remercie pour ta réponse rapide et précise, en revanche cela fonctionne presque bien, le problème maintenant doit venir d'ailleurs, à l'ouverture de la boite l'état du "toogle" est décoché avec la "Question2" accessible, il faut que je coche et décoche pour faire verrouillé la "question2", comment faire pour qu'il reste décoché à l'ouverture et que la "question2" s'active quand je coche ?

 

Quand ont valide "Renseigné l'essence" la possibilité de renseigner la hauteur ce fait automatiquement

 

J'ai essayé plusieurs modifications mais sans résultat, alors encore un peu d'aide serait le bien venue.

 

Merci

Posté(e)

Salut,

 

Il y a deux moyens d'initialiser les valeurs des contrôles DCL :

 

- par le fichier DCL (avec value et is_enabled)

: toggle { 
 label = "Hauteur"; key = "Hautok"; height = 1 ; edit_width = 5; alignment = left; value = "0"; } 
: edit_box { 
 label = "Hauteur (m) :"; key = "Question2"; height = 1 ;edit_width = 5; alignment = left; is_enabled = false; } 

 

- depuis le LISP (avec set_tile et mode_tile avant les expressions action_tile)

(set_tile "Hautok" "0")
(mode_tile "Question2" 1)

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

Posté(e)

Encore merci pour cette patience avec moi.

 

Dans mon "code" entre saisir et diamètre et saisir et hauteur c'est Parfait (enfin et Merci)

 

mais je souhaite "griser" <Saisir la hauteur> sauf quand on coche <Renseigner l'essence>

 

et la je re re re bloque malgrès avoir réfléchis et essayer dans tous les sens.

 

Je pensais faire :

 

(set_tile "Essence" "1")
(mode_tile "Hautok" 1)

 

et bah non , encore une fois je suis à coté de la plaque... :(

 

Je suis presque au bout, je vais regarder tout à nouveaux.

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é