Вы находитесь на странице: 1из 35

AutoLISP - III

Funes de repetio e condicionais,


Obter e converter informao

Joo Manuel R. S. Tavares


Joaquim Oliveira Fonseca
Funo condicional - if
Figura A: If A<0 executa a funo prog1.
(if (< A 0)
(prog1)
) S S
Figura B: If A<0 executa as
funes prog1 e prog2. N N

(if (< A 0)
(progn ; abre o se
(prog1)
(prog2)
)
) CFAC: AutoLISP (III) - Funes de repetio e
2 2011@JST/JOF condicionais, Obter e converter informao
Funo condicional - if

Figura C: If A<0 executa a funo


prog1, seno executa a funo prog2.
S N

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

CFAC: AutoLISP (III) - Funes de repetio e


3 2011@JST/JOF condicionais, Obter e converter informao
Funo condicional - if
Figura D: If A<0 executa as funes prog1 e prog2, seno executa
as funes prog3 e prog4.

(if (< A 0) S N
(progn ; abre o se
(prog1)
(prog2)
)
(progn ; abre o seno
(prog3)
(prog4)
)
)
CFAC: AutoLISP (III) - Funes de repetio e
4 2011@JST/JOF condicionais, Obter e converter informao
Funo condicional - if

If sequenciais com condicionais de igualdade (Figura E)


so melhor codificados pelo comando cond (Figura F).

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

CFAC: AutoLISP (III) - Funes de repetio e


5 2011@JST/JOF condicionais, Obter e converter informao
Funo condicional - if

Figura E: If A=1 executa a funo prog1, seno If A=2 executa a


funo prog2, seno executa a funo prog3.

;; primeira opo - if encadeados N


;; S
(if (= A 1) N
(prog1) S
(if (= A 2)
(prog2)
(prog3)
)
)
CFAC: AutoLISP (III) - Funes de repetio e
6 2011@JST/JOF condicionais, Obter e converter informao
Funo condicional - if

;; segunda opo - if sequenciais


;;
(if (= A 1)
(prog1)
)
(if (= A 2)
(prog2)
)
(if (= A 3)
(prog3)
)
CFAC: AutoLISP (III) - Funes de repetio e
7 2011@JST/JOF condicionais, Obter e converter informao
Funo condicional - if

Figura F: Caso A=1 execute a funo prog1, caso A=2


execute a funo prog2, caso A=3 execute a funo
prog3.

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

CFAC: AutoLISP (III) - Funes de repetio e


8 2011@JST/JOF condicionais, Obter e converter informao
Operadores de comparao

= (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) - Funes de repetio e


9 2011@JST/JOF condicionais, Obter e converter informao
Operadores de comparao

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

>= (maior ou igual)


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

eq (idntico)
(if (eq A B) (rotina))

equal (resultar em =)
(if (equal A B) (rotina))
CFAC: AutoLISP (III) - Funes de repetio e
10 2011@JST/JOF condicionais, Obter e converter informao
Diferena entre =, eq e equal

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


(eq A B) retorna verdadeiro se os argumentos so 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 no derivado de f1
(= f1 f2) ;retorna nil (falso)
(= f1 f3) ;retorna nil (falso)
CFAC: AutoLISP (III) - Funes de repetio e
11 2011@JST/JOF condicionais, Obter e converter informao
Diferena 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) - Funes de repetio e


