4.4. VLX: la Aplicación Visual LISP

En nuestro artículo anterior completamos el código necesario para un programa que nos permite exportar el valor de los atributos de un determinado bloque a una tabla EXCEL. Dicho código incluye tres archivos de código fuente LISP así como uno con la definición de la interface gráfica de usuario en código DCL. La gestión de un proyecto como éste que ya reviste una cierta complejidad se facilita con las herramientas del Entorno de Desarrollo (IDE) Visual LISP.


Gestión de una Aplicación

Normalmente una aplicación real será aún más compleja que esta que hemos desarrollado. Puede llegar a incluir miles de líneas de código distribuidas en una serie de archivos de código fuente LSP. Este código fuente puede compilarse para incrementar su eficiencia, con lo que se generan otros archivos intermedios y ejecutables compilados. Puede llegar a ser muy engorroso el seguimiento de todos estos archivos para determinar, por ejemplo, cuándo será necesario recompilar los modificados o cuándo rehacer toda la aplicación. También se deberán establecer los parámetros relativos a la manera de compilar según las características del código elaborado. Si además incluye otros archivos de recursos (definiciones de diálogo o archivos de texto), lo recomendable será empaquetarlo como un único archivo VLX.

 La Función VLISP-COMPILE

La función que llama al compilador VLISP es vlisp-compile. Esta función es suficiente si se trata de compilar un sólo archivo,

