AutoLISP - III Funções de repetição e condicionais, Obter...
Transcript of AutoLISP - III Funções de repetição e condicionais, Obter...
AutoLISP - III Funções de repetição e condicionais,
Obter e converter informação
João Manuel R. S. Tavares Joaquim Oliveira Fonseca
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
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
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
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.
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
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) )
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) )
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))
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))
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
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)
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
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
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
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
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.")) ) )
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.
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: "))
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).
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.
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.
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).
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.
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:”
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"
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
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")
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.
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
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
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))) ) )
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
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.
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"