iftavares/ensino/CFAC/Downloads... · 2012. 12. 28. · CFAC: AutoLISP (III) - Funções de...

18
CFAC: AutoLISP (III) - Funções de repetição e condicionais, Obter e converter informação 2009@FEUP/DEMec-SDI JST/JOF 1 AutoLISP - III Funções de repetição e condicionais, Obter e converter informação João Manuel R. S. Tavares Joaquim Oliveira Fonseca 2009@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e condicionais, Obter e converter informação 2 Função condicional - if Figura A: If A<0 executa a função prog1. (if (< A 0) (prog1) ) Figura B: If A<0 executa as funções prog1 e prog2. (if (< A 0) (progn ; abre o se (prog1) (prog2) ) ) S N S N

Transcript of iftavares/ensino/CFAC/Downloads... · 2012. 12. 28. · CFAC: AutoLISP (III) - Funções de...

Page 1: iftavares/ensino/CFAC/Downloads... · 2012. 12. 28. · CFAC: AutoLISP (III) - Funções de repetição e condicionais, Obter e converter informação 2009@FEUP/DEMec-SDI JST/JOF

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

2009@FEUP/DEMec-SDI

JST/JOF 1

AutoLISP - IIIFunções de repetição e condicionais,

Obter e converter informação

João Manuel R. S. Tavares

Joaquim Oliveira Fonseca

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação2

Função condicional - if

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

(if (< A 0)(prog1)

)

Figura B: If A<0 executa asfunções prog1 e prog2.

(if (< A 0)(progn ; abre o se

(prog1)(prog2)

))

S

N

S

N

Page 2: iftavares/ensino/CFAC/Downloads... · 2012. 12. 28. · CFAC: AutoLISP (III) - Funções de repetição e condicionais, Obter e converter informação 2009@FEUP/DEMec-SDI JST/JOF

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

2009@FEUP/DEMec-SDI

JST/JOF 2

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação3

Função condicional - if

Figura C: If A<0 executa a função prog1, senão executa a função prog2.

(if (< A 0)

(prog1)

(prog2)

)

S N

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação4

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 ; abre o se

(prog1)(prog2)

)(progn ; abre o senão

(prog3)(prog4)

))

S N

Page 3: iftavares/ensino/CFAC/Downloads... · 2012. 12. 28. · CFAC: AutoLISP (III) - Funções de repetição e condicionais, Obter e converter informação 2009@FEUP/DEMec-SDI JST/JOF

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

2009@FEUP/DEMec-SDI

JST/JOF 3

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação5

Função condicional - if

If sequenciais com condicionais de igualdade (Figura E) são melhor codificados pelo comando cond (Figura F).

S

N

N

S

A = 1; 2; 3.

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação6

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;;(if (= A 1)

(prog1)(if (= A 2)

(prog2)(prog3)

))

S

N

S

N

Page 4: iftavares/ensino/CFAC/Downloads... · 2012. 12. 28. · CFAC: AutoLISP (III) - Funções de repetição e condicionais, Obter e converter informação 2009@FEUP/DEMec-SDI JST/JOF

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

2009@FEUP/DEMec-SDI

JST/JOF 4

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação7

Função condicional - if

;; segunda opção - if sequenciais;;(if (= A 1)

(prog1))(if (= A 2)

(prog2))(if (= A 3)

(prog3))

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação8

Função condicional - if

Figura F: Caso A=1 execute a função prog1, caso A=2execute a função prog2, caso A=3 execute a função prog3.

(cond

(= A 1) (prog1)

(= A 2) (prog2)

(= A 3) (prog3)

)

Page 5: iftavares/ensino/CFAC/Downloads... · 2012. 12. 28. · CFAC: AutoLISP (III) - Funções de repetição e condicionais, Obter e converter informação 2009@FEUP/DEMec-SDI JST/JOF

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

2009@FEUP/DEMec-SDI

JST/JOF 5

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação9

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))

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação10

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))

Page 6: iftavares/ensino/CFAC/Downloads... · 2012. 12. 28. · CFAC: AutoLISP (III) - Funções de repetição e condicionais, Obter e converter informação 2009@FEUP/DEMec-SDI JST/JOF

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

2009@FEUP/DEMec-SDI

JST/JOF 6

2009@JST/JOF11

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 condicionais, Obter e converter informação

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação12

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)

Page 7: iftavares/ensino/CFAC/Downloads... · 2012. 12. 28. · CFAC: AutoLISP (III) - Funções de repetição e condicionais, Obter e converter informação 2009@FEUP/DEMec-SDI JST/JOF

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

