curso de lisp

Upload: jrphoto

Post on 19-Jul-2015

869 views

Category:

Documents


3 download

TRANSCRIPT

Aula 1/7 - Programando em AutolispIntroduopor 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/ : 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 AutoLISPClculos, Variveis e ListasProfa. 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 mediatestesCommand: (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 AutoLISPControle de fluxo. Get???s e Prin?s.por R. C. Ruschel, DCC-FEC-UNICAMP, Agosto 1997 Funo condicional - if:

Figura A: If A