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.

 

 

 

 

 

 

 

 

Aula 15 – Funções de Entrada de Dados – Parte 3

 

Olá pessoal, vamos dar continuidade ao nosso curso falando ainda sobre as funções de entrada de dados.

GETSTRING

A função Getstring retorna um texto digitado pelo usuário, o retorno dessa função independente do que for digitado será sempre uma string.

Sintaxe:

(Getstring  [T] [mensagem para o usuário])

T= Com esse argumento na função Getstring a mesma passa a aceitar espaços em branco, caso contrário ao pressionar a barra de espaço ele entenderá como um Enter.

Exemplo 1:

(defun c:tx()
  (setq nome (Getstring "\nDigite o primeiro nome: "))
  (setq pt1 (Getpoint "\nClique sobre o local desejado: "))
  (command "text" pt1 "2" 0 nome)
  )

1) Criamos um comando TX

2) Usando a função Getstring solicitamos ao usuário que digite o seu primeiro nome, nesse caso como foi suprimido o argumento T não será aceito espaços em branco, quando o usuário pressionar a barra de espaço o comando entendera que o Enter foi pressionado. O texto digitado será armazenado na variável NOME.

3) Usando o Getpoint solicitamos que o usuário clique em qualquer ponto da tela, esse ponto será armazenado na variável PT1.

4) Usando a função command vamos criar um texto no ponto PT1 com altura 2 e rotação zero e o texto será o texto que foi armazenado na variável NOME.

Exemplo 2:

(defun c:tx()
  (setq nome (Getstring  t "\nDigite o nome e sobrenome do usuário: "))
  (setq pt1 (Getpoint "\nClique sobre o local desejado: "))
  (command "text" pt1 "2" 0 nome)
  )

1) Criamos um comando TX

2) Usando a função Getstring solicitamos ao usuário que digite o primeiro nome, nesse caso como foi utilizado o argumento T que faz com que a função Getstring aceite espaços em branco. O texto digitado será armazenado na variável NOME.

3) Usando o Getpoint solicitamos que o usuário clique em qualquer ponto da tela, esse ponto será armazenado na variável PT1.

4) Usando a função command vamos criar um texto no ponto PT1 com altura 2 e rotação zero e o texto será o texto que foi armazenado na variável NOME.

GETINT e GETREAL

A função Getint retorna um número inteiro. Caso o dado fornecido não seja um número inteiro ele vai dar uma mensagem de erro e solicitara automaticamente um novo dado.

A função Getreal retorna sempre um número decimal mesmo que o número inserido seja um número inteiro, essa função aceita qualquer tipo de número, inteiro, decimal, negativo etc. Caso o dado informado não seja um número uma mensagem de erro será exibida e o programa solicitará um novo número.

Sintaxe GETINT:

(Getint [mensagem para o usuário])

Sintaxe GETREAL:

(Getreal [mensagem para o usuário])

Exemplo:

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

1) Criamos o comando IMC

2) Usando Getint solicitamos ao usuário que digite a idade do usuário, como geralmente a idade é sempre fornecida como um número inteiro utilizar o Getint garante que receberemos o dado da maneira que imaginamos. Esse valor é armazenado na variável idade.

3) Utilizando Getreal solicitamos ao usuário que digite a sua altura, como geralmente a altura é um valor decimal utilizamos o Getreal. Esse valor será armazenado na variável altura.

4) Utilizando Getreal solicitamos ao usuário que digite o seu peso, como geralmente o peso é um valor decimal utilizamos o Getreal. Esse valor será armazenado na variável peso.

5) Usando o peso e a altura fazemos o calculo o IMC que é o peso dividido pela altura ao quadrado.

Na próxima aula continuaremos falando mais um pouco sobre as funções de entrada de dados.

Baixo segue o link dessa aula no meu canal Manual de Cad no Youtube.

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

Espero que tenham gostado.

Sergio Fernandes

Manual de Cad.

quinta-feira, 12 de março de 2015

Aula 14 – Funções de Entrada de Dados – Parte 2

 

Olá pessoal vamos continuar falando sobre as funções de entrada de dados, agora que aprendemos a usar a função Getpoint tudo fica mais fácil pois quase todas as funções get se comportam da mesma maneira.

GETCORNER

