Você está na página 1de 28

Curso de AutoLisp Marcelo Silva cracksther@gmail.

com - 2007

AutoLISP / DCL

CAIXAS DE DILOGO

MARCELO SILVA
cracksther@gmail.com

CASCAVEL 2007

1 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

CAIXAS DE DILOGO

As aplicaes em AutoLisp podem interagir com


caixas de dilogo atravs de uma srie de sub-rotinas
que suportam o sistema de caixas de dilogo.
Para facilitar o estudo, ser referido s caixas de
dilogo apenas como caixas.
A linguagem DCL (Dialog Control Language)
utilizada para definir as caixas, as quais devem ser
salvas em arquivo de texto com a extenso .dcl. Um
nico arquivo .dcl pode conter a definio de vrias
caixas, as quais devem ser identificadas por um nome
nico no arquivo. Pode-se tambm definir modelos e
posteriormente utiliza-los nas caixas.
Alguns componentes utilizados, tais como os botes
OK e Cancel so geralmente inseridos nas caixas a
partir de modelos pr-definidos. O Autocad traz
muitos modelos teis pr-definidos, os quais esto
armazenados no arquivo base.dcl encontrado na
pasta support do AutoCAD, interessante dar uma

2 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

analisada no arquivo aps ter adquirido um mnimo


de conhecimento da DCL.
Em AutoLISP, antes de poder utilizar uma
determinada rotina necessrio carregar o arquivo
que contm o cdigo fonte da mesma, o mesmo
ocorre com DCL, no entanto, ao contrrio do que
acontece em AutoLisp, boa prtica de programao
carregar e descarregar os arquivos DCL somente no
momento de sua utilizao, isso feito atravs da
rotina AutoLISP que o utiliza, desta forma as caixas
no ficam ocupando memria quando no esto
sendo utilizadas, alm de prevenir conflitos. Os
Arquivos .LSP ficam carregados permanente na
memria enquanto o AutoCAD estiver carregado, pois
inconveniente carregar e descarregar os arquivos
.LSP toda vez que for utilizar uma rotina.
Outro detalhe importante que ao contrrio da
AutoLisp, a DCL sensvel ao caso, ou seja,
diferencia maisculo de minsculo, sendo portanto,
caixa_01 diferente de CAIXA_01.

3 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

A forma correta para o nome dos componentes pr-


definidos pertencentes ao AutoCAD sempre em
minsculo, no entanto pode-se utilizar maisculo para
nomear novos componentes.
Aps ter carregado o arquivo .dcl com a definio das
caixas deve-se inicializar a caixa desejada com a
funo new_dialog e ento configurar todos os
campos com as funes apropriadas para s ento
permitir ao usurio interagir com a caixa, isso feito
com a execuo da funo start_dialog, e por fim,
deve-se descarregar o arquivo .dcl com a funo
unload_dialog quando o usurio abandonar a caixa. A
funo done_dialog responsvel por abandonar a
caixa e retornar um status informando o que
aconteceu, por tanto esta funo deve estar presente
no cdigo AutoLISP, geralmente est ligada um
boto (ex: OK, Cancel, etc...).

4 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

Deve ficar claro que load_dialog, new_dialog,


start_dialog, done_dialog e unload_dialog so
funes da AutoLISP que suportam DCL, estas
funes funcionam apropriadamente em conjunto,
portanto todas devem aparecer no cdigo para um
correto funcionamento da caixa.

LOAD-DIALOG Carrega um arquivo .dcl. Retorna


um inteiro positivo se bem sucedido, ou um inteiro
negativo caso no consiga carregar o arquivo. O
inteiro retornado por load_dialog tido como sendo
um o descritor do arquivo dcl, ou ainda, ponteiro de
dilogo, deve-se sempre redireciona-lo para uma
varivel qualquer a fim conseguir referencia-lo
posteriormente.
Sintaxe:
(load_dialog caminho/arquivo.exteno)
Caso o caminho seja omitido, a funo ir procurar
nos diretrios quais tm acesso direto (diretrios de
suporte).

5 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

