De cada nueva versión de AutoCAD esperamos novedades. Algunas versiones quizás nos hayan defraudado, otras no. La versión 2000 es de las que no nos defraudan. Si me preguntan por los aportes trascendentes de esta versión, me atrevería a elegir dos. Por una parte señalaría la evolución del Espacio-Papel hacia el concepto integral de Presentación (LAYOUT). El otro aporte, a mi juicio, se encuentra en el campo de la programación. Se trata de la muy esperada renovación de AutoLISP, que deviene Visual LISP.Los orígenes
Visual LISP es, en realidad un viejo conocido de los desarrolladores profesionales. Eran ellos los que desde hace mucho pedían una solución a las evidentes limitaciones de AutoLISP. Dos eran las exigencias fundamentales. La primera, velocidad de procesamiento, especialmente en lo que se refiere a los cálculos numéricos más complejos. La segunda, una manera más segura de proteger sus derechos de propiedad intelectual sobre el código fuente. A partir de la versión 10 tuvimos la posibilidad de programar en lenguaje C empleando una colección de rutinas que reproducían, de forma un tanto mecánica, cada una de las funciones AutoLISP. Esta solución de compromiso se hizo pronto obsoleta, ante la introducción con la versión 13c4 de la programación orientada a objetos C++ mediante la tecnología ObjectArx. De manera casi simultánea, en BASIS Software, una pequeña empresa casi desconocida, exploraban otra vía. AutoLISP había permanecido sin grandes cambios desde su introducción en 1985-86. Pero el lenguaje LISP del cual se deriva había experimentado durante esos años grandes avances. Las modernas implementaciones de LISP, aparte de enriquecerse con la introducción de nuevas funciones y estructuras de datos, y sin perder las ventajas del lenguaje original entre las cuales figuran:
- posibilidad de evaluar de manera inmediata cada línea de código,
- asignación dinámica del tipo de dato,
- gestión automática de la memoria con una eficiente recuperación de nodos (garbage collection),
disponen ahora de potentes compiladores que hacen posible además guardar y ejecutar el código como instrucciones en lenguaje de máquina. BASIS Software introdujo Vital LISP en la primavera de 1995, poniendo con ello a disposición de los programadores, para las versiones 12 y 13 de AutoCAD, un LISP moderno dotado sin embargo de la capacidad de emular al AutoLISP nativo, asegurando con ello la compatibilidad con las aplicaciones desarrolladas anteriormente. El éxito de Vital LISP entre los programadores profesionales llevó a AutoCAD a comprarlo a fines de 1997, renombrándolo como Visual LISP
1. Sin la posibilidad de incorporarlo a la versión 14 que ya estaba en el mercado, se ofreció como programa complementario a un precio sustancialmente más bajo que el de BASIS Software.
Aplicaciones desarrolladas sobre Visual LISP
El no formar parte del núcleo de AutoCAD R14 obligaba al programador a incluir con su programa un RTS o Sistema de Tiempo de Ejecución (Run-Time System) que debía cargarse para ejecutar los programas Visual LISP. Esta necesidad fue cubierta de manera sumamente práctica mediante la posibilidad de empaquetar
todos los ficheros de la aplicación, tanto los LISP compilados (ficheros FAS) como los que deben permanecer en formato de texto (los DCL, por ejemplo) junto con el RTS en un ejecutable de formato ARX (AutoCAD Runtime eXtension) similar a los desarrollados con C++ mediante el API de ObjectARX. Ahora con AutoCAD 2000, ya Visual LISP forma parte de la versión standard del programa. Con lo que no será ya necesario suministrar un RTS con la aplicación desarrollada, lo que redunda en una considerable reducción del tamaño de los programas. Según nuestra experiencia, de una aplicación cuyas fuentes (ficheros LSP y DCL) ocupan unos 102 Kb resulta una vez compilado como ARX (Versión 14) un fichero de 602 Kb, mientras que compilado como aplicación Visual LISP para AutoCAD 2000 (fichero VLX) sólo ocupará 46 Kb.
El Entorno de Desarrollo:
En un artículo introductorio como este sería imposible hacer una enumeración exhaustiva de todo lo que al desarrollador brinda ahora Visual LISP. Nos conformaremos con una rápida inspección de sus principales características.
Figura 1. El IDE Visual LISP
El entorno de Desarrollo (IDE) se carga mediante el comando
vlisp
. La ventana de aplicación que se abre nos permite acceder a todas las herramientas de software necesarias al programador. Entre sus componentes funcionales encontramos:
- Verificador de Sintaxis que reconoce expresiones erróneas y argumentos inadecuados en llamadas a las funciones primitivas de AutoLISP.
- Compilador de Archivos que incrementa la velocidad de ejecución y suministra una plataforma segura y eficiente para la distribución de aplicaciones. El compilador es capaz de procesar ficheros tanto aislados como agrupados en proyectos
- Depurador del Código Fuente diseñado específicamente para AutoLISP, que permite recorrer paso a paso el código en la ventana del Editor al mismo tiempo que se muestran los resultados de su ejecución en la ventana gráfica de AutoCAD.
- Editor de Texto que codifica por color las fuentes AutoLISP y DCL, al tiempo que brinda otras ayudas a la verificación de la sintaxis.
- Formateador AutoLISP que reestructura el programa para mejorar su legibilidad.
Figura 2. Ventana INSPECT mostrando lista de datos de entidad
Figura 3. Ventana WATCH con los valores actuales de las variables
- Útiles de Inspección (Fig. 2) y Seguimiento (Fig. 3 y 4) que facilitan el acceso a los valores que asumen las variables y expresiones permitiendo su revisión y modificación. Pueden ser utilizados para examinar los datos AutoLISP así como las entidades de AutoCAD.
Figura 4. Ventana Symbol Service mostrando el valor asociado a un símbolo
Figura 5. Ventana APROPOS mostrando los resultados de una búsqueda de símbolos
Figura 6. Ventana de Proyecto mostrando los archivos que lo integran
- Ayuda sensible al contexto que suministra información sobre las funciones AutoLISP y una potente utilidad Apropos (Fig. 5) para la búsqueda de nombres de símbolos.
- Sistema de Gestión de Proyectos (Fig. 6) que facilita el mantenimiento de aplicaciones que abarcan varios ficheros. Posibilidad de empaquetar los archivos AutoLISP compilados en un módulo único, junto a las correspondientes definiciones de diálogos (DCL).
- Consola LISP Inteligente (Fig. 7) que permite evaluar de manera inmediata el código y provee otra serie de funciones de gran utilidad en el proceso de desarrollo de los programas.
Figura 7. Consola Visual LISP con el resultado de evaluar funciones
¿Por qué Visual LISP?
Pero no es mi intención ahora la de explicar punto por punto la gama de opciones que brinda este Entorno de Desarrollo. Creo que queda claro que las dos demandas más perentorias de un programador, velocidad y seguridad quedan en buena medida resueltas. Y que además su trabajo será más llevadero con estas herramientas que acabo de enumerar. Pero queda una cuestión por responder: ¿Dará Visual LISP una respuesta adecuada como lenguaje para las aplicaciones que hoy necesitamos? Esta pregunta no es trivial. Allá por 1986 no había otra opción. Pero hoy pueden crearse aplicaciones que gestionen AutoCAD con casi cualquiera de los lenguajes de programación modernos, desde Visual Basic hasta Java. No entraré a discutir los méritos relativos de cada uno de estos lenguajes de programación, discusión en la que además no sería seguramente imparcial. Confieso que suscribiría con gusto la opinión de Paul Graham cuando dice que "de todos los lenguajes que conozco, me gusta más LISP, simplemente porque es el más hermoso
2". Examinemos ahora lo que, en lo que se refiere al lenguaje de programación en sí mismo, aporta Visual LISP.Nuevas Funciones LISP:
En primer término Visual LISP aumenta de manera significativa el número de funciones disponibles, incluyendo muchas que ya forman parte desde hace bastante tiempo de la norma del Common LISP
3. Estas funciones se distinguen de las primitivas AutoLISP mediante el prefijo VL- y suman unas 70, entre las que se incluyen varias para lectura y escritura en el registro de Windows o que permiten gestionar el almacenaje en archivos y carpetas, algunas utilizables para un tratamiento más efectivo de los errores en tiempo de ejecución, y otras para tratamiento y conversión de datos LISP como símbolos, cadenas y listas.
Reactores
Otro grupo de nuevas funciones que se identifican mediante el prefijo VLR- tienen como objetivo el de implementar reactores. Los reactores hacen que una determinada aplicación reciba de AutoCAD un aviso cuando tienen lugar determinados eventos, para desencadenar una determinada respuesta por parte del programa. Son cuatro los tipos de reactores que corresponden a las categorías generales de eventos a los cuales una aplicación puede responder:
- Reactores del Editor, que notificarán cada vez que se invoque un comando de AutoCAD.
- Reactores de la Base de Datos, vinculados a entidades u objetos específicos de la base de datos de un dibujo.
- Reactores de Objeto, que notificarán si determinadas acciones se realizan sobre una entidad dentro de AutoCAD.
- Reactores de Enlace, que notifican a la aplicación cuando se carga o descarga una aplicación ARX.
Este es un tema sumamente complejo que ya abordaremos en un futuro. Las rutinas de respuesta llamadas desde los reactores deberán necesariamente utilizar las nuevas funciones ActiveX de Visual LISP en lugar de recurrir a la vieja función command de AutoLISP.
Interfaz ActiveX
Las nuevas funciones ActiveX presentes en Visual LISP brindan una serie de ventajas, entre las que se encuentran una mayor velocidad de ejecución y una funcionalidad más amplia, como la posibilidad antes mencionada de implementar reactores. Estas funciones se distinguen, al igual que las otras nuevas funciones incorporadas a Visual LISP, por sus prefijos. Las tenemos de dos tipos:
- Funciones VLA-las que corresponden directamente a los métodos ActiveX nativos de AutoCAD,
- Funciones VLAX- las que son funciones especializadas exclusivas de Visual LISP.
Funciones VLA-
Para las funciones VLA- no existe una documentación Visual LISP, ya que se trata de los mismos métodos de ActiveX Automation (los empleados en la programación VBA) propios de AutoCAD, a los que se adiciona el prefijo VLA-. Un ejemplo de conversión de la sintaxis Visual Basic a Visual Lisp se indica en el siguiente diagrama:
Obsérvemos que:
- El valor devuelto por el método o la propiedad ActiveX se asigna mediante la función setq a una variable, en este caso CircleObj. La gestión de los Objetos VLA4 en memoria exige conservar un puntero a ellos para su uso y para liberarlos cuando ya no sean necesarios.
- Al nombre del método, en este caso AddCircle, se añadirá el prefijo vla- para obtener la función Visual LISP vla-AddCircle.
- El método pertenecerá a determinado tipo de objeto. Esto determina el parámetro que se le deberá pasar a la función Visual LISP. En este caso el método AddCircle corresponde al objeto Colección Espacio-Modelo. En el ejemplo se supone que la variable mspace contiene un puntero a este objeto.
- Cada método ActiveX requiere determinados argumentos, en este caso las coordenadas del centro en la variable ctrpt y el radio en la variable radius. Estos argumentos que se pasan a los métodos ActiveX pueden ser de tipos simples como enteros, dobles, booleanos y cadenas o de tipos agregados como safearrays (matrices) encapsulados en variants. Visual LISP suministra una API para crear safearrays y variants, para consultar y cambiar sus tipos, para establecer u obtener sus valores y en el caso de los safearrays, para investigar su dimensión.
Funciones VLAX-
Las funciones VLAX-son extensiones del lenguaje que deben ser cargadas de manera expresa mediante una llamada a (vl-load-com) antes de que puedan utilizarse. La funciones VLAX- incluyen:
- Funciones para manipular colecciones de objetos.
- Funciones para medición de curvas.
- Funciones de conversión entre tipos de datos LISP y Visual BASIC.
- Funciones para gestión de Diccionarios.
- Funciones para invocar métodos.
- Funciones para manipular objetos.
- Funciones para gestionar propiedades.
Visual LISP como Cliente ActiveX
La interfaz ActiveX permite a Visual LISP actuar como cliente y como servidor ActiveX, permitiéndole controlar o ser controlado desde otras aplicaciones. La función vlax-import-type-library permite importar una biblioteca de tipos desde otra aplicación que pueda actuar como servidor ActiveX. Con esta función se podrán definir los prefijos que Visual LISP utilizará (de manera similar al prefijo vlaantes descrito para los métodos propios de AutoCAD) al crear las funciones contenedoras de los métodos, propiedades y constantes de la biblioteca de tipos importada. Pero también se puede acceder a una aplicación externa sin necesidad de importar su biblioteca de tipos. El importar una biblioteca tiene sus inconvenientes. Las aplicaciones tales como Microsoft Word y Microsoft Excel contienen centenares de métodos y propiedades, que al generar las funciones contenedor necesarias para cada una de ellas resultará en la utilización de una buena parte de la memoria disponible. E incluso, es posible que se necesite utilizar alguna propiedad o método ActiveX para los cuales no se generara de manera automática la función contenedor. Para evitar estos inconvenientes que resultan de la importación de las bibliotecas de tipos, Visual LISP suministra las siguientes funciones:
- vlax-invoke-method
- vlax-get-property
- vlax-put-property
Invocar un Método ActiveX con vlax-invoke-method
La función vlax-invoke-method llama directamente a un método ActiveX. Requiere los siguientes argumentos:
- El objeto VLA sobre el que se ejecutará el método
- Una cadena que identifica el método a invocar
- Uno o más argumentos requeridos por el método
El valor devuelto dependerá del método que se invoca.
Obtener una propiedad ActiveX con vlax-get-property
La función vlax-get-property devuelve la propiedad de un objeto. La funciónrequiere los siguientes argumentos:
- Un objeto VLA que identifica al objeto cuya propiedad se desea obtener.
- Una cadena que identifica la propiedad a obtener.
Devuelve el valor de la propiedad del objeto.
Modificar una propiedad ActiveX con vlax-put-property
La función vlax-put-property cambia la propiedad indicada de un objeto. Lafunción requiere como argumentos:
- Un objeto VLA que identifica el objeto cuya propiedad se desea cambiar.
- Una cadena que identifica la propiedad.
- El nuevo valor para la propiedad.
Si vlax-put-property tiene éxito en modificar la propiedad, devolverá nil.
Conclusiones
Hemos querido resumir en este artículo inicial las nuevas potencialidades que se introducen con Visual LISP. No es nuestra intención hacer proselitismo a favor de LISP. Si algo debe quedar claro es que hoy las aplicaciones que gestionan AutoCAD y sus dibujos pueden desarrollarse en lenguajes de programación tan dispares como Visual BASIC, Delphi, C++, Java e incluso otros dialectos de LISP. Para nada recomendaría a un programador con experiencia en cualquiera de estos entornos el aprender Visual LISP. Pero de la misma manera, creo que un programador habituado al LISP de AutoCAD no tiene por qué echar en falta las prestaciones de otros lenguajes de programación. Una de esas prestaciones hasta ahora difíciles de implementar sería, por ejemplo, la capacidad para interactuar con otras aplicaciones del entorno Windows. La facilidad extrema con que esto se logra a partir de la posibilidad de ejercer el papel de cliente ActiveX será el tema de nuestro próximo artículo. De ahí en adelante, el derrotero que sigamos va a estar determinado por la opinión de ustedes. Esta sección y su autor están abiertos a sus preguntas y sugerencias. Quedo en espera de ello.
- Visual LISP era la marca de un editor bastante rudimentario para AutoLISP desarrollado por la firma Western Sierra Software y que estaba disponible como freeware descargable por Internet hasta que fue comprado por Autodesk por lo único que en él valía: el nombre.
- Paul Graham, On Lisp. Advanced Techniques for Common Lisp. Prentice-Hall, Englewood Cliffs, 1994 ISBN: 0-13-030552-9
- Definidas en las ediciones 1 y 2 del libro de Guy Steele, Common LISP, The Languaje, y más recientemente como norma ANSI.
- Los objetos que forman parte de un dibujo pueden ser representados como objetos Visual LISP ActiveX (VLA), un nuevo tipo de dato que introduce Visual LISP. Al trabajar con funciones ActiveX se debe siempre hacer referencia a objetos VLA y no al nombre de entidad (ENAME) devuelto por funciones tales como entlast.