A função Getcorner retorna assim como o Getpoint uma lista contendo as coordenadas X Y e Z do ponto selecionado, porem diferente do Getpoint que não necessita do ponto de laço que fornecerá uma linha auxiliar o Getcorner precisa desse ponto de laço pois a partir dele será mostrada uma janela de box auxiliar.

.

Sintaxe:

(Getcorner <ponto de laço> [mensagem para o usuário])

Exemplo1:

(defun c:zw()
  (setq pt1 (Getpoint "\nClique sobre o local desejado: "))
  (setq pt2 (Getcorner pt1 "\nAbra uma janela: "))
  (command "zoom" pt1 pt2)
  )

1) Definimos o nome do nosso comando ZW.

2) Usando o Getpoint armazenamos na variável PT1 uma lista contendo as coordenadas.

3) Agora armazenamos uma lista contendo X Y Z na variável PT2 usando o Getcorner, o Getcorner terá como ponto de laço a variável PT1.

4) Usamos o comando zoom para aproximar a visualização na janela indicada.

clip_image001

GETDIST

Getdist diferentemente do Getpoint e Getcorner que retornam uma lista o Getdist retorna uma distancia (valor numérico decimal) entre dois pontos, essa função também requer o ponto de laço que é o ponto de partida para medir a distancia porem ele também é opcional, caso você não defina o ponto de laço o programa vai pedir que primeiro clique sobre o ponto de laço para depois pedir o segundo ponto e retornar a distancia.

Sintaxe:

(Getdist [ponto de laço] [mensagem para o usuário])

Exemplo:

(defun c:med()
(setq pt1 (Getpoint "\nClique sobre o ponto inicial: "))
(setq distancia (Getpoint  pt1 "\nClique sobre o ponto final: "))
)

1) Criamos a função MED.

2) Armazenamos na variável PT1 os pontos para serem usado como ponto de laço.

3) Indicamos o ponto final, o valor armazenado na variável distancia será a distancia entre o ponto de laço e o ponto indicado pelo usuário.

Mais a frente no curso veremos que essa função mesmo parecendo ser útil não tem tanta utilidade assim, aprenderemos a pegar a distancia sem usa-la e veremos teremos mais recursos na mão se não a utilizarmos.

GETANGLE E GETORIENT

Retornam o angulo em radianos, essas duas funções são bem parecidas porem podem nos fornecer resultados diferentes.

Getangle retorna o angulo a partir do angulo 0 graus definido pelo usuário e que pode ser configurado pela variável de sistema ANGBASE.

Getorient retorna o angulo levando em conta que o angulo 0 graus que se encontra sempre ao leste (lado direito).

Quando for usar essas duas funções precisa escolher da maneira correta, precisa verificar se usara o angulo maquina ou o angulo definido pelo usuário, isso é muito importante e pode fazer você ficar doido tentando encontrar onde esta dando errado.

Sintaxes:

(Getangle [ponto de laço] [mensagem para o usuário])

(Getorient [ponto de laço] [mensagem para o usuário])

Exemplo (Getorient)

(defun c:ang()
  (setq pt1 (Getpoint "\nClique sobre o ponto desejado: "))
  (setq angulo (Getorient pt1 "\nIndique o angulo desejado: "))
  )

1) Definimos o nome do nosso comando ANG.

2) Usando o Getpoint armazenamos na variável PT1 que será nosso ponto de laço.

3) Usando o ponto PT1 como ponto de laço devemos indicar com o mouse o angulo desejado o seu resultado será armazenada na variável angulo em radianos.

No exemplo abaixo indicamos o angulo de 90º graus e recebemos como retorno o valor 1.5708 que é o radiano de 90º.

clip_image002

Não importa qual angulo foi configurado como sendo o angulo 0 na variável de sistema ANGBASE o Getorient sempre usara o zero grau oficial  (Leste, lado direito).

Exemplo (Getangle)

(defun c:ang()
  (setq pt1 (Getpoint "\nClique sobre o ponto desejado: "))
  (setq angulo (Getangle pt1 "\nIndique o angulo desejado: "))
  )

1) Definimos o nome do nosso comando ANG.

2)) Usando o Getpoint armazenamos na variável PT1 que será nosso ponto de laço.

