dcl rappeler boite de dialogue

Bonjour !!
J'ai un petit problème de programmation. Peut être que le sujet a déjà été traité, je n'ai pas vraiment pris le temps de regarder dans le
forum. J'ai beau avoir cherché quelques temps sur internet, je n'ai rien trouvé...
Il faut savoir que je débute en dcl. Le lisp devient de plus en plus familier, et je suis arrivé à avoir vraiment besoin d'une boîte de dialogue pour un lisp.
Ce lisp sert à incrémenter des caractères. Il ressemble à ceci :
;;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ;Incrémente des chiffres et des lettres. Créé par Matthieu Noblet (defun c:incmt () (setq temperror *error* *error* myerror count 0 cntr 0 endv 0 inc 1 a (findfile "GTPI_MACRO_BCAD/VAR.txt") ) (if a (progn (setq refi (open a "R")) (while (setq aa (read-line refi)) (if (or (eq aa "M")(eq aa "CM")(eq aa "MM")) (setq l1 aa)) ) (close refi) ); end of progn ); end of if (setq h_txt (cdr (assoc 40 (tblsearch "STYLE" (getvar "textstyle"))))) (if (or (eq h_txt nil)(eq h_txt 0)) (if (eq l1 "M") (setq h_txte 0.15) (if (eq l1 "CM") (setq h_txte 15) (if (eq l1 "MM") (setq h_txte 150) ))) (setq h_txte h_txt) ); end of if (initget 1 "A N") (setq alpnum (getkword "Alphabétique ou Numérique [A/N] : ")) (if (eq alpnum "N") (progn (while (>= count endv) (initget) (setq count (getint "Valeur de début: ")) (initget 1) (setq endv (getint "Valeur de fin: ")) (initget 1) (setq inc (getint "Incrément: ")) ); end of while ); end of progn (progn (while (>= count endv) (setq count (ascii (getstring "Caratère de début: ")) endv (ascii (getstring "Caractère de fin: "))) ); end of while ); end of progn ); end of if (if alpnum (progn (initget 1) (setq start (getpoint "Point de départ : ")) (initget (+ 1 2 4)) (setq displ (getdist start "\nDécalage : ") ang (getangle start "Direction <0> : ") htxt (getreal (strcat "Hauteur du texte <" (rtos h_txte 2 2) "> : ")) rot (getangle "Angle de rotation du texte <0> : ") ) (initget 1 "G C D") (setq jus (getkword "Justification du texte [G/C/D] : ")) (if (eq jus "G")(setq jus "MG")(if (eq jus "C")(setq jus "MC")(if (eq jus "D")(setq jus "MR")))) (if (null htxt)(setq htxt h_txte)) (if (null ang)(setq ang 0)) (if (null rot)(setq rot 0)(setq rot (angtos rot))) (while (<= count endv) (if (eq alpnum "N") (progn (if (< count 10)(setq count (strcat "0" (itoa count)))) (if (or (eq h_txt nil)(eq h_txt 0)) (command "_text" "j" jus start h_txte rot count) (command "_text" "j" jus start rot count) ) ) (if (or (eq h_txt nil)(eq h_txt 0)) (command "_text" "j" jus start h_txte rot (chr count)) (command "_text" "j" jus start rot (chr count)) ) );end of if (if (eq (type count) 'STR)(setq count (atoi count))) (setq start (polar start ang displ) count (+ count inc) cntr (1+ cntr)) );end of while (princ (strcat "\n" (itoa cntr) " textes créés.")) ); end of progn ); end of if (princ) );end of defun ;;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Si vous essayez de le charger, vous comprendrez très vite l'utilité d'une boîte de dialogue... En effet il faut entrer pas moins de 10 paramètres pour pouvoir générer ces textes.
Au passage, je travaille sous BricsCad, et les commandes ont parfois une sémantique différente... Donc vérifiez bien l'appel de la commande _text et ses paramètres avant de lancer cette routine sous autoCad... A terme je transformerai cette commande en un entmake, mais pas trop le temps pour ça !!
Bref... Je blablate....
Donc j'ai tenté d'écrire un petit programme en dcl, qui ressemble à ceci :
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX dincr : dialog { aspect_ratio = 0 ; label = "Incrémentation caractères" ; : column { :boxed_column { : popup_list { label = "Mode :" ; list = "Numérique\nAlphabétique" ; key ="Incmtmode"; mnemonic = "M"; alignment = right ; edit_width=14;} } spacer ; :boxed_column { label = "Valeur textes" ; key = "box2"; : edit_box { label = "Valeur de Début :"; key ="Incmtvald"; mnemonic = "d"; edit_width=10 ; } : edit_box { label = "Valeur de Fin :"; key ="Incmtvalf"; mnemonic = "f"; edit_width=10 ; } : edit_box { label = "Incrément :"; key ="Incmtincmt"; mnemonic = "I"; edit_width=10 ; } } spacer ; :boxed_column { label = "Position textes" ; key = "box3"; : row { : text { label = "Point de départ :"; alignment = left; fixed_width=true; width=10; } : button { label = ">>"; mnemonic = "o"; alignment=right; fixed_height=true; key = "incmpt"; fixed_width=true; width=10; is_default = false; } } : row { : text { label = "Décalage : "; alignment = left; } : button { label = ">>"; mnemonic = "d"; fixed_height=true; fixed_width=true; width=4; key = "incmdec"; is_default = false; } : edit_box { label = ""; key ="Incmtdec"; mnemonic = "e"; alignment=right; fixed_width=true; width=10; } } : row { : text {label = "Direction (en degrés) :"; alignment = left; } : button { label = ">>"; mnemonic = "r"; fixed_width=true; fixed_height=true; width=4; key = "Incmdir"; is_default = false; } : edit_box { label = ""; key ="Incmtdir"; mnemonic = "i"; alignment=right; fixed_width=true ; width=10; } } } spacer ; :boxed_column { label = "Options de texte" ; key = "box4"; : edit_box { label = "Hauteur :"; key ="Incmthtext"; mnemonic = "h"; edit_width=10 ; } : edit_box { label = "Angle rotation :"; key ="Incmtang"; mnemonic = "a"; edit_width=10 ; } : popup_list { label = "Justification :"; list = "Gauche\nCentre\nDroite"; key ="Incmtjust"; mnemonic = "j"; alignment = right; edit_width=10 ; } } } ok_cancel ; spacer_1 ; : text {label = "Créé par Matthieu Noblet"; alignment = center;} } //XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Bon ce programme est bien joli, avec tout ce qu'il faut pour valider la routine d'incrémentation...
Maintenant il faut créer la routine qui permettra de "dialoguer" avec la boîte...
Et là, c'est le drame... Je nage !! Je n'en suis qu'au début, et mon problème principal, c'est que je n'arrive pas à rappeler la boîte de dialogue lorsque le point d'insertion a été entré...
Si qqn pouvait m'aider, ça m'arrangerait énormément !!! Merci ! Adtal, comme on dit par chez nous !
PS : Je vous montre où j'en suis rendu... J'ai commencé par le plus dur, je n'ai pas du tout codé les champs de saisie....
(defun C:essai () (defun do_act (key_pr) (setq op key_pr) (if (= key_pr "cancel") (setq loop 0) ) (setq dlg_pt (done_dialog loop)) ) (setq dcl_id (load_dialog "essai.dcl")) (if (not (new_dialog "dincr" dcl_id)) (progn (princ "\nBoîte de dialogue 'essai.dcl' introuvable.") (exit)) ) (setq loop 1 bug 0 ) (while (and (/= loop 0) (< bug 20)) (setq bug (1+ bug)) (action_tile "cancel" "(do_act $key)") (action_tile "accept" "(do_act $key)") (action_tile "incmpt" "(done_dialog 1)(setq a 1)") (action_tile "incmdec" "(done_dialog 2)(setq a 2)") (action_tile "Incmdir" "(done_dialog 3)(setq a 3)") (start_dialog) (cond ((or (eq op "incmpt") (eq a 1)) (setq ptstart (getpoint "Point de départ : ")) ;(unload_dialog dcl_id) ; (new_dialog "dincr" dcl_id) ) ((or (eq op "incmdec") (eq a 2)) (setq displ (getdist start "\nDécalage : ")) ; (unload_dialog dcl_id) ; (new_dialog "dincr" dcl_id) ) ((or (eq op "Incmdir") (eq a 3)) (setq ang (getangle start "Direction <0> : ")) ; (unload_dialog dcl_id) ; (new_dialog "dincr" dcl_id) ) ) (if (eq bug 20) (princ "\nAttention boucle redondante.") ) (unload_dialog dcl_id) (princ) ) )
Merci d'avance, et bon courage pour la lecture !!! Désolé...
Add pictures here
✖
<% if( /^image/.test(type) ){ %>
<% } %>
<%-name%>
Add image file
Upload

Polytechforum.com is a website by engineers for engineers. It is not affiliated with any of manufacturers or vendors discussed here. All logos and trade names are the property of their respective owners.