**Antes de qualquer explicação, uma das informações que temos de saber e reter, acerca da criação de comandos e programação, é que estes programas informáticos trabalham sobre as bases do sistema cartesiano (x,y,z), por isso todos os pontos que quisermos indicar terão de ter sempre 2 ou 3 coordenadas, para que os programas não tenham problemas consigam interpretar o que pretendemos dos mesmos.**
Expressões:
"Defun" - "Define Function", serve tal como o nome indica para definir uma função , nestes casos aparece para definir a função de um comando;
Ex:
(defun c:sq1 ()
"Getpoint" - serve para pedir ao utilizador que defina um ponto à escolha;
"Setq" - serve para reter um valor;
Ex:
(setq ponto (getpoint " Qual o ponto de insercção"))
"Command" - para chamar um comando;
Ex:
(command "line" ponto ponto2 ponto3 ponto4 "c")
Tendo em conta que temos uma lista, ou seja, um determinado número de elementos aos quais necessitamos recorrer, utilizamos :
(List a b c)
Car para seleccionar apenas o 1º elemento dessa lista, neste caso seleccionaria a letra a;
Cdr para seleccionar todos os elementos menos o 1º, neste caso seleccionaria as letras b e c;
*No site da AutoDesk, temos também disponibilizados mais comandos que poderão ser necessários.
Para primeiro exercício, criámos uma Macro que nos conseguisse criar quadrados independentemente da sua localização, mas sempre com uma unidade de lado;
Vamos então abrir um ficheiro no Notepad++, e gravar com o nome de "sq1.lsp", e introduzir:
- (defun c:sq1 ()
- (setq ponto (getpoint " Qual o ponto de insercção"))
- (setq ponto2 (list (+ 1 (car ponto)) (cadr ponto)))
- (setq ponto3 (list (car ponto2) (+ 1 (cadr ponto2))))
- (setq ponto4 (list (car ponto) (cadr ponto3)))
- (command "line" ponto ponto2 ponto3 ponto4 "c")
- )
Explicando brevemente o conteúdo desta Macro:
Na 1ª linha definimos o nome da função;
Na 2ª ao chamar o a função "getpoint", fizemos com que o utilizador, necessitasse de introduzir o ponto à sua escolha, para que o mesmo comando sirva para diversas situações;
Na 3ª atribuímos agora coordenadas ao 2º ponto, fazendo com que através do comando " (+ 1 (car ponto)) " o valor do 1º ponto diste numa recta paralela ao plano X, mais um valor que o primeiro ponto, a segunda informação de coordenadas (" (cadr ponto)))" é para determinar o valor em Y do ponto, neste caso a cota do 2º ponto será a mesma do 1º.
Na 4ª as coordenadas do 3º ponto, sendo que a 1ª, ou seja o seu afastamento será igual ao afastamento do segundo ponto, logo a indicação da coordenada será "(car ponto2)", mas a sua cota será 1 valor a mais que a cota do 2º ponto, logo a expressão será uma soma de 1 unidade (visto que o quadrado tem 1 unidade de lado) + a cota do 2º ponto = "(+ 1 (cadr ponto2)".
Na 5ª as coordenadas do 4º ponto, neste caso o seu afastamento será igual ao do 1º ponto, logo "(car ponto)" a sua cota, será igual à do 3º ponto = "(cadr ponto3)".
Na 7ª introduzimos a indicação do comando que cumprirá este "plano de execução" que acabámos de definir.
Na 8ª colocámos apenas um parênteses ")" para dar por concluída a função.
De seguida, alterámos a forma da nossa Macro e em vez de ser uma Macro de criação de quadrados de 1 unidade de lado, vamos ter uma de criação de rectângulos de 2 por 1; alterando apenas a 3ª linha para:
" 3.(setq ponto2 (list (+ 2 (car ponto)) (cadr ponto)))
De seguida, passámos à criação de uma função que unisse dois pontos à escolha formando um segmento de recta e que a meio desse segmento tivéssemos um círculo cujo raio fosse ⅟10 da distância entre o 1º ponto (início do segmento) e o 2º ponto (fim do segmento):
- (defun c:teste ()
- (setq p1 (getpoint " Qual o primeiro ponto " ))
- (setq p2 (getpoint " Qual o segundo ponto " ))
- (command "line" p1 p2 "")
- (command "circle" ( polar p1 (angle p1 p2) (/ (distance p1 p2) 2)) (* 0.1 distance p1 p2)
- )
De seguida, passámos à criação de uma função que unisse dois pontos à escolha formando um segmento de recta e que a meio desse segmento tivéssemos um triângulo:
- (defun c:teste ()
- (setq p1 (getpoint " Qual o primeiro ponto " ))
- (setq p2 (getpoint " Qual o segundo ponto " ))
- (command "line" p1 p2 "")
- ;(command "circle" ( polar p1 (angle p1 p2) (/ (distance p1 p2) 2)) (* 0.01 distance p1 p2))
- (command "polygon" "3" ( polar p1 (angle p1 p2) (/ (distance p1 p2 ) 2)) "I" (* 0.1 (distance p1 p2)))
- )
Na 6ª linha a informação aparece depois de ";", pois é apenas isso que queremos que seja, por outras palavras, quisemos guardar esta informação da Macro anterior mas não a queremos utilizar nesta, então "colocamos de parte" e torna-mo-la uma mera informação que nada vai interferir com a Macro actual.
Terminando a aula com o professor a esclarecer dúvidas particulares nas Macros Individuais dos alunos.
*Em actualização...
Sem comentários:
Enviar um comentário