resumen autolis lmcv

Upload: luis-contreras-vasquez

Post on 05-Jul-2018

216 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/16/2019 Resumen Autolis LMCV

    1/215

    AutoCAD1- Primeros pasos con AutoLISP

    Interfaces de programaciónAutoLISP es u na adaptación del lenguaje de programación CommonLISP para AutoCAD. ActiveXAutomation constituye una alternativa moderna al AutoLISP.

    VBA es un entorno de programación basado en objetos que utiliza íntegramente la sintaxis dellenguaje Visual Basic y permite usar controles ActiveX

    ObjectARX es un entorno de programación de lenguaje compilado para el desarrollo deaplicaciones de AutoCAD.

    Características de AutoLISPSu nombre proviene de LISt Procesing (Procesado de listas), se basa en el uso de listas e n lugarde datos numéricos.

    AutoLISP es un lenguaje evaluado . El código se convierte a lenguaje máquina (ceros y u nos) yse almacena en la memoria temporal. No es tan lento como los lenguajes interpretados, ni tanrápido como los compilados :

    • en los lenguajes interpretados , se va traduciendo el programa a código máquina (el idiomade los ordenadores) a medida que se e jecuta

    • en los lenguajes compilados , el código fuente (texto) del programa se traduce a códigomáquina generando un archivo ejecutable (.EXE) que es el que ejecutará el programa

    AutoLISP puede acceder a la base de datos de los dibujos de AutoCAD . Donde podemosacceder a las capas, estilos de texto, sistemas de coordenadas personales (SCP)… así como atodas las e ntidades del dibujo. Esta información se puede modicar, extraer e incluso añadir másentidades al dibujo o información adicional.

    AutoLISP no sigue instrucciones prejadas, accede a la información de los objetos de AutoCADdetermina de que información se dispone, preguntándole a los objetos por ellos mismos.

    AutoLISP puede interactuar con los objetos contenidos en los dibujos.

    AutoLISP permite crear nuevos comandos para AutoCAD

    AutoLISP en la realización de programas paramétricos y e n el diseño semiautomático , ya queentre el 60% y el 80% del diseño

    AutoLISP ha mejorado con la creación de Visual LISP que ofrece un entorno de desarrollointegrado dentro de AutoCAD.

  • 8/16/2019 Resumen Autolis LMCV

    2/215

    Visual LISP incluye un compilador, un depurador y d iversas utilidades para facilitar laprogramación.

    Añade nuevos comandos para permitir la interacción con objetos que utilizan ActiveX . Otra de lasnovedades que aporta Visual LISP son los reactores de objetos que permiten que AutoLISPresponda a eventos .

    Expresiones y procedimientos de evaluaciónUn programa en AutoLISP consiste en una serie de expresiones del tipo “ (función argumentos) “.

    Cada expresión comienza con un paréntesis de apertura al que sigue el nombre de una funciónde AutoLISP (o una función creada por el usuario) y una serie de argumentos (a vecesopcionales) que dependen de la función indicada y van separados por al menos un espacio enblanco . Cada expresión termina con un paréntesis de cierre , es m uy importante pues el númerode paréntesis de apertura debe ser igual al de cierre.

    Cada expresión de AutoLISP devuelve un valor.

    Un argumento también puede ser una expresión , creándose así una estructura formada porexpresiones (listas) an idadas unas dentro de otras; la más interior devolverá su resultado como unargumento a la lista exterior.

    Cuando existen listas anidadas (unas dentro de otras), primero se evalúan las másinteriores.

    Los primeros ejemplos:

    (+ 1 2 ) Ejecuta la función + realiza la suma de los argumentos 1 y 2, devuelve resultado 3.

    (+ 31 22 -3 ) Ejecuta la función + realiza la suma de los argumentos y devuelve el resultado 50 .

    Prueba también: (- 17 2 ) ( + 2.5 22.8 ) ( - 0.25 22.5 ) ( + 12 -2 31 -7.5 )

    Ejemplo: (+ (* 2 3 ) 2) devuelve 8. evalúa la lista interior y devuelve su r esultado a la exterior.

    (+ 7 ( / 5.0 2 ) -3 ) devuelve 6.5 .

    Tipos de objetos y datosLos elementos de las expresiones de AutoLISP pueden ser símbolos, valores concretos y t ambiénotras expresiones. Se pueden distinguir los siguientes tipos de e lementos:

    • Símbolos : Cualquier elemento que no sea un valor concreto. Ej. una variable, una función• Enteros : Números enteros comprendidos entre -32000 y 32000

    • Reales : Números reales (180 es un número entero, pero 180.0 es un número real)

    • Cadenas de texto : Texto con una longitud máxima de 132 caracteres

    • Descriptores de archivo : Representan un archivo de texto ASCII abierto

    • Nombres de entidades de AutoCAD : Nombre en hexadecimal de una entidad del dibujo

  • 8/16/2019 Resumen Autolis LMCV

    3/215

    • Conjuntos designados por el usuario : Conjuntos de entidades de AutoCAD

    • Funciones de usuario : Funciones denidas por el usuario

    • Funciones de AutoLISP : Funciones o comandos predenidos de AutoLISP

    Ejemplo:(+ 5 2 ) devuelve 7. los argumentos son números enteros y devuelve un entero

    (+ 5 2.0 ) devuelve 7.0 . tenemos un número real, así que el resultado es un número real

    AutoLISP puede ejecutar expresiones en m edio de un comando de AutoCAD.

    Ejemplo: Ejecuta comando “ LINEA ” e indica el primer punto, activa forzado ortogonal (F8) yteclea… (+ 11 25 ) Esto devuelve el resultado de la suma al comando que se estaba ejecutando.Dibuja una línea de 36 mm de longitud en la dirección que indicaba el cursor.

    Prueba indicando el radio de la circunferencia (- 70 25 ) al utilizar el comando “ CIRCULO ”

    La constante PI = 3.14159… ejemplo, ejecuta comando “ CIRCULO ” y cuando pregunte el radio dela circunferencia, teclea ( / 6 (* 2 PI )) . Obtiene circunferencia de perímetro 6.

    Notación empleada(FUNCIÓN Argumentos_necesarios [Argumentos_opcionales] )

    Los nombres de las funciones de AutoLISP y el código a teclear se mostrarán en negrita.

    Convenciones recomendadas• para los comentarios incluidos en el código:

    o ;;; Antes del código de las funciones, explicando su funcionamiento

    o ;; En medio del código del programa

    o ; Para explicar una línea de código. A diferencia de las a nteriores, esta no se insertaen la columna 1, se insertará al terminar el código de la línea que comenta

    • es muy recomendable utilizar un formato tabulado para el código

    • evitar el uso de variables globales innecesarias

    • utilizar los comandos de AutoCAD y sus opciones en Inglés y precedidos por “._”

    • no abusar de la función “SETQ”• no utilizar T, MIN, MAX, LAST como símbolos (nombres de variables y f unciones)

    • recuperar el valor inicial de las variables de s istema de AutoCAD que se modicaron

    • añadir unas líneas al nal del programa e indicar nombre del nuevo comando, autor, etc.

    • no introducir demasiado código en la función principal

  • 8/16/2019 Resumen Autolis LMCV

    4/215

    • incluir una función de tratamiento de errores

    • evitar que el usuario pueda introducir datos e rróneos

    • en general es recomendable que, tras e jecutar el nuevo comando, si se e jecuta el comando“DESHACER” (“H”) se deshagan todos los cambios realizados por el comando

    Convenciones utilizadas en el curso• El código en AutoLISP se mostrará en negrita y con los siguientes colores:o los paréntesis de apertura y cierre se mostrarán en rojo ( )

    o las funciones de AutoLISP se mostrarán en azul setq

    o los números se mostrarán en verde 125.6 12

    o los textos se mostrarán en rosa “ /nDesigne un punto: “

    o los comentarios se mostrarán en púrpura ;Esto es un comentario

    o las funciones de usuario se mostrarán en mayúsculas (GAR 90.0 )

    2- Las variables en AutoLISP

    ¿Qué es una variable?Recuerdas cuando en la escuela te decían “Tengo 3 melones, le doy uno a Juan y después decomprar otros 2, me comí uno”. Pues los melones son una variable. Nosotros hacíamos: 1º tengo 3melones x=3 (x es nuestra variable). Luego le doy uno a Juan x = 3-1=2. Compro otros dos x =2+2=4 y m e comí uno x=4-1. Así que x=3. “x” no es más que un valor que varía a lo largo del

    tiempo. Pero podíamos haber llamado a la variable “y”o “z”, y ¿por qué no “melones”?

    (SETQ Variable1 Valor1 [Variable2 Valor2 ... ] )Almacena en memoria los resultados de una operación y permite denir varias variables en unamisma expresión. La función SETQ devuelve el valor de la última variable denida.

    Los nombres utilizados para designar a los s ímbolos c reados por el usuario (variables y funciones):

    • no son sensibles a l as mayúsculas. Es lo mismo bloque, BLOQUE y Bloque• no pueden contener espacios e n blanco, ni los ca racteres ” ( ) . ; ‘

    • pueden contener números, pero no estar formados únicamente por ellos

    • no utilizaremos nombres de variables que coincidan con los nombres de las funciones deAutoLISP ni de las variables de sistema de AutoCAD

    • no existe límite en cuanto al número de caracteres, pero es recomendable emplear nombrescortos y descriptivos.

    • no es necesario declarar previamente las variables. En AutoLISP una misma variable puedecontener primero un número entero, luego uno real, después una cadena de texto, etc.

  • 8/16/2019 Resumen Autolis LMCV

    5/215

    Ejemplo: (setq a 3) Esta expresión crea la variable a y a signa el valor 3. Devuelve el valor de a.

    ¿Que valor devolverá (setq b (+ 1 3 ) melones 23.0 )? se han denido dos variables b y melones devalor 4 y 23.0 respectivamente. Como melones es la última variable evaluada, devuelve su valor.

    Si la barra de comandos recibe una palabra precedida por el signo de exclamación “ !“, comprueba siel termino fue empleado como un símbolo (nombre de variable o una función de usuario) deAutoLISP. Devolverá su valor y en caso contrario devolverá nil , Por ejemplo: !a devuelve 3.

    Prueba las siguientes expresiones y comprueba los valores asignados a las variables:

    (setq c (+ b 3)) Los va lores de las va riables pueden usarse para realizar operaciones y asignar elresultado a una variable.

    (setq d b ) Se puede denir una variable igual al valor de otra variable.

    (setq a 3.5 ) Se puede modicar el valor asociado a una variable, por eso se llama variable.

    (setq b 2.0 ) ¿Qué sucede con el valor de la variable d? ¿Tomará el nuevo valor asignado a la

    variable b o seguirá con el anterior? Al denir la variable d se le asigno el valor que tenía lavariable b en ese momento, no se e stableció ninguna relación entre ambas variables.

    Se puede asignar valores no numéricos a las variables. Por ejemplo, una cadena de texto, que sonsecuencias de uno o más caracteres encerrados entre comillas. Dentro de una cadena de textopueden insertarse una serie de carácteres de control:

    • \\ representa al símbolo \• \” representa al símbolo “

    • \n representa un cambio de línea (retorno del carro)

    • \t representa una tabulación

    (setq a “ \tBienvenido al Curso Introducción a la programación en AutoCAD ” )

    En la variable a primero se almacenaba un valor entero, luego uno real y ahora una cadena de texto.La posibilidad de reutilizar variables c on distintos t ipos de datos p uede ser muy útil, pues d ota alprogramador de una gran exibilidad al escribir el código. Pero requiere más cuidado para no pasara una función una variable con un tipo de dato incorrecto. Por ejemplo: (+ a b ) ya que ahora lavariable a contiene una cadena de texto en lugar de un número.

    Existen una serie de símbolos predenidos:

    • T Representa al valor lógico Cierto o Verdadero.• nil Representa al valor lógico Falso.

    (setq b T)

    (setq c nil )

    A la variable a se le asigna una cadena de texto, a la variable b el valor Cierto o Verdadero y a lavariable c el valor Vacío o Falso.

  • 8/16/2019 Resumen Autolis LMCV

    6/215

    Almacenar el radio del circulo de perímetro 6 en una variable, teclear: (setq rad ( / 6 (* 2 PI )))

    Podríamos crear un circulo e indicar !rad a A utoCAD cuando nos pregunte por el radio deseado.

    Ejemplo: ¿Por qué las siguientes expresiones están mal?

    (setq 157 25 ) ( setq rad 5 Rad 4) ( setq b Curso de AutoLISP )

    No debemos emplear para los nombres de las variables los nombres de las funciones de AutoLISP.

    (setq + 23 ) En este caso asignamos a la variable + el valor 23 .

    Prueba (+ 5 2.5 ) Ahora + no representa a la función suma, sino a una variable de valor 23 . lo que daerror. Para recuperar el modo habitual de trabajo de la función + cerrar la sesión actual de AutoCADe iniciar una nueva sesión.

    3- Operaciones matemáticas básicas

    (+ [número1 número2 ... ] )Suma los números indicados como argumentos y d evuelve el resultado.(+ 3 9 ) devuelve 12

    (+ 3.0 9 ) devuelve 12.0

    (setq a (+ 3 9 4 )) devuelve 16 y l o almacena en la variable a

    (+ 3.5 -1 ) devuelve 2.5

    Prueba la siguiente expresión:

    (setq a (+ a 2.5 )) devuelve 18.5Se asigna a la variable a el resultado de una operación en la que usamos el anterior valor asignadoa la variable a como uno de los argumentos de la operación.

    Si le pasamos a la función + un ú nico número como argumento, nos devuelve ese número.

    (+ 12.5 ) devuelve 12.5 ; (+ -7.0 ) devuelve -7.0

    Si ejecutamos la función suma sin argumentos, devuelve 0.

    (+ ) devuelve 0

    La expresión (+ .5 2) nos da error. Los números reales deben iniciar por un número entero, incluso sies ce ro, seguido de la parte decimal.

    (+ 0.5 2 ) devuelve 2.5

    (+ 3 -0.6 ) devuelve 2.4

    (- [número1 número2 ... ] )

  • 8/16/2019 Resumen Autolis LMCV

    7/215

    Resta al primer número todos los números pasados como argumentos.

    (- 11.0 5 ) devuelve 6.0 numero real ; (- 11 5 ) devuelve 6 numero entero

    (setq a (- 12 5 4 )) devuelve 3 y l o almacena en la variable a

    (- 3.5 -1 ) devuelve -4.5

    (setq a (- a 2.5 )) devuelve 0.5 y l o almacena en la variable a.

    Si le pasamos a la función - un ú nico número de argumento, devuelve el número cambiado designo.

    (- 12.5 ) devuelve -12.5 el primer signo “ -” representa a la función resta

    (- -7.0 ) devuelve 7.0 mientras que el segundo representa el signo de un número negativo

    Si ejecutamos la función resta sin argumentos, devuelve 0. (- ) devuelve 0

    (* [número1 número2 ... ] )Multiplica los números indicados como argumentos y d evuelve el resultado de dicho producto.

    (* 3 9 ) devuelve 27 numero entero ; (* 3.0 9 ) devuelve 27.0 numero real

    (setq a (* 3 9 4 )) devuelve 108 y l o almacena en la variable a

    (* 3.5 -1 ) devuelve -3.5

    Prueba ahora la siguiente expresión:

    (setq a (* a 2.5 )) devuelve 270.0

    Si le pasamos a la función * un ú nico número como argumento, nos devuelve ese nú mero.

    (* 12.5 ) devuelve 12.5 (* -7.0 ) devuelve -7.0

    Si ejecutamos la función * sin argumentos, devuelve 0. (* ) devuelve 0

    (/ [número1 número2 ... ] )Divide el primer número entre el siguiente y devuelve el resultado. Si se pasan más de dos númeroscomo argumentos, el primer número se dividirá entre el producto de los restantes números.

    ( / 45 5 3 ) devuelve 3 ( / 11 5.5 ) devuelve 2.0 ( / 7 2 ) devuelve 3 ( / 7 2.0 ) devuelve 3.5

    (setq a ( / 12.5 4 2 )) devuelve 1.5625 y l o almacena en a ( / 3.5 -1 ) devuelve -3.5(setq a ( / a 0.5 )) devuelve 3.125 y l o almacena en la variable a

    Si le pasamos a la función / un ú nico número como argumento, nos devuelve ese número.

    ( / 12.5 ) devuelve 12.5 ( / -7.0 ) devuelve -7.0

    Si ejecutamos la función / sin argumentos, devuelve 0. ( / ) devuelve 0

    (1+ ) incrementa en una unidad el número indicado como argumento.

  • 8/16/2019 Resumen Autolis LMCV

    8/215

    (1+ 5) devuelve 6. entre “ 1” y “ +” no hay espacio, el nombre de la función es “ 1+ “.

    (1+ 2.5 ) devuelve 3.5 (1+ 0) devuelve 1 (1+ -7 ) devuelve -6

    Una aplicación bastante habitual de esta función es la de incrementar índices o contadores:

    (setq i 1)

    (setq i (1+ i )) devuelve 2

    (1- ) Esta función reduce en una unidad el número indicado.(1- 5) devuelve 4. Ojo entre “ 1” y “ -” no debe haber espacio, ya que el nombre de la función es “ 1- “.

    (1- 2.5 ) devuelve 1.5 (1- 0) devuelve -1 (1- -1 ) devuelve -2

    4- Solicitar números al usuario(GETINT [mensaje] ) Solicita un número entero, AutoCAD recordará con un mensajey no nalizará la ejecución de la función hasta que se introduzca un valor entero, o se pulse ESC.

    (getint ) Puede indicarse un mensaje de solicitud opcional,

    (getint “ ¿Cuántos años tienes?: “) Podemos asignar el valor a una variable y utilizarlo después.

    (setq edad (getint “ ¿Cuántos años tienes?: “))

    (setq edad (+ edad 1)) nos dará la edad que tendrás el próximo año.

    También puedes crear una variable que contenga el mensaje de solicitud de la función GETINT

    (setq mens “ ¿Cuántos años tienes?: “)

    (setq edad (getint mens )) mens es u na variable que almacena una cadena de texto, pero no esuna cadena de texto. Por lo que, no debe ir entre comillas.

    Prueba ahora el siguiente ejemplo:

    (setq a 27 mens “ ¿Cuántos años tienes?: “)

    (setq edad (getint mens )) Que pasa si como respuesta a la solicitud de la edad se introduce !a. Parece lógico que le estamos indicando el valor de la variable a, que contiene el valor 27 , demodo que la variable edad debería tomar el valor 27 , pero no es así. Nos indicará que es “Imposiblevolver a entrar en LISP.”. Esto es por que al ejecutar la función GETINT se está ejecutando elinterprete de LISP, y a l indicar !a como respuesta estamos diciendo que ejecute el interprete deLISP para obtener el valor asociado a la variable a. Como el interprete de LISP ya está enejecución, no puede ejecutarse.

    (GETREAL [mensaje] ) Solicita un número real. En caso que el usuariointroduzca un número entero, el interprete de AutoLISP lo considerará como un real. Si se introduceotro tipo de dato no numérico, recordará por un mensaje que está solicitando un número real y nonaliza la ejecución de la función hasta que se de un valor numérico, o se pulse ESC.

  • 8/16/2019 Resumen Autolis LMCV

    9/215

    (getreal )

    Puede indicarse un mensaje de solicitud opcional, El mensaje debe ser cadena de texto y estarentre comillas.

    (setq peso (getreal “ ¿Cuántos kilos pesas?: “))

    (setq peso (- peso 1)) dará el peso que tendrás s i adelgazas un kilo.También puedes crear una variable que contenga el mensaje de solicitud de la función GETREAL

    (setq mens “ ¿Cuántos kilos pesas?: “)

    (setq peso (getreal mens ))

    5- Funciones de usuario y nuevos comandos

    Denir funciones de usuarioEs posible crear nuestras propias funciones. Redenir las funciones de AutoLISP e incluso loscomandos de AutoCAD.

    (DEFUN ( [argumentos] / [variables_locales]) [expr1] [expr2] …)El primer argumento representa el nombre de la función de usuario que queremos denir.

    no emplear los nombres de las funciones de AutoLISP, ya que en dicho caso se redenirían.

    • los argumentos son valores que recibirá la función cuando sea ejecutada por el usuario, ollamada desde otras funciones

    • las variables locales son aquellas variables que se emplearán tan solo dentro de la funciónque queremos denir, de modo que restringimos su uso al entorno de la función

    Por último, se añaden las expresiones que ejecutará la función. Veamos algunos e jemplos:

    (defun 2+ ( valor ) ( + valor 2)) hemos denido una nueva función llamada “ 2+ “, que recibe comoargumento un número y r ealiza la suma de ese número y 2.

    (2+ 5) devuelve 7 (2+ 0) devuelve 2 (2+ -2 ) devuelve 0

    Defun devuelve el resultado de la última expresión ejecutada, que en el caso anterior es (+ valor 2).

    ¿si tratamos de ejecutar la función sin argumento, o con argumento que no sea de tipo numérico?:

    (2+ ) indica “; error: argumentos insucientes”

    (2+ “ texto “) indica “; error: tipo de argumento erróneo: numberp: “texto””

    (2+ 1 2 ) indica “; error: demasiados a rgumentos”

    Podrías pensar que el número se a lmacena en la variable llamada “ valor “, pero no es así. Puedescomprobarlo escribiendo !valor en la línea de comandos, lo que devolverá nil .

  • 8/16/2019 Resumen Autolis LMCV

    10/215

    En la función anterior tenemos un argumento y sin variables locales. La vamos a modicar:

    (defun 2+ ( valor ) ( setq valor (+ valor 2)))

    Ahora seguro que estas convencido que el resultado se a lmacena en la variable “ valor “. Puescomprobemos:

    (2+ 5) devuelve 7!valor devuelve nil

    La función “ 2+ ” recibe como argumento un número, que almacena en la variable “ valor “. Peroel ámbito de aplicación es local , es decir una vez que salgamos de la función “ 2+ ” la variable“valor ” recupera su valor inicial, que en este caso es nil . Vamos con otra prueba…

    (setq valor 5) devuelve 5

    (2+ 4) devuelve 6 ¿Que valor crees que t endrá la variable valor? Pensemos un p oco.

    • inicialmente valor era nil• al ejecutar (setq valor 5) asignamos a la variable valor el número entero 5

    • cuando llamamos a la función “ 2+ ” con la expresión (2+ 4) tenemos que “ valor ” es 4

    • dentro de la función “ 2+ ” asignamos (setq valor (+ valor 2)) de modo que “ valor ” será 6

    • pero como se trata de una variable local, al salir de la función “ 2+ ” recuperamos el valor quetenía la variable “ valor ” antes de llamar a la función, de modo que valor se rá 5

    • por tanto, si tecleamos !valor devolverá 5

    Pero, que pasa si ejecutamos (setq valor (2+ 4)) . Se repiten los puntos 1 -4 anteriores, pero al salirde la función “ 2+ ” le asignamos a “ valor ” el valor devuelto por la función, que es 6. De modo que“valor ” será 6.

    Retoquemos un poco más la función “ 2+ ”

    (defun 2+ ( valor ) ( setq inicial valor v alor (+ valor 2)))

    y borremos el contenido de “valor”. Para ello simplemente le asignamos nil .

    (setq valor nil )

    En este caso, dentro de la función “ 2+ ” declaramos una variable a la que se le asigna el valor querecibe como argumento la función.(2+ 4)

    ¿Que valor tendrán ahora las variables “ valor ” e “ inicial “? Vamos a comprobarlo:

    !valor devuelve nil tal como sucedía en el ejemplo anterior

    !inicial devuelve 4

  • 8/16/2019 Resumen Autolis LMCV

    11/215

    El “ valor ” se comporta como variable local, solo se emplea dentro de la función. Sin embargo“inicial ” es de ámbito global , se sigue empleando al salir de la función. modicamos más lafunción:

    (defun 2+ ( valor / inicial ) ( setq inicial valor va lor (+ valor 2)))

    Se añade la variable “ inicial ” a la lista de variables locales, con lo que su ámbito será local. Paracomprobarlo…

    !inicial devuelve 4

    (setq inicial nil ) !inicial devuelve nil

    (2+ 3) !inicial devuelve nil

    Bueno, vamos con la última modicación de la función “ 2+ ”

    (defun 2+ ( / valor ) ( setq valor (getint “ Número: “ )) ( setq valor (+ valor 2)))

    Ahora la función “ 2+ ” no tiene argumentos, para ejecutarla solo debemos ponerla entre paréntesis:

    (2+ )

    La variable “ valor ” es de ámbito local y se e mplea GETINT para solicitar un número al usuario.

    Lo habitual es que se trate de evitar el uso de variables globales innecesarias . De modo que lasvariables que no sean globales, se deberán añadir a la lista de variables locales dentro de lasdeniciones de las funciones de usuario.

    Crear nuevos comandos de AutoCADLa función DEFUN también permite crear nuevos comandos de AutoCAD.

    Siguiendo con el ejemplo anterior…(defun C:2+ ( / valor ) ( setq valor (getint “ Número: “ )) ( setq valor (+ valor 2)))

    Si anteponemos al nombre de la función a denir “ C: ” en lugar de crear una función de usuario, secrea un nuevo comando de AutoCAD. La función funciona igual, la diferencia está en el modo deejecutarse. No es necesario poner el nombre de la función entre paréntesis, se escribe directamenteen la ventana de comandos de AutoCAD.

    2+

    También se puede ejecutar poniendo el nombre de la función precedido de “ C: ” entre paréntesis.

    (C:2+ )Si el nuevo comando creado necesite algún argumento, tan solo podrá ejecutarse del último modo.

    (defun C:2+ ( valor / inicial ) ( setq inicial valor va lor (+ valor 2)))

    (C:2+ 2) devuelve 4

    Si escribimos directamente “ 2+ ” AutoCAD mostrará el mensaje “error: argumentos insucientes”.

  • 8/16/2019 Resumen Autolis LMCV

    12/215

    Si se escribe “ 2+ 2 ” en la ventana de comandos de AutoCAD veremos que al escribir el espacioentre el nombre de la función y el argumento, AutoCAD ejecuta lo que cree que es un comando. Poreste motivo sólo podríamos e jecutar la función si se escribe (C:2+ 2) en la ventana de comandos.

    La función creada solo servirá para la sesión actual. Es más, solo está denida la función 2+ en eldibujo actual, de modo que si hay más dibujos abiertos, en ellos no estará denida.

    En el siguiente tema veremos como guardar nuestras funciones en archivos de texto, a la vez quecomenzamos a t rabajar con el entorno de Visual LISP .

    6- Introducción al entorno de Visual LISPArchivos de código fuente en AutoLISPSe ha visto que las funciones de AutoLISP se pueden ejecutar directamente desde la ventana decomandos de AutoCAD. Pero se tiene varios inconvenientes:

    • el reducido tamaño de la ventana de comandos de AutoCAD• la dicultad de escribir todo el código seguido, sin tabular. es debido a que cada vez que se

    pulsa Intro, AutoCAD evalúa lo que se ha escrito

    • el código no se almacena en ningún sitio, se perderá al cerrar el dibujo actual

    En la ventana de comandos de AutoCAD sólo se escribirán pequeñas líneas de código que nointerese guardar, para hacer pruebas y depurar código, se puede utilizar como una ayuda más parael diseño con AutoCAD.

    El código de las funciones de AutoLISP se escribe en un editor de textos ASCII, para que se puedanalmacenar. Se puede emplear cualquier ed itor de texto que permita solo códigos ASCII, por ejemploel bloc de notas de Windows. Otros editores, como MS Word, insertan códigos para diferenciar losestilos de texto, las tabulaciones, etc. y no se pueden emplear para escribir las rutinas de AutoLISP,ya que el interprete de AutoLISP no interpreta esos có digos.

    Desde la versión 14, AutoCAD incorpora un editor para AutoLISP, el que tiene las utilidades:

    • evaluación de paréntesis durante la programación• posibilidad de compilar el código, consiguiendo así aumentar su velocidad de ejecución

    • depurador de código especíco para AutoLISP con opciones para: Ejecutar el código paso apaso, indicar puntos de parada, evaluar expresiones y valores de variables, etc.

    diferenciar el código fuente con distintos c olores• tabulado automático del código

    • utilidades para gestionar proyectos con varios a rchivos de código

    • carga de los archivos en AutoCAD

    seguiremos usando la ventana de comandos de AutoCAD para ver como trabajan las funciones deAutoLISP, y nos iremos al editor de Visual Lisp para crear nuevas funciones y comandos.

  • 8/16/2019 Resumen Autolis LMCV

    13/215

    Los archivos de AutoLISP son archivos de texto con extensión LSP.

    Nuestra primera función de usuarioAntes de comenzar con el editor de Visual LISP, crearemos una primera función de usuario: Es unafunción para convertir un ángulo de radianes a grados decimales, nos se rá útil en muchas de lasmacros. El código de la función sera el siguiente:

    (defun RAG ( ang )

    ( / (* ang 180.0 ) pi )

    )

    Hay tres reglas básicas que sigue AutoLISP:

    1. el número de paréntesis de apertura debe ser igual al número de paréntesis de cierre2. primero se e valuan las listas más interiores

    3. toda función de AutoLISP devuelve un resultado

    El interprete de AutoLISP no evalúa los retornos de carro (Intros), de modo que el código se podíahaber escrito todo seguido, en una misma línea:

    (defun RAG ( ang ) ( / (* ang 180.0 ) pi ) )

    (RAG 1.57 )

    así es difícil de leer. la función tiene poco código, imagina una función mayor escrita toda en lamisma línea.

    La segunda línea esta tabulada, no comienza a la misma altura que el resto, está desplazada hacia

    la derecha. Esto indica que está incluida dentro de una lista de nivel superior, de la función defun .No es necesario tabular el código , pero facilita su lectura y permite detectar po sibles errores conlos paréntesis (Regla número 1).

    Pi es u na constante que ya está denida en AutoLISP, pi equivale al número 3.141592…

    En la primera línea “ (defun RAG ( ang )” denimos la función RAG (Radianes A Grados) que recibeun argumento “ ang ” (el ángulo en radianes).

    la segunda línea: Por la Regla número 2, primero se evaluará la lista interior (* ang 180.0 ) quemultiplica el ángulo en radianes “ ang ” por 180.0 y devuelve el resultado a la lista de nivel superior

    (recuerda la Regla número 3) que lo divide entre pi = 3.141592… devolviendo a su vez el resultadode la división (el ángulo en grados d ecimales) a l a lista de nivel superior, defun .

    La última línea cierra la lista de la función defun , cumpliendo con la Regla número 1.

    Recordemos la estructura de la función de AutoLISP defun: (DEFUN ( [argumentos] /[variables_locales] ) [expresión1] [expresión2] …) . En la función RAG tenemos un a rgumento yno se han declarado variables locales (por lo que no es necesario poner el caracter “ / “), ademássolo tenemos una expresión ( / (* ang 180.0 ) pi ) . Como se dijo en el tema anterior, defun devuelve

  • 8/16/2019 Resumen Autolis LMCV

    14/215

    el resultado de la última expresión, que en nuestro caso resulta ser el ángulo ya convertido a gradosdecimales.

    Nuestra función RAG se ejecutaría así:

    (RAG 1.57 )

    siendo 1.57 el ángulo en radianes, y devolvería ese ángulo en grados decimales(aproximadamente 90º ).

    No es necesario poner el nombre de la función RAG en mayúsculas, ya que AutoLISP no diferencialas mayúsculas de las minúsculas (salvo en contadas excepciones al trabajar con textos, como yaveremos). A lo largo de los a rtículos del curso se mostrarán los nombres de las funciones de usuarioen mayúsculas simplemente para que se diferencien perfectamente del resto del código.

    Los comentarios en el códigoEs imprescindible añadir comentarios al código para explicar qué es lo que hace y cómo se hace.

    En AutoLISP todo lo que en una línea va después de un punto y coma (como este ;) se considera uncomentario, de modo que no se evalúa. Da igual poner uno, dos o 4 5 puntos y co mas se guidos, alponer el primero AutoLISP ya sabe que todo lo que está a continuación, en esa línea, es uncomentario.

    Tal vez pienses que no es tan importante añadir explicaciones e n el código. Pero si tienes que leeruna rutina que creaste hace meses serán muy útiles, por que seguramente no recordaras muy biencomo funciona. Además, si alguien va a leer alguna de vuestras rutinas le facilitaras mucho la labor.Al igual que a ti te será más s encillo leer y entender una rutina con abundantes comentarios.

    Para los co mentarios incluidos e n el código, se recomienda utilizar el siguiente método:• ;;; Antes del código de las funciones, explicando su funcionamiento• ;; En medio del código del programa

    • ; Para explicar una línea de código. A diferencia de las a nteriores, esta no se inserta en lacolumna 1, sino al terminar el código de la línea que comenta

    Por ejemplo, la función RAG con comentarios podría quedar así:

    ;;; Esta función recibe el valor de un ángulo en radianes y lo devuelve en grados decimales.

    (defun RAG ( ang ) ; Recibe un ángulo en radianes( / (* ang 180.0 ) pi )

    ;; Multiplica el ángulo en radianes por 180.0 y lo divide por pi.

    )

    El editor de Visual LISP

  • 8/16/2019 Resumen Autolis LMCV

    15/215

    El editor de Visual LISP se inicia desde AutoCAD de varias formas:

    • Ejecutando el comando de AutoCAD “ VLIDE “.• Desde el menú desplegable de AutoCAD “ Herr–>AutoLISP–>Editor de Visual LISP “

    Mostrará algo similar a la siguiente imagen:

    El editor de Visual LISP

    Al abrir el editor veremos dos ventanas, “ consola de Visual LISP ” y “ Rastreo “. De momento no nosvamos a parar a ver para qué sirven o cómo funcionan estas ventanas.

    Estamos a nte un editor de textos, como otro cualquiera, pero con utilidades e specícas para laprogramación en AutoLISP. De modo que para crear un nuevo archivo hacemos lo mismo que encualquier editor de textos: “ Archivo–>Nuevo archivo ” (o pulsa Control + N ).

    Aparece una nueva ventana, tal como puede verse en la siguiente imagen:

    http://www.emagdalena.es/wp-content/uploads/2012/10/AutoLISP-06_001.gif

  • 8/16/2019 Resumen Autolis LMCV

    16/215

    Nueva ventana de código en el editor V isual LISP

    Es en esta pantalla donde vamos a escribir el código de nuestra rutina RAG , pero antes un pequeñocomentario…

    Es bastante habitual añadir al principio de los a rchivos de AutoLISP unas líneas de comentarios

    indicando el nombre del autor, fecha, nombre de los comandos y/o funciones denidas e n el archivo,y una breve descripción de estos. De modo que al código anterior le añadiremos unas líneas en lacabecera del archivo:

    ;;;____________________Eduardo Magdalena____________________;;;

    ;;;_________________________RAG.LSP___________________________;;;

    ;;;_______________________Versión 1.0_________________________;;;

    ;;;________________________21/02/2002_________________________;;;

    ;;; Esta función recibe el valor de un ángulo en radianes y lo devuelve en grados decimales.

    (defun RAG ( ang ) ; Recibe un ángulo en radianes

    ( / (* ang 180.0 ) pi )

    ;; Multiplica el ángulo en radianes por 180.0 y lo divide por pi.

    )

    http://www.emagdalena.es/wp-content/uploads/2012/10/AutoLISP-06_002.gif

  • 8/16/2019 Resumen Autolis LMCV

    17/215

    El editor de Visual LISP realiza las tabulaciones automáticamente. Y aunque se pueden eliminar omodicar a nuestro gusto (añadiendo o quitando espacios y tabulaciones), lo recomendable esmantener el formato por defecto para el código. Veamos como queda la función RAG en el editor:

    La función RAG en el editor de Visual LISP

    En primer lugar obs ervamos que el código tiene distintos colores. Esto es simplemente una ayudavisual para diferenciar los diferentes e lementos de nuestras rutinas:

    • las funciones de AutoLISP se muestran de color azul setq• los comentarios en morado ;Esto es un comentario

    • los paréntesis en color rojo (setq a 2.0 )

    • los números en color verde 2.0

    • los textos en color rosa (en este ejemplo no aparece ningún texto, pero veremos algunosejemplos más adelante) “Soy un texto “

    • el resto de elementos, como los nombres de las funciones y de las variables utilizadas, semuestran en color negro

    Además, las funciones de usuario se destacarán escribiéndose en mayúsculas RAG .

    Este formato de colores s e utilizará también en los a rtículos de este curso, tal como se muestra enel código de la función RAG anterior.

    http://www.emagdalena.es/wp-content/uploads/2012/10/AutoLISP-06_003.gif

  • 8/16/2019 Resumen Autolis LMCV

    18/215

    El formato coloreado del código se puede desactivar, o se pueden modicar los colores predenidospara los diferentes e lementos. Pero el mantener el formato de colores para el código, nos puedeayudar a detectar errores.

    Por ejemplo, si ponemos “ (setw radianes 1.57 )”

    SETW aparecerá en negro y no en azul, por que la función de AutoLISP es SETQ , de modo quenos indica que hemos escrito mal el nombre de la función.

    En cuanto a la tabulación, tal vez llame la atención el último paréntesis (el de cierre de lafunción defun ), ya que no está a la misma altura que su paréntesis de apertura. Hay editores paraAutoLISP que insertan los paréntesis de cierre a la misma altura que sus correspondientesparéntesis de apertura y hay otros e ditores que insertan los paréntesis de cierre tabulados, tal comohace (por defecto) el editor de Visual LISP.

    Una vez escrito el código de la función RAG , tan solo nos queda guardarlo en un archivo. Esrecomendable crear un directorio (carpeta) en el que guardar todas nuestras rutinas.

    Veremos más adelante que se pueden guardar varias funciones y var ios comandos en un mismoarchivo de AutoLISP, aunque en este caso sólo se ha denido una nueva función de usuario.

    Se le suele dar a los archivos de AutoLISP el mismo nombre del comando o función que estédenida en él, podemos guardar esta rutina en el archivo “klhsduif.lsp” pero luego nola reconoceríamos. Así que lo mejor será guardar el código de la función RAG en el archivo“RAG.lsp “, dentro del directorio que hemos creado para almacenar nuestras rutinas. Así queselecciona “Archivo –> Guardar como” e indica la ruta y el nombre del archivo.

    Ahora puedes intentar crear una función llamada GAR que reciba como argumento un ángulo engrados decimales y que devuelva ese ángulo en radianes. Es prácticamente igual a la función queacabamos de ver. Pero recuerda… Antes de e mpezar a programar (como antes de h acer casicualquier cosa) conviene pensar en lo que se va a hacer y en cómo lo vamos a hacer. Como estarutina es muy sencilla no es necesario escribir el pseudocódigo (ni hacer un diagrama de ujo), tansolo hay que pensar un poco en lo que se va a hacer. Guarda el código de la función GAR en unarchivo llamado “ GAR.lsp ” en el directorio donde tengas tus rutinas.

    7- Cargar los archivos de AutoLISP

    Para que la función RAG que creamos en el artículo anterior se pu eda ejecutar en A utoCAD, hayque cargar el archivo de AutoLISP en el que está denida. Existen varias formas de cargar losarchivos de AutoLISP, pero de momento tan solo vamos a ver tres:

    1. Cargar un archivo desde el editor de Visual LISP2. En el menú desplegable de AutoCAD “ Herr–>AutoLISP–>Cargar aplicación… “.

    3. Utilizando la función de AutoLISP LOAD .

  • 8/16/2019 Resumen Autolis LMCV

    19/215

    Si estamos en el editor de Visual LISP y tenemos abierto un archivo con una rutina, para cargarla enAutoCAD podemos:

    • Seleccionar en los menús desplegables del Visual LISP “ Herramientas –> Cargar texto eneditor “.

    • Pulsando sobre el icono .

    • Tecleando la combinación de teclas CTRL+ALT+E .

    Al cargar el archivo, aparece la Consola de Visual LISP mostrando un mensaje parecido alsiguiente: “; N formularios ca rgado de #. En caso de que se produzca algúnerror en el proceso de carga del archivo, en la consola de Visual LISP se nos indicaría el tipo deerror que se ha producido. De modo que habria que modicar el código para corregir ese error antesde cargar la rutina.

    Una vez cargada la rutina en AutoCAD, podemos probar si funciona. Teclea directamente en laventana de comandos de AutoCAD:

    • (RAG 0)• (RAG pi )

    • (RAG ( / pi 4))

    El segundo método para cargar un archivo de AutoLISP en AutoCAD (seleccionando en el menú deAutoCAD “ Herr–>AutoLISP–>Cargar aplicación… “) muestra un letrero de diálogo en el que seselecciona el archivo a cargar y se pulsa el botón “ Cargar “.

    http://www.emagdalena.es/wp-content/uploads/2012/10/Curso-LISP-07_01.png

  • 8/16/2019 Resumen Autolis LMCV

    20/215

    Cargar / Descargar aplicaciones

    Este método ofrece dos ventajas:

    • se puede seleccionar más de un archivo• permite descargar las funciones de AutoLISP denidas en los archivos seleccionados

    (LOAD archivo [resultado_si_falla])La función LOAD permite cargar en AutoCAD el archivo de AutoLISP que se indique. Por ejemplopara cargar el archivo RAG sería:

    (load “ rag “)

    No hace falta indicar la extensión del archivo. Escribiendo así el nombre del archivo solo cargará elarchivo RAG.LSP si está en uno de los directorios de soporte de AutoCAD o en el directorio actual.En caso contrario hay que indicar la ruta completa:

    (load “ c:\rutinas\rag.lsp “)

    http://www.emagdalena.es/wp-content/uploads/2012/10/Curso-LISP-07_02.png

  • 8/16/2019 Resumen Autolis LMCV

    21/215

    Pero si lo hiciéramos así nos daría un error, ya que AutoCAD no reconoce el carácter “ \ “, de modoque hay que escribirlo de forma algo especial. Para AutoLISP el caracter “ \ ” hay que indicarlo decualquiera de esas 2 formas: “ \\ ” o “ / “. Por lo tanto escribiremos:

    (load “ c:\\rutinas\\rag.lsp “)

    o

    (load “ c:/rutinas/rag.lsp “)

    En caso de que no se encuentre el archivo, la expresión load puede ejecutar lo que se indique en[resultado_si_falla]. Por ejemplo:

    (load “ rag ” (setq test 0))

    En este caso, si no se encuentra el archivo RAG.lsp a la variable test se le asigna el valor cero.Suele emplearse para que, cuando se ejecute LOAD desde dentro de una función de AutoLISP,podamos indicarle al usuario que no se ha encontrado el archivo. Como indica el siguientepseudocódigo:

    Si test = 0 ==> Mensaje al usuario “Archivo no encontrado”

    Esto es todo, de momento, sobre la carga de archivos de AutoLISP en AutoCAD. Más adelanteveremos otros métodos para cargar nuestras rutinas.

    Veamos como sería la función GAR propuesta en el tema anterior:

    ;;;_____________________Eduardo Magdalena_____________________;;;

    ;;;_________________________GAR.LSP___________________________;;;

    ;;;_______________________Versión 1.0_________________________;;;

    ;;;________________________21/02/2002_________________________;;;

    ;;; Esta función recibe el valor de un ángulo en grados decimales y lo devuelve en radianes.

    (defun GAR ( ang ) ; Recibe un ángulo en grados decimales

    ( / (* ang pi ) 180.0 )

    ;; Multiplica el ángulo en grados decimales por Pi y lo divide por 180.0.

    )

    Es muy muy parecida a la función RAG , no?

    Crear un directorio para los archivos deAutoLISPSupongamos que el directorio que hemos creado para almacenar nuestras rutinas es “ C:\Rutinas “.Veamos como añadirlo a los directorios de soporte de AutoLISP:

  • 8/16/2019 Resumen Autolis LMCV

    22/215

    Inicia AutoCAD. En el menú desplegable “ Herr ” selecciona “ Opciones… “. Así aparece un letrero dediálogo que nos permitirá congurar AutoCAD. En la primera pestaña “ Archivos ” tenemos unaopción denominada “ Ruta de búsqueda de archivos de soporte “. Si no está expandida, para versu contenido pulsamos con el ratón sobre el + que aparece a la izquierda.

    Para añadir un nuevo directorio de soporte pulsamos el botón “ Añadir ” que se encuentra a la

    derecha del cuadro de diálogo. Esto creará una nueva etiqueta, en la que podemos escribir la rutadel directorio o pulsar el botón “ Examinar ” para seleccionarlo. Ya hemos añadido “ C:\Rutinas ” a losdirectorios de soporte de AutoCAD.

    Opciones de A utoCAD

    También podemos su bir o bajar el nuevo directorio en la lista de directorios de soporte. Esto se hacepara denir las prioridades, es decir donde buscar primero. De modo que si subimos nuestrodirectorio hasta el primer lugar (como en la imagen), este será el primer directorio en el que busqueAutoCAD.

    8- Operaciones matemáticas en AutoLISP

    Hemos visto las operaciones matemáticas básicas: suma, resta, multiplicación y división y lasfunciones 1+ y 1- . Ahora vamos con otras funciones de AutoLISP que nos permitiran realizar casicualquier operación matemática en nuestras rutinas.

    http://www.emagdalena.es/wp-content/uploads/2012/10/Curso-LISP-07_03.png

  • 8/16/2019 Resumen Autolis LMCV

    23/215

    (ABS numero)Esta función devuelve el valor absoluto del número que se le pase como argumento. Por ejemplo:

    (abs 23.8 ) devuelve 23.8

    (abs -23.8 ) también devuelve 23.8Si el número que recibe como argumento es entero, devuelve un número entero y si es un númeroreal, devuelve un real.

    (abs -7 ) devuelve 7

    (abs -7.0 ) devuelve 7.0

    (abs 0) devuelve 0

    (FIX numero)Esta función devuelve la parte entera de un número. De modo que devuelve un número entero. Ojo!esta función no redondea, sino que elimina lo que está detrás del punto decimal.

    (x 15.8 ) devuelve 15 .

    (x -15.8 ) devuelve -15

    (x 0.99 ) devuelve 0

    (x -0.99 ) devuelve 0

    (REM numero1 numero2 [numero3] …)Esta función devuelve el resto de la división de numero1 entre numero 2.

    (rem 2.5 2 ) devuelve 0.5

    (rem 3 2 ) devuelve 1

    Cuando se indican más de 2 núm eros (rem 1 2 3 ) es equivalente a (rem (rem 1 2 ) 3). Es decir,primero calcula el resto de la división entre 1 y 2, que es 1, y después lo divide entre 3 y d evuelve suresto, que es 1.

    Si todos los números que recibe como argumentos son enteros, devuelve un número entero y sialguno de ellos es un número real, devuelve un real.

    (rem 3 2.0 ) devuelve 1.0

    (SIN angulo)Devuelve el seno de un ángulo indicado en radianes.

  • 8/16/2019 Resumen Autolis LMCV

    24/215

    (sin 0) devuelve 0.0

    (sin ( / pi 2)) devuelve 1.0

    (COS angulo)Funciona igual que la anterior, pero devuelve el coseno del ángulo, que recibe en radianes.(cos 0) devuelve 1.0

    (cos pi ) devuelve -1.0

    (ATAN numero 1 [numero2])Devuelve el arco cuya tangente sea numero1. Por ejemplo:

    (atan 0) devuelve 0.0 ya q ue el ángulo que tiene tangente 0 es e l 0.0

    Si se indica un segundo número (atan num1 num2 ) lo que hace es dividir num1 entre num2 ydevuelve el arco cuya tangente sea el resultado de la división. Esto se hace para facilitar losiguiente…

    (atan (sin angulo ) (cos angulo )) devuelve angulo

    (SQRT numero)Esta función devuelve la raiz cuadrada del numero que recibe como argumento. Siempre devuelveun número real, no entero.

    (sqrt 4) devuelve 2.0

    (sqrt 2.0 ) devuelve 1.41…

    (EXPT num exp)Devuelve el número num elevado al exponente exp.

    (expt 2 2 ) devuelve 4

    (expt 2 3 ) devuelve 8

    Si todos los números que recibe como argumentos son enteros, devuelve un número entero y sialguno de ellos es un número real, devuelve un real.

    (expt 3 2.0 ) devuelve 9.0

    (EXP num)Devuelve el número e ( e = 2.71828… ) elevado al número num. Siempre devuelve un número real.

  • 8/16/2019 Resumen Autolis LMCV

    25/215

  • 8/16/2019 Resumen Autolis LMCV

    26/215

    Recuerdas las funciones GETINT y GETREAL ? Nos s irven para solicitar al usuario un númeroentero y real, respectivamente. Pues la función que se utiliza para solicitar textos a l usuario es muyparecida.

    (GETSTRING [modo] [mensaje])Se puede ejecutar sin parámetros (getstring) pero no es recomendable. Se suele indicar unmensaje de texto que explique al usuario lo que se le está solicitando. Por ejemplo:

    (getstring “ ¿Cuál es tu nombre? “)

    Supongamos que te llamas Pepe, a (getstring “ ¿Cuál es tu nombre? “) responderías Pepe y yaestá. Incluso se podría asignar el nombre que indique el usuario a una variable:

    (setq nombre (getstring “ ¿Cuál es tu nombre? “))

    Pero que sucede si te llamas José Luis? Pues que en cuanto pulses e l espacio es como si hubieraspulsado Intro. No nos permite insertar textos con espacios. Para que admita textos con espacios,debemos hacer un pequeño cambio:

    (setq nombre (getstring T “¿Cuál es tu nombre?” ))

    Le estamos indicando el argumento [modo] = T. Este argumento puede ser cualquier expresión deAutoLISP, en este caso le pasamos el valor T = Cierto, verdadero. Si no se indica el modo, o si alevaluarlo devuelve nil = Falso, vacío; entonces no admite espacios. Y si se pone cualquierexpresión que al evaluarse no devuelva nil , permite espacios.

    (setq nombre (getstring (+ 1 2 ) “ ¿Cuál es tu nombre? “)) permite responder con espacios, yaque ( + 1 2 ) devuelve 3 que es distinto de nil .

    (setq nombre (getstring (setq var1 nil ) “ ¿Cuál es tu nombre? “)) no permite responder conespacios, ya que (setq var1 nil )devuelve nil .

    Para solicitar pu ntos se utilizan dos funciones que también son parecidas a GETINT y a GETREAL .

    (GETPOINT [pto_base] [mensaje])Esta función le pide un punto al usuario y devuelve una lista con las coordenadas del punto

    indicado. El usuario puede indicar el punto en pantalla con el ratón o tecleando sus c oordenadas, taly como se h aría al dibujar en AutoCAD.

    Se puede ejecutar sin parámetros (getpoint ) pero no es recomendable. Se suele indicar unmensaje de texto que explique al usuario lo que se le está solicitando. Por ejemplo:

    (getpoint “ Punto inicial “)

    Lo habitual es que además ese punto se almacene en una variable

  • 8/16/2019 Resumen Autolis LMCV

    27/215

    (setq pto (getpoint “ Punto inicial “))

    Así asignamos a la variable pto algo parecido a lo siguiente: (120.56 135.88 0.0)

    Veamos ahora para que sirve el argumento opcional [pto_base] aprovechando que tenemos elpunto pto denido.

    (getpoint pto “ Siguiente punto: “)Aparece una línea elástica entre el punto pto y la posición del cursor.

    (GETCORNER pto_base [mensaje])Esta función se utiliza también para solicitar puntos a l usuario. En este caso el punto base no esopcional, hay que indicarlo. Veamos la diferencia entre las dos e xpresiones s iguientes:

    (getpoint pto “ Siguiente punto: “)

    (getcorner pto “ Siguiente punto: “)

    Al utilizar getpoint , se muestra una línea elástica entre el punto pto y la posición del cursor. Si seutiliza getcorner , en lugar de una línea elástica, aparece un rectángulo.

    Fijémonos un momento en lo que devuelven tanto getpoint como getcorner : (125.68 117.68 0.0) .Se trata de una lista, una lista con las co rrdenadas de un punto. Bien, pues en el próximo artículoveremos algunas funciones para manejar listas.

    10- Funciones para manejar listas

    AutoLISP es un lenguaje de programación basado en listas as í que es lógico que el tratamientoque reciban las listas de elementos sea muy bueno. Por otra parte, en AutoCAD nos encontraremoslistas continuamente y en todas partes, desde las coordenadas de los puntos como se indicaba enel artículo anterior, hasta los datos de las e ntidades que son almacenados e n la base de datos deAutoCAD . Así que vamos a introducir ahora una serie de funciones para manipular listas deelementos.

    (CAR lista)Esta función devuelve el primer elemento de la lista que recibe como argumento.

    De modo que si (siguiendo con el ejemplo del tema anterior) en la variable pto hemos asignado elvalor devuelto por getpoint , tenemos una lista con las coordenadas X, Y y Z del punto designado.Supongamos que pto = (10.0 20.0 0.0) .

    (car pto ) devuelve la coordenada X del punto pto . Es d ecir 10.0

  • 8/16/2019 Resumen Autolis LMCV

    28/215

    (CDR lista)Esta función devuelve la lista que recibe como argumento pero sin el primer elemento.

    (cdr pto ) devolverá una lista formada por las coordenadas Y y Z del punto pto . Es decir, (20.0 0.0)

    (CADR lista)Basándonos en las dos funciones anteriores y recordando que podemos ejecutar listas deinstrucciones dentro de otras (a esto le llamamos anidamiento): ¿Cómo se obtendría la coordenadaY del punto pto ? Veamos:

    • CDR devuelve la lista sin el primer elemento• CAR devuelve el primer elemento de una lista

    De modo que (cdr pto ) devuelve (Y Z). Así que para obtener la coordenada Y podemos escribir:

    (car (cdr pto )) devuelve la coordenada Y del punto pto.

    y, ¿cómo obtenemos la coordenada Z? Pues, volviendo a aplicar la función CDR para llegar a lacoordenada Z

    • (cdr pto ) devuelve (Y Z)• (cdr (cdr pto )) devuelve (Z)

    Podrías pensar que escribiendo (cdr (cdr pto )) obtenemos la coordenada Z, sin embargo no es así.La expresión (cdr (cdr pto )) devuelve “ una lista ” con un único elemento, la coordenada Z del puntopto. Para obtener la coordenada Z del punto pto tenemos que escribir:

    (car (cdr (cdr pto ))) devuelve la coordenada Z del punto pto.

    En resumen, las coordenadas del punto pto se obtendrian mediante:

    • X ==> (car pto )• Y ==> (car (cdr pto ))

    • Z ==> (car (cdr (cdr pto )))

    Otras funciones combinando CAR yCDRSi en las expresiones indicadas anteriormente para obtener las coordenadas X, Y y Z ponemos lasletras A y D de cAr y cDr en mayúsculas, lo anterior quedaría:

    • X ==> (cAr pto )• Y ==> (cAr (cDr pto ))

  • 8/16/2019 Resumen Autolis LMCV

    29/215

    • Z ==> (cAr (cDr (cDr pto )))

    Este ejemplo es simplemente para introducir una simple regla de mnemotecnia ya que lasfunciones CAR y CDR se pueden agrupar . Para ello, existen una serie de funciones que sedenominan juntando las Aes y l as Des de cAr y cDr respectivamente. El ejemplo anterior, queda:

    X ==> (cAr pto )• Y ==> (cAr (cDr pto )) == (cADr pto )

    • Z ==> (cAr (cDr (cDr pto ))) == (cADDr pto )

    Esto nos se rvirá como regla para recordar el nombre de estas funciones. Debes recordar tambiénque tan solo se permiten 4 niveles de anidación, así que entre la c y la r solo puede haber 4 letras(Aes o D es).

    Supongamos que tenemos la siguiente lista asignada a la variable lst = ((“a” “b”) (“c” “d”) (“e”“f”)) . OJO!! es una lista en la que sus elementos so n a su vez listas.

    Puedes denir la variable lst escribiendo: (setq lst (list (list “ a” “ b“) ( list “ c” “ d“) ( list “ e” “ f“)))

    ¿Cómo obtendríamos “a” ??• (car lst ) devuelve (“a” “b”) que es el primer elemento de lst , y “a” es e l primer elemento

    de (“a” “b”) así que:• (car (car lst )) devuelve “a” , o lo que es lo mismo:

    (cAAr lst ) devuelve “a”

    y el elemento “c”?• (cDr lst ) devuelve la lista sin el primer elemento, es d ecir ((“c” “d”) (“e” “f”)) .• Ahora si hacemos (cAr (cDr lst )) devuelve el primer elemento de la lista anterior, es

    decir (“c” “d”) .

    • Así que (cAr (cAr (cDr lst ))) devuelve “c” , o lo que es lo mismo:

    (cAADr lst ) devuelve “c”

    Cómo obtener “d” ?• (cDr lst ) devuelve ((“c” “d”) (“e” “f”))• (cAr (cDr lst )) devuelve el primer elemento de ((“c” “d”) (“e” “f”)) , es decir devuelve (“c”

    “d”)

    • Si ahora hacemos (cDr (cAr (cDr lst ))) obtenemos (“d”) , que no es lo mismo que “d” . Yaque se trata de una lista cuyo primer elemento es “d” .

    • Así que (cAr (cDr (cAr (cDr lst )))) devuelve “d” , o lo que es lo mismo:

  • 8/16/2019 Resumen Autolis LMCV

    30/215

    (cADADr lst ) devuelve “d”

    Y cómo obtener “e” ?• (cDr lst ) devuelve ((“c” “d”) (“e” “f”))• y (cDr ( cDr lst )) devuelve ((“e” “f”)) . Ojo! se trata de una lista cuyo primer (y único)

    elemento es a su vez otra lista con dos elementos.• Así que (cAr (cDr (cDr lst ))) devuelve (“e” “f”) , de modo que

    • (cAr (cAr (cDr (cDr lst )))) devuelve “e” , o lo que es lo mismo:

    (cAADDr lst ) devuelve “e”

    Por último, veamos cómo se obtiene “f”.• (cAr (cDr (cDr lst ))) devuelve (“e” “f”) tal como se vio en el ejemplo anterior.• Así que (cDr (cAr (cDr (cDr lst )))) devuelve (“f”) , que os recuerdo que se trata de una listay que no es l o mismo que “f” .

    • Por tanto (cAr (cDr (cAr (cDr (cDr lst ))))) devuelve “f” .

    Podríamos pensar que (cADADDr lst ) también devuelve “f” . Pero al ejecutar esta línea AutoCADnos dice que la función cADADDr no está denida.

    Ya dijimos antes que se pueden agrupar hasta 4 funciones cAr y cDr , pero aquí estamosintentando agrupar 5, y lógicamente no podemos. Para obtener “f” podríamos e scribir, por ejemplo:

    • (cAr (cDADDr lst ))• (cADADr (cDr lst ))

    (LENGTH lista)En la variable pto teníamos una lista con las coordenadas de un punto, pero si solo trabajamos en2D, la coordenada Z no nos interesa. Así que muchas veces los puntos tan sólo tendrán 2coordenadas (X Y). Pero para un programa no es lo mismo que tenga 2 que 3 coordenadas, a lomejor va a buscar la coordenada Z y no existe produciéndose un error en nuestra rutina.

    Así que necesitamos c onocer el número de elementos que tienen las listas. Para ello se utiliza lafunción length , que devuelve el número de elementos de la lista que recibe como argumento. Porejemplo:

    (length pto ) devuelve 3. y si el punto pto estuviera en 2D (X Y) devolvería 2.

    Y qué devolvería (length lst ) ? siendo lst = ((“a” “b”) (“c” “d”) (“e” “f”)) . Pues devolvería 3, yaque lst es una lista con 3 elementos, que a su vez son listas de dos elementos cada una.

  • 8/16/2019 Resumen Autolis LMCV

    31/215

    Qué devolvería (length (car lst )) ? El número de elementos del primer elemento de lst , es decir elnúmero de elementos de (“a” “b”), que es 2.

    (LIST elemento1 elemento2 …)Esta función devuelve una lista formada por los elementos indicados. De modo que se utiliza paracrear listas. P or ej emplo:

    (list 1 2 3 ) devuelve (1 2 3)

    (list “ pepe ” 2 “ Juan ” ) devuelve (“pepe” 2 “Ju an”)

    Veamos que hace la siguiente expresión:

    (list (list “ a” “ b“) “ c” (list “ d” “ e“) “ f“)

    Recuerda que en AutoLISP cuando nos encontramos con listas anidadas unas dentro de otras,siempre se evalúan primero las listas interiores .

    • (list “ a” “ b“) devuelve (“a” “b”)• (list “ d” “ e“) devuelve (“d” “e”)

    Así que (list (list “ a” “ b“) “ c” (list “ d” “ e“) “ f“) devuelve la siguiente lista ((“a” “b”) “c” (“d” “e”)“f”) .

    11- Ejecutar comandos de AutoCAD

    Una de las mayores ventajas de la programación en AutoLISP es la posibilidad de ejecutardirectamente comandos de AutoCAD en nuestras rutinas.

    (COMMAND “comando” [datos])Esta es la función que nos permite ejecutar comandos de AutoCAD. Hay dos cosas a tener encuenta con esta función:

    • siempre devuelve nil• los nombres de los comandos de AutoCAD, y sus o pciones, se indican como textos por lo

    que van incluidos e ntre comillas(command “ linea ” (list 0.0 0.0 ) ( list 100.0 200.0 )) Dibujará una línea desde el origen alpunto 100,200 . Pero, nos falta algo: Al dibujar líneas en AutoCAD se van indicando puntos ysiempre pide “ Siguiente punto: ” de modo que para terminar el comando “ LINEA ” hay quepulsar INTRO . Pues ese Intro también hay que pasárlo a la función command:

    (command “linea” (list 0.0 0.0) (list 10 0.0 200.0) “”)

  • 8/16/2019 Resumen Autolis LMCV

    32/215

    Lo realmente potente de COMMAND es que p odemos ejecutar casi todos los comandos deAutoCAD. Cuáles no? S on muy pocos, por ejemplo “ Nuevo ” para empezar un dibujo nuevo. Perotodos los comandos de dibujo, edición, etc se pueden ejecutar.

    Los datos dependerán del comando de AutoCAD indicado. Por ejemplo para el comando “ circulo “,será:

    (command “ circulo ” (list 0.0 0.0 ) 25.0 ) Esto dibujará una circunferencia de radio 25 con centro enel origen.

    Los idiomas de AutoCADSupongamos que no disponemos de u na versión en castellano de AutoCAD, sino que está eninglés, o en Francés, o Chino Mandarín; qué pasa si ejecutamos esto:

    (command “ linea ” (list 0.0 0.0 ) ( list 100.0 200.0 ) “” )

    AutoCAD no conocerá el comando “ linea “, así que nos dará un error. Por suerte se puedesolucionar, ya que sino un programa realizado para AutoCAD en Francés só lo serviría para lasversiones en Francés.

    AutoCAD en realidad no “habla” un único idioma, sino que es bilingue, dispone de una lengua quees la que muestra (que corresponde con la versión idiomática del programa: Castellano, Francés,etc) y u na lengua interna, el Inglés.

    De modo que los comandos de A utoCAD (y sus opciones) se pueden escribir en Castellano o eninglés. Pero para diferenciar unos de otros a los comandos en la lengua nativa de AutoCAD (Inglés)se les antepone un guión bajo:

    (command “ _circle ” (list 0.0 0.0 ) 25.0 )(command “ _line ” ( list 0.0 0.0 ) ( list 100.0 200.0 ) “” )

    Las opciones de los comandos también se deben indicar en inglés anteponiendo un guión bajo. Porejemplo:

    (command “ _circle ” (list 0.0 0.0 ) “ _d ” 25.0 ) Esta línea dibuja una circunferencia de Diámetro25 con centro en el origen.

    Comandos de AutoCAD originalesPor otra parte, ya se ha dicho anteriormente que los comandos de AutoCAD se podrían redenirpara que funcionen de forma distinta. Así se podría cambiar el comando “ circulo ” para quedibuje pentágonos y el comando “ linea ” para que dibuje circunferencias.

    Si redenimos el comando línea para que dibuje circunferencias, entonces deberíamos indicar algosimilar a (command “ linea ” centro radio ) en lugar de (command “ linea ” pt0 pt1” ″ ). Perocómo haríamos entonces para dibujar una línea?

  • 8/16/2019 Resumen Autolis LMCV

    33/215

    Para ejecutar los comandos originales de AutoCAD, y no los redenidos (si lo están)debemos anteponer al nombre del comando un punto , por ejemplo:

    (command “ .circulo ” (list 0.0 0.0 ) 25.0 )

    (command “ .linea ” (list 0.0 0.0 ) ( list 100.0 200.0 ) “” )

    Podemos además indicar los comandos en Inglés anteponiendo un guión bajo así que tambiénlos podríamos escribir así:

    (command “ ._circle ” (list 0.0 0.0 ) 25.0 )

    (command “ _.circle ” (list 0.0 0.0 ) 25.0 )

    Da igual si se pone antes el punto o el guión bajo.

    Redenir un comando de AutoCADPara redenir un comando de AutoCAD debemos:

    1. Ejecutar el comando “ ANULADEF ” (En Inglés “ undene “) indicando el nombre del comandoa redenir. De este modo se e limina la denición del comando de AutoCAD, y la única forma deejecutarlo será anteponiendo al nombre del comando un punto.

    2. Crear y cargar una macro en la que esté denido un nuevo comando con el nombre delcomando que acabamos de anular.

    Veamos un ejemplo:

    1. primero anulamos la denición del comando línea.1. Podemos hacerlo desde AutoCAD con el comando “ ANULADEF ” (En inglés

    “undene “)

    2. o desde AutoLISP ejecutando: (command “ anuladef ”“linea “) o (command “ _undene ” “ _line “)

    2. podemos comprobar que el comando línea ya no funciona

    1. Puedes tratar de ejecutarlo en castellano, en inglés, directamente en AutoCAD o enuna expresión de AutoLISP

    2. la única forma de ejecutarlo es anteponiendo a su nombre un punto “ .linea “.

    3. Iniciamos el editor de Visual LISP: “ Herr. –>AutoLISP –> Editor de Visual LISP ”

    1. Creamos la macro que se indica a continuación, la guardamos y l a cargamos enAutoCAD

    (defun C:LINEA ( )

    (setq pt (getpoint “ Centro del círculo: “ ))

  • 8/16/2019 Resumen Autolis LMCV

    34/215

    (setq rad (getreal “ Radio del círculo “))

    (command “ ._circle ” pt rad )

    )

    Ahora el comando “ linea ” dibujará círculos.

    Para recuperar el valor original del comando podemos hacer dos cosas:

    1. cerrar AutoCAD y abrirlo de nuevo, de modo que la macro que hemos creado se borre de lamemoria del ordenador

    2. ejecutar el comando de AutoCAD “ redene ” (En Inglés e s igual, pero con un guión bajodelante) e indicarel nombre del comando del que queremos recuperar su denición original, esdecir “ linea “.

    Bueno, por último un ejercicio: Crear una macro que dena un nuevo comando de Autocadllamado CIRCPERI que dibuje una circunferencia indicando su centro y la longitud de su perímetro.

    12- Operaciones lógicas en AutoLISP

    Existe una serie de funciones de AutoLISP que nos permiten realizar operaciones lógicas. Suelenemplearse en combinación con las operaciones de co mparación.

    (AND expr1 expr2 …)Esta función devuelve T si ninguna de las expresiones que recibe como argumento es(devuelve) nil . Si una sola de las expresiones devuelve nil , la función AND devolverá nil . Es decir,comprueba que se cum plan todas las expresiones que recibe como argumento.

    (and (< 3 4 ) ( = 5 5.0 )) devuelve T, porque las dos expresiones devuelven T

    (and (> 3 4 ) ( = 5 5.0 )) devuelve nil , porque (> 3 4 ) devuelve nil

    En el ejemplo anterior, como la primera expresión (> 3 4 ) devuelve nil , ya nose continúan evaluando el resto de expresiones. Cómo hay una expresión quedevuelve nil , AND devolverá nil . De modo que la expresión (= 5 5.0 ) ya no se evalúa.

    Vamos a complicarlo un poco… Qué devolverá la siguiente expresión?

    (and (= 5 5.0 ) ( < 3 4 ) “ Soy un texto ” 5.8 )

    Preguntando de otra forma: ¿Alguna de las expresiones que recibe AND como argumentos es nil ?No, así que AND devuelve T.

    (setq a “ Soy otro texto ” b 15 c T d nil )

    (and a b ) devolverá T

  • 8/16/2019 Resumen Autolis LMCV

    35/215

    (and a d ) devolverá nil porque d es nil

    (and a b c d ) devolverá nil , porque d es nil

    (OR expr1 expr2 …)Devuelve nil si todas las expresiones s on nil . En caso de que alguna de las expresiones nodevuelva nil , OR devuelve T. Es decir, comprueba si alguna de las expresiones se cumple.

    (or ( /= 5 5.0 ) ( > 3 4 )) devuelve nil , porque ambas expresiones son nil

    (or (= 5 5.0 ) ( > 3 4 )) devuelve T, pues la primera expresión se cumple

    En el ejemplo anterior, como la primera expresión (= 5 5.0 ) devuelve T, ya nose continúan evaluando el resto de expresiones. Cómo hay una expresión quedevuelve T, OR devolverá T. De modo que la expresión (> 3 4 ) ya n o se evalúa.

    (setq a “ Soy otro texto ” b 15 c T d nil )

    (or a b ) devuelve T

    (or c d ) devuelve nil

    (or d d ) devuelve nil

    (EQUAL expr1 expr2 [precision])En el tema anterior vimos la función de comparación = que nos sirve para determinar si dosnúmeros o textos son iguales. Pero que pasa si queremos comparar otra cosa, por ejemplo dos

    listas (como dos puntos).(setq pt1 (list 10.0 20.0 0.0 ) pt2 (list 10.0 (* 10.0 2 ) 0.0 ) pt3 (list 9.99 20.0 0.0 ) pt4 (list 9.99 20.020.0 ))

    Al comparar estas listas (puntos) con la función = siempre nos devuelve nil . Aunque pt1 y pt2 seaniguales, y muy parecidos a pt3 y pt4 . Por tanto, la función = no nos se rvirá para compararlistas. Para comparar dos listas se utilizará la función EQUAL.

    (equal 5 5.0 ) devuelve T, al igual que la función =, porque 5 vale lo mismo que 5.0

    (equal pt1 pt2 ) devuelve T

    EQUAL además ofrece un argumento opcional… [ precisión ]. Veamos como funciona :(equal 4.99 5.0 0.1 ) devuelve T, porque compara 4.99 y 5 pero con una precisión de 0.1 . Así quecon esa precisión 4.99 == 5.0

    Sin embargo, si subimos la precisión…

    (equal 4.99 5.0 0.001 ) devuelve nil

    ¿Y qué pasa con las listas? ¿También podemos indicarle una precisión? Veamos..

  • 8/16/2019 Resumen Autolis LMCV

    36/215

    (equal pt1 pt3 0.1 ) devuelve T, porque compara los elementos de las listas (coordenadas) con laprecisión que hemos indicado, 0.1

    Si subimos la precisión…

    (equal pt1 pt3 0.001 ) devuelve nil

    (equal pt1 pt4 0.01 ) devuelve nil(equal pt1 pt4 0.02 ) devuelve T, porque la precisión es 0.02 que es exactamente la diferenciaentre 20.02 y 20

    El utilizar una precisión muy elevada no implica que todas las comparaciones devuelvan T, tododependerá de los valores a comparar:

    (equal 15 20 100 ) devuelve T

    (equal 5000 4200 100 ) devuelve nil

    (NOT expr)A esta función le gusta llevarle la contraria a la expresión que recibe como argumento.

    • si la expresión devuelve nil , entonces NOT devuelve T.• si la expresión devuelve cualquier cosa que no sea nil , entonces NOT devuelve nil .

    (not 5) devuelve nil

    (not “ Texto “) devuelve nil

    (not (+ 5 1 )) devuelve nil

    Si hacemos…

    (setq a 5 b nil c T d “ Nuevo texto “)

    (not b ) devolverá T, porque b es nil

    (not c ) devolverá nil .

    Veamos que devuelve la siguiente expresión:

    (and (not c ) 5)

    Como c es T, (not c ) devuelve nil . Al no cumplirse la primera expresión de AND , esta devuelve nil yno continúa evaluando.

    13- Operaciones de comparaciónEn este artículo veremos las funciones de AutoLISP que nos permiten realizar comparaciones, porejemplo, para ver si algo es mayor que algo, o menor, o si es igual.

  • 8/16/2019 Resumen Autolis LMCV

    37/215

    (= expr1 expr2 …)Compara si expr1 devuelve el mismo resultado que expr2, en caso armativo devuelve T y en casocontrario devuelve nil .

    (= 5 (+ 1 4 )) devuelve T porque (+ 1 4) devuelve 5

    (= 5 (+ 1 4.0 )) devuelve T aunque (+ 1 4.0) devuelve 5.0 y no 5. Pero 5 y 5.0 valen lo mismo, no?

    (= 5 5.0 ) devuelve T

    No solo podemos evaluar números, también textos:

    (setq txt1 “ Curso de Lisp “)

    (= txt1 “ Curso de Lisp “) devuelve T

    (= txt1 “ Curso de LISP “) devuelve nil . No es lo mismo un texto en mayúsculas que en minúsculas.

    (= “ LISP ” “ Lisp “) devuelve nilEstamos comparando expresiones, así que:

    (= (+ 1 5 ) ( / 12 2 )) devuelve T porque ambas expresiones devuelven como resultado 6.

    La función = puede aceptar más de dos expresiones:

    (= 6 (+ 1 5 ) 6.0 ( / 12 2 )) devuelve T, pues las cuatro expresiones devuelven 6 o 6.0 (que vale lomismo).

    (/= expr1 expr2 …)Es muy similar a la anterior. Devuelve T si las expresiones no devuelven el mismo valor ydevuelve nil si todas las expresiones devuelven el mismo valor.

    ( /= 6 6.0 ) devuelve nil , porque 6 y 6.0 no son distintos (valen lo mismo).

    ( /= (+ 5 5 ) ( / 12 2 )) devuelve T, pues la primera expresión devuelve 10 y l a segunda 6.

    ( /= “ LISP ” “ Lisp “) devuelve T

    (< expr1 expr2 …)Compara si expr1 es menor q expr2

    (< 4 5 ) devuelve T, ya que 4 es m enor que 5

    (< 4 -5 ) devuelve nil

    (< 5 5.0 ) devuelve nil

  • 8/16/2019 Resumen Autolis LMCV

    38/215

    Si se ponen más de 2 expresiones, se comprueba que estén ordenadas de menor a mayor ydevuelve T s i lo están y nil si no lo están.

    (< 1 2 3 ) devuelve T

    (< 1 2 0 ) devuelve nil

    (< (+ 1 2 ) ( * 2 2.0 ) ( / 12 2 )) devuelve TTambién podemos comparar textos. El interprete de AutoLISP evalúa los códigos ASCII de lostextos. Es decir los ordena alfabéticamente de la “a” a la “z”.

    (< “ Albacete ” “ Barcelona “) devuelve T

    (< “ a” “ c“) devuelve T

    (< “ d” “ c“) devuelve nil

    (< “ C” “ c“) devuelve T, puesto que los códigos ASCII de la mayúsculas son inferiores a los de lasletras minúsculas.

    Los códigos ASCII, son una serie de números que se asignaron a las letras del alfabeto y a algunosde los carácteres más usuales.

    El carácter “a” tiene asociado el código 97 , la “b” el 98 , etc. hasta la “z” .

    El carácter “A” tiene asociado el código 65 , la “B” el 66 , etc. hasta la “Z” .

    (> expr1 expr2 …)Supongo que ya os imagináis como funciona, no? Comprueba si las expresiones están ordenadas

    de mayor a menor.(> 5 3 ) devuelve T

    (> -2 3 ) devuelve nil

    (> 5 2 3 ) devuelve nil

    (> 5 4 3 ) devuelve T

    Y ahora con los textos:

    (> “ a” “ c“) devuelve nil , pues el código ASCII de “a” es m enor que el de “c” .

    (

  • 8/16/2019 Resumen Autolis LMCV

    39/215

  • 8/16/2019 Resumen Autolis LMCV

    40/215

    (setq peri (getreal “ Perímetro: “)) ‘almacena el perímetro de la circunferencia en la variable peri

    3) Calcular el radio de la circunferencia a partir de su perímetro . Peri = 2* pi * rad así que rad = Peri /( 2 * pi). Traduciendo esta fórmula a código:

    (setq rad ( / peri (* pi 2))) ‘calcula el valor de l radio de la circunferencia

    4) Dibujar l a circunferencia(command “ _.circle ” pto rad ) ‘dibuja la circunferencia

    Sólo nos falta una cosa. Recuerda: El número de paréntesis de apertura tiene que ser igual alnúmero de paréntesis de cierre . Así que:

    )

    El código completo de la rutina sería:

    (defun C:CIRCPERI ( )

    (setq pto (getpoint “ Centro de la circunferencia “))(setq peri ( getreal “ Perímetro: “))

    (setq rad ( / peri (* pi 2)))

    (command “ _.circle ” pto rad )

    )

    También deberías añadir comentarios al código y una cabecera con varias líneas de comentarios enel archivo .LSP indicando: El nombre de la rutina, fecha, autor, etc.

    ¿Te das cuenta de la importancia del pseudocódigo? Al programar nos ha guiado paso a paso.

    14- Estructuras condicionales simplesHasta ahora nuestro código ha sido completamente lineal, las líneas de código que escribíamosse e jecutaban una tras otra en el mismo orden. En este tema veremos un tipo de funciones quenos permitirán bifurcar el código, de modo que ya no exista un único camino sino dos o más.Veamos un ejemplo en pseudocódigo:

    1. Introducir el límite inferior2. Introducir el límite superior

    3. ¿El límite superior es menor que el inferior?

    1. SI–> Mensaje “El límite superior debe ser mayor que el inferior”

  • 8/16/2019 Resumen Autolis LMCV

    41/215

    2. NO –> intervalo = límite superior – límite inferior

    (IF condición expr_si_cumple

    [expr_no_cumple])La función IF es una de las más empleadas al programar. Devuelve el valor de la última expresiónevaluada. Si condición es distinto de nil , entonces evalúa la expr_si_cumple . Si condicióndevuelve nil evalúa la expr_no_cumple , si existe y si no existe no hace nada. Veamos algunosejemplos:

    (if (= 2 2.0 ) ( alert “ Los números son iguales “))

    La condición a evaluar es: (= 2 2.0) en la que tenemos un número entero 2 y u no real 2.0 , pero suvalor es el mismo. Aunque sean de distinto tipo 2 y 2.0 valen igual. Así que la condicióndevuelve T, evaluándose la condición si cumple que muestra un mensaje de alerta. Lafunción IF devuelve el valor de la última expresión evaluada, es decir alert , que es nil .(if (= 2 3 ) ( alert “ Los números son iguales “))

    En este caso la condición devuelve nil y a l no existir expresión no cumple, no haría nada más. ¿Quévalor de volvería IF ? El de siempre, el valor de la última expresión evaluada, que en este caso hasido la propia condición que devuelve nil . De modo que IF devolverá nil .

    (if (= 2 3 )

    (alert “ Los números son iguales “)

    (alert

    “ Los números son distintos “)

    )

    En este caso el código se ha escrito en varias líneas y t abulado para facilitar su comprensión. Ahorasi tenemos una expresión no cumple, que será evaluada ya que la condición devuelve nil .

    Veamos el siguiente ejemplo:

    (setq liminf (getint “ \nLímite inferior: “))

    (setq limsup (getint “\nLímite superior:” ))

    (if (> liminf limsup )

    (alert “ El límite superior debe ser mayor que el inferior “) (setq limsup (getint “ \nLímitesuperior: “)) (setq intervalo (-limsup liminf ))

    (setq intervalo (- limsup liminf ))

    )

  • 8/16/2019 Resumen Autolis LMCV

    42/215

    Viendo el código anterior, tal vez pienses que si la condición (> liminf limsup ) se cu mple, entoncesse evaluará la línea siguiente de código completa. Pero no es a sí, se evalúa la expresión si cumple,que es la primera expresión (alert “ El límite superior debe ser mayor que el inferior “).

    Si la condición no se cumple, devuelve nil , se evaluará la expresión no cumple, que en este casoserá (setq limsup (getint “ \nLímite superior “)) .

    Tanto la expresión si cumple, como la no cumple solo pueden ser una única expresión . Elejemplo de código anterior nos daría un error ya que IF no p uede tener más que 3 e xpresiones:

    • La condición• La expresión si cumple

    • La expresión no cumple

    (PROGN expr1 expr2 …)Para que se pueda indicar más de una expresión si cumple, o no cumple, en la función IF se sueleemplear la función PROGN . El valor devuelto por PROGN es el de la última expresión que recibecomo argumento. Esta función en realidad no hace nada, tan solo nos permite agrupar una serie deexpresiones.

    ¿Cómo quedaría el ejemplo anterior?

    (setq liminf (getint “ \nLímite inferior: “))

    (setq limsup (getint “ \nLímite superior: “))

    (if (> liminf limsup )

    (progn

    (alert “ El límite superior debe ser mayor que el inferior “)

    (setq limsup (getint “ \nLímite superior: “))

    (setq intervalo (- limsup liminf ))

    )

    (setq intervalo (- limsup liminf ))

    )

    En este caso la condición si cumple es todo lo siguiente:

    (progn

    (alert “ El límite superior debe ser mayor que el inferior “)

    (setq limsup (getint “ \nLímite superior: “))

    (setq intervalo (- limsup liminf ))

  • 8/16/2019 Resumen Autolis LMCV

    43/215

    )

    Si se cumple la condición, se evalúa la condición si cumple, es decir el progn . De modo que se vanevaluando las expresiones contenidas en la función PROGN , que devuelve el valor de la últimaexpresión (setq intervalo (- limsup liminf )) , que será el valor de la variable intervalo.

    En caso de que la condición no se cumpla, se evalúa la condición nocumple, (setq intervalo (- limsup liminf )) que curiosamente también devuelve el valor de lavariable intervalo.

    Veamos ahora algunos ejemplos más de estructuras condicionales:

    (if (and (= 2 2.0 ) ( < 2 3 ))

    (alert “ Las dos condiciones se cumplen “)

    (alert “ Al menos una condición no se cumple “)

    )

    En este caso la condición es (and (= 2 2.0 ) ( < 2 3 )) que en este caso devolvería T, ya que severican las dos e xpresiones que recibe la función AND .

    (if (not var1 )

    (alert “ Variable no denida “)

    (alert “ Variable denida “)

    )

    En este caso si var1 es nil , (not var1 ) devolverá T, indicando que la variable no se ha denido. Encaso contrario, (not var1) devolverá nil evaluándose la expresión no cumple. Otro método parahacer lo mismo, sería:

    (if var1

    (alert “ Variable denida “)

    (alert “ Variable no denida “)

    )

    Si var1 es d istinto de nil , se evalúa la expresión si cumple. En caso de que var1 sea nil , seevaluaría la expresión no cumple.

    15- Estructuras condicionales múltiples

    Con la función IF tan solo podemos indicar una condición y dos opciones, si cumple y no cumple.Veamos ahora como se pueden indicar varias condiciones con sus respectivas expresiones sicumple.

  • 8/16/2019 Resumen Autolis LMCV

    44/215

    (COND (condicion1 [expr1_1] [expr1_2]… ) [ (condicion2 [expr2_1] [expr2_2] … )

    ] … )Esta función es s imilar a IF en cuanto a que se indican condiciones y u na serie de expresiones quese evaluaran si se verica cada condición. En este caso no existe la limitación de indicar tan sólouna única expresión si cumple, se pueden indicar tantas como se d esee. COND evaluará la primeracondición encontrada, si se verica evaluará las expresiones si cumple de dicha condición. En casode que no se verique, evaluará la siguiente expresión.

    Por lo tanto, COND evaluará las expresiones si cumple de la primera condición que se verique. Ydevolverá el resultado de evaluar la última expresión si cumple. Pongamos un ejemplo:

    (cond

    (( = a b )

    (alert “ A y B son iguales “)

    (setq b (getreal “ Introduzca de nuevo B: “ ))

    )

    (( < a c )

    (alert “ A es menor que C “)

    )(( < a b ))

    (T

    (alert “ A no es igual a B “)

    (alert “ A no es menor que C “)

    (alert “ A no es menor que B “)

    )

    )Supongamos ahora que antes de la expresión COND, hemos denido (setq a 2 b 2.0 c 3.5 ). Eneste caso, al entrar en COND se evaluará la primera condición (= a b ) que se verica, de modo quese evaluaran las expresiones si cumple de esta condición: (alert “ A y B soniguales “) y (setq b (getreal “ Introduzca de nuevo B: “ )) nalizando la expresión COND quedevuelve el nuevo valor de b.

  • 8/16/2019 Resumen Autolis LMCV

    45/215

    Aunque la siguiente condición (< a c ) se cumple, no se evalúa, ya que existe una condición anteriorque también se cumplía.

    En caso de que se hubiera denido (setq a 2 b 2.5 c 3.5 ) la primera condición (= a b ) no se verica,de modo que se evalúa la segunda condición (< a c ) que si se cumple. Evaluándose susexpresiones si cumple (alert “ A es menor que C “) que devuelve nil .

    Si fuera (setq a 2 b 2.5 c 1.5 ) la primera condición en cumplirse sería la tercera (< a b ) que no tieneexpresiones si cumple. ¿Qué devolverá entonces la función COND ? Pues e l valor de la últimaexpresión evaluada, es decir el valor devuelto por la condición (< a b )que es T.

    Por último, si tenemos (setq a 2 b 1.0 c 1.5 ) ninguna de las t res c ondiciones a nteriores se verica,de modo que pasamos a la siguiente condición T, que lógicamente siempre devuelve T, así quesiempre se verica. Esto se suele utilizar mucho en la función COND , añadir como última condiciónuna que se verique siempre. En lugar de T se p odía haber puesto (not nil ) o (= 1 1.0 ) que t ambiénson expresiones que siempre se cumplen. ¿Para qué añadir una expresión que siempre se cumple?Muy sencillo, para incluir el código que se desea ejecutar en caso de que no se verique ninguna de

    las condiciones anteriores.¿Y qué sucede si se pone la condición T como primera condición? Pues sucede que las que estén acontinuación nunca se evaluarán, ya que T siempre se cumplirá. Si en el ejemploanterior hubiéramos puesto:

    (cond

    (T

    (alert “ A no es igual a B “)

    (alert “ A no es menor que C “)

    (alert “ A no es menor que B “)

    )

    (( = a b )

    (alert “ A y B son iguales “)

    (setq b (getreal “ Introduzca de nuevo B: “ ))

    )

    (( < a c )

    (alert “ A es menor que C “)

    )

    (( < a b ))

    )

  • 8/16/2019 Resumen Autolis LMCV

    46/215

    Independientemente de los valores de las variables a b y c siempre nos mostrará los mensajes dealerta indicando que “ A no es igual a B “, “ A no es menor que C ” y “ A no es menor que B “.

    16- Mostrar textos al usuario en AutoLisp

    Hay varias funciones para mostrar textos al usuario en AutoLisp. De momento vamos a ver un parde ellas, pero habrá más.

    (PROMPT mensaje)Muestra el texto indicado como argumento en pantalla, y siempre devuelve nil .

    (prompt “ Bienvenidos al Curso “)

    (ALERT mensaje)Muestra el texto que recibe como argumento en un letrero. También devuelve nil . Se utilizaprincipalmente para avisar al usuario en caso de error, o para mostrar alguna informaciónimportante.

    (alert “ Error: Dato no válido “)

    (TERPRI)En artículo correspondiente a las Operaciones de co mparación , creamos un nuevo comando paraAutoCAD denominado CIRCPERI . Si has cargado y ejecutado el comando, habrás observado quelos mensajes para solicitar el centro de la circunferencia y su perímetro aparecen en la misma líneade la ventana de comandos y si n separación entre sí, están pegados.

    Para que los mensajes aparezcan en líneas distintas, se puede emplear la función TERPRI . Estafunción mueve el cursor a una nueva línea en la ventana de comandos de AutoCAD, y devuelve nil .El código de la rutina quedaría así:

    (defun C:CIRCPERI ( )

    (setq pto (getpoint “ Centro de la circunferencia “)) (terpri )

    (setq peri (getreal “ Perímetro: “)) ( terpri )

    (setq rad ( / peri (* pi 2)))

    (command “ _.circle ” pto rad )

    )

    Así los mensajes de solicitud aparecerán en líneas separadas.

    http://www.emagdalena.es/2012/10/22/operaciones-de-comparacion/http://www.emagdalena.es/2012/10/22/operaciones-de-comparacion/http://www.emagdalena.es/2012/10/22/operaciones-de-comparacion/

  • 8/16/2019 Resumen Autolis LMCV

    47/215

    Los caracteres de controlComo ya se ha comentado anteriormente, AutoLISP no reconoce una serie de caracteres. Porejemplo, al indicar la ruta de un archivo no reconoce el carácter “ \ ” y hay que indicarlo así: “ \\ “. Puesexisten más ca racteres de control predenidos:

    • \\ Equivale al caracter \• \” Equivale al caracter “

    • \e Equivale a ESCape

    • \n Equivale al retorno de carro

    • \r Equivale a pulsar Intro

    • \t Equivale a pulsar la tecla del tabulador

    \” nos permite escribir las c omillas d entro de un texto. Por ejemplo:(alert “ Esto son un par de comillas \” o no? “)

    La única comilla que se tiene que ver es la que está escrita así: \” . Las otras nos indican dondecomienza y termina el texto, nada más.

    (alert “ Texto en línea 1\nTexto en línea 2 “)

    Se pone 1\nTexto todo junto. Para qué poner espacios?

    (alert “ Texto en línea 1\n Texto en línea 2 “)

    Si lo ponemos así, añade un espacio en blanco al principio de la segunda línea. Por eso se ponetodo seguido.

    (alert “ Texto en línea 1\n\tTexto en línea 2 “)

    En este ejemplo la segunda línea está tabulada.

    Entonces, ¿cómo quedaría el código de la rutina CIRCPERI utilizando caracteres de control, enlugar de la función (TERPRI) ?

    (defun C:CIRCPERI ( )

    (setq pto (getpoint “ \nCentro de la circunferencia “))

    (setq peri (getreal “ \nPerímetro: “))

    (setq rad ( / peri (* pi 2)))

    (command “ _.circle ” pto rad )

    )

  • 8/16/2019 Resumen A