Вы находитесь на странице: 1из 10

Comeando com DCL - Parte 1

Dialog Control Language, ou DCL, sempre parece assustar muita Lispers. Eu admito, me fez muito at que fui forado a uma situao fosse eu tive que aprender isso e rapidamente. (Fazla funcionar, ou voc est fora menino!) Bem, eu odiaria que qualquer um de vocs para estar na mesma situao, por isso para as prximas edies, eu vou tomar o passo a passo, de mos dadas, atravs do campo minado da linguagem DCL. Vou compartilhar a sua dor e sofrimento, e enxugar suas lgrimas, eu vou ... ("Ei Kenny, ir em frente!"). Opa, desculpe! De qualquer forma, onde eu estava? Oh yeah, eu vou sofrer ... (thump!). Como eu estava dizendo antes que eu tenho esse olho preto, h alguns termos que voc precisa para se familiarizar com antes de ficar preso em alguma codificao. Em primeiro lugar, a caixa de dilogo em si conhecido como uma "definio de dilogo". Em segundo lugar, cada um "controle" sobre o dilogo conhecido como uma "definio tile". Em terceiro lugar, cada "propriedade" de uma "tile" conhecido como um dilogo "atributo". E em quarto lugar, cada um "mtodo" de uma "tile" conhecido como uma "expresso de ao". Por qu? Quem sabe? Quem se importa?Tudo o que sei que ele vai ajud-lo imensamente para a compreenso do livro de referncia AutoCAD DCL se voc tiver um conhecimento bsico desses termos. Certo, waffle suficiente, eu estou entediado e dolorido do meu olho. Vamos dar uma olhada em alguns codificao DCL e projetar-nos uma caixa de dilogo simples. Copie e cole esse no bloco de notas e salve-o como test_dcl1.dcl . Ah, antes que me esquea, por favor, garantir que voc salve este arquivo, e arquivo AutoLisp homnimo, em um diretrio que est dentro do seu caminho de busca do AutoCAD.

//DCL CODING STARTS HERE test_dcl1

: dialog { label = "Test Dialog No 1"; : text { label = "This is a Test Message"; alignment = centered; } : button { key = "accept"; label = "Close"; is_default = true; fixed_width = true; alignment = centered; } } / / DCL CODIFICAO TERMINA AQUI
Vamos ter um olhar atento para o que isso significa tudo um pouco mais tarde. Primeiro, vamos colocar alguma codificao AutoLisp e experimentar a nossa nova caixa de dilogo. Copie e cole esse no bloco de notas e salve-o como test_dcl1.lsp .

; AutoLISP CODIFICAO COMEA AQUI prompt "\nType TEST_DCL1 to run...")

(defun C:TEST_DCL1 () (setq dcl_id (load_dialog "test_dcl1.dcl")) (if (not (new_dialog "test_dcl1" dcl_id)) (exit ) );if (action_tile "accept" "(done_dialog)" );action_tile (start_dialog) (unload_dialog dcl_id) (princ) );defun (princ)
; AutoLISP CODIFICAO TERMINA AQUI
Agora carregar e executar o programa.

Uma caixa de dilogo muito simples contendo uma mensagem deve aparecer na sua tela. Ele fez?Bom, bem feito! (Aplausos da galeria de amendoim.) Certo, vamos dissecar a codificao DCL. (Msica tema de um antigo filme Drcula inicia em segundo plano.)

/ / DCL CODIFICAO COMEA AQUI


Tudo comea com "/ /" no DCL considerado como um comentrio.

test_dcl1
O nome do dilogo.

: dialog
O incio da definio do dilogo.