12 2011@JST/JOF condicionais, Obter e converter informao
Operadores lgicos
and (e lgico)
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 lgico)
Command: (or nil 45 '()) ;retorno: T
Command: (or nil '()) ;retorno: nil
not (negao)
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) - Funes de repetio e
13 2011@JST/JOF condicionais, Obter e converter informao
Funes de repetio - while e repeat

Utilizar while quando se deseja executar (repetir) um


conjunto de expresses enquanto uma condio for satisfeita.
Utilizar repeat quando se deseja executar (repetir) um
conjunto de expresses N vezes.

S S
N N

CFAC: AutoLISP (III) - Funes de repetio e


14 2011@JST/JOF condicionais, Obter e converter informao
Funes de repetio - while e repeat

Figura G: Enquanto RESP=S executar


a funo prog1.

(setq RESP "S")


(while (= RESP "S")
(prog1)
(initget "S N") S
(prompt "\nDeseja continuar? (S/N) ")
(setq RESP (getkword)) N
)
CFAC: AutoLISP (III) - Funes de repetio e
15 2011@JST/JOF condicionais, Obter e converter informao
Funes de repetio - while e repeat

Figura H: Repete Num vezes as


funes prog1 e prog2.

(setq NUM 10)


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

CFAC: AutoLISP (III) - Funes de repetio e


16 2011@JST/JOF condicionais, Obter e converter informao
Exemplo - funo 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) - Funes de repetio e
17 2011@JST/JOF condicionais, Obter e converter informao
Obter dados

As rotinas escritas em AutoLisp podem interagir com o


utilizador e o programa de CAD. Portanto, so necessrias
funes para obter informao:
getangle, getcorner, getdist, getenv, getfiled, getint, getkword,
getorient, getpoint, getreal, getstring, getvar

Na interao com o utilizador deve-se utilizar prompts


(mensagens com pedido de insero de dados) claros e
realizar testes de consistncia sobre os dados obtidos.
A funo initget restringe os dados de entrada da funo de
entrada seguinte.
CFAC: AutoLISP (III) - Funes de repetio e
18 2011@JST/JOF condicionais, Obter e converter informao
Funes 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 espaos:
(setq ARQ (getstring "Digite nome do arquivo: "))
texto com espaos:
(setq TIT (getstring T "Insira titulo do projeto: "))

CFAC: AutoLISP (III) - Funes de repetio e


19 2011@JST/JOF condicionais, Obter e converter informao
Funes 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 vrtice


(setq PONTO1 (getpoint "Clique no primeiro canto: "))
(setq PONTO2 (getcorner PONTO1 "Outro canto: "))
Apresenta um retngulo fantasma no ecr (como na funo
select object do autoCAD).

CFAC: AutoLISP (III) - Funes de repetio e


20 2011@JST/JOF condicionais, Obter e converter informao
Funes getpoint, getcorner e getdist

getdist para uma distncia


(setq DST (getdist "Insira distancia: "))
Digitar distncia ou clicar dois pontos.

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


Deve-se clicar um ponto e ser calculada a distncia
entre esse ponto e pt1.

CFAC: AutoLISP (III) - Funes de repetio e


21 2011@JST/JOF condicionais, Obter e converter informao
Funes getangle e getorient

getangle para um ngulo


(setq ANG (getangle "Angulo de rotao: "))
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 reta do primeiro para o segundo
ponto faz com uma reta imaginria saindo do primeiro ponto
no sentido positivo de x do UCS ativo (obs. reta imaginria
ajustada pela varivel de sistema ANGBASE). Retorna
sempre o ngulo em radianos.

(setq ANG (getangle PT1 "Angulo de rotao: "))


Deve-se clicar um ponto e o ngulo ser calculado como no
segundo caso do exemplo anterior utilizando o ponto pt1.
CFAC: AutoLISP (III) - Funes de repetio e
22 2011@JST/JOF condicionais, Obter e converter informao
Funes getangle e getorient

getorient para um ngulo de orientao


(setq ANG (getorient "Angulo de rotao: "))
Similar a getangle, exceto pelo facto de ignorar a
direo do ngulo zero (direo da reta
imaginria) contida na varivel ANGBASE.
Considera zero graus sempre na direo leste
(para a direita).

CFAC: AutoLISP (III) - Funes de repetio e


23 2011@JST/JOF condicionais, Obter e converter informao
Funes getkword e initget

