Primeros pasos con AutoLISP



Introducción a la programación en AutoCAD

Primeros pasos con AutoLISP


Objetivos del curso

Aprovechando que actualmente dispongo de algo más de tiempo, me he decidido a desempolvar y re-editar algún curso que he creado hace ya bastante tiempo, trataré de actualizar el contenido para que funcione con las últimas versiones de AutoCAD.

Con este curso no se pretende formar a expertos programadores. Más bien, se pretende acercar el lenguaje de programación AutoLISP a los usuarios de AutoCAD, para que puedan crear utilidades y pequeñas aplicaciones que les ahorren tiempo y cálculos en sus trabajos.

Para seguir el curso no son necesarios conocimientos de programación, tan sólo es preciso tener unas nociones básicas de AutoCAD y del entorno Windows.

Otro de los objetivos del curso es el de ver a AutoCAD no como un programa de dibujo, sino como una potente base de datos gráficos. Y descubrir como funciona esa base de datos.

Código de una macro en AutoLISP

Código de una macro en AutoLISP

Merece la pena aprender a programar sobre AutoCAD

Desde luego que puede merecer la pena. Puede agilizar y facilitar enormemente el trabajo con AutoCAD.

Puede que existan en el mercado aplicaciones de diseño mucho más potentes para trabajar en 3D de forma paramétrica, como SolidWorks o Catia, pero AutoCAD se sigue utilizando habitualmente en infinidad de aplicaciones. Para trabajar en 2D sigue siendo la aplicación de CAD de referencia y su formato de archivo .DWG es un estándar en la importación y exportación de archivos convirtiéndose en uno de los formatos de archivo más utilizados para intercambiar partes de un diseño con clientes, proveedores y colaboradores.

AutoLISP es un lenguaje sencillo de aprender y a diferencia de otros lenguajes de programación se pueden crear programas interesantes y realmente útiles casi desde el primer momento.

Muchas veces, la mayoría del tiempo empleado en crear una macro o programa se emplea en depurar el código (corregir errores). La planificación y el análisis previo de la macro es de suma importancia para evitarlo. El primer paso para escribir una macro consiste en escribir en un papel con un lenguaje simple lo que se desea que realice el programa, a esto se le denomina pseudocódigo. Un método algo más avanzado y eficaz es utilizar diagramas de flujo.

Cuando ya empieces a programar en AutoLISP por ti solo, te será muy útil reunir todas las anotaciones sobre proyectos de aplicaciones y macros en una libreta o bloc de notas. También puedes utilizar Evernote o cualquier otro sistema que te permita almacenar de información o gestionar las macros que has creado.

Interfaces de programación

AutoCAD dispone varios entornos de programación, la selección del tipo de interfaz a emplear para crear una aplicación dependerá de las necesidades de la aplicación y de la experiencia o conocimientos del programador/es:

  • AutoLISP es una adaptación del lenguaje de programación CommonLISP para AutoCAD. Es sencillo de aprender y al mismo tiempo potente. AutoCAD cuenta con un intérprete interno de LISP que permite introducir código desde la línea de comandos o cargar programas desde archivos externos. Puedes utilizar AutoLISP para automatizar tareas repetitivas y crear nuevos comandos de AutoCAD
  • ActiveX Automation constituye una alternativa moderna al AutoLISP. Puedes acceder y controlar objetos de AutoCAD desde cualquier aplicación que utilice un controlador Automation como Visual Basic y Delphi, o cualquiera de las aplicaciones que dispongan de Visual Basic for Applications (VBA)
  • VBA es un entorno de programación basado en objetos que utiliza íntegramente la sintaxis del lenguaje Visual Basic y permite usar controles ActiveX. Permite también la integración con otras aplicaciones que utilizan VBA como MS Office o MS Project. Las ediciones de desarrollo de MS Visual Basic, que se adquieren por separado, complementan AutoCAD VBA con componentes adicionales como un dispositivo externo de base de datos y funcionalidades de escritura de informes
  • ObjectARX es un entorno de programación de lenguaje compilado para el desarrollo de aplicaciones de AutoCAD. El entorno de programación ObjectARX incluye varias bibliotecas de vínculos dinámicos (DLL) que ofrecen acceso directo a las estructuras de la base de datos, el sistema de gráficos y los dispositivos de geometría de AutoCAD

