Você está na página 1de 18

CFAC: AutoLISP (III) - Funções de repetição e 2009@FEUP/DEMec-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


Joaquim Oliveira Fonseca

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
funções prog1 e prog2. N N

(if (< A 0)
(progn ; abre o se
(prog1)
(prog2)
)
) CFAC: AutoLISP (III) - Funções de repetição e
2 2009@JST/JOF condicionais, Obter e converter informação

JST/JOF 1
CFAC: AutoLISP (III) - Funções de repetição e 2009@FEUP/DEMec-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 2009@JST/JOF 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) S N
(progn ; abre o se
(prog1)
(prog2)
)
(progn ; abre o senão
(prog3)
(prog4)
)
)
CFAC: AutoLISP (III) - Funções de repetição e
4 2009@JST/JOF condicionais, Obter e converter informação

JST/JOF 2
CFAC: AutoLISP (III) - Funções de repetição e 2009@FEUP/DEMec-SDI
condicionais, Obter e converter informação

Função condicional - if

 If sequenciais com condicionais de igualdade (Figura E)


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

A = 1; 2; 3.
N
S
N
S

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


5 2009@JST/JOF 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 - if encadeados N


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

JST/JOF 3
CFAC: AutoLISP (III) - Funções de repetição e 2009@FEUP/DEMec-SDI
condicionais, Obter e converter informação

Função condicional - if

;; segunda opção - if sequenciais


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

Função condicional - if

 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 2009@JST/JOF condicionais, Obter e converter informação

JST/JOF 4
CFAC: AutoLISP (III) - Funções de repetição e 2009@FEUP/DEMec-SDI
condicionais, Obter e converter informação

Operadores de comparação

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

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

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

 <= (menor ou igual)


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

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


9 2009@JST/JOF condicionais, Obter e converter informação

Operadores de comparação

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

 >= (maior ou igual)


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

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

 equal (resultar em =)
(if (equal A B) (rotina))
CFAC: AutoLISP (III) - Funções de repetição e
10 2009@JST/JOF condicionais, Obter e converter informação

JST/JOF 5
CFAC: AutoLISP (III) - Funções de repetição e 2009@FEUP/DEMec-SDI
condicionais, Obter e converter informação