Exemplo:
(setq dcl-id (load_dialog c:/autolisp/dcl/caixa-01.dcl))

Embora no seja regra obrigatria, boa prtica de


programao sempre utilizar a funo new_dialog
logo aps carregar o arquivo dcl.

NEW_DIALOG Inicializa uma caixa de dilogo e a


exibe na tela, no entanto, no permite o usurio
interagir com a caixa exibida at o momento, isso
somente ser permitido aps start_dialog ser
invocada.
Sintaxe:
(new_dialog ponteiro-dialogo nome da caixa))
Onde ponteiro-dialogo gerado por load_dialog e
nome da caixa uma string que identifica de forma
nica uma caixa em um arquivo dcl (mais detalhes
adiante).

6 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

new_dialog pode no conseguir inicializar uma caixa


por dois motivos.
1. A funo load_dialog no conseguiu carregar o
arquivo .dcl.
2. O nome da caixa no existe no arquivo .dcl.
Caso isso ocorra no possvel continuar com a
caixa, portanto deve-se introduzir cdigo de
tratamento de erro capaz de seguir adiante sem a
caixa ou simplesmente abandonar a rotina evitando
erros fatais.
Exemplo: (arquivo file-01.dcl)
CAIXA_01 : dialog {
label = Minha primeira caixa!;
: button {
label = Mensagem;
key = botao_msg;
action = (alert \Funcionou!\);
}
ok_cancel;
}

7 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

Observaes:
O uso de ; (ponto-e-virgula) no final de todas as
linhas, exceto as que terminam com { ou }, regra
obrigatria.
Em (alert \Funcionou!\) necessrio utilizar \
para representar uma , para evitar o fechamento
precoce da string.
ok_cancel um modelo pr-definido, vide base.dcl.
Os demais itens sero explicados posteriormente.

(Arquivo file-01.lsp)
(defun c:caixa-01 (/ dcl-id)
(setq dcl-id (load_dialog "file-01.dcl")) ;carrega o
arquivo .dcl
(if (not (new_dialog "CAIXA_01" dcl-id))(exit))
;verifica se possvel e inicializa a caixa, caso no
consiga, simplesmente abandona a funo (exit).
(start_dialog) ;inicia interao c/ usurio
(unload_dialog dcl-id) ;descarrega o arquivo .dcl
)

8 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

Note que a funo done_dialog no apareceu em


ambos os arquivos, no entanto est funo est
embutida no modelo ok_cancel, sendo que a mesma
retorna 1 se clicar em OK e 0 para Cancel. Veremos
done_dialog mais detalhado adiante.

START_DIALOG Inicializa a interao do usurio


com a caixa apresentada. Esta funo retorna o valor
fornecido por done_dialog, este valor indica como o
usurio saiu da caixa, isso importante, pois as
variveis devem ser ou no atualizadas somente
aps o usurio sair da caixa e dependendo da ao
ocorrida (no se deve alterar variveis se o usurio
clicar em cancel).
Sintaxe:
(start_dialog) ;note que a funo no tem parmetros
Para testar, acione em c:caixa-01 um setq frente da
funo [ex: (setq ok_esc (start_dialog)) ] e depois use
princ para imprimir o valor [ex: (princ \nValor de
sada: ) (princ ok_esc) ].

9 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

UNLOAD_DIALOG Descarrega um arquivo .dcl a


partir de um ponteiro de dilogo. boa prtica
sempre carregar e descarregar os arquivos .dcl
atravs da rotina AutoLisp que ir utiliz-lo, isso ajuda
a evitar erros e conflitos alm de liberar memria.
Sintaxe:
(unload_dialog ponteiro-de-dilogo)
Onde ponteiro-dialogo gerado por load_dialog.

DONE_DIALOG Termina uma caixa de dilogo e


retorna um cdigo informando como o usurio saiu da
caixa, este cdigo deve ser utilizado para saber como
seguir adiante.
Cdigos usuais:
0 = Cancel;
1 = OK;
4 = Hide dialog, usado para permitir o usurio
interagir com a tela grfica (ex: seleo de objetos).

10 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

