segunda-feira, 23 de março de 2015

Aula 16 – Funções de Entrada de Dados – Parte 4

 

Hoje teremos a nossa ultima aula sobre o assunto entrada de dados e também vamos aprender mais algumas funções que não são entrada de dados mas que são de extrema importância nesse momento do curso. As próximas duas aulas serão aulas praticas onde vou explicar todos os comandos de entrada de dados.

INITGET

A função Initget faz o controle da entrada dos dados. Essa função traz mais controle ao nosso programa pois pode permite por exemplo que Getint ou Getreal somente recebam valores maiores que zero, ou ainda que o usuário obrigatoriamente forneça um ponto quando utilizamos o Getpoint.

A função Initget deve ser usada sempre antes da função desejada.

Sintaxe:

(Initget <bite>)

Abaixo segue a tabela dos bites.

1 Impede que o usuário responder à solicitação , pressionando apenas ENTER.

2 Impede que o usuário responder à solicitação , digitando zero.

4 Impede que o usuário responder à solicitação , digitando um valor negativo.

Exemplo 1:

Vamos fazer um comando simples que desenhe uma linha, se por algum motivo o usuário não clicar na tela seja no primeiro ponto ou no segundo no momento de se fazer a linha acontecerá um erro, para impedir que isso aconteça vamos usar o Initget com o Bite 1.

(defun c:l2()
  (Initget 1)
  (setq pt1 (Getpoint "\nClique sobre o primeiro ponto: "))
  (Initget 1)
  (setq pt2 (Getpoint  pt1 "\nClique sobre o próximo ponto: "))
  (command "line" pt1 pt2 "")
  )

1) Criamos o comando L2

2) Entramos com a função Initget com o bite 1 que quer dizer que a próxima função de entrada de dados não poderá ser pulada caso o Enter seja pressionado, somente poderá sair da função se um ponto for fornecido.

3) Pede ao usuário para clicar em um ponto, devido à função Initget o usuário não conseguira sair desse comando sem clicar em um ponto da tela. Esse ponto será armazenado na variável PT1.

4) Entramos com a função Initget com o bite 1 que quer dizer que a próxima função de entrada de dados não poderá ser pulada caso o Enter seja pressionado, somente poderá sair da função se um ponto for fornecido.

5) Pede ao usuário para clicar em um ponto, devido à função Initget o usuário não conseguira sair desse comando sem clicar em um ponto da tela. Esse ponto será armazenado na variável PT2. Esse comando tem como ponto de laço a variável PT1.

6) Graças ao Initget teremos obrigatoriamente dois ponto para criar a nossa linha usando a função command.

Exemplo 2:

Vamos criar um comando que não aceite números negativos e que só aceite valores maiores do que zero também vamos bloquear para impedir que o usuário apenas pressione o Enter sem entrar com o valor, para fazer isso vamos ter que fazer uso de todos os bites que forem mostrados acima, para fazer isso basta soma-los, como vamos usar os bites 1, 2 e 4 basta soma-los e teremos o valor 7.

(defun c:imc()
  (Initget 7)
  (setq altura (Getreal "\nDigite a altura do usuário em metros: "))
  (Initget 7)
  (setq peso (Getreal "\nDigite o peso do usuário: "))
  (setq imc (/ peso (expt altura 2)))
  )

No exemplo acima forçamos o usuário a digitar um valor válido para ambas as variáveis altura e peso, mesmo que o usuário pressione Enter ou digite um valor negativo ou tente digitar zero o Initget não permitirá, forçando o usuário a entrar com um valor válido.

A função Initget ainda é usada com outra função de entrada de dados chamada getkword que não aprenderemos agora pois essa é uma função que não faz muito sentido explicar o seu funcionamento sem antes aprendermos a usar as funções condicionais.

Funções Geométricas

Pessoal vou inserir essa aula junto com as funções de entrada de dados porque fica muito mais fácil explicar os dois assuntos juntos, nas próximas aulas farei varios vídeos explicando como usa-las em conjuntos.

DISTANCE

Retorna a distancia entre dois pontos.

Sintaxe:

(Distance <ponto 1> <ponto 2>)

Exemplo:

(defun c:dd()
  (setq pt1 (Getpoint "\nClique sobre o primeiro ponto: "))
  (setq pt2 (Getpoint pt1 "\nClique sobre o segundo ponto: "))
  (setq distancia (Distance pt1 pt2))
  )

1) Criamos o comando DD.

2) Solicitamos um ponto ao usuário com a função Getpoint  e armazenamos esse ponto na variável PT1.

