My Profile Photo

Jociel Souza

PHP Clojure Javascript Mongodb ZendFramework


Desenvolvedor Web - Backend - PHP


Estudante de Ciência da Computação, desenvolvedor de software apaixonado por tecnologia.


Estudante de Ciência da Computação procurando sempre aprender algo novo, desenvolvedor web com conhecimento em PHP7^, Zend Framework, Zend Expressive, Doctrine ORM, Doctrine ODM, MongoDB, Javascript, VueJS, HTML, GIT entre outros, atualmente estudando também Clojure, Elm e o paradigma funcional e tentando compartilhar o conhecimento adquirido.


AutoLISP - Funções matemáticas, condicionais e controle de fluxo | Jociel Souza

AutoLISP - Funções matemáticas, condicionais e controle de fluxo


Depois de ver uma introdução sobre AutoLISP no primeiro texto (Introdução a AutoLISP) vamos ver que existem muito mais coisas para explorar e que podem ajudar a desenvolver uma rotina mais robusta e poderosa para atumatizar muitas tarefas dentro do ambiente do AutoCAD.

Nate Grant em Unsplash


Operadores e funções matemáticos

Em AutoLisp, assim como na maioria das linguagens de programação, temos os operadores utilizados em cálculos matemáticos que realizam as operações básicas de soma (+), subtração (-), multiplicação (*), e divisão (/). Também temos os operadores de incremento (+) e decremento (-), apesar de chamar de operadores, em AutoLISP eles tambem são funções.


Vamos ver alguns exemplos utilizando operadores matemáticos, como vimos no artigo anterior, o AutoLISP utiliza a notação prefixa, ou seja, o operador vem antes dos operandos.

(+ 22) ; 4
(- 5 2) ; 3
(* 2 3) ; 6
(/ 8 4) ; 2

E os operadores de incremento e decremento.

(1+) ; 2
(1-) ; 0


Em alguns casos precisamos executar alguns cálculos mais complexos e talvez seja difícil executá-los apenas com as operações básicas, então o AutoLISP disponibiliza algumas funções matemáticas prontas, vamos ver alguns exemplos.

abs – Retorna o valor absoluto de um número.

(abs -9) ; 9
(abs -41.6) ; 41.6

atan – Retorna o arcotangente de um valor. Devemos lembrar que o resultado retornado será sempre em radianos e caso passado dois valores por parâmetro é retornado o arcotangente do primeiro valor dividido pelo segundo.

(atan 6) ; 1.40
(atan 9 3) ; 1.24

cos – Retorna o co-seno de um ângulo passado por parâmetros

(cos 30) ; 0.15

exp – Retorna o antilogaritmo natural de um valor, o resultado será sempre um real.

(exp 3) ; 20.0855

expt – Retorna a exponenciação de um valor elevado a outro.

(expt 3 2) ; 9

gcd – Retorna o máximo denominador comum entre dois números.

(gcd 6 9) ; 3

log – Retorna o logaritmo natural de um valor, o resultado será sempre um real

(log 6) ; 1.79176

max – Retorna o maior valor entre dois números.

(max 9 6) ; 9

min – Retorna o menor valor entre dois números.

(min 6 9) ; 6

minusp – Retorna T(true) caso o número passado for negativo, caso contrário retorna nil(false).

(minusp 6) ; nil
(minusp -6) ; T

rem – Retorna o resto da divisão entre dois valores.

(rem 10 3) 1 
(rem 8 4) ; 0

sqrt – Retorna a raiz quadrada de um valor, o resultado sempre será um número real.

(sqrt 9) ; 3.0

zerop – Retorna T(true) se o número passado for 0, caso contrário retorna nil(false).

(zerop 0) ; T
(zerop 5) ; nil


Além dessas, existem diversas outras que podem ser vistas na documentação oficial Arithmetic Functions Reference.
Todas essas funções podem ser utilizadas para realizar cálculos matemáticos, vamos ver alguns exemplos:

  • Calcular f = (2 + 4) * (3 -5)
    (* (+ 2 4) (- 3 5)) ; -12
    
  • Calcular volume de esfera de raio 5. V = 4 * π r³ / 3
    (/ (* (* 4 3.14) (expt 5 3)) 3)
    


Funções lógicas e de comparação

Uma das características de um software é poder comparar e verificar resultados e valores podendo assim, tomar alguma decisão sobre esses valores, para isso existem algumas funções bastante úteis, essas funções normalmente trabalham com dois valores comparando-os e retornando um valor booleano T (true) ou nil (false), vamos ver algumas delas.


= Retorna T(true) se todos os valores forem iguais.

(= 2 2) ; T
(= 2 3) ; nil


/= Compara dois valores e retorna T(true) se ambos forem diferentes.

(/= 2 2) ; nil
(/= 2 3) ; T


< Compara dois valores e retorna T(true) se o primeiro for menor que o segundo.

(< 2 6) ; T
(< 6 2) ; nil


<= Compara dois valores e retorna T(true) se o primeiro for menor ou igual ao segundo.

(<= 2 6) ; T
(<= 6 6) ; T
(<= 6 2) ; nil


> Compara dois valores e retorna T(true) caso o primeiro for maior que o segundo.

(> 6 2) ; T
(> 2 6) ; nil


>= Compara dosi valores e retorna T(true) caso o primeiro for maior ou igual ao segundo.