{
O colchete de abertura para a definio de dilogo.

label = "dilogo Teste No 1";


. rtulo da definio de dilogo Isto o que aparece na barra de ttulo da janela.

: text
O incio de uma definio tile texto.

{
O colchete de abertura para a definio tile texto.

label = "Esta uma mensagem de teste";


O atributo label do azulejo texto.

alignment = centered;
O atributo alinhamento da tile texto.

}
O colchete de fechamento da tile texto.

: button
O incio de uma definio tile boto.

{
O colchete de abertura para a definio tile boto. key = "accept";. A chave, ou o nome do azulejo boto Voc vai usar esse nome para fazer referncia a este boto no seu cdigo AutoLisp.

label = "Close";
O atributo rtulo. O que parece nele.

is_default = true;
O atributo padro. Se isso for verdade, este boto ser selecionada automaticamente se a chave Enter pressionado.

fixed_width = true;
Fora o boto para ser grande o suficiente para o atributo rtulo.

alignment = centered;
O atributo de alinhamento.

}
O colchete de fechamento para o azulejo boto.

}
O colchete de fechamento para a definio de dilogo. OK, isso foi fcil hein? A propsito, voc notou que cada uma das linhas de atributos terminou com um ponto e vrgula ( ; )? Outra coisa importante que voc deve se lembrar quando se trata de atributos que seus valores so maisculas de minsculas. (Por exemplo, "verdadeiro" no igual a "true".) Agora vamos ter um olhar pequenino na codificao AutoLisp que coloca essa coisa toda em conjunto. Mais uma vez, ns vamos lev-lo linha por linha: (prompt "\ nType TEST_DCL1 correr ...") Informar o usurio como para iniciar o programa. Apenas os bons costumes.

(Defun C:TEST_DCL1 (/ dcl_id)


Defina a funo e declarar variveis.

(Setq dcl_id (load_dialog "test_dcl1.dcl"))


Carregue o arquivo de dilogo e definir uma referncia a ele.

(If (not (new_dialog "test_dcl1" dcl_id))


Carregue a definio de dilogo e verifique se a sua existncia. Lembre-se, um arquivo de dilogo pode conter vrias definies de dilogo.

(exit)
Sair do programa, se a definio de dilogo no for encontrado.

) ; se
End if

(action_tile "accept"
Se o usurio seleciona o azulejo que seu nome "aceitar", em seguida, faa o seguinte:

"(Done_dialog)"
Feche a caixa de dilogo ) ; action_tile Fim de action_tile

(Start_dialog)
Inicie o dilogo

(Dcl_id unload_dialog)
Descarregue o dilogo a partir da memria

(Princ)
acabamento limpo

) ; defun
Fim da funo

(Princ)
Carga limpo Muitas pessoas ficam confusas em relao ordem de declaraes do AutoLISP ao lidar com arquivos DCL. Eu no culpo eles por isso. Quero dizer, olhe o cdigo acima! Primeiro vamos carregar o arquivo de dilogo. Ento ns carregar a definio de dilogo. Ento ns executar uma instruo action_tile. Ento comeamos o dilogo.

E logo depois disso, ns descarregar o dilogo. Onde est a lgica disso? Haha. Mas voc notou que o action_tile declarao foi citado? por exemplo, "(done_dialog)" . Na verdade, o que estamos dizendo a tile esta: "Lembre-se disso corda, em seguida, pass-lo de volta para mim quando o usurio ativa voc."."Ento, em outras palavras, a codificao pr-armazenada dentro de uma tile particular. Quando seleciono que tile o cdigo executado?" Sim, isso. Mas lembre-se, nenhum valor ser devolvido at (done_dialog) chamado, o que tambm citado. Assim, a seqncia assim: Primeiro vamos carregar o arquivo de dilogo. Ento ns carregar a definio de dilogo. Ento corremos e lembrar de todos theaction_tile declaraes. Ento comeamos o dilogo. A caixa de dilogo exibida. Qualquer declarao action_tile processada se a tile relevante selecionado. Quando uma pea que contm o (done_dialog) funo selecionada, ns descarregar o dilogo e retornar todos os valores de cermica.

Comeando com DCL - Parte 2


OK, ch quebrar mais, de volta ao trabalho! Copie e cole esse no bloco de notas e salve-o como test_dcl2.dcl .

/ / DCL CODIFICAO COMEA AQUI test_dcl2

: dialog

label = "Teste de dilogo No 2";

: Edit_box { label = "Digite seu nome:"; mnemonic = "N";

key = "nome";

alignment = centered;

edit_limit = 30; edit_width = 30; }

: Edit_box { label = "Digite sua idade:"; mnemonic = "A";

key = "idade"; alignment = centered;

edit_limit = 3; edit_width = 3; value = ""; }

: button

{ key = "accept";

label = "OK"; is_default = true; fixed_width = true; alignment = centered;

: errtile

{ width = 34; } } / / DCL CODIFICAO TERMINA AQUI


