DCL Dialog Control Language: Introdução João Manuel R. S. Tavares Bibliografia Material disponível no AfraLisp.net em http://www.afralisp.net Programação em AutoCAD, Curso Completo Fernando Luís Ferreira, João Santos FCA Sistema de ajuda do AutoCAD 2 João Manuel R. S. Tavares 1
Introdução A Dialog Control Language permite criar interfaces gráficas (caixas de diálogo e de mensagens para aplicações em AutoLISP/Visual Lisp Cada caixa de diálogo deve ser definida (dialog definition em ficheiros de definição com a extensão dcl Cada controlo de um diálogo necessita ser definido (tile definition e é referenciado no código lisp pelo seu nome (key Cada propriedade (property de um controlo (tile é designada por atributo do diálogo (attribute Cada método de um controlo é designado por expressão de acção (action expression O Visual Lisp Editor possibilita a previsão de um diálogo definido num ficheiro dcl (em Tools, Interface Tools 3 Introdução (cont. No ficheiro base.dcl do AutoCAD existem definições e estruturas úteis que podem ser usadas (para usar, incluir @include "base.dcl" no ficheiro respectivo Na definição dos diálogos (ficheiros dcl: São usados { em vez de ( Para definir propriedades usa-se o sinal = As linhas de atributos terminam com ; Comentários são indicados com // ou /* */ As definições são iniciadas com : Ci Criação de um diálogo: Sintaxe: nome : dialog { conteúdo 4 João Manuel R. S. Tavares 2
Introdução (cont. Exemplo (ficheiro hello.dcl: hello : dialog { // é dado o nome "hello" à // caixa de diálogo label = "Primeira Caixa de Diálogo"; // título a aparecer na caixa : text { // início de zona de texto label = "Hello, world"; // texto a aparecer // fim da zona de texto : button { // é criado um botão OK para terminar key = "terminado"; // o valor da tecla label = "OK"; // o nome da tecla is_default = true; // declara que este é o botão por omissão // fim do botão "ok" 5 Introdução (cont. Exemplo (ficheiro hello.lsp: (Defun c:hello ( (setq dcl_id (load_dialog "hello.dcl" (if (not (new_dialog "hello" dcl_id (exit ; o file é carregado ; verifica se existe o ficheiro ; se não existe saí (start_dialog dialogo (unload_dialog dcl_id ; é mostrada a caixa de ; retira a recém-criada caixa 6 João Manuel R. S. Tavares 3
Introdução (cont. Definição de um controlo (tile: nome : item1 [ : item2 : item3 ] { atributo = valor ; Referência a um controlo predefinido: : nome { atributo = valor ; 7 Introdução (cont. Exemplo (ficheiro hello1.dcl: hello : dialog { // é dado o nome "hello" à // caixa de diálogo label = "Primeira Caixa de Diálogo"; // título a aparecer na caixa : text { // início de zona de texto label = "Hello, world"; // texto a aparecer // fim da zona de texto ok_only; // botão "ok" predefinido 8 João Manuel R. S. Tavares 4
Introdução (cont. Exemplo (ok_cancel.dcl ex_cancel : dialog { // é dado o nome "ex_cancel" à // caixa de diálogo label = "Exemplo Ok_Cancel"; // título a aparecer na caixa spacer_0; // espaçamento ok_cancel; // botões "ok" e "cancel" // predefinidos 9 Introdução (cont. Exemplo (ficheiro hello1.lsp: (Defun c:hello ( (setq dcl_id (load_dialog "hello1.dcl" (if (not (new_dialog "hello" dcl_id (exit ; o ficheiro é carregado ; verifica se existe o ficheiro ; se não existe saí (start_dialog (unload_dialog dcl_id ; é mostrada a caixa de diálogo ; retira a recém-criada caixa 10 João Manuel R. S. Tavares 5
Controlos Predefinidos Exit Buttons e Error Tiles ok_only ok_cancel ok_cancel_help ok_cancel_help_errtile ok_cancel_help_info errtile Predefined Active Tiles button edit_box list_box popup_list radio_button toggle slider image_button Decorative e Informative Tiles image text spacer spacer_0 spacer_1 Text Clusters ncatenation paragraph text_part 11 Controlos Predefinidos (cont. Tile Clusters boxed_column boxed_radio_column boxed_radio_row boxed_row column dialog radio_column radio_row row 12 João Manuel R. S. Tavares 6
Atributos de Controlos Globais alignment fixed_height fixed_width id height width Aplicam-se a: All Tiles Action Tiles action is_enabled is_tab_stop key mnemonic Aplicam-se a: button; edit_box; image_button; list_box; popup_list; radio_button; slider; toggle; radio_column; radio_row 13 Atributos de Controlos (cont. Tile Clusters children_alignment children_fixed_height _ children_fixed_width Aplicam-se a: row; column; radio_row; radio_column; boxed_row; boxed_column; boxed_radio_row; boxed_radio_column Specific Tiles allow_accept Aplicam-se a: edit_box; image_button; list_box aspect_ration Aplicam-se a: image; image_button big_increment Aplicam-se a: slider 14 João Manuel R. S. Tavares 7
Atributos de Controlos (cont. Specific Tiles (cont. color Aplicam-se a: image; image_button edit_limit Aplicam-se a: edit_box edit_width Aplicam-se a: edit_box; popup_list fixed_width_font Aplicam-se a: edit_box; popup_list initial_focus Aplicam-se a: dialog is_cancel Aplicam-se a: button 15 Atributos de Controlos (cont. Specific Tiles (cont. is_default Aplicam-se a: button label Aplicam-se a: boxed_row; boxed_column; boxed_radio_row; boxed_radio_column; button; dialog; edit_box; list_box; popup_list; radio_button; text; toggle layout Aplicam-se a: slider list Aplicam-se a: list_box; popup_list max_value Aplicam-se a: slider min_value Aplicam-se a: slider 16 João Manuel R. S. Tavares 8
Atributos de Controlos (cont. Specific Tiles (cont. multiple_select Aplicam-se a: list_box password_char Aplicam-se a: edit_box small_increment Aplicam-se a: slider tabs Aplicam-se a: list_box; popup_list tab_truncatetruncate Aplicam-se a: list_box; popup_list value Aplicam-se a: text; todos active tiles (excepto buttons e image_buttons 17 Funções AutoLISP para diálogos DCL (load_dialog ficheiro.dcl ; carrega file (new_dialog nome dcl_id acção ecrã ; carrega diálogo (start_dialog _ ; mostra diálogo (done_dialog saida ; fecha diálogo e retorna saída (term_dialog ; fecha todos diálogos abertos (unload_dialog dcl_id ; descarrega diálogo (action_tile key expressão ; estabelece acção para tile key (get_attr key atributo ; obter valor do tile key (string (get_tilet til key ; obter valor do tile key (string ti (set_tile key valor ; atribuir valor para o tile key (string (mode_tile key modo ; define modo (0 - activa, 1 - desactiva, 2 - destaca, 3 - selecciona conteúdo, 4 - muda destaque de uma imagem 18 João Manuel R. S. Tavares 9
Funções AutoLISP para diálogos DCL (cont. (start_list key operação indice ; inicia lista (add_list string ; adiciona string numa lista (end_list d ; termina lista (start_image key ; inicia criação de imagem (dimx_tile key ; dimensão de imagem em x (dimy_tile key ; dimensão de imagem em y (vector_image xini yini xfim yfim cor ; desenha vector (fill_image xini yini larg alt cor ; desenha rectângulo (slide_image xini yini larg alt nomeslide ; inserir slide (end_image ; termina criação de imagem 19 Funções AutoLISP para diálogos DCL (cont. 20 João Manuel R. S. Tavares 10
Funções AutoLISP para diálogos DCL (cont. 21 Funções AutoLISP para diálogos DCL (cont. 22 João Manuel R. S. Tavares 11
Funções AutoLISP para diálogos DCL (cont. 23 Funções AutoLISP para diálogos DCL (cont. 24 João Manuel R. S. Tavares 12
Funções AutoLISP para diálogos DCL (cont. 25 Funções AutoLISP para diálogos DCL (cont. 26 João Manuel R. S. Tavares 13
Exemplo: file TEST_DCL1.DCL //DCL CODING STARTS HERE test_dcl1 : dialog { label = "Test Dialog No 1"; : text // controlo de texto { label = "This is a Test Message"; alignment = centered; : button // definição de um botão { key = "accept"; // nome do botão label = "Close"; // etiqueta do botão is_default = true; // controlo por defeito fixed_width = true; alignment = centered; // alinhamento //DCL CODING ENDS HERE 27 Exemplo: file TEST_DCL1.LSP ; AUTOLISP CODING STARTS HERE (prompt "\ntype TEST_DCL1 to run..." ; indicação no prompt do autocad após load do programa (defun C:TEST_DCL1 ( (setq dcl_id (load_dialog dialog "test_dcl1.dcl dcl" ; load do ficheiro de definição (if (not (new_dialog "test_dcl1" dcl_id ; carregamento do diálogo em memoria (exit ; if (action_tile "accept" "(done_dialog" ; action_tile quando carrega no botão, fecha o diálogo (start_dialog ; mostrar diálogo (unload_dialog dcl_id ; descarregar o diálogo da memoria (princ ; defun (princ ; AUTOLISP CODING ENDS HERE 28 João Manuel R. S. Tavares 14
Exemplo: Notas Cada linha de atributo no ficheiro de definição do diálogo termina com ; Comentários indicados com // Sensível a maiúsculas e a minúsculas Sequência de utilização: Load do ficheiro do diálogo Load da definição do diálogo Executar instrução(ões action_ tile Iniciar o diálogo Descarregar o diálogo da memória 29 Exemplo: file TEST_DCL2.DCL 30 //DCL CODING STARTS HERE test_dcl2 : dialog { label = "Test Dialog No 2"; : edit_box { label = "Enter Your Name :"; mnemonic = "N"; // char sublinhado key = "name"; alignment = centered; edit_limit = 30; // max. 30 chars edit_width = 30; : edit_box { label = "Enter Your Age :"; mnemonic = "A"; key = "age"; // larg. max. 30 chars alignment = centered; edit_limit = 3; // input max. 3 chars edit_width = 3; // largura max. 3 chars value = ""; // valor inicial : button { key = "accept"; label = "OK"; is_default = true; fixed_width = true; alignment = centered; : errtile // para mensagem de erro { width = 34; //DCL CODING ENDS HERE João Manuel R. S. Tavares 15
Exemplo: file TEST_DCL2.LSP 31 ; AUTOLISP CODING STARTS HERE (prompt "\ntype TEST_DCL2 to run..." (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 "name" "Enter Name Here" ; define conteúdo em run-time (mode_tile "name" 2 ; permite override (action_tile "name" "(setq name $value" ; após selecção atribui valor à variável name (action_tile "age" "(setq age $value" ; após selecção atribui valor à variável age (action_tile "accept" "(val1" ; após selecção chama subprograma (start_dialog ; mostra dál diálogo (unload_dialog dcl_id (alert (strcat "Your name is " name ; message box "\nand you are " age " years of age." Exemplo: file TEST_DCL2.LSP (cont. 32 (princ ; defun ;----------------------- (defun val1 ( (if (= (get_tile "name" "Enter Name Here" ; receber valor no controlo (progn (set_tile "error" "You must enter a name!" ; por valor no controlo (mode_tile "name" 2 ; progn (val2 ; chama subprograma ; if ; defun ;------------------- (defun val2 ( (if (< (atoi (get_tile "age" 1 ; receber valor no controlo (progn (set_tile "error" "Invalid Age - Please Try Again!!" ; por valor no controlo (mode_tile "age" 2 João Manuel R. S. Tavares 16
Exemplo: file TEST_DCL2.LSP (cont. ; progn (done_dialog ; fecha diálogo ; if ; defun (princ ;AUTOLISP CODING ENDS HERE 33 Exemplo: file TEST_DCL3.DCL 34 afra : dialog { label = "A" ; : column { : row { : button { label = "OK"; key = "accept"; mnemonic = "O"; alignment = centered; width = 12; is_default = true; // tem de existir um // default : button { label = "Cancel"; key = "cancel"; mnemonic = "C"; alignment = centered; width = 12; : row { : button { label = "Save"; key = "save"; mnemonic = "S"; alignment = centered; width = 12; : button { label = "Load"; key = "load"; mnemonic = "L"; alignment = centered; width = 12; João Manuel R. S. Tavares 17
Exemplo: file TEST_DCL3.DCL (cont. : row { : button { label = "Help..."; key = "help"; mnemonic = "H"; alignment = centered; width = 12; : button { label = "About..."; key = "About"; mnemonic = "H"; alignment = centered; width = 12; 35 Exemplo: file TEST_DCL3.LSP ; AUTOLISP CODING STARTS HERE (prompt "\ntype TEST_DCL3 to run..." (defun C:TEST_DCL3 (/ dcl_id (setq dcl_id (load_dialog " TEST_DCL3.DCL" (if (not (new_dialog "afra" dcl_id (exit ; if (start_dialog ; sai do diálogo quando seleccionar o botão OK (unload_dialog d l dcl_id d (princ ; defun 36 João Manuel R. S. Tavares 18
Exemplo: file TEST_DCL4.DCL samp : dialog { //dialog name label = "Structural Holes" ; //give it a label : row { //define row : boxed_radio_column { //define radio column label = "Type" ; //give it a label : radio_button { //define radion button key = "rb1" ; //give it a name label = "Bolt Holes &Site" ; //give it a label value = "1" ; //switch it on //end definition : radio_button { //define radio button key = "rb2" ; //give it a name label l = "Bolt Holes Sho&p" ; //give it a label l //end definition : radio_button { //define radio button key = "rb3" ; //give it a name label = "Bolt Holes &Hidden" ; //give it a label //end definition 37 Exemplo: file TEST_DCL4.DCL (cont. 38 : radio_button { //define radio button key = "rb4" ; //give it a name label = "Bolt Holes &Ctsnk" ; //give it a label //end definition : radio_button { //define radio button key = "rb5" ; //give it a name label = "Bolt Holes &Elevation" ; //give it a label //end definition : radio_button { //define radion button key = "rb6" ; //give it a name label = "Bolt Holes &Slotted" ; //give it a label //end definition //end radio column : boxed_column { //define boxed column label = "&Size"; //give it a label : popup_list { //define popup list key = "selections"; //give it a name value = "5 ; //initial value João Manuel R. S. Tavares 19
Exemplo: file TEST_DCL4.DCL (cont. //end boxed column //end row : edit_box { //define edit box key = "eb1" ; //give it a name label = "Slot &Length (O/All Slot" ; //give it a label edit_width = 6 ; //6 characters only //end edit box : slider { //defin slider key = "myslider" ; //give it a name max_value = 100; //upper value min_value = 0; //lower value value = "50"; //initial value //end slider : boxed_row { //*define boxed row : toggle { //*define toggle key = "tog1"; //*give it a name label = "Ortho On/Off"; //*give it a label 39 Exemplo: file TEST_DCL4.DCL (cont. 40 : toggle { //*define toggle key = "tog2"; //*give it a name label = "Snap On/Off"; //*give it a label //*end definition //*end boxed row ok_cancel ; //predifined OK/Cancel : row { //define row : image { //define image tile key = "im" ; //give it a name height = 1.0 ; //and a height width = 1.0 ; //and now a width //end image : paragraph { : text_part { //define paragraph //define text label = "Designed and Created"; //give it some text //end text : text_part { //define more text label = "by Kenny Ramage"; //some more text //end text João Manuel R. S. Tavares 20
Exemplo: file TEST_DCL4.DCL (cont. //end paragraph //end row //end dialog 41 Exemplo: file TEST_DCL4.LSP (defun C:samp ( ; define function (setq lngth 50.0 ; preset slot length (setq hole "site" ; preset hole type (setq siz "M20" ; preset hole size (setq NAMES '("M6" "M8" "M10" "M12" "M16" "M20" "M24" "M30 ; define list (setq ; setq dcl_id (load_dialog " TEST_DCL4.DCL" ; load dialog (if (not (new_dialog "samp" dcl_id ; test for dialog ; not (exit ; exit if no dialog ; if (setq w (dimx_tile "im" ; get image tile width h (dimy_tile "im" ; get image tile height ; setq 42 João Manuel R. S. Tavares 21
Exemplo: file TEST_DCL4.LSP (cont. (start_image "im" ; start the image (fill_image 0 0 w h 5 ; fill it with blue (end_image ; end image (start_list "selections" ; start the list box (mapcar 'add_list NAMES ; fill the list box (end_list ; end list (set_tile "eb1" "50" ; put dat into edit box (mode_tile "eb1" 1 ; disable edit box (mode_tile "myslider" 1 ; disable slider (setq orth (itoa (getvar "orthomode" ; *get orthomode value (set_tile "tog1" orth ; *switch toggle on or off (setq sna (itoa (getvar "snapmode" ; *get snap value (set_tile "tog2" sna ; *switch toggle on or off (action_tile "myslider" ; if user moves slider "(slider_action $value $reason" ; pass arguments to slider_action 43 Exemplo: file TEST_DCL4.LSP (cont. (action_tile "eb1" ; is user enters slot length "(ebox_action $value $reason" ; pass arguments to ebox_action (defun slider_action (val why ; define function (if (or (= why 2 (= why 1 ; check values (set_tile "eb1" val ; update edit box (defun ebox_action (val why ; define function (if (or (= why 2 (= why 1 ; check values (set_tile "myslider" val ; update slider (action_tile "tog1" "(setq orth $value" ; *get ortho toggle value (action_tile "tog2" "(setq sna $value" ; *get snap toggle value (action_tile "rb1" "(setq hole \"site\"" ; store hole type (action_tile "rb2" "(setq hole \"shop\"" ; store hole type 44 João Manuel R. S. Tavares 22
Exemplo: file TEST_DCL4.LSP (cont. (action_tile "rb3" "(setq hole \"hid\"" ; store hole type (action_tile "rb4" "(setq hole \"ctsk\"" ; store hole type (action_tile "rb5" "(setq hole \"elev\"" ; store hole type (action_tile "rb6" "(setq hole \"slot\" ; store hole type (mode_tile \"eb1\" 0 ; enable edit box (mode_tile \"myslider\" 0 ; enable slider (mode_tile \"eb1\" 2" ; switch focus to edit box (action_tile "cancel" ; if cancel button pressed "(done_dialog d (setq userclick nil" ; close dialog, set flag ; action_tile (action_tile "accept" ; if O.K. pressed (strcat ; string 'em together "(progn 45 Exemplo: file TEST_DCL4.LSP (cont. (setq SIZ (atof (get_tile \"selections\"" ; get list selection "(setq lngth (atof (get_tile \"eb1\"" ; get slot length "(setvar \"orthomode\" (atoi orth" ; *ortho on/off "(setvar \"snapmode\" (atoi sna" ; *snap on/off " (done_dialog(setq userclick T" ; close dialog, set flag ; strcat ; action tile (start_dialog ; start dialog (unload_dialog dcl_id ; unload (if userclick ; check O.K. was selected (progn (setq SIZ (fix SIZ ; convert to integer (setq SIZ (nth SIZ NAMES ; get the size ; progn 46 ; if userclick (princ ; defun C:samp (princ João Manuel R. S. Tavares 23