A funo getkword obtm uma string (nula no caso de


carregar-se apenas na tecla Enter).
Para restringir a entrada de dados a valores especficos,
esta funo deve ser precedida da funo 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
pra a aguardar nova insero.
CFAC: AutoLISP (III) - Funes de repetio e
24 2011@JST/JOF condicionais, Obter e converter informao
Funes getkword e initget

(initget "Y N")


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

Neste exemplo como getkword no inclui prompt,


alm da mensagem INVALID OPTION
KEYWORD, ser apresentada, no caso de
digitao incorreta, a mensagem TRY AGAIN:

CFAC: AutoLISP (III) - Funes de repetio e


25 2011@JST/JOF condicionais, Obter e converter informao
Funo initget em detalhe

Sintaxe: (initget [bits] [string])


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

exemplos de strings:
"S N s n"
"Sim No"
"Aprovado Reprovado Exame"

CFAC: AutoLISP (III) - Funes de repetio e


26 2011@JST/JOF condicionais, Obter e converter informao
Funo initget em detalhe

Exemplos:

(initget 2) - no aceita zero


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

CFAC: AutoLISP (III) - Funes de repetio e


27 2011@JST/JOF condicionais, Obter e converter informao
Funes getvar/setvar e getenv

getvar
Obtm o valor de uma varivel do sistema (do AutoCAD).
(setq LAYERATIVA (getvar "clayer"))
setvar
Altera o valor de uma varivel do sistema.
(setvar "clayer" "2D-PAR")
getenv
Obtm o valor de uma varivel do sistema operativo.
(getenv "path")

CFAC: AutoLISP (III) - Funes de repetio e


28 2011@JST/JOF condicionais, Obter e converter informao
Converter dados

Determinadas funes manipulam dados de um


tipo especfico.
Nem sempre o dado em causa do tipo exigido
pela funo que o manipular.

Assim, so necessrias funes de converso


entre tipos de dados.

CFAC: AutoLISP (III) - Funes de repetio e


29 2011@JST/JOF condicionais, Obter e converter informao
Funes de converso

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 - carcter para cdigo na tabela ASCII
chr - cdigo na tabela ASCII para carcter
CFAC: AutoLISP (III) - Funes de repetio e
30 2011@JST/JOF condicionais, Obter e converter informao
Funes de converso

fix - realiza a truncagem de um nmero real para o inteiro


mais prximo

Notas:
A diviso (/ real int) resulta em real
A diviso (/ int int) resulta em int (casas decimais
eliminadas)
(/ 40 5 2) resulta 4

CFAC: AutoLISP (III) - Funes de repetio e


31 2011@JST/JOF condicionais, Obter e converter informao
Exemplo - funo com repeat, gets e
converses

;;; array inclinado de um objeto selecionado


(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) - Funes de repetio e
32 2011@JST/JOF condicionais, Obter e converter informao
Exemplo - funo com repeat, gets e
converses: Utilizao

Desenho obtido

Sada de texto dos comandos CFAC: AutoLISP (III) - Funes de repetio e


33 2011@JST/JOF condicionais, Obter e converter informao
Funes de impresso
princ:
Imprime uma expresso na linha de comando ou num arquivo aberto.
Se a expresso contm caracteres de controle (como \\, \", \e, \n, \t ....)
estes so interpretados e executados; isto : \n equivale a uma nova
linha; \t equivale a TAB, etc.
prin1:
Igual a funo princ exceto que caracteres de controle no so
interpretados e sim impressos literalmente.
print:
Igual a funo princ exceto que imprime sempre a expresso numa
nova linha e com um espao a seguir ao que foi impresso.
prompt:
Semelhante a princ, no entanto em configuraes de dois ecrs a
informao escrita em ambos os ecrs do AutoCAD.
CFAC: AutoLISP (III) - Funes de repetio e
34 2011@JST/JOF condicionais, Obter e converter informao
Funo princ - sintaxe e exemplos

Sintaxe:
(princ [expresso [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) - Funes de repetio e


35 2011@JST/JOF condicionais, Obter e converter informao