






















































































Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Breve introducción a autolisp en autocad
Tipo: Transcripciones
1 / 94
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!























































































Programación en AutoLisp
Computación Gráfica 145
Tema 6
A parte de todo lo visto en cuestión de personalización, AutoCAD 14 ofrece al usuario la posibilidad de crear programas y aplicaciones verticales totalmente funcionales. Estos programas podrán ser distribuidos por el creador, eso sí, siempre correrán bajo AutoCAD.
La capacidad para hacer un programa nos lleva mucho más allá de la simple personalización de menús o patrones de sombreado, nos lleva a un mundo totalmente integrado en AutoCAD desde donde podremos diseñar nuestros propios comandos, manipular dibujos o incluso acceder a la Base de Datos interna del programa.
AutoCAD 14 proporciona diversas interfaces de programación de aplicaciones que vamos a comentar ahora de forma somera.
Dentro de lo que es la programación existen diversas interfaces para crear programas para AutoCAD. El más antiguo y, quizá el más utilizado hasta ahora, es AutoLISP. AutoLISP es una adaptación del lenguaje de programación LISP que forma parte íntima e integrada con AutoCAD , esto es, AutoCAD posee internamente un propio intérprete de LISP.
El lenguaje LISP está basado en lo que se denominan listas de símbolos. Es un lenguaje de alto nivel (como BASIC) y que, en principio, fue diseñado para la investigación en el campo de la inteligencia artificial. AutoLISP es un lenguaje evaluado, es decir, está a un paso entre los lenguajes interpretados, por un lado, y los lenguajes compilados, por otro.
Como hemos dicho, AutoCAD provee al usuario de un propio intérprete de AutoLISP interno. Este intérprete, al que habría que llamarle evaluador , se encarga —precisamente— de evaluar las expresiones incluidas en el código fuente de un programa. Estos programas pueden introducirse directamente desde la línea de comandos de AutoCAD , o bien cargarse en memoria a partir de un programa completo escrito es un archivo de texto ASCII. Dichos archivos tendrán habitualmente la extensión .LSP.
A partir de la Versión 14 existe un nuevo entorno de desarrollo denominado Visual Lisp que permite realizar aplicaciones en AutoLISP de una manera más rápida y efectiva. Este entorno proporciona herramientas para desarrollar y depurar las rutinas y compilarlas como aplicaciones ARX. También dispone de su propio evaluador, que emula al de AutoLISP, además de un completo control de codificación y seguridad de las rutinas creadas.
146 Dpl. Ing. Carlos Balderrama Vásquez
Tema 6
Atendiendo a sus características podemos definir varios tipos de objetos y datos en AutoLISP, que son los de la tabla siguiente:
Objeto o dato
Lista Objeto que se compone de elementos encerrados entre paréntesis.
Elemento Cualquiera de los componentes de una lista.
Símbolo Cualquier elemento de una lista que no sea una constante.
Enteros Valores numéricos enteros, sin punto decimal.
Reales Valores numéricos con coma flotante de doble precisión.
Cadenas Valores textuales que contienen cadenas de caracteres en código ASCII.
Descriptores de archivo Valores que representan un archivo abierto para lectura o escritura.
Nombres de objetos de dibujo Valores que representan el "nombre" hexadecimal de un objeto de la Base de Datos.
Conjuntos designados de AutoCAD Valores que representan un conjunto de elección de objetos de dibujo.
Funciones de usuario Símbolo que representa el nombre de una función definida por el usuario.
Función inherente o subrutina Símbolo con el nombre de una función predefinida de AutoLISP.
La base de todo intérprete de LISP es su algoritmo evaluador. Éste analiza cada línea de programa y devuelve un valor como resultado. La evaluación sólo se realizará cuando se haya escrito una lista completa y ésta podrá ser cargada desde un archivo de texto o tecleada directamente en la línea de comandos de AutoCAD 14.
El primer elemento de la lista debe ser por tanto un nombre de función. El resto de elementos se consideran argumentos de dicha función. La evaluación en AutoLISP se realiza de acuerdo a las siguientes reglas.
148 Dpl. Ing. Carlos Balderrama Vásquez
Programación en AutoLisp
(SETQ sx (SIN (* PI (/ x 180.0))))
La lista más "interior" contiene como primer elemento el nombre de la función de AutoLISP / que realiza el cociente o división del siguiente elemento entre los restantes. La evaluación de dicha lista devuelve el resultado del cociente, en este caso el valor contenido en la variable x dividido entre el número real 180.0. Dicho valor es utilizado como elemento en la lista circundante que empieza por la función de AutoLISP * que realiza una multiplicación o producto. Esta lista se evalúa ofreciendo como resultado el producto de PI (3,14159) por el valor anterior. A su vez el resultado interviene como argumento en la lista que empieza por la función de AutoLISP SIN, que es evaluada obteniéndose el seno. Este interviene por último como argumento de la lista más exterior que empieza por la función de AutoLISP SETQ , cuyo resultado es asignar o almacenar en la variable sx el valor del seno. Este valor es devuelto por la lista de SETQ como resultado final.
Comando: (SETQ sx (SIN (* PI (/ x 180.0)) 2 > ))
Comando: !sx
Computación Gráfica 149
Programación en AutoLisp
comillas, punto y coma, espacio en blanco o final de línea en el archivo. Estos caracteres sirven de separación entre elementos de una lista.
Existen unos valores de símbolos de AutoLISP predefinidos. Son los siguientes:
A partir de ahora vamos a comenzar a ver poco a poco la manera de ir haciendo nuestros programas en AutoLISP. Vamos a seguir un orden lógico de menor a mayor dificultad, por lo que la estructura puede llegar a parecer un poco caótica para alguien que conozca el lenguaje. Tampoco es objetivo de este curso profundizar en un método complejo de programación, sino proponer unas bases para comenzar a programar que, con imaginación y horas de trabajo, podrá convertirnos en programadores expertos de AutoLISP.
Las convenciones utilizadas para las sintaxis en estecapítulo van a ser las siguientes:
Computación Gráfica 151
Tema 6
Explicaremos aquí la manera en que se realizan en AutoLISP las operaciones matemáticas, de comparación y lógicas. El buen aprendizaje de estás técnicas nos será tremendamente útil a la hora de lanzarnos a la programación pura.
Para realizar las cuatro operaciones aritméticas básicas existen cuatro funciones AutoLISP que son +, -, * y /, estas se corresponden con la suma, resta, multiplicación y división.
La función de suma tiene la siguiente sintaxis:
(+ [valor1 valor2 valor3...] )
Esto es, primero se indica el nombre de la función, como siempre en AutoLISP, que en este caso es + y luego los argumentos de la misma, es decir, aquí los valores de los distintos sumandos.
Esta función devuelve el resultado aditivo de todos los valores numéricos especificados como argumentos de la función. Por ejemplo:
(+ 14 10 20)
devolvería el valor 44. Para hacer la prueba únicamente debemos escribir dicho renglón en la línea de comandos de AutoCAD , pulsar INTRO y comprobar el resultado.
NOTA: Al introducir el primer carácter de apertura de paréntesis, AutoCAD reconoce que se está escribiendo una expresión en AutoLISP, por lo que nos permitirá utilizar los espacios necesarios de la sintaxis sin que se produzca un INTRO cada vez, como es habitual. Recordemos que todos los elementos de una lista de AutoLISP han de ir separados por lo menos con un espacio blanco. Probemos diferentes sintaxis utilizando más espacios, o tabuladores, y comprobemos que el resultado es el mismo; se interpretan los espacios o tabuladores como un único carácter de espacio en blanco.
Con la función + podemos indicar valores enteros o reales. Si todos los valores son enteros el resultado será entero, pero si uno o varios de ellos son reales —o todos ellos—, el resultado será real. Esto significa que únicamente es necesario introducir un valor real para recibir una respuesta real. Por ejemplo, si introducimos la siguiente línea en la línea de comandos en AutoCAD :
(+ 14 10 20.0)
el resultado será:
152 Dpl. Ing. Carlos Balderrama Vásquez
Tema 6
da como resultado 3. Esto es producto de restar 10 – 5 = 5 y, luego, 5 – 2 = 3 ; o lo que es lo mismo 10 – (5 + 2) = 3.
Al igual que en la suma, si se indican valores enteros el resultado será entero, si se indica uno real (con uno es suficiente) el resultado es real, si se indica un solo valor se devuelve el mismo valor y si se escribe la función sin argumentos se devuelve 0. Así pues, si queremos un resultado real efectuado con números enteros para posteriores operaciones, deberemos indicar uno de los valores entero; de la siguiente manera, por ejemplo:
(- 10 5.0 2)
o cualquier otra combinación posible de uno o más números enteros.
Como se ha explicado para la suma, los valores de los argumentos para la resta pueden ser constantes, eso sí, siempre numéricas, o variables:
(- tot num1 num2)
Llegados a este punto, podemos suponer ya las diferentes combinaciones que podremos realizar con las distintas funciones aritméticas. Por ejemplo, es factible la evaluación de la siguiente expresión:
(+ 12 (- 2 -3))
cuyo resultado es 11. O sea, y como hemos explicado, se realizarán las operaciones de dentro a fuera. En este ejemplo, se suma la cantidad de 12 a la diferencia 2 – 3, esto es _, 12
(- fer1 (+ -sum1 sum2) 23.44)
Con respecto al producto su sintaxis es la siguiente:
(* [valor1 valor2 valor3...] )
Se evalúa el producto de todos los valores numéricos indicados como argumentos. Como anteriormente, si un valor es real el resultado es real. Un solo valor como argumento devuelve el mismo valor. Ningún valor devuelve 0. Veamos un ejemplo:
(* 12 3 4 -1)
El resultado es -144. Veamos otros ejemplos:
(* 2 3) (* val (- vax vad))
154 Dpl. Ing. Carlos Balderrama Vásquez
Programación en AutoLisp
(+ (- -10 -5) (* 3 total 23))
La sintaxis de la división es la que sigue:
(/ [valor1 valor2 valor3...] )
La función / realiza el cociente del primer valor numérico por todos los demás, es decir, divide el primer número por el producto de los demás. Por ejemplo:
(/ 10 2)
da como resultado 5. Y el ejemplo siguiente:
(/ 100 5 5)
da como resultado 4, es decir, 100 / 5 = 20 y, luego, 20 / 5 = 4 ; o lo que es lo mismo , 100 / (5 * 5) = 4.
Otros dos ejemplos:
(/ 24 (* (+ 10.0 2) 12)) (/ 12 2 1)
Con respecto al cociente debemos realizar las mismas observaciones anteriores, esto es, si se indica un solo valor se devuelve el mismo valor, si se indica la función sin argumentos se devuelve 0 y si se indican valores enteros sólo se devuelven valores enteros. Esto último cobra especial sentido en el caso de las divisiones, ya que el cociente entre dos números enteros puede ser un número real. Veamos el siguiente ejemplo:
(/ 15 7)
Si introducimos esta línea el resultado será 2. El motivo es que, como hemos especificado valores enteros, el resultado se muestra en forma de número entero, con la parte decimal o mantisa truncada. Para asegurarnos de recibir una respuesta correcta (con decimales significativos), deberemos introducir uno de los valores —o todos ellos, pero con uno es suficiente— como valor real, de la siguiente forma:
(/ 15 7.0)
Ahora el resultado será 2.14286. El número entero podría haber sido el otro:
(/ 15.0 7)
Computación Gráfica 155
Programación en AutoLisp
Esta función AutoLISP devuelve el resto del cociente (módulo) de los dos valores introducidos en principio. Por ejemplo, la siguiente expresión devuelve 6 como resultado:
(REM 20 7)
Dicho 6 es el resto que resulta de dividir 20 / 7. Si aplicamos la regla de la división (dividendo es igual a divisor por cociente más resto): 20 = 7 * 2 + 6 , vemos que se cumple correctamente.
Si se especifican más de dos valores, el resto anterior es dividido entre el actual, devolviendo el nuevo resto de la nueva división. Por ejemplo:
(REM 20 7 4)
da como resultado 2. El primer resto 6 se calcula de la forma explicada en el ejemplo anterior y, el resultado final 2, se produce al dividir dicho primer resto entre el tercer valor
Otros ejemplos:
(REM –1 2) (REM 0 23) (REM (* 23 2) (- (+ 1 1) 45.5)) (REM 54 (* 3 -4))
Pasemos ahora a ver las funciones trigonométricas, esto es, cómo calcularlas mediante AutoLISP. La primera sintaxis se refiere al seno de un ángulo y es la siguiente:
(SIN ángulo )
La función SIN devuelve el seno de un ángulo expresado en radianes. Ejemplos:
(SIN 1) devuelve 0. (SIN (/ PI 2)) devuelve 1.
NOTA: Como sabemos PI es un constante de AutoLISP, por lo que no hace falta declararla como variable; ya tiene valor propio y es 3.14159. Aún así, se puede calcular su valor exacto mediante la expresión: PI = 4 * arctag 1.
(COS ángulo )
COS devuelve el coseno de un ángulo expresado en radianes. Ejemplos:
(COS PI) devuelve –1. (COS (* 3 4)) devuelve 0.
Computación Gráfica 157
Tema 6
NOTA: Nótese que PI es un valor real, por lo que el resultado será real.
(ATAN valor1 [valor2] )
Esta función ATAN devuelve el arco cuya tangente es valor1 expresada en radianes, es decir, realiza el arco-tangente de dicho valor. Por ejemplo:
(ATAN 1.5) devuelve 0.
Si se indica un segundo valor (valor2), ATAN devuelve el arco-tangente de valor1 dividido por valor2. Esto permite indicar la razón entre los lados de un triángulo recto, es decir, escribir la tangente directamente como cociente del seno entre el coseno. Si valor2 es 0, el valor devuelto será igual a PI / 2 o a –PI / 2 radianes, dependiendo del signo de valor1.
Ejemplos:
(ATAN 1 1) (ATAN 1 (* 2 -4.5))
Estas son las tres funciones trigonométricas de AutoLISP. En este punto se nos plantean un par de problemas: ¿cómo calculo las restantes funciones trigonométricas? y ¿cómo convierto grados sexagesimales en radianes y viceversa?
La segunda cuestión es sencilla, ya que basta aplicar al fórmula rad = grados * PI / 180 para convertir grados en radianes. La operación inversa en fácilmente deducible.
La primera pregunta tiene una respuesta no menos sencilla, y es que en la mayoría —por no decir todos— de los lenguajes de programación únicamente nos proporcionan estas funciones trigonométricas básicas y, a partir de ellas, podemos calcular las funciones trigonométricas derivadas inherentes. La manera se explica a continuación mediante notación sencilla de una línea:
Función derivada tación
Secante (sec x) cos (x) Cosecante (cosec x) sen (x) Arco-seno (arcsen x) arctag (x / Ö (1 – x ^ 2)) Arco-coseno (arccos x) 1.5707633 – arctag (x / Ö (1 – x ^ 2)) Arco-secante (arcsec x) arctag (Ö (x ^ 2 – 1)) + signo (x) –1) * 1. Arco-cosecante (arccos x) arctag (1/ Ö (x ^ 2 – 1)) + signo (x) –1) * 1. Arco-cotang. (arccotag x) 1.5707633 – arctag (x)
NOTA: El símbolo ^ significa exponenciación. Ö es raíz cuadrada. signo (x) se refiere al signo del valor; si éste es positivo signo (x) valdrá 1, si es negativo valdrá –1 y si es cero valdrá 0. No debemos preocuparnos ahora por esto, ya que aprenderemos en breve o más
158 Dpl. Ing. Carlos Balderrama Vásquez
Tema 6
NOTA: El intento de extraer raíces negativas de cualquier índice producirá el mismo error explicado en SQRT.
(EXP exponente )
Esta función devuelve la constante (número) e elevada al exponente indicado. Se corresponde con el antilogaritmo natural. Por ejemplo:
(EXP 1) devuelve 2.
(LOG valor )
LOG devuelve el logaritmo neperiano o natural (en base e ) del valor indicado. Por ejemplo:
(LOG 4.5) devuelve 125.
(GCD valor_entero1 valor_entero2 )
Esta sintaxis se corresponde con la función de AutoLISP GCD, que devuelve el máximo común denominador de los dos valores indicados. Estos valores han de ser obligatoriamente enteros, de no ser así, AutoLISP devuelve bad argument type como mensaje de error. Veamos unos ejemplos:
(GCD 45 80) devuelve 5 (GCD 80 70) devuelve 10 (GCD (* 10 10) (/ 70 2)) devuelve 5
Si se indica un entero negativo el mensaje de error de AutoLISP es improper argument.
Las dos últimas funciones matemáticas que veremos pueden sernos de gran ayuda a la hora de programar. Una de ellas (MAX) devuelve el mayor de todos los números indicados en la lista. Su sintaxis es:
(MAX valor1 valor2... )
Los valores pueden ser números enteros o reales, y también expresiones matemático- aritméticas. Así por ejemplo:
(MAX 78.34 –12 789 7)
devolverá 789.0, ya que es el número mayor. Lo devuelve como real por la aparición de decimales en el elemento 78.34. Como sabemos, con la sola aparición de un valor real en una lista, el resultado es real.
Si el elemento mayor de la lista es un expresión matemática, se devolverá su resultado, no la expresión en sí, por ejemplo:
160 Dpl. Ing. Carlos Balderrama Vásquez
Programación en AutoLisp
devolverá 100 como resultado (10 * 10).
Otro ejemplo:
(MAX –5 –7 –9)
devolverá –5.
(MIN valor1 valor2... )
La función MIN, por su lado, devuelve el menor de todos los valores indicados en lista. Las demás consideraciones son análogas a la función anterior. Ejemplos:
(MIN 1 2 3 4 7) devuelve 1 (MIN 23.3 7 0) devuelve 0. (MIN (/ 7 3) 0.56) devuelve 0.
Ejemplos de MAX y MIN con variables:
(MIN x y z) (MIN (+ x1 x2) (+ y1 y2) (+ w1 w2) (+ z1 z2))
Y hasta aquí todas las funciones que tienen que ver con operaciones matemáticas. Pasaremos, tras unos ejercicios propuestos, a ver las operaciones de comparación, muy interesantes y sencillas de comprender.
Las funciones que veremos a continuación se denominan relacionales o de comparación, y es que comparan valores, ya sean numéricos o textuales (cadenas) emitiendo un resultado verdadero o falso, según la comparación. Estas funciones son conocidas por todos (igual, mayor que, menor o igual que...), sólo queda determinar cómo se utilizan y cuál es su sintaxis en AutoLISP.
Como hemos dicho el resultado de la evaluación solo puede ser uno de dos: T (True) que representa el verdadero o cierto, o nil que representa el falso o nulo.
NOTA: Con la devolución nil por parte de AutoLISP nos empezamos a familiarizar ahora y la veremos muchas veces.
Comencemos por el igual o igual que, cuya sintaxis es la siguiente:
(= valor1 [valor2...] )
Computación Gráfica 161
Programación en AutoLisp
Si únicamente se indica un valor, AutoLISP devuelve T.
(< valor1 [valor2...] )
Esta sintaxis se corresponde con la comparación menor que. Es una función AutoLISP que devuelve T si efectivamente el primer valor comparado es menor que el segundo. Si existen diversos valores, cada uno ha de ser menor que el siguiente para que AutoLISP devuelva T. Si no se devuelve nil. Veamos algunos ejemplos:
(< 2 3) devuelve T (< 3 4 5 89 100) devuelve T (< 3 –4 5 6) devuelve nil (< (* 2 2) (/ 5 3)) devuelve nil
En el caso de cadenas o variables alfanuméricas (las que contienen cadenas), la comparación se efectúa según el valor de los códigos ASCII. Por lo tanto, será el orden alfabético ascendente (de la A a la Z) la manera de considerar de menor a mayor los caracteres, teniendo en cuenta que el espacio blanco es el carácter de menor valor y que las letras mayúsculas son de menor valor que las minúsculas. Ejemplos:
(< "a" "b") devuelve T (< "z" "h") devuelve nil (< "A" "a" "b") devuelve T (< "f" "S") devuelve nil
Si las cadenas tienen más caracteres se comparan de la misma forma:
(< "abc" "abd") devuelve T (< "abc" "ab") devuelve nil
No es posible comparar cadenas literales con números; AutoLISP devuelve un mensaje de error que dice bad argument type. Con variables que contienen valores numéricos o literales se realizaría de la misma manera:
(< valor1 valor2 total) (< -12 –7 km hrs) (< autor1 autor2 autor3 auto4 autor5)
(<= valor1 [valor2...] )
Esta es la función menor o igual que. Funciona de la misma forma que la anterior pero teniendo en cuenta que devolverá T si cada valor es menor o igual que el anterior. Si no devolverá nil. He aquí unos ejemplos:
Computación Gráfica 163
Tema 6
(<= 10 30 30 40 50 50) devuelve T (<= 12.23 12.23 14) devuelve T (<= 56 57 57 55) devuelve nil
Las demás consideraciones son idénticas a las de la función precedente.
(> valor1 [valor2...] )
Al igual que en la comparación de menor que, pero de manera inversa, esta función devuelve T si cada valor especificado, sea numérico sea cadena, es mayor que el siguiente, esto es, si se encuentran ordenados de mayor a menor. Si no devuelve nil. Por ejemplo:
(> 10 5 4.5 –2) devuelve T (> "z" "gh" "ab") devuelve T (> 23 45) devuelve nil
Otros ejemplos:
(> saldo divid) (> pplanta ppiso pcubierta)
(>= valor1 [valor2...] )
Similar a los anteriores, establece la comparación mayor o igual que. Se devolverá T si y sólo si cada valor es mayor o igual que el que le sucede, si no, nil. Las demás consideraciones son idénticas a las otras funciones similares explicadas. Ejemplos:
(>= 33 23 23 12 12 54) devuelve nil (>= 24 24 24 23 23 0.01 –3) devuelve T
Además de lo estudiado hasta ahora, existen cuatro operaciones lógicas referidas al álgebra de Boole. Estas operaciones son el Y lógico, el O lógico, la identidad y el NO lógico. Además, existe una quinta función que veremos al final denominada de identidad de expresiones y que es un poco especial.
Las cuatro funciones que vamos a ver actúan como operadores lógicos y devuelven, al igual que las anteriores, únicamente los resultados T (cierto) o nil (falso).
(AND expresión1 [expresión2...] )
Esta función realiza el Y lógico de una serie de expresiones indicadas que representan otras tantas condiciones. Esto significa que evalúa todas las expresiones y devuelve T si ninguna de ellas es nil. En el momento en que alguna es nil, abandona la evaluación de las demás y
164 Dpl. Ing. Carlos Balderrama Vásquez