Você está na página 1de 37

Aula 1/7 - Programando em Autolisp

Introduo
por R.C. Ruschel, DCC-FEC-UNICAMP, Agosto 1997 Interfaces do AutoCAD:
Alm da interao pela linha de comando e por menus o AutoCAD R13 permite: executar um conjunto de comandos por meio de command-scripting a programao pelo usurio utilizando-se: a linguagem de programao AutoLISP ou a linguagem C atravs do ADS (AutoCAD Developing System) A forma de programao depende: das necessidades da aplicao (desempenho, custo) da experincia de programao da equipe envolvida

AutoLisp:
O AutoLisp baseado na linguagem de programao LISP (List Processing) de aprendizado simples porm poderosa. O AutoCAD tem um interpretador de Lisp embutido, permitindo a digitao de expresses/funes AutoLisp na linha de comando e sua interpretao automtica. O AutoCAD inclue rotinas AutoLisp bastante teis nos sub-diretrios sample e support.

Aplicaes em AutoLisp:
So armazenadas em arquivos ASCII com extenso .lsp. Devem ser carregadas para o ambiente do AutoCAD para serem executadas. Como carregar: na linha de comando pelo menu Tools/Applications ... de forma automtica inclundo-a no arquivo acad.lsp

ADS - AutoCAD Developing System:


Ambiente de programao baseado na linguagem C. Aplicaes desenvolvidas no ADS se comunicam com o AutoCAD via AutoLisp. Todas funes bsicas em ADS fazem uma chamada para uma funo equivalente em AutoLisp.

ADS x AutoLisp:
A escolha ADS x AutoLisp depende: da experncia do programador

do desempenho desejado para a aplicao aplicaes em ADS so + rpidas e utilizam menos memria do desempenho do processo de desenvolvimento da applicao AutoLisp recomendado para prototipagem e aplicaes onde o custo do desenvolvimento e manuteno mais importante que o desempenho da aplicao. da portabilidade desejada para a aplicao Aplicaes em AutoLisp so mais portteis. Dependem apenas do AutoCAD para a plataforma desejada. Aplicaes em ADS dependem do AutoCAD, da verso da linguagem C e do ambiente de desenvolvimento.

Lisp:
A LP Lisp : da mesma poca que o Fortran diferente de outras LPs, i.e., dados e programas so tratados da mesma forma (tudo como listas) e so colodados no mesmo espao de memria do computador. interpretada, i.e.,toda vez que o programa executado o cdigo fonte avaliado. muito utilizada na programao da rea de inteligncia artificial. Lisp utiliza a notao infixa (operador seguido dos operandos):
1 + 2 ----------> (+ 1 2)

Listas - composio:
inicia com "(", termina com ")" e composta por tomos, que podem ser: um nmero interio: -32.768 a 32.767 um nmero real: -4.932 a 4.932 onde e: -307 a 307 uma cadeia de caracteres (string): "Ola", "Insira um ponto:" um smbolo: nome de funo interna ou definida pelo usurio uma varivel: um smbolo que representa um nome de dado um nil: valor nulo (vazio) um ponteiro para arquivo (file descriptor): nome de arquivo uma sub-rotina (subr): nome de funes internas e externas do AutoLisp um nome de entidade: cdigo numrico associado ao objeto numa sesso de trabalho conjunto de seleo: conjunto de objetos selecionados

Listas - Exemplos:
Lista de dados: (2.0 3.5 7.6) ("paola" (11 06 1996) 3.150 51) Lista de programa (primeiro elemento um nome de funo ou uma subr):
(setq A 21) (list 2 3 4) ;setq uma subr, A um smbolo (nome de varivel) ;list uma subr

(defun vistalatdir ()(command "vpoint" "1,0,0"))

; defun e command so subrs

(vistalatdir) ;vistalatdir um smbolo (nome de funo)

Avaliando expresses em Lisp:


O interpretador do Lisp denominado avaliador. Toda a entrada para o Lisp processada por meio do avaliador. Tudo dentro do AutoLisp em relao ao avaliador retorna um valor como resultado, i.e.: qdo um elemento de dado apresentado ao avaliador, o valor atribuido ao elemento retornado. qdo um smbolo apresentado, o valor da ligao atual do smbolo retornado. qdo uma lista de programa, apresentada, essa executada e o valor final da execuo retornado.

Avaliando Listas de programa:


Se o primeiro elemento da lista for o nome de uma subr ou uma funo definida, a subr ou funo executada; o restante da lista usado como parmetros para a funo ou subr. Se o primeiro elemento da lista no for uma funo ou subr, obtm-se uma mensagem de erro: "bad function" (funo ruim).

Exemplos de avaliao de listas de programa:


