ONCE.17. OTRAS FUNCIONES DE MANEJO DE LISTAS

En la sección ONCE.10. ya se explicó una serie de funciones las cuales tenían como cometido manejar listas. Ahora veremos un complemento a lo ya aprendido.

Las funciones que vamos a estudiar manejan listas de la misma forma que las mencionadas en dicha sección ONCE.10., pero éstas son mucho más completas y funcionales. Descubriremos maneras de realizar trabajos, que antes podían resultar tediosos, de forma sencilla, rápida y eficaz. Pero sobre todo, aprenderemos las funciones básicas que luego nos permitirán acceder a la Base de Datos interna de AutoCAD que, como ya se comentará, está estructurada en forma de listas y sublistas.

Todo esto no quiere decir que hemos de olvidar las otras funciones de manejo de listas estudiadas, pues dependiendo del ejercicio que se deba realizar pueden ser útiles. Además, ciertos problemas únicamente pueden resolverse con ellas.

Comencemos pues con la primera de estas nuevas funciones, llamada ASSOC; su sintaxis es la siguiente:

(ASSOC elemento_clave lista_asociaciones)

ASSOC busca el elemento especificado en elemento_clave en la lista especificada en lista_asociaciones; devuelve la lista asociada cuyo primer elemento es el especificado. Para ello, esta lista debe ser una lista de asociaciones, es decir, que contenga sublistas incluidas con elementos asociados, si no no funcionará.

Veamos un ejemplo sencillo. Supongamos una lista que contenga varias sublistas de asociaciones y definida de la siguiente forma:

(SETQ milista (LIST ’(largo 10) ’(ancho 20) ’(alto 30)))

es decir, que el valor de la lista MiLista es un conjunto de listas de asociación. Las siguientes funciones ASSOC devolverían lo que se indica:

