Programação em AutoCAD com AutoLISP e Visual LISP

Page 1


ESTRUTURA DE UM PROGRAMA EM AUTOLISP

15

Para utilizarmos o programa, teremos de escrever (meuprograma), uma vez que se trata de um programa de LISP e que por isso tem de ser visto no contexto da utilização de comandos em LISP, ou seja, entre parêntesis. Existe, no entanto, uma maneira de se contornar a utilização dos parêntesis colocando “c:” antes do nome do programa no início da definição do mesmo: (defun c:meuprograma () ... ) EXEMPLO DE APLICAÇÃO 2.1

Por uma questão de método, vamos criar um diretório chamado proglisp no disco rígido, para armazenarmos os nossos trabalhos. Neste livro, partiremos do princípio de que os nossos ficheiros LISP estarão guardados em “c:/proglisp/”. Abrimos então o Notepad do Windows e escrevemos o seguinte código: (defun contasimples () (setq a (getint "Primeiro Numero:")) (setq b (getint "Segundo Numero:")) (setq c (+ a b)) )

Gravamos como “c:\proglisp\somadois.lsp” Dentro do AutoCAD escrevemos: Command: (load "c:\\proglisp\\somadois") e aparece a mensagem CONTASIMPLES indicando que foi carregado o programa contasimples. O programa que acabámos de criar está guardado no disco e está também disponível para ser utilizado na sessão atual do AutoCAD, depois de utilizarmos, a função LOAD, como indicado acima.

© FCA – Editora de Informática


36

PROGRAMAÇÃO EM AUTOCAD COM AUTOLISP E VISUAL LISP

Apresentam-se de seguida funções matemáticas que poderemos usar. Para algumas será apresentado o significado em inglês para melhor memorização e também a sintaxe e exemplos da aplicação prática das mesmas. Como primeiro passo, nas funções matemáticas, veremos as quatro operações básicas, cuja sintaxe obedece à forma apresentada. Sintaxe (operação operando operando...): (+ 10.2

5.3)  – Soma de 10.2 com 5.3;

(- 17.2

4.3)  – Subtração de 4.3 a 17.2;

(* 5.8

12.3)  – Multiplicação de 5.8 por 12.3;

(/ 9.0

3.0)  – Divisão de 9.0 por 3.0.

Qualquer destes exemplos e os das funções seguintes podem ser escritos na linha de comando do AutoCAD e o resultado deverá ser, nos exemplos acima, respetivamente: 15.5 12.9 71.34 3.0.

+ Função que adiciona todos os valores que a seguem. (+ valor valor...) valor – qualquer número inteiro, real ou variável. resulta – um valor inteiro ou real que é a soma entre todos os valores. Exemplo: (setq a 12.5 b 4). A expressão (+ a b) tem como resultado 16.5, o equivalente a 12.5 + 4. Da mesma forma (+ b 16.3) tem como resultado 20.3, o equivalente a 4 + 16.3. A expressão (+ 9 3 b) tem como resultado 16, o equivalente a 9 + 3 + 4. Função que subtrai de forma ordenada todos os valores que a seguem. (- valor valor...) valor – qualquer número inteiro, real ou variável. resulta – um número inteiro ou real com a diferença ordenada entre os valores. Exemplo: (setq a 12.5 b 4). A expressão (- a b) tem como resultado 8.5, o equivalente a 12.5 – 4. Da mesma forma, (- b 16.3) tem como resultado -12.3, o equivalente a 4 - 16.3. © FCA – Editora de Informática


56

PROGRAMAÇÃO EM AUTOCAD COM AUTOLISP E VISUAL LISP

EXEMPLO DE APLICAÇÃO 3.7

