Curso de AutoLisp
‘
–
Marcelo Silva
[email protected] [email protected]
–
- 2007
AutoLISP / DCL
CAIXAS DE DIÁLOGO
MARCELO SILVA
[email protected]
CASCAVEL – 2007
1
Curso de AutoLisp
–
Marcelo Silva
[email protected] [email protected]
–
- 2007 2007
Curso de AutoLisp
‘
–
Marcelo Silva
[email protected] [email protected]
–
- 2007
CAIXAS DE DI ÁLOGO ÁLOGO As aplicações em AutoLisp podem interagir com caixas de diálogo através de uma série de sub-rotinas que suportam o sistema de caixas de diálogo. Para facilitar o estudo, será referido ás caixas de diálogo apenas como “caixas”. A linguagem DCL (Dialog Control Language) é utilizada para definir as caixas, as quais devem ser salvas em arquivo arquivo de texto texto com a extensão .dcl. Um
único arquivo .dcl pode conter a definição de várias caixas, as quais devem ser identificadas por um u m nome
único no arquivo. Pode-se também definir modelos e posteriormente utiliza-los nas caixas. Alguns componentes utilizados, tais como os botões OK e Cancel são geralmente inseridos nas caixas a partir de modelos pré-definidos. O Autocad traz muitos modelos úteis pré-definidos, os quais estão armazenados no arquivo base.dcl base.dcl encontrado na pasta support do AutoCAD, é interessante dar uma 2
Curso de AutoLisp
–
Marcelo Silva
[email protected] [email protected]
–
- 2007 2007
Curso de AutoLisp
‘
–
Marcelo Silva
[email protected]
–
- 2007
analisada no arquivo após ter adquirido um mínimo de conhecimento da DCL. Em
AutoLISP,
antes
de
poder
utilizar
uma
determinada rotina é necessário carregar o arquivo que contém o código fonte da mesma, o mesmo ocorre com DCL, no entanto, ao contrário do que acontece em AutoLisp, é boa prática de programação carregar e descarregar os arquivos DCL somente no momento de sua utilização, isso é feito através da rotina AutoLISP que o utiliza, desta forma as caixas não ficam ocupando memória quando não estão sendo utilizadas, além de prevenir conflitos. Os Arquivos .LSP ficam carregados permanente na memória 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 contrário da AutoLisp, a DCL é sensível ao caso, ou seja, diferencia maiúsculo de minúsculo, sendo portanto, caixa_01 diferente de CAIXA_01. 3
Curso de AutoLisp
–
Marcelo Silva
[email protected]
–
- 2007
Curso de AutoLisp
‘
–
Marcelo Silva
[email protected]
–
- 2007
A forma correta para o nome dos componentes prédefinidos pertencentes ao AutoCAD é sempre em minúsculo, no entanto pode-se utilizar maiúsculo para nomear novos componentes. Após ter carregado o arquivo .dcl com a definição das caixas deve-se inicializar a caixa desejada com a função new_dialog e então configurar
todos os
campos com as funções apropriadas para só então permitir ao usuário interagir com a caixa, isso é feito com a execução da função start_dialog, e por fim, deve-se descarregar o arquivo .dcl com a função unload_dialog quando o usuário abandonar a caixa. A função done_dialog é responsável por abandonar a caixa e retornar um status informando o que aconteceu, por tanto esta função deve estar presente no código AutoLISP, geralmente está ligada á um botão (ex: OK, Cancel, etc...).
4
Curso de AutoLisp
–
Marcelo Silva
[email protected]
–
- 2007
Curso de AutoLisp
‘
Deve
ficar
start_dialog,
–
claro
Marcelo Silva
que
[email protected]
–
load_dialog,
done_dialog
- 2007
new_dialog,
e unload_dialog
são
funções da AutoLISP que suportam á DCL, estas funções funcionam apropriadamente em conjunto, portanto todas devem aparecer no código para um correto funcionamento da caixa.
LOAD-DIALOG
Carrega um arquivo .dcl. Retorna
–
um inteiro positivo se bem sucedido, ou um inteiro negativo caso não consiga carregar o arquivo. O inteiro retornado por load_dialog é tido como sendo um “o descritor do arquivo dcl”, ou ainda, “ponteiro de diálogo”, deve-se sempre redireciona-lo para uma variável qualquer
a
fim
conseguir
referencia-lo
posteriormente. Sintaxe: (load_dialog “caminho/arquivo.extenção”) Caso o caminho seja omitido, a função irá procurar nos diretórios quais têm acesso direto (diretórios de suporte). 5
Curso de AutoLisp
–
Marcelo Silva
[email protected]
–
- 2007
Curso de AutoLisp
‘
–
Marcelo Silva
[email protected]
–
- 2007
Exemplo: (setq dcl-id (load_dialog “c:/autolisp/dcl/caixa-01.dcl”)) Embora não seja regra obrigatória, é boa prática de programação sempre utilizar a função new_dialog logo após carregar o arquivo dcl.
NEW_DIALOG
Inicializa uma caixa de diálogo e a
–
exibe na tela, no entanto, não permite o usuário interagir com a caixa exibida até o momento, isso somente
será
permitido após 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
[email protected]
–
- 2007
Curso de AutoLisp
‘
–
Marcelo Silva
[email protected]
–
- 2007
new_dialog pode não conseguir inicializar uma caixa por dois motivos. 1. A função load_dialog não conseguiu carregar o arquivo .dcl. 2. O nome da caixa não existe no arquivo .dcl. Caso isso ocorra não é possível continuar com a caixa,
portanto
deve-se
introduzir
código
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
[email protected]
–
- 2007
Curso de AutoLisp
‘
–
Marcelo Silva
[email protected]
- 2007
–
Observações: O uso de ; (ponto-e-virgula) no final de todas as
!
linhas, exceto as que terminam com { ou }, é regra obrigatória. !
Em “(alert \ ”Funcionou! \ ”)” é necessário utilizar \ ” para representar uma “, para evitar o fechamento precoce da string.
!
ok_cancel é um modelo pré-definido, vide base.dcl.
!
Os demais itens serão 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 possível e inicializa a caixa, caso não consiga, simplesmente abandona a função (exit). (start_dialog) ;inicia interação c/ usuário (unload_dialog dcl-id) ;descarrega o arquivo .dcl ) 8
Curso de AutoLisp
–
Marcelo Silva
[email protected]
–
- 2007
Curso de AutoLisp
‘
Marcelo Silva
–
[email protected]
–
- 2007
Note que a função done_dialog não apareceu em ambos os arquivos, no entanto está função 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 interação do usuário
–
com a caixa apresentada. Esta função retorna o valor fornecido por done_dialog, este valor indica como o usuário saiu da caixa, isso é importante , pois as variáveis devem ser ou não atualizadas somente após o usuário sair da caixa e dependendo da ação ocorrida (não se deve alterar variáveis se o usuár io clicar em cancel). Sintaxe: (start_dialog) ;note que a função não tem parâmetros Para testar, acione em c:caixa-01 um setq á frente da função [ex: (setq ok_esc (start_dialog)) ] e depois use princ para imprimir o valor [ex: (princ “ \nValor de saída: “) (princ ok_esc) ]. 9
Curso de AutoLisp
–
Marcelo Silva
[email protected]
–
- 2007
Curso de AutoLisp
‘
–
UNLOAD_DIALOG
Marcelo Silva
[email protected]
–
- 2007
Descarrega um arquivo .dcl a
–
partir de um ponteiro de diálogo. É boa prática sempre carregar e descarregar os arquivos .dcl através da rotina AutoLisp que irá utilizá-lo, isso ajuda a evitar erros e conflitos além de liberar memória. Sintaxe: (unload_dialog ponteiro-de-diálogo) Onde ponteiro-dialogo é gerado por load_dialog.
!
DONE_DIALOG
Termina uma caixa de diálogo e
–
retorna um código informando como o usuário saiu da caixa, este código deve ser utilizado para saber como seguir adiante. Códigos usuais: 0 = Cancel;
!
1 = OK;
!
4 = Hide dialog, usado para permitir o usuário
!
interagir com a tela gráfica (ex: seleção de objetos).
10
Curso de AutoLisp
–
Marcelo Silva
[email protected]
–
- 2007
Curso de AutoLisp
‘
–
Marcelo Silva
[email protected]
- 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
[email protected]
–
- 2007
Curso de AutoLisp
‘
–
Marcelo Silva
[email protected]
- 2007
–
A variável saída é inicializada com valor = 4;
!
!
O loop while permanece enquanto sair for >= 2;
A variável saída é atualizada com o valor retornado
!
por (start_dialog), que é o mesmo retornado por done_dialog. !
O código (action_tile
bt_sel”
“
(done_dialog 4)”)
“
configura a ação a executar ao clicar o botão Selection, logo um clique neste botão termina a caixa e retorna o valor 4. Em AutoLisp action_tile é equivalente á utilizar a propriedade action em DCL. !
Os
botões
Ok
e
Cancel retornam
0
e
1
respectivamente, fazendo que o loop acabe. Exercício: Adicione ao exemplo anterior um botão chamado erase, sendo que ao clicar em Ok devem ser apagados os objetos selecionados a partir do botão Selection, se o usuário clicar em Cancel, nada deve ser feito.
Terá um erro fatal no código, tente prever e evitar ”.
“
12
Curso de AutoLisp
–
Marcelo Silva
[email protected]
–
- 2007
Curso de AutoLisp
‘
ACTION_TILE
–
–
Marcelo Silva
[email protected]
–
- 2007
Função que configura, ou liga, um
componente á uma função, a qual será executada quando
o
componente
for
selecionado
ou
abandonado, dependendo do tipo do componente. Sintaxe: (action_tile “key” “função”) !
Observe que ambos os parâmetros são strings.
No caso da função apontada pelo 2° parâmetro
!
receber uma string estática como parâmetro é necessário envolver a string parâmetro por um para de \ ” para evitar o fechamento precoce da string que representa o parâmetro função. exemplo: (action_tile “key” “(alert \ ”Mensagem \ ”)”)
É importante saber que uma caixa é composta por n quantidade de componentes, e que cada componente por ter vários atributos, que podem simplesmente serem omitidos na definição da caixa, neste caso o valor padrão é assumido.
13
Curso de AutoLisp
–
Marcelo Silva
[email protected]
–
- 2007
Curso de AutoLisp
‘
–
Marcelo Silva
[email protected]
–
- 2007
Mesmo que um atributo esteja oculto ele pode ser acessado e modificado pelo código AutoLisp. Exemplo: (arquivo file-01.lsp) CAIXA_03 : dialog { label = "Action Tile / action"; : button { label = "1° botão"; key
= "bt_01";
action = "(alert \"Primeiro\")"; } : button { label = "2° botão"; key
= "bt_02";
} ok_cancel; }
14
Curso de AutoLisp
–
Marcelo Silva
[email protected]
–
- 2007
Curso de AutoLisp
‘
–
Marcelo Silva
[email protected]
–
- 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 três componentes (01 dialog e 02 button), foram utilizados os seguintes atributos (label, key, value e action) além de um modelo pré_definodo (ok_cancel). Note que a ação para o 1° botão foi configurada na própria definição da caixa, já a ação para o 2° botão foi configurada a partir da rotina AutoLisp.
15
Curso de AutoLisp
–
Marcelo Silva
[email protected]
–
- 2007
Curso de AutoLisp
‘
Marcelo Silva
–
[email protected]
–
- 2007
COMPONENTES E MODELOS PRÉ-DEFINIDOS Um dos componentes mais atípicos é dialog, ou seja, seus atributos fogem ao padrão. : dialog { initial_focus label value } !
initial_focus =
key”; configura qual componente
“
terá o foco inicial. !
label = “Titulo do diálogo”;
!
value = “Titulo do diálogo”;
label e value são equivalente para dialog, no entanto somente value pode ser alterada pela função set_tile, a qual será detalhada á frente. Para saber quais atributos são aceitos por quais componentes, consulte DCL Tile Catalog no help do Visual Lisp. Embora o help seja “ruim”, está seção é interessante, pois traz imagens ilustrativas dos componentes. 16
Curso de AutoLisp
–
Marcelo Silva
[email protected]
–
- 2007
Curso de AutoLisp
‘
–
Marcelo Silva
[email protected]
–
- 2007
LISTA COMPLETA DE COMPONENTES : boxed_column : boxed_radio_column // descartável : boxed_radio_row // descartável : boxed_row : button // botão : column // alinha os componentes em coluna (default) : concatenation // concatena : text_part e gera um text : text // texto de única linha : text_part // = :text, porém pode ser concatenado : paragraph // texto de múltiplas linhas, na verdade une multiplos :text ou :text_part; : dialog // define uma caixa de diálogo : edit_box // campo para entrada de texto. errtile; // é apenas uma frase informando sobre algo ok_only; ok_cancel; // modelo pré-definido - botões ok e cancel ok_cancel_help; ok_cancel_help_errtile; ok_cancel_help_info; 17
Curso de AutoLisp
–
Marcelo Silva
[email protected]
–
- 2007
Curso de AutoLisp
‘
: image
–
Marcelo Silva
[email protected]
–
- 2007
Para inserir uma imagem em um caixa é
–
necessário 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 através das funções (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
[email protected]
–
- 2007
Curso de AutoLisp
‘
–
Marcelo Silva
[email protected]
- 2007
–
Onde: !
start_image – inicia a criação de uma imagem em uma caixa.
img-01” é á chave de identificação 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 criação da imagem
: image_button // vale o mesmo método 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
[email protected]
–
- 2007
Curso de AutoLisp
‘
–
Marcelo Silva
[email protected]
–
- 2007
: radio_button : radio_column : radio_row Esses três componentes definem um conjunto de botões do tipo radio (bolinhas que ao clicar em uma, desmarca a outra). Deve-se optar por : radio_row ou : radio_column, significando optar por botões em linha ou em coluna respectivamente : radio_row { : radio_button { label = “botão 01”; key = “bt-01”; action = “(setq val-bt 1)”; } : radio_button { label = “botão 02”; key = “bt-02”; action = “(alert \ ”Teste \ ”); } } 20
Curso de AutoLisp
–
Marcelo Silva
[email protected]
–
- 2007
Curso de AutoLisp
‘
–
Marcelo Silva
[email protected]
- 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 opção”; key
= “lst-01”;
action = “(setq val $value)”; list
= “02 \n04\n08\n16”;
} Vide
explicações
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 através do atributo list ou através de AutoLisp, com segue: (setq lista (list
um”
“
dois” “três” “quatro”)) ; lista
“
contendo os itens a serem inseridos na lista.
21
Curso de AutoLisp
–
Marcelo Silva
[email protected]
–
- 2007
Curso de AutoLisp
‘
–
Marcelo Silva
[email protected]
–
- 2007
(start_list “lst-01” [modo [pos]]) ;inicializa o processo de adição de itens á lista de um componen te lixt_box ou popup_list, o argumento modo incida: !
1 – substituir um elemento na posição 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 inserção 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 inserção de itens
22
Curso de AutoLisp
–
Marcelo Silva
[email protected]
–
- 2007
Curso de AutoLisp
‘
–
Marcelo Silva
[email protected]
–
- 2007
LISTA COMPLETA DE ATRIBUTOS DCL Muitos atributos são 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 relação entre atributos e componentes . !
action = string - Liga um componente á uma função.
!
label = string - Texto que identifica visualmente um componente.
!
key = string – Chave que identifica um componente em termos de programação.
!
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
[email protected]
–
- 2007
Curso de AutoLisp
‘
!
!
–
Marcelo Silva
[email protected]
–
- 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 não chamado a ação do botão default, usualmente o botão OK. aspect_ratio = n° real; proporção do comprimento pela altura.
Ex: : image_button { height = 3; color = 2; aspect_ratio = 0.8; } Este exemplo cria um botão 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 direção). max_value = n° real; valor máximo para um slider.
!
24
Curso de AutoLisp
–
Marcelo Silva
[email protected]
–
- 2007
Curso de AutoLisp
‘
!
–
Marcelo Silva
[email protected]
- 2007
–
min_value = n° real; valor mínimo 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 são dimensionados automaticamente para um melhor ajuste, para evitar isso se tem os atributos fixed_*; fixed_height
!
=
instrui
o
AutoCAD
a
não
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 – Número limite de caracteres
!
para um campo edit_box. 25
Curso de AutoLisp
–
Marcelo Silva
[email protected]
–
- 2007
Curso de AutoLisp
‘
edit_width
!
–
Marcelo Silva
n°
=
[email protected]
–
inteiro
- 2007
Comprimento
–
em
caracteres do campo edit_box necessita do atributo fixed_width_font para funcionar adequadamente. fixed_width_font = true ou false
!
Força todas as
–
letras serem escritas do mesmo tamanho, visto que normalmente uma letra i é > m em espaço, 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 definição 26
Curso de AutoLisp
–
Marcelo Silva
[email protected]
–
- 2007
Curso de AutoLisp
‘
–
Marcelo Silva
[email protected]
–
- 2007
da caixa terá validade, portanto se ok_cancel forem os últimos componentes, o default deles será o válido. is_enabled
!
true
–
ou
false
Configura
–
o
componente para ativo ou inativo (modo apagado). is_tab_stop
!
true ou false
–
Configura de o foco
–
alcançará ou não 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 não
selecionar mais de um elemento em um list_box. tabs = “Str “ – String de números (“2 5”) separados
!
por espaço 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 números
27
Curso de AutoLisp
–
Marcelo Silva
[email protected]
–
- 2007
Curso de AutoLisp
‘
–
Marcelo Silva
[email protected]
–
- 2007
tab_truncate = true ou false – Corta as colunas nas
!
posições 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
[email protected]
–
- 2007