dcl rappeler boite de dialogue

Discussion in 'AutoCAD' started by galahadmatt666, Jun 5, 2007.

  1. 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é...
     
    galahadmatt666, Jun 5, 2007
    #1
Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.