3) Usando o ponto PT1 como ponto de laço devemos indicar com o mouse o angulo desejado o seu resultado será armazenada na variável angulo em radianos.

No exemplo definiremos a variável ANGBASE para 90º, isso que dizer que o Getangle entendera que toda vez que entrarmos com o angulo de 90º ele deverá entender como angulo 0º

clip_image003

Nesse caso tivemos como retorno 0 radianos que equivale ao angulo 0º mesmo tendo fornecido o angulo de 90º, isso porque ele levou em conta o angulo base que é controlado pela variável de sistema ANGBASE.

Se a variável de sistema ANGBASE estiver configurada como 0º Getangle e Getorient forneceram o mesmo resultados.

Abaixo segue o link dessa aula no meu canal manual de Cad no youtube.

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

Espero que tenham gostado.

Sergio Fernandes

Manual de Cad

segunda-feira, 9 de março de 2015

Aula 13 – Funções de Entrada de Dados – Parte 1

 

Olá pessoal, nessa aula vamos aprender como fornecer ao Autolisp dados fornecidos pelo usuário e como manipular esses dados dentro do programa, essa aula é muito simples principalmente se você já absorveu o conteúdo das aulas anteriores.

As funções que vamos aprender hoje são as funções GET, para não ter uma quantidade muito grande de funções para dar exemplos, vamos dividir essa aula em três partes assim teremos tempo para ver vários exemplos diferentes.

GETPOINT

O Getpoint retornará uma lista contendo os pontos X Y e Z do ponto que foi indicado pelo usuário

Sintaxe:

(Getpoint [ponto de laço] [mensagem para o usuário])

Ponto de laço = deve ser uma lista contendo as coordenadas X Y e Z

Mensagem para o usuário = deverá ser uma string

Todos os argumentos para a função Getpoint são opcionais (lembre-se em uma sintaxe qualquer argumento cercado por colchetes é opcional) podendo simplesmente usar a função assim (Getpoint) que ela funcionará, veja o exemplo abaixo sem usar nenhum argumento para a função Getpoint.

(setq pt (Getpoint))

A linha de programação acima solicitara que o usuário clique em um ponto na tela, o resultado dessa interação será ima lista contendo X Y e Z.

clip_image001

X = 369922.0

Y = 309640.0

Z = 0.0

Podemos fazer uso dos argumentos também e deixar o programa mais amigável, uma forma de fazer isso é dando uma mensagem que vai auxiliar o usuário a entender o que deve ser feito, veja a linha de programação abaixo:

(setq pt (Getpoint “\nClique sobre o local desejado”))

ATENÇÃO: Na mensagem acima temos um delimitador \n (barra n) isso informa ao Autolisp que ele deverá pular uma linha e depois imprimir a mensagem na linha de comando, faremos sempre uso desse delimitador em nossos programas.

A linha de programação acima funcionará igual ao exemplo anterior com a diferença que o usuário receberá na linha de comando uma mensagem que vai auxilia-lo.

clip_image002

Veja que ele escreveu na linha de comando a mensagem e na frente ele retornou a lista contendo as coordenadas X Y e Z essa lista foi armazenada na variável PT e poderemos usar essa variável a qualquer momento em nosso programa.

Podemos também fazer uso do argumento ponto de laço esse ponto de laço mostrara uma linha auxiliar a partir do ponto de laço fornecido, veja o exemplo abaixo:

(defun c: se()

(setq pt1 (Getpoint “\nClique sobre o primeiro ponto: “))

(setq pt2 (Getpoint pt1 “\nClique sobre o segundo ponto: “))

)

Esse comando acima chamado SE solicita na primeira linha que o usuário clique em qualquer ponto da tela, esse ponto será armazenado na variável PT1, depois ele pede um segundo ponto porem foi fornecido como ponto de laço a variável PT1, quando o usuário for clicar no segundo ponto uma linha auxiliar aparecerá tendo como ponto base o ponto fornececido inicial e que foi armazenado em PT1.

clip_image003

Essa linha auxiliar é muito util quando por exemplo queremos traçar uma linha assim podemos vizualizar o resultado antes mesmo de clicar no ponto.