De momento nos centraremos en la programación sobre AutoCAD utilizando el interprete interno de AutoLISP para pasar en breve al entorno de Visual LISP y posteriormente a la programación en VBA.

Características de AutoLISP

El LISP fue desarrollado a finales de los años 50 por John McCarthy, es el segundo lenguaje de programación más antiguo solo precedido por Fortran. Uno de los campos en los que es más empleado es en la investigación en inteligencia artificial. Su nombre proviene de LISt Procesing (Procesado de listas), pues se basa en el uso de listas en lugar de datos numéricos. Aunque hay quien mantiene en tono jocoso que su nombre proviene de “Lost In Stupid Parenthesis”.

AutoLISP añade al LISP algunas funciones especialmente diseñadas para la manipulación de las entidades de AutoCAD.

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

  • en los lenguajes interpretados, se va traduciendo el programa a código máquina (el idioma de los ordenadores) a medida que se ejecuta
  • en los lenguajes compilados, el código fuente (texto) del programa se traduce a código máquina generando un archivo ejecutable (.EXE) que es el que ejecutará el programa

Hay quien dice que AutoLISP es lento comparándolo con otros lenguajes como Pascal o C, especialmente cuando se utilizan muchas funciones matemáticas. Sin embargo, cuando se utiliza manipulando símbolos los resultados son muy distintos. Esto hace de AutoLISP un excelente lenguaje para la programación de sistemas CAD, ya que un sistema CAD no es más que un entorno de manipulación de símbolos gráficos.

Una de las características más importantes de AutoLISP es la posibilidad de acceder a la base de datos de los dibujos de AutoCAD. Donde podemos acceder a las capas, estilos de texto, sistemas de coordenadas personales (SCP)… así como a todas las entidades del dibujo. Esta información se puede modificar, extraer e incluso añadir más entidades al dibujo o información adicional.

La mayoría de los primeros lenguajes de programación de alto nivel como C o Pascal son lenguajes procedimentales, se ejecutan una serie de instrucciones paso a paso a partir de unos datos. En AutoLISP en lugar de seguir instrucciones prefijadas, se puede acceder a la información de los objetos de AutoCAD para determinar de que información se dispone, preguntándole a los objetos por ellos mismos.

AutoLISP no es estrictamente un lenguaje orientado al objeto, pero contiene bastantes características de estos tipos de lenguajes debido a que puede interactuar con los objetos contenidos en los dibujos.

AutoLISP permite crear nuevos comandos para AutoCAD, que se ejecuten como cualquier otra orden. Es posible incluso redefinir los comandos de AutoCAD para que funcionen de forma distinta, por ejemplo podríamos redefinir el comando “POLIGONO” para que dibuje polígonos estrellados en lugar de los regulares.

Una mención especial merece el uso de AutoLISP en la realización de programas paramétricos y en el diseño semiautomático, ya que entre el 60% y el 80% del diseño está dedicado a la modificación de diseños previos. En los programas paramétricos, el usuario introduce una serie de datos o parámetros a partir de los cuales el programa realiza el diseño completo de un elemento u objeto. Esta puede ser sin ninguna duda una de las mayores aplicaciones de AutoLISP.

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

Visual LISP incluye un compilador, un depurador y diversas utilidades para facilitar la programación.

Además añade nuevos comandos para permitir la interacción con objetos que utilizan ActiveX. Otra de las novedades que aporta Visual LISP son los reactores de objetos que permiten que AutoLISP responda a eventos.

En los dos primeros capítulos del curso se trabajará desde la ventana de comandos de AutoCAD. A partir del tercer capítulo ya crearemos nuestras macros en archivos de texto utilizando el entorno de Visual LISP proporcionado por AutoCAD.

Existen dos inconvenientes al emplear AutoLISP desde la ventana de comandos de AutoCAD:

  • en primer lugar el reducido espacio con el que se cuenta en la ventana de comandos de AutoCAD y la dificultad que supone el no tabular el código, es decir escribir el código todo seguido. Esto es debido a que cada vez que se pulsa Intro, AutoCAD evalúa lo que se ha escrito
  • en segundo lugar, al terminar la sesión de trabajo en AutoCAD se perderán todos los datos almacenados en la memoria temporal