E agora o AutoLisp codificao. Copie e cole este e salv-lo como test_dcl2.lsp e depois carregar e execut-lo.

; AutoLISP CODIFICAO COMEA AQUI (prompt "\ nType TEST_DCL2 para executar .....")

(Defun C:TEST_DCL2 (/ dcl_id)

(Setq dcl_id (load_dialog "test_dcl2.dcl")) (If (not (new_dialog "test_dcl2" dcl_id)) (exit)

);if

(Set_tile "nome" "Enter Name Here") (Mode_tile "nome" 2) (Action_tile "nome" "(nome setq $value)") (Action_tile "idade" "(setq idade $value)") (action_tile "accept" "(val1)")

(Start_dialog) (Dcl_id unload_dialog)

(Alert (strcat "Seu nome " nome "\n e voc " "anos de idade." Idade))

(Princ)

) ; defun

-----------------------

(Defun val1 ()

(If (= (get_tile "nome") "Enter Name Here") (Progn (set_tile "error" "Voc deve digitar um nome!")

(Mode_tile "nome" 2) ) ; progn (Val2) ) ; if

) ; defun

-------------------

(Defun val2 ()

(If (<(atoi (get_tile "idade")) 1) (Progn (set_tile "error" "Invalid Idade -! Tente novamente")

(Mode_tile "idade" 2) ) ; progn (Done_dialog) ) ; if

) ; defun

(Princ) ; AutoLISP CODIFICAO TERMINA AQUI

A caixa de dilogo que apresentada contm duas caixas de edio. Um para introduzir o seu nome na, e um da sua idade. Depois de digitar as informaes relevantes, selecione o boto "OK".Uma caixa de alerta ser exibido, mostrando seus detalhes.

Agora, execute o programa novamente, mas no insira o seu nome. Uma mensagem de erro ser exibida informando que voc deve digitar o seu nome.

Preencha o seu nome, mas deixar a sua idade em branco. Pressione Enter novamente. Outra mensagem de erro ir inform-lo que voc entrou numa era invlido.

Experimente-o com um zero ou um nmero negativo. A mesma mensagem de erro ser exibida at que voc digite um nmero igual ou maior que 1. Ambos estes exemplos so conhecidos como validao. Vamos ter um olhar para a codificao DCL.

: Edit_box
Esta uma telha pr-definido que permite ao usurio para introduzir ou editar uma nica linha de texto. Existem alguns novos atributos definidos neste telha:

mnemonic = "N";
Isso define o carter mnemnico para o azulejo.

edit_limit = 30;
Isso limita o tamanho da caixa de edio de 30 caracteres.

edit_width = 30;
Isso limita o usurio a digitar um mximo de 30 caracteres.

value = "";
Isso define o valor intial da caixa de edio, neste caso nada. Agora vamos ter um olhar para a codificao AutoLisp. Primeiro, as "expresses de ao":

(Set_tile "nome" "Enter Name Here")


Isso define o tempo de execuo de valor (inicial) de uma telha que "chave" atributo "nome".

(Mode_tile "nome" 2)
Esta define o modo de a telha que atributo "chave" "nome". Neste exemplo, usamos um modo de "2" que permite a substituio do que j est na caixa de edio.

(Action_tile "nome" (setq nome $value)")


Associa o azulejo specied com a expresso ao ou chamar de volta funo. Neste caso estamos dizendo "Se o azulejo que fundamental atributo nome selecionado, armazenar o valor desta telha em nome da varivel. "

(Get_tile "nome")
Recuperar o valor da telha que atributo "chave" "nome". Voc notou que escreveu: (action_tile "aceitar" "(val1)") em vez de: (action_tile "aceitar" "(done_dialog)")

Em vez de fechar a caixa de dilogo quando OK selecionado, iniciamos uma sub-rotina que verifica (valida) que as informaes de nome exceptable. Se no for, a telha de erro.

(set_tile "error" "Voc deve digitar um nome!")


Uma vez que o nome tenha sido validada, esta rotina ento inicia uma segunda sub-rotina que valida o valor de idade. Se esta no estiver correta, a telha de erro exibida novamente, desta vez com uma mensagem diferente.

(set_tile "error" "Invalid Idade - Por favor, tente outra vez"!)


Se tudo estiver correto, (done_dialog) chamado, todos os valores so devolvidos e a caixa de alerta exibida com as informaes relevantes.