quinta-feira, 23 de abril de 2015

Aula 22 – Criando Funções – Parte 1

 

Chegamos hoje ao tópico mais importante do nosso curso, desde que iniciamos o nosso curso todos os nossos programas começam e terminam em uma única chamada, porem quando programamos essa é uma pratica ruim, o correto é subdividir o programa em pequenas funções, isso facilita a depuração e torna o programa mais fácil de entender.

Existem dois tipos de funções as que retornam valores e as que não retornam, dependendo da situação podemos utilizar uma ou a outra.

Função DEFUN

Já usamos muito essa função porem não sabemos nada dela ainda, o que sabemos ate agora é que para criar um comando devemos digitar (defun c: SS(), tudo bem decorado e a  unica coisa que sabemos é que devemos colocar C: sempre que for um comando, agora aprenderemos mais sobre ela e como usa-la corretamente.

Defun significa definir função, e quando queremos criar uma função devemos seguir a sintaxe abaixo:

Sintaxe:

(defun <nome da função> ([argumentos] / [Variáveis a inicializar])

Nossa complicou, cadê o C:, o que é argumentos, porque eu preciso inicializar as variáveis e o que é essa barra invertida no meio dos dois, calma, vamos por partes e logo vocês vão entender tudinho.

1) Quando criamos uma função não podemos usar o C:, só o utilizamos quando queremos criar um comando para ser usado na linha de comando do AutoCAD.

2) O nome da função não pode conter espaços se necessário utilize o Underline _.

3) Argumento e inicialização de variáveis é opcional em uma função.

O que sobrou agora é falar dos argumentos e das variáveis a inicializar, porem vamos deixar de lado por enquanto a variáveis a iniciar, logo falaremos delas, para que vocês entendem o que é uma função e para que ela serve vamos fazer dois exemplos um matemático e outro usando comandos do AutoCAD e Autolisp. O exemplo matemático vai ser uma função que retorna um valor e a outra que usaremos comandos do AutoCAD será uma função que não retorna valor, isso não é regra nem qualquer coisa do tipo, isso fui eu que defini, podemos ter funções matemáticas que não retornam valor ou vice versa.

Exemplo 1:

Vamos criar uma função que retorne a valor da hipotenusa, para fazer isso precisaremos de dois argumentos, uma para o cateto oposto e outro para o cateto adjacente, vamos chama-los de oposto e adjacente e a nossa função chamaremos de hipotenusa.

(defun hipotenusa ( aposto adjacente )

Olhe a linha de programação acima o que estamos falando é que toda a vez que eu usar essa função chamada hipotenusa vou fornecer dois argumentos o primeiro será o valor destinado ao cateto oposto e o segundo ao adjacente, os dados deverão ser fornecidos nessa ordem.

(setq hip (sqrt (+ (exp oposto 2) (exp adjacente 2))))

Nessa linha apenas calculamos a hipotenusa usando as funções matemáticas.

Agora precisamos fazer com que a nossa função retorne o valor da hipotenusa, para fazer uma função retornar um valor basta colocar o nome da variável ao fim do programa sem os parênteses, conforme mostrado abaixo:

(defun hipotenusa(oposto adjacente)
  (setq hip (sqrt (+ (expt oposto 2) (expt adjacente 2))))
  hip
  )

Criamos a nossa primeira função e ela é uma função que retorna um valor, agora precisamos saber como usa-la, para usar uma função basta digita-la cercada por parênteses com os valores dos argumentos que deseja usar, como essa função retorna um valor precisamos armazenar esse valor dentro de uma variável para poder utiliza-lo futuramente.

(setq valor_hipotenusa (hipotenusa 3 4))

Vamos analisar a linha de programação acima, criamos uma variável chamada valor_hipotenusa e vamos armazenar nela o resultado da função hipotenusa, a função hipotenusa recebeu dois valores, 3 que é o cateto oposto e 4 o cateto adjacente, quando essa linha de programação estiver rodando o Autolisp chamara a função hipotenusa e vai colocar o valor 3 na variável oposto e o 4 na variável adjacente e executar o calculo dentro da função e o valor do calculo é armazenado na variável Hip  e retornado ao fim, esse valor retornado é o valor que ficara armazenado na variável valor _hipotenusa (isso será compreendido melhor na vídeo Aula com a ajuda o Visual Lisp).

Agora temos uma função que a qualquer momento podemos chama-la e usa-la dentro dos nosso programas, uma função pode ser usada por diversos programas basta estar carregada no momento for ser utilizada.

Uma função não precisa obrigatoriamente retornar um valor ou ter obrigatoriamente argumento, veja o exemplo abaixo:

Exemplo 2:

Vamos criar uma função que armazene as variáveis de sistema e outra função para restaura-las, essa função não terá argumento nem retornara valores.

(defun armazenar_var_sistema()
  (setq osm (getvar "osmode"))
  (setq ortho (getvar "orthomode"))
  (setq layer (getvar "clayer"))
  (setq cmd (getvar "cmdecho"))
  )

(defun restaurar_var_sistema()
  (Setvar "osmode" osm)
  (Setvar "orthomode" ortho)
  (Setvar "clayer" layer)
  (Setvar "cmdecho" cmd)
  )

Criamos duas funções note que nenhuma das duas tem argumento e nenhuma delas retorna qualquer valor, elas apenas executam algumas funções em Autolisp, no nosso caso elas armazenam e restauram as variáveis de sistema.

Para chama-las basta escrever o nome da função cercada por parênteses. Veja o programa baixo:

(defun c:pp()
  (armazenar_var_sistema)
  (Setvar "cmdecho" 0)
  (Setvar "osmode" 0)
  (setq pt1 (Getpoint "\nClique sobre o primeiro ponto: "))
  (setq pt2 (Getpoint pt1 "\nClique sobre o segundo ponto: "))
  (Setvar "orthomode" 1)
  (prompt "\nEsse novo ponto devera ser feito de forma ortogonal.")
  (setq pt3 (Getpoint pt2 "\nClique sobre o segundo ponto: "))
  (command "layer" "n" "linha" "c" "5" "linha" "")
  (Setvar "clayer" "linha")
  (command "line" pt1 pt2 pt3 "")
  (restaurar_var_sistema)
  (princ)
  )

Logo no inicio do programa fazemos o armazenamento das variáveis e depois vamos alterando o valor delas conforme a nossa necessidade e no final restauramos elas para o que seu estado antes de rodar o programa. Essas duas funções podem ser usadas em qualquer programa a qualquer momento quantas vezes vocês quiserem.

Pessoal ainda tem mais, mas vai ficar para a segunda parte dessa aula.

Abaixo segue o link dessa vídeo aula no meu Canal manual de Cad no youtube.

https://www.youtube.com/watch?v=o0GDNvfwiK4&feature=youtu.be

Espero que tenham gostado.

Sergio Fernandes

Manual de Cad

 

 

 

Nenhum comentário:

Postar um comentário