ONCE.15. CARGA Y DESCARGA DE APLICACIONES

Hasta ahora hemos hablado de la forma de cargar nuestras aplicaciones o rutinas AutoLISP desde AutoCAD 14. Tras haber escrito el archivo de texto correspondiente, accedíamos a Herr.>Cargar Aplicación... y desde allí cargábamos nuestro programa. Esto equivale a ejecutar el comando APPLOAD en línea de comandos. Pues bien, existe una serie de funciones de AutoLISP para manejar esta carga de programas desde otros programas AutoLISP. Esas funciones son las que vamos a estudiar seguidamente.

La primera función que veremos es LOAD. Su sintaxis es:

(LOAD nombre_archivo [fallo])

Esta función carga en memoria el archivo AutoLISP especificado y devuelve su nombre. Como sabemos, estos archivos podrán o no estar en uno de los caminos de soporte del programa. Si sí estuvieran, con indicar el nombre es suficiente, si no habría que escribir la ruta de acceso o camino completo.

NOTA: Recordemos que los archivos de soporte los configuramos desde Herr.>Preferencias....

El nombre del archivo en cuestión no hace falta indicarlo con la extensión .LSP —aunque se aconseja por claridad en programas grandes que llamen a archivos .LSP, .DCL y/o a otros— si tiene esta extensión; si tuviera otra hay que especificarla obligatoriamente, ya que AutoCAD le coloca el .LSP detrás en el momento en que no existe. Veamos algún ejemplo:

(LOAD "circul")
(LOAD "escalera.lsp")
(LOAD "ventana.mio")
(LOAD "circuit.txt")

NOTA: Como se ve, los nombres de archivo han de ir entrecomillados por ser cadenas.


La ruta de acceso indicada se establece al estilo MS-DOS, pero con la particularidad de que no podemos utilizar caracteres contrabarra (
\) como separadores de directorios o carpetas. Esto es debido a que, como sabemos, la contrabarra es un carácter de control en AutoLISP. Y si revisáramos el comienzo de este MÓDULO, cuando hablábamos de los caracteres de control, veríamos que la contrabarra hemos de indicarla con dos caracteres contrabarra (\\). Precisamente el primero es el carácter de control y el segundo la contrabarra en sí. Por ejemplo:

(LOAD "c:\\autocad\\program\\rutin\\caldera.lsp")

Por compatibilidad con sistemas UNIX, las rutas o caminos de acceso se pueden indicar con el carácter de barra inclinada normal (/). Esto casi siempre resulta más cómodo que el método anterior:

(LOAD "c:/autocad/program/rutin/caldera.lsp")

El argumento fallo será devuelto si el programa fracasa a la hora de ser cargado. Si este argumento no existe y el programa falla al ser cargado, AutoLISP de volverá un mensaje de error propio. Por ejemplo:

(LOAD "a:/miprog.lsp" "El archivo no se encuentra o el disco no está en la unidad")

Este argumento también ha de ser indicado como cadena y se devuelve como tal, es decir, entre comillas dobles.

La función LOAD la podemos usar para llamar a programas de AutoLISP desde otro programa, cargándolo antes con ella. Por ejemplo:

(DEFUN Prog1 ()
--(SETQ Pto1 (GETPOINT "Punto 1: "))
--(SETQ Pto2 (GETPOINT "Punto 2: "))
--(LOAD "c:/lisp/prog2.lsp")
--(prog2)
--(SETQ Result (/ (- NewPto1 NewPto2) 2.0))
)

En este caso, el programa llega a la función LOAD, carga el programa y lo ejecuta a continuación. Tras haber acabado el otro programa se devuelve el control a este primero.

NOTA: Mucho cuidado al declarar variables en este tipo de estructuras de llamadas a programas. Si las variables son locales y las necesita el otro programa, éste no funcionará. Declararemos pues como locales únicamente aquellas que no vayan a ser utilizadas más que en la rutina actual.

NOTA: Las aplicaciones AutoLISP hoy por hoy no se pueden descargar de memoria.

(AUTOLOAD nombre_archivo lista_comandos)

La función AUTOLOAD por su lado hará que ahorremos memoria mientras no estemos utilizando los programas o rutinas AutoLISP. Esta función efectúa la carga del archivo especificado en nombre_archivo al igual que LOAD, pero únicamente la primera vez que se utilice uno de los comandos indicados en lista_comandos. Así por ejemplo:

(AUTOLOAD "c:/lisp/rosca.lsp" ’("rosca" "rc"))