3) Solicitamos outro ponto ao usuário com a função Getpoint  e armazenamos esse ponto na variável PT2.

4) Usando a função Distance obtemos a distancia entre PT1 e PT2.

Quando ensinei o comando Getdist informei que não gostava de usa-lo pois ele retornava apenas a distancia sem guardar o ponto clicado, com a função Distance podemos armazenar os pontos com getpoint e depois extrair a distancia.

ANGLE

Retorna o angulo em radianos a partir de pois pontos.

Sintaxe:

(Angle <ponto 1> <ponto 2>)

Exemplo:

(defun c:ang()
  (setq pt1 (Getpoint "\nClique sobre o primeiro ponto: "))
  (setq pt2 (Getpoint pt1 "\nClique sobre o segundo ponto: "))
  (setq angulo (Distance pt1 pt2))
  )

1) Criamos o comando ang.

2) Solicitamos um ponto ao usuário com a função Getpoint  e armazenamos esse ponto na variável PT1.

3) Solicitamos outro ponto ao usuário com a função Getpoint  e armazenamos esse ponto na variável PT2.

4) Usando a função Angle obtemos o angulo em radianos entre PT1 e PT2.

Muitos devem estar pensando pra que serve esse angulo em radianos, fiquem calmos teremos uma aula voltada somente para a conversão de dados.

POLAR

Retorna um ponto no espaço. Porem para fazer isso ele requer um ponto de partida o angulo e a distancia a ser percorrida, o resultado será uma lista contendo as coordenadas X,Y e Z.

Sintaxe:

(polar <ponto de partida> <angulo em radianos> <distancia>)

Exemplo:

Vamos criar uma função que faça um circulo no centro de uma linha, vamos clicar em dois pontos para fazer a linha e em seguida o programa vai achar automaticamente o meio da linha e fara um circulo.

(defun c:ptm()
  (setq pt1 (Getpoint "\nClique sobre o primeiro ponto: "))
  (setq pt2 (Getpoint pt1 "\nClique sobre o segundo ponto: "))
  (setq angulo (Angle pt1 pt2))
  (setq distancia (/ (Distance pt1 pt2) 2))
  (setq ptc (polar pt1 angulo distancia))
  (command "line" pt1 pt2 "")
  (command "circle" ptc 10)
  )

1) Criamos o comando PTM.

2) Solicitamos um ponto e armazenamos em PT1.

3) Solicitamos o segundo ponto e armazenamos seu valor em PT2.

4) Utilizando a função Angle pegamos o angulo de PT1 a PT2 (note que é diferente pegar o angulo de PT1 a PT2  ou de PT2 a PT1, a ordem dos fatores aqui pode alterar o produto, como meu ponto de partida no comando polar será PT1 eu então peguei o angulo de PT1 a PT2)

5) Utilizando a função Distance armazenamos a distancia de PT1 a PT2 na variável distancia, porem como não precisamos saber a distancia total e sim somente da metade pois a nossa intenção é pegar o ponto do meio da linha dividimos o valor da distancia por 2.

6) Usando a função polar indicamos o ponto de partida como sendo PT1 e fornecemos o angulo e a distancia (mesmo nome das variáveis), o resultado será uma lista contendo as coordenadas desse novo ponto.

7) Usando a função command criamos uma linha de PT1 a PT2.

8) Usando a função command  criamos um circulo de raio de 10 com o ponto central em PTC que é o ponto do meio da linha.

Pessoal, na próxima aula teremos muitos exemplos, muitos programas comentados, quem não entendeu alguma coisa aguarde as próximas aulas.

Abaixo segue o link dessa vídeo aula no meu canal  Manual de Cad no Youtube.

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

Espero que tenham gostado.

Sérgio Fernandes

Manual de Cad.

 

 

 

 

 

 

 

 

Um comentário:

  1. Estou fazendo este comando do Polar, sem sucesso, o círculo sempre é feito no pt1... ainda não consegui desvendar o problema, professor. Help...
    (defun c:ptm ()
    (setq pt1 (getpoint "\nClique sobre o primeiro ponto: "))
    (setq pt2 (getpoint pt1 "\nClique sobre o segundo ponto: "))
    (setq distancia (/ (distance pt1 pt2) 2))
    (setq angulo (angle pt1 pt2))
    (setq ptc (polar pt1 angulo distancia))
    (command "line" pt1 pt2 "")
    (command "circle" ptc 10)
    )

    ResponderExcluir