En nuestro artículo anteriorcompletamos el código necesario para un programa que nos permite exportar elvalor de los atributos de un determinado bloque a una tabla EXCEL. Dicho códigoincluye tres archivos de código fuente LISP así como uno con la definición dela 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 delEntorno de Desarrollo (IDE) Visual LISP.
Gestión de una Aplicación
Normalmente una aplicación real será aún más compleja queesta que hemos desarrollado. Puede llegar a incluir miles de líneas de códigodistribuidas en una serie de archivos de código fuente LSP. Este código fuentepuede compilarse para incrementar su eficiencia, con lo que se generan otrosarchivos intermedios y ejecutables compilados. Puede llegar a ser muy engorrosoel seguimiento de todos estos archivos para determinar, por ejemplo, cuándoserá necesario recompilar los modificados o cuándo rehacer toda la aplicación. Tambiénse deberán establecer los parámetros relativos a la manera de compilar segúnlas características del código elaborado. Si además incluye otros archivos derecursos (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 essuficiente 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 lalínea de comandos de AutoCAD (siempre que se haya cargado previamente el IDEVisual 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 indirectalsa
optimizar y enlazar de manera directa
"
archivoFuente
"
una cadena que representa el nombre del archivo fuente del códigoLISP, si no se especifica la extensión, se supone LSP."
archivoSalida
"
este argumento es opcional, de no estar presenta se dará al archivo desalida el mismo nombre del archivo del código fuente con la extensión FAS, y seubicará 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 demáquina que debe efectuarse cada vez que se carga en memoria el códigoAutoLISP en formato de texto. El archivo FAS resultante de la compilacióncontiene instrucciones directamente comprensibles para la computadora, evitandotoda ulterior interpretación del código. Además del ahorro en tiempo (de ahí laextensió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 conel modo standard.
Los otros modos de optimización permiten obtener programasaú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 referenciasdirectas a la función compilada en lugar de invocar el símbolo querepresenta a la función mejorando su desempeño y evita el peligro de que unaeventual 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 enlazandodirectamente sus referencias, con lo que se gana aún más rapidez y procurandouna reducción adicional en tamaño.
No son todos aplicables en cualquier caso. Veremos cómocierto grado de optimización provocará errores, la causa de ello y el remedio aaplicar.
El Gestor de Proyectos VLISP
El modo de compilación cuando se emplea la función vlisp-compile
será casi siempre elstandard ('st
). En unaaplicación compleja que exija el control del código distribuido en variosarchivos diferentes será mejor el configurar un proyecto Visual LISP.
Este proyecto mantiene un listado de archivos de códigofuente y una serie de reglas, más detalladas que lo posible con vlisp-compile
, sobre cómo compilar yoptimizar la aplicación, permitiendo:
- Comprobar qué archivos .LSP de la aplicación han sido modificadospara recompilarlos automáticamente.
- Abrir los archivos que aparecen en la lista con un solo clic delratón.
- Buscar cadenas de texto dentro de todos los archivos que integranel proyecto.
- Vincular (link) directamente las partes del código que convengaaunque pertenezcan a diferentes archivos.
Todas las funciones de gestión del proyecto están integradasen una pequeña ventana que presenta la lista de archivos, una barra de botonesen la parte superior (ver Figura 1) y un menú contextual al que se accedepulsando 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á buenoestablecer una estructura de carpetas donde se ubicarán los diversos archivosutilizados en el proceso (ver Figura 3). Los archivos ExtrATT.LSP
, LeeAtribX.LSP
,ListaExcel.LSP
y ExtrATT.DCL
proceden de los números61, 62 y 63 de esta revista y se ubicarán en la carpeta LSP. Los otrosarchivos, 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 NuevoProyecto... (New Project... ) en el menú Proyecto (Project). Al seleccionarlaaparece un diálogo para seleccionar la carpeta del proyecto y darle un nombreal mismo. Escogeremos la carpeta PRJ, según la estructura definidaanteriormente.
Hecho esto, aparece el diálogo Propiedades del Proyecto(Project Properties). Este diálogo cuenta con dos fichas, Archivos deProyecto (Project Files) y Opciones de Generación (BuildOptions).
Para seleccionar los archivos LSP, pulsaremos el botónseñalado con [...] para buscar la carpeta LSP o en su defecto escribiremos latrayectoria en la casilla de edición Buscar en (Look in). Encuanto seleccionamos la carpeta correcta aparecen en la casilla de lista a laizquierda los nombres de los archivos LSP existentes. Los seleccionamospulsando 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 fueranecesario incluir archivos de distintas carpetas, podemos repetir este procesohasta que en la lista derecha aparezcan todos los archivos necesarios para laaplicación. El orden de la lista determina el orden en que serán cargados losarchivos. En nuestro caso el último archivo deberá ser ExtrATT.LSP, por lo que lo seleccionaremos y pulsaremosel botón Final (Bottom) para llevarlo a la posición adecuada.Para ver las trayectorias y tamaño de los archivos podemos seleccionarlos y enel menú contextual que resulta de pulsar el botón derecho del ratón elegir Registrarnombres de archivo y tamaño (Log filenames and size).
Opciones de Generación
En la optimización iremos a por todas. Desde ahoraanunciamos que nuestro primer intento fracasará. Las opciones que elegiremos semuestran 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 afunciones son enlazadas directamente al código compilado de la funcióneliminando los nombres de las mismas del archivo FAS.
- Seleccionamos el modo Localizar variables, con lo que elcompilador además elimina todos los nombres de símbolos locales de manera queel programa apunta a la dirección de memoria donde se guarda el valor, en lugarde hacerlo a un símbolo que representa dicha dirección.
- Para prevenir en lo posible errores derivados de este alto grado deoptimización, también seleccionamos Optimización segura (Safeoptimize) que pone en acción un mecanismo destinado a evitar posibleserrores a consecuencia de estas opciones extremas seleccionadas.
- En Modo de Mensaje (Message Mode) seleccionamos Informescompletos (Full reports) para asegurarnos de tener el máximo deinformación sobre el proceso de compilación.
- En esta ficha también debemos indicar las carpetas donde queremos situarlos archivos FAS y los archivos temporales. De momento no utilizaremos el botónEditar Declaraciones Globales... (Edit Global Declarations...)
Al Aceptar habremos concluido la definición delproyecto. Antes de compilar el proyecto recordemos que las funciones VisualLISP extendidas (vlax-... etc.) no estarán disponibles si antes no ejecutamos(vl-load-com). Una vez cargadas estas funciones, ya podemos compilar elproyecto, pulsando sobre el correspondiente botón de la barra de herramientasde la ventana del proyecto. Será bueno examinar después en detalle lo queaparece en la ventana Salida de Generación (Build Output). Veamosespecialmente las líneas señaladas en azul, donde se encuentran las advertenciasgeneradas por la función de Optimización Segura (ver Figura 6). Al hacerdoble-clic sobre cualquiera de las líneas así resaltadas, se abrirá eldocumento 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 debeestar en una de las trayectorias de búsqueda de AutoCAD, por ejemplo la carpetaSUPPORT. Recibiremos un mensaje indicando que CargaDialogoes una función no definida. Busquemos CargaDialogoen la Salida de Generación. Encontraremos lo siguiente:
nombresde funciones ignorados
(CARGADIALOGOLISTANOMBRES SELBLOQUE TIENEATRIBUTOS)
o en la versióninglesa:
droppedfunction names
(CARGADIALOGOLISTANOMBRES SELBLOQUE TIENEATRIBUTOS)
Lo que indica que, entre otros, el compilador ha desechadoel nombre de esta función. Por este motivo, una llamada a la función CargaDialogo que el compilador no hadetectado en el archivo ExtrATT.LSP:
(vlax-add-cmd"AtrEX" 'CargaDialogo)
provocará el error que impide la ejecución del programa. Estenombre de función no se ha detectado, a pesar de que activamos el modo OptimizaciónSegura, 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 serefiere a la compilación. Ahora es que recurriremos al botón EditarDeclaraciones Globales... para establecer en detalle las opciones decompilación. Ante todo, se nos preguntará si queremos crear el fichero GLD parael proyecto. Al abrirse este fichero buscamos la lista NOT-DROP y le incluimos el símbolo CargaDialogo (ver Figura 7). Alrecompilar el proyecto obtendremos en la ventana Build Output:
nombresde funciones no ignorados
(CARGADIALOGOCOMPRUEBAATRIBUTOS EXTRATT)
o en inglés:
not dropped function names
(CARGADIALOGOCOMPRUEBAATRIBUTOS 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 accededesde el menú Archivo>Crear Aplicación>Asistente para nueva aplicación...(File>Make Application>New Application Wizard...) siguiendolos 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 incluyeel DCL, lo que simplifica mucho la distribución de la aplicación. La carga de lamisma se puede hacer con el acostumbrado (load "NombreArchivo"),siempre que el mismo se haya guardado en una carpeta que figure en las rutas debúsqueda de AutoCAD. Suponiendo que existan distintos archivos con el mismonombre y extensiones VLX, FAS y LSP, AutoCAD cargará preferiblemente el VLX. Deno existir éste se usará el FAS y en último término el LSP.