(list 1 2 3) ;constri uma lista de 3 nmeros inteiros ;retorna (1 2 3) (2.0 3.0 6.6) ;retorna erro:bad function (setq a 1.0) ;retorna o valor 1.0 atribudo a varivel a (set 'a 1.0) ;idem mas usando o smbolo ' (set (quote a) 1.0);idem mas usando a subr quote

Obs: a subr quote empregada para acessar o nome da referncia (no o valor) de um smbolo. Portanto, o 2o. exemplo para ser processado como um lista de programa deveria ser:
(quote (2.0 3.0 6.6)) ou '(2.0 3.0 6.6)

AutoLisp na linha de comando do AutoCAD:


possvel avaliar expresses em AutoLisp e at funes na linha de comando do AutoCAD. Este recurso muito utilizado para experimentao e testes. Basta digitar na linha de comando a expresso ou funo desejada, e.g.:
Command: (setq A 2.0) 2.0 Command: (setq B 3.0) 3.0 Command: (setq C (+ A B)) 5.0 Command: !C 5.0 Command: (setq p1 (list 1 2)) (1 2) Command: (setq p2 (list 10 20)) (10 20)

Command: (command "line" p1 p2 "") line From point: to point: to point: Command: nil Command:(defun vistalatdir ()(command "vpoint" "1,0,0")) VISTALATDIR Command:(vistalatdir)

Desenvolvendo programas em AutoLisp - sem um ambiente de programao:


Utiliza-se simultaneamente dois programas o AutoCAD e um editor de texto simples (e.g. Edit ou NotePad do Windows). Entra-se no AutoCAD Chama-se o editor de texto utilizando o comando EDIT Edita-se as funes que compem o programa num arquivo com extenso LSP (e.g. programa1.lsp). Salva edio e sai do editor (automaticamente retornando para o AutoCAD). Carrega-se o arquivo no AutoCAD. Executa-se funes contidas no arquivo com (nome-da-funo) ou nome-da-funo

Arquivo acad.pgp:
Para fazer com que o comando EDIT chame o editor de texto diferente do edit do windows necessrio alterar uma linha do arquivo r13\com\support\acad.pgp: Linha original: EDIT,EDIT,0, File to edit: ,4 Nova linha: EDIT,c:\windows\notepad, 0, File to edit: ,4 O subdiretrio onde o notepad.exe est localizado pode variar. Portanto, verifique no seu microcomputador o subdiretrio correto. A mesma observao vale para a localizao do arquivo acad.pgp.

Carregando programas AutoLisp no AutoCAD:


Na linha de comando digitar (load "unidade-de-disco:\\sub-diretrio\\nome-do-promagacom-extenso"), e.g.:
Command: (load "c:\\trab\\programa1.lsp")

No pull-down menu Tools/Applications indicar arquivo a ser carregado procurando sua localizao com auxlio do botton File e depois carrega-lo acionando Load.

Exemplo - isomets.lsp:
Contedo do arquivo isomets.lsp:
;;;Vista isometrica lat-dir, fundo, por-cima (defun c:iso1() (command "vpoint" "1,1,1")) ;;;Vista isometrica lat-esq, fundo, por-cima (defun c:iso2() (command "vpoint" "-1,1,1"))

;;;Vista isometrica lat-dir, frente, por-cima (defun c:iso3() (command "vpoint" "1,-1,1"))

Carregando o arquivo isomets.lsp e executando funes:


Command: (load "c:\\trab\\isomets.lsp") ISO3 Command: iso1 vpoint Rotate/ <0.0000 0.0000 1.0000>: 1,1,1 Regenerating drawing Command: nil

Exemplo - media.lsp:
Contedo do arquivo media.lsp
;;;Programa principal (defun c:mediatestes() (setq t1(getreal "\nNota teste-1: ")) (setq t2(getreal "\nNota teste-2: ")) (setq nota (soma-e-divide)) (princ "\nMedia dos testes = ") (princ nota) (princ)) ;;;funcao soma-e-divide (defun soma-e-divide() (/ (+ t1 t2) 3.0))

Carregando o arquivo media.lsp e executando funo mediatestes:


Command: (load "c:\\trab\\media.lsp") SOMA-E-DIVIDE Command: mediatestes Nota teste-1: 5.0 Nota teste-2: 7.0 Media dos testes = 6.0 Command:

Homework:
Ler o captulo 1 de (Gal, 1997) ou captulos 1 e 2 de (Kramer&Kramer, 1995). Faa os seguintes exerccios propostos por (Gal, 1997): 1.Crie uma rotina que aplique um offset de 3 unidades numa entidade e altere em seguida o layer ao qual ela pertence para OFFLINES. Suponha que o layer j exista. 2.Crie um bloco qualquer (interno ao desenho). A seguir, crie uma rotina que insira este bloco rapidamente, com as escala x e y constantes e rotao 0, explodindo-o em seguida. O usurio dever somente informar a posio em que ser inserido o bloco.

Aula 2/7 - Programando em AutoLISP


Clculos, Variveis e Listas
Profa. Regina C. Ruschel,DCC-FEC-UNICAMP,Campinas, Julho 1997 Clculos:
Expresses matemticas so escritas na notao infixa, i.e., operador antecede operandos: 1+2 (+ 1 2) 32.12 - 22.5 (- 32.12 22.5) 1 + 2 + 3 + 4 (+ 1 2 3 4) 7 * (9 / 2) (* 7 (/ 9 2))

Variveis:
A varivel um recurso utilizado pelo programa para executar funes iguais mas com valores que podem ser alterados a cada execuo. Existem trs tipos: livre (global) associada local O tipo da varivel determinado pela sua posio na lista de parmetros na definio da funo.

Variveis - tipos (esquema):


(defun func1 (A B / C D) ; A,B: variveis assocs, C,D: variveis locais ... (setq X ...) ; X varivel livre ... ) (defun func2 () (setq Y (+ X 2) ... )

Variveis - tipos (definies):


Varivel livre: Equivalente a variveis globais. So utilizadas por mais de uma funo. No deve fazer parte da lista de parmetros na definio da funo, pois no pertence a nenhuma funo especfica e sim a qualquer uma. Varivel local: Equivalente a uma varivel temporria. Utilizada para armazenar dados auxiliares dentro de uma determinada funo.

Varivel associada: Equivalente a parmetros de entrada de uma funo. Variveis associadas e locais so zeradas na sada da funo.

Exemplo - funo com variveis locais:


;;;Clculo da circunferncia a partir do ;;;dimetro inserido pelo usurio (defun c:circun(/ DIA CIR) (setq DIA (getreal "\nDigite o valor de um dimetro: ")) ;pi uma constante do sistema (setq CIR (* DIA pi)) (princ "\nDiametro = ") (princ DIA) (princ "\nCircunferencia = ") (princ CIR) ;este princ faz com que a funo no retorne um nil (princ) )

Exemplo - funo com varivel associada:


arquivo progcir.lsp:
(defun circun(DIA) (setq CIR (* DIA pi)) (princ "\nDiametro = ") (princ DIA) (princ " ") (princ "Circunferencia = ") (princ CIR) (princ) )

linha de comando do AutoCAD:


Command: (load "progcir.lsp") CIRCUN Command: (circun 34) Diametro = 34 Circunferencia = 106.814 Command:

Exemplo - funo com variveis livres:


Contedo do arquivo mdia.lsp
;;;Programa principal (defun c:mediatestes() (setq t1(getreal "\nNota teste-1: ")) (setq t2(getreal "\nNota teste-2: ")) (setq nota (soma-e-divide)) (princ "\nMedia dos testes = ") (princ nota) (princ)) ;;;funcao soma-e-divide (defun soma-e-divide() (/ (+ t1 t2) 3.0))

Carregando o arquivo e executando a funo mediatestes


Command: (load "c:\\trab\\media.lsp") SOMA-E-DIVIDE Command: mediatestes

Nota teste-1: 5.0 Nota teste-2: 7.0 Media dos testes = 6.0 Command:

Manipulao de listas de dados:


Dados agrupados em listas so manipulados por funes especficas. Existe apenas funes para obter o primeiro tomo da lista - funo car o resto da lista (todos elementos exceto o primeiro) - funo cdr Para obter o 2o., 3o. tomo da lista utiliza-se funes derivadas a partir de concatenaes (mximo de 4) de car e cdr: cadr - retorna o 1o. tomo do resto da lista original. Portanto, retorna o 2o. tomo da lista original. cdaddr = cdr + cdr + car + cdr Para ler uma subr derivada de concatenaes de cars e cdrs: leia de trs para frente, despreze a primeira e ltima letra, um d representa um cdr e um a representa um car.

Comando car, cdr e derivados:


Command: (setq TESTE(list 10 20 30 40)) (10 20 30 40)) Command: !TESTE (10 20 30 40) Command: (car TESTE) ;retorna o primeiro tomo da lista 10 Command: (cdr TESTE) ;retorna uma lista sem o primeiro tomo da lista original (20 30 40) Command: cadr TESTE) ;executa um cdr sobre a lista original e um car sobre o resultado 20 Command: (caddr TESTE) ;executa um cdr sobre a lista original, ;+ 1 cdr e finalmente um car sobre os respectivos resultados 30

Exerccio - manipulao de lista de dados:


Na linha de commando do AutoCAD: Construa a lista ((11 22) (33 44) (55 66)) Obtenha o nmero 22 da lista Obtenha a lista (55 66)

Exerccio - desenvolver funo para desenhar crculo com linha de centro:


Dia : dimetro do crculo Cen : centro do crculo PT1, PT2 : quadrantes horizontais PT3, PT4 : quadrantes verticais

As linha de centro devem ser colocadas no Layer LC pr-existente com tipo de linha hidden.

Exerccio - funo que desenha crculo com linha de centro:


(defun c:cc (/ CEN DIA IN PT1 PT1X PT1Y PT2 PT2X PT2Y PT3 PT3X PT3Y PT4 PT4X PTY4 LAY) (initget 7) (setq CEN (getpoint "\nCentro do Circulo : ")) (initget 7) (setq DIA (getreal "\nDiametro : ")) (command "circle" CEN "d" DIA) ;construcao dos pontos das linhas de centro (setq IN (* DIA 1.1)) ; valor do incremento (setq PT1X (- (car CEN) IN)) (setq PT1Y (cadr CEN)) (setq PT1 (list PT1X PT1Y)) (setq PT2X (+ (car CEN) IN)) (setq PT2 (list PT2X PT1Y)) (setq PT3X ) (setq PT3Y ) (setq PT3 ) (setq PT4Y ) (setq PT4 ) ;desenho das linhas de centro (setq LAY (getvar "clayer")) (command "layer" "set" "lc" "" "line" PT1 PT2 "" "line" PT3 PT4 "") (setvar "clayer" LAY) (princ) )

