Aller au contenu

Probleme dans DCl


chris_mtp

Messages recommandés

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

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

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

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é