chris_mtp Posté(e) le 31 octobre 2009 Partager Posté(e) le 31 octobre 2009 Bonjour à tous, J'ai un sérieux problème dans un dcl et je ne vois pas comment faire.Voila, j'ai fait un petit dcl dans un lisp (defun Dialog (/ tmp file dcl_id result lst1 lstc box1) ;; créer un fichier temporaire et l'ouvrir en écriture (setq tmp (vl-filename-mktemp "tmp.dcl") file (open tmp "w")) ;; écrire dans le fichier (write-line (strcat "SpecialInputBox:dialog { label = \"PLAN DE COMPARAISON\";fixed_width=true; initial_focus = \"lst1\"; :popup_list { key = \"lst1\"; label = \"Type d'attribution du PDC\"; edit_width = 15; } :edit_box { key = \"box1\"; label = \"Niveau Plan de comparaison (m)\"; edit_width = 7; } spacer; ok_cancel; } ") file ) ;; fermer le fichier (close file) ;; charger le fichier (setq dcl_id (load_dialog tmp)) ;; Appeler la boite de dialogue (if (not (new_dialog "SpecialInputBox" dcl_id)) (exit) ) (setq lstc '("Valeur imposée" "Automatique")) (start_list "lst1") (mapcar 'add_list lstc) (end_list) (set_tile "box1" "0") ;; action si l'utilisateur clique "OK" : ;; lst = liste des entrées et fermeture de la boite (action_tile "accept" "(setq lst (list (get_tile \"box1\") )) (done_dialog)" ) ;; afficher la boite de dialogue (start_dialog) ;; décharger la boite de dialogue (unload_dialog dcl_id) ;; supprimer le fichier (vl-file-delete tmp) lst ) (defun c:pdc ( / lst) (setq lst (Dialog)) (alert (strcat "\nValeur Plan de comparaison : " (nth 0 lst) "m")) (prin1) ) qui me permet soit d'entrer au clavier la valeur d'un plan de comparaison, soit d'attribuer la valeur du plan de comparaison de manière automatique. Ce que je souhaiterais, c'est lorsque je choisi Automatique dans le popup, l'edit box devient grisée, sinon si je choisi valeur imposé, soit entrer une valeur au clavier dans l'edit box soit par un button de sélectionner un texte dans mon dessin qui sera la valeur de mon edit box. Il me manque deux ou trois lignes de lisp et je bloque depuis deux jours.Merci par avance de votre aide. John Lien vers le commentaire Partager sur d’autres sites More sharing options...
chris_mtp Posté(e) le 31 octobre 2009 Auteur Partager Posté(e) le 31 octobre 2009 J'ai essayé de modifier le lisp en faisant le code ci-dessous mais toujours (defun Dialog (/ tmp file dcl_id result ss box1) ;; créer un fichier temporaire et l'ouvrir en écriture (setq tmp (vl-filename-mktemp "tmp.dcl") file (open tmp "w")) ;; écrire dans le fichier (write-line (strcat "SpecialInputBox:dialog { label = \"PLAN DE COMPARAISON\";fixed_width=true; initial_focus = \"box1\"; :row{ :edit_box { key = \"box1\"; label = \"Plan de comparaison\"; edit_width=7; } :button{ label=\"Saisir\"; key=\"ss\"; edit_width=10; alignment=bottom; allow_accept=true; } } spacer; ok_cancel; } ") file ) ;; fermer le fichier (close file) ;; charger le fichier (setq dcl_id (load_dialog tmp)) ;; Appeler la boite de dialogue (if (not (new_dialog "SpecialInputBox" dcl_id)) (exit) ) (set_tile "box1" "0") ;; action si l'utilisateur clique "OK" : ;; lst = liste des entrées et fermeture de la boite (action_tile "accept" "(setq lst (list (get_tile \"box1\") )) (done_dialog)" ) ;; afficher la boite de dialogue (start_dialog) ;; décharger la boite de dialogue (unload_dialog dcl_id) ;; supprimer le fichier (vl-file-delete tmp) lst ) (defun c:pdc ( / lst) (setq lst (Dialog)) (alert (strcat "\nValeur Plan de comparaison : " (nth 0 lst) "m")) (prin1) ) Je voudrais si l'utilisateur choisi le bouton saisir sélectionner un texte ou mtext dans le dessin et attribuer cette valeur à l'edit box. Si je met ca dans le lisp (set_tile "ss" (setq txt (car(entsel "\nSaisir la distance cumulée : "))) (if (= (cdr (assoc 0 (entget txt))) "TEXT") (setq vdit (cdr (assoc 1 (entget txt)))) ) ) Autocad me plante Merci par avance de votre aide.John. [Edité le 31/10/2009 par chris_mtp] Lien vers le commentaire Partager sur d’autres sites More sharing options...
(gile) Posté(e) le 31 octobre 2009 Partager Posté(e) le 31 octobre 2009 Salut, Encore une fois la demande est quelque peu confuse :Un coup on a une popup_list et une edit_box, l'autre un button et une edit_box... Dans le premier cas, je pense que deux radio_button seraient préférables à la popup_list.Ensuite il faut mettre un action_tile sur la radio_row et jouer avec la fonction mode_tile pour l'edit_box. (defun Dialog (/ tmp file dcl_id result lst1 lstc box1) ;; créer un fichier temporaire et l'ouvrir en écriture (setq tmp (vl-filename-mktemp "tmp.dcl") file (open tmp "w") ) ;; écrire dans le fichier (write-line (strcat "SpecialInputBox:dialog { label = \"PLAN DE COMPARAISON\"; fixed_width=true; initial_focus = \"lst1\"; :boxed_radio_row { key = \"lst1\"; label = \"Type d'attribution du PDC\"; :radio_button { label = \"Valeur imposée\"; key = \"Valeur imposée\"; } :radio_button { label = \"Automatique\"; key = \"Automatique\"; } } :edit_box { key = \"box1\"; label = \"Niveau Plan de comparaison (m)\"; edit_width = 7; allow_accept = true; } spacer; ok_cancel; } " ) file ) ;; fermer le fichier (close file) ;; charger le fichier (setq dcl_id (load_dialog tmp)) ;; Appeler la boite de dialogue (if (not (new_dialog "SpecialInputBox" dcl_id)) (exit) ) (setq lstc '("Valeur imposée" "Automatique")) ;; Défaut à l'ouverture ;; radio_button = "Valeur imposée" ;; edit_box = "0" (set_tile "lst1" "Valeur imposée") (set_tile "box1" "0") ;; action l'utilisateur clique sur un radio_button (action_tile "lst1" "(if (= $value \"Automatique\") (mode_tile \"box1\" 1) (progn (mode_tile \"box1\" 0) (mode_tile \"box1\" 2) ) )" ) ;; action si l'utilisateur clique "OK" : ;; lst = liste des entrées et fermeture de la boite (action_tile "accept" "(setq lst (if (= (get_tile \"Automatique\") \"1\") (list \"Automatique\") (list (get_tile \"box1\")) ) ) (done_dialog)" ) ;; afficher la boite de dialogue (start_dialog) ;; décharger la boite de dialogue (unload_dialog dcl_id) ;; supprimer le fichier (vl-file-delete tmp) lst ) (defun c:pdc (/ lst) (if (setq lst (Dialog)) (alert (strcat "\nValeur Plan de comparaison : " (nth 0 lst) "m")) ) (prin1) ) Dans le deuxième cas, il faut comprendre que les boites de dialogues faites en DCL sont toujours de type "modal", c'est à dire qu'on ne peut rien faire tant que la boite dialogue est ouverte.Pour pouvoir fermer temporairement la boite afin que l'utilisateur reprenne la main, il faut faire une boucle avec la valeur retournée par start_dialog (qui est l'argument passé à done_dialog dans les différents action_tile).Voir un exemple simple ici et dans l'aide AutoLISP Developer's Guide >> Working with Programmable Dialog Boxes >> Managing Dialog Boxes >> Functions for Hiding Dialog Boxes. (defun Dialog (/ tmp file dcl_id loop result ss lst) ;; créer un fichier temporaire et l'ouvrir en écriture (setq tmp (vl-filename-mktemp "tmp.dcl") file (open tmp "w") ) ;; écrire dans le fichier (write-line (strcat "SpecialInputBox:dialog { label = \"PLAN DE COMPARAISON\"; fixed_width=true; initial_focus = \"box1\"; :row{ :edit_box { key = \"box1\"; label = \"Plan de comparaison\"; edit_width=7; allow_accept = true; } :button{ label=\"Saisir\"; key=\"ss\"; edit_width=10; alignment=bottom; allow_accept=true; } } spacer; ok_cancel; } " ) file ) ;; fermer le fichier (close file) ;; charger le fichier et initialiser loop et result (setq dcl_id (load_dialog tmp) loop 2 result "0") ;; Appeler la boite de dialogue tant que loop > 1 (while ( (if (not (new_dialog "SpecialInputBox" dcl_id)) (exit) ) (set_tile "box1" result) ;; action si l'utilisateur entre une valeur dans l'edit_box : (action_tile "box1" "(setq result $value)") ;; action si l'utilisateur clique "Saisir" : (action_tile "ss" "(done_dialog 3)") ;; action si l'utilisateur clique "OK" : ;; lst = liste des entrées et fermeture de la boite (action_tile "accept" "(done_dialog 1)" ) ;; afficher la boite de dialogue (setq loop (start_dialog)) ;; en fonction de la valeur passée à don_dialog et retournée par start_dialog (cond ((= loop 1) (setq lst (list result))) ((= loop 3) (setq result (SelectText))) ) ) ;; décharger la boite de dialogue (unload_dialog dcl_id) ;; supprimer le fichier (vl-file-delete tmp) lst ) (defun SelectText (/ ent) (while (not (and (setq ent (car (entsel "\nSélectionnez un texte: "))) (setq elst (entget ent)) (member (cdr (assoc 0 elst)) '("MTEXT" "TEXT")) ) ) (alert "L'objet sélectionné n'est pas un texte") ) (cdr (assoc 1 elst)) ) (defun c:pdc (/ lst) (setq lst (Dialog)) (alert (strcat "\nValeur Plan de comparaison : " (nth 0 lst) "m")) (prin1) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD Lien vers le commentaire Partager sur d’autres sites More sharing options...
chris_mtp Posté(e) le 1 novembre 2009 Auteur Partager Posté(e) le 1 novembre 2009 Merci Gile.Tes conseils m'ont été très utiles. J'ai pu m'en sortir avec les deux codes. John. Lien vers le commentaire Partager sur d’autres sites More sharing options...
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