Dcl

Hoje vou postar um código que trata de dcl, mostrando duas "tiles" legais: toggle e slider... também mostrarei como se pode personalizar os botões "OK" e "CANCEL" que vemos nos diálogos, vejam:
;|mostra um diálogo para você escolher layers
  tit  ->  título, string
  maxl ->  numero máximo de linhas a serem mostradas,
           se omitido, assume o valor 15
  lst  ->  lista de strings com os nomes dos layer que
           devem estar pré selecionados|;

(defun get-lst-layer  (tit maxl lst / lays tmp file filename
                       dcl n  qtd lay key update-lst-lays
)
;sub-rotina para atualizar a tela do diálogo
  (setq update-lst-lays
         (lambda (val / n)
           (
setq n 0
                 s val)
           (
repeat (min maxl qtd)
             (
setq lay (nth (+ n (- qtd maxl s)) lays)
                   n   (1+ n)
                   key (itoa n))
             (
set_tile (strcat "tx" key) lay)
             (
set_tile (strcat "tg" key)
                       (
if (member lay lst) "1" "0"))
             (
action_tile  (strcat "tg" key)
               (
strcat
                 "(setq lst (if (= \"1\" $value) (cons \""
                 lay "\" lst) (vl-remove \"" lay "\" lst)))"))))
;pegue a lista de layers do desenho em ordem alfabetica:
        lays            (vl-sort (get-tableof "layers") '<)
;cria um nome de arquivo temporário:
        filename        (vl-filename-mktemp "gll.dcl")
;cria o arquivo e abre ele para edição:
        file            (open filename "w")
        n               0
;se nao foi fornecido o numero de linhas, assume que sejam 15
        maxl            (if maxl maxl 15)
;quantidade de layers no desenho:
        qtd             (length lays))
;inicia a criação do diálogo:
  (write-line
    (strcat "getlstlayer : dialog {width = 50; label = \""
            tit  "\";\n:row { :column {") file)
  ;escreve tantas linhas quanto fornecido pela variavel MAXL:
  (repeat (min maxl qtd)
    (
setq n (1+ n))
    (
write-line
      (strcat ":row { :toggle { key = \"tg" (itoa n)
              "\";} :text{ width=50; key = \"tx"
              (itoa n) "\";}}")
      file))
  ;finaliza a criação do dcl construindo os botões:
  (write-line
    (strcat "}\n"
      (if (> qtd maxl)
        (
strcat
          ":slider { key = \"s\"; min_value = 0;  max_value = "
          (itoa (- qtd maxl)) "; big_increment = "  (itoa maxl)
          "; layout = vertical;}")  "")
"} :row{ :button {key = \"ALL\"; label = \"Tudo\";}
:button {key = \"NEM\"; label = \"Nenhum\";} "

;botão ok:
":button {label = \"Ok\"; key=\"accept\";
is_default=true;}"

;botão cancel:
":button {label = \"Sair\"; key=\"cancel\";
is_cancel=true;}}}"
)
    file)
  ;fecha o arquivo, ele está pronto!
  (close file)
  ;carrega o arquivo DCL na memória do cad:
  (setq dcl (load_dialog filename)
        s   (- qtd maxl)) ;posição do slider...
  ;abre um quadro de diálogo:

  (new_dialog "getlstlayer" dcl)
  ;define as ações de cada elemento do diálogo...
  (action_tile "s" ;slider
    "(update-lst-lays (atoi $value))")
  (
action_tile  "ALL"
    "(progn (setq lst lays)
         (update-lst-lays s))"
);botao todos
  (action_tile  "NEM"
    "(progn (setq lst nil)
        (update-lst-lays s))"
);botão nenhum
;marca a posição do slider:

  (set_tile "s" (itoa s))
;atualiza o estados das toggles...:
  (update-lst-lays s)
;inicia o diálogo, e salva o resultado
  (setq lst (if (start_dialog) lst))
;descarrega o diálogo
  (unload_dialog dcl)
;apaga o dcl temporário que criamos
  (vl-file-delete filename)
  lst)

Nenhum comentário:

Postar um comentário