Aula 3/7 - Programando em AutoLISP


Controle de fluxo. Get???s e Prin?s.
por R. C. Ruschel, DCC-FEC-UNICAMP, Agosto 1997 Funo condicional - if:

Figura A: If A<0 executa a funo prog1.


(if (< A 0) (prog1) )

Figura B: If A<0 executa as funes prog1 e prog2.


(if (< A 0) (progn (prog1) (prog2) ) )

Figura C: If A<0 executa a funo prog1, seno executa a funo prog2.


(if (< A 0) (prog1) (prog2) )

Figura D: If A<0 executa as funes prog1 e prog2, seno executa as funes prog3 e prog4.
(if (< A 0) (progn (prog1) (prog2) ) (progn (prog3)

(prog4) ) )

Funo condicional - cond:


Ifs sequenciais com condicionais de igualdade so melhor codificados pelo comando cond. Figura E: If A=1 executa a funo prog1, seno se A=2 executa a funo prog2, seno executa a funo prog3.
;; primeira opo - ifs encadeados (if (= A 1) (prog1) (if (= A 2) (prog2) (prog3) ) ) ;; segunda opo - ifs sequenciais (if (= A 1) (prog1) ) (if (= A 2) (prog2) ) (if (= A 3) (prog3) )

Figura F: Caso A=1 execute a funo prog1, A=2 execute a funo prog2, A=3 execute a funo prog3.
(cond (= A 1)(prog1) (= A 2)(prog2) (= A 3)(prog3) )

Operadores de comparao:
= (igual) (if (= A B C) (rotina)) /= (diferente) (if (/= A B) (rotina)) < (menor) (if (< A B) (rotina)) <= (menor ou igual) (if (<= A B) (rotina)) > (maior) (if (> A B) (rotina))