Exemplo: (Arquivo file-01.dcl)


CAIXA_02 : dialog {
label = Hide dialog;
: button {
label = Selection;
key = bt_sel;
}
ok_cancel;
}
(Arquivo file-01.lsp)
(defun c:caixa-02 (/ dcl-id saida sel)
(setq dcl-id (load_dialog "file-01.dcl") saida 4)
(while (>= saida 2)
(if (not (new_dialog "CAIXA_02" dcl-id))(exit))
(action_tile bt_sel (done_dialog 4))
(setq saida (start_dialog))
(if (= saida 4) (setq sel (ssget)))
)
(unload_dialog dcl-id)
)

11 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

A varivel sada inicializada com valor = 4;


O loop while permanece enquanto sair for >= 2;
A varivel sada atualizada com o valor retornado
por (start_dialog), que o mesmo retornado por
done_dialog.
O cdigo (action_tile bt_sel (done_dialog 4))
configura a ao a executar ao clicar o boto
Selection, logo um clique neste boto termina a
caixa e retorna o valor 4. Em AutoLisp action_tile
equivalente utilizar a propriedade action em DCL.
Os botes Ok e Cancel retornam 0 e 1
respectivamente, fazendo que o loop acabe.

Exerccio:
Adicione ao exemplo anterior um boto chamado
erase, sendo que ao clicar em Ok devem ser
apagados os objetos selecionados a partir do boto
Selection, se o usurio clicar em Cancel, nada deve
ser feito.
Ter um erro fatal no cdigo, tente prever e evitar.

12 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

ACTION_TILE Funo que configura, ou liga, um


componente uma funo, a qual ser executada
quando o componente for selecionado ou
abandonado, dependendo do tipo do componente.
Sintaxe:
(action_tile key funo)
Observe que ambos os parmetros so strings.
No caso da funo apontada pelo 2 parmetro
receber uma string esttica como parmetro
necessrio envolver a string parmetro por um para
de \ para evitar o fechamento precoce da string
que representa o parmetro funo.
exemplo: (action_tile key (alert \Mensagem\))

importante saber que uma caixa composta


por n quantidade de componentes, e que cada
componente por ter vrios atributos, que podem
simplesmente serem omitidos na definio da caixa,
neste caso o valor padro assumido.

13 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

Mesmo que um atributo esteja oculto ele pode ser


acessado e modificado pelo cdigo AutoLisp.
Exemplo: (arquivo file-01.lsp)
CAIXA_03 : dialog {
label = "Action Tile / action";
: button {
label = "1 boto";
key = "bt_01";
action = "(alert \"Primeiro\")";
}
: button {
label = "2 boto";
key = "bt_02";
}
ok_cancel;
}

14 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

(arquivo file-01.lsp)
(defun c:caixa-03 (/ dcl-id)
(setq dcl-id (load_dialog "file-01.dcl"))
(if (not (new_dialog "CAIXA_03" dcl-id))
(exit)
)
(action_tile "bt_02" "(alert \"Segundo!\")")
(start_dialog)
(unload_dialog dcl-id)
(princ)
)

No exemplo citado, temos trs componentes (01


dialog e 02 button), foram utilizados os seguintes
atributos (label, key, value e action) alm de um
modelo pr_definodo (ok_cancel).
Note que a ao para o 1 boto foi configurada na
prpria definio da caixa, j a ao para o 2 boto
foi configurada a partir da rotina AutoLisp.

15 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

COMPONENTES E MODELOS PR-DEFINIDOS

Um dos componentes mais atpicos dialog, ou seja,


seus atributos fogem ao padro.
: dialog {
initial_focus label value
}
initial_focus = key; configura qual componente
ter o foco inicial.
label = Titulo do dilogo;
value = Titulo do dilogo;
label e value so equivalente para dialog, no entanto
somente value pode ser alterada pela funo set_tile,
a qual ser detalhada frente.

Para saber quais atributos so aceitos por quais


componentes, consulte DCL Tile Catalog no help do
Visual Lisp. Embora o help seja ruim, est seo
interessante, pois traz imagens ilustrativas dos
componentes.

