Aller au contenu

Aide Boite DCL et fichier LISP


Messages recommandés

Posté(e)

Bonjour à tous et bonne année !

Etant néophyte en LISP, j'ai besoin d'aide concernant la création d'une boîte de dialogue et de son fichier LISP qui récupère les valeurs entrées dans la boîte.

Pouvez-vous me donner un exemple "bateau" de dcl contenant une "list_box" (indiquant les couleurs par exemple) ainsi que son lisp qui permet d'afficher du texte en fonction de la couleur choisie dans la liste (si on choisit bleu on affiche ciel, rouge => coquelicot, etc ...).

 

Merci.

Posté(e)

Bonjour,

 

Un exemple:

Il te semblera peut être un peu complexe car il réunit le lisp et le dcl.

En effet le lisp se charge d'écrire le DCL. En effet j'ai remarqué que les gens oubliaient souvent de joinde le DCL à leur lisp, résultat le code lisp ne fonctionne pas.

 

Le code suivant permet de créer une boite de dialogue polyvalente, c'est à dire choisir une valeur dans une liste.

 

(defun str2lst (str sep / pos)
(if (setq pos (vl-string-search sep str))
	(cons
		(substr str 1 pos)
		(str2lst (substr str (+ (strlen sep) pos 1)) sep)
	)
	(list str)
)
)
(defun ListBox (title msg keylab flag / tmp file dcl_id choice)
(setq
	tmp (vl-filename-mktemp "tmp.dcl")
	file (open tmp "w")
)
(write-line
	(strcat "ListBox:dialog{label=\"" title "\";")
	file
)
(if (and msg (/= msg ""))
	(write-line (strcat ":text{label=\"" msg "\";}") file)
)
(write-line
	(cond
		((= 0 flag) "spacer;:popup_list{key=\"lst\";")
		((= 1 flag) "spacer;:list_box{key=\"lst\";")
		(T "spacer;:list_box{key=\"lst\";multiple_select=true;")
	)
	file
)
(write-line "}spacer;ok_cancel;}" file)
(close file)
(setq dcl_id (load_dialog tmp))
(if (not (new_dialog "ListBox" dcl_id))
	(exit)
)
(start_list "lst")
(mapcar 'add_list (mapcar 'cdr keylab))
(end_list)
(action_tile
	"accept"
	"(or (= (get_tile \"lst\") \"\")
		(if (= 2 flag)
			(progn
				(foreach n (str2lst (get_tile \"lst\") \" \")
					(setq choice (cons (nth (atoi n) (mapcar 'car keylab)) choice))
				)
				(setq choice (reverse choice))
			)
			(setq choice (nth (atoi (get_tile \"lst\")) (mapcar 'car keylab)))
		)
	)
	(done_dialog)"
)
(start_dialog)
(unload_dialog dcl_id)
(vl-file-delete tmp)
choice
)

 

Exemple d'appel:

; définition de la liste
(setq lst_col '(("1" . "coquelicot") ("4" . "ciel") ("3" . "sapin") ("6" . "bonbon")))

; interrogation de la liste à travers le DCL
(listbox "Table de couleur" "Choisir une couleur" lst_col 1)

 

(Edition) Idée originale de (gile) que je me suis appropriée.

 

(listbox "Table de couleur" "Choisir une couleur" lst_col 0)

Présente la liste sous forme déroulante et retourne le choix effectué

 

(listbox "Table de couleur" "Choisir une couleur" lst_col 1)

Présente la liste (avec éventuellement ascenceur) et retourne le choix effectué

 

(listbox "Table de couleur" "Choisir une couleur" lst_col 2)

Présente la liste (avec éventuellement ascenceur) ET permet le choix multiple, retourne alors une liste des choix effectués.

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

Posté(e)

Merci mais j'ai posté ce message justement parce que j'ai du mal à le comprendre et que j'aimerai faire mon programme à partir d'un exemple simple en français ...

Posté(e)
Etant néophyte en LISP

 

En même temps s'attaquer au DCL en ne maitrisant pas le lisp, cela va être ardu.

Et en plus tu veux commencer par des list_box...

 

Je ne peux te conseiller que de persévérer, (j'espère que tu as des cheveux!) ou revoir tes priorités.

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

Posté(e)

C'est pour faire mon projet de fin d'études donc j'ai pas vraiment le choix...

J'ai eu des cours de LISP mais le prof nous donner les programmes tout fait donc niveau apprentissage 0

A la rigueur je vais continuer mon DCL avec des "radio button" que j'ai commencé, je le posterai sur le forum pour voir si cela est correct.

Posté(e)

(defun c:textcol (/ listcol dcl_id What_next)

 (setq listcol '("Rouge" "Vert" "Jaune" "Bleu"))

 ; initialisation variable générale
 ; permet de garder la valeur précédente
 (if (not COL_TEXTCOL) (setq COL_TEXTCOL "0"))

 ;ouverture de la boîte de dialogue
 (setq dcl_id (load_dialog "textcol.dcl"))
 (if (not (new_dialog "textcol" dcl_id)) (exit))

 (start_list "col")
   (mapcar 'add_list listcol)
 (end_list)

 ; initialise à la valeur précédente ou à "0" si elle n'existe pas
 (set_tile "col" COL_TEXTCOL)

 (action_tile "col" "(setq COL_TEXTCOL $value)")
 (action_tile "accept" "(done_dialog 2)")
 (action_tile "cancel" "(done_dialog 0)")


 (setq What_next (start_dialog))
 (unload_dialog dcl_id)

 (cond
   ((= what_next 2) (alert (strcat "C'est le " (nth (atoi COL_TEXTCOL) listcol))))
   ((= what_next 0) (alert "Echap"))
 )
 (princ)
)

 

textcol : dialog {
         label = "Texte en couleur";
         : popup_list {
           key = col;
         }
         spacer_1;
         ok_cancel;
}

 

Amicalement

Vincent

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e) (modifié)

Voici mon DCL qui est selon moi terminé :

 

projetbis:dialog {label="Paramètres du tracé routier - Section Courante";
:row {
:boxed_column {label="";
		:edit_box{label="&Nom de la route :" ;/*edit_width=6;fixed_width=true;*/key=nom;}
spacer_1;
		:radio_row{label="&Vitesse :";
		:radio_button {label="70";key=soixantedix;}
		:radio_button {label="90";key=quatrevingtdix;}
		:radio_button {label="110";key=centdix;}
		:radio_button {label="130";key=centtrente;}
		}
spacer_1;
		:radio_row {label="&Géométrie de la route :";
		:radio_button {label="Alignement droit";key=droit;}
		:radio_button {label="Courbe";key=courbe;}
		}
spacer_1;
		:edit_box{label="&Distance entre chaque point d'observation (en m) :" ;/*edit_width=6;fixed_width=true;*/key=pas;}
spacer_1;
		:edit_box{label="&Renseigner la largeur de la voie concernée par le programme (en m) :" ;/*edit_width=6;fixed_width=true;*/key=lar;}
    			}
    }
:row {ok_cancel;}
:row {errtile;}
	}

 

Et voici le début de mon lisp. Désormais je dois stocker des distances d'arrêt dans des variables en fonction des choix fait dans la boîte de dialogue :

 

70 km/h en alignement droit : 60 m

70 km/h en courbe : 70 m

90 km/h en alignement droit : 80 m

90 km/h en courbe : 90 m

110 km/h en alignement droit : 100 m

110 km/h en courbe : 110 m

130 km/h en alignement droit : 120 m

130 km/h en courbe : 130 m

 

; Création de la fonction principale

; I] Chargement de la boîte de dialogue

(defun C:project ()
(setq dcl_id (load_dialog "projetbisdcl.dcl"))
       (if (not (new_dialog "projetbis" dcl_id)) 
       (exit))

 

Pouvez vous me mettre sur le chemin svp

post-63417-0-56552600-1452553323_thumb.jpg

Modifié par Neophyte
ajout des balises bbcode
Posté(e)

Bonjour,

 

Voici mon DCL qui est selon moi terminé :

 

Selon moi, il manque une chose importante : si tu veux utiliser des boutons de radio, il faut aussi mettre une clé aux deux radio_row dans lesquelles on pourra récupérer le nom de la clé du bouton choisi par l'utilisateur.

 

Ensuite, je ne suis pas convaincu de la nécessité de mettre des row un peu partout. Il faudrait aussi soigner la présentation du dcl, avec des indentations, pour en faciliter la lecture. Je sais bien que c'est une hérésie de définir un objet graphique de façon littérale, mais c'est comme ça...

 

Je pense aussi que l'utilisation de popup_list seraient une variante intéressante à étudier (voir l'exemple que j'ai fourni ci-dessus), mais bon, restons en aux boutons de radio pour l'instant.

 

projetbis : dialog {
           label = "Paramètres du tracé routier - Section Courante";
           : edit_box{
             label = "&Nom de la route :" ;
             /*edit_width = 6;*/
             /*fixed_width = true;*/
             key = nom;
           }
           spacer_1;
           : radio_row {
             label = "&Vitesse :";
             key = vitesse;
             : radio_button {
               label = "70";
               key = soixantedix;
             }
             : radio_button {
               label = "90";
               key=quatrevingtdix;
             }
             : radio_button {
               label = "110";
               key = centdix;
             }
             : radio_button {
               label = "130";
               key = centtrente;
             }
           }
           spacer_1;
           : radio_row {
             label = "&Géométrie de la route :";
             key = geom;
             : radio_button {
               label = "Alignement droit";
               key = droit;
             }
             : radio_button {
               label = "Courbe";
               key=courbe;
             }
           }
           spacer_1;
           : edit_box {
             label = "&Distance entre chaque point d'observation (en m) :" ;
             /*edit_width = 6;*/
             /*fixed_width = true;*/
             key = pas;
           }
           spacer_1;
           : edit_box {
             label = "&Renseigner la largeur de la voie concernée par le programme (en m) :" ;
             /*edit_width = 6;*/
             /*fixed_width = true;*/
             key = lar;
           }
           spacer_1;
           ok_cancel;
           errtile;
         }

 

(defun C:project (/ dcl_id what_next init_project do_test_project do_accept_project project_main)

 (defun init_project ()
   (if (not PROJECT_NOM) 
     (setq PROJECT_NOM "")
   )
   (if (not PROJECT_VITESSE) 
     (setq PROJECT_VITESSE "soixantedix")
   )
   (if (not PROJECT_GEOM)
     (setq PROJECT_GEOM "droit")
   )
   (if (not PROJECT_PAS) 
     (setq PROJECT_PAS "")
   )
   (if (not PROJECT_LAR) 
     (setq PROJECT_LAR "")
   )

 )

 (defun do_test_project (MSG VALEUR)
   (if (not (> (distof VALEUR) 0))
      (set_tile "error" MSG)
      (set_tile "error" "")
   )
 )

 (defun do_accept_project ()
   (setq PROJECT_NOM (get_tile "nom"))
   (setq PROJECT_VITESSE (get_tile "vitesse"))
   (setq PROJECT_GEOM (get_tile "geom"))
   (setq PROJECT_PAS (get_tile "pas"))
   (setq PROJECT_LAR (get_tile "lar"))
   
   ;; on peut faire ici des tests sur le contenu des variables si on ne veut pas accepter tout et n'importe quoi avant de faire un done_dialog
   ;; par exemple pour "pas" et "lar" on ne veut que des réels positifs
   (if (not (> (distof PROJECT_PAS) 0))
     (set_tile "error" "Distance incorrecte")
     (if (not (> (distof PROJECT_LAR) 0))
       (set_tile "error" "Largeur incorrecte")
       (done_dialog 2)
     )
   )
 )

 (defun project_main ()
   (alert
     (strcat
       "Le nom du projet : " PROJECT_NOM
       "\nLa vitesse : " PROJECT_VITESSE
       "\nLa géométrie : " PROJECT_GEOM
       "\nLa distance : " PROJECT_PAS " m"
       "\nLa largeur : " PROJECT_LAR " m"
     )
   )
 )

 (init_project)

 (setq dcl_id (load_dialog "projetbisdcl.dcl"))
 (if (not (new_dialog "projetbis" dcl_id)) (exit))

 (set_tile "nom" PROJECT_NOM)
 (set_tile "vitesse" PROJECT_VITESSE)
 (set_tile "geom" PROJECT_GEOM)
 (set_tile "pas" PROJECT_PAS)
 (set_tile "lar" PROJECT_LAR)

 (action_tile "pas" "(do_test_project \"Distance incorrecte\" $value)")
 (action_tile "lar" "(do_test_project \"Largeur incorrecte\" $value)")
 (action_tile "accept" "(do_accept_project)")
 (action_tile "cancel" "(done_dialog 0)")

 (setq what_next (start_dialog))
 (unload_dialog dcl_id)
 (if (= what_next 2)   ;OK
   (project_main)
 )

 (princ)
)

 

Amicalement

Vincent

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

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é