>= (maior ou igual) (if (>= A B) (rotina)) eq (idntico) (if (eq A B) (rotina)) equal (resultar em =) (if (equal A B) (rotina)

Diferena entre =, eq e equal:


(= A B ) retorna verdadeiro se argumentos forem iguais. (eq A B) retorna verdadeiro se argumentos derivados um do outro, e.g.:
(setq f1 '(a b c)) (setq f2 '(a b c)) (setq f3 f2) (eq f3 f2) ;retorna T (true) pois f3 derivado de f1 (eq f1 f3) ;retorna nil pois f3 no derivado de f1 (= f1 f2) ;retorna nil

(equal A B) retorna verdadeiro se argumentos resultarem em valores iguais, e.g.:


(equal f1 f2) (eq f1 f3) ;retornam T

Funes de repetio - while e repeat:


Utilizar while quando se deseja executar um conjunto de expresses enquanto uma condio for satisfeita. Utilizar repeat quando se deseja executar um conjunto de expresses N vezes. Figura G: Enquanto RESP=S execute a funo prog1.
(setq RESP "S") (while (= RESP "S") (prog1) (initget "S N") (prompt "\nDeseja continuar? (S/N) ") (setq RESP (getkword)) )

Figura H: Repita Num vezes a funes prog1 e prog2.


(setq NUM 10) (repeat NUM (prog1) (prog2) )

Exemplo - funo com if e while:


;;;abertura condicionada de arquivo (defun c:cc (/ CODIGO FOLHA NOME ARQ) (initget "A0 A1 A2 A3 A4") (prompt "\nQual o formato da folha? ") (setq FOLHA (getkword "Folha [A0, A1, A2, A3 ou A4]: ")

(setq CODIGO " ") (while (/= (strlen CODIGO) 6) (prompt "\nO codigo do desenho deve ter apenas 6 digitos. ") (setq CODIGO (getstring "Insira o codigo: ")) ) (setq NOME (strcat "c:\\" FOLHA "\\" CODIGO ".DWG")) (setq ARQ (findfile NOME)) (if (/= ARQ nil) (command "OPEN" ARQ) (alert (strcat "O arquivo " (strcase NOME) "\nnao foi encontrado.")) ) )

Obtendo dados:
As rotinas escritas em AutoLisp podem interagir com o usurio e o sistemas. Portanto, so necessrias funes para obter informao: getangle, getcorner, getdist, getenv, getfiled, getint, getkword, getorient, getpoint, getreal, getstring, getvar Na interao com o usurio deve-se utilizar prompts (mensagens com pedido de insero de dados) claros e realizar testes de consistncia sobre os dados obtidos. A funo initget restringe dados de entrada.

Funes getreal, getint e getstring:


getreal (setq NUM (getreal "Digite a escala: ")) getint (setq QTD (getint "Digite numero de itens: ")) getstring (setq ARQ (getstring "Digite nome do arquivo: ")) ;texto sem espaos (setq TIT T(getstring T "Insira titulo do projeto: ")) ;texto com espaos

Funes getpoint, getcorner e getdist:


getpoint (setq PT1 (getpoint "Clique no primeiro ponto: ")) (setq PT2 (getpoint PT1 "\nClique no segundo ponto: ")); com fita elstica getcorner (setq PONTO1 (getpoint "Clique no primeiro canto: ")) (setq PONTO2 (getcorner PONTO1 "Outro canto: ")) Apresenta um retngulo fantasma na tela (como na funo select object). getdist (setq DST (getdist "Insira distancia: ")) ;digitar distncia ou clicar dois pontos. (setq DST (getdist PT1 "Insira segundo ponto: "))

Deve-se clicar um ponto e a distanca entre este ponto e pt1 ser calculada.

Funes getangle e getorient:


getangle (setq ANG (getangle "Angulo de rotao: ")) Pode-se digitar um ngulo em radianos ou pode-se clicar dois pontos. No segundo caso o ngulo obtido ser o ngulo que a reta do primeiro para o segundo ponto faz com uma reta imaginria sando do primeiro ponto no sentido positivo de x do UCS ativo (obs. reta imaginria ajustada pela varivel de sistema ANGBASE). (setq ANG (getangle PT1 "Angulo de rotao: ")) Deve-se clicar um ponto e o ngulo ser calculado como no segundo caso do exemplo acima. getorient (setq ANG (getorient "Angulo de rotao: ")) Similar a getangle, exceto pelo fato de ignorar a direo do ngulo zero (direo da reta imaginria) contida na varivel ANGBASE.Considera zero graus sempre na direo leste (direita).

Funes getkword e initget:


A funo getkword obtem um dgito. Esta funo sempre deve ser precedida da funo initget, que restringe a entrada de dados a valores especficos. Exemplos: (initget "A B C") (setq OPC (getkword "\nOpcao (A, B ou C)? ")) Se algo diferente de A, B ou C for digitado a mensagem INVALID OPTION KEYWORD ser apresentada e o programa pausa para nova insero de dado. (initget "Y N") (prompt "\nContinue? (Y/N) ") (setq R (getkword)) Neste exemplo como getkword no inclui prompt, alm da mensagem INVALID OPTION KEYWORD, ser apresentada, no caso de digitao incorreta, a mensagem TRY AGAIN:

Funo initget em detalhe:


Sintaxe:(initget [bits] [string]) onde bits pode ser: 1 (no aceita enter), 2 (no aceita zero), 4 (no aceita valor negativo), 8 (aceita ponto fora do drawing limits) ... exemplos de strings: "S N s n"

Exemplos:

"Sim No" "Aprovado Reprovado Exame"


;no aceita zero ;no aceita enter, zero ou valor negativo ;equivalente ao exemplo anterior ;no aceita enter e tem que ser S ou N

(initget 2) (initget (+ 1 2 4)) (initget 7) (initget 1 "S N") (initget "10 11 12")

Funes getvar/setvar e getenv:


getvar Descobre qual o valor de uma varivel do sistema (setq LAYERATIVA (getvar "clayer")) setvar Altera o valor de uma varivel do sistema. (setvar "clayer" "2D-PAR") getenv Descobre o valor de uma varivel do sistema operacional. (getenv "path")

Convertendo dados:
Determinadas funes manipulam dados de um tipo especfico. Nem sempre o dado obtido do tipo exigido pela funo que o manipular. Portanto, so necessrias funes de converso entre tipos.

Funes de converso:
float - inteiro para real atoi - string para inteiro itoa - inteiro para string atof - string para real rtos - real para string angtos - radianos para string angtof - radianos para real ascii - string para cdigo na tabela ASCII chr - cdigo na tabela ASCII para string A diviso (/ real int) resulta em real. A diviso (/ int int) resulta em int (casas decimais eliminadas).

Exemplo - funo com repeat, "gets" e converses:


;;; array inclinado (defun c:arrayincli (/ INICIO FIM INTERVALO DISTANCIA ALPHA NUMREP) (setq INICIO (getpoint "Clique no ponto inicial: ")) (setq FIM (getpoint INICIO "Clique no ponto final: ")) (setq INTERVALO (getdist "Digite distancia entre copias: ")) (setq DISTANCIA (distance INICIO FIM)) (setq ALPHA (angle INICIO FIM))

(setq NUMREP (fix (/ DISTANCIA INTERVALO))) (command "copy" pause "" "0,0" (strcat "@" (rtos INTERVALO) "<" (angtos ALPHA 0 4))) (repeat (- NUMREP 1) (command "copy" "last" "" "0,0" (strcat "@" (rtos INTERVALO) "<" (angtos ALPHA 0 4))) ) )

Funes de impresso:
princ: Imprime uma expresso na linha de comando ou num arquivo aberto. Se a expresso contm caracteres de controle (como \\, \", \e, \n, \t ....). estes so interpretados e executados, i.e.: \n equivale a uma nova linha. Igual a funo princ exceto que caracteres de controle no so interpretados e sim impressos literalmente. Igual a funo princ exceto que sempre imprime a expresso numa nova linha com um espao aps o que foi impresso.

prin1:

print:

Funo princ - sintaxe e exemplos:


Sintaxe:
(princ [expresso [nome-de-arquivo]])

Exemplos:
(setq A 123 B (A)) (princ 'A) ;imprime A e retorna A (princ A) ;imprime 123 e retorna 123 (princ B) ;imprime (A) e retorna (A) (princ "\nOla") ;imprime "Ola" numa nova linha e retorna "Ola" (princ "Ola" f) ;imprime "Ola" no arquivo f e retorna "Ola"

Homework:
Ler os captulos 4 e 5 de (Gal, 1997) ou captulos 5, 6, 7 e 8 de (Kramer&Kramer, 1995). Fazer o exericcio 4.3.3 (pgina 61) de (Gal, 1997), apresentado a seguir: Para utilizao dos recursos de repetio e contadores, crie uma rotina que pea ao usurio que clique um determinado ponto, onde estar supostamente um pilar. Nos pontos clicados, dever ser gerado o texto no formato Pn, onde n um nmero seqencial representando a numerao do pilar. Caso o usurio desejar, os pilares podero comear a ser numerados por qualquer valor. Isto dever ser uma opo a ser apresentada no incio do programa.

Aula 4/7 - Programando em AutoLISP


O ambiente de programao VitalLisp
por R. C. Ruschel, DCC-FEC-UNICAMP, Setembro 1997 O ambiente de programao VitalLisp - VILL:
O software VitalLisp (VILL) um ambiente de programo para a linguagem AutoLisp do AutoCAD. VitalLisp na WWW e-mail representante no Brasil O ambiente de programao VILL composto por: editor de texto (colorido ressaltado sintaxe do AutoLisp) "debugador" - verificador de cdigo: mensagens de erro + detalhadas associada a expresso errnea execuo controlada visualizador de variveis (watch) gerenciador de projetos: aplicaes compostas por + de um arquivo .lsp

Acesso ao VILL pelo AutoCAD:


1.Inicie o AutoCAD 2.Carrege o VILL: pelo TOOL/Applications: localize o arquivo VILL.EXE pelo File... faa um Load pela linha de comando digite (xload "c:/vill20.pro/r13/vill.exe") Obs: o caminho c:/vill20.pro pode variar dependendo da instalao do software. Verifique no seu microcomputador pessoal o caminho correto.

Transitando entre o VILL e o AutoCAD:


Do AutoCAD para o VILL: Digite VILL na linha de comando. Do VILL para o AutoCAD: Utiliza o alt+tab do windows. Se ambas janelas estivirem visveis clicar na janela desejada. Clicar no boto com o smbolo do AutoCAD no VILL.

Abrindo um arquivo AutoLisp no editor de texto do VILL:


Na janela do VILL: 1.Clicar FILE OPEN ou no cone do OPEN

2.Selecionar arquivo .lsp desejado, e.g.: c:\vill20.pro\examples\inyn.lsp 3.Clicar OK As opes no MENU WINDOW organizam a disposio da janela do editor, e.g.: tile horizontally

O colorido do editor:
VILL "color coding", e.g.: azul: funes internas (car, setq ...) verde: nmeros magenta: strings vermelho: parnteses preto: smbolos (nome de funes e variveis definidas pelo usurio) fundo cinza (background color): comentrios Ajuda visualizar erros de digitao.

Load de programas .lsp no VILL:


Como carregar (interpretar, ou executar um load) de um programa .lsp de dentro do editor do VILL: 1.Abrir o programa xxxx.lsp no editor do VILL. 2.Clicar no boto LOAD BUFFER 3.A janela do console (horizontal inferior) mostrar quantas formas (funes) foram interpretadas, e.g.: ;2 forms loaded from ....

Como executar funes:


No VILL digitar na janela do console (nome-da-funo), e.g.: (c:inyn) Obs: funes sempre devem ser chamadas entre parnteses, mesmo se foram definidas como comando. Somente o AutoCAD interpreta-as como comando. No AutoCAD na linha de comando digitar o nome da funo, e.g.: command: inyn Obs: o AutoCAD s consegue executar funes loaded pelo VILL se foram definidas como comando.

Sando do VILL:
Para concluir uma seo de trabalho no VILL escolher no MENU FILE a opo EXIT. Se o arquivo .lsp no editor de texto tiver sido alterado sem ter sido salvo, o VILL ir perguntar se deseja salvar o contedo do editor. Neste caso deve-se responder SIM ou NO.

Debugging - corrigindo programas:


Erros de programao podem ser de digitao, de sintaxe e/ou lgicos.

O VILL oferece os seguintes recursos para detectar e corrigir estes erros: execuo controlada do programa, acompanhamento visual de variveis, verificao da pilha de execuo do programa, mensagem de erro detalhada associada a expresso errnea, editor colorido enfatisando sintaxe da linguagem e formatador de texto.

Executando um programa no modo debug:


Um programa em Autolisp executado no modo debug por expresses entre parnteses (parenthentical expressions). Obs: um programa em Pascal executado no modo debug por linha de programao (i.e. por comando). Funcionalidades de debugging so controladas de vrios lugares do VILL: do editor, do console e/ou de menus. Para utilizar estas funcionalidades: Abrir o programa a ser "debugado" no editor de texto do VILL. Carregar o programa com LOAD BUFFER. Colocar um ou mais breakpoints no cdigo do programa.

Colocando breakpoints:
Breakpoints so pontos de pausa de execuo inseridos num programa para possibilitar sua verificao (debugging). Como inserir breakpoints: 1.V para o editor do VILL. 2.Posicione o cursor em frente ao parntese de abertura da expresso desejada. 3.Selecione: no MENU DEBUG a opo Set Breakpoint ou na TOOLBAR DEBUG o boto Set Breakpoint.

Executando um programa at um breakpoint:


1.V para a janela console do VILL. 2.Digite o nome da funo a ser executada seguida de um ENTER. 3.Responda aos prompts do programa no AutoCAD se necessrio. 4.Quando o programa alcanar o breakpoint a execuo far uma pausa. Nesse momento pode-se: pedir para visualizar variveis, executar o programa passo a passo ou continuar a execua at outro breakpoint , etc.

Executando o programa passo a passo:


Estando a execuo do programa em pausa num determinado breakpoint:

Para executar uma expresso selecione STEP na TOOLBAR RUN. Para entrar numa expresso selecione STEP IN na TOOLBAR RUN. Observe o cone STATUS BUTTON da TOOLBAR RUN que mostra onde o programa est parado, i.e.: antes de uma expresso I( ) ou depois de uma expresso ( )I.

Visualizando o valor de variveis:


Estando a execuo do programa em pausa num determinado breakpoint: Selecione no MENU DEBUG a opo Watch Last para visualizar o valor da ltima varivel atualizada. Selecione com um clique duplo no editor a varivel que deseja visualizar e escolha o sinal + na janela WATCH. Para retomar a execuo de um programa at o final do arquivo ou at outro breakpoint: Selecione o boto CONTINUE do TOOLBAR RUN.

Como fechar janelas no VILL:


possvel fechar quase todas janelas no VILL, basta dar um clique-duplo no cone correspondente (canto superior esquerdo) no cabealho da janela. A nica exceo a janela console do VILL. Essa janela nunca fecha.

Exemplo - Debugando o programa inyno.lsp:


1.Abra o arquivo f:\vill.pro\examples\inyno.lsp pelo MENU FILE/OPEN... 2.Este arquivo contm vrios erros tpicos de programao em Autolisp. 3.Veremos como: verificar o balanceamento de parnteses, verificar a sintaxe do programa, localizar erros de sintaxe atravs de mensagens de erro, achar a causa de erros que ocorrem na execuo, se deslocar da pilha de execuo com erro para o local do erro no cdigo.

Verificando balanceamento de parnteses:


1.Selecione MENU SOURCE/Format Autolisp in Buffer 2.O VILL ir formatar o cdigo. 3.Se um casamento errneo de parnteses for encontrado, a mensagem UNBALANCE OPENING BRACKET FOUND. ADD CLOSING BRACKET? YES/NO ser mostrada. Se for respondida comYES, um parntese adicionado no final do arquivo. Com certeza este no o lugar correto do parntese que est faltando. Portanto, percorra o cdigo no editor na procura do lugar correto. Com o cdigo formatado essa tarefa facilitada. 4.Coloque o parntese no lugar correto e apague o parntese acrescentado automaticamente no final do arquivo. 5.+ 1 x selecione SOURCE/Format Autolisp in Buffer.

Mecanismos de verificao de parnteses:

O MENU EDIT oferece os seguintes mecanismos para a verificao de parnteses: Match Forward: procura o ) correpondente a um abre parntese. Match Backward: procura ( correpondente a um fecha parntese. Select Forward: ilumina a expressa do parntese de abertura at o correspondente de fechamento. Select Backward: ilumina a expressa do parntese de fechamento at o correspondente de abertura.

Como verificar a sintaxe de um programa:


1.V para o editor do VILL. 2.Selecione no MENU SOURCE e a opo CHECK BUFFER. 3.Se uma mensagem erro aparecer na janela console porque existe erro de sintaxe. 4.D um clique-duplo sobre a mensagem de erro que a expresso errnea no programa iluminada. 5.A mensagem de erro dar uma indicao do tipo de erro que est ocorrendo.

Como utilizar o cdigo colorido para encontrar erros de sintaxe:


Como vimos anteriormente o cdigo em Autolisp no editor do VILL colorido. As cores tm significado, e.g.: azul = funes internas (car, setq ...) preto = smbolos (nome de funes e variveis definidas pelo usurio) ... comum digitarmos errado o nome de uma funo interna (e.g. iff para if ou iniget para initget ...). Como sabemos que toda lista de programa inicia com uma subr ou funo devemos observar a cor do tomo no incio de cada lista. Com certeza na sua maioria ser da cor azul. Portanto, preste ateno em listas que iniciam com um tomo preto. Verifique se existe um erro de digitao ou se o nome de uma funo definida no programa.

Erros de execuo:
Existem erros que s aparecem durante a execuo. Veja o exemplo a seguir: 1.Faa um LOAD BUFFER do programa inyno.lsp. 2.Execute-o digitando na janela de console (c:inyno). 3.Responda no AutoCAD as mensagens necessrais. 4.A mensagem de erro aparecer: ;***ERROR: bad argument type for compare: 36.0555 (155.0 155.0 0)

Inspecionando a pilha de execuo de um programa:


Quando um erro de execuo ocorrer: 1.Selecione no MENU INSPECT a opo INSPECT ERROR TRACE 2.Uma janela com o histrico dos clculos executados surgir, mostrando no topo a funo onde ocorreu o erro e abaixo as chamadas anteriores, at a chamada da funo principal. 3.Para ir ao local do erro via pilha de execuo: Selecione a linha na pilha contendo a expresso com o erro.

Clique o boto da direta do mouse e selecione a opo CALL POINT SOURCE Faa uma anlise, com recursos vistos anteriormente (e.g. visualizando valor de variveis), da causa do erro indicado .

Como salvar um programa:


Uma vez editado e debugado um programa deve-se salva-lo. V para o editor do VILL. Selecione no MENU FILE a opo SAVE. Confirme o nome do programa e subdiretrio onde o programa ser salvo.

O manual do VitalLisp:
Esta aula foi preparada a partir do Captulo Getting Started do Manual do VitalLisp. O manual deve sempre ser consultado para se obter melhor desempenho com o software. O manual composto pelos seguintes captulos: 1.Introduction 2.Getting started 3.The main features fo teh VILL user interface 4.The VILL windows 5.VitalLisp data inspection tools 6.Debugging in VILL 7.The VILL Autolisp emulation system 8.The Autolisp compiler 9.Building stand-alone applications 10.Managing multiple lisp files 11.The VILL command reference 12.Appendix 13.Glossary of terms 14.Index

Homework:
Para fixar os comandos do VILL apresentados em aula leia e execute tarefas do captulo Getting Started do manual do VitalLisp. Crie uma funo para subtrair uma box de um slido qualquer. As dimenses da box devem ser dadas clicando-se dois pontos na diagonal na base e o valor da altura. O desenho da box deve ser feito sobre o slido que sofrer a subtrao. A funo desenha a box a ser subtrada. O slido que sofrer a subtrao deve ser selecionado e a subtrao executada pela funo.

Aula 5/7 - Programando em AutoLISP


Manipulao de entidades
por R. C. Ruschel, DCC-FEC-UNICAMP, Setembro 1997 Dados das entidades (Kramer&Kramer, 1995 - pgina 160):
No Autolisp, o processo de acesso aos dados das entidades estende-se a vrios nveis da estrutura do banco de dados do AutoCAD. Conjuntos de seleo representam um nvel que contm listas de nomes de entidades. O nome da entidade um ponteiro para o BD onde os dados referentes entidade esto armazenados. Avanando um nvel, os dados de entidades esto na forma de uma lista de associaes. Esta hierarquia de dados e a habilidade de trabalhar dentro dela fornece um mecanismo flexvel para interfaceamento de aplicativos em Autolisp com a base de dados de desenho do AutoCAD.

Nome da entidade e sua Lista de dados:


A funo entlast obtm o nome da entidade que foi desenhada por ltimo no desenho. A funo entget obtm a lista de dados da entidade a partir de seu nome.
(setq entnome (entlast)) ;retorna <Entity name x...x> (setq entdados (entget entnome)) ;retorna ((-1 . <Entity name x...x>)(0 . "LINE") (8 ."0") ...)

A lista de dados uma lista de associaes. A maioria destas associaes so pares (cdigo . valor) denominados par pontuado (dotted par). A lista par pontuado composta por dois valores (o ponto no conta).

Exerccio - lista de dados de uma linha:


Desenhe uma linha. Obtenha seu nome: (setq ln(entlast)) Obtenha sua lista de dados: (setq ld(entget ln)) Obtenha o primeiro par pontuado da lista de dados: (setq par1 (car ld)) Obtenha o primeiro tomo do par pontuado: (car par1) Obtenha o segundo tomo do par pontuado: (cdr par1)

Funes cons, assoc e subst:


As funes de manipulao de entidade so: entdel, entget, entlast, entmake, entmod, entnext, entsel, entupd, handent, nentsel, nentselp, tblnext e tblsearch.

Entretanto, antes de apresentarmos cada uma deve-se conhecer as funes cons, assoc e subst, pois so muito utilizadas em conjunto com as funes de manipulao de entidades.

Funo cons:
Sintaxe: (cons primeiro-novo-elemento lista) acrescenta um novo elemento no incio da lista (cons primeiro-novo-elemento tomo) constri uma lista do tipo par pontuado Exemplos:
(cons 'a '(b c d)) ;retorna (A B C D) (cons '(a) '(b c d)) ;retorna ((A) (B C D)) (cons 'a 2) ;retorna (A . 2) (car (cons 'a 2)) ;retorna A (cdr (cons 'a 2)) ;retorna 2

Funo assoc:
Procura por um elemento numa lista de associaes e retorna a lista de associao em que o elemento participa. Sintaxe: (assoc item lista) Exemplo:
(setq a1 '((nome box) (largura 3) (comprimento 4.72) (altura 5))) (assoc 'largura a1) ;retorna (largura 3) (assoc 'peso a1) ;retorna nil

Funo subst:
Executa uma substituio de elemento numa lista. Sintaxe: (subst item-novo item-velho lista) Exemplos:
(setq lista '(a b (c d) b)) (subst 'qq 'b lista) ;retorna (A QQ (C D) QQ) e lista permanece = (setq lista (subst 'qq '(c d) lista)) ;retorna lista modificada para (A B QQ B) (subst '(qq rr) qq lista) ;retorna (A B (QQ RR) B) e lista permanece =

Funes entlast e entsel:


A funo entlast obtm o nome da entidade que foi desenhada por ltimo no desenho.
(entlast) ;retorna <Entity name: x...x>

A funo entsel similar a funo anterior, obtm nome de entidade; entretanto, entsel retorna uma lista composta pelo nome de uma entidade selecionada e o ponto de seleo.
(entsel) ;retorna (<Entity name: x...x> (3.5 5.5 6.8)) e ;a mensagem Select Object: ser utlizada. (entsel "\nSelecione um objeto:") ;retorna (<Entity name: x...x> (3.5 5.5 6.8)) e ;a mensagem incluida no prompt da funo ser utilizada

Funo entget:
Obtm a lista de dados de uma entidade a partir de seu nome. A lista de dados uma lista de associaes, algumas destas associaes so representadas por listas denominadas par pontuado (dotted par). Uma lista par pontuado formada por dois tomos (cdigo . valor) separados por um ponto (o ponto no conta como tomo da lista). Cada cdigo representa um tipo de valor: -1 est associado ao nome da entidade 0 est associado ao tipo da entidade "LINE", "ARC" ... 8 est associado ao nome da layer onde a entidade foi desenhada ... Ver lista de cdigos no Help/Topics/Contedo/AutoCAD Customization Guide/Apndice C -DXF Group Codes/Conventions/Numerical Order.

Exemplo de uso de entsel, entget e assoc:


Como obter o nome da layer de um objeto selecionado.
;obtm (<nome-da-entidade> (ponto-de-seleo)) (setq entnome (entsel)) ;obtm lista de dados da entidade selecionada (setq entdados (entget (car entnome))) ;obtm o par pontuado que contm o nome da layer da entidade (setq par-layer (assoc 8 entdados)) ;obtm o nome da layer da entidade (setq entlayer (cdr par-layer)) ;ou (cdr (assoc 8 (entget (car (entsel))))))

Funo entnext e entdel:


A funo entnext retorna o nome da primeira entidade desenhada no desenho ou da prxima entidade com relao a uma entidade determinada. Exemplos:
;armazena em ent o nome da primeira entidade desenhada no desenho (setq ent (entnext)) ;obtm o nome da entidade desenhada aps a entidade determinda (entnext ent)

A funo entdel elemina uma entidade pelo seu nome.


(entdel (entlast)); elimina a ltima entidade desenhada

Funo entmake:
Cria um novo objeto no desenho a partir de uma lista contendo informaes descritivas do objeto. Sintaxe: (entmake (lista-que-descreve-o-objeto)) Exemplo:
(entmake '( (0 . "LINE")

(8 . "0") (62 . 1) (10 3.0 4.0 0.0) (11 8.0 4.0 0.0) (210 0.0 0.0 1.0) ) )

Funo handent:
O handle da entidade um cdigo nico e permanente associado a cada entidade no desenho em qualquer seo de trabalho. O nome da entidade um cdigo dado a entidade que muda entre sees de trabalho. A funo handent obtm o nome da entidade a partir do handle da entidade.
(handent "cdigo-do-handle");retorna o nome da entidade

Mudana de nome de entidade:


Verifique a mudana de nome de entidade entre sees de trabalho com a permanncia do mesmo handle: 1.Desenhe um crculo e obtenha sua lista de dados. Anote o nome da entidade e o handle (valor do par pontuado de cdigo 5). 2.Salve o desenho e de um open no mesmo desenho. 3.+ 1 vez obtenha a lista de dados do crculo. Verifique que o nome da entidade modificou, mas o handle continua o mesmo.

Funo nentsel:
A funo nentsel acessa informaes de um objeto contido em outro objeto, e.g., objetos que compem um bloco. Exerccio: 1.Desenhe um bloco formado por um cculo dentro de um retngulo. O ponto de insero do bloco deve ser o centro do crculo. 2.Insira o bloco uma vez. 3.Obtenha o nome de entidade da insero do bloco com (entsel). 4.Para se obter o nome da entidade retngulo naquela insero do bloco utilize (nentsel) e clique sobre o retngulo. 5.Para se obter o nome da entidade crculo da mesma insero do bloco utilize (nentsel) e clique sobre o crculo. 6.Observe que na lista retornada por nentsel o primeiro elemento o nome da entidade componente e o ltimo elemento o nome da entidade bloco.

Funes entmod e entupd:


A funo entmod altera as caractersticas de uma entidade. A funo entupd atualiza a exibio de uma entidade alterada por entmod. entupd s necessria para alterar exibio de entidade compostas alteradas, e.g. polylines. no caso de entidade simples, e.g. crculos, arcos e etc, a prpria entmod atualiza caracteristicas e visualizao.

Exemplo do uso de entmod:


Funo que altera o raio de um crculo:
(defun c:raio () (setq vl (getreal "Novo raio: ")) (setq sair "N") (while (= sair "N") (setq ent (car (entsel "\nClique o circulo a ser modificado: "))) (setq dados (entget ent)) (print dados) (setq dados (subst (cons 40 vl) (assoc 40 dados) dados)) (entmod dados) (initget 1 "S N") (prompt "\nSair? (S/N) ")(setq sair (getkword)) ) )

Funes tblnext e tblsearch:


Pesquisa as tabelas de informaes num desenho sobre os seguintes recursos: LAYER, LTYPE, VIEW, STYLE, BLOCK, UCS, APPID, DIMSTYLE e VPORTS. Obs: na tabela de informaes sobre layers de um desenho cada layer definida compe uma linha da tabela. O mesmo vlido para cada recurso enumerado acima. A funo tblnext percorre linha por linha da tabela:
(tblnext "layer" T);retorna lista com primeira linha da tabela layers (tblnext "layer");retorna lista com a linha seguinte da tabela layers

A funo tblsearch procura por um tem na tabela:


(tblsearch "layer" "2d-par");retorna infos sobre layer 2d-par

Exerccio:
(defun c:tbllayer () ;obtenha a primeira linha da tabela de layers do desenho ;imprima a lista retornada ;enquanto no chegar no final da tabela (i.e. retorno de tblnext \= nil) ;obtenha proxima linha ;imprima lista retornada ;fim-do-enquanto )

Crie uma funo tblltype, equivalente a acima, para tipos de linhas (LTYPES).

Homework:
Ler os captulos 5 e 6 de (Gal, 1997) ou o captulo 10 de (Kramer&Kramer, 1995). Fazer o exerccio 6.3.2 (pgina 96 de Gal, 1997), apresentado a seguir:

Crie uma funo que, com base num crculo clicado, faa o desenho de uma flange apresentada abaixo, seguindo as reles entre as medidas cotadas: (nmero de furos constante = 10).

Aula 6/7 - Programando em AutoLISP


Conjuntos de seleo
por R. C. Ruschel, DCC-FEC-UNICAMP, Outubro 1997 Conjuntos de seleo:
Cada vez que um item (ou grupo de items) manuseado no AutoCAD, um conjunto de seleo est em operao. Conjuntos de seleo so listas especiais que contm os nomes das entidades dos itens selecionados. No AutoLisp um conjunto de seleo definido como um tipo de dado, assim como um real, integer ... O AutoLisp permite a criao de at 128 conjuntos de seleo por aplicao.

Como criar um conjunto seleo:


As funes ssadd e ssget criam conjuntos seleo dentro de programas em AutoLisp. Exemplo com a funo ssadd:
(setq ss1 (ssadd));cria um conjunto seleo vazio (ssadd (entlast) ss1); inclui o nome da ltima entidade criada no conjuntoseleo ss1 (setq ss2 ss1)

Garbage collection (remoo de lixo):


Mais de uma varivel pode estar associada ao mesmo conjunto seleo. Veja o exemplo anterior, ss1 e ss2 apontam para o mesmo conjunto. Se estas duas variveis forem ajustadas para nil e forem as nicas a apontarem para o conjunto seleo em questo, ento necessrio liberar o espao de memria que o conjunto seleo est ocupando. Essa atividade denominada garbage collection e executada pela funo gc. Exemplo:
(setq ss1 nil ss2 nil) (gc); libera espao de memria de qualquer conjunto seleo no associado a variveis.

Funo ssadd:
Cria um conjunto seleo vazio ou acrescenta entidades a um conjunto existente. Sintaxe: (ssadd [nome-de-entidade [conjunto-seleo]]) sem opes cria conjunto seleo vazio apenas com opo nome-de-entidade cria conjunto seleo composto pela entidade especificada com opes nome-de-entidade e conjuto-seleo acrescenta entidade a um conjunto seleo existente.

Exemplo:
(setq ss1 (ssadd)) ;retorna <Selection set: XX>

Funo ssget:
Cria um conjunto seleo a partir de uma seleo de objetos. Sintaxe: (ssget [mode] [pt1] [pt2] [pt-list] [filter-list]) onde mode: "P" (previous), "L" (last), "W"(window), "C" (crossing), "X" (all), "WP" (window poligon), "CP" (crossing poligon), "F" (fence). Exemplos:
(ssget "X") ;cria conjunto seleo com todas entidades do desenho (ssget "W" pt1 pt2);cria conj. sel. com objetos contidos na janela definida por pt1 e pt2 (ssget '((0 . "LINE"))); conj. sel. de linhas selecionadas individual/e

Exemplo de funes com ssget:


;;; conjunto seleo das entidades dentro da janela (defun c:seleciona-janela (/ p1 p2) (setq p1 (getpoint "\nPrimeiro canto:")) (setq p2 (getcorner p1 "\nSegundo canto:")) (setq ss1 (ssget "W" p1 p2)) ) ;;;conjunto seleo com todas linhas do desenho (defun c:ssline () (setq lineobjs (ssget "X" '((0 . "LINE")))) )

Utilizando conjuntos seleo:


;;; erase all (defun c:eall (/ ssall) (setq ssall (ssget "X")) (command "erase" ssall "") (command "redraw") (setq ssall nil)(gc) (princ) )

Funes sslenght e ssname:


A funo sslength retorna o nmero de entidades que compem um conjunto seleo. Sintaxe: (sslength conjunto-seleo) A funo ssname retorna o nome da entidade na posio x de um conjunto seleo. O primeiro elemento um conjunto seleo est na posio 0. Sintaxe: (ssname conjunto-seleo posio)

Exemplo de funo com sslength e ssname:

(defun c:sslist () (setq grupo (ssget)) (print grupo) (setq num (sslength grupo)) (print num) (setq cont 0) (repeat num (setq nome (ssname grupo cont)) (print cont) (princ nome) (setq cont (1+ cont)) ) (princ) )

Mais um exemplo - funo que seleciona maior linha:


(defun c:maior (/ gru num cont maior inicio fim dista mai-ent) (setq gru (ssget "X" '((0 . "LINE")))) (setq num (sslength gru)) (setq cont 0) (setq maior 0) (repeat num (setq inicio (cdr (assoc 10 (entget (ssname gru cont))))) (setq fim (cdr (assoc 11 (entget (ssname gru cont))))) (setq dista (distance inicio fim)) (if (>= dista maior) (progn (setq maior dista) (setq mai-ent (ssname gru cont)) ) ) (setq cont (1+ cont)) ) (alert "Clique OK para destacar\n a maior linha...") (redraw mai-ent 3) (gc) )

Exerccio:
Defina uma funo denominada ssredraw. A funo tem como parmetro de entrada o nome de um conjunto seleo. A funo deve aplicar um redraw com cdigo 3 em todas entidades que participam do conjunto seleo especificado. A sintaxe da funo redraw (redraw nome-de-entidade cdigo). Redefina a funo c:seleciona-janela apresentada anteriormente incluindo uma chamada para a funo ssredraw. Desta forma, os objetos selecionados sero destacados.

Funo ssmemb:
A funo ssmemb verifica se uma determina entidade pertence a um conjunto seleo. Se a entidade pertence ao conjunto seu nome retornado, seno a funo retorna nil. Sintaxe: (ssmemb nome-da-entidade conjunto-seleo) Exemplo:
(setq ss1 (ssget))

(ssmemb (car (entsel)) ss1)

Funo ssdel:
A funo ssdel remove uma entidade de um conjunto seleo. OBS: a entidade no apagada do desenho. Sintaxe: (ssdel nome-da-entidade conjunto-seleo) Exemplo:
(setq ss1 (ssget)) (ssdel (car (entsel)) ss1)

Homework:
Ler os captulos 7 e 8 de (Gal, 1997) ou o captulo 10 de (Kramer&Kramer, 1995).

Aula 7/7 - Programando em AutoLISP


Funes Geomtricas e Manipulao de Arquivos
por R. C. Ruschel, DCC-FEC-UNICAMP, Outubro 1997 Funes geomtricas:
As funes geomtricas do Autolisp so: distance, angle, polar, inters, cal, osnap e trans Essas funes permitem: desenhar rapidamente com preciso efetuar clculos envolvendo objetos desenhados obter o mximo de informao partindo do desenho permitir que o usurio entre com o mnimo de dados para que entidades sejam criadas

Funo distance:
Obtm a distncia entre dois pontos. Sintaxe: (distance ponto1 ponto2) Exemplo:
(setq p1 (getpoint "\nInsira um ponto:")) (setq p2 (getpoint "\nInsira outro ponto:")) (setq d (distance p1 p2))

Funo angle:
Obtm o ngulo em radianos de uma reta definida por dois pontos e o eixo X do UCS ou WCS corrente, medido no sentido anti-horrio. Sintaxe: (angle ponto1 ponto2) Exemplo:
(setq p1 (getpoint "\nInsira um ponto:")) (setq p2 (getpoint "\nInsira outro ponto:")) (setq a (angle p1 p2))

Funo polar:
Retorna um ponto em 3D do UCS corrente a partir de um ponto, ngulo (em radianos) e distncia especificados. Sintaxe: (polar ponto ang dist) Exemplo:
(setq p1 (getpoint "\nInsira um ponto:")) (setq p2 (polar p1 0.785398 1.414214))

Funo inters:
Obtm interseo de duas retas definidas cada uma por dois pontos. Sintaxe: (inters pnt1-r1 pnt2-r1 pnt1-r2 pnt2-r2) Exemplo:
(setq p1r1 (getpoint "\nInsira um ponto1 da primeira reta:")) (setq p2r1 (getpoint "\nInsira outro ponto:")) (setq p1r2 (getpoint "\nInsira um ponto1 da segunda reta:")) (setq p2r2 (getpoint "\nInsira outro ponto:")) (setq pint (inters p1r1 p2r1 p1r2 p2r2))

Funo osnap:
Retorna um ponto em 3D do UCS corrente resultado da aplicao de uma funo de preciso sobre um ponto especificado. As funes de preciso so: end, mid, int, appint, cen, qua, per, tan, nod, ins, nea ... Sintaxe: (osnap ponto "preciso") Exemplo:
(defun c:pontomediano (/ pt) (setq pt (getpoint "\Clique sobre uma reta:")) (setq pt (osnap pt "nea")) (setq ptmid (osnap pt "mid")) )

Funo trans:
Translada um ponto de um sistema de coordenadas para outro sistema de coordenadas. Sintaxe: (trans pnt sc-orig sc-dest [disp]) sc-orig e sc-dest espeficam os sistemas de coordenadas original e destino. Estes argumentos podem ser: cdigos (0 para WCS,1 para UCS corrente, 2 para UCS do view, 3 para paperspace) nomes de entidade (obtidos com entnext, entlast, entsel, nentsel e ssname) um vertor de extruso em 3D disp se presente e no-nulo especifica que pnt deve ser tratado com um deslocamento em 3D e no um ponto.

Funo trans - exemplos:


Se o UCS corrente foi obtido da mudana de origem para 10,10,10 ento:
(setq p (list 0 0 0)) (trans p 0 1) ;retorna (-10.0 -10.0 -10.0) (trans p 1 0) ;retorna (10.0 10.0 10.0)

Para se converter pontos em 2D para 3D:

(setq ponto (list 1 2)) (trans ponto 0 1);acrescenta z=0 no ponto (trans ponto 1 0);acrescenta z = z do UCS corrente no ponto

Exemplo - funes trans e polar:


(defun c:tr (/ centro1 centro2 ncentro dia) (command "ucs" "") ;ajustando ucs para wcs (setq centro1 (getpoint "Escolha o centro da rotao:")) (setq dia (getreal "Diametro do crculo:")) (setq centro2 (polar centro1 0 (* 2 dia))) ;centro do primeiro crculo (command "circle" centro2 (/ dia 2)) ;desenhando 1o. crculo centro+raio (repeat 10 (command "ucs" "y" "36") ;gira ucs entorno do eixo y 36graus (setq ncentro (trans centro1 0 1)) ;transladanco centro1 para novo ucs (setq centro2 (polar ncentro 0 (* 2 dia))) ;centro do prximo crculo (command "circle" centro2 (/ dia 2)) ;desenhando prximo crculo ) )

Manipulao de arquivos ASCII:


A manipulao de arquivos consiste em armazenar informaes obtidas durante uma sesso do AutoCAD em arquivos para uso posterior. O Autolisp permite que dados sejam gravados e lidos a partir de arquivos escritos no padro ASCII. As funes de manipulao de arquivos ASCII pelo Autolisp so: de abertura e fechamento de arquivo: open e close de leitura: read-char e read-line de escrita: write-char, write-line, princ, print, prin1

Abrindo arquivos:
Quando um arquivo ASCII aberto pelo Autolisp, o registro da sua abertura deve ficar gravado numa varivel especificada no programa. Essa varivel representa o arquivo dentro do programa. Sempre que se deseja referir ao arquivo dentro do programa, deve-se referir a essa varivel. Um arquivo pode ser aberto para: leitura escrita leitura e escrita

Funo open:
Sintaxe: (open "unidade:\\subdir\\arquivo.txt" "cdigo") onde "cdigo" pode ser: r (para leitura), w (para escrita) e

a (para leitura e escrita) Exemplos:


(setq LE (open "c:\\lista.txt" "r")) (setq GRAVA (open "c:\\trab\\lista.txt" "w")) (setq INCRE (open "c:\\tmp\\lista.txt" "a"))

Funes de escrita em arquivos ASCII:


As funoes write-char, write-line, princ, print e prin1 escreverm (gravam) informaes em um arquivo ASCI aberto para escrita ou leitura e escrita. Sintaxe: (comando-de-escrita informao arquivo) Exemplo:
(defun c:abrearq () ;abre arquivo para escrita e zera contedo se arquivo j existia (setq arq (open "c:\\trab\\arquivo.txt" "w")) (princ "FEC215 - Curso de Extensao " arq) (setq ano 1997) (princ ano arq) (write-line "utilizando autocad r13 windows" arq) (close arq) )

Comandos de leitura:
As funes read-line e read-char so funes que lem dados de arquivos ASCII. Sintaxe: (read-line arquivo) ;retorna linha lida (read-char arquivo) ;retorna cdigo do caracter lido Exemplo: (setq caracter (chr (read-char arq)))

Exemplo - funo read-line:


(defun c:learq () (setq arq (open "c:\\trab\\arquivo.txt" "r")) (if (= arq nil) (alert "Open Invlido!") (progn (setq linha (read-line arq)) (while (/= linha nil) (print linha) (setq linha (read-line arq)) ) ) ) (princ) )

Homework:
Ler os captulos 7 e 8 de (Gal, 1997) ou o captulo 10 de (Kramer&Kramer, 1995). Exerccio 8.3.2 sugerido por Gal na pgina 119:

Crie uma funo que, tendo como base o desenho de um pilar formado por quatro linhas, insira um texto indicando as suas dimenses (ex. P1 (20x50), P2 (60x30)) Pgina confeccionada por RCR. ltima atualizao em 15-10-1997.