Aller au contenu

InputBox en LISP (DCL inclus)


Messages recommandés

Posté(e)

Salut,

 

On peut parfois trouver encombrants les fichiers DCL qu'il faut se trimbaler avec les LISP utilisant des boites de dialogue.

Il est, bien sûr, possible de compiler LISP et DCL dans un seul fichier VLX, mais celui-ci est crypté.

 

Une autre façon de faire est de créer le fichier DCL directement depuis le LISP (on pourra même le supprimer à la fin).

De plus, cette méthode permet de "moduler" la boite dialogue en fonction de certaines données, par exemple adapter sa taille à la longueur d'un message.

 

Pour illustrer ça, voici une routine qui est une alternative à la routine InputBox donnée par Patrick_35 (qui fait appel à la boite InputBox VBA).

 

La taille de la boite s'adapte à la longueur du message.

 

http://img141.imageshack.us/img141/8586/input1vl1.png http://img98.imageshack.us/img98/2992/input2ig1.png

 

EDIT : suite à la remarque de Bred ci-dessous, je modifie la mise en forme du code pour éviter que le copier coller ne rajoute un espace

 

;; InputBox (gile)
;; Ouvre une boite de dialogue pour récupérer une valeur
;; sous forme de chaine de caractère
;;
;; Arguments
;; tous les arguments sont de chaines de caractère (ou "")
;; box : titre de la boite de dialogue
;; msg : message d'invite
;; val : valeur par défaut
;;
;; Retour
;; une chaine ("" si annulation)

(defun InputBox	(box msg val / subr temp file dcl_id ret)
 
 ;; Retour chariot automatique à 50 caractères
 (defun subr (str / pos)
   (if	(and
  (	  (setq pos (vl-string-position 32 (substr str 1 50) nil T))
)
     (strcat ":text_part{label=\""
      (substr str 1 pos)
      "\";}"
      (subr (substr str (+ 2 pos)))
     )
     (strcat ":text_part{label=\"" str "\";}")
   )
 )

 ;; Créer un fichier DCL temporaire
 (setq	temp (vl-filename-mktemp "Tmp.dcl")
file (open temp "w")
ret  ""
 )

 ;; Ecrire le fichier
 (write-line
   (strcat
     "InputBox:dialog{key=\"box\";initial_focus=\"val\";spacer;:paragraph{"
     (subr msg)
     "}spacer;:edit_box{key=\"val\";edit_width=54;allow_accept=true;}
     spacer;ok_cancel;}"
   )
   file
 )
 (close file)

 ;; Ouvrir la boite de dialogue
 (setq dcl_id (load_dialog temp))
 (if (not (new_dialog "InputBox" dcl_id))	
   (exit)
 )
 (set_tile "box" box)
 (set_tile "val" val)
 (action_tile
   "accept"
   "(setq ret (get_tile \"val\")) (done_dialog)"
 )
 (start_dialog)
 (unload_dialog dcl_id)

 ;;Supprimer le fichier
 (vl-file-delete temp)
 ret
)

 

Et, sur le même principe, une DoubleInputBox

 

http://img516.imageshack.us/img516/7749/input3lo6.png

 

;; DoubleInputBox (gile)
;; Ouvre une boite de dialogue pour récupérer deux valeurs
;; sous forme de chaine de caractère
;;
;; Arguments
;; tous les arguments sont de chaines de caractère (ou "")
;; box : titre de la boite de dialogue
;; msg1 : message pour la première entrée
;; msg1 : message pour la seconde entrée
;; val1 : valeur par défaut de la première entrée
;; val1 : valeur par défaut de la seconde entrée
;;
;; Retour
;; une liste (valeur1 valeur2) ou nil