Al ser una lista el segundo argumento debe ir indicado como tal. Y los términos deben ir entrecomillados.

Esta línea hará que se cargue y ejecute automáticamente el programa guardado en rosca.lsp al escribir en línea de comandos rosca o rc. Si no se hace esto el programa no se cargará, con el consiguiente ahorro de memoria.

Deberemos tener un par de consideraciones. La primera es que las palabras con las cuales podemos llamar al programa indicado deben ser el nombre de funciones contenidas en dicho archivo. Y la segunda es que todas las funciones implicadas deberán estar definidas como comandos de AutoCAD, es decir con C: delante del nombre. Así por ejemplo, para que la línea anterior funcionara, el archivo ROSCA.LSP debería contener lo siguiente:

(DEFUN C:Rosca ()
...
)

(DEFUN C:Rc ()
--(c:rosca)
)

Es decir, los comandos con los que se puede acceder, uno de ellos definido como abreviatura, pero definido en el propio archivo.

Con respecto a los directorios de soporte, las mismas consideraciones que para la función LOAD.

NOTA: Desactivando la casilla Volver a cargar aplicaciones de AutoLISP entre dibujos, sita en la pestaña Compatibilidad del cuadro de diálogo Preferencias, al que se accede bajo Herr.>Preferencias..., haremos que cada vez que entremos en un dibujo nuevo no se pierdan los programas y variables globales de AutoLISP cargados en memoria. El texto de la casilla es confuso sobremanera, así que cuidado: la casilla activada hace que no se guarden estos programas en memoria. Esta misma característica, denominada de AutoLISP persistente, se controla mediante la variable LISPINIT de AutoCAD 14.

Pero tener que teclear líneas de estas cada vez que entramos en AutoCAD es un poco pesado. Si lo que queremos es que nada más cargar AutoCAD, o nada más entrar en un dibujo o abrir uno nuevo, se carguen en memoria determinadas rutinas o funciones, utilizaremos los archivos que vamos a explicar a continuación.

 

ONCE.15.1. ACADR14.LSP, ACAD.LSP y *.MNL

Existen dos archivos, entre otros muchos, que se cargan nada más arrancar AutoCAD, y también cada vez que abrimos un dibujo o comenzamos uno nuevo (si está activada la casilla de AutoLISP persistente antes mencionada). Estos dos archivos son el ACADR14.LSP y el ACAD.LSP. ACADR14.LSP es un archivo que se suministra con AutoCAD 14 y en el que podemos encontrar una serie de rutinas que los desarrolladores de Autodesk han incluido ahí para que se carguen nada más comenzar un dibujo. Por normal general este archivo no lo modificaremos, ni tampoco añadiremos líneas de código a él.

Para la misma característica disponemos de un archivo ACAD.LSP. Este archivo se carga de manera igual al comenzar cualquier dibujo, pero está pensado para que los usuarios introduzcamos en él nuestras modificaciones. Probablemente no exista en un equipo en el que nunca haya sido creado, sea por el usuario o sea por aplicaciones verticales para AutoCAD 14. Si no existe únicamente deberemos crearlo, eso sí, con dicho nombre y extensión.

NOTA: El archivo ACAD.LSP ha de estar en un directorio de soporte para que sea cargado. Si existe más de un ACAD.LSP en uno o varios directorios de soporte, AutoCAD sólo carga el primero que encuentra.

Podemos suponer pues que todas las definiciones de código AutoLISP incluidas en estos archivos se cargarán nada más entrar en AutoCAD y al comenzar nuevos dibujos o abrir dibujos existentes. Por ello, si en ellos incluimos funciones LOAD, los programas a los que llamen serán cargados nada más abrir el editor de dibujo.

Mucho más lógico, y en la práctica es lo que se hace, es introducir funciones AUTOLOAD, que guarden una o varias palabras que, al ser escritas, cargarán programas AutoLISP y los ejecutarán automáticamente.

NOTA: Si la casilla de AutoLISP persistente está desactivada, como hemos dicho los programas y variables globales permanecerán en memoria, pero no se cargarán los archivos ACAD.LSP y ACADR14.LSP al entrar en un nuevo dibujo o en uno existente, sino sólo al arrancar AutoCAD. Sin embargo si la casilla está activada, estos archivos se cargan siempre al cambiar de dibujo, pero los programas y variables globales no permanecerán en memoria. Dios lo entiende... Parece que la práctica más habitual consiste en activar dicha casilla e incluir funciones LOAD o AUTOLOAD en el ACAD.LSP. De esta manera dispondremos de las rutinas y programas en memoria (o preparados) en cualquier momento y sesión de dibujo.