16 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

LISTA COMPLETA DE COMPONENTES


: boxed_column
: boxed_radio_column // descartvel
: boxed_radio_row // descartvel
: boxed_row
: button // boto
: column // alinha os componentes em coluna (default)
: concatenation // concatena : text_part e gera um text
: text // texto de nica linha
: text_part // = :text, porm pode ser concatenado
: paragraph // texto de mltiplas linhas, na verdade
une multiplos :text ou :text_part;
: dialog // define uma caixa de dilogo
: edit_box // campo para entrada de texto.
errtile; // apenas uma frase informando sobre algo
ok_only;
ok_cancel; // modelo pr-definido - botes ok e cancel
ok_cancel_help;
ok_cancel_help_errtile;
ok_cancel_help_info;

17 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

: image Para inserir uma imagem em um caixa


necessrio que a imagem esteja no formato slide
(.lsd), para fazer isso basta deixa na tela do AutoCAD
a imagem ou desenho desejado e utilizar o comando
MSLIDE para criar um arquivo .sld.
Exemplo: (arquivo dcl)
: image {
: key = img-01;
: height = 5;
: width = 5;
: fixe_height = true;
: fixed_width = true;
}
A imagem deve ser inserida no campo atravs das
funes (start_image)(slide_image)(end_image) nesta
ordem, conforme segue o exemplo:
(setq x2 (dimx_tile img-01) y2 (dimx_tile img-01))
(start_image img-01)
(slide_image 0 0 5 5 fig-01)
(end_image)

18 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

Onde:
start_image inicia a criao de uma imagem em
uma caixa.
img-01 chave de identificao do componente.
0 0 indicam o inicio da imagem (x1 e y1)
dimx_tile e dimy_tile retornam o comprimento e
altura do componente respectivamente.
x2 y2 indicam o termino da imagem
fig-01 o arquivo .sld que deve estar em uma
pasta com suporte
end_image finaliza a criao da imagem
: image_button // vale o mesmo mtodo de image.
: row // alinha os componentes em linha
: slider // barra deslizante.
: toggle // quadradinho para marcar com V.
: spacer
: spacer_0
: spacer_1

19 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

: radio_button
: radio_column
: radio_row
Esses trs componentes definem um conjunto de
botes do tipo radio (bolinhas que ao clicar em uma,
desmarca a outra). Deve-se optar por : radio_row ou
: radio_column, significando optar por botes em linha
ou em coluna respectivamente
: radio_row {
: radio_button {
label = boto 01;
key = bt-01;
action = (setq val-bt 1);
}
: radio_button {
label = boto 02;
key = bt-02;
action = (alert \Teste\);
}
}

20 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

: list_box Caixa do tipo texto, no entanto cada linha


um item que pode ser selecionado
independentemente dos demais.
Exemplo:
: list_box {
label = escolha um opo;
key = lst-01;
action = (setq val $value);
list = 02\n04\n08\n16;
}
Vide explicaes sobre os atributos tabs e
tab_truncate;
: popup_list semelhante list_box;

A lista de itens para list_box e popup_list pode ser


inicializada explicitamente atravs do atributo list ou
atravs de AutoLisp, com segue:
(setq lista (list um dois trs quatro)) ; lista
contendo os itens a serem inseridos na lista.

21 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

(start_list lst-01 [modo [pos]]) ;inicializa o processo


de adio de itens lista de um componente lixt_box
ou popup_list, o argumento modo incida:
1 substituir um elemento na posio n
2 adicionar ao final
3 apagar a lista atual e fazer outra (default)
Exemplo para o modo 1.
(start_list lst-01 1 2)
(add_list 03)
(end_list) ;finaliza a insero de itens

Para os modos 2 e 3 utiliza o seguinte modelo.


(start_list lst-01 2)
(mapcar add_list lista)
(end_list) ;finaliza a insero de itens

22 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

LISTA COMPLETA DE ATRIBUTOS DCL

Muitos atributos so comuns e com o mesmo


