AutoLISP - VII Funções Geométricas, de Strings, de Listas e de Manipulação de Arquivos João Manuel R. S. Tavares Joaquim Oliveira Fonseca Funções geométricas As funções geométricas do AutoLISP são: distance, angle, polar, inters, cal, osnap e trans Essas funções permitem: – – – – 2 desenhar rapidamente e com precisão; efetuar cálculos envolvendo os objetos desenhados; obter o máximo de informação a partir do desenho; permitir que o utilizador introduza o mínimo de dados para que entidades sejam criadas. 2011@JST/JOF CFAC: AutoLISP (VII) - Funções Geométricas, de Strings, de Listas e de Manipulação de Arquivos Função distance Obtém a distância entre dois pontos. Sintaxe: (distance ponto1 ponto2) Exemplo: (setq p1 (getpoint "\nInsira um ponto:")) (setq p2 (getpoint p1 "\nInsira outro ponto:")) (setq d (distance p1 p2)) 3 2011@JST/JOF CFAC: AutoLISP (VII) - Funções Geométricas, de Strings, de Listas e de Manipulação de Arquivos Função angle Obtém o ângulo em radianos de uma reta definida por dois pontos e o eixo X do UCS ou WCS corrente, medido no sentido anti-horário. Sintaxe: (angle ponto1 ponto2) Exemplo: (setq p1 (getpoint "\nInsira um ponto:")) (setq p2 (getpoint p1 "\nInsira outro ponto:")) (setq a (angle p1 p2)) 4 2011@JST/JOF CFAC: AutoLISP (VII) - Funções Geométricas, de Strings, de Listas e de Manipulação de Arquivos Função polar Retorna um ponto em 3D do UCS corrente a partir de um ponto, de um ângulo (em radianos) e de uma distância (coordenadas relativas polares). Sintaxe: (polar ponto ang dist) Exemplo: (setq p1 (getpoint "\nInsira um ponto:")) (setq p2 (polar p1 0.785398 141.5)) 5 2011@JST/JOF CFAC: AutoLISP (VII) - Funções Geométricas, de Strings, de Listas e de Manipulação de Arquivos Função inters Obtém a intersecção de duas retas, cada uma definida por dois pontos. Sintaxe: (inters pnt1-r1 pnt2-r1 pnt1-r2 pnt2-r2 [onseg]) (onseg é opcional e pode ter nil – considera retas infinitas ou T) Exemplo: (setq p1r1 (getpoint "\nInsira um ponto da primeira reta:")) (setq p2r1 (getpoint p1r1 "\nInsira outro ponto:")) (setq p1r2 (getpoint "\nInsira um ponto da segunda reta:")) (setq p2r2 (getpoint p1r2 "\nInsira outro ponto:")) (setq pint (inters p1r1 p2r1 p1r2 p2r2)) 6 2011@JST/JOF CFAC: AutoLISP (VII) - Funções Geométricas, de Strings, de Listas e de Manipulação de Arquivos Função osnap 7 Retorna um ponto em 3D do UCS corrente resultado da aplicação de uma função de precisão (osnap) através de um ponto especificado. Os modos de precisão (opções osnap) são: end, mid, int, appint, cen, qua, per, tan, nod, ins, nea ... Sintaxe: (osnap ponto “modo") 2011@JST/JOF CFAC: AutoLISP (VII) - Funções Geométricas, de Strings, de Listas e de Manipulação de Arquivos Função osnap Exemplo: (seleção do ponto médio de uma reta especificada) (defun c:pontomediano(/ pt) (setq pt (getpoint "\nClique sobre uma reta:")) (Ponto mais próximo.) (setq pt (osnap pt "nea")) (Ponto mediano.) (setq ptmid (osnap pt "mid")) ) 8 2011@JST/JOF CFAC: AutoLISP (VII) - Funções Geométricas, de Strings, de Listas e de Manipulação de Arquivos Função trans Translada um ponto de um sistema de coordenadas para um outro sistema de coordenadas. Sintaxe: (trans pnt sc-orig sc-dest [disp]) sc-orig e sc-dest especificam os sistemas de coordenadas original e destino. Estes argumentos podem ser: – – – 9 códigos (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 vetor de extrusão em 3D. disp se presente e não-nulo, especifica que pnt deve ser tratado com um deslocamento em 3D e não um ponto. 2011@JST/JOF CFAC: AutoLISP (VII) - Funções Geométricas, de Strings, de Listas e de Manipulação de Arquivos Função trans - exemplos Se o UCS corrente foi obtido da mudança de origem para o ponto (10,10,10), então: (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 ao ponto (trans ponto 1 0) ; acrescenta z = z do UCS corrente ao ponto 10 2011@JST/JOF CFAC: AutoLISP (VII) - Funções Geométricas, de Strings, de Listas e de Manipulação de Arquivos Exemplo - funções trans e polar (defun c:tr(/ centro1 centro2 ncentro dia) (command "ucs" "") ; ajustando o ucs para wcs (setq centro1 (getpoint "Escolha o centro da rotação:")) (setq dia (getreal "Diametro do círculo:")) (setq centro2 (polar centro1 0 (* 2 dia))) ; centro do primeiro círculo (command "circle" centro2 (/ dia 2)) ; desenho do 1º círculo, centro+raio (repeat 10 (command "ucs" "y" "36") ; roda ucs em torno do eixo Y 36º (setq ncentro (trans centro1 0 1)) ; translada centro1 para o novo ucs (setq centro2 (polar ncentro 0 (* 2 dia))) ; centro do próximo círculo (command "circle" centro2 (/ dia 2)) ; desenha o próximo círculo ) ) Exemplo do resultado (circles) 11 2011@JST/JOF CFAC: AutoLISP (VII) - Funções Geométricas, de Strings, de Listas e de Manipulação de Arquivos Funções para Strings Strings – conjunto de caracteres – – – – – 12 getstring: leitura de uma string a partir do teclado; read-line/write-line: leitura/escrita de uma string de um/num arquivo; substr: obtenção de uma substring a partir de uma string original, por ex: (substr "abcde" 2 1) devolve “b”; strlen: devolve o número de caracteres de uma string; strcat: realiza a concatenação (“soma”) de strings, por ex: (strcat "a" "bout") devolve “about”. 2011@JST/JOF CFAC: AutoLISP (VII) - Funções Geométricas, de Strings, de Listas e de Manipulação de Arquivos Mais funções para Listas 13 append: junta listas numa única lista, por ex: (append '(a b) '(c d)) retorna (A B C D); list: cria uma lista, por ex: (list 3.9 6.7) retorna (3.9 6.7); nth: retorna o elemento de uma lista que ocupa uma determinada posição (o 1º elemento corresponde à posição 0), por ex: (nth 3 '(a b c d e)) retorna d. 2011@JST/JOF CFAC: AutoLISP (VII) - Funções Geométricas, de Strings, de Listas e de Manipulação de Arquivos Manipulação de arquivos ASCII A manipulação de arquivos consiste em armazenar informação (e também ler ...) obtida durante uma sessão do AutoCAD em arquivos para uso posterior. O AutoLISP permite que dados sejam gravados e lidos a partir de arquivos escritos no padrão ASCII. As funções de manipulação de arquivos ASCII em AutoLISP são: – – – 14 de abertura e fecho de arquivos: open e close de leitura: read-char e read-line de escrita: write-char, write-line, princ, print, prin1 2011@JST/JOF CFAC: AutoLISP (VII) - Funções Geométricas, de Strings, de Listas e de Manipulação de Arquivos Abrir arquivos Quando um arquivo ASCII é aberto pelo AutoLISP, o registro da sua abertura deve ficar associado a uma variável especificada no programa. Essa variável aponta para o arquivo dentro do programa. Sempre que se deseja referir esse arquivo dentro do programa, deve-se referir a correspondente variável associada. Um arquivo pode ser aberto para: – – – 15 leitura; escrita; leitura e escrita. 2011@JST/JOF CFAC: AutoLISP (VII) - Funções Geométricas, de Strings, de Listas e de Manipulação de Arquivos Função open Sintaxe: (open "unidade:\\subdir\\arquivo.txt" "código") – onde "código" pode ser: r (para leitura); w (para escrita); 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")) 16 2011@JST/JOF CFAC: AutoLISP (VII) - Funções Geométricas, de Strings, de Listas e de Manipulação de Arquivos Funções de escrita em arquivos ASCII As funções write-char, write-line, princ, print e prin1 escrevem (gravam) informação num arquivo ASCII previamente aberto para escrita ou para leitura e escrita. Sintaxe: (comando-de-escrita informação arquivo) (Variável associada) 17 2011@JST/JOF CFAC: AutoLISP (VII) - Funções Geométricas, de Strings, de Listas e de Manipulação de Arquivos Funções de escrita em arquivos ASCII Exemplo: (defun c:abrearq() ;abre arquivo para escrita e apaga o conteúdo se o arquivo ;já existir (setq arq (open "c:\\trab\\arquivo.txt" "w")) (princ "CFAC " arq) (setq ano 2009) (princ ano arq) (write-line “Utilizando autocad" arq) (close arq) ; fecha o arquivo ) 18 2011@JST/JOF CFAC: AutoLISP (VII) - Funções Geométricas, de Strings, de Listas e de Manipulação de Arquivos Comandos de leitura As funções read-line e read-char são funções que leem dados a partir de arquivos ASCII. Sintaxe: (read-line arquivo) ; retorna a linha lida (read-char arquivo) ; retorna o código ascii do ; caracter lido Exemplo: (setq caracter (chr (read-char arq))) (Conversão ascii -> caracter.) 19 2011@JST/JOF CFAC: AutoLISP (VII) - Funções Geométricas, de Strings, de Listas e de Manipulação de Arquivos Exemplo - função read-line 20 (defun c:learq() (setq arq (open "c:\\trab\\arquivo.txt" "r")) (if (= arq nil) (alert "Open Inválido!") ; erro na abertura do file (progn (setq linha (read-line arq)) (Escrita de todas (while (/= linha nil) as linhas do (print linha) ficheiro.) (setq linha (read-line arq)) ) ) ) (princ) ) CFAC: AutoLISP (VII) - Funções Geométricas, de Strings, de Listas e de 2011@JST/JOF Manipulação de Arquivos