Documentos de Académico
Documentos de Profesional
Documentos de Cultura
;; fim da rotina
Sintaxe
(DEFUN [c:]nome-da-funcao ( [argumentos] / [variaveis-locais] )
...expressoes...
[...expressoes...]
[................]
[...expressoes...]
)
****************************************************************************************
SETVAR a funo do AutoLISP que permite alterar uma varivel
de sistema do AutoCAD
****************************************************************************************
"CMDECHO" a varivel de sistema do AutoCAD que define se o echo
dos comandos ser ou no eliminado. 0 (zero) elimina o echo,
e 1 o habilita.
Obs.: No h nenhum sentido em habilit-lo, exceto quando estamos
programando e desejamos acompanhar uma determinada etapa de
procedimentos.
****************************************************************************************
ALERT a funo do AutoLISP que apresenta o quadro de mensagens
AutoCAD Message - Esta funo exige um s argumento,
e este tem quer ser um string de caracteres...
(strings so caracteres entre aspas)
****************************************************************************************
SETQ a funo do AutoLISP que atribui a uma varivel um valor
Sintaxe
(SETQ variavel1 valor1
[variavel2 valor2]
[variaveln valorn]
[variavel255 valor255]
)
****************************************************************************************
GETPOINT a funo AutoLISP que solicita ao operador o fornecimento
de um ponto, seja clicando ou entrando pelo teclado.
****************************************************************************************
IF uma funo que existe em todas linguagens de programao e quer dizer
SE.
Sintaxe
(IF condicao
expressao1
[expressao2]
)
Se a condio 'condicao' for verdadeira, ento a funo
executar a expresso 'expressao1'. Caso contrrio,
executar a expresso 'expressao2', se esta estiver
presente.
****************************************************************************************
STRCAT a funo do AutoLISP que concatena (une) dois ou mais strings de
caracteres.
Sintaxe
(STRCAT string1 string2 [string3] [string-n] )
Exemplo :
(STRCAT "Este "
" um string "
"formado por "
" 4 sub-strings"
)
retorna
"Este um string formado por 4 sub-strings"
****************************************************************************************
RTOS a funo do AutoLISP que converte um nmero real em string.
(Real TO String)
Vide opoes para RTOS no catlogo de funes
Exemplos :
(RTOS 12.5589 1 4) -> retorna "1.2559E+01"
(RTOS 12.5589 2 4) -> retorna "12.5589"
(RTOS 12.5589 3 4) -> retorna "1'-0.5589""
(RTOS 12.5589 4 4) -> retorna "1'-0 9/16""
(RTOS 12.5589 5 4) -> retorna "12 9/16"
****************************************************************************************
CAR a funo do AutoLISP que retorna o primeiro elemento de uma lista.
Sintaxe
(CAR lista)
Exemplos :
(CAR (LIST 1 2 3)) -> retorna 1
(CAR (LIST 3 2 1)) -> retorna 3
****************************************************************************************
GETVAR a funo do AutoLISP que recupera o valor de uma varivel
de
sistema do AutoCAD
Sintaxe
(GETVAR variavel-de-sistema)
variavel-de-sistema deve ser o nome da variavel
desejada, em STRING
Utilize o comando SETVARS deste curso para
conhecer estas variveis.
****************************************************************************************
"LUPREC" a varivel de sistema do AutoCAD que armazena o nmero
de casas decimais. Voc pode alterar este valor digitando, na linha
de comandos do AutoCAD a palavra LUPREC . Tecle Enter e defina o
valor desejado que deve estar entre 0 e 16
****************************************************************************************
PRINC a funo do AutoLISP que envia um string para a linha de
comandos ou para um arquivo. Se usada sem argumentos, elimina o
ltimo retorno do AutoLISP. Sempre usada ao fim dos comandos
definidos com AutoLISP, para uma saida silenciosa e elegante.
Sintaxe
(PRINC [string [arquivo]])
****************************************************************************************
Fim de comentrios
|;
;;-------------------------------------------------------------------------- ARQUIVO 02
;; Curso E.Fernal de AutoLISP
;; efernal@gr-acad.com.br
;; http://www.gr-acad.com.br
;; NO ALTERE ESTE ARQUIVO OU A ROTINA PODER NO FUNCIONAR ADEQUADAMENTE...
;; incio da rotina
;;---------------------------------------------------------------------------
;; fim da rotina
ENTSEL
NENTSEL
NENTSELP
GETINT
GETREAL
GETDIST
GETANGLE
GETORIENT
GETPOINT
GETCORNER
GETKWORD
Os bits de controle mais usados so :
fim de comentrios
|;
;;-------------------------------------------------------------------------- ARQUIVO 03
;; Curso E.Fernal de AutoLISP
;; efernal@gr-acad.com.br
;; http://www.gr-acad.com.br
;; NO ALTERE ESTE ARQUIVO OU A ROTINA PODER NO FUNCIONAR ADEQUADAMENTE...
;; incio da rotina
;;---------------------------------------------------------------------------
;; fim da rotina
fim de comentrios
|;
;;-------------------------------------------------------------------------- ARQUIVO 04
;; Curso E.Fernal de AutoLISP
;; efernal@gr-acad.com.br
;; http://www.gr-acad.com.br
;; NO ALTERE ESTE ARQUIVO OU A ROTINA PODER NO FUNCIONAR ADEQUADAMENTE...
;; incio da rotina
;;---------------------------------------------------------------------------
;; fim da rotina
fim de comentrios
|;
;;-------------------------------------------------------------------------- ARQUIVO 05
;; Curso E.Fernal de AutoLISP
;; efernal@gr-acad.com.br
;; http://www.gr-acad.com.br
;; NO ALTERE ESTE ARQUIVO OU A ROTINA PODER NO FUNCIONAR ADEQUADAMENTE...
;; incio da rotina
;;---------------------------------------------------------------------------
;; fim da rotina
fim de comentrios
|;
;;-------------------------------------------------------------------------- ARQUIVO 06
;; Curso E.Fernal de AutoLISP
;; efernal@gr-acad.com.br
;; http://www.gr-acad.com.br
;; NO ALTERE ESTE ARQUIVO OU A ROTINA PODER NO FUNCIONAR ADEQUADAMENTE...
;; incio da rotina
;;---------------------------------------------------------------------------
fim de comentrios
|;
;;-------------------------------------------------------------------------- ARQUIVO 07
;; Curso E.Fernal de AutoLISP
;; efernal@gr-acad.com.br
;; http://www.gr-acad.com.br
;; NO ALTERE ESTE ARQUIVO OU A ROTINA PODER NO FUNCIONAR ADEQUADAMENTE...
;; incio da rotina
;;---------------------------------------------------------------------------
;| fim da rotina
incio de comentrios
(IF dado1
nil
(SETQ dado1 "100")
)
**************************************************************************************
SET_TILE a funo AutoLISP que insere um valor em um 'tile' de um
quadro de dilogo.
Neste exemplo, os tiles so do tipo 'edit_box', ou campo de edio
de textos.
**************************************************************************************
ACTION_TILE a funo AutoLISP que permite chamar uma funo 'callback'
ao se selecionar um 'tile' em um quadro de dilogo do AutoCAD.
A expresso
(ACTION_TILE
"dado1"
"(SETQ dado1 $value)(check_number dado1)"
)
significa o seguinte :
execute as expresses
(SETQ dado1 $value)(check_number dado1)
para o tile cuja identificador, ou $key, "dado1"
**************************************************************************************
START_DIALOG a funo que retira o quadro de dilogo da tela e retorna
o 'inteiro-de-retorno' especificado por cada chamada da funo
DONE_DIALOG.
Armazenando este 'inteiro-de-retorno' em uma varivel,
podemos encaminhar a rotina para uma opo entre
muitas.
No exemplo acima, a expresso
(SETQ w@ (START_DIALOG))
armazena 'inteiro-de-retorno' em 'w@', sendo que :
w@ = 1 se o usurio clicou o boto "Ok"
w@ = 0 se o usurio clicou o boto "Cancel"
**************************************************************************************
UNLOAD_DIALOG a funo que elimina da memria todo o conteudo do arquivo
.DCL carregado pela funo LOAD_DIALOG e cujo ponteiro identificador
foi, neste exemplo, atribuido varivel 'dh'.
**************************************************************************************
COND uma funo do AutoLISP equivalente "select case" do VB, "case" do
DELPHI, "switch" do C.
Ela avalia as expresses em sequncia e retorna a primeira avaliao
que resultar verdadeira.
Uma alternativa pode ser fornecida, e deve ser inserida em ltimo
lugar, atravs da funo 'T' (que significa TRUE, ou verdadeiro).
Exemplo :
(COND
((> 1 5) (ALERT "1 maior que cinco"))
((< 5 1) (ALERT "5 menor que 1"))
((= "a" "b")
(ALERT "A letra 'a' igual letra 'b'")
)
(T
(ALERT
(STRCAT
"Esta mensagem ser sempre exibida, pois todas"
"\nas expresses anteriores so bobagens..."
)
)
)
)
***************************************************************************************
fim de comentrios
|;
;;-------------------------------------------------------------------------- ARQUIVO 08
;; Curso E.Fernal de AutoLISP
;; efernal@gr-acad.com.br
;; http://www.gr-acad.com.br
;; NO ALTERE ESTE ARQUIVO OU A ROTINA PODER NO FUNCIONAR ADEQUADAMENTE...
;; incio da rotina
;;---------------------------------------------------------------------------
;| inicio de comentrios
e aqui, como esta nica funo usada para criar comandos diversos,
com um nico trabalho...
fim de comentrios
|;
;;-------------------------------------------------------------------------- ARQUIVO 09
;; Curso E.Fernal de AutoLISP
;; efernal@gr-acad.com.br
;; http://www.gr-acad.com.br
;; NO ALTERE ESTE ARQUIVO OU A ROTINA PODER NO FUNCIONAR ADEQUADAMENTE...
;; incio da rotina
;;---------------------------------------------------------------------------
(DEFUN c:comenta ()
(ALERT
;|
este trecho um comentrio desde a palavra
'este' e encerrando-se na palavra
'trmino'
|;
"Neste comando existe um comentrio INLINE"
)
);| INICIO DE COMENTARIOS 1
Estas rotinas fazem parte do curso E.Fernal de AutoLISP
http://www.gr-acad.com.br
'EOF de C:\CURSO\DCL\SLIDES.DCL
Criaremos agora o comando SLIDES1 para carregar este dcl e inserir slides no mesmo.
Deveremos ter a biblioteca de slides C:\CURSO\SLB\SLB001.SLB, que dever conter os
slides 'teste1', 'teste2', 'teste3' ... at 'teste9'
FIM DE COMENTARIOS 1
|;
(DEFUN c:slides1 (/ dcl_id dcl_response x moldura flip last_pick)
(SETVAR "CMDECHO" 0)
;;--A funo abaixo um exemplo de uma funo 'call-back', que ser executada ao
;;--se clicar em um elemento do quadro de dilogo, no caso o TOGGLE "to1"
(DEFUN moldura (value / color)
(IF (= value "1")
(SET_TILE
"tx1"
"moldura em resposta funo 'call-back'"
)
(SET_TILE "tx1" "Eliminamos a moldura...")
)
(FOREACH
x '("i1" "i2" "i3" "i4" "i5" "i6" "i7" "i8" "i9")
(SETQ color (COND ((= value "1") 1)
((= value "0") 0)
)
)
(START_IMAGE x)
(FILL_IMAGE 0 0 (DIMX_TILE x) 5 color)
(FILL_IMAGE 0 0 5 (DIMY_TILE x) color)
(FILL_IMAGE
0
(- (DIMY_TILE x) 5)
(DIMX_TILE x)
(DIMY_TILE x)
color
)
(FILL_IMAGE
(- (DIMX_TILE x) 5)
0
(DIMX_TILE x)
(DIMY_TILE x)
color
)
(END_IMAGE)
)
)
;;--FIM DA FUNO 'call-back' QUE SER EXECUTADA AO SE CLICAR NO toggle
;;--Inicio da funo 'call-back' flip
(DEFUN flip (key)
(IF last_pick
(MODE_TILE last_pick 4)
)
(MODE_TILE key 4)
(SETQ last_pick key)
(SET_TILE "tx1" (STRCAT "Iluminando a imagem " key))
)
;;--FIM DE flip
(IF (> (SETQ dcl_id (LOAD_DIALOG "c:\\curso\\dcl\\slides.dcl"))
0
)
(IF (NEW_DIALOG "slides" dcl_id)
(PROGN
;|
(ALERT (STRCAT "dx = "
((ITOA (DIMX_TILE "i1"))
"\ndy = "
((ITOA (DIMY_TILE "i1"))
)
)
;; (DIMX_TILE = 96
;; (DIMY_TILE = 63
|;
(FOREACH
x '("i1" "i2" "i3" "i4" "i5" "i6" "i7" "i8" "i9")
(START_IMAGE x)
(SLIDE_IMAGE
5
5
(- (DIMX_TILE x) 5)
(- (DIMY_TILE x) 10)
(STRCAT "c:\\curso\\slb\\slb001(teste" (SUBSTR x 2) ")")
)
(END_IMAGE)
)
(FOREACH
x '("i1" "i2" "i3" "i4" "i5" "i6" "i7" "i8" "i9")
(ACTION_TILE x "(flip $key)")
)
(ACTION_TILE "to1" "(moldura $value)")
(ACTION_TILE "accept" "(DONE_DIALOG 1)")
(ACTION_TILE "cancel" "(DONE_DIALOG 0)")
(ACTION_TILE
"help"
"(ALERT \"Mensagem para ajuda deve ser aqui, ou ento utilizar uma funo call-back\")"
)
(SETQ dcl_response (START_DIALOG))
(UNLOAD_DIALOG dcl_id)
(COND ((= dcl_response 0)
(ALERT "Voc saiu apertando 'Cancel'...")
)
((= dcl_response 1)
(ALERT "Programar algo de til neste campo...")
)
)
)
nil
)
(ALERT
"Arquivo C:\\CURSO\\DCL\\SLIDES.DCL no pde ser carregado..."
)
)
(PRINC )
)
;;-------------------------------------------------------------------------- ARQUIVO 10
;; Curso E.Fernal de AutoLISP
;; efernal@gr-acad.com.br
;; http://www.gr-acad.com.br
;; NO ALTERE ESTE ARQUIVO OU A ROTINA PODER NO FUNCIONAR ADEQUADAMENTE...
;; incio da rotina
;;---------------------------------------------------------------------------
;;-------------------------------------------------------------------------- ARQUIVO 11
;; Curso E.Fernal de AutoLISP
;; efernal@gr-acad.com.br
;; http://www.gr-acad.com.br
;; NO ALTERE ESTE ARQUIVO OU A ROTINA PODER NO FUNCIONAR ADEQUADAMENTE...
;; incio da rotina
;;---------------------------------------------------------------------------
(DEFUN c:txt1 (/ p1 p2 dh w@
ang pmedio altura estilo expert
string oldlay dcl-da-string path
meu_error old-error afonte
)
(SETVAR "CMDECHO" 0)
;;------------------------------------- Incio de COMENTRIOS 0
;; Abaixo definimos uma funo de erro, para o caso do usurio,
;; no meio da rotina, clicar'ESC' ou 'CTRL + C'. Assim, prevenimos
;; o trace do AutoLISP, bem como restauramos as variveis modificadas
;; por necessidade da rotina, e ainda descarregamos o arquivo .DCL
;; da memria...
;;
;; Lembrar que *error* uma funo do AutoLISP que pode ser redefinida...
;;
;;------------------------------------- Fim de COMENTRIOS 0
(DEFUN meu_error (msg)
(PRINC "\n-> Erro : ")
(PRINC msg)
(PRINC )
(IF expert
(SETVAR "EXPERT" expert)
)
(IF estilo
(SETVAR "TEXTSTYLE" estilo)
)
(IF dh
(UNLOAD_DIALOG dh)
)
(PRINC )
)
(SETQ old-error *error*
*error* meu_error
)
;;------------------------------------- Incio de COMENTRIOS 1
;; A funo 'dcl-da-string' lana o quadro de dilogo para insero
;; do texto a ser escrito. Este armazenado na varivel 'STRING',
;; e retornado por esta funo.
;;------------------------------------- Fim de COMENTRIOS 1
(DEFUN dcl-da-string ()
(IF (NEW_DIALOG "txt1" dh)
(PROGN (SETQ string nil)
(ACTION_TILE "texto" "(SETQ string $value)")
(ACTION_TILE "accept" "(DONE_DIALOG)")
(START_DIALOG)
)
(ALERT
"Erro : Arquivo SUPPORT\\DCL-TXT1.DCL no pde ser escrito..."
)
)
string
)
;;------------------------------------- Incio de COMENTRIOS 2
;;
;; o trecho ABAIXO localiza o diretrio SUPPORT do AutoCAD e
;; armazena seu path na varivel 'path'.
;; Caso o arquivo DCL 'DCL-TXT1.DCL' no exista neste diretrio,
;; ele ser escrito. Este um MODO DE GARANTIR a existncia de
;; pequenos arquivos DCL.
;;
;;------------------------------------- Fim de COMENTARIOS 2
(SETQ path (SUBSTR (FINDFILE "ACAD.PAT")
1
(- (STRLEN (FINDFILE "ACAD.PAT")) 8)
)
)
(IF ((NOT (FINDFILE (STRCAT path "DCL-TXT1.DCL")))
(PROGN
(SETQ arq (OPEN (STRCAT path "DCL-TXT1.DCL") "w"))
(PRINC "txt1 : dialog { label = \"Curso E.Fernal de AutoLISP\";\n"
arq
)
(PRINC "initial_focus = \"texto\";\n" arq)
(PRINC
":edit_box { label = \"Texto = \"; key = \"texto\"; edit_width = 40; \n"
arq
)
(PRINC "allow_accept = true;\n" arq)
(PRINC "is_tab_stop = false; }\n" arq)
(PRINC "ok_only;}" arq)
(CLOSE arq)
(SETQ arq nil)
)
nil
)
;; O arquivo DCL-TXT1.DCL, SE NO EXISTIA, AGORA EXISTE...
(SETQ path nil
dh nil
dh (LOAD_DIALOG "DCL-TXT1.DCL")
; agora carregamos o arquivo DCL para a memria
)
;;-------------------------------------- Inicializamos a altura_da_fonte, se
;;-------------------------------------- esta varivel ainda no existir....
;;-------------------------------------- Ela ser o valor por DEFAULT
(IF ((NOT altura_da_fonte)
(SETQ altura_da_fonte 12.5)
)
;;-------------------------------------- Fim da inicializao
;;--------------- Aqui pedimos a altura para os textos.
;;--------------- Caso o usurio tecle enter sem entrar com
;;--------------- um valor vlido, altura_da_fonte ser adotada...
(SETQ altura (GETREAL (STRCAT "\n-> Favor indicar a altura da fonte < "
(RTOS altura_da_fonte 2 6)
">:"
)
)
estilo (GETVAR "TEXTSTYLE")
expert (GETVAR "EXPERT")
oldlay (GETVAR "CLAYER")
)
(IF (OR ((NOT altura) ;Se no houver 'altura'...
(= altura 0.0) ;Ou se ela for zero
(MINUSP altura) ;Ou ainda se for um nmero negativo...
)
(SETQ altura altura_da_fonte) ;Ento 'altura' ser altura_da_fonte!
)
(SETQ altura_da_fonte altura) ;E 'altura_da_fonte' ser 'altura', assim
;'altura' ser tornada DEFAULT...
;;----------------------------------------------------------------------------------
;;--------------------------- Se a camada 'TEXTOS-MAPAS' no existir, ser criada...
(IF (NULL (TBLSEARCH "LAYER" "TEXTOS-MAPAS"))
(COMMAND "_.LAYER" "M" "TEXTOS-MAPAS" "S" oldlay "")
)
;;----------------------------------------------------------------------------------
;;--------------------------- Se o estilo 'VERDANA' no existir, ser criado...
(SETVAR "EXPERT" 5)
(IF (NULL (TBLSEARCH "style" "VERDANA"))
(COMMAND "style" "VERDANA" "ROMANS.SHX" 0.0 1.0 0.0 "N" "N" "N")
nil
)
(SETQ retorno (TBLSEARCH "style" "VERDANA"))
;;-------------------- Eis um possvel 'RETORNO'
;|
((0 . "style")
(2 . "VERDANA")
(70 . 0)
(40 . 7.77)
(41 . 1.0)
(50 . 0.0)
(71 . 0)
(42 . 7.77)
(3 . "ROMANS.SHX")
(4 . "")
)
|;
;;-------------------- Precisamos verificar se a 'altura' ZERO...
(SETQ afonte (CDR (ASSOC 40 retorno)))
;;----------------------------------------------------------------------------------
;;Agora iniciamos o LOOPING 'WHILE'. Enquanto fornecermos P1, ele solicitar P2 e, se
;;este for fornecido, ir solicitar o texto por intermdio de um quadro de dilogo e
;;o escrever. Se o texto for vazio, isto , um string "", ele no ser escrito.
;;----------------------------------------------------------------------------------
(WHILE (SETQ p1 (GETPOINT "\n-> Primeiro ponto referencial : "))
(IF (SETQ p2 (GETPOINT p1 "\n-> Segundo ponto referencial : "))
(PROGN (SETQ ;;------------------ Localizamos o ponto mdio de P1 e P2
pmedio (POLAR p1 (ANGLE p1 p2) (/ (DISTANCE p1 p2) 2.0))
;;------------------ Calculamos o ngulo entre P1 e P2
ang (ANGLE p1 p2)
;;------------------ Sempre ajustamos o ngulo 'ang' do texto...
ang (COND ((AND (>= ang 0.0) (<= ang (* PI 0.5))) ang)
((< ang (* PI 1.5)) (+ ang PI))
(T ang)
)
;;------------------ eliminamos 'string' para garantir um novo
;;------------------ fornecimento de 'string'
string nil
)
;;---------------- Aqui solicitamos o 'string' a escrever...
(dcl-da-string)
;;---------------- O string vlido?
(IF (AND string (> (STRLEN string) 0))
;;---------------- Sim, vlido...
;;---------------- Usamos 'COMMAND' para escrever o texto...
(IF (= afonte 0.0)
;;----------------- O estilo tem altura 0.0, ento o texto ser
;;----------------- escrito com a altura solicitada...
(COMMAND "_.TEXT"
"MC"
"_NON"
pmedio
altura
(* 180.0 (/ ang PI))
string
"_.CHPROP"
(ENTLAST)
""
"LA"
"TEXTOS-MAPAS"
""
)
;;----------------- O estilo 'VERDANA' tem altura definida, ento esta
;;----------------- prevalecer para o texto...
(COMMAND "_.TEXT"
"MC"
"_NON"
pmedio
(* 180.0 (/ ang PI))
string
"_.CHPROP"
(ENTLAST)
""
"LA"
"TEXTOS-MAPAS"
""
)
)
;;--------------------- No, o string invlido.
;;--------------------- Ento retornamos 'NIL'
nil
)
)
(ALERT "P2 no fornecido, recomeando...")
; P2 inexistente, volta ao 'WHILE'
)
;;----------------------- No forneceu P1, ento encerra o looping 'WHILE'...
)
;;----------------------------------------- Agora reconfiguramos o AutoCAD tal
;;----------------------------------------- como estava...
(IF estilo
(SETVAR "textstyle" estilo)
)
(IF expert
(SETVAR "EXPERT" expert)
)
;;----------------------------------------- E aqui, descarregamos o DCL da memria...
(IF dh
(UNLOAD_DIALOG dh)
)
;;----------------------------------------- Restabelecemos *error* ao original...
(SETQ *error* old-error)
(PRINC )
)
;;----------------- A est!!!!!!!
;;-----------------
;;-----------------EOF de txt1.lsp
;;-------------------------------------------------------------------------- ARQUIVO 12
;; Curso E.Fernal de AutoLISP
;; efernal@gr-acad.com.br
;; http://www.gr-acad.com.br
;; NO ALTERE ESTE ARQUIVO OU A ROTINA PODER NO FUNCIONAR ADEQUADAMENTE...
;; incio da rotina
;;---------------------------------------------------------------------------
;;
;;*****************************************************************************;;
;|
Obs.:
Esta rotina uma rplica do arquivo c:\curso\dup\slides2.lsp,
tendo sido alterada a funo 'EXECUTIVA_AQUI', trocando o (ALERT ...)
por outras mensagens...
Voc pode trocar os paths dos arquivos .dwg, devendo ainda substituir
os slides na biblioteca C:\CURSO\SLB\SLB001, ou mesmo substituindo
paths e bibliotecas.
A lista de blocos poder ser alterada, substituindo-se "Bloco1", "Bloco2",
etc., pelos nomes dos seus blocos...
|;
;;*****************************************************************************;;
(DEFUN c:slides3 (/ dh w@ ajuda
executiva-aqui bloco-a-inserir
lista selecionar
)
(SETVAR "CMDECHO" 0)
(SETQ p1 nil
lista '()
bloco-a-inserir nil
)
;;---------------------------------------------------------------
;;funcoes locais, exigidas se o usurio pressionar o boto "Help"
;;ou o boto "Ok"
;;
;; A funo abaixo ser disparada toda vez que o usurio clicar no botao "Help"
(DEFUN ajuda ()
(ALERT
(STRCAT "Este texto pode ser substituido por uma mensagem mais"
"\nadequada cada uma das rotinas."
"\nEste somente um exemplo..."
)
)
)
;; A funo abaixo ser executada toda vez que o usurio clicar um item
;; na lista de blocos disponveis...
(DEFUN selecionar (value / dx dy)
(SETQ bloco-a-inserir (NTH (ATOI value) lista)
dx (DIMX_TILE "imagem")
dy (DIMY_TILE "imagem")
)
;;(ALERT (STRCAT "Dx = " ((ITOA dx) "\nDy = " ((ITOA dy)))
;; ALERT acima retornou dx = 180 e dy = 180
(SET_TILE "saida" (STRCAT "Inserir " bloco-a-inserir))
(START_IMAGE "imagem")
(FILL_IMAGE 0 0 dx dy 0)
(SLIDE_IMAGE
0
0
dx
dy
(STRCAT "c:\\curso\\slb\\slb001(" bloco-a-inserir ")")
)
(END_IMAGE)
bloco-a-inserir
)
;; A funo abaixo ser disparada se o usurio clicar no boto "Ok"
(DEFUN executiva-aqui (/ p1)
(IF bloco-a-inserir
(IF (SETQ
p1 (GETPOINT "\n-> Selecione ponto de insero do bloco : ")
)
;;*******************************************************************
;|
(ALERT
(STRCAT
"Voc forneceu o ponto..."
"\nNeste trecho, a rotina dever ser programada para"
"\ninserir o bloco selecionado, se encontrado..."
"\nIsto dever ser feito substituindo-se este 'ALERT' por"
"\nexpresses AutoLISP que localizem o arquivo externo e/ou"
"\no bloco na tabela de blocos, inserindo-o ou com o comando"
"\n'INSERT' ou usando a funo (ENTMAKE '((0 . \"INSERT\")....))"
"\nO comandos SLIDES3 uma rplica deste, inserindo blocos...")
)
|;
;; acima, o trecho que foi substituido
;; abaixo, o trecho que entrou -> (COND ...)
;;*******************************************************************
(COND
((TBLSEARCH "BLOCK" bloco-a-inserir)
(COMMAND "_.INSERT" bloco-a-inserir "_NON" p1 1.0 1.0 pause)
)
((FINDFILE
(STRCAT "C:\\CURSO\\DWG\\" bloco-a-inserir ".DWG")
)
(COMMAND
"_.INSERT"
(FINDFILE
(STRCAT "C:\\CURSO\\DWG\\" bloco-a-inserir ".DWG")
)
"_NON"
p1
1.0
1.0
pause
)
)
(T
(ALERT
"Bloco no est presente no desenho e no foi encontrado em C:\\CURSO\\DWG\\"
)
)
)
;; fim do trecho que entrou...
(ALERT "Ponto de insero no foi fornecido...")
)
(ALERT "Bloco no foi selecionado...")
)
)
;;-----------------------------------------FIM DAS FUNCOES LOCAIS
(IF (> (SETQ dh (LOAD_DIALOG "C:\\CURSO\\DCL\\SLIDES2.DCL")) 0)
(IF (NEW_DIALOG "slides2" dh) ; o nome do quadro tem que ser exatamente o
; mesmo do arquivo .DCL, inclusive respeitando
; minsculas e masculas
(PROGN ;; Criamos uma lista com o nome dos blocos disponveis
(SETQ lista '("Bloco1" "Bloco2" "Bloco3"
"Bloco4" "Bloco5" "Bloco6"
"Bloco7" "Bloco8" "Bloco9"
"Bloco10"
)
)
;; Inserimos esta lista no campo 'list_box' do quadro de dilogo
(START_LIST "lista") ; esta chave "lista" deve ser exatamente igual
; ao que foi escrito no arquivo .DCL
(MAPCAR 'ADD_LIST lista)
(END_LIST)
;; Ok, a lista foi inserida no quadro de dilogo.
(ACTION_TILE "accept" "(DONE_DIALOG 1)")
(ACTION_TILE "cancel" "(DONE_DIALOG 0)")
(ACTION_TILE "lista" "(selecionar $value)")
(ACTION_TILE "help" "(ajuda)")
;;apertar "Help" dispara a funcao 'ajuda'
(SETQ w@ (START_DIALOG))
;;Aqui o quadro de dilogo retirado
; da tela
(UNLOAD_DIALOG dh)
;;e aqui, o arquivo DCL eliminado da memria
(COND ((= w@ 0) (PRINC "\n-> Cancelado..."))
;; Aqui o usurio apertou "Cancel"
((= w@ 1) (executiva-aqui))
;; Aqui o usurio apertou "Ok"
)
)
nil
)
(ALERT
"Arquivo C:\\CURSO\\DCL\\SLIDES2.DCL no pde ser carregado..."
)
)
(PRINC )
)
;; Exemplos de listas...
(SETQ a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10)
(SETQ lista3 (LIST a b c d e f g h i j))
(SETQ lista4
'(("PARAFU1" 16)
("PARAFU2" 20)
("PARAFU3" 25)
("PARAFU4" 30))
Primeira parte...
dup1_01 : dialog
{
label = "E.Fernal Software";
initial_focus = "ins-val";
: edit_box { label = "Insira valor"; key = "ins-val"; edit_width = 12; }
ok_cancel_help;
}
dup1_02 : dialog
{ label = "E.Fernal Software";
initial_focus = "ins-val";
: edit_box { label = "Insira valor"; key = "ins-val"; edit_width = 12; }
: radio_row { label = "Unidade mtrica";
: radio_button { label = "Milmetros"; key = "mm"; value = 1; }
: radio_button { label = "Centmetros"; key = "cm"; }
: radio_button { label = "Metros"; key = "me"; }
}
: spacer { width = 0.75; }
ok_cancel_help;
}
Cdigo fonte do quadro de dilogo acima...
dup1_03 : dialog
{ label = "E.Fernal Software";
initial_focus = "ins-val";
: edit_box { label = "Insira valor"; key = "ins-val"; edit_width = 12; }
: radio_row { label = "Unidade mtrica";
: radio_button { label = "Milmetros"; key = "mm"; value = 1; }
: radio_button { label = "Centmetros"; key = "cm"; }
: radio_button { label = "Metros"; key = "me"; }
}
: spacer { width = 0.75; }
: row
{
: button { label = "Layer >"; key = "la"; fixed_width = true; }
: text { label = ""; key = "LA"; width = 35; }
}
: spacer { width = 0.75; }
ok_cancel_help;
}
;|
INCIO DE COMENTRIOS
'dup1_03' o nome do quadro de dilogo. Este nome dever ser digitado, em sua
rotina AutoLISP, exatamente como est neste arquivo dcl, no trecho
Segunda parte...
@include
diretiva de incluso, permite que voc defina clusters em um arquivo parte,
e o inclua em todas os demais arquivos .DCL
SINTAXE @include "c:\\curso\\dcl\\base.dcl"
alignment
define o alinhamento de componentes de quadros de dilogo.
EXEMPLO : text { label = "Componente 'text' com alinhamento normal"; }
: text { label = "Componente 'text' com alinhamento 'centered'";
alignment = centered; }
: text { label = "Componente 'text' com alinhamento 'right'";
alignment = right; }
allow_accept
propriedade dos tiles tipo 'edit_box', 'image_button' e 'list_box'
ativa o boto cuja propriedade 'is_default' seja 'true', quando um
destes componentes, com 'allow_accept = true', for selecionado
EXEMPLO : edit_box { label = "Digite texto";
key = "texto"; edit_width = 40; edit_limit = 55;
allow_accept = true;
}
aspect_ratio
define a proporo entre largura e altura de um componente 'image' ou
'image_button'
SINTAXE : image { key = "i1"; width = 40; aspect_ratio = 0.75; }
big_increment
aplica-se ao componente do tipo 'slider' e define o menor valor incremental
ao se deslizar o boto interno deste componente
EXEMPLO : slider { key = "Temperatura"; min_value = 0;
max_value = 100; small_increment = 1;
big_increment = 10;
}
boxed_column
abre uma caixa de enquadramento para uma coluna de componentes diversos,
permitindo um rtulo.
SINTAXE : boxed_column { label = "Lineweights";
[...demais componentes aqui...]
}
boxed_radio_column
abre uma caixa de enquadramento para uma coluna de 'radio_button',
permitindo um rtulo.
SINTAXE : boxed_radio_column { label = "Caixa de enquadramento";
[...demais componentes aqui...]
}
boxed_radio_row
abre uma caixa de enquadramento para uma coluna de 'radio_button'
SINTAXE : boxed_radio_row { label = "Iso&metric Snap/Grid";
: radio_button { label = "&left"; key = "left"; }
: radio_button { label = "&Top"; key = "top"; }
: radio_button { label = "&right"; key = "right"; }
}
boxed_row
abre uma caixa de enquadramento para uma linha de componentes diversos
SINTAXE : boxed_radio_row { label = "boxed_row";
[...demais-componentes aqui...]
}
button
insere um boto
SINTAXE : button { label = "Cores"; key = "btn1"; width = 12; }
cancel_button
insere um boto "Cancel"
SINTAXE cancel_button;
centered
propriedade de um alinhamento
EXEMPLO : text { label = "Escolha bloco"; alignment = centered; }
color
define a cor de um quadro de imagem 'image' ou 'image_button'
SINTAXE : image { key = "i1"; color = 0; width = 40; aspect_ratio = 0.5; }
column
abre uma coluna para componentes diversos
SINTAXE : column {
[...demais componentes aqui...]
}
concatenation
concatena strings em um componente 'text'
EXEMPLO : concatenation {
default_dcl_settings
dialog
define um quadro de dilogo
SINTAXE MEU_DCL_01 : dialog { label = "Dcl nmero 1";
: text { label = "Teste de dcl"; alignment = centered; }
ok_only;
}
edit_box
abre um campo de edio de texto
SINTAXE : edit_box { label = "edit_box"; key = "raio";
edit_width = 12; edit_limit = 16;
}
edit_width
define a largura de um componente 'edit_box' - vide acima
errtile
abre um campo 'text' padronizado, cujo 'key' "error".
SINTAXE errtile;
heigth
define a altura de componentes.
EXEMPLO : list_box { label = "Opes"; height = 12; width = 40;
key = "lista";
}
false
fixed_width
assegura que o componente tenha somente a largura mnima necessria
EXEMPLO : button { label = "Largura"; key = "btn1"; fixed_width = true;
}
help_button
insere um boto "Help" padronizado, cujo 'key' "help"
SINTAXE help_button;
icon_image
image
abre um quadro de imagem
SINTAXE : image { key = "img35"; width = 40; aspect_ratio = 0.77;
color = -15;
}
image_block
image_button
abre um quadro de imagem clicvel
SINTAXE : image_button { key = "img36"; width = 40; aspect_ratio = 0.77;
color = -15;
}
info_button
insere um boto "Info" padronizado, cujo 'key' "info"
SINTAXE info_button;
initial_focus
lana o foco sobre o tile especificado
SINTAXE initial_focus = "componente";
is_cancel
define um componente qualquer como componente de saida
EXEMPLO : button { label = "Encerra"; key = "sair";
is_cancel = true;
}
is_default
is_tab_stop
key
define a chave para cada um dos componentes
EXEMPLO : edit_box { label = "Altura em mm"; key = "altura";
edit_width = 12; edit_limit = 16;
}
label
define o rtulo de um componente - vide acima
list
insere um 'list_box' ou 'popup_list' com uma lista de strings
EXEMPLO : popup_list { label = "Opes"; key = "pop"; width = 30;
list = "Bloco 1\nBloco 2\nBloco 3\nBloco 4\nBloco 5";
}
list_box
abre um componente 'list'
SINTAXE : list_box { label = "AutoLISP"; key = "lista";
width = 28; height = 16;
}
multiple_select
permite selecionar mais de uma linha em componentes 'list_box' e/ou 'popup_list'
EXEMPLO : list_box { label = "AutoLISP"; key = "lista";
width = 28; height = 16; multiple_select = true;
}
o default 'false' e no precisa ser inserido
ok_button
insere um boto 'OK' padronizado, cujo 'key' "accept"
SINTAXE ok_button;
ok_cancel
insere um par de botes padronizados, sendo o primeiro 'OK' e o segundo
'Cancel', e cujos 'key' so "accept" e "cancel"
SINTAXE ok_cancel;
ok_cancel_help
insere trs botes padronizados, sendo o primeiro 'OK', o segundo
'Cancel' e o terceiro 'Help', e cujos 'key' so "accept", "cancel" e "help"
SINTAXE ok_cancel_help;
ok_cancel_err
insere dois botes, o primeiro 'OK', cujo 'key' "accept", o segundo 'Cancel',
com 'key' igual a "cancel" e uma linha 'errtile', cujo 'key' "error"
ok_cancel_help_errtile
idem acima, com mais um boto "Help", cujo 'key' "help"
ok_cancel_help_info
insere os botoes 'OK', 'Cancel', 'Help' e 'Info', cujos 'keys' so, respectivamente,
"accept", "cancel", "help" e "info"
ok_only
insere um boto 'OK' cujo 'key' "accept", pr-definido no BASE.DCL do AutoCAD
paragraph
popup_list
insere um componente tipo lista
SINTAXE : popup_list { label = "popup_list"; key = "pop1"; }
radio_column
abre uma coluna de 'radio_button'
SINTAXE : radio_column {
: radio_button { label = "Opo 1"; key = "opt1"; }
: radio_button { label = "Opo 2"; key = "opt2"; }
: radio_button { label = "Opo 3"; key = "opt3"; }
: radio_button { label = "Opo 4"; key = "opt4"; }
}
radio_row
abre uma linha de 'radio_button'
SINTAXE : radio_row {
: radio_button { label = "radio_button 1"; key = "opt1"; }
: radio_button { label = "radio_button 2"; key = "opt2";
}
}
retirement_button
right
row
abre uma linha de componentes
SINTAXE : row {
[...demais componentes aqui...]
}
slider
insere um componente deslizante
SINTAXE : slider { key = "sli"; min_value = 1; max_value = 100;
big_increment = 10; small_increment = 1;
}
small_increment
aplica-se ao componente do tipo 'slider' e define o menor valor incremental
ao se deslizar o boto interno deste componente
EXEMPLO : slider { key = "Temperatura"; min_value = 0;
max_value = 100; small_increment = 1;
big_increment = 10;
}
spacer
define um espaamento entre componentes
SINTAXE : spacer { width = 3; }
spacer_0
um 'spacer' com espaamento 0
SINTAXE spacer_0;
spacer_1
um 'spacer' com espaamento 1
SINTAXE spacer_1;
swatch
tabs
aplica-se somente a componentes 'list_box' e 'popup_list', e define, nestes
componentes, os espaos de tabulao de um texto.
EXEMPLO : list_box { label = "Tabela 1"; key = "tabela1";
width = 80; height = 12;
tabs = "8 16 24 32 40";
}
text_part
toggle
define um componente assinvel
SINTAXE : toggle { label = "Deseja cotar?"; key = "cotar"; value = 1; }
true
define uma propriedade como verdadeira
EXEMPLO : list_box { label = "Selecione"; key = "lista";
width = 40; height = 12;
multiple_select = true;
}
value
inicializa o valor de retorno do componente
EXEMPLO : toggle { label = "Deseja cotar?"; key = "cotar"; value = 1; }
acima, o 'toggle' estar assinalado na abertura do quadro de dilogo e
abaixo, estar desmarcado.
: toggle { label = "Deseja cotar?"; key = "cotar"; value = 0; }
o default 0
width
define a largura de um componente
EXEMPLO : button { label = "Boto"; key = "b1"; width = 30; }
Exemplos diversos
// dialog {
// layout = vertical;
// is_enabled = false;
// }
//
// cluster {
// layout = horizontal;
// }
//
// radio_cluster {
// layout = horizontal;
// is_enabled = true;
// }
//
// tile {
// layout = horizontal;
// is_enabled = true;
// }
//
// text : tile {
// fixed_height = true; // inhibit vertical expansion
// }
//
// image : tile {
// }
//
// button : tile {
// fixed_height = true;
// is_tab_stop = true;
// }
//
// image_button : button {
// is_tab_stop = true;
// }
//
// toggle : tile {
// fixed_height = true;
// is_tab_stop = true;
// }
//
// radio_button : tile {
// fixed_height = true;
// is_tab_stop = true;
// }
//
// list_box : tile {
// is_tab_stop = true;
// height = 10;
// width = 10;
// }
//
// edit_box : tile {
// fixed_height = true;
// is_tab_stop = true;
// }
//
// popup_list : tile {
// is_tab_stop = true;
// fixed_height = true;
// }
//
// slider : tile {
// is_tab_stop = true;
// }
//
// spacer : tile {
// }
row : cluster {
horizontal_margin = none;
vertical_margin = none;
children_alignment = centered;
}
column : cluster {
layout = vertical;
horizontal_margin = none;
vertical_margin = none;
}
boxed_row : cluster {
label = " ";
boxed = true;
children_alignment = centered;
}
boxed_column : cluster {
layout = vertical;
label = " ";
boxed = true;
}
radio_row : radio_cluster {
horizontal_margin = none;
vertical_margin = none;
children_alignment = centered;
}
radio_column : radio_cluster {
layout = vertical;
horizontal_margin = none;
vertical_margin = none;
}
boxed_radio_row : radio_cluster {
label = " ";
boxed = true;
children_alignment = centered;
}
boxed_radio_column : radio_cluster {
layout = vertical;
label = " ";
boxed = true;
}
concatenation : cluster {
fixed_width = true;
fixed_height = true;
children_alignment = centered;
}
paragraph : cluster {
layout = vertical;
fixed_height = true;
}
text_part : text {
horizontal_margin = none;
vertical_margin = none;
}
text_25 : text {
width = 25;
}
spacer_0 : spacer {
height = 0;
width = 0;
horizontal_margin = none;
vertical_margin = none;
}
spacer_1 : spacer {
height = 1;
width = 1;
horizontal_margin = none;
vertical_margin = none;
}
default_button : button {
is_default = true;
}
retirement_button : button {
fixed_width = true;
width = 8;
alignment = centered;
}
ok_button : retirement_button {
label = " OK ";
key = "accept";
is_default = true;
}
cancel_button : retirement_button {
label = "Cancel";
key = "cancel";
is_cancel = true;
}
help_button : retirement_button {
label = "&Help";
key = "help";
is_help = true;
}
info_button : retirement_button {
label = "&Info...";
key = "info";
}
ok_only : column {
fixed_width = true;
alignment = centered;
: ok_button {
is_cancel = true;
}
}
ok_cancel : column {
: row {
fixed_width = true;
alignment = centered;
ok_button;
: spacer { width = 2; }
cancel_button;
}
}
ok_cancel_help : column {
: row {
fixed_width = true;
alignment = centered;
ok_button;
: spacer { width = 2; }
cancel_button;
: spacer { width = 2; }
help_button;
}
}
ok_cancel_help_info : column {
: row {
fixed_width = true;
alignment = centered;
ok_button;
: spacer { width = 2; }
cancel_button;
: spacer { width = 2; }
help_button;
: spacer { width = 2; }
info_button;
}
}
errtile : text {
label = "";
key = "error";
width = 35; // must be long enough to hold error msgs
is_error_tile = true;
}
// A custer consisting of OK, Cancel, and Help on one line with the error tile
// below.
ok_cancel_help_errtile : column {
ok_cancel_help;
errtile;
}
// The same thing without the Help button for subdialogues that have no help
// available.
ok_cancel_err : column {
ok_cancel;
errtile;
}
//----- Currently, the only dcl setting is the audit_level which controls the
// level of semantic error checking applied during a load_dialog operation.
// (0 = none, 1 = errors, 2 = warnings, 3 = hints)
// See AutoCAD's README for details.
default_dcl_settings : tile {
audit_level = 1;
}
//----- Miscellaneous parts used by ACAD.DCL (AutoCAD) & ACLT.DCL (AutoCAD LT).
image_block : image {
key = "show_image";
height = 1;
width = 1;
}
icon_image : image_button {
color = 0;
width = 12;
aspect_ratio = 0.66;
allow_accept = true;
fixed_height = true;
fixed_width = true;
}
edit12_box : edit_box {
edit_width = 12;
edit_limit = 148; // 18 * 8 (CIF/MIF size)
}
edit32_box : edit_box {
edit_width = 32;
edit_limit = 2048; // MAX_VALUE (256 * 8 (CIF/MIF size))
}
swatch : image_button {
vertical_margin = none;
horizontal_margin = none;
fixed_height = true;
fixed_width = true;
height = 1.5;
width = 3;
allow_accept = true;
}
std_rq_color :column{
:column {
:boxed_row {
fixed_width = true;
label = "Standard Colors";
color_palette_1_9;
}
:row {
:boxed_row {
fixed_width = true;
label = "Gray Shades";
color_palette_250_255;
}
:boxed_row {
fixed_width = true;
label = "Logical Colors";
:button {
label = "BY&LAYER";
key = "256";
}
:button {
label = "BY&BLOCK";
key = "000";
}
}
}
}
:boxed_column {
label = "Full Color Palette";
:image_button{
key = "hiside";
alignment = centered;
width = 40;
height = 4;
allow_accept = true;
is_enabled = false;
}
:image_button{
alignment = centered;
key = "loside";
width = 40;
height = 4;
allow_accept = true;
is_enabled = false;
}
}
:row {
fixed_width = true;
alignment = centered;
children_alignment = bottom;
:edit12_box {
label = "Color:";
key = "color_edit";
allow_accept = true;
}
:swatch {
key = "color_image";
}
}
ok_cancel_help_errtile;
}
files_bottomdf : column {
: edit_box {
key = "fedit";
label = "&File:";
allow_accept = true;
}
ok_cancel;
errtile;
}
fcf_ibut : image_button {
horizontal_margin = none;
width = 3.5;
height = 1.2;
color = 0;
alignment = bottom;
}
fcf_ebox : edit_box {
horizontal_margin = none;
edit_width = 7;
fixed_width = true;
alignment = bottom;
}
fcf_ebox1 : edit_box {
horizontal_margin = none;
edit_width = 3;
edit_limit = 3;
fixed_width = true;
alignment = bottom;
}
fcf_ibut1 : image_button {
width = 5.0;
aspect_ratio = 0.66;
color = 0;
allow_accept = true;
}