(ASSOC largo milista) devuelve (LARGO 10)
(ASSOC ancho milista)
devuelve (ANCHO 20
(ASSOC alto milista)
devuelve (ALTO 30
(ASSOC volumen milista)
devuelve nil

Veremos ahora otra también muy utilizada cuya sintaxis es:

(CONS primer_elemento lista)

Esta función toma la lista indicada y le añade un nuevo primer elemento, devolviendo la lista resultante. Así, si tenemos una lista definida de la manera siguiente:

(SETQ milista ’(10 20 30))

podemos hacer:

(CONS 5 milista) devuelve (5 10 20 30)

Pero atención; este comando añade el elemento y devuelve la lista completa, pero el cambio no es permanente. Si queremos actualizar la lista para futuros usos, la manera sería:

(SETQ milista (CONS 5 milista))

También, evidentemente podríamos hacer algo como lo siguiente (sin ningún problema):

(SETQ lista3 (CONS (CAR lista1) (CDR lista2)))

De esta forma, añadimos a la lista lista2 (exceptuando el primer elemento) el primer elemento de la lista lista1. Todo ello lo guardamos en lista3.

Existe un modo particular de trabajar con la función CONS. Y es que si como argumento lista no especificamos una lista, sino un valor concreto o el nombre de una variable definida, la función construye un tipo especial de lista de dos elementos llamado par punteado (se denomina así por tener un punto de separación entre ambos elementos). Los pares punteados ocupan menos memoria que las listas normales y son muy utilizados en la Base de Datos de AutoCAD. Así:

(CONS ’clase 1) devuelve (CLASE . 1)
(CONS ’nombre ’antonio)
devuelve (NOMBRE . ANTONIO)
(CONS ’nota 5.5)
devuelve (NOTA . 5.5)

NOTA: A estos elementos de par punteado se accede directamente con las funcionas CAR (para el primero) y CDR (para el segundo), no CADR.

(SUBST elemento_nuevo elemento_antiguo lista)

El cometido de esta función es sustituir un elemento de una lista. Para ello, busca en la lista indicada como último argumento (lista) el elemento indicado como segundo argumento (elemento_antiguo) y lo sustituye por el elemento indicado como primer argumento (elemento_nuevo).

Por ejemplo, la variable lin contiene una lista que es el par punteado (8 . "0") y queremos cambiar su segundo elemento:

(SETQ lin (SUBST "pieza" "0" lin))

El nuevo par punteado será (8 . "PIEZA").

NOTA: Sin querer acabamos de ver un ejemplo en el que cambiamos a una línea de capa, ya que 8 es el código de la Base de Datos de AutoCAD 14 para el nombre de la capa y se expresa como una sublista de asociaciones (porque asocia un valor a un código), que es un par punteado. La mecánica básica es ésta, entre otras operaciones, pero ya lo veremos ampliamente más adelante. Sirva de introducción.

La función siguiente APPEND reúne todos los elementos de las listas especificadas en una sola lista que los engloba. Su sintaxis es la siguiente:

(APPEND lista1 lista2...)

Veamos un ejemplos:

(APPEND ’(e1 e2) ’(e3 e4)) devuelve (E1 E2 E3 E4)

NOTA: Obsérvese que no se devuelve ((E1 E2)(E3 E4)). Es decir, lo que reúne son los elementos de las listas y no las listas mismas. Así:

(APPEND ’(e1 (e2 e3)) ’(e4 (e5))) devuelve (E1 (E2 E3) E4 (E5))

ya que (e2 e3) y (e5) son sublistas que, en realidad, son elementos de las listas que los contienen.

Los argumentos de APPEND han de ser siempre listas. Esto es lo que diferencia a esta función de LIST —ya estudiada—, que reúne elementos sueltos y forma una lista. Es por ello que a APPEND no se le pueda indicar como lista elementos de una lista extraídos con CAR o CDR por ejemplo. Habríamos de formar listas previas con ellos para luego utilizarlas con esta función APPEND.

NOTA: APPEND no funciona con pares punteados directamente.

Estas cuatro funciones vistas hasta aquí (ASSOC, CONS, SUBST y APPEND) son las más habituales en la gestión de la Base de Datos de AutoCAD. Veremos a continuación otras también muy interesantes.

(LENGTH lista)

Esta función devuelve la longitud de la lista indicada, es decir, su número de elementos. La devolución de LENGTH será siempre un número entero, evidentemente. Veamos uno ejemplos:

(LENGTH ’(10 n es 14 5 o)) devuelve 6
(LENGTH ’(10 20 (10 20 30)))
devuelve 3
(LENGTH ’())
devuelve 0

NOTA: LENGTH no funciona con pares punteados directamente.

(LAST lista)

Esta función devuelve el último elemento de la lista especificada. Veamos unos ejemplos:

(LAST ’(10 n es 14 5 o)) devuelve O
(LAST ’(10 20 (10 20 30)))
devuelve (10 20 30)
(LAST ’(nombre))
devuelve NOMBRE
(LAST ’())
devuelve nil

Aunque parezca evidente, LAST no es nada aconsejable para devolver la coordenada Z de una lista que represente un punto. Y es que si el punto sólo tuviera las coordenadas X e Y (punto 2D sin Z=0), LAST devolvería la Y. En cambio, con CADDR —ya estudiado— tenemos la seguridad de obtener siempre la coordenada Z, pues devolvería nil en caso de no existir.

NOTA: LAST no funciona con pares punteados directamente.

(MEMBER elemento lista)

MEMBER busca el elemento especificado en la lista indicada y devuelve el resto de la lista a partir de ese elemento, incluido él mismo. Veamos algunos ejemplos:


(MEMBER ’x ’(n h x s u w))
devuelve (X S U W)
(MEMBER ’d1 ’(n d1 x d1 u))
devuelve (D1 X D1 U)
(MEMBER ’(3 4) ’((1 2) (3 4) 5))
devuelve ((3 4) 5)

Como vemos en el segundo ejemplo, si el elemento en cuestión se repite en la lista se toma la primera aparición.

Si el elemento buscado no existe, MEMBER devuelve nil.

NOTA: MEMBER no funciona con pares punteados directamente.

(NTH número_orden lista)

NTH devuelve el elemento de la lista lista que se encuentre en la posición número_orden.

Esta función puede resultar harto interesante a la hora de acceder a elementos "lejanos" en una lista, ya que evitaremos el uso de las combinaciones de CAR y CDR que pueden dar lugar a confusión.

Debemos tener en cuenta que el primer elemento de la lista para NTH es el 0, luego el 1, el 2, etcétera. Si la posición especificada es mayor que la posición del último elemento de la lista, NTH devuelve nil. Vamos a ver algún ejemplo:

(NTH 2 ’(10 20 30)) devuelve 30
(NTH 0 ’(10 20 30))
devuelve 10
(NTH 1 ’(10 (10 20) 20))
devuelve (10 20)
(NHT 3 ’(10 20 30))
devuelve nil

NOTA: NTH no funciona con pares punteados directamente.


(REVERSE lista)

REVERSE tiene como misión única y exclusiva devolver la lista indicada con todos sus elementos invertidos en el orden. Ejemplos:

(REVERSE ’(10 20 30 40)) devuelve (40 30 20 10)
(REVERSE ’(x y (10 20) z))
devuelve (Z (10 20) Y X)
(REVERSE ’(nombre))
devuelve (NOMBRE)
(REVERSE ’())
devuelve nil

NOTA: REVERSE no funciona con pares punteados directamente.

(ACAD_STRLSORT lista)

Toma la lista especificada, ordena las cadenas de texto contenidas alfabéticamente y devuelve la lista resultante. La lista sólo puede contener cadenas entre comillas. Ejemplos:

(ACAD_STRLSORT ’("z" "s" "a" "g" "p")) devuelve ("a" "g" "p" "s" "z")
(ACAD_STRLSORT ’("zar" "aire" "12" "4"))
devuelve ("12" "4" "aire" "zar")
(ACAD_STRLSORT ’("sol" "sal" "s" "s"))
devuelve ("s" "s" "sal" "sol")

NOTA: Como se puede observar, los números se ordenan como las palabras, es decir, comenzando por el primer dígito, siguiendo con el segundo y así sucesivamente (tipo Windows).

NOTA: ACAD_STRLSORT no funciona con pares punteados directamente.

Para terminar vamos a ver un ejemplo de un programa que, aunque únicamente utiliza una de las funciones vistas en esta sección, puede resultar muy jugoso como ejemplo. A la hora de estudiar el acceso a la Base de Datos de AutoCAD, será cuando comencemos a sacar partido de estas funciones. Por ahora, sólo queda que el lector practique particularmente con ellas; son muy sencillas de comprender.

El ejemplo que veremos se corresponde con un programa que permite dibujar tornillos normalizados rápidamente. Este programa maneja un cuadro de diálogo, por lo tanto se proporciona también el mismo, así como su código DCL. El cuadro del programa es el siguiente:

 


A continuación se muestra el código DCL de este cuadro de diálogo
en el siguiente archivo.

Como se puede apreciar, el cuadro posee varias áreas para solicitar los datos necesarios al usuario y así dibujar el tornillo. En el área de la norma únicamente hay una lista desplegable que sólo posee una sola norma invariable (DIN 931), no se ha diseñado para más. Es por ello que el contenido de esa lista lo añadimos en el código DCL; los componentes de las demás listas serán agregados en la rutina AutoLISP. Veámosla pues en el archivo siguiente.

Como vemos, el programa carga el cuadro de diálogo (tras las típicas operaciones), así como la foto (que evidentemente deberemos tener). Después inicializa las listas y las rellena y rellena los demás elementos con valores por defecto.

Es interesante ver cómo maneja el cuadro las salidas con DONE_DIALOG y START_DIALOG, sobre todo en el botón de designar un punto de inserción, que sale del letrero y vuele a entrar (conservando valores). El truco está en asignar a una variable la devolución de START_DIALOG (en este caso SD) y controlar la pulsación de cada botón mediante dicha variable (asignando un número de salida a cada DONE_DIALOG). Evidentemente, al volver a entrar en el cuadro tras designar un punto de inserción, la variable ha de hacerse nil (véase).

Otro tema interesante es el control de la carga o no del cuadro en memoria. Al volver a entrar en el letrero después de designar un punto de inserción, el cuadro no ha de cargarse en memoria de nuevo —ya está cargado—, sino simplemente mostrarse. Esto se controla averiguando si existe ya o no un punto de inserción.

De la misma manera se controlan y se escriben las coordenadas de dicho punto de inserción encima del botón para designar.

La manera de asignar valores de métrica y longitud se realiza recurriendo a la función NTH, vista en esta sección. Con ella se extrae cada valor de cada lista y, previa conversión a valor numérico entero, se asigna a la variable correspondiente. De esta forma tendremos la posibilidad de variar el ámbito de valores de rango del programa simplemente cambiando unas cuantas líneas.

Lo restante dice relación al propio dibujo del tornillo, así como al control de errores típico, tanto de DCL como del programa AutoLISP en sí, y a funciones de "embellecimiento" del programa. Entre esta últimas existe una que aún no hemos estudiado, es GRAPHSCR. Se ha incluido porque la veremos enseguida, en la siguiente sección, con otras análogas.

 

15ª fase intermedia de ejercicios

· Indicar el resultado de AutoLISP ante las siguientes proposiciones:

 

ONCE.18. MISCELÁNEA DE FUNCIONES ÚTILES

Se ha querido incluir esta sección aquí por aquello de que vamos a estudiar una serie de funciones que, sin bien no pueden englobarse en un grupo general, son muy útiles a la hora desarrollar programas mínimamente presentables. Es tiempo ahora, una vez aprendida la base —y algo más— de la programación en AutoLISP, de que comencemos a hurgar un poco más profundo en el acceso a las características de AutoCAD.

Con estas nuevas funciones podremos forzar la aparición de la ventana de texto de AutoCAD, visualizar la versión numérica e idiomática del programa y etcétera. Comenzamos.

 

ONCE.18.1. Asegurándonos de ciertos datos

(GRAPHSCR)


Esta función no tiene argumentos y su utilidad es conmutar a pantalla gráfica. Tiene el mismo efecto que pulsar
F2 mientras se está en el modo de pantalla de texto. Si ya estamos en pantalla gráfica, simplemente se queda como está.

Se utiliza para asegurarnos de que AutoCAD se encuentra en pantalla gráfica cuando es preciso procesar objetos de dibujo. Como hemos visto la hemos utilizado en el último ejemplo, aunque en ese caso no haría falta, pues al arrancar un cuadro de diálogo siempre se conmuta a pantalla gráfica automáticamente.

En configuraciones con dos pantallas, una gráfica y otra de texto, esta función no tiene efecto.

(TEXTSCR)


Esta función no tiene argumentos y su utilidad es conmutar a pantalla de texto. Tiene el mismo efecto que pulsar
F2 mientras se está en el modo de pantalla gráfica. Si ya estamos en pantalla de texto, simplemente se queda como está.

Se utiliza para asegurarnos de que AutoCAD se encuentra en pantalla de texto cuando es preciso mostrar listados de capas, objetos, propiedades, etc. De esta forma, por ejemplo, para mostrar una lista de todos los objetos designados deberíamos utilizarla, ya que con una configuración de dos o tres líneas en línea de comandos (que viene a ser lo típico) no se vería nada. Y así, además, evitamos que el usuario tenga que pulsar F2 al aparecer la lista. Algunos comandos de AutoCAD (LIST por ejemplo) así lo hacen.

En configuraciones con dos pantallas, una gráfica y otra de texto, esta función no tiene efecto.

(TEXTPAGE)

TEXTPAGE conmuta a pantalla de texto, de manera similar a TEXTSCR. La diferencia radica en que TEXTPAGE efectúa además un borrado o limpiado de pantalla, es decir, el cursor se sitúa al principio de la pantalla de texto.


Esta función resulta útil cuando se escriben listados y no se desea el efecto de scroll o persiana en la pantalla.

(VER)

VER es una función de AutoLISP sin argumentos y meramente informativa. Devuelve una cadena de texto que contiene el número de versión actual y dos letras entre paréntesis que indican el idioma de la misma, además de un texto fijo.

Por ejemplo, en una versión en castellano de AutoCAD 14, VER devolvería:

"AutoLISP Versión 14.0 (es)"

y en una versión inglesa devolvería:

"AutoLISP Release 14.0 (en)"

VER se suele utilizar para comparar la compatibilidad entre programas. Por ejemplo, imaginemos que hemos diseñado un programa en AutoLISP 14 que utiliza funciones inherentes que no existían en la versión 13. Lo primero que podría hacer el programa es comprobar el texto que muestra la función VER para obtener el número de versión. Si no es la 14 mostraría un mensaje de error y acabaría.

Otra utilidad sería capturar el idioma y, dependiendo de que sea uno u otro, escribir determinados textos en dicho idioma.
 

ONCE.18.2. Acceso a pantalla gráfica

 


(GRCLEAR)

NOTA: Esta función se encuentra obsoleta en la versión 14 de AutoCAD, esto es, no realiza su función. Aún así, se mantiene por compatibilidad con programas escritos para versiones anteriores. En AutoCAD 14 simplemente devuelve nil, sin efecto alguno aparente. En versiones anteriores realizaba la función que aquí se expone a continuación.

GRCLEAR despeja la pantalla gráfica actual. El efecto es el mismo que utilizar, por ejemplo, el comando MIRAFOTO de AutoCAD para mostrar una foto sin objeto alguno, es decir, "en blanco". Se puede volver luego a la situación actual con un simple redibujado.

Esta función sólo afecta al área gráfica, no a la línea de estado, línea de comandos o área de menú de pantalla.

(GRDRAW inicio fin color [resaltado])


Esta función dibuja un vector virtual en el área gráfica de la pantalla, entre los dos puntos indicados en
inicio y fin. Los puntos, como siempre, son listas de dos o tres números reales; las coordenadas se refieren al SCP actual del dibujo.

El vector de visualiza con el color especificado —número entero— por el tercer argumento (color). Si se indica –1 como número de color, el vector se visualiza como tinta XOR ("O exclusivo"), es decir, se complementa al dibujarse por encima de algo y se suprime si se dibuja algo nuevo por encima de él.


Si se especifica un argumento resaltado diferente a
nil, el vector se visualiza destacado como vídeo inverso, brillo, línea de trazos u otro sistema.

Los vectores dibujados con esta función son virtuales —como ya se ha dicho— es decir, no forman parte del dibujo y desaparecerán con un redibujado o una regeneración. Ejemplo:

(GRDRAW ’(50 50) ’(200 200) 1 T)

(GRVECS lista_vectores [transformación])

Permite dibujar en pantalla una serie de vectores virtuales. El primer argumento lista_vectores es una lista con el color para los vectores y sus coordenadas inicial y final. El ejemplo siguiente dibuja un cuadrado de 10 Ž 10 con cada línea de un color diferente:

 


(GRVECS ’( 2 (10 10) (20 20)
------------4 (20 10) (20 20)
------------1 (20 20) (10 20)
------------3 (10 20) (10 10)
---------)
)

El primer color especificado (2 en el ejemplo) se aplicará a los vectores siguientes dentro de la lista hasta que se indique otro color. Si el valor del color es mayor de 255, se dibujarán en tinta XOR; si es menor de 0, el vector quedará resaltado según el dispositivo de visualización, normalmente en línea discontinua.

El segundo argumento, optativo, es una matriz de transformación que aplicada a la lista de vectores, permite cambiar el emplazamiento y la escala de los vectores que se generarán. Por ejemplo:

’( (2.0 0.0 0.0 30.0)
---(0.0 2.0 0.0 45.0)
---(0.0 0.0 2.0 0.0)
---(0.0 0.0 0.0 1.0)
)

Esta matriz, aplicada al ejemplo anterior, dibujaría un cuadrado al doble de su tamaño y a 30 unidades de desplazamiento en X y 45 en Y.

(GRTEXT [rectángulo texto [resaltado]])

Esta función se utiliza para escribir textos virtuales en las áreas de texto de la pantalla gráfica de AutoCAD. Según en cuál de las tres áreas de texto se quiera escribir, se utilizará la función de manera diferente.

Área del menú de pantalla.

Se indica el número de casilla del área de menú. Este número debe ser un entero positivo ó 0. Las casillas se numeran de arriba abajo empezando por el 0, hasta el número máximo de líneas permitidas por la interfaz gráfica. Por ejemplo una tarjeta gráfica VGA permite hasta 26 líneas en esta área del menú; por lo tanto las casillas se numeran de 0 a 25.

Una vez indicado el número de casilla, se especifica el texto (entre comillas) que se desea visualizar en esa casilla. El texto se truncará si no cabe entero en la casilla, o se completará con blancos en el caso de que sobren caracteres.

Si se indica el argumento resaltado (debe ser un número entero) y su valor es diferente de 0, el texto se pondrá de relieve en la casilla correspondiente. Si su valor es 0, el texto vuelve a su visualización normal. Al indicar un argumento de resaltado, no cambia el texto de la casilla sino sólo su visualización. Por ejemplo:

(GRTEXT 8 "HOLA")
(GRTEXT 8 "QUÉ TAL" 1)

La primera utilización de GRTEXT escribe el texto HOLA en la casilla 8. En la segunda utilización se produce un resaltado en esa casilla, pero el texto sigue siendo HOLA, no ha cambiado. Por eso hay que escribir primero el texto que se desee y después resaltarlo:

(GRTEXT 8 "HOLA")

(GRTEXT 8 "HOLA" 1)

En este caso, para poner de relieve el texto de la casilla 8, se ha indicado el mismo texto que ya tiene escrito. Si se suministra un valor de texto diferente, se pueden producir comportamientos anómalos del programa en AutoLISP.

El texto escrito en la casilla indicada es virtual, no modifica la opción de menú contenida debajo. En cuanto se cambie de submenú o se produzca un redibujado del área de menú, desaparecerán los textos virtuales escritos con GRTEXT. Como el menú de pantalla suministrado por AutoCAD utiliza hasta 26 líneas, todo lo que se escriba más abajo con GRTEXT si hay sitio, permanecerá normalmente en pantalla. La variable de AutoCAD SCREENBOXES almacena el número de casillas disponibles.

Línea de estado (área de modos)

Para visualizar un texto en la línea de estado, en el área donde se escriben los modos activados, rejilla, forzado de cursor, etc., hay que especificar un número de casilla -1. La longitud máxima del texto depende de la tarjeta gráfica (generalmente se admiten más de 40 caracteres). El argumento de resaltado no tiene efecto. Normalmente el texto se situará a la izquierda del área de coordenadas. Cualquier actuación sobre los modos eliminará el texto.

(GRTEXT -1 "DISEÑO ASISTIDO POR ORDENADOR")

Línea de estado (área de coordenadas)

Para escribir el texto en la línea de estado, en la zona de visualización de coordenadas, hay que indicar un número de casilla -2. El argumento de resaltado no tiene efecto. Para que se vea el texto, debe estar desactivado el seguimiento de coordenadas. En cuanto se active o se actúe sobre los modos, se eliminará el texto.

(GRTEXT -2 "EJECUTANDO AutoLISP")


Por último, si se llama a GRTEXT sin argumentos, se restablecerán todas las áreas a su estado original, desapareciendo todos los textos virtuales que se hayan escrito.

 

ONCE.18.3. Lectura de dispositivos de entrada

(GRREAD [seguimiento] [claves [tipo_cursor]])


Esta función permite la lectura directa de dispositivos de entrada. Si se suministra el argumento
seguimiento con un valor diferente de nil, se activa la lectura continua de dispositivos señaladores en movimiento. En este caso GRREAD acepta el primer valor del dispositivo, sin esperar a que se pulsen botones selectores.

El segundo argumento claves deberá ser un número entero con los siguientes valores posibles:

Clave ------ Significado

------------------------------------------------------------------------------------

1 ------ Devuelve las coordenadas en modo arrastre, según la posición del cursor.

2 ------ Devuelve todos los valores de las teclas y no desplaza el cursor cuando se pulse una tecla de cursor.

4 ------ Utiliza el valor del tercer argumento tipo_cursor.

8 ------ Omite el mensaje de error:console break cuando se pulsa CTRL+C.

El tercer argumento tipo_cursor establece el tipo de cursor con tres valores posibles:

Tipo ------- Significado

------------------------------------------------------------------------

0 ------- Muestra el cursor en cruz habitual.

1 ------- Omite el cursor.

2 ------- Muestra en el cursor la mira de designación de objetos.

En todos los casos GRREAD devuelve una lista cuyo primer elemento es un código que indica el tipo de dato que viene a continuación. El segundo elemento es el dato concreto que se trate. Los códigos son los de la tabla de este archivo:

NOTA: Para poder utilizar convenientemente estas últimas funciones es necesario estudiar el acceso a la Base de Datos de AutoCAD, cosa que se verá en su momento oportuno. Será entonces cuando se proponga un ejemplo explicativo.

 

ONCE.18.4. Atribuir expresión a símbolo literal

(SET símbolo_literal expresión)

La función SET no es muy utilizada, por lo que se propone aquí ya que es interesante verla.

SET atribuye el valor de una expresión especificada a un literal de un símbolo. Este símbolo se considera sin evaluar. La diferencia de SET con SETQ es que aquí se atribuye o asocia el valor de la expresión al literal del símbolo, haciendo ambos equivalentes. Con SETQ se almacena, como sabemos ya, valores en símbolos de variables no literales. Veamos un ejemplo. Si hacemos primero:

(SET ’x ’a)

y luego:

(SET x 25)

atribuimos al símbolo x el valor del símbolo a. Si extraemos el valor asociado a x:

!x

AutoLISP devolverá:

A

Si extraemos ahora el valor de a:

!a

AutoLISP devolverá:


25

 

16ª fase intermedia de ejercicios

· Responder a las siguientes preguntas:

 

ONCE.19. ACCESO A OTRAS CARACTERÍSTICAS

En su momento estudiamos el acceso a variables de AutoCAD, a comandos externos, a aplicaciones, etcétera. Así mismo, acabamos de ver el acceso a la pantalla gráfica. Lo que en esta sección se tratará es el acceso a otras características del programa, como pueden ser los menús desplegables, la tableta digitalizadora, los modos de referencia a objetos o los archivos de ayuda (visto esto último por encima en el MÓDULO SEIS, sobre creación de archivos de ayuda).

 

ONCE.19.1. Modos de referencia

Empezaremos por los modos de referencia, aplicación que nos permitirá manejar esta característica de AutoCAD en determinados momentos.

(OSNAP punto modo)

Esta función aplica el modo o modos de referencia indicados al punto especificado. OSNAP devuelve un punto como resultado. El modo será una cadena de texto, por lo que habrá de ir entre comillas. Si se indican varios modos, estos irán separados por comas. Un ejemplo:

(SETQ PuntoMedio (OSNAP ’(10 10 0) "med")

Esto equivaldría a haber seleccionado un modo de referencia Punto medio y haber señalado con el cursor en el punto indicado. Como sabemos, dependiendo del valor del punto de mira de los modos de referencia (variable APERTURE), si se encuentra un objeto dentro de dicha mirilla, su punto medio quedaría almacenado en la variable PuntoMedio. En caso de no encontrar ningún objeto o no existir un punto medio. devuelve nil.

NOTA: No confundir el valor APERTURE de la mirilla (cruceta) de modos de referencia a objetos, con el valor PICKBOX de la mira (cuadrado) de designación de objetos. La mira de referencia actúa de la siguiente forma: cuando tenemos un modo de referencia a objetos activado, por ejemplo el Punto medio, al pasar cerca de objetos, la mira captura o se "engancha" a sus puntos medios (aparece el marcador triangular si la característica AutoSnap está activada). Lo "cerca" que ha de pasar para que esto ocurra es precisamente el tamaño de dicha mirilla.

Se observa entonces que el hecho de que se encuentre o no el punto buscado depende en gran medida del valor actual de la variable APERTURE. Un valor demasiado pequeño dificulta la operación; un valor demasiado grande puede atrapar otro punto próximo que no interese.

La técnica mejor que impone la costumbre no consiste en ampliar o reducir el valor de APERTURE en tiempo de ejecución, sino el asegurar —siempre que se pueda— puntos reales de los objetos. Por ejemplo, si dibujamos una línea y queremos guardar en una variable su punto medio, porque luego nos interesa, lo lógico es proporcionarle a OSNAP un punto conocido de la línea:

(COMMAND "_line" ’(0 0) ’(100 100) "")

Así dibujamos la línea. Ahora guardaremos su punto medio en la variable PtoMed:

(SETQ PtoMed (OSNAP ’(100 100) "_mid"))

De esta manera podremos dibujar ahora, por ejemplo, un círculo con centro en el punto medio de la línea:

(COMMAND "_circle" PtoMed 25)

Al indicar un punto de la línea, APERTURE siempre lo va a englobar, por muy baja que esté definida, ya que es un punto exacto coincidente pues con el cruce de los ejes del cursor.

NOTA: Se observa que los modos de referencia son cadenas que llaman a los modos incluidos en AutoCAD 14, por lo que dependiendo de la versión idiomática del programa habremos de introducirlos en un idioma o en otro. Existe la posibilidad, como vemos, de especificarlos con el guión bajo de subrayado para cualquier versión en cualquier idioma.

Como hemos dicho, si queremos aplicar más de un modo de referencia a la función OSNAP, hemos de especificarlos entre comas:

(SETP PIn (OSNAP Pto1 "med,int,fin"))

NOTA: Los modos pueden introducirse con su nombre completo o con su abreviatura por convenio. Así, valdría igual medio que med.

La variable que controla los modos de referencia actualmente activados en AutoCAD es OSMODE. Esta variable ya la hemos utilizado en algún programa, accediendo a ella para guardar su valor, estableciendo otro y recuperando el valor inicial al terminar el programa.

OSMODE representa los modos almacenados como fijos con los comandos REFENT (OSNAP en inglés) o DDOSNAP. Estos modos se pueden cambiar con REFENT (OSNAP), que abre el mismo cuadro de diálogo que DDOSNAP o, desde la línea de comandos, con –REFENT (-OSNAP en versiones inglesas), introduciendo el guión (-) para ello. Desde línea de comandos se introducen como con la función OSNAP de AutoLISP, con términos literales (aquí sin comillas) y separados por comas si hay más de uno.

Pero lo más lógico de un programa en AutoLISP es acceder a la variable OSMODE y cambiar su valor, para así variar los modos establecidos como fijos. Los valores posibles para OSMODE son los de esta tabla:

Hay que tener en cuenta que el modo Rápido no puede establecerse aisladamente sino en combinación con algún otro modo de referencia, evidentemente.

Los modos con OSMODE se establecen sumando valores; así Punto medio, Inserción, Tangente y Cuadrante activados, darían un valor para la variable de 338 (2 + 64 + 256 + 16).

Tengamos también en cuenta que en sucesivas llamadas a OSMODE (que haremos con GETVAR y SETVAR evidentemente) los modos no se acumulan. Así si una vez le hemos dado un valor de 12 para activar Punto y Centro, si posteriormente le damos 1 para activar Punto final, los dos anteriores se eliminarán y sólo quedará activado el último. Para anular todos ellos, utilizaremos el modo Ninguno (valor 0 para OSMODE).

Las siguientes líneas suelen ser típicas en muchos programas. Al iniciar:

...

(SETQ Modos (GETVAR "osmode"))

(SETVAR "osmode" 1)

...

Se guarda en una variable la actual configuración de modos de referencia y se especifica la que nos interesa. Y al acabar el programa (sea naturalmente o en rutina de control de errores):

...

(SETVAR "osmode" Modos)

...

Para restituir la configuración primitiva del usuario y éste no aprecie nada.

Veamos ahora un método que tenemos —bastante completo— de redibujado de objetos.

 

ONCE.19.2. El redibujado

(REDRAW [nombre_entidad [modo]])

La función REDRAW efectúa un redibujado total —al igual que el comando de AutoCAD— de toda de ventana gráfica actual si se suministra sin argumento alguno:

(REDRAW)

Si se indica un nombre de entidad solamente se redibujará esa entidad. Para especificar dicho nombre habremos de extraerlo de la lista de definición de la entidad en Base de Datos, cosa que se verá más adelante.

Si se ha despejado la ventana gráfica con la función GRCLEAR (ya estudiada en la sección ONCE.18.2.), con REDRAW se pueden redibujar las entidades que se deseen y sólo ellas se harán visibles en pantalla. Por ejemplo, si en un dibujo de circuitería electrónica se desea averiguar cuántos bloques de un componente determinado se encuentran insertados, se extrae de la Base de Datos del dibujo todas las inserciones de bloque (se verá), se despeja la pantalla de GRCLEAR y se redibujan con REDRAW sólo las entidades capturadas.

Si además de un nombre se suministra el argumento modo, se puede controlar la manera en que se hace el redibujado, de acuerdo a la tabla siguiente:

Modo ------- Efecto

------------------------------------------------------------------------

1
----------- Redibuja la entidad en pantalla.

2 ----------- Elimina la entidad de la pantalla, es decir, la oculta. Reaparece con 1.

3 ----------- Visualiza la entidad en relieve (vídeo inverso o doble intensidad).

4 ----------- Suprime la visualización en relieve.


Si el nombre de la entidad indicado se corresponde con un objeto compuesto (bloque con atributo, polilínea no optimizada...), el efecto de
REDRAW se extiende a sus componentes simples. Sin embargo, si el código de modo se indica con signo negativo (-1, -2, -3 ó –4), el efecto de REDRAW sólo afectará a la entidad principal.

Esta función es muy utilizada en el manejo de la Base de Datos del programa. Veremos ahora TRANS, que también se usa mucho en dicho menester.

 

ONCE.19.3. Transformación entre Sistemas de Coor
denadas

(TRANS punto sistema_origen sistema_destino [desplazamiento])

Esta función convierte un punto o un vector de desplazamiento desde un Sistema de Coordenadas a otro. El valor del punto o del desplazamiento se indica como una lista de tres número reales. Si se indica el argumento desplazamiento y su valor es diferente de nil, entonces la lista de tres números reales se considera un vector de desplazamiento.

Los argumentos para los Sistemas de Coordenadas se pueden especificar de tres maneras diferentes. La primera es mediante un código especificativo; los códigos son:

Código ----- Sistema de Coordenadas

--------------------------------------------------------------------------------------------------

0
----------- Sistema de Coordenadas Universal (SCU)

1 ----------- Actual Sistema de Coordenadas Personal (SCP)

2 ----------- Actual Sistema de Coordenadas de la Vista (SCV)

3 ----------- Sistema de Coordenadas del Espacio Papel (sólo en combinación con 2)

 

La segunda forma es mediante un nombre de entidad que indica el Sistema de Coordenadas de la Entidad (SCE) relativo —o Sistema de Coordenadas del Objeto (SCO), según convención—. Esto es equivalente a la opción Objeto del comando SCP de AutoCAD.

La tercera y última manera es con un vector de altura de objeto 3D, indicado como lista de tres números reales. Este vector expresa la orientación de la altura de objeto en el nuevo SCP con respecto al SCU. Este procedimiento no sirve cuando la entidad ha sido dibujada en el SCU (su SCE coincide con el SCU).

La función TRANS devuelve el punto o vector de desplazamiento como una lista de tres elementos expresada en el nuevo Sistema de Coordenadas indicado en sistema_destino. Por ejemplo, si el SCP actual se ha obtenido girando desde el SCU 90 grados sobre el eje Y:

(TRANS ’(1 2 3) 0 1) devuelve (-3.0 2.0 1.0)
(TRANS ’(-3 2 1) 1 0)
devuelve (1.0 2.0 3.0)

En el primer caso, el punto (1 2 3) en el SCU (código 0) se expresa en el SCP actual (código 1) como (-3 2 1). En el segundo caso se hace la operación inversa.

A la hora de introducir coordenadas o desplazamientos para utilizar comandos de AutoCAD, hay que tener muy presente que siempre se consideran respecto al SCP actual (salvo que vayan precedidas de asterisco). Por eso si se dispone de unas coordenadas calculadas en otro sistema, hay que pasarlas siempre al SCP actual mediante TRANS.

En la Base de Datos de AutoCAD los puntos característicos de cada entidad se encuentran expresados en el Sistema de coordenadas del Objeto (SCO). Es necesario siempre tener en cuenta cuál es el SCP actual y utilizar el comando TRANS para convertir esos puntos. Para ello, como ya se ha dicho, se indica el nombre de la entidad en vez de un código. Se verá.


El Sistema de Coordenadas de la Vista (SCV) es el sistema hacia el cual se convierten las imágenes antes de ser visualizadas en pantalla. Su origen es el centro de la pantalla y el eje Z la línea de visión (perpendicular hacia la pantalla). Es importante cuando se pretende controlar cómo van a visualizarse las entidades. Por ejemplo, si el usuario señala un punto y se desea averiguar a qué extremo de una línea existente se encuentra más próximo, se convierte el punto señalado desde el SCP actual al SCV de la forma:

(TRANS punto 1 2)

Después, para efectuar la comparación, hay que convertir cada uno de los puntos finales de la línea (extraídos de la Base de Datos tal como se explicará más adelante) al SCV también.

(TRANS punto_final1 nombre_de_línea 2)
(TRANS punto_final2 nombre_de_línea 2)

Una vez hecho esto, ya se pueden calcular las distancias entre el punto del usuario y los dos puntos finales, medida en el SCV, para determinar cuál es la menor.

Si el punto o vector de desplazamiento indicado en TRANS es en 2D, la propia función lo convierte en 3D suministrando la coordenada Z que falta. Esta coordenada Z dependerá de cuál es el Sistema de Coordenadas desde el cual se considera el punto:

— Si es el Universal (SCU), la coordenada Z es 0.0.

— Si es el Personal actual (SCP), la coordenada Z es el valor de la elevación actual.

— Si es el Sistema de Coordenadas de Objeto (SCO), Z es 0.0.

— Si es el Sistema Coordenadas de la Vista (SCV) en Espacio Modelo o Papel, el valor
de Z es la proyección del punto en el plano XY actual de acuerdo con la elevación
actual.

 

ONCE.19.4. Ventanas y vistas

(VPORTS)

Devuelve una lista con la configuración de ventanas actual. La lista contiene en forma de sublistas los descriptores de todas las ventanas de la configuración actual. Cada descriptor es a su vez una lista con tres elementos: número de identificación de ventana (correspondiente a la variable de sistema de AutoCAD CVPORT), esquina inferior izquierda y esquina superior derecha de cada ventana.

Las dos esquinas aparecen en fracciones de anchura y altura de pantalla, igual que en el listado del comando VENTANAS opción ?. Así, (0 0) corresponde al vértice inferior izquierdo de la pantalla, (1 1) al superior derecho y (0.5 0.5) al centro de la pantalla.

Por ejemplo si la configuración actual en pantalla es de cuatro ventanas iguales de tamaño, VPORTS podría devolver:

((3 (0.5 0.5) (1.0 1.0))
(2 (0.5 0.0) (1.0 0.5))
(6 (0.0 0.5) (0.5 1.0))
(9 (0.0 0.0) (0.5 0.5))
)

El primer número de identificación que aparece (en el ejemplo el 3) es el de la ventana activa actual.

Si TILEMODE tiene valor 0, la lista devuelta describirá las entidades de ventanas gráficas creadas con VMULT en el Espacio Papel. La ventana del Espacio Papel siempre tiene el número 1 y su tamaño se expresa en unidades del dibujo. Por ejemplo, podría devolver la lista:

(1 (0.0 0.0) (483.717 297.0))

(SETVIEW descriptor_vista [identificador_ventana])

Si existe una vista en el dibujo previamente almacenada, esta función restablece dicha vista en una ventana gráfica. Si se omite el segundo argumento, la vista se restablece en la ventana gráfica actual. Si se indica el identificador de la ventana, que es el valor almacenado en la variable de AutoCAD CVPORT, la vista se restablece en esa ventana.

El descriptor de la vista almacenada debe ser del tipo de la lista devuelta por TBLSEARCH, función que se estudiará al hablar del acceso a la Base de Datos de AutoCAD.

ONCE.19.5. Calibración del tablero digitalizador

(TABLET modo [fila1 fila2 fila3 dirección])

Se utiliza para almacenar, recuperar y crear calibraciones de tablero. Si el argumento modo es 0, se devuelve una lista con la calibración actual. Si es 1, se define la nueva calibración aportándola mediante tres puntos 3D que forman las tres filas de la matriz de transformación del tablero, y un vector 3D que define la dirección normal al plano formado por los tres puntos anteriores. La variable de AutoCAD TABMODE permite activar o desactivar el modo Tablero.

 

ONCE.19.6. Control de elementos de menú

(MENUCMD cadena)


Esta función controla la visualización de submenús del menú actual cargado por AutoCAD. Muestra, modifica o solicita un submenú, permitiendo desarrollar alguna acción en el mismo. De este modo se puede ejecutar un programa en AutoLISP asociándole un menú (ya sea de pantalla, tableta, desplegable, etc.) que podría contener por ejemplo opciones para seleccionar por el usuario desde el propio programa en AutoLISP.

MENUCMD devuelve siempre nil. La cadena de texto indicada (entre comillas) es de la forma:

identificador de menú = nombre de submenú
área de menú = acción

En el primer caso, se especifica la inicial del identificador de sección de menú. Estas iniciales son las siguientes:

Iniciales ---------- Menús

-----------------------------------------------------------------

B1-B4 ------------- Menús de pulsadores 1 a 4

A1-A4 ------------- Menús auxiliares 1 a 4

P0 ---------------- Menú de cursor

P1-P16 ----------- Menús desplegables 1 a 16

I ----------------- Menú de imágenes

S ----------------- Menú de pantalla

T1-T4 ------------- Menús de tablero 1 a 4

M ----------------- Expresiones DIESEL

Gmenugroup.id -- Grupo de menú e identificador de menú

El nombre de submenú al que se llama tiene que existir en la sección de menú correspondiente (tiene que haber un identificador de submenú con el nombre en cuestión precedido por dos asteriscos). Por ejemplo:

(MENUCMD "S=REFENT")

haría aparecer en el área de menú de pantalla el submenú REFENT.

(MENUCMD "P2=MALLAS")

En este caso se llama a un submenú MALLAS en la sección de menú desplegable 2 (POP2). Este submenú debe existir en esa sección con su correspondiente identificador **MALLAS.

Existe una segunda forma de cadena de texto para MENUCMD. Consiste en especificar un área de menú, indicando el identificador de menú y el número de elemento que se ha de examinar o modificar, separados por un punto. Por ejemplo:

(SETQ Act (MENUCMD "P12.5=?"))
(IF (= Act "")
(MENUCMD "P12.5=~")
)

La primera expresión examina el estado actual de la opción número 5 del desplegable P12. Si la opción contiene una señal de activación, se devolvería la misma. En caso de no contener dicha señal, devuelve cadena vacía. Si esto ocurre se utiliza de nuevo MENUCMD para asignar a la opción el valor ~ que hace el efecto de poner una señal de activación en el menú. Hay que tener en cuenta que esta señal de activación podría cambiar en diferentes plataformas (podría ser por ejemplo !), como ya debemos saber.

Veremos un par de ejemplos de esta función en la sección ONCE.19.9..

(MENUGROUP nombre_grupo)

Se especifica el nombre de un grupo de menús. Si el grupo está cargado, la función devuelve su nombre. Si no existe, devuelve nil.

 

ONCE.19.7. Letrero de selección de color

(ACAD_COLORDLG número_color [indicador])

Muestra en pantalla el cuadro de diálogo estándar para la selección de color. El primer argumento especifica el número de color que se ofrece por defecto. Hay que tener en cuenta que un valor 0 significa PorBloque y un valor 256 PorCapa. Si el segundo argumento indicador es nil, entonces se desactivan en el cuadro los botones PORCAPA y PORBLOQUE. Si no se especifica o es diferente de nil ambas casillas se encuentran disponibles. La función devuelve el número de color seleccionado mediante el cuadro.

 

ONCE.19.8. Funciones de manejo de ayuda

(ACAD_HELPDLG archivo_ayuda tema)

 

Esta es la función de ayuda en todas las plataformas. Se conserva únicamente por compatibilidad, pero ha sido sustituida totalmente por la siguiente.

(HELP [archivo_ayuda [tema [comando]]])

Esta función la vimos someramente al explicar la creación de archivos de ayuda en el MÓDULO SEIS. Ahora explicaremos todas sus características.

HELP llama a la utilidad de ayuda en todas las plataformas. El primer argumento es el nombre del archivo de ayuda con el que se va a trabajar. Si se indica uno de AutoCAD (extensión .AHP) se utiliza el lector de ayuda de AutoCAD para examinarlo. Si se indica un archivo de ayuda de Windows tipo WinHelp (extensión .HLP) se utiliza el programa Ayuda de Windows (WINHLP32.EXE) para mostrarlo, funcionando como la ayuda en entornos Windows. Si se indica una cadena vacía o se omite, se abre el archivo de ayuda por defecto de AutoCAD 14.

El segundo argumento tema especifica el tema cuya ayuda se muestra en primer lugar en la ventana del texto de ayuda. Si es una cadena vacía se mostrará la ventana inicial de la ayuda. El tercer argumento comando es una cadena de texto que especifica el estado inicial de la ventana de ayuda. Sus valores posibles son:

· HELP_CONTENTS: Muestra el primer tema del archivo de ayuda.

· HELP_HELPONHELP: Muestra la ayuda sobre la utilización de ayuda.

· HELP_PARTIALKEY: Muestra el diálogo de búsqueda utilizando tema como búsqueda inicial

Si no se producen errores, la función devuelve el nombre del archivo de ayuda. Si hay errores, devuelve nil.

(SETFUNHELP C:nombre_comando [archivo_ayuda [tema [comando]]])


Registra una comando para que se pueda utilizar con él la ayuda sensible al contexto. Normalmente el comando será nuevo, definido desde un programa en AutoLISP, por lo que hay que indicar los caracteres
C:.

Cuando se crea un nuevo comando mediante DEFUN, si existe ya como comando registrado mediante SETFUNHELP se suprime del registro. Por eso SETFUNHELP sólo debe ser utilizada en el programa después de crear el comando nuevo con DEFUN.

Una vez registrado el nuevo comando, durante su utilización se podrá llamar a la ayuda transparente mediante ’? o ’AYUDA (’HELP en inglés) y mediante la tecla de función F1. Automáticamente se muestra el texto de ayuda disponible para el nuevo comando. Los argumentos archivo_ayuda, tema y comando tienen el mismo significado que para HELP.

Por ejemplo, se ha creado un nuevo comando llamado MUESTRA y se dispone de un archivo de ayuda LISP.AHP con texto de ayuda específica dentro del tema MUESTRA:

(DEFUN c:muestra ()

...

)

(SETFUNHELP "c:muestra" "lisp.ahp" "MUESTRA")

 

ONCE.19.9. Expresiones DIESEL en programas de AutoLISP

Como vimos en su momento, las expresiones en DIESEL que se referían a la personalización de la línea de estado se guardaban en una variable de sistema llamada MODEMACRO. Nada nos impide rellenar esta variable desde AutoLISP con la función SETVAR, o recoger su contenido con GETVAR.

Desde AutoLISP incluso lo tenemos más fácil y menos engorroso, porque no necesitamos escribir toda la expresión en una sola línea, ya que podemos dividirla en varias que queden concatenadas finalmente con la función STRCAT. Veamos un ejemplo:

(SETVAR "modemacro"
--(STRCAT
----"MI SISTEMA Capa: $(SUBSTR,$(GETVAR,clayer),1,8)"
----"$(IF,$(GETVAR,snapmode),"
----"ForzC X: $(RTOS,$(INDEX,0,$(GETVAR,snapunit)),2,0)"
----"Y: $(RTOS,$(INDEX,1,$(GETVAR,snapunit)),2,0))"
----"$(IF,$(GETVAR,osmode), REFENT)"
--)
)

NOTA: Como se explicó en su momento, el tamaño máximo de una cadena para MODEMACRO es de 255 caracteres, sin embargo desde AutoLISP se pueden incluir tamaños mayores, concatenando cadenas mediante STRCAT (que por cierto, únicamente admite 132 caracteres por cadena, según ya se dijo).

NOTA: Para que una línea de estado se muestre modificada permanentemente, podemos recurrir a archivos del tipo ACAD.LSP (sección ONCE.15.1.) donde incluir la rutina AutoLISP que acceda a MODEMACRO.

Las expresiones DIESEL en menús, por ejemplo, pueden ser combinadas con acciones desde programas AutoLISP, utilizando la función estudiada MENUCMD:

DEFUN c:ventanam ()
--(SETVAR "tilemode" 0)
--(COMMAND "espaciop")
--(SETQ ptb (GETPOINT "Vértice inferior izquierdo de ventana: "))
--(MENUCMD "p12=ventanam")
--(PROMPT "\nSeleccione tamaño desde el menú de pantalla.")
--(SETQ alto (GETREAL "Altura de ventana en fracción de
-----pantalla:"))(SETQ propor (/ (CAR (GETVAR "screensize")) (CADR (GETVAR "screensize")))
--)(SETQ ancho (* alto propor))(SETQ pt1 (POLAR ptb 0 ancho))
--(SETQ pt2 (POLAR pt1 (/ PI 2) alto))
--(COMMAND "vmult" ptb pt2)(PRIN1)
)

La función define un nuevo comando, desactiva TILEMODE y llama a la orden ESPACIOP. Solicita señalar en pantalla un punto de base ptb. A continuación llama a un menú desplegable POP12 con las opciones de tamaño, mediante la función MENUCMD. Se visualiza un mensaje y a continuación se solicita la altura de la ventana en fracciones de pantalla, esperando a que el usuario señale una de las opciones. Este submenú de opciones de tamaño, dentro de la sección de menú ***POP12, podría ser:

**ventanam

[Tamaños]
[ 1]$M=$(getvar,viewsize)
[ 3/4]$M=$(*,$(getvar,viewsize),0.75)
[ 5/8]$M=$(*,$(getvar,viewsize),0.625)
[ 1/2]$M=$(*,$(getvar,viewsize),0.5)
[ 3/8]$M=$(*,$(getvar,viewsize),0.375)
[ 1/4]$M=$(*,$(getvar,viewsize),0.25)

Al seleccionar una opción, la expresión DIESEL obtiene la altura actual de la ventana del Espacio Papel de la variable VIEWSIZE. Según la fracción seleccionada, multiplica dicha altura por la fracción. El valor resultante se admite como respuesta a GETREAL, que lo almacena en la variable alto. A continuación calcula la proporción entre achura y altura, dividiendo los dos valores almacenados en SCREENSIZE. La anchura de la ventana que se desea abrir será el producto de la altura seleccionada por el usuario y el factor de proporción. De esta manera la ventana obtenida guardará la misma relación ancho/alto que la pantalla. Por último, el programa calcula el segundo vértice de la ventana pt2 y llama al comando VMULT para abrir la ventana. Rizar el rizo.

También disponemos de la posibilidad de utilizar expresiones DIESEL como tales en el propio programa de AutoLISP. Esto lo haremos llamando a la función MENUCMD con la inicial de identificador M para leguaje DIESEL (parecido a lo que hacíamos para los menús con DIESEL).

Por ejemplo, un nuevo comando de AutoCAD llamado FECHA para obtener la fecha y hora del sistema en un formato completo podría ser:

(DEFUN c:fecha ()
--(SETQ fecha
----(MENUCMD "M=$(edtime,$(getvar,date),DDDD D MON YY - H:MMam/pm)")
--)
)

La expresión DIESEL lee la variable DATE y le aplica el formato de fecha especificado mediante EDTIME, así al introducir el nuevo comando FECHA en AutoCAD se podría devolver:

Sábado 1 Ago 98 - 4:02pm

Se puede utilizar este mecanismo para introducir expresiones DIESEL desde la línea de comando de AutoCAD y observar los resultados que devuelven. El programa en AutoLISP para conseguirlo sería:

(DEFUN C:Diesel ()
--(WHILE (/= Expr "M=")
----(SETQ Expr (STRCAT "M=" (GETSTRING T "\nExpresión DIESEL: ")))
----(PRINC (MENUCMD Expr))
--)(PRIN1)
)

Al llamar al nuevo comando DIESEL, se visualiza una solicitud de expresión. Cuando el usuario la introduce, GETSTRING la acepta como una cadena de texto, STRCAT le añade por delante M= y la variable Expr almacena el resultado. A continuación, MENUCMD llama a esa cadena con la expresión DIESEL y devuelve su resultado. PRINC lo escribe en pantalla.

NOTA: Recordemos la función de la variable MACROTRACE (véase MÓDULO NUEVE).

NOTA: Las variables de AutoCAD USERS1, USERS2, USERS3, USERS4 y USERS5 pueden ser utilizadas para traspasar información de una rutina AutoLISP a una expresión DIESEL. Véanse en el MÓDULO NUEVE y en el APÉNDICE B.

 

ONCE.19.10. Macros AutoLISP en menús y botones

Es totalmente factible la inclusión de funciones AutoLISP en las definiciones de opciones en archivos de menús, del tipo:

[Dibujar &Línea](command "_.line" "0,0" "10,10" "")

o más complejas, y también en macros de botones de barras de herramientas. E inclusive llamadas a programas AutoLISP, escribiendo el nombre de la función definida o del nuevo comando.

Piénsese que, en última instancia, lo que se ejecuta al hacer clic en una opción de menú o en un botón, es lo mismo que podríamos escribir en la línea de comandos de AutoCAD.

 

ONCE.19.11. Macros AutoLISP en archivos de guión

Por último, decir que también es posible escribir instrucciones AutoLISP (o llamadas a programas) dentro de un archivo de guión o script. Estos archivos como sabemos, ejecutan por lotes las líneas incluidas en ellos como si de su escritura en la línea de comando se tratara.

 


ONCE.19.12. Variables de entorno

(GETENV nombre_variable)

Devuelve una cadena de texto (entre comillas) que es el valor atribuido a la variable de entorno indicada. La variable en cuestión habremos de indicarla también como cadena, por ejemplo:

(GETENV "acadcfg")

Este ejemplo podría devolver "C:\\misdoc~1\\autocad", que es el directorio donde se guarda el fichero de configuración ACAD14.CFG. Esto puede resultar útil para saber dónde se encuentra y acceder a él para leer datos de la configuración de AutoCAD en el equipo donde se ejecuta la función y actuar en consecuencia. La manera de acceder a archivos directamente desde AutoLISP se estudia más adelante en este mismo MÓDULO, en la sección ONCE.21. concretamente.

 

17ª fase intermedia de ejercicios

· Realizar un programa que permita insertar un bloque en medio de una línea ya dibujada, partiendo ésta automáticamente para permitir la inserción. La única condición impuesta al usuario será que el bloque sea unitario en la dirección de la línea, para no complicar mucho el cálculo de los puntos entre los cuales se abrirá hueco.