(>= 6 2) ; T
(>= 6 6) ; T
(>= 2 6) ; nil


and Compara duas expressões e retorna T(true) se ambas forem T(true).

(and T T) ; T
(setq um (= 1 1)) ; comparamos dois números e definimos o resultado (T) na variável um.
(setq dois (= 2 2)) ; comparamos dois números e definimos o resultado na variável dois.
(setq tres (= 2 3)) ; ; comparamos dois números e definimos o resultado (nil) na variável tres
(and um dois) ; T
(and um tres) ; nil
(and (= 1 1) (= 2 2)) ; T


or Compara duas ou mais expressões e retorna T(true) se pelo menos uma das expressões for T(true).

(or T T nill) ; T
(or (= 1 3) (= 5 6) ; nil


not Retorna T(true) se o valor passado for nil.

(not nil) ; T
(not T) ; nil
(setq v1 (= 1 1)) ; T
(setq v2 (= 3 5)) ; nil

(not v1) ; nil
(not v2) ; T


Vamor ver alguns exemplos, podem ser executados diretamente no prompt de comandos do AutoCAD, mas antes tente resolver sem executar. :)

(<= 5 5)

(not (= 5 5))

(and (= 5 6) (< 2 5))

(or (= "a" "a") (< 5 3))

(or (and (/= 5 6) (< 3 8)) (and (/= 6 6) (< 9 5)))

(and (or (< 7 9) (< 9 7)) (or (/= 5 5) (= 6 6)))


Controle do fluxo de execução

Outra característica de um software é poder tomar decisões conforme os dados são processados e assim poder escolher as próximas operações a serem executadas, para isso o AutoLISP disponibiliza algumas funções para implementação dessas funcionalidades, vamos ver algumas das mais importantes e utilizadas.


if É uma função condicional usada para avaliar uma expressão (condição), caso a condição seja verdadeira T(true) a expressão logo a seguir é executada, caso contrário, é evitado a expressão seguinte e executado a próxima.

Nesse pequeno pseudocódigo, caso a condição seja T(true) é executada a operação 1, caso contrário é executada a operação 2.

(if (condição)
    (operação 1)
    (operação 2))

Vamos ver alguns exemplos.

(if (< 1 2)
   (setq a 5)
   (setq a 10)) ; Qual o valor de a?
(if (and (= 2 2) (>= 6 6))
    (setq b 9)
    (setq b 3)) ; Qual o valor de b
(setq idade (getint "\nDigite sua idade: "))
(if (> idade 18)
    (print "Voce é maior de idade")
    (print "Voce é menor de idade"))


Como vimos, a função if executa apenas uma expressão em cada caso, mas e se precisasse executar varias expressões? Para isso temos a função progn.

A função progn é muito utilizada junto a função if e permite que seja possível a execução de varias expressões agrupadas como se fosse uma única expressão.

(if (T)
    (progn
        (expressão 1)
        (expressão 2)
        (expressão 3))
    (progn
        (expressão 4)
        (expressão 5)
        (expressão 6)))
(setq strA (getstring "Digite a primeira palavra: "))
(setq strB (getstring "Digite a segunda palavra: "))
(if (= (strlen strA) (strlen strB))
    (progn
        (print "As duas palavras tem o mesmo tamanho")
        (print "O tamanho das palavras é: ")
        (print (strlen strA)))
    (progn
        (print "As palavras tem tamnhos diferentes")
        (print "O tamanho da primeira palavra é: ")
        (print (strlen strA))
        (print "O Tamanho da segunda palavra é: ")
        (print (strlen strB))))


cond É uma função condicional que avalia qual das opções é verdadeira e executa uma expressão correspondente, cond permite que seja testada múltiplas condições.

(cond
    ((<condição>) (expressão 1))
    ((<condição>) (expressão 2))
    ((<condição>) (expressão 3))
    ((<condição>) (expressão 4)))
(initget 1 "E D C B")
(setq direcao (getkword "\nEscolha a direção da cota [Esquerda/Direita/Cima/Baixo] "))
(cond
    ((= direcao "e") (print "Voce escloheu Esquerda"))
    ((= direcao "d") (print "Voce escloheu Direita"))
    ((= direcao "c") (print "Voce escloheu Cima"))
    ((= direcao "b") (print "Voce escloheu Baixo")))


Conclusão

Funções condicionais provavelmente são uma das coisas mais importante e utilizadas para desenvolver uma rotina AutoLISP mais robusta que permite a própria rotina decidir o que fazer de acordo com uma dado digitado pelo usuário por exemplo ou um dado criado a partir de um cálculo matemático, podendo ser utilizada diversas funções matemáticas já existentes para esse cálculo, isso abre diversas possibilidades que veremos nos próximos textos. Comentem se gostaram, compartilhem se conhecem alguém a quem possa ser útil este texto e até o próximo.



Se ainda não leu o primeiro texto sobre AutoLISP segue o link.


Referências:
  • GAÁL, José Alberto. Curso de AutoLISP. Campinas, SP: Desecad, 1997. 251 p.
  • KRAMER, William. Programando em AUtoLISP. São Paulo, SP: Makron Books, s/d, 274 p.
  • AUTODESK. AutoCAD Developer Documentation. 2019. Disponível em: https://help.autodesk.com/view/OARX/2019/PTB
comments powered by Disqus