Você está na página 1de 18

CFAC: AutoLISP (III) - Funções de repetição e FEUP/DEMEGI-SDI

condicionais, Obter e converter informação

AutoLISP - III
Funções de repetição e condicionais,
Obter e converter informação

João Manuel R. S.
Tavares

Função condicional - if
Figura A: If A<0 executa a função prog1.
(if (< A 0)
(prog1)
) S S
Figura B: If A<0 executa as
N N
funções prog1 e prog2.
(if (< A 0)
(progn
(prog1)
(prog2)
)
) CFAC: AutoLISP (III) - Funções de repetição e
2 @2001 João Tavares condicionais, Obter e converter informação

João Manuel R. S. Tavares 1


CFAC: AutoLISP (III) - Funções de repetição e FEUP/DEMEGI-SDI
condicionais, Obter e converter informação

Função condicional - if

Figura C: If A<0 executa a função


prog1, senão executa a função prog2.
S N

(if (< A 0)
(prog1)
(prog2)
)

CFAC: AutoLISP (III) - Funções de repetição e


3 @2001 João Tavares condicionais, Obter e converter informação

Função condicional - if
Figura D: If A<0 executa as funções prog1 e prog2, senão executa
as funções prog3 e prog4.
(if (< A 0)
(progn S N
(prog1)
(prog2)
)
(progn
(prog3)
(prog4)
)
)

CFAC: AutoLISP (III) - Funções de repetição e


4 @2001 João Tavares condicionais, Obter e converter informação

João Manuel R. S. Tavares 2


CFAC: AutoLISP (III) - Funções de repetição e FEUP/DEMEGI-SDI
condicionais, Obter e converter informação

Função condicional - if

z Ifs sequenciais com condicionais de igualdade (Figura E)


são melhor codificados pelo comando cond (Figura F).

N
S
N
S

CFAC: AutoLISP (III) - Funções de repetição e


5 @2001 João Tavares condicionais, Obter e converter informação

Função condicional - if

Figura E: If A=1 executa a função prog1, senão If A=2 executa a


função prog2, senão executa a função prog3.

;; primeira opção - ifs encadeados N


;; S
(if (= A 1) N
(prog1) S
(if (= A 2)
(prog2)
(prog3)
)
)
CFAC: AutoLISP (III) - Funções de repetição e
6 @2001 João Tavares condicionais, Obter e converter informação

João Manuel R. S. Tavares 3


CFAC: AutoLISP (III) - Funções de repetição e FEUP/DEMEGI-SDI
condicionais, Obter e converter informação

Função condicional - if

;; segunda opção - ifs sequenciais


;;
(if (= A 1)
(prog1)
)
(if (= A 2)
(prog2)
)
(if (= A 3)
(prog3)
)
CFAC: AutoLISP (III) - Funções de repetição e
7 @2001 João Tavares condicionais, Obter e converter informação

Função condicional - if

z Figura F: Caso A=1 execute a função prog1, caso A=2


execute a função prog2, caso A=3 execute a função
prog3.

(cond
(= A 1) (prog1)
(= A 2) (prog2)
(= A 3) (prog3)
)

CFAC: AutoLISP (III) - Funções de repetição e


8 @2001 João Tavares condicionais, Obter e converter informação

João Manuel R. S. Tavares 4


CFAC: AutoLISP (III) - Funções de repetição e FEUP/DEMEGI-SDI
condicionais, Obter e converter informação

Operadores de comparação

z = (igual)
(if (= A B C) (rotina))

z /= (diferente)
(if (/= A B) (rotina))

z < (menor)
(if (< A B) (rotina))

z <= (menor ou igual)


(if (<= A B) (rotina))

CFAC: AutoLISP (III) - Funções de repetição e


9 @2001 João Tavares condicionais, Obter e converter informação

Operadores de comparação

z > (maior)
(if (> A B) (rotina))

z >= (maior ou igual)


(if (>= A B) (rotina))

z eq (idêntico)
(if (eq A B) (rotina))