Diferença entre =, eq e equal

 (= A B ) retorna verdadeiro se os argumentos forem iguais.


 (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 (falso) pois f3 não é derivado de f1
(= f1 f2) ;retorna nil (falso)
(= f1 f3) ;retorna nil (falso)
CFAC: AutoLISP (III) - Funções de repetição e
11 2009@JST/JOF condicionais, Obter e converter informação

Diferença entre =, eq e equal

 (equal A B) retorna verdadeiro se os


argumentos resultarem em valores iguais, por
exemplo:

(equal f1 f2) ; retorna T (true)


(equal f1 f3) ; retorna T (true)

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


12 2009@JST/JOF condicionais, Obter e converter informação

JST/JOF 6
CFAC: AutoLISP (III) - Funções de repetição e 2009@FEUP/DEMec-SDI
condicionais, Obter e converter informação

Operadores lógicos
 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
 or (ou lógico)
– Command: (or nil 45 '()) ;retorno: T
– Command: (or nil '()) ;retorno: nil
 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 2009@JST/JOF condicionais, Obter e converter informação

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

 Utilizar while quando se deseja executar (repetir) um con-


junto de expressões enquanto uma condição for satisfeita.
 Utilizar repeat quando se deseja executar (repetir) um con-
junto de expressões N vezes.

S S
N N

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


14 2009@JST/JOF condicionais, Obter e converter informação

JST/JOF 7
CFAC: AutoLISP (III) - Funções de repetição e 2009@FEUP/DEMec-SDI
condicionais, Obter e converter informação

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

Figura G: Enquanto RESP=S executar


a função prog1.

(setq RESP "S")


(while (= RESP "S")
(prog1)
(initget "S N") S
(prompt "\nDeseja continuar? (S/N) ")
(setq RESP (getkword)) N
)
CFAC: AutoLISP (III) - Funções de repetição e
15 2009@JST/JOF condicionais, Obter e converter informação

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

Figura H: Repete 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 2009@JST/JOF condicionais, Obter e converter informação

JST/JOF 8
CFAC: AutoLISP (III) - Funções de repetição e 2009@FEUP/DEMec-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 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 2009@JST/JOF condicionais, Obter e converter informação

Obter dados

 As rotinas escritas em AutoLisp podem interagir com o


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

 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 da função de
entrada seguinte.
CFAC: AutoLISP (III) - Funções de repetição e
18 2009@JST/JOF condicionais, Obter e converter informação

JST/JOF 9
CFAC: AutoLISP (III) - Funções de repetição e 2009@FEUP/DEMec-SDI
condicionais, Obter e converter informação

Funções getreal, getint e getstring

 getreal – para um valor real


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

 getint – para um valor inteiro


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

 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 2009@JST/JOF condicionais, Obter e converter informação

Funções getpoint, getcorner e getdist

 getpoint – para um ponto


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

 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 2009@JST/JOF condicionais, Obter e converter informação

JST/JOF 10
CFAC: AutoLISP (III) - Funções de repetição e 2009@FEUP/DEMec-SDI
condicionais, Obter e converter informação

Funções getpoint, getcorner e getdist

 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 será calculada a distância
entre esse ponto e pt1.

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


21 2009@JST/JOF condicionais, Obter e converter informação

Funções getangle e getorient

 getangle – para um ângulo


(setq ANG (getangle "Angulo de rotação: "))
Pode-se digitar um ângulo na unidade corrente (grau/radiano)
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). Retorna
sempre o ângulo em radianos.

(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 utilizando o ponto pt1.
CFAC: AutoLISP (III) - Funções de repetição e
22 2009@JST/JOF condicionais, Obter e converter informação

JST/JOF 11
CFAC: AutoLISP (III) - Funções de repetição e 2009@FEUP/DEMec-SDI
condicionais, Obter e converter informação

Funções getangle e getorient

 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
(para a direita).

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


23 2009@JST/JOF condicionais, Obter e converter informação

Funções getkword e initget

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


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

 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
pára a aguardar nova inserção.
CFAC: AutoLISP (III) - Funções de repetição e
24 2009@JST/JOF condicionais, Obter e converter informação

JST/JOF 12
CFAC: AutoLISP (III) - Funções de repetição e 2009@FEUP/DEMec-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 2009@JST/JOF condicionais, Obter e converter informação

Função initget em detalhe

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


–onde bits pode ser:
1 (não aceita apenas um enter);
2 (não aceita zero);
4 (não aceita valor negativo);
8 (aceita ponto fora do drawing limits);
...

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

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


26 2009@JST/JOF condicionais, Obter e converter informação

JST/JOF 13
CFAC: AutoLISP (III) - Funções de repetição e 2009@FEUP/DEMec-SDI
condicionais, Obter e converter informação

Função initget em detalhe

 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 2009@JST/JOF condicionais, Obter e converter informação

Funções getvar/setvar e getenv

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

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


28 2009@JST/JOF condicionais, Obter e converter informação

JST/JOF 14
CFAC: AutoLISP (III) - Funções de repetição e 2009@FEUP/DEMec-SDI
condicionais, Obter e converter informação

Converter dados

 Determinadas funções manipulam dados de um


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

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


entre tipos de dados.

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


29 2009@JST/JOF condicionais, Obter e converter informação

Funções de conversão

 float - inteiro para real


 atoi - string para inteiro
 itoa - inteiro para string (ascii)
 atof - string (ascii) para real
 rtos - real para string
 angtos - radianos para string
 angtof - radianos para real
 ascii - carácter para código na tabela ASCII
 chr - código na tabela ASCII para carácter
CFAC: AutoLISP (III) - Funções de repetição e
30 2009@JST/JOF condicionais, Obter e converter informação

JST/JOF 15
CFAC: AutoLISP (III) - Funções de repetição e 2009@FEUP/DEMec-SDI
condicionais, Obter e converter informação

Funções de conversão

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


mais próximo

Notas:
– A divisão (/ real int) resulta em real
– A divisão (/ int int) resulta em int (casas decimais
eliminadas)
– (/ 40 5 2) resulta 4

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


31 2009@JST/JOF 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 2009@JST/JOF condicionais, Obter e converter informação

JST/JOF 16
CFAC: AutoLISP (III) - Funções de repetição e 2009@FEUP/DEMec-SDI
condicionais, Obter e converter informação

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


conversões: Utilização

Desenho obtido

Saída de texto dos comandos CFAC: AutoLISP (III) - Funções de repetição e


33 2009@JST/JOF condicionais, Obter e converter informação

Funções de impressão
 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; \t equivale a TAB, etc.
 prin1:
– Igual a função princ excepto que caracteres de controle não são
interpretados e sim impressos literalmente.
 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.
 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 2009@JST/JOF condicionais, Obter e converter informação

JST/JOF 17
CFAC: AutoLISP (III) - Funções de repetição e 2009@FEUP/DEMec-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 2009@JST/JOF condicionais, Obter e converter informação

JST/JOF 18

Você também pode gostar