(defun DoubleInputBox (box msg1 msg2 val1 val2 / temp file dcl_id lst)

 (defun subr (str / pos)
   (if	(and
  (	  (setq pos (vl-string-position 32 (substr str 1 50) nil T))
)
     (strcat ":text_part{label=\""
      (substr str 1 pos)
      "\";}"
      (subr (substr str (+ 2 pos)))
     )
     (strcat ":text_part{label=\"" str "\";}")
   )
 )
 
 (setq	temp (vl-filename-mktemp "Tmp.dcl")
file (open temp "w")
 )
 (write-line
   (strcat
   "DoubleInputBox:dialog{key=\"box\";initial_focus=\"val1\";:paragraph{"
   (subr msg1)
   "}:edit_box{key=\"val1\";edit_width=54;allow_accept=true;}spacer;:paragraph{"
   (subr msg2)
   "}:edit_box{key=\"val2\";edit_width=54;allow_accept=true;}spacer;ok_cancel;}"
   )
   file
 )
 (close file)
 (setq dcl_id (load_dialog temp))
 (if (not (new_dialog "DoubleInputBox" dcl_id))
   (exit)
 )
 (foreach n '("box" "val1" "val2")
   (set_tile n (eval (read n)))
 )
 (action_tile
   "accept"
   "(setq lst (list (get_tile \"val1\") (get_tile \"val2\")))
   (done_dialog)"
 )
 (start_dialog)
 (unload_dialog dcl_id)
 (vl-file-delete temp)
 lst
) 

 

[Edité le 15/10/2007 par (gile)]

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

Posté(e)

Salut (gile),

merci beaucoup pour cet outil !

petite info : un espace en trop là :

acer;ok_c[surligneur] [/surligneur]ancel;} 

 

... et la chose équivalent en dcl pour une "Msg-Box" ?....

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)
	(alert ...)

... c'est gentil merci .... :P ;)

 

ou sinon, le MsgBox utilisant ActiveX de Patrick_35.

OK, mais je pensais que faire une Msg-box simple (OK Annuler et/ou Oui Non Annuler) pouvait ce faire de la même manière....

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

OK, mais je pensais que faire une Msg-box simple (OK Annuler et/ou Oui Non Annuler) pouvait ce faire de la même manière...

 

Oui c'est possible, ce que je voulais montrer, c'est la possibilité de créer le DCL depuis le LISP. À priori, ce qu'on peut faire en LISP/DCL, on peut le faire comma ça.

 

De plus, on doit pouvoir adapter le code pour l'utiliser avec les clones d'AutoCAD ou LT Extender : au lieu de faire un fichier DCL temporaire et de le supprimer ensuite, créer le fichier DCL dans un répertoire du chemin de recherche si ça n'a pas déjà été fait par un précédent lancement de la routine.

 

http://img144.imageshack.us/img144/7456/msgboxkr9.png

 

;; MsgBox
;; Affiche une boite de message et récupère une réponse
;;
;; Arguments
;; box : le titre de la boite
;; msg : le messsage
;; code : un entier
;; 0 pour OK seulement
;; 1 pour OK Annuler
;; 2 pour OUI NON Annuler
;;
;; Retour
;; 1 pour OK
;; 2 pour Annuler
;; 3 pour OUI
;; 4 pour NON

(defun MsgBox (box msg code / subr temp file dcl_id ret)
 
 (defun subr (str / pos)
   (if	(and
  (	  (setq pos (vl-string-position 32 (substr str 1 50) nil T))
)
     (strcat ":text_part{label=\""
      (substr str 1 pos)
      "\";}"
      (subr (substr str (+ 2 pos)))
     )
     (strcat ":text_part{label=\"" str "\";}")
   )
 )
 
 (setq	temp (vl-filename-mktemp "Tmp.dcl")
file (open temp "w")
 )
 (write-line
   (strcat
     "yes_button:retirement_button{label=\"OUI\";key=\"oui\";}"
     "no_button:retirement_button{label=\"NON\";key=\"non\";}"
     "InputBox:dialog{key=\"box\";initial_focus=\"val\";spacer;:paragraph{"
     (subr msg)
     "}spacer;"
     (cond
((= 0 code) "ok_only;}")
((= 1 code) "ok_cancel;}")
((= 2 code)
 ":row{fixed_width=true;alignment=centered;
 yes_button;spacer;no_button;spacer;cancel_button;}}"
 )
     )
   )
   file
 )
 (close file)
 (setq dcl_id (load_dialog temp))
 (if (not (new_dialog "InputBox" dcl_id))
   (exit)
 )
 (set_tile "box" box)
 (action_tile "oui" "(setq ret 3) (done_dialog)")
 (action_tile "non" "(setq ret 4) (done_dialog)")
 (action_tile "accept" "(setq ret 1) (done_dialog)")
 (action_tile "cancel" "(setq ret 2) (done_dialog)")
 (start_dialog)
 (unload_dialog dcl_id)
 (vl-file-delete temp)
 ret
) 

 

[Edité le 15/10/2007 par (gile)]

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

  • 4 semaines après...
Posté(e)

Salut

 

