35
AutoLISP - III Funções de repetição e condicionais, Obter e converter informação João Manuel R. S. Tavares Joaquim Oliveira Fonseca

AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

  • Upload
    others

  • View
    4

  • Download
    3

Embed Size (px)

Citation preview

Page 1: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

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

Obter e converter informação

João Manuel R. S. Tavares Joaquim Oliveira Fonseca

Page 2: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@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

Page 3: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 3

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

Page 4: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 4

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 5: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 5

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.

Page 6: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 6

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 7: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 7

Função condicional - if

;; segunda opção - if sequenciais ;; (if (= A 1) (prog1) ) (if (= A 2) (prog2) ) (if (= A 3) (prog3) )

Page 8: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 8

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

Page 9: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 9

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

Page 10: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 10

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 11: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF 11

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

Page 12: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 12

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 13: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 13

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

Page 14: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 14

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

Utilizar while quando se deseja executar (repetir) um conjunto de expressões enquanto uma condição for satisfeita.

Utilizar repeat quando se deseja executar (repetir) um conjunto de expressões N vezes.

S N

S N

Page 15: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 15

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") (prompt "\nDeseja continuar? (S/N) ") (setq RESP (getkword)) )

S

N

Page 16: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 16

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 17: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 17

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

Page 18: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 18

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 interaçã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 19: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 19

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

Page 20: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 20

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 retângulo fantasma no ecrã (como na função select object do autoCAD).

Page 21: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 21

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.

Page 22: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 22

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 reta do primeiro para o segundo ponto faz com uma reta imaginária saindo do primeiro ponto no sentido positivo de x do UCS ativo (obs. reta 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 23: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 23

Funções getangle e getorient

getorient – para um ângulo de orientação (setq ANG (getorient "Angulo de rotação: ")) Similar a getangle, exceto pelo facto de ignorar a direção do ângulo zero (direção da reta imaginária) contida na variável ANGBASE. Considera zero graus sempre na direção leste (para a direita).

Page 24: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 24

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.

Page 25: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 25

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 incorreta, a mensagem “TRY AGAIN:”

Page 26: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 26

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 27: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 27

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

Page 28: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 28

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 29: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 29

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.

Page 30: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 30

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 31: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 31

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

Page 32: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 32

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

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

Page 33: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 33

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

Saída de texto dos comandos

Desenho obtido

Page 34: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 34

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 exceto que caracteres de controle não são

interpretados e sim impressos literalmente. print:

– Igual a função princ exceto 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 35: AutoLISP - III Funções de repetição e condicionais, Obter ...tavares/ensino/CFAC/Downloads... · 2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e . 3 condicionais,

2011@JST/JOF CFAC: AutoLISP (III) - Funções de repetição e

condicionais, Obter e converter informação 35

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"