Los archivos ACAD.LSP y ACADR14.LSP funcionan como cualquier otro archivo de AutoLISP normal, es decir, lo que no está dentro de ningún DEFUN se evalúa automáticamente al ser cargado el programa; lo que esté dentro de algún DEFUN se evaluará cuando se llame a la función en cuestión.

Por último hemos de recordar en este punto la utilidad de los archivos .MNL de menús. Estos archivos contienen normalmente las rutinas necesarias para el funcionamiento de opciones de un nuevo menú creado (si las necesita). Es decir, si un menú llama a comandos programados en AutoLISP, el código de estos comandos se puede introducir en un archivo que tenga el mismo nombre que el menú y la extensión .MNL.

Si el código es muy extenso, o por mayor organización, se pueden incluir en este archivo llamadas a los programas necesarios con LOAD o AUTOLOAD. Los .MNL funcionan de la misma forma que el ACAD.LSP y el ACADR14.LSP, y se cargan en memoria al cargar el menú correspondiente o al abrir un dibujo que lleve implícitamente cargado ese menú.

 

ONCE.15.1.1. Configuraciones múltiples

Si un usuario trabaja con múltiples configuraciones de AutoCAD, o hay varios usuarios utilizando AutoCAD en un mismo puesto de trabajo, puede ser necesario cargar diferentes rutinas en cada caso. Esto se consigue fácilmente estableciendo un directorio o carpeta de inicio diferente para cada configuración y definiendo en ella un archivo ACAD.LSP con las instrucciones requeridas.

La carpeta de inicio se establece desde el acceso directo a AutoCAD 14 en Windows, como sabemos. Si en el momento de iniciar la sesión, AutoCAD detecta un archivo ACAD.LSP en dicha carpeta, carga automáticamente su contenido. De esta manera, pueden coexistir en disco duro varios archivos ACAD.LSP situados en diferentes carpetas.

De hecho, éste es el procedimiento más sencillo que utilizan los desarrolladores de aplicaciones. Al instalarse una aplicación que funciona sobre AutoCAD, se crea una carpeta propia con un archivo ACAD.LSP y un acceso directo que inicia AutoCAD desde esa carpeta.

 

ONCE.15.1.2. Definir función como S::STARTUP

Llegado este momento vamos a explicar esta forma un poco especial de definir una función. Como sabemos, dentro de los archivos comentados anteriormente las funciones LOAD y AUTOLOAD hacen que se carguen programas automáticamente al arrancar AutoCAD. Pero si también queremos que algunas funciones se ejecuten automáticamente al abrir el programa deberemos incluirlas bajo una función definida como S::STARTUP de la siguiente forma:

(DEFUN S::STARTUP ()
...
)

Todo lo que haya entre los dos paréntesis del DEFUN se ejecutará automáticamente. Viene a ser lo mismo que dejarlo fuera de cualquier DEFUN, pero de manera más ordenadas y clara. Veamos un ejemplo:

(DEFUN S::STARTUP ()
--(COMMAND "_purge" "_all" "" "_n")
)

De esta manera, al entrar en cualquier dibujo se limpiará automáticamente todo lo no utilizado: capas, estilos de texto, tipos de línea...

El prefijo S:: de esta función especial debe considerarse como reservado y es mejor no utilizarlo en ninguna función de usuario.

Veamos otro ejemplo más utilizado:

(DEFUN c:guardarr ()
...
)

(DEFUN c:guardarcomo ()
...
)

(DEFUN S::STARTUP ()
--(COMMAND "anuladef" "guardarr")
--(COMMAND "anuladef" "guardarcomo")
)

Si quisiéramos redefinir estos comandos de AutoCAD, de la versión castellana del producto, podríamos haber escrito esto en el ACAD.LSP. Así cargarían en memoria las nuevas definiciones de los comandos GUARDARR y GUARDARCOMO y, al ejecutarse automáticamente S::STARTUP, con el comando de AutoCAD ANULADEF se anularían las actuales definiciones de esos dos comandos. Para recuperar las definiciones normales de ambos comandos, basta emplear el comando de AutoCAD REDEFINE. Se recuerda aquí que para utilizar la definición habitual de comandos de AutoCAD redefinidos, basta preceder su nombre de un punto (para más información debemos dirigirnos al MÓDULO SIETE de este curso).

 

ONCE.15.2. Aplicaciones ADS