Le résultat est retourné sous forme de chaîne (chaîne vide ("") si rien n'est entré ou si annulation).

 

si tu veux une valeur numérique, il faut le convertir avec atof, distof, atoi ou read.

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

  • 1 an après...
Posté(e)

Bonjour Gile,

 

Je voudrais créer un dcl temporaire dans un lisp où je dois entrer plusieurs valeurs avant de lancer mon lisp. J'ai essayé la fonction DoubleInputBox mais je n'arrive pas à récupérer les valeurs entrées même avec atof.

Les valeurs sont bien des strings stockès dans une liste appelée lst donc avec

 (setq echx (atof (nth 0 lst)))

ça doit marché mais j'ai le retour

 

erreur: type d'argument incorrect: consp nil.

 

Par contre, une autre question, comment créer une liste déroulante dans l'inputBox ?

Merci par avance de ton aide.

 

John.

 

 

Posté(e)

Salut,

 

Le message d'erreur dit que la variable lst est vide.

 

As tu bien fait (setq lst (DoubleInputBox ...)) ?

 

Sinon regarde dans Dialog.lsp sur cette page (tout en bas) tu trouveras d'autres exemples de DCL "temporaires".

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

Posté(e)

Merci Gile pour ces infos.

Dernière petite question.

 

J'essaye de faire une boite de dialogue dcl avec 4 valeurs à entré par l'utilisateur mais il y a un bug. Par contre, pour la liste déroulante, je ne vois pas non plus comment la paramétrer.

 

 

(defun DoubleInputBox (box msg1 msg2 msg3 msg4 val1 val2 val3 val4/ temp file dcl_id lst)
 (defun subr (str / pos)
   (if	(and
  (< 50 (strlen str))
  (setq pos (vl-string-position 32 (substr str 1 50) nil T))
)
     (strcat ":text_part{label=\""
      (substr str 1 pos)
      "\";}"
      (subr (substr str (+ 2 pos)))
     )
     (strcat ":text_part{label=\"" str "\";}")
   )
 )
 (setq	temp (vl-filename-mktemp "Tmp.dcl")
        file (open temp "w")
              pdcech (list "100"  "200"  "250"  "250"  "500"  "1000"  "1250"  "1500" "2000" "2500")
 )
 (write-line
   (strcat
   "DoubleInputBox:dialog{key=\"box\";initial_focus=\"val1\";:paragraph{"
   (subr msg1)
   "}:edit_box{key=\"val1\";edit_width=54;allow_accept=true;}spacer;:paragraph{"
   (subr msg2)
   "}:edit_box{key=\"val2\";edit_width=54;allow_accept=true;}spacer;:paragraph{"
   (subr msg3)
   "}edit_box{key=\"val3\";edit_width=25;allow_accept=true;}
   :popup_list{key=\"pdcech\";edit_width=25;}
   (subr msg4)
   "}:edit_box{key=\"val4\";edit_width=54;allow_accept=true;}spacer;ok_cancel;}"
   :popup_list{key=\"pdcech\";edit_width=25;}
   )
   file
 )
 (close file)
 (setq dcl_id (load_dialog temp))
 (if (not (new_dialog "DoubleInputBox" dcl_id))
   (exit)
 )
 (foreach n '("box" "val1" "val2" "val3" "val4")
   (set_tile n (eval (read n)))
 )
 (action_tile
   "accept"
   "(setq lst (list (get_tile \"val1\") (get_tile \"val2\") (get_tile \"val3\") (get_tile \"val4\")))
   (done_dialog)"
 )
 (start_dialog)
 (unload_dialog dcl_id)
 (vl-file-delete temp)
 lst
) 

 

Je me suis inspiré de ton exemple mais j'ai le retour

; erreur: nombre d'arguments insuffisants

 

Merci par avance de ton aide.

John.

Posté(e)

Salut,

 

Il manque une espace avant le slash (/) dans la liste des arguments / variables locales.

Il manque des guillemets dans l'expression strcat.

Il manque un contrôle ok_cancel pour pouvoir fermer la boite de dialogue.

L'accolade fermante correspondant à celle de dialog (la première) est placée avant le dernier edit_box.

 

Tu dis vouloir récupérer 4 entrées utilisateur, mais tu as 4 edit_box et 2 pop_up.

 

Je te conseillerais de faire plutôt un fichier DCL séparé dans l'éditeur VisualLISP, et de l'enregistrer dans un répertoire du chemin de recherche, tu pourras ainsi plus facilement voir les appariement d'accolades et afficher ta boite dialogue (Outils > Outils d'interface > Aperçu DCL dans l'éditeur) pendant sa création.

 

N'hésite pas à consulter l'aide AutoLISP Developer's Guide > Working with Programmable Dialog Boxes

 

Pour les popup_list, il faut remplir la liste dans le LISP en faisant :

(start_list "pdcech")
 (mapcar 'add_list pdcech)
(end_list)

 

On récupère la valeur sélectionné par son indice (chaîne)

(nth (atoi (get_tile "pdcech")) pdcech)

 

PS : tu devrais aussi changer le nom de la routine pour ne pas "écraser" la routine DoubleInputBox originelle.

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

Posté(e)

C'est vrai que ce n'est pas très simple, c'est pourquoi il vaut mieux démarrer doucement.

 

Teste et essaye de comprendre les exemples que je donne dans le lien ci-dessus.

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

Posté(e)

Un exemple plus simple, si j'ai à peu près compris ce que tu veux faire.

 

J'ai mis quelques commentaires dans les codes

 

Le DCL qui doit être enregistré sous "QuadInputBox.dcl"

// Boite de dialogue : 2 edit_box + 2 popup_list
SpecialInputBox:dialog {
 label = "QuadInputBox"; // Titre de la boite de dialogue
 initial_focus = "box1";
 :edit_box {
   key = "box1"; // identifiant du contrôle
   label = "Entrez réponse 1"; // libellé de la première boite
   edit_width = 20: // largeur de la boite d'édition
 }
 :edit_box {
   key = "box2";
   label = "Entrez réponse 2"; 
   edit_width = 20;
 }
 popup_list {
   key = "lst1";
   label = "Choisir liste 1";
   edit_width = 20;
 }
 popup_list {
   key = "lst2";
   label = "Choisir liste 2";
   edit_width = 20;
 }
 spacer;
 ok_cancel;
}

 

Le LISP

 

(defun c:testDialog (/ dcl_id result)

 

;; charger le fichier DCL

(setq dcl_id (load_dialog "QuadInputBox.dcl"))

 

;; Appeler la boite de dialogue

(if (not (new_dialog "SpecialInputBox" dcl_id))

(exit)

)

 

;;; initialisation de la boite

 

;; attribuer une valeur par défaut au premier edit_box

(set_tile n "box1" "Défaut")

 

;; initialiser la liste 1

(start_list "lst1")

(mapcar 'add_list '("100" "200" "250" "250" "500"))

(end_list)

 

;; initialiser la liste 2

(start_list "lst2")

(mapcar 'add_list '("A" "B" "C" "D" "E"))

(end_list)

 

;; action si l'utilisateur clique "OK" :

;; result = liste des entrées et fermeture de la boite

(action_tile

"accept"

"(setq result (list

(get_tile \"box1\")

(get_tile \"box2\")

(nth (atoi (get_tile \"lst1\")) lst1)

(nth (atoi (get_tile \"lst2\")) lst2)))

(done_dialog)"

)

 

;; afficher la boite de dialogue

(start_dialog)

 

;; décharger la boite de dialogue

(unload_dialog dcl_id)

result

)

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

Posté(e)

Gile, merci tout d'abord de ton aide. La présentation de la dcl correspond exactement à ce que je veux faire. J'ai donc essayé d'utiliser la dcl. Je me suis permis de le modifier (il manqué un ; au lieu de : ligne 8 et ligne 15 yavait une erreur d'après Autocad : devant les popup list mais j'ai encore le retour erreur trop d'argument

 

Dans mon lisp initial, j'ai mis

 

(setq lst (testDialog))
(setq pdc (atof (nth 0 lst)))
(setq dc (atof (nth 1 lst)))
(setq echx (atof (nth 2 lst)))
(setq echy (atof (nth 3 lst))) 

 

pour récupérer les valeurs des entrées utlisateur,

J'ai aussi modifié la dcl comme suit

 

 // Boite de dialogue : 2 edit_box + 2 popup_list
SpecialInputBox:dialog {
 label = "Pr"; // Titre de la boite de dialogue
 initial_focus = "box1";
 :edit_box {
   key = "box1"; // identifiant du contrôle
   label = "Valeur PDC"; // libellé de la première boite
   edit_width = 35: // largeur de la boite d'édition
 }
 :edit_box {
   key = "box2";
   label = "Dist.cum";
   edit_width = 35;
 }
 popup_list {
   key = "lst1";
   label = "1/X";
   edit_width = 35;
 }
 popup_list {
   key = "lst2";
   label = "1/Y";
   edit_width = 35;
 }
 spacer;
 ok_cancel;
}

 

Et la fonction que j'ai rajouté à la fin de mon lisp

 

(defun testDialog ( / dcl_id result)

;; charger le fichier DCL
(setq dcl_id (load_dialog "QuadInputBox.dcl"))

;; Appeler la boite de dialogue
(if (not (new_dialog "SpecialInputBox" dcl_id))
(exit)
)

;;; initialisation de la boite

;; attribuer une valeur par défaut au premier edit_box
(set_tile n "box1" "0")
(set_tile n "box2" "0")

;; initialiser la liste 1
(start_list "lst1")
(mapcar 'add_list '("100" "200" "250" "250" "500" "1000" "1250" "1500" "2000" "2500" "5000"))
(end_list)

;; initialiser la liste 2
(start_list "lst2")
(mapcar 'add_list '("100" "200" "250" "250" "500" "1000" "1250" "1500" "2000" "2500" "5000"))
(end_list)

;; 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\")
(get_tile \"box2\")
(nth (atoi (get_tile \"lst1\")) lst1)
(nth (atoi (get_tile \"lst2\")) lst2)))
(done_dialog)"
)

;; afficher la boite de dialogue
(start_dialog)

;; décharger la boite de dialogue
(unload_dialog dcl_id)
lst
) 

 

A ceci, j'ai une question, dans les popup, on peut mettre autant de valeur à choisir que l'on veut ou bien ya t-il une limite dans le nombre de valeur ou de choix utilisateur ?

 

Merci par avance.

John.

 

Posté(e)

Au temps pour moi j'ai écris un peu vite sans vérifier.

D'un autre côté, corriger les erreurs est un bon exercice pour toi (je vois que tu ne l'as pas fait dans le fichier DCL.

 

Je viens de voir que j'en ai fait une grosse dans le LISP.

 

Il faudrait affecter la liste à une variable au début du code pour pouvoir utiliser la variable dans le (action_tile...)

 

(setq lst '("100" "200" "250" "250" "500" "1000" "1250" "1500" "2000" "2500" "5000"))

 

plus loin :

(start_list "lst1")

(mapcar 'add_list lst)

(end_list)

 

puis :

(action_tile

"accept"

"(setq lst (list

(get_tile \"box1\")

(get_tile \"box2\")

(nth (atoi (get_tile \"lst1\")) lst)

(nth (atoi (get_tile \"lst2\")) lst)))

(done_dialog)"

)

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

Posté(e)

Salut Gile,

 

Oui j'ai oublié de modifier sur le forum mais je l'ai fait en fait sur mon appli.

Par contre, j'ai toujours le retour ; erreur: nombre d'arguments trop important

Le fichier LSP

 

 (defun testDialog ( / dcl_id result lsth lst1 lst2)

;; charger le fichier DCL
(setq dcl_id (load_dialog "QuadInputBox.dcl"))

;; Appeler la boite de dialogue
(if (not (new_dialog "SpecialInputBox" dcl_id))
(exit)
)

;;; initialisation de la boite

;; attribuer une valeur par défaut au premier edit_box
(set_tile n "box1" "0")
(set_tile n "box2" "0")

(setq lsth '("100" "200" "250" "250" "500" "1000" "1250" "1500" "2000" "2500" "5000"))

;; initialiser la liste 1
(start_list lst1)
(mapcar 'add_list lsth)
(end_list)

;; initialiser la liste 2
(start_list lst2)
(mapcar 'add_list lsth)
(end_list)

;; 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\")
(get_tile \"box2\")
(nth (atoi (get_tile \"lst1\")) lsth)
(nth (atoi (get_tile \"lst2\")) lsth)))
(done_dialog)"
)

;; afficher la boite de dialogue
(start_dialog)

;; décharger la boite de dialogue
(unload_dialog dcl_id)
lst
)

 

Le fichier dcl

 

// Boite de dialogue : 2 edit_box + 2 popup_list
SpecialInputBox:dialog {
 label = "Pr"; // Titre de la boite de dialogue
 initial_focus = "box1";
 :edit_box {
   key = "box1"; // identifiant du contrôle
   label = "Valeur PDC)"; // libellé de la première boite
   edit_width = 7; // largeur de la boite d'édition
 }
 :edit_box {
   key = "box2";
   label = "Dist.cum";
   edit_width = 7;
 }
 :popup_list {
   key = "lst1";
   label = "1/X";
   edit_width = 7;
 }
 :popup_list {
   key = "lst2";
   label = "1/Y";
   edit_width = 7;
 }
 spacer;
 ok_cancel;
} 

 

Et en début de mon lisp principal j'ai mis

 


(setq lst (testDialog))

(setq pdc (atof (nth 0 lst)))
(setq dc (atof (nth 1 lst)))
(setq echx (atof (nth 2 lst)))
(setq echy (atof (nth 3 lst))) 

 

Merci de ton aide car je ne vois pas sérieusement.

John

 

[Edité le 16/8/2009 par chris_mtp]

Posté(e)

Pour localiser l'erreur, tu peux utiliser la méthode décrite ici ("D'où vient l'erreur ?").

 

Je te laisse un peu chercher...

Et tu verras qu'après celle là, il y en a une autre.

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

Posté(e)

C'est bon J'ai trouvé, ca marche nickel. Je connaissais pas cette recherche d'erreur avec Ctrl+F9.

C'est bien et pratique tout comme le Ctrl+Alt+E

 

Merci tout de même mais deux dernières petites questions,

 

1-on ne peut vraiment pas intégrer la boite de dialogue dcl dans le lisp car c'est mieux de gérer un fichier lsp au lieu de deux (un lsp et un dcl) ?

2-Il n'y a pas dans VisualLisp une interface graphique qui permet de créer les boutons, les popup et les textes assez facilement un peu comme en VBA ?

 

John.

 

[Edité le 16/8/2009 par chris_mtp]

Posté(e)

on ne peut vraiment pas intégrer la boite de dialogue dcl dans le lisp car c'est mieux de gérer un fichier lsp au lieu de deux (un lsp et un dcl) ?

 

Bien sûr qu'on peut, mais je pense qu'il est préférable, quand on apprend de procéder par étapes pour mieux comprendre ce qu'on fait.

 

Maintenant que le DCL te convient et que le LISP qui le contrôle fonctionne, il est facile d'ajouter au début du LISP les instructions qui écriront le DCL dans un fichier et de supprimer ce fichier après le déchargement de la boite de dialogue.

 

(defun testDialog (/ tmp file dcl_id result lsth lst1 lst2)

 ;; 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
   ;; ici tu colles le code DCL sous forme d'une chaîne unique
   ;; il faudra utiliser le caratère d'échappement (anti-slash : \)
   ;; devant tous les guillements imbriqués dans cette chaîne
   file
 )

 ;; fermer le fichier
 (close file)

 ;; charger le fichier
 (setq dcl_id (load_dialog tmp))

 ;; ...
 ;; ici le reste du code du LISP d'origine
 ;; ...


 ;; décharger la boite de dialogue
 (unload_dialog dcl_id)

 ;; supprimer le fichier
 (vl-file-delete tmp)

 lst
)

 

Il n'y a pas dans VisualLisp une interface graphique qui permet de créer les boutons, les popup et les textes assez facilement un peu comme en VBA ?

 

Non, mais il existe des applicatifs qui permettent de le faire : OpenDCL (gratuit) et ObjectDCL (payant).

En plus d'offrir une interface, ces programmes augmentent notablement les possibilités des boites de dialogue.

Mais il ne faut pas perdre de vue que la description d'une boite de dialoque (même en DCL) est toujours plus simple que son contrôle.

De plus, si tu dois partager des boites dialogues faites avec ODCL, il faut aussi fournir l'arx (runtime) qui permet de les lire.

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

  • 2 semaines après...
Posté(e)

Salut (gile)

 

Je viens de tester ton InputBox et je l'adopte :)

J'ai juste un problème, c'est quand je veux utiliser le caractère \n dans le message, le lisp plante.

 

@+

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)

Salut,

 

Effectivement, j'avais fais un truc qui fait des sauts de ligne automatiques tout les 50 caractères, mais on le peut pas utiliser "\n".

Tu peux faire :

(inputbox "test" "Première ligne Deuxième ligne" "")

Mais ce n'est ni élégant ni pratique.

 

Je crois que tu utilises une dll que j'avais fait pour la sélection de fichier multiples, tant qu'à utiliser une application tierce, je te propose plutôt LispDialog qui définit 4 fonctions LISP dont une InputBox.

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

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é