Agora vamos fazer um exemplo um pouco mais complicado utilizando a função Getpoint, vamos fazer um programa onde o usuário clica em um ponto e o programa desenha um quadrado de 10x10, por enquanto faremos um quarado com um valor gravado direito no programa, mas nas próximas aulas aprenderemos quando alterar esse valor durante a execução do programa.

Vamos pensar um pouco antes de sair programando. Se utilizarmos a função GETPOINT teremos apenas uma lista contendo as coordenadas de X Y e Z, porem já aprendemos a manipular uma lista sendo assim podemos ter de forma separada os valores de X Y e Z e a partir desses valores somar valores e criar novos pontos e assim criar o nosso quadrado, veja a imagem abaixo isso facilitará o entendimento do exercício.

clip_image004

Do PT1 ao PT2 estamos deslocando apenas em X

Do PT1 ao PT3 estamos deslocando em X e Y

Do PT1 ao PT4 estamos deslocando apenas em Y

Vamos então dar início ao programa

(defun c:qa()
  (setq pt1 (Getpoint "\nClique sobre o local desejado: "))
  (setq x (car pt1))
  (setq y (car (cdr pt1)))
  (setq pt2 (list (+ x 10) y))
  (setq pt3 (list (+ x 10) (+ y 10)))
  (setq pt4 (list x (+ y 10)))
  (command "line" pt1 pt2 pt3 pt4 pt1 "")
  )

Vamos entender o programa

1) Criamos a variável PT1 usando Getpoint e armazenamos nela uma lista contendo X Y e Z

2) Usando a função CAR pegamos o valor da coordenada X e armazenamos em uma variável também chamada X

3) Usando a função CAR e CDR pegamos o valor da coordenada Y e armazenamos em uma variável também chamada Y

4) Criamos uma variável PT2 nela armazenamos  uma lista, essa lista foi criada com os seguintes dados:

(+ x 10) = que é o valor de X da variável PT1 somando 10

Y = que é o valor de Y da variável PT1

Note que do ponto pt1 ao pt2 nos movemos apenas em X portanto somamos 10 apenas a essa coordenada.

5) Criamos uma variável PT3 nela armazenamos  uma lista, essa lista foi criada com os seguintes dados:

(+ x 10) = que é o valor de X da variável PT1 somando 10

(+ y 10) = que é o valor de Y da variável PT1 somando 10

Lembre-se que estamos sempre partindo do ponto PT1 e se olharmos perceberemos que nos movemos tanto em X quanto em Y para chegar a esse ponto.

5) Criamos uma variável PT4 nela armazenamos  uma lista, essa lista foi criada com os seguintes dados:

x = que é o valor de X da variável PT1

(+ y 10) = que é o valor de Y da variável PT1 somando 10

Olhando sempre pelo ponto PT1 notamos que para chegar o PT4 nos movemos apenas em Y, portanto somamos mais 10 apenas em Y.

6) Criamos a linha partindo de PT1 e terminamos em PT1 para fechar o quadrado.

Quem tiver a oportunidade de assistir a vídeo aula poderá ver esse exemplo melhor explicado.

Abaixo segue o link do vídeo aula no meu canal Manual de Cad no youtube.

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

Espero que tenham gostado.

 

Abaixo seguem os exercicios

1) Utilizando o getpoint crie um comando que  que desenhe uma escada com 3 degraus com 10 cm de altura e 15 de comprimento. o Usuário deverá clicar em apenas um ponto.

2) Tente refazer o exemplo da Aula 12 utilizando o getpoint.

Sergio Fernandes

Manual de Cad.

quinta-feira, 5 de março de 2015

Aula 12 – Criando Comandos- Parte 3

 

Olá pessoal esse post será somente com video aula, nessa aula mostro mais exemplos e tento explicar melhor como usar a função command.

Abaixo segue o link da video aula em nosso canal Manual de Cad no youtube:

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

Espero que tenham gostado

Sérgio Fernandes

Manual de Cad.

terça-feira, 3 de março de 2015

Aula 11 – Criando Comandos-Parte 2

 

Olá pessoal esse post será somente com video aula, nessa aula mostro mais exemplos e ensino alguns truques e dou algumas dicas.

Abaixo segue o link da video aula em nosso canal Manual de Cad no youtube:

https://www.youtube.com/watch?v=yc71gc9M3b4

Espero que tenham gostado

Sérgio Fernandes

Manual de Cad.