Post on 23-Jan-2021
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
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
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
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)
)
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))
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)
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
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
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.
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).
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.
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.
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"
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")
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
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))))
)
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.
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"