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:
- 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.
- 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.
- 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:
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.