Estes são alguns dos arquivos com rotinas AutoLISP©, que fazem parte do
"Curso E.Fernal de AutoLISP©".
|
;;-------------------------------------------------------------------------- ARQUIVO 01
;; Curso E.Fernal de AutoLISP
;; efernal@gmail.com
;; http://www.gr-acad.com.br
;; NÃO ALTERE ESTE ARQUIVO OU A ROTINA PODERÁ NÃO FUNCIONAR ADEQUADAMENTE...
;; início da rotina
;;---------------------------------------------------------------------------
(DEFUN c:ponto1 (/ ponto)
(SETVAR "CMDECHO" 0)
(ALERT
"Esta função irá solicitar o fornecimento (opcional) de um ponto..."
)
(SETQ ponto (GETPOINT "\n-> Forneça um ponto : "))
(IF ponto
(ALERT (STRCAT "Você forneceu o ponto \n( "
(RTOS (CAR ponto) 2 (GETVAR "LUPREC"))
"\t"
(RTOS (CADR ponto) 2 (GETVAR "LUPREC"))
"\t"
(RTOS (CADDR ponto) 2 (GETVAR "LUPREC"))
")"
)
)
(ALERT "Você não forneceu nenhum ponto...")
)
(PRINC )
)
;; fim da rotina
;| início de comentários sobre esta função
Os textos entre [ ] são opcionais, podem ou não ser incluidos...
DEFUN é a função do AutoLISP que define uma nova função.
'DEfine FUNction'
Sintaxe
(DEFUN [c:]nome-da-funcao ( [argumentos] / [variaveis-locais] )
...expressoes...
[...expressoes...]
[................]
[...expressoes...]
)
Quando o nome da função é precedido por c:, como neste
exemplo, então ao se carregar o arquivo será criado um
novo comando. Para executar este comando, bastando digitar
este nome, sem o C:
Caso contrário, será necessário digitar o nome da função
entre parênteses.
Toda nova função criada com o AutoLISP sobrepõe-se às
já existentes, portanto você deve assegurar-se de não
utilizar nomes já existentes. Para checar, você pode
utilizar a função ATOMS-FAMILY do AutoLISP ou digitar
!nome-da-funcao e teclar Enter. Caso o retorno seja nil,
então até este momento o nome está disponível.
Argumentos devem ser passados somente para funções sem C:,
embora possam ser passados nos dois casos.
Você deve declarar como locais as variáveis que somente
serão utilizadas nesta rotina, para evitar que as mesmas
permaneçam na memória inutilmente.
****************************************************************************************
SETVAR é a função do AutoLISP que permite alterar uma variável
de sistema do AutoCAD©
****************************************************************************************
"CMDECHO" é a variável de sistema do AutoCAD© que define se o echo
dos comandos será ou não eliminado. 0 (zero) elimina o echo,
e 1 o habilita.
Obs.: Não há nenhum sentido em habilitá-lo, exceto quando estamos
programando e desejamos acompanhar uma determinada etapa de
procedimentos.
****************************************************************************************
ALERT é a função do AutoLISP que apresenta o quadro de mensagens
AutoCAD Message - Esta função exige um só argumento,
e este tem quer ser um string de caracteres...
(strings são caracteres entre aspas)
****************************************************************************************
SETQ é a função do AutoLISP que atribui a uma variável um valor
Sintaxe
(SETQ variavel1 valor1
[variavel2 valor2]
[variaveln valorn]
[variavel255 valor255]
)
****************************************************************************************
GETPOINT é a função AutoLISP que solicita ao operador o fornecimento
de um ponto, seja clicando ou entrando pelo teclado.
****************************************************************************************
IF é uma função que existe em todas linguagens de programação e quer dizer
SE.
Sintaxe
(IF condicao
expressao1
[expressao2]
)
Se a condição 'condicao' for verdadeira, então a função
executará a expressão 'expressao1'. Caso contrário,
executará a expressão 'expressao2', se esta estiver
presente.
****************************************************************************************
STRCAT é a função 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 função do AutoLISP que converte um número real em string.
(Real TO String)
Vide opçoes para RTOS no catálogo de funções
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 função 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 função do AutoLISP que recupera o valor de uma variável 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 variáveis.
****************************************************************************************
"LUPREC" é a variável de sistema do AutoCAD© que armazena o número
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 função 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 comentários
|;
;;-------------------------------------------------------------------------- ARQUIVO 02
;; Curso E.Fernal de AutoLISP
;; efernal@gmail.com
;; http://www.gr-acad.com.br
;; NÃO ALTERE ESTE ARQUIVO OU A ROTINA PODERÁ NÃO FUNCIONAR ADEQUADAMENTE...
;; início da rotina
;;---------------------------------------------------------------------------
(DEFUN c:ponto2 (/ ponto)
(SETVAR "CMDECHO" 0)
(ALERT
"Esta função irá solicitar o fornecimento (obrigatório) de um ponto..."
)
(INITGET 1)
(SETQ ponto (GETPOINT "\n-> Forneça um ponto : "))
(ALERT (STRCAT "Você forneceu o ponto \n( "
(RTOS (CAR ponto) 2 (GETVAR "LUPREC"))
"\t"
(RTOS (CADR ponto) 2 (GETVAR "LUPREC"))
"\t"
(RTOS (CADDR ponto) 2 (GETVAR "LUPREC"))
")"
)
)
(PRINC )
)
;; fim da rotina
;| início de comentários sobre esta função
Os textos entre [ ] são opcionais, podem ou não ser incluidos...
INITGET é a função do AutoLISP que define qual opção será tomada
para uma função seguinte, que deverá ser uma destas :
ENTSEL
NENTSEL
NENTSELP
GETINT
GETREAL
GETDIST
GETANGLE
GETORIENT
GETPOINT
GETCORNER
GETKWORD
Os bits de controle mais usados são :
1 - Impede que a resposta seja um toque na barra de espaço
2 - Impede que a resposta seja 0 (zero)
4 - Impede que a resposta seja um número negativo
8 - Permite fornecer um ponto fora dos limites definidos
É válida a soma dos bits, portanto
(INITGET 7) -> ou 1 + 2 + 4
impede a entrada de um número que não seja maior
que zero.
fim de comentários
|;
;;-------------------------------------------------------------------------- ARQUIVO 03
;; Curso E.Fernal de AutoLISP
;; efernal@gmail.com
;; http://www.gr-acad.com.br
;; NÃO ALTERE ESTE ARQUIVO OU A ROTINA PODERÁ NÃO FUNCIONAR ADEQUADAMENTE...
;; início da rotina
;;---------------------------------------------------------------------------
(DEFUN c:real1 (/ numero)
(SETVAR "CMDECHO" 0)
(ALERT
"Esta função irá solicitar o fornecimento (opcional) de um número real..."
)
(SETQ numero (GETREAL "\n-> Forneça um número : "))
(IF numero
(ALERT (STRCAT "Você forneceu o número " (RTOS numero 2 5)))
(ALERT "Você não forneceu nenhum número...")
)
(PRINC )
)
;; fim da rotina
;| início de comentários sobre esta função
GETREAL é a função do AutoLISP que permite ao operador fornecer
um número real, através do teclado. Caso não seja utilizada a
função INITGET, a entrada pelo usuário poderá ser nula, caso
se tecle Enter ou a barra de espaços sem antes digitar um
número qualquer.
Vide 'Como obter um número real, 2' como forçar o usuário a
realmente fornecer um número.
fim de comentários
|;
;;-------------------------------------------------------------------------- ARQUIVO 04
;; Curso E.Fernal de AutoLISP
;; efernal@gmail.com
;; http://www.gr-acad.com.br
;; NÃO ALTERE ESTE ARQUIVO OU A ROTINA PODERÁ NÃO FUNCIONAR ADEQUADAMENTE...
;; início da rotina
;;---------------------------------------------------------------------------
(DEFUN c:real2 (/ numero)
(SETVAR "CMDECHO" 0)
(ALERT
"Esta função irá solicitar o fornecimento (obrigatório) de um número real..."
)
(INITGET 1)
(SETQ numero (GETREAL "\n-> Forneça um número : "))
(ALERT
(STRCAT "Você forneceu o número " (RTOS numero 2 5))
)
(PRINC )
)
;; fim da rotina
;| início de comentários sobre esta função
A função INITGET foi usado com o bit 1, que impede que se
tecle Enter ou a barra de espaços como resposta.
Deste modo, enquanto o operador não digitar um número, seja
negativo, zero ou maior que zero, o AutoLISP seguirá pedindo
por um número real.
fim de comentários
|;
;;-------------------------------------------------------------------------- ARQUIVO 05
;; Curso E.Fernal de AutoLISP
;; efernal@gmail.com
;; http://www.gr-acad.com.br
;; NÃO ALTERE ESTE ARQUIVO OU A ROTINA PODERÁ NÃO FUNCIONAR ADEQUADAMENTE...
;; início da rotina
;;---------------------------------------------------------------------------
(DEFUN c:real3 (/ numero)
(SETVAR "CMDECHO" 0)
(ALERT
(STRCAT "Esta função irá solicitar o fornecimento"
"\n(obrigatório) de um número real dIFerente de zero..."
)
)
(INITGET 3)
(SETQ numero (GETREAL "\n-> Forneça um número : "))
(ALERT (STRCAT "Você forneceu o número " (RTOS numero 2 5)))
(PRINC )
)
;; fim da rotina
;| início de comentários sobre esta função
A função INITGET foi usado com o bit 3, que impede que se
tecle Enter, a barra de espaços ou ainda 0 (ZERO) como resposta.
Deste modo, enquanto o operador não digitar um número DIFERENTE
de zero, o AutoLISP seguirá pedindo por um número real.
fim de comentários
|;
;;-------------------------------------------------------------------------- ARQUIVO 06
;; Curso E.Fernal de AutoLISP
;; efernal@gmail.com
;; http://www.gr-acad.com.br
;; NÃO ALTERE ESTE ARQUIVO OU A ROTINA PODERÁ NÃO FUNCIONAR ADEQUADAMENTE...
;; início da rotina
;;---------------------------------------------------------------------------
(DEFUN c:real4 (/ numero)
(SETVAR "CMDECHO" 0)
(ALERT
(STRCAT "Esta função irá solicitar o fornecimento"
"\n(obrigatório) de um número real MAIOR que zero..."
)
)
(INITGET 7)
(SETQ numero (GETREAL "\n-> Forneça um número : "))
(ALERT
(STRCAT "Você forneceu o número " (RTOS numero 2 5))
)
(PRINC )
)
;; fim da rotina
;| início de comentários sobre esta função
A função INITGET foi usado com o bit 7, que impede que se
tecle Enter, a barra de espaços, 0 (ZERO) ou um número menor que 0
como resposta.
Deste modo, enquanto o operador não digitar um número MAIOR QUE
ZERO, o AutoLISP seguirá pedindo por um número real.
fim de comentários
|;
;;-------------------------------------------------------------------------- ARQUIVO 07
;; Curso E.Fernal de AutoLISP
;; efernal@gmail.com
;; http://www.gr-acad.com.br
;; NÃO ALTERE ESTE ARQUIVO OU A ROTINA PODERÁ NÃO FUNCIONAR ADEQUADAMENTE...
;; início da rotina
;;---------------------------------------------------------------------------
![]()
(DEFUN c:entrar (/ dh w@)
(SETVAR "CMDECHO" 0)
(IF (> (SETQ dh (LOAD_DIALOG "c:\\curso\\dcl\\curso.dcl")) 0)
(IF (NEW_DIALOG "ENTRADAS" dh)
(PROGN
(IF ((NOT dado1)
(SETQ dado1 "100")
)
(IF ((NOT dado2)
(SETQ dado2 "200")
)
(IF ((NOT dado3)
(SETQ dado3 "300")
)
(IF ((NOT dado4)
(SETQ dado4 "400")
)
(SET_TILE "dado1" dado1)
(SET_TILE "dado2" dado2)
(SET_TILE "dado3" dado3)
(SET_TILE "dado4" dado4)
(ACTION_TILE
"dado1"
"(SETQ dado1 $value)(check_number dado1)"
)
(ACTION_TILE
"dado2"
"(SETQ dado2 $value)(check_number dado2)"
)
(ACTION_TILE
"dado3"
"(SETQ dado3 $value)(check_number dado3)"
)
(ACTION_TILE
"dado4"
"(SETQ dado4 $value)(check_number dado4)"
)
(ACTION_TILE "cancel" "(DONE_DIALOG 0)")
(ACTION_TILE "accept" "(DONE_DIALOG 1)")
(ACTION_TILE
"help"
"(ALERT \"Rotina de demonstração de como entrar com\ndados em um quadro de diálogo.\")"
)
(SETQ w@ (START_DIALOG))
(UNLOAD_DIALOG dh)
(COND ((= w@ 0) (PRINC "\n-> Cancelado..."))
((= w@ 1)
(ALERT "Nesta parte você deve continuar o programa...")
)
)
)
nil
)
(ALERT "Arquivo DCL não pôde ser carregado...")
)
(PRINC )
)
;| fim da rotina
início de comentários
LOAD_DIALOG é a função AutoLISP que carrega para a memória um arquivo .DCL,
que contém definições de quadros de diálogo do AutoCAD©.
Se este carregamento for bem sucedido, o retorno será um número
inteiro MAIOR que zero. Caso contrário, a função retornará zero ou
menor que zero, indicando o fracasso do carregamento.
Podemos armazenar este valor em uma variável, no caso 'dh', e
prosseguir com a rotina somente no caso de sucesso do carregamento,
isto é, se 'dh' for maior que zero.
***************************************************************************************
NEW_DIALOG é a função que localiza, dentro do conteudo do arquivo .DCL
carregado pela função LOAD_DIALOG, por um determinado quadro, neste
exemplo "ENTRADAS".
Se localizado e correto, então o quadro é lançado na tela.
Em DCL, MAIÚSCULAS são diferentes de MINÚSCULAS, portanto poderíamos
ter, no mesmo arquivo, um quadro com o nome de "ENTRADAS", outro com
o nome de "entradas", ainda outro com o nome de "Entradas" e assim
por diante. A linguagem DCL segue a sintaxe de C
Se a função fracassar, isto é, se no arquivo DCL carregado não houver
(neste exemplo) o quadro "ENTRADAS", o AutoLISP automaticamente
enviará uma mensagem de erro padrão. Observe que, por isso, retornamos
'nil' no nosso código.
**************************************************************************************
PROGN é uma função que permite diversas expressões AutoLISP. Ela foi utilizada
porque a função IF só permite avaliar uma expressão, caso o retorno seja
verdadeiro, e uma expressão alternativa, caso contrário.
Dentro deste PROGN
Como, até aqui, tudo está OK, inicializamos as variáveis globais, que
chamamos de 'DADO1', 'DADO2', 'DADO3' e 'DADO4'. Estas devem ser
strings de caracteres ou então, convertidas para este tipo de átomo,
pois, em um quadro de diálogo, sòmente strings são permitidas.
Observe a expressão
(IF ((NOT dado1)
(SETQ dado1 "100")
)
Ela diz o seguinte :
Se a variável 'dado1' não tiver valor, isto é, for 'nil',
então atribua a ela o valor de "100"
Obviamente, se ela tiver valor, suponhamos "345.45", nada
será feito e ela, portanto, continuará com este valor.
Idem para as demais variáveis 'dado2', 'dado3' e 'dado4'
Um outro modo seria :
(IF dado1
nil
(SETQ dado1 "100")
)
que quer dizer :
Se a variável 'dado1' tiver valor, isto é, for
diferente de 'nil', então 'nil', isto é, não faça
nada. Caso contrário, atribua à variável 'dado1'
o valor de "100"
**************************************************************************************
SET_TILE é a função AutoLISP que insere um valor em um 'tile' de um
quadro de diálogo.
Neste exemplo, os tiles são do tipo 'edit_box', ou campo de edição
de textos.
**************************************************************************************
ACTION_TILE é a função AutoLISP que permite chamar uma função 'callback'
ao se selecionar um 'tile' em um quadro de diálogo do AutoCAD©.
A expressão
(ACTION_TILE
"dado1"
"(SETQ dado1 $value)(check_number dado1)"
)
significa o seguinte :
execute as expressões
(SETQ dado1 $value)(check_number dado1)
para o tile cuja identificador, ou $key, é "dado1"
Observe que os parâmetros para ACTION_TILE são dois strings:
o primeiro é a chave do tile, exatamente como definido
no arquivo .DCL e o segundo um string representando
expressões válidas para o AutoLISP.
**************************************************************************************
DONE_DIALOG é a função do AutoLISP que se aplica para qualquer um
dos tiles do quadro de diálogo. Normalmente é utilizada nos
tiles "cancel", "accept", "help" e "info", mas você poderá
utilizá-la onde quizer.
Ela retorna sempre um inteiro, que poderá ser pré-determinado,
caso você o forneça.
Sintaxe
(DONE_DIALOG [inteiro-de-retorno])
**************************************************************************************
START_DIALOG é a função que retira o quadro de diálogo da tela e retorna
o 'inteiro-de-retorno' especificado por cada chamada da função
DONE_DIALOG.
Armazenando este 'inteiro-de-retorno' em uma variável,
podemos encaminhar a rotina para uma opção entre
muitas.
No exemplo acima, a expressão
(SETQ w@ (START_DIALOG))
armazena 'inteiro-de-retorno' em 'w@', sendo que :
w@ = 1 se o usuário clicou o botão "Ok"
w@ = 0 se o usuário clicou o botão "Cancel"
**************************************************************************************
UNLOAD_DIALOG é a função que elimina da memória todo o conteudo do arquivo
.DCL carregado pela função LOAD_DIALOG e cujo ponteiro identificador
foi, neste exemplo, atribuido à variável 'dh'.
**************************************************************************************
COND é uma função do AutoLISP equivalente à "select case" do VB, à "case" do
DELPHI, "switch" do C.
Ela avalia as expressões em sequência e retorna a primeira avaliação
que resultar verdadeira.
Uma alternativa pode ser fornecida, e deve ser inserida em último
lugar, através da função '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 expressões anteriores são bobagens..."
)
)
)
)
***************************************************************************************
fim de comentários
|;
;;-------------------------------------------------------------------------- ARQUIVO 08
;; Curso E.Fernal de AutoLISP
;; efernal@gmail.com
;; http://www.gr-acad.com.br
;; NÃO ALTERE ESTE ARQUIVO OU A ROTINA PODERÁ NÃO FUNCIONAR ADEQUADAMENTE...
;; início da rotina
;;---------------------------------------------------------------------------
(DEFUN c:associacao () (le-arquivo "DXF" ".TXT") (PRINC ))
;| inicio de comentários
Neste caso, definimos o comando ASSOCIACAO, que executa a função
le-arquivo, que por sua vez está definida no arquivo LISP001.LSP.
Observe o código fonte desta função :
(DEFUN le-arquivo (arquivo extensao / arq linha
lista dh w@ narq diretorio
mensagem
)
(SETVAR "CMDECHO" 0)
(SETQ diretorio (SUBSTR extensao 2)
narq nil
narq (FINDFILE
(STRCAT "C:\\CURSO\\" diretorio "\\" arquivo extensao)
)
)
(IF (AND narq (SETQ arq (OPEN narq "r")))
(PROGN
(WHILE (SETQ linha (READ-LINE arq))
(SETQ lista (APPEND lista (LIST linha)))
)
(CLOSE arq)
(IF (> (SETQ dh (LOAD_DIALOG "C:\\CURSO\\DCL\\CURSO.DCL")) 0)
(IF (NEW_DIALOG "curso001" dh)
(PROGN (SET_TILE
"texto"
(SETQ mensagem
(STRCAT "Arquivo C:\\CURSO\\"
diretorio
"\\"
(STRCASE arquivo)
extensao
)
)
)
(START_LIST "lista")
(MAPCAR 'ADD_LIST lista)
(END_LIST)
(SET_TILE "lista" "18")
(ACTION_TILE "accept" "(DONE_DIALOG 2)")
(ACTION_TILE "cancel" "(DONE_DIALOG 0)")
(ACTION_TILE "abrir" "(DONE_DIALOG 1)")
(ACTION_TILE
"help"
"(ALERT (STRCAT \"Este é o \" mensagem))"
)
(SETQ w@ (START_DIALOG))
(UNLOAD_DIALOG dh)
(COND ((= w@ 0) (PRINC "\n-> Encerrado..."))
((= w@ 2) (PRINC "\n-> Ok, saindo da rotina..."))
((= w@ 1)
((STARTAPP
(STRCAT "NOTEPAD.EXE"
" C:\\CURSO\\"
diretorio
"\\"
arquivo
extensao
)
)
)
)
)
nil
)
(ALERT "Arquivo DCL não pôde ser carregado...")
)
)
(ALERT (STRCAT "C:\\CURSO\\"
diretorio
"\\"
(STRCASE arquivo)
(STRCASE extensao)
" não encontrado!"
)
)
)
(PRINC )
)
e aqui, como esta única função é usada para criar comandos diversos,
com um único trabalho...
(DEFUN c:sintaxe () (le-arquivo "SINTAXE" ".TXT") (PRINC ))
(DEFUN c:cur-intro () (le-arquivo "INTRO" ".TXT") (PRINC ))
(DEFUN c:funcoes () (le-arquivo "FUNCOES" ".TXT") (PRINC ))
(DEFUN c:ASSOCiacao () (le-arquivo "DXF" ".TXT") (PRINC ))
(DEFUN c:estrutura () (le-arquivo "ESTRUT" ".TXT") (PRINC ))
(DEFUN c:lisp001 () (le-arquivo "LISP001" ".LSP") (PRINC ))
(DEFUN c:SETVARs () (le-arquivo "SETVAR" ".TXT") (PRINC ))
(DEFUN c:dcls () (le-arquivo "CURSO" ".DCL") (PRINC ))
(DEFUN c:compdcls () (le-arquivo "COMPDCL" ".DCL") (PRINC ))
(DEFUN c:listas () (le-arquivo "LISTAS" ".TXT") (PRINC ))
(DEFUN c:cur-aju () (le-arquivo "CUR-AJU" ".TXT") (PRINC ))
(DEFUN c:forb () (le-arquivo "FORB" ".TXT") (PRINC ))
(DEFUN c:slides () (le-arquivo "SLIDES" ".LSP") (PRINC ))
(DEFUN c:global () (le-arquivo "GLOBAL" ".LSP") (PRINC ))
fim de comentários
|;
;;-------------------------------------------------------------------------- ARQUIVO 09
;; Curso E.Fernal de AutoLISP
;; efernal@gmail.com
;; http://www.gr-acad.com.br
;; NÃO ALTERE ESTE ARQUIVO OU A ROTINA PODERÁ NÃO FUNCIONAR ADEQUADAMENTE...
;; início da rotina
;;---------------------------------------------------------------------------
(DEFUN c:comenta ()
(ALERT
;|
este trecho é um comentário desde a palavra
'este' e encerrando-se na palavra
'término'
|;
"Neste comando existe um comentário INLINE"
)
);| INICIO DE COMENTARIOS 1
Estas rotinas fazem parte do curso E.Fernal de AutoLISP
http://www.gr-acad.com.br
Demonstraremos como inserir slides em uma imagem de um quadro de diálogo,
através do comando 'SLIDES1'
Após Ok, digite SLIDES1 e tecle Enter para conferir...
A rotina utiliza um arquivo .DCL, que é C:\\CURSO\DCL\SLIDES.DCL, cujo
conteudo são as linhas abaixo, até a marca 'EOF'
slides : dialog { label = "Curso E.Fernal de AutoLISP";
:text{label="Como inserir slides";alignment=centered;key="tx1";}
:row{
:column{
:image_button{key="i1";width=16;aspect_ratio=0.66;color=0;}
:image_button{key="i4";width=16;aspect_ratio=0.66;color=0;}
:image_button{key="i7";width=16;aspect_ratio=0.66;color=0;}}
:column{
:image_button{key="i2";width=16;aspect_ratio=0.66;color=0;}
:image_button{key="i5";width=16;aspect_ratio=0.66;color=0;}
:image_button{key="i8";width=16;aspect_ratio=0.66;color=0;}}
:column{
:image_button{key="i3";width=16;aspect_ratio=0.66;color=0;}
:image_button{key="i6";width=16;aspect_ratio=0.66;color=0;}
:image_button{key="i9";width=16;aspect_ratio=0.66;color=0;}}
}
spacer_1;
:row{
:toggle{key="to1";label="moldura";}
ok_cancel_help;
}}
'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 função abaixo é um exemplo de uma função 'call-back', que será executada ao
;;--se clicar em um elemento do quadro de diálogo, no caso o TOGGLE "to1"
(DEFUN moldura (value / color)
(IF (= value "1")
(SET_TILE
"tx1"
"moldura em resposta à função '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 FUNÇÃO 'call-back' QUE SERÁ EXECUTADA AO SE CLICAR NO toggle
;;--Inicio da função '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 então utilizar uma função 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 não pôde ser carregado..."
)
)
(PRINC )
)
;;-------------------------------------------------------------------------- ARQUIVO 10
;; Curso E.Fernal de AutoLISP
;; efernal@gmail.com
;; http://www.gr-acad.com.br
;; NÃO ALTERE ESTE ARQUIVO OU A ROTINA PODERÁ NÃO FUNCIONAR ADEQUADAMENTE...
;; início da rotina
;;---------------------------------------------------------------------------
(DEFUN c:slides2 (/ 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 usuário pressionar o botão "Help"
;;ou o botão "Ok"
;;
;; A função abaixo será disparada toda vez que o usuário 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 função abaixo será executada toda vez que o usuário clicar um item
;; na lista de blocos disponíveis...
(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 função abaixo será disparada se o usuário clicar no botão "Ok"
(DEFUN executiva-aqui (/ p1)
(IF bloco-a-inserir
(IF (SETQ
p1 (GETPOINT "\n-> Selecione ponto de inserção 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"
"\nexpressões 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 função (ENTMAKE '((0 . \"INSERT\")....))"
"\nO comandos SLIDES3 é uma réplica deste, inserindo blocos...")
)
(ALERT "Ponto de inserção não foi fornecido...")
)
(ALERT "Bloco não 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
; minúsculas e maísculas
(PROGN ;; Criamos uma lista com o nome dos blocos disponíveis
(SETQ lista '("Bloco1" "Bloco2" "Bloco3"
"Bloco4" "Bloco5" "Bloco6"
"Bloco7" "Bloco8" "Bloco9"
"Bloco10"
)
)
;; Inserimos esta lista no campo 'list_box' do quadro de diálogo
(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 diálogo.
(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 diálogo é retirado
; da tela
(UNLOAD_DIALOG dh)
;;e aqui, o arquivo DCL é eliminado da memória
(COND ((= w@ 0) (PRINC "\n-> Cancelado..."))
;; Aqui o usuário apertou "Cancel"
((= w@ 1) (executiva-aqui))
;; Aqui o usuário apertou "Ok"
)
)
nil
)
(ALERT
"Arquivo C:\\CURSO\\DCL\\SLIDES2.DCL não pôde ser carregado..."
)
)
(PRINC )
)
;;-------------------------------------------------------------------------- ARQUIVO 11
;; Curso E.Fernal de AutoLISP
;; efernal@gmail.com
;; http://www.gr-acad.com.br
;; NÃO ALTERE ESTE ARQUIVO OU A ROTINA PODERÁ NÃO FUNCIONAR ADEQUADAMENTE...
;; início 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)
;;------------------------------------- Início de COMENTÁRIOS 0
;; Abaixo definimos uma função de erro, para o caso do usuário,
;; no meio da rotina, clicar'ESC' ou 'CTRL + C'. Assim, prevenimos
;; o trace do AutoLISP, bem como restauramos as variáveis modificadas
;; por necessidade da rotina, e ainda descarregamos o arquivo .DCL
;; da memória...
;;
;; Lembrar que *error* é uma função do AutoLISP que pode ser redefinida...
;;
;;------------------------------------- Fim de COMENTÁRIOS 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
)
;;------------------------------------- Início de COMENTÁRIOS 1
;; A função 'dcl-da-string' lança o quadro de diálogo para inserção
;; do texto a ser escrito. Este é armazenado na variável 'STRING',
;; e é retornado por esta função.
;;------------------------------------- Fim de COMENTÁRIOS 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 não pôde ser escrito..."
)
)
string
)
;;------------------------------------- Início de COMENTÁRIOS 2
;;
;; o trecho ABAIXO localiza o diretório SUPPORT do AutoCAD© e
;; armazena seu path na variável 'path'.
;; Caso o arquivo DCL 'DCL-TXT1.DCL' não exista neste diretório,
;; ele será escrito. Este é um MODO DE GARANTIR a existência 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 NÃO EXISTIA, AGORA EXISTE...
(SETQ path nil
dh nil
dh (LOAD_DIALOG "DCL-TXT1.DCL")
; agora carregamos o arquivo DCL para a memória
)
;;-------------------------------------- Inicializamos a altura_da_fonte, se
;;-------------------------------------- esta variável ainda não existir....
;;-------------------------------------- Ela será o valor por DEFAULT
(IF ((NOT altura_da_fonte)
(SETQ altura_da_fonte 12.5)
)
;;-------------------------------------- Fim da inicialização
;;--------------- Aqui pedimos a altura para os textos.
;;--------------- Caso o usuário tecle enter sem entrar com
;;--------------- um valor válido, 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 não houver 'altura'...
(= altura 0.0) ;Ou se ela for zero
(MINUSP altura) ;Ou ainda se for um número negativo...
)
(SETQ altura altura_da_fonte) ;Então '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' não existir, será criada...
(IF (NULL (TBLSEARCH "LAYER" "TEXTOS-MAPAS"))
(COMMAND "_.LAYER" "M" "TEXTOS-MAPAS" "S" oldlay "")
)
;;----------------------------------------------------------------------------------
;;--------------------------- Se o estilo 'VERDANA' não 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 possível '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 intermédio de um quadro de diálogo e
;;o escreverá. Se o texto for vazio, isto é, um string "", ele não será escrito.
![]()
;;----------------------------------------------------------------------------------
(WHILE (SETQ p1 (GETPOINT "\n-> Primeiro ponto referencial : "))
(IF (SETQ p2 (GETPOINT p1 "\n-> Segundo ponto referencial : "))
(PROGN (SETQ ;;------------------ Localizamos o ponto médio 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 é válido?
(IF (AND string (> (STRLEN string) 0))
;;---------------- Sim, é válido...
;;---------------- Usamos 'COMMAND' para escrever o texto...
(IF (= afonte 0.0)
;;----------------- O estilo tem altura 0.0, então 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, então esta
;;----------------- prevalecerá para o texto...
(COMMAND "_.TEXT"
"MC"
"_NON"
pmedio
(* 180.0 (/ ang PI))
string
"_.CHPROP"
(ENTLAST)
""
"LA"
"TEXTOS-MAPAS"
""
)
)
;;--------------------- Não, o string é inválido.
;;--------------------- Então retornamos 'NIL'
nil
)
)
(ALERT "P2 não fornecido, recomeçando...")
; P2 inexistente, volta ao 'WHILE'
)
;;----------------------- Não forneceu P1, então 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 memória...
(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@gmail.com
;; http://www.gr-acad.com.br
;; NÃO ALTERE ESTE ARQUIVO OU A ROTINA PODERÁ NÃO FUNCIONAR ADEQUADAMENTE...
;; início da rotina
;;---------------------------------------------------------------------------
;;
;;*****************************************************************************;;
;|
Obs.:
Esta rotina é uma réplica do arquivo c:\curso\dup\slides2.lsp,
tendo sido alterada a função '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 usuário pressionar o botão "Help"
;;ou o botão "Ok"
;;
;; A função abaixo será disparada toda vez que o usuário 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 função abaixo será executada toda vez que o usuário clicar um item
;; na lista de blocos disponíveis...
(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 função abaixo será disparada se o usuário clicar no botão "Ok"
(DEFUN executiva-aqui (/ p1)
(IF bloco-a-inserir
(IF (SETQ
p1 (GETPOINT "\n-> Selecione ponto de inserção 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"
"\nexpressões 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 função (ENTMAKE '((0 . \"INSERT\")....))"
"\nO comandos SLIDES3 é uma réplica 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 não está presente no desenho e não foi encontrado em C:\\CURSO\\DWG\\"
)
)
)
;; fim do trecho que entrou...
(ALERT "Ponto de inserção não foi fornecido...")
)
(ALERT "Bloco não 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
; minúsculas e maísculas
(PROGN ;; Criamos uma lista com o nome dos blocos disponíveis
(SETQ lista '("Bloco1" "Bloco2" "Bloco3"
"Bloco4" "Bloco5" "Bloco6"
"Bloco7" "Bloco8" "Bloco9"
"Bloco10"
)
)
;; Inserimos esta lista no campo 'list_box' do quadro de diálogo
(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 diálogo.
(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 diálogo é retirado
; da tela
(UNLOAD_DIALOG dh)
;;e aqui, o arquivo DCL é eliminado da memória
(COND ((= w@ 0) (PRINC "\n-> Cancelado..."))
;; Aqui o usuário apertou "Cancel"
((= w@ 1) (executiva-aqui))
;; Aqui o usuário apertou "Ok"
)
)
nil
)
(ALERT
"Arquivo C:\\CURSO\\DCL\\SLIDES2.DCL não pôde ser carregado..."
)
)
(PRINC )
)
|
A linguagem DCL |
Exemplos de listas |
Anterior |
Home |