Utilizando os comandos que estudámos até agora, vamos desenhar um array que, além de ser desenhado recorrendo à função cíclica REPEAT, tem a vantagem sobre o comando ARRAY de se poder atribuir uma cor diferente a cada elemento que é desenhado. Tal como esta modificação, muitas outras poderiam ser feitas. (Defun c:corarray () ;

(setq origem '(0 0))

INICIALIZAÇÃO DE VARIÁVEIS

; VAMOS ADOTAR O PONTO 0,0 COMO ORIGEM DO DESENHO

(setq disth 15) ; ESTABELECEMOS O ESPAÇAMENTO HORIZONTAL (setq distv 15) ; ESTABELECEMOS O ESPAÇAMENTO VERTICAL (setq cor 1)

; ESTABELECEMOS A COR INICIAL

(repeat 3 (setq p1 origem)

; O ARRAY TERÁ TRÊS LINHAS ; É ESTABELECIDO O PONTO INICIAL POR LINHA

(repeat 5

; O ARRAY TERÁ TRÊS COLUNAS

(command "line" p1 "@10,0" "@0,10" "@-10,0" "c") ; É DESENHADO O

RETÂNGULO

(setq cor (1+ cor))

; A COR É INCREMENTADA EM CADA CICLO

(command "color" cor)

; FAZ-SE A ALTERAÇÃO DA COR

(setq p1 (polar p1 0 disth))

; AVANÇA-SE AO LONGO DA LINHA

) ; FIM DO REPEAT DAS COLUNAS (setq origem (polar origem (/ PI 2) distv)) ) )

; FIM DO REPEAT DAS LINHAS ; FIM DO PROGRAMA

Gravamos como “c:\proglisp\corarray.lsp” e dentro do AutoCAD, escrevemos (load "c:/proglis/corarray") Escrevemos corarray para que o programa seja executado.

© FCA – Editora de Informática


FUNÇÕES PARA AUTOLIIS SP

89

S Segu ue-see o prroceedim mentto habi h itua al: g grav var, carrreg gar parra d denttro do A CAD Auto D e exeecuttar ccom m a pala p avraa ”esscad da”. Deepoiss po ode--se ttesta ar ccom várrios vaalores e o resu ulta ado dev ve ser s sem s melhantee à figu ura seg guin nte, dep pend dend do das diimen nsões dos d v valo ores utillizadoss.

FIGURA 3.8 – Ressultado do d prograama eescad da dee fren nte e vista a isom métrrica

A fig guraa seg guin nte mos m stra a lo ocaliizaçção d dos pon ntoss. Daaí see po ode p perccebeer a m eira com mane mo ffora am o obtiidoss no o prrograma a. É im mporrtante nota n ar qu ue q quan ndo o se ex xecu uta o prrogrram ma, a facce que q estáá no o plano o XY Y, viirad da para p o utili u izad dor, é a faace defin d nida a peelos pon ntoss p3,, p4,, p5 e p p6.

ocaliizaçãão do os po ontoss utilizados na a deffiniçã ão dee cad da deegrau u FIGURA 3.9 – Lo

Se o resu r ultad do nãão co orresspon nderr ao espeerad do, é pro ovável qu ue o leittor teenha a os Obbjectt Snaaps ativa a adoss e issso esteja e a a pertu p urbaar o func f ciona ameento do prog p gram ma.

© FCA F – Edittora d de Informá ática


PROGRAMAÇÃO DE CAIXAS DE DIÁLOGO COM DCL

191

(Defun c:hello () (setq dcl_id (load_dialog "c:/proglisp/hello.dcl");O FICHEIRO (if (not (new_dialog "hello" dcl_id)) ;

;É CARREGADO

VERIFICA-SE SE EXISTE

;O FICHEIRO

(exit)

;

SE NÃO EXISTE SAÍMOS

; ; ;

É MOSTRADA A CAIXA DE DIÁLOGO

) (start_dialog) (unload_dialog dcl_id) )

RETIRAMOS A RECÉM-CRIADA CAIXA FIM DE PROGRAMA

Este ficheiro é gravado como “c:\proglisp\hello.lsp” Basta agora carregarmos para memória o programa hello.lsp que se encarregará de carregar a caixa de diálogo e mostrá-la. O resultado deverá ser semelhante à figura seguinte.

FIGURA 6.2

– Resultado da execução do programa hello.lsp

Muitos dos conceitos e definições utilizados são palavras em inglês, as quais fazem parte da própria linguagem DCL, ou são conceitos inerentes à linguagem. O programador terá necessariamente de os conhecer e de lidar com eles, já que a linguagem tem na sua origem a língua inglesa. Sendo assim, vamos utilizar tanto termos em inglês como em português, de forma a facilitar a progressão do programador.

Algumas regras básicas para começar a desenvolver caixas de diálogo: A definição da caixa começa sempre com o nome da mesma, seguido de dois pontos e da função DIALOG - nome : dialog; Depois terá de vir a abertura de uma chaveta, a qual fecha no fim de toda a caixa estar definida - nome : dialog { ... };

© FCA – Editora de Informática


ACTIVEX

297

VLAX-CURVE-ISCLOSED Função que determina se uma curva é fechada. (vlax-curve-isClosed vlaobj) vlaobj- uma variável contendo uma curva como objeto ActiveX. resulta – T se a curva for fechada, nil se a curva for aberta. Exemplo: (vlax-curve-isClosed circulo). O resultado é T. (vlax-curve-isClosed arco). O resultado é nil.

8.7.1

PARÂMETROS

Vamos agora introduzir um conceito que não foi ainda utilizado e que vai ser necessário para diversas funções nesta secção. Trata-se do conceito de "parâmetro". Conforme o tipo de curva com que estamos a lidar, assim vai ser a sua funcionalidade. Deste modo, no caso de um arco, o parâmetro refere-se ao ângulo ao centro em radianos desse ponto. No caso das polylines, o parâmetro vai ter um valor unitário no final de cada segmento da polyline e esse valor vai variar percentualmente ao longo de cada troço. Quer isto dizer que uma polyline com quatro segmentos vai ter o parâmetro 0.0 no ponto inicial e 4.0 no ponto final. Quer também dizer que, por exemplo, a meio do segundo segmento, o parâmetro será 1.5, já que no fim desse segundo segmento terá o valor 2.0.

FIGURA 8.8 – Variação do parâmetro numa polyline. Os limites de cada troço têm valores inteiros; nos pontos intermédios, o parâmetro varia percentualmente

© FCA – Editora de Informática


320

PROGRAMAÇÃO EM AUTOCAD COM AUTOLISP E VISUAL LISP

VLR-REACTORS Função que mostra uma lista de todos os reatores definidos. (vlr-reactors tipo) tipo – opção de indicar qual o tipo de reatores a identificar. resulta – a listagem de todos os reatores ou os de um determinado tipo indicado. Exemplo: (vlr-reactors :vlr-object-reactor). São listados todos os reatores de objetos que existem, e o resultado é, por exemplo, ((:VLR-Object-Reactor #<VLR-ObjectReactor>)). VLR-ADD Função que ativa um reator previamente criado e desativado. (vlr-add reactor) reactor – o apontador do reator a ativar. resulta – o argumento da variável reactor. Exemplo: (vlr-add React1). O resultado é #<VLR-Mouse-Reactor> e se for desativado, o reator contido na variável React1 passa a estar ativo. VLR-ADDED-P Função que verifica se um reator está ativo. (vlr-added-p reactor) reactor – o reator que deve ser verificado para sabermos se está ativo. resulta – T se estiver ativo ou nil se não estiver. Exemplo: (vlr-added-p React1). O resultado é T e verificamos que o reator que está contido na variável React1 está ativo. VLR-REMOVE Função que remove um reator. (vlr-remove reactor) reactor – o reator a ser removido. resulta – o reator, ou nil se a operação falhar. Exemplo: (vlr-remove React1). O resultado é #<VLR-Mouse-Reactor> e o reator contido em React1 é removido; se já tiver sido removido, o resultado é nil.

© FCA – Editora de Informática


EXEMPLOS DE APLICAÇÃO EM AUTOLISP E VISUAL LISP

333

EXEMPLO DE UTILIZAÇÃO 10.4

Quando trabalhamos com loteamentos ou cartografia, é frequente precisarmos de numerar. No próximo exemplo veremos diversos tipos de numeração.

FIGURA 10.1 – Desenho de parcelas, extraído de "parcels.dwg" do AutoCAD Map

FIGURA 10.2 – Vários exemplos de numeração do desenho "parcels.dwg"

Quando se pede ao utilizador para indicar um número, podemos colocar em questão o uso de GETINT em vez de GETREAL. A razão que condiciona o uso de GETINT é o facto de termos como limite para os números inteiros -32768 e 32767. Fora desse intervalo, temos de usar GETREAL.

© FCA – Editora de Informática


338

PROGRAMAÇÃO EM AUTOCAD COM AUTOLISP E VISUAL LISP

EXEMPLO DE UTILIZAÇÃO 10.6

Neste exemplo usaremos o desenho "parcels.dwg", já utilizado num exemplo anterior, para preencher os lotes com os valores das áreas e padrões de hatch.

FIGURA 10.5 – Zona de trabalho original do desenho "parcels.dwg" de AutoCAD MAP

FIGURA 10.6 – Zona de trabalho do desenho "parcels.dwg" depois de executarmos harea

Utilizámos dois tipos de padrões de hatch e fizemos também um exemplo em que a linha que coloca o hatch foi suprimida; é o que vemos nos lotes da direita.

© FCA – Editora de Informática


EXEMPLOS DE APLICAÇÃO EM AUTOLISP E VISUAL LISP

357

FIGURA 10.16 – Coordenadas de localização inseridas em cada bloco

10.6 ROTINAS PARA MANIPULAÇÃO DE OBJETOS VLA A manipulação de objetos VLA permite, como vimos, uma forma alternativa de lidar com os objetos do AutoCAD. Nesta secção apresentamos rotinas onde se utilizam funções de ActiveX para manipular objetos VLA.

10.6.1 PREPARAÇÃO DE EXERCÍCIO Para podermos fazer o primeiro exercício com ActiveX, precisamos de criar um objeto de ActiveX, ou seja, do tipo VLA. Nesta secção, apontam-se duas soluções para a criação de um objeto que servirá depois para o exercício com as primeiras operações com reatores. EXEMPLO PREPARATÓRIO 1

Os dois círculos que vamos criar destinam-se ao exemplo de programa 10.13, no qual vamos criar um reator para reagir a alterações nestes círculos. Para tal, vamos proceder de duas formas: desenhando um círculo no ambiente do AutoCAD ou no programa, mas com a função COMMAND convertendo-o depois para objeto VLA; na segunda parte vamos criar o objeto como VLA.

© FCA – Editora de Informática


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.