Neophyte Posté(e) le 11 janvier 2016 Posté(e) le 11 janvier 2016 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.
Patrick_35 Posté(e) le 11 janvier 2016 Posté(e) le 11 janvier 2016 Salut Un excellent site pour le DCL @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bonuscad Posté(e) le 11 janvier 2016 Posté(e) le 11 janvier 2016 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
Neophyte Posté(e) le 11 janvier 2016 Auteur Posté(e) le 11 janvier 2016 Merci pour les réponses.Oui effectivement cela me semble compliqué. N'y a t il pas plus simple comme exemple et qui évite le 2 en 1 DCL+LISP ?
Olivier Eckmann Posté(e) le 11 janvier 2016 Posté(e) le 11 janvier 2016 Bonjour, si tu lis un peu l'anglais, ce site est très bien pour commencer Olivier
Neophyte Posté(e) le 11 janvier 2016 Auteur Posté(e) le 11 janvier 2016 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 ...
bonuscad Posté(e) le 11 janvier 2016 Posté(e) le 11 janvier 2016 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
Neophyte Posté(e) le 11 janvier 2016 Auteur Posté(e) le 11 janvier 2016 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 0A 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.
zebulon_ Posté(e) le 11 janvier 2016 Posté(e) le 11 janvier 2016 (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; } AmicalementVincent 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)
Neophyte Posté(e) le 11 janvier 2016 Auteur Posté(e) le 11 janvier 2016 (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 m70 km/h en courbe : 70 m 90 km/h en alignement droit : 80 m90 km/h en courbe : 90 m110 km/h en alignement droit : 100 m110 km/h en courbe : 110 m130 km/h en alignement droit : 120 m130 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 Modifié le 12 janvier 2016 par Neophyte ajout des balises bbcode
zebulon_ Posté(e) le 12 janvier 2016 Posté(e) le 12 janvier 2016 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) ) AmicalementVincent 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)
Neophyte Posté(e) le 12 janvier 2016 Auteur Posté(e) le 12 janvier 2016 Merci pour l'aide ! Je regarde ça ce soir à tête reposée et je vous contacte si j'ai d'autres problèmes / questions. Merci encore. Bonne journée.
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