significado para a maioria dos componentes DCL.
Consulte Synopsis of Predefined Attributes no help do
Visual Lisp para obter uma tabela de relao entre
atributos e componentes .
action = string - Liga um componente uma funo.
label = string - Texto que identifica visualmente um
componente.
key = string Chave que identifica um componente
em termos de programao.
value = string Valor inicial.

alignment = left, right, centered, top, bottom;


alinhamento do componente dentro de um cluster
(column ou row).
children_alignment = similar alignment, sendo que
este para todos os componentes em um cluster.

23 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

allow_accept = true ou false; quando o foco estiver


em edit_box, image_button ou list_box, e for
pressionado ENTER, faz com que seja ou no
chamado a ao do boto default, usualmente o
boto OK.
aspect_ratio = n real; proporo do comprimento
pela altura.
Ex:
: image_button {
height = 3;
color = 2;
aspect_ratio = 0.8;
}
Este exemplo cria um boto de imagem com altura 3
e comprimento = 0.8x5. Obs: o valor pode ser > 1.0.
color = cor acad cor de fundo para uma imagem.

big_increment = 1 max_value; incremento do


slider com as teclas Page Up e Page Down.
Small_increment = 1 max_value; incremento do
slider com as teclas (setas de direo).
max_value = n real; valor mximo para um slider.
24 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007
Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

min_value = n real; valor mnimo para um slider.


layout = vertical ou horizontal Determina se o
slider ser na vertical ou horizontal.

height = n inteiro; determina a altura de um


componente, no entanto deve-se ressaltar que os
componentes so dimensionados automaticamente
para um melhor ajuste, para evitar isso se tem os
atributos fixed_*;
fixed_height = instrui o AutoCAD a no
redimensionar o componente.
children_fixed_height = similar fixed_height, no
entanto este e para todos os componentes de um
cluster.
width, fixed_width e children_fixed_width = similar
aos seus correspondentes height, no entanto width
refere-se ao comprimento dos componentes.

edit_limit = n inteiro Nmero limite de caracteres


para um campo edit_box.

25 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

edit_width = n inteiro Comprimento em


caracteres do campo edit_box necessita do atributo
fixed_width_font para funcionar adequadamente.
fixed_width_font = true ou false Fora todas as
letras serem escritas do mesmo tamanho, visto que
normalmente uma letra i > m em espao, pode
ser utilizado para escrever em negrito.
password_char = char Caractere a ser usado
em campos de senhas (ex: *, ?), caso este
atributo esteja presente, automaticamente o campo
se transforma em um campo de senha.

is_bold = true ou false Torna negrito o texto


exibido pelo componente text.
is_cancel = true ou false similar is_default.
is_default = true ou false Determina o
componente a ser acionado pela tecla enter, o
modelo ok_cancel traz ok com is_default = true, no
entanto caso tenha mais de um componente com
esse atributo = true, somente o ltimo na definio

26 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

da caixa ter validade, portanto se ok_cancel forem


os ltimos componentes, o default deles ser o
vlido.
is_enabled true ou false Configura o
componente para ativo ou inativo (modo apagado).
is_tab_stop true ou false Configura de o foco
alcanar ou no o componente a partir de
pressionamentos da tecla TAB.
list = string String representando uma lista de
dados, usado em list_box e popup_list. Cada item
da lista deve ser separado por \n (ex: UM\nDOIS).
multiple_select = true ou false Permite ou no
selecionar mais de um elemento em um list_box.
tabs = Str String de nmeros (2 5) separados
por espao que determinam o alinhamento de
colunas tabuladas em uma lista (p/ strings do tipo
01\tRED\n02\tYELLOW\n03\tGREEN), para este
exemplo pode-se usar tabs = 5; para alinha a
coluna de nomes a 5 caracteres da coluna nmeros

27 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007


Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007

tab_truncate = true ou false Corta as colunas nas


posies apontadas por tabs para conseguir alinhar
perfeitamente.
mnemonic = caracter Letra sublinhada que a ser
pressionada aciona o componente, independente
de onde esteja o foco.

28 Curso de AutoLisp Marcelo Silva cracksther@gmail.com - 2007