(vlisp-compile 'modo "archivoFuente" "archivoSalida")

 y puede ejecutarse ya sea desde la consola VLISP o desde la línea de comandos de AutoCAD (siempre que se haya cargado previamente el IDE Visual LISP). Los argumentos que se le suministran son:

  • 'modo, (obsérvese el apóstrofe) que representa el tipo de compilación deseada:
    • st modo standard.
    • lsm optimizar y enlazar (link) de manera indirecta
    • lsa optimizar y enlazar de manera directa
  • "archivoFuente"  una cadena que representa el nombre del archivo fuente del código LISP, si no se especifica la extensión, se supone LSP.
  • "archivoSalida"   este argumento es opcional, de no estar presenta se dará al archivo de salida el mismo nombre del archivo del código fuente con la extensión FAS, y se ubicará en su misma carpeta.

Modos de Optimización

Los resultados del proceso de compilación son, al menos, dos:

En primer lugar, se evita la traducción a lenguaje de máquina que debe efectuarse cada vez que se carga en memoria el código AutoLISP en formato de texto. El archivo FAS resultante de la compilación contiene instrucciones directamente comprensibles para la computadora, evitando toda ulterior interpretación del código. Además del ahorro en tiempo (de ahí la extensión FAS, derivada de FASt loading), el código obtenido será comprensible para la máquina pero no para los curiosos. Esto se lograría ya con el modo standard.

Los otros modos de optimización permiten obtener programas aún más eficientes, marcando la diferencia a medida que crecen en tamaño y  complejidad.

Permiten:

  1. Enlazar las llamadas a funciones de manera que se creen referencias directas a la función compilada en lugar de invocar el símbolo que representa a la función  mejorando su desempeño y evita el peligro de que una eventual redefinición afecte el comportamiento del programa.
  2. Desechar los nombres de funciones para hacer el código compilado más seguro, reduciendo a la vez el tamaño del programa y el tiempo de carga.
  3. Desechar también los nombres de las variables locales enlazando directamente sus referencias, con lo que se gana aún más rapidez y procurando una reducción adicional en tamaño.

No son todos aplicables en cualquier caso. Veremos cómo cierto grado de optimización provocará errores, la causa de ello y el remedio a aplicar.

El Gestor de Proyectos VLISP

El modo de compilación cuando se emplea la función vlisp-compile será casi siempre el standard ('st). En una aplicación compleja que exija el control del código distribuido en varios archivos diferentes será mejor el configurar un proyecto Visual LISP.

Este proyecto mantiene un listado de archivos de código fuente y una serie de reglas, más detalladas que lo posible con vlisp-compile, sobre cómo compilar y optimizar la aplicación, permitiendo:

  • Comprobar qué archivos .LSP de la aplicación han sido modificados para recompilarlos automáticamente.
  • Abrir los archivos que aparecen en la lista con un solo clic del ratón.
  • Buscar cadenas de texto dentro de todos los archivos que integran el proyecto.
  • Vincular (link) directamente las partes del código que convenga aunque pertenezcan a diferentes archivos.

Todas las funciones de gestión del proyecto están integradas en una pequeña ventana que presenta la lista de archivos, una barra de botones en la parte superior (ver Figura 1) y un menú contextual al que se accede pulsando el botón derecho del ratón (ver Figura 2).

Figura 1.- Ventana del Proyecto Figura 2.- Menú contextual del proyecto

Configurar el Proyecto

Antes de proceder a configurar nuestro proyecto será bueno establecer una estructura de carpetas donde se ubicarán los diversos archivos utilizados en el proceso (ver Figura 3). Los archivos ExtrATT.LSP, LeeAtribX.LSP, ListaExcel.LSP y ExtrATT.DCL proceden de los números 61, 62 y 63 de esta revista y se ubicarán en la carpeta LSP. Los otros archivos, que serán generados por el IDE se describen en la Tabla 1.

Figura 3.- Estructura de carpetas del proyecto

Carpeta

Extensión

Tipo de Archivo

Propósito

LSP

.LSP

Código fuente AutoLISP

Código fuente de la aplicación

 

.DCL

Definición de Diálogos

Controla la interface gráfica de la aplicación.

PRJ

.PRJ

Definición del proyecto

Situación y nombres de los archivos LSP así como los parámetros y reglas para la compilación

 

.GLD

Declaraciones globales

Parámetros detallados para un control más preciso de la compilación

LSP/TMP

.OB

Código Objeto

Código AutoLISP compilado usado para la generación de los archivos FAS

 

.PDB

Datos del Proyecto

Información sobre símbolos utilizada por el compilador

LSP/FAS

.FAS

Código AutoLISP compilado

Programas compilados que pueden ser ejecutados o empaquetados en módulos VLX

LSP/VLX

.VLX

Aplicación VLISP

Aplicaciones ejecutables para AutoCAD

 

.PRV

MAKE de la aplicación

Define los archivos y opciones empleadas para construir la aplicación VLX mediante el Asistente (Wizard) para Aplicaciones

Tabla 1. Archivos del Proyecto

Para construir nuestro proyecto disponemos de la opción Nuevo Proyecto... (New Project... ) en el menú Proyecto (Project). Al seleccionarla aparece un diálogo para seleccionar la carpeta del proyecto y darle un nombre al mismo. Escogeremos la carpeta PRJ, según la estructura definida anteriormente.

Hecho esto, aparece el diálogo Propiedades del Proyecto (Project Properties). Este diálogo cuenta con dos fichas, Archivos de Proyecto (Project Files) y Opciones de Generación (Build Options).

Para seleccionar los archivos LSP, pulsaremos el botón señalado con [...] para buscar la carpeta LSP o en su defecto escribiremos la trayectoria en la casilla de edición Buscar en (Look in). En cuanto seleccionamos la carpeta correcta aparecen en la casilla de lista a la izquierda los nombres de los archivos LSP existentes. Los seleccionamos pulsando sobre ellos (no es necesario presionar la tecla CTRL) y con el botón [>] los pasamos a la casilla de la derecha (ver Figura 4).

Figura 4.- Propiedades del Proyecto

Si fuera necesario incluir archivos de distintas carpetas, podemos repetir este proceso hasta que en la lista derecha aparezcan todos los archivos necesarios para la aplicación. El orden de la lista determina el orden en que serán cargados los archivos. En nuestro caso el último archivo deberá ser ExtrATT.LSP, por lo que lo seleccionaremos y pulsaremos el botón Final (Bottom) para llevarlo a la posición adecuada. Para ver las trayectorias y tamaño de los archivos podemos seleccionarlos y en el menú contextual que resulta de pulsar el botón derecho del ratón elegir Registrar nombres de archivo y tamaño (Log filenames and size).

Opciones de Generación

En la optimización iremos a por todas. Desde ahora anunciamos que nuestro primer intento fracasará. Las opciones que elegiremos se muestran en la Figura 5.

Figura 5.- Opciones de Compilación

En resumen hemos elegido:

  1. Fusión de los archivos en un módulo único, es decir un sólo archivo FAS. Esto hará más rápida la carga.
  2. Elegir el modo de vínculo Interno, con lo que las llamadas a funciones son enlazadas directamente al código compilado de la función eliminando los nombres de las mismas del archivo FAS.
  3. Seleccionamos el modo Localizar variables, con lo que el compilador además elimina todos los nombres de símbolos locales de manera que el programa apunta a la dirección de memoria donde se guarda el valor, en lugar de hacerlo a un símbolo que representa dicha dirección.
  4. Para prevenir en lo posible errores derivados de este alto grado de optimización, también seleccionamos Optimización segura (Safe optimize) que pone en acción un mecanismo destinado a evitar posibles errores a consecuencia de estas opciones extremas seleccionadas.
  5. En Modo de Mensaje (Message Mode) seleccionamos Informes completos (Full reports) para asegurarnos de tener el máximo de información sobre el proceso de compilación.
  6. En esta ficha también debemos indicar las carpetas donde queremos situar los archivos FAS y los archivos temporales. De momento no utilizaremos el botón Editar Declaraciones Globales... (Edit Global Declarations...)

Al Aceptar habremos concluido la definición del proyecto. Antes de compilar el proyecto recordemos que las funciones Visual LISP extendidas (vlax-... etc.) no estarán disponibles si antes no ejecutamos (vl-load-com). Una vez cargadas estas funciones, ya podemos compilar el proyecto, pulsando sobre el correspondiente botón de la barra de herramientas de la ventana del proyecto. Será bueno examinar después en detalle lo que aparece en la ventana Salida de Generación (Build Output). Veamos especialmente las líneas señaladas en azul, donde se encuentran las advertencias generadas por la función de Optimización Segura (ver Figura 6). Al hacer doble-clic sobre cualquiera de las líneas así resaltadas, se abrirá el documento que contiene el fragmento de código referido.

Figura 6.- Mensajes informativos sobre la compilación

Errores Generados al Compilar

Probemos ejecutar el módulo FAS. Recordemos que el DCL debe estar en una de las trayectorias de búsqueda de AutoCAD, por ejemplo la carpeta SUPPORT. Recibiremos un mensaje indicando que CargaDialogo es una función no definida. Busquemos CargaDialogo en la Salida de Generación. Encontraremos lo siguiente:

nombres de funciones ignorados

(CARGADIALOGO LISTANOMBRES SELBLOQUE TIENEATRIBUTOS)

o en la versión inglesa:

dropped function names

(CARGADIALOGO LISTANOMBRES SELBLOQUE TIENEATRIBUTOS)

Lo que indica que, entre otros, el compilador ha desechado el nombre de esta función. Por este motivo, una llamada a la función CargaDialogo que el compilador no ha detectado en el archivo ExtrATT.LSP:

(vlax-add-cmd "AtrEX" 'CargaDialogo)

provocará el error que impide la ejecución del programa. Este nombre de función no se ha detectado, a pesar de que activamos el modo Optimización Segura, al estar precedido del apóstrofe o símbolo QUOTE, lo que determina que no sea evaluado. Tendremos que modificar entonces las propiedades del proyecto, en lo que se refiere a la compilación. Ahora es que recurriremos al botón Editar Declaraciones Globales... para establecer en detalle las opciones de compilación. Ante todo, se nos preguntará si queremos crear el fichero GLD para el proyecto. Al abrirse este fichero buscamos la lista NOT-DROP y le incluimos el símbolo CargaDialogo (ver Figura 7). Al recompilar el proyecto obtendremos en la ventana Build Output:

nombres de funciones no ignorados

(CARGADIALOGO COMPRUEBAATRIBUTOS EXTRATT)

o en inglés:

not dropped function names

(CARGADIALOGO COMPRUEBAATRIBUTOS EXTRATT)

Con lo que se habrá logrado resolver este error.

Figura 7.- Archivo de Declaraciones Globales (GLD)

Creando el Módulo de la Aplicación

 El módulo VLX se crea mediante un Asistente al que se accede desde el menú Archivo>Crear Aplicación>Asistente para nueva aplicación... (File>Make Application>New Application Wizard...) siguiendo los pasos que se describen a continuación:

Paso 1

Elegir el modo Experto.

Paso 2

Carpeta de la aplicación: VLX (para archivos VLX y PRV)

Nombre de la aplicación: ExtrATR.

Paso 3

Nos permite decidir si la aplicación se ejecutará en un espacio de memoria propio. Este tema lo trataremos más adelante. Por ahora lo dejamos como está.

Paso 4

Archivos que integrarán nuestra aplicación.

En la casilla de lista desplegable seleccionaremos Archivos de Proyecto Visual LISP (Visual LISP Project Files). Pulsamos en Agregar (Add...) para buscar la carpeta PRJ y en ella el proyecto que creamos antes.

Paso 5

Archivos adicionales de recursos. En nuestro caso se trata del archivo DCL, que habíamos situado también en la carpeta LSP.

Paso 6

Seleccionar el modo de compilación Optimizar y Vincular (Optimize and Link) teniendo siempre presente que en el proyecto ya hemos establecido parámetros de compilación en más detalle.

Paso 7

Al pulsar Terminar se guardarán los parámetros en un archivo de extensión PRV situado en la carpeta de la aplicación. La aplicación se creará de manera inmediata si está marcada la casilla Generar Aplicación (Build Application).

El archivo compilado VLX incluye el DCL, lo que simplifica mucho la distribución de la aplicación. La carga de la misma se puede hacer con el acostumbrado (load "NombreArchivo"), siempre que el mismo se haya guardado en una carpeta que figure en las rutas de búsqueda de AutoCAD. Suponiendo que existan distintos archivos con el mismo nombre y extensiones VLX, FAS y LSP, AutoCAD cargará preferiblemente el VLX. De no existir éste se usará el FAS y en último término el LSP.

ċ
Archivos_del_Proyecto.zip
(19k)
Reinaldo Togores Fernández,
23 feb. 2011 5:37