Expresiones y procedimientos de evaluación

Un 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ón de AutoLISP (o una función creada por el usuario) y una serie de argumentos (a veces opcionales) que dependen de la función indicada y van separados por al menos un espacio en blanco. Cada expresión termina con un paréntesis de cierre, esto es muy importante pues el número de 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 por expresiones (listas) anidadas unas dentro de otras; de modo que la más interior devolverá su resultado como un argumento a la lista exterior.

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

Los primeros ejemplos que vamos a ver son sencillos y cortitos, así que puedes teclearlos directamente en la ventana de comandos de AutoCAD.

Ejemplo:

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

(+ 31 22 -3) Ejecuta la función + que realiza la suma de los argumentos 31, 22 y -3 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. Recuerda que primero evalúa la lista interior y devuelve su resultado a la exterior.

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

¿Qué sucedería si al escribir la expresión (+ 1 (/ 5.0 2)) nos olvidásemos de escribir el último paréntesis? Haz la prueba, veras que AutoCAD te indica que falta 1 paréntesis de cierre.

Si el interprete de comandos de AutoCAD encuentra un paréntesis de apertura, supone que todo lo que vaya a continuación hasta el paréntesis de cierre es una expresión de AutoLISP. De modo que envía esa expresión al interprete de AutoLISP para que la evalúe.

En el siguiente capítulo veremos algunas de las operaciones matemáticas que se pueden realizar con AutoLISP.

Tipos de objetos y datos

Los elementos de las expresiones de AutoLISP pueden ser símbolos, valores concretos y también otras expresiones. Se pueden distinguir los siguientes tipos de elementos:

  • Símbolos: Cualquier elemento que no sea un valor concreto. Por ejemplo 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
  • Conjuntos designados por el usuario: Conjuntos de entidades de AutoCAD
  • Funciones de usuario: Funciones definidas por el usuario
  • Funciones de AutoLISP: Funciones o comandos predefinidos de AutoLISP
Ejemplo:

(+ 5 2) devuelve 7.

(+ 5 2.0) devuelve 7.0.

En el primer caso todos los argumentos son números enteros, y el resultado de su suma es un número entero. En el segundo caso, tenemos un número real, así que el resultado es un número real. Para que comprendas la importancia de esta distinción, realiza el siguiente ejemplo:

(/ 5 2)

(/ 5 2.0)

Una de las mayores virtudes de AutoLISP es que pueden ejecutarse expresiones en medio de un comando de AutoCAD.

Ejemplo:

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

Prueba ahora indicando el radio de la circunferencia (- 70 25) al utilizar el comando llamado “CIRCULO” (mal llamado, pues debería ser “circunferencia”).

Podemos emplear también la constante PI = 3.14159… para realizar cálculos. Por ejemplo, ejecuta de nuevo el comando “CIRCULO” y cuando pregunte el radio de la circunferencia, teclea (/ 6 (* 2 PI)). Obtendremos una circunferencia de perímetro 6.

Notación empleada

Para describir las funciones de AutoLISP que se expliquen a lo largo del curso se seguirá la siguiente notación:

(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

En este apartado se indicarán una serie de convenciones recomendables a la hora de programar. Alguna de ellas puede que aún no las entiendas, pero no te preocupes porque las iremos recordando a medida que avancemos en el curso.

  • para los comentarios incluidos en 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 anteriores, esta no se inserta en 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 funciones)
  • recuperar el valor inicial de las variables de sistema de AutoCAD que han sido modificadas
  • añadir unas líneas al final del programa para indicar el nombre del nuevo comando, autor, etc.
  • no introducir demasiado código en la función principal
  • incluir una función de tratamiento de errores
  • evitar que el usuario pueda introducir datos erróneos
  • en general es recomendable que, tras ejecutar el nuevo comando, si se ejecuta 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:
    • los paréntesis de apertura y cierre se mostrarán en rojo ( )
    • las funciones de AutoLISP se mostrarán en azul setq
    • los números se mostrarán en verde 125.6 12
    • los textos se mostrarán en rosa /nDesigne un punto:
    • los comentarios se mostrarán en púrpura ;Esto es un comentario
    • las funciones de usuario se mostrarán en mayúsculas (GAR 90.0) 


Introducción a la programación en AutoCAD

Leave a Reply