2009@FEUP/DEMec-SDI

JST/JOF 7

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação13

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

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação14

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.

SN

SN

Page 8: iftavares/ensino/CFAC/Downloads... · 2012. 12. 28. · CFAC: AutoLISP (III) - Funções de repetição e condicionais, Obter e converter informação 2009@FEUP/DEMec-SDI JST/JOF

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

2009@FEUP/DEMec-SDI

JST/JOF 8

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação15

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

Figura G: Enquanto RESP=S executara função prog1.

(setq RESP "S")(while (= RESP "S")

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

)

S

N

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação16

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)

(prog2)

)

S

N

Page 9: iftavares/ensino/CFAC/Downloads... · 2012. 12. 28. · CFAC: AutoLISP (III) - Funções de repetição e condicionais, Obter e converter informação 2009@FEUP/DEMec-SDI JST/JOF

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

2009@FEUP/DEMec-SDI

JST/JOF 9

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação17

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."))

))

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação18

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.

Page 10: iftavares/ensino/CFAC/Downloads... · 2012. 12. 28. · CFAC: AutoLISP (III) - Funções de repetição e condicionais, Obter e converter informação 2009@FEUP/DEMec-SDI JST/JOF

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

2009@FEUP/DEMec-SDI

JST/JOF 10

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação19

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: "))

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação20

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çãoselect object do autoCAD).

Page 11: iftavares/ensino/CFAC/Downloads... · 2012. 12. 28. · CFAC: AutoLISP (III) - Funções de repetição e condicionais, Obter e converter informação 2009@FEUP/DEMec-SDI JST/JOF

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

2009@FEUP/DEMec-SDI

JST/JOF 11

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação21

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.

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação22

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.

Page 12: iftavares/ensino/CFAC/Downloads... · 2012. 12. 28. · CFAC: AutoLISP (III) - Funções de repetição e condicionais, Obter e converter informação 2009@FEUP/DEMec-SDI JST/JOF

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

2009@FEUP/DEMec-SDI

JST/JOF 12

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação23

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 rectaimaginária) contida na variável ANGBASE.Considera zero graus sempre na direcção leste(para a direita).

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação24

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 programapára a aguardar nova inserção.

Page 13: iftavares/ensino/CFAC/Downloads... · 2012. 12. 28. · CFAC: AutoLISP (III) - Funções de repetição e condicionais, Obter e converter informação 2009@FEUP/DEMec-SDI JST/JOF

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

2009@FEUP/DEMec-SDI

JST/JOF 13

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação25

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 OPTIONKEYWORD”, será apresentada, no caso de digitação incorrecta, a mensagem “TRY AGAIN:”

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação26

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"

Page 14: iftavares/ensino/CFAC/Downloads... · 2012. 12. 28. · CFAC: AutoLISP (III) - Funções de repetição e condicionais, Obter e converter informação 2009@FEUP/DEMec-SDI JST/JOF

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

2009@FEUP/DEMec-SDI

JST/JOF 14

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação27

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

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação28

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")

Page 15: iftavares/ensino/CFAC/Downloads... · 2012. 12. 28. · CFAC: AutoLISP (III) - Funções de repetição e condicionais, Obter e converter informação 2009@FEUP/DEMec-SDI JST/JOF

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

2009@FEUP/DEMec-SDI

JST/JOF 15

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação29

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.

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação30

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

Page 16: iftavares/ensino/CFAC/Downloads... · 2012. 12. 28. · CFAC: AutoLISP (III) - Funções de repetição e condicionais, Obter e converter informação 2009@FEUP/DEMec-SDI JST/JOF

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

2009@FEUP/DEMec-SDI

JST/JOF 16

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação31

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

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação32

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))))

)

Page 17: iftavares/ensino/CFAC/Downloads... · 2012. 12. 28. · CFAC: AutoLISP (III) - Funções de repetição e condicionais, Obter e converter informação 2009@FEUP/DEMec-SDI JST/JOF

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

2009@FEUP/DEMec-SDI

JST/JOF 17

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação33

Exemplo - função com repeat, “gets” e conversões: Utilização

Saída de texto dos comandos

Desenho obtido

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação34

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.

Page 18: iftavares/ensino/CFAC/Downloads... · 2012. 12. 28. · CFAC: AutoLISP (III) - Funções de repetição e condicionais, Obter e converter informação 2009@FEUP/DEMec-SDI JST/JOF

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

2009@FEUP/DEMec-SDI

JST/JOF 18

2009@JST/JOFCFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação35

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"