z equal (resultar em =)
(if (equal A B) (rotina))
CFAC: AutoLISP (III) - Funções de repetição e
10 @2001 João Tavares condicionais, Obter e converter informação

João Manuel R. S. Tavares 5


CFAC: AutoLISP (III) - Funções de repetição e FEUP/DEMEGI-SDI
condicionais, Obter e converter informação

Diferença entre =, eq e equal

z (= A B ) retorna verdadeiro se os argumentos forem


iguais.
z (eq A B) retorna verdadeiro se os argumentos são
derivados um do outro, por exemplo:
(setq f1 '(a b c))
(setq f2 '(a b c))
(setq f3 f2)
(eq f3 f2) ;retorna T (true) pois f3 é derivado de f2
(eq f1 f3) ;retorna nil pois f3 não é derivado de f1
(= f1 f2) ;retorna nil (falso)
CFAC: AutoLISP (III) - Funções de repetição e
11 @2001 João Tavares condicionais, Obter e converter informação

Diferença entre =, eq e equal

z (equal A B) retorna verdadeiro se os


argumentos resultarem em valores iguais, por
exemplo:

(equal f1 f2) ;retorna T


(equal f1 f3) ;retorna T

CFAC: AutoLISP (III) - Funções de repetição e


12 @2001 João Tavares condicionais, Obter e converter informação

João Manuel R. S. Tavares 6


CFAC: AutoLISP (III) - Funções de repetição e FEUP/DEMEGI-SDI
condicionais, Obter e converter informação

Operadores lógicos
z and (e lógico)
– Command: (setq a 103 b nil c "string") ;retorno: "string"
– Command: (and 1.4 a c) ;retorno: T
– Command: (and 1.4 a b c) ;retorno: nil
z or (ou lógico)
– Command: (or nil 45 '()) ;retorno: T
– Command: (or nil '()) ;retorno: nil
z not (negação)
– Command: (setq a 123 b "string" c nil) ;retorno: nil
– Command: (not a) ;retorno: nil
– Command: (not b) ;retorno: nil
– Command: (not c) ;retorno: T
– Command: (not '()) ;retorno: T
CFAC: AutoLISP (III) - Funções de repetição e
13 @2001 João Tavares condicionais, Obter e converter informação

Funções de repetição - while e repeat

z Utilizar while quando se deseja executar um conjunto de


expressões enquanto uma condição for satisfeita.
z Utilizar repeat quando se deseja executar um conjunto de
expressões N vezes.

S S
N N

CFAC: AutoLISP (III) - Funções de repetição e


14 @2001 João Tavares condicionais, Obter e converter informação

João Manuel R. S. Tavares 7


CFAC: AutoLISP (III) - Funções de repetição e FEUP/DEMEGI-SDI
condicionais, Obter e converter informação

Funções de repetição - while e repeat

Figura G: Enquanto RESP=S execute


a função prog1.

(setq RESP "S")


(while (= RESP "S")
(prog1)
(initget "S N") (prompt "\nDeseja S
continuar? (S/N) ")
(setq RESP (getkword)) N
)

CFAC: AutoLISP (III) - Funções de repetição e


15 @2001 João Tavares condicionais, Obter e converter informação

Funções de repetição - while e repeat

Figura H: Repita Num vezes as


funções prog1 e prog2.

(setq NUM 10)


(repeat NUM
(prog1)
S
(prog2)
) N

CFAC: AutoLISP (III) - Funções de repetição e


16 @2001 João Tavares condicionais, Obter e converter informação

João Manuel R. S. Tavares 8


CFAC: AutoLISP (III) - Funções de repetição e FEUP/DEMEGI-SDI
condicionais, Obter e converter informação

Exemplo - função com if e while:


;;;abertura condicionada de arquivo
(defun c:cc (/ CODIGO FOLHA NOME ARQ)
(initget "A0 A1 A2 A3 A4") (prompt "\nQual o formato da folha? ")
(setq FOLHA (getkword "Folha [A0, A1, A2, A3 ou A4]: ")
(setq CODIGO " ")
(while (/= (strlen CODIGO) 6)
(prompt "\nO codigo do desenho deve ter apenas 6 digitos. ")
(setq CODIGO (getstring "Insira o codigo: "))
)
(setq NOME (strcat "c:\\" FOLHA "\\" CODIGO ".DWG"))
(setq ARQ (findfile NOME))
(if (/= ARQ nil)
(command "OPEN" ARQ)
(alert (strcat "O arquivo " (strcase NOME) "\nnao foi encontrado."))
)
) CFAC: AutoLISP (III) - Funções de repetição e
17 @2001 João Tavares condicionais, Obter e converter informação

Obter dados

z As rotinas escritas em AutoLisp podem interagir com o


utilizador e o sistema. Portanto, são necessárias funções
para obter informação:
– getangle, getcorner, getdist, getenv, getfiled, getint, getkword,
getorient, getpoint, getreal, getstring, getvar

z Na interacção com o utilizador deve-se utilizar prompts


(mensagens com pedido de inserção de dados) claros e
realizar testes de consistência sobre os dados obtidos.
– A função initget restringe os dados de entrada.

CFAC: AutoLISP (III) - Funções de repetição e


18 @2001 João Tavares condicionais, Obter e converter informação

João Manuel R. S. Tavares 9


CFAC: AutoLISP (III) - Funções de repetição e FEUP/DEMEGI-SDI
condicionais, Obter e converter informação

Funções getreal, getint e getstring

z getreal – para um valor real


(setq NUM (getreal "Digite a escala: "))

z getint – para um valor inteiro


(setq QTD (getint "Digite numero de itens: "))

z getstring – para um conjunto de caracteres


– texto sem espaços:
(setq ARQ (getstring "Digite nome do arquivo: "))
– texto com espaços:
(setq TIT (getstring T "Insira titulo do projeto: "))

CFAC: AutoLISP (III) - Funções de repetição e


19 @2001 João Tavares condicionais, Obter e converter informação

Funções getpoint, getcorner e getdist

z getpoint – para um ponto


(setq PT1 (getpoint "Clique no primeiro ponto: "))
(setq PT2 (getpoint PT1 "\nClique no segundo ponto: "))

z getcorner – para um vértice


(setq PONTO1 (getpoint "Clique no primeiro canto: "))
(setq PONTO2 (getcorner PONTO1 "Outro canto: "))
Apresenta um rectângulo fantasma no ecrã (como na função
select object do autoCAD).

CFAC: AutoLISP (III) - Funções de repetição e


20 @2001 João Tavares condicionais, Obter e converter informação

João Manuel R. S. Tavares 10


CFAC: AutoLISP (III) - Funções de repetição e FEUP/DEMEGI-SDI
condicionais, Obter e converter informação

Funções getpoint, getcorner e getdist

z getdist – para uma distância


(setq DST (getdist "Insira distancia: "))
Digitar distância ou clicar dois pontos.

(setq DST (getdist PT1 "Insira segundo ponto: "))


Deve-se clicar um ponto e a distância entre esse
ponto e pt1 será calculada.

CFAC: AutoLISP (III) - Funções de repetição e


21 @2001 João Tavares condicionais, Obter e converter informação

Funções getangle e getorient

z getangle – para um ângulo em radianos


(setq ANG (getangle "Angulo de rotação: "))
Pode-se digitar um ângulo em radianos ou pode-se clicar
dois pontos. No segundo caso, o ângulo obtido será o ângulo
que a recta do primeiro para o segundo ponto faz com uma
recta imaginária saindo do primeiro ponto no sentido positivo
de x do UCS activo (obs. recta imaginária ajustada pela
variável de sistema ANGBASE).

(setq ANG (getangle PT1 "Angulo de rotação: "))


Deve-se clicar um ponto e o ângulo será calculado como no
segundo caso do exemplo anterior.
CFAC: AutoLISP (III) - Funções de repetição e
22 @2001 João Tavares condicionais, Obter e converter informação

João Manuel R. S. Tavares 11


CFAC: AutoLISP (III) - Funções de repetição e FEUP/DEMEGI-SDI
condicionais, Obter e converter informação

Funções getangle e getorient

z getorient – para um ângulo de orientação


(setq ANG (getorient "Angulo de rotação: "))
Similar a getangle, excepto pelo facto de ignorar a
direcção do ângulo zero (direcção da recta
imaginária) contida na variável ANGBASE.
Considera zero graus sempre na direcção leste
(direita).

CFAC: AutoLISP (III) - Funções de repetição e


23 @2001 João Tavares condicionais, Obter e converter informação

Funções getkword e initget

z A função getkword obtém uma string (nula no caso de


carregar-se apenas na tecla Enter).
z Para restringir a entrada de dados a valores específicos,
esta função deve ser precedida da função initget.

z Exemplos:

(initget "A B C") (setq OPC (getkword "\nOpcao (A, B ou C)? "))
Se algo diferente de A, B ou C for digitado, a mensagem
“INVALID OPTION KEYWORD” será apresentada e o programa
pausa para nova inserção de dado.
CFAC: AutoLISP (III) - Funções de repetição e
24 @2001 João Tavares condicionais, Obter e converter informação

João Manuel R. S. Tavares 12


CFAC: AutoLISP (III) - Funções de repetição e FEUP/DEMEGI-SDI
condicionais, Obter e converter informação

Funções getkword e initget

(initget "Y N")


(prompt "\nContinue? (Y/N) ")
(setq R (getkword))

Neste exemplo como getkword não inclui prompt,


além da mensagem “INVALID OPTION
KEYWORD”, será apresentada, no caso de
digitação incorrecta, a mensagem “TRY AGAIN:”

CFAC: AutoLISP (III) - Funções de repetição e


25 @2001 João Tavares condicionais, Obter e converter informação

Função initget em detalhe

z Sintaxe: (initget [bits] [string])


–onde bits pode ser:
z1 (não aceita apenas um enter);
z2 (não aceita zero);
z4 (não aceita valor negativo);
z8 (aceita ponto fora do drawing limits);
z...

–exemplos de strings:
z"S N s n"
z"Sim Não"
z"Aprovado Reprovado Exame"

CFAC: AutoLISP (III) - Funções de repetição e


26 @2001 João Tavares condicionais, Obter e converter informação

João Manuel R. S. Tavares 13


CFAC: AutoLISP (III) - Funções de repetição e FEUP/DEMEGI-SDI
condicionais, Obter e converter informação

Função initget em detalhe

z Exemplos:

(initget 2) - não aceita zero


(initget (+ 1 2 4)) - não aceita enter, zero ou valor
negativo
(initget 7) - equivalente ao exemplo anterior
(initget 1 "S N") - não aceita enter e tem que ser S ou N

CFAC: AutoLISP (III) - Funções de repetição e


27 @2001 João Tavares condicionais, Obter e converter informação

Funções getvar/setvar e getenv

z getvar
Obtém o valor de uma variável do sistema (do AutoCAD).
(setq LAYERATIVA (getvar "clayer"))
z setvar
Altera o valor de uma variável do sistema.
(setvar "clayer" "2D-PAR")
z getenv
Obtém o valor de uma variável do sistema operativo.
(getenv "path")

CFAC: AutoLISP (III) - Funções de repetição e


28 @2001 João Tavares condicionais, Obter e converter informação

João Manuel R. S. Tavares 14


CFAC: AutoLISP (III) - Funções de repetição e FEUP/DEMEGI-SDI
condicionais, Obter e converter informação

Converter dados

z Determinadas funções manipulam dados de um


tipo específico.
z Nem sempre o dado em causa é do tipo exigido
pela função que o manipulará.

z Assim, são necessárias funções de conversão


entre tipos de dados.

CFAC: AutoLISP (III) - Funções de repetição e


29 @2001 João Tavares condicionais, Obter e converter informação

Funções de conversão

z float - inteiro para real


z atoi - string para inteiro
z itoa - inteiro para string
z atof - string para real
z rtos - real para string
z angtos - radianos para string
z angtof - radianos para real
z ascii - caracter para código na tabela ASCII
z chr - código na tabela ASCII para caracter
CFAC: AutoLISP (III) - Funções de repetição e
30 @2001 João Tavares condicionais, Obter e converter informação

João Manuel R. S. Tavares 15


CFAC: AutoLISP (III) - Funções de repetição e FEUP/DEMEGI-SDI
condicionais, Obter e converter informação

Funções de conversão

z fix - realiza a truncagem de um número real para o inteiro


mais próximo

z A divisão (/ real int) resulta em real.

z A divisão (/ int int) resulta em int (casas decimais


eliminadas).

CFAC: AutoLISP (III) - Funções de repetição e


31 @2001 João Tavares condicionais, Obter e converter informação

Exemplo - função com repeat, “gets” e


conversões

;;; array inclinado de um objecto seleccionado


(defun c:arrayincli (/ INICIO FIM INTERVALO DISTANCIA ALPHA NUMREP)
(setq INICIO (getpoint "Clique no ponto inicial: "))
(setq FIM (getpoint INICIO "Clique no ponto final: "))
(setq INTERVALO (getdist "Digite distancia entre copias: "))
(setq DISTANCIA (distance INICIO FIM))
(setq ALPHA (angle INICIO FIM))
(setq NUMREP (fix (/ DISTANCIA INTERVALO)))
(command "copy" pause "" "0,0" (strcat "@" (rtos INTERVALO) "<" (angtos
ALPHA 0 4)))
(repeat (- NUMREP 1)
(command "copy" "last" "" "0,0" (strcat "@" (rtos INTERVALO) "<" (angtos
ALPHA 0 4)))
)
)
CFAC: AutoLISP (III) - Funções de repetição e
32 @2001 João Tavares condicionais, Obter e converter informação

João Manuel R. S. Tavares 16


CFAC: AutoLISP (III) - Funções de repetição e FEUP/DEMEGI-SDI
condicionais, Obter e converter informação

Exemplo - função com repeat, “gets” e


conversões: Utilização

CFAC: AutoLISP (III) - Funções de repetição e


33 @2001 João Tavares condicionais, Obter e converter informação

Funções de impressão
z princ:
– Imprime uma expressão na linha de comando ou num arquivo aberto.
– Se a expressão contém caracteres de controle (como \\, \", \e, \n, \t ....)
estes são interpretados e executados; isto é: \n equivale a uma nova
linha.
z prin1:
– Igual a função princ excepto que caracteres de controle não são
interpretados e sim impressos literalmente.
z print:
– Igual a função princ excepto que imprime sempre a expressão numa
nova linha e com um espaço a seguir ao que foi impresso.
z prompt:
– Semelhante a princ, no entanto em configurações de dois ecrãs a
informação é escrita em ambos os ecrãs do AutoCAD.
CFAC: AutoLISP (III) - Funções de repetição e
34 @2001 João Tavares condicionais, Obter e converter informação

João Manuel R. S. Tavares 17


CFAC: AutoLISP (III) - Funções de repetição e FEUP/DEMEGI-SDI
condicionais, Obter e converter informação

Função princ - sintaxe e exemplos

Sintaxe:
(princ [expressão [nome-de-arquivo]])

Exemplos:
(setq A 123 B ´(A))
(princ 'A) ;imprime A e retorna A
(princ A) ;imprime 123 e retorna 123
(princ B) ;imprime (A) e retorna (A)
(princ "\nOla") ;imprime "Ola" numa nova linha e retorna
;"Ola"
(princ "Ola" f) ;imprime "Ola" no arquivo f e retorna "Ola"

CFAC: AutoLISP (III) - Funções de repetição e


35 @2001 João Tavares condicionais, Obter e converter informação

João Manuel R. S. Tavares 18

Você também pode gostar