Hay una serie de funciones de AutoLISP para gestionar las aplicaciones ADS (ya obsoletas). En esta sección las vamos a explicar.

(XLOAD nombre_archivo [fallo])

Funciona de la misma manera que LOAD para las aplicaciones AutoLISP. En este caso de aplicaciones ADS, al mismo tiempo que se cargan se comprueban si son compatibles con AutoLISP. En el caso de detectarse incorrecciones el proceso quedaría abortado.

(AUTOXLOAD nombre_archivo lista_comandos)

Funciona de la misma manera de AUTOLOAD para las aplicaciones AutoLISP.

(XUNLOAD nombre_archivo [fallo])

Descarga aplicaciones ADS de la memoria. El nombre en nombre_archivo debe ser el mismo que el que se utilizó al cargar la aplicación con XLOAD. Si se indicó un camino de directorios al cargar con XLOAD, es posible omitirlo al descargar la misma aplicación con XUNLOAD. Si la aplicación se descarga correctamente se devuelve el nombre de la misma, si no un mensaje de error; a no ser que se indique algo en el argumento optativo fallo.

(ADS)

Devuelve una lista con los nombres y rutas de acceso (si hiciera falta) de las aplicaciones ADS actualmente cargadas. Por ejemplo:

(ADS) podría devolver ("c:\\lsp\\prg.exp" "rut.exe" "ventn.exe")


(GETCFG nombre_parámetro)

El archivo ACAD14.CFG almacena la configuración de AutoCAD. Se trata de un archivo de texto al cual se puede acceder para añadir especificaciones o modificar las existentes. Contiene una sección denominada AppData que permite a los usuarios y programadores almacenar información relativa a la configuración de sus aplicaciones.

La función GETCFG recupera el valor del parámetro cuyo nombre se indique. Este nombre debe ser una cadena de texto en la forma:

"AppData/nombre_aplicación/nombre_sección/.../nombre_parámetro"

(SETCFG nombre_parámetro valor)

Esta función es complementaria de la anterior y permite escribir un valor concreto en la sección AppData del archivo de configuración ACAD14.CFG para el parámetro cuyo nombre se indique. Este parámetro debe especificarse en una cadena de texto cuyo formato es el mismo que para la función GETCFG.

 

ONCE.15.3. Aplicaciones ARX

Existe también una serie de funciones de AutoLISP para gestionar las aplicaciones ARX. Vamos a verlas.

(ARXLOAD nombre_archivo [fallo])

Funciona de la misma manera que XLOAD para las aplicaciones ADS y LOAD para aplicaciones AutoLISP. También se comprueba la compatibilidad del archivo con AutoLISP como con XLOAD.

(AUTOARXLOAD nombre_archivo lista_comandos)

Funciona de la misma manera de AUTOXLOAD para aplicaciones ADS y que AUTOLOAD para las aplicaciones AutoLISP.

(ARXUNLOAD nombre_archivo [fallo])

Funciona de la misma manera de XUNLOAD para la aplicaciones ADS.

(ARX)

Devuelve una lista con los nombres y rutas de acceso (si hiciera falta) de las aplicaciones ARX actualmente cargadas. Por ejemplo:

(ARX) podría devolver ("acadapp.arx" "oleaprot.arx")

 

ONCE.15.4. Acceso a comandos externos

(Toda esta sección se proporciona en el archivo comext.zip para su óptima visualización).

 

ONCE.15.5. Inicio de aplicaciones Windows

Existe una función que nos permite iniciar aplicaciones basadas en plataforma Windows desde AutoLISP. Esta función es:

(STARTAPP aplicación [archivo])

aplicación dice referencia al programa que queremos iniciar y archivo al archivo que queremos abrir directamente con dicho programa. Si no se indica una ruta de acceso completa, la aplicación se busca en la ruta de búsqueda especificada en la variable de entorno PATH del sistema operativo. Veamos tres de ejemplos:

(STARTAPP "notepad" "ejemplo.txt")
(STARTAPP "c:/windows/app/miprog.exe")
(STARTAPP "wordpad" "a:\\lisp\\tuerca.lsp")

Si STARTAPP se evalúa correctamente devuelve un número entero, en caso contrario devuelve nil.

 

13ª fase intermedia de ejercicios

· Probar las diferentes funciones estudiadas en estas secciones anteriores con rutinas que llamen a otras rutinas, programas que utilicen los comandos externos comentados y demás. Personalícese también un archivo ACAD.LSP como práctica.