PARTE SEGUNDA

MÓDULO NUEVE

Lenguaje DIESEL y personalización de la línea de estado

 

NUEVE.1. INTRODUCCIÓN

En AutoCAD, además todo lo visto hasta ahora, es posible personalizar y modificar la línea de estado. Nos da la impresión, visto lo visto y en espera de lo que queda por ver, que AutoCAD 14 no tiene casi ningún aspecto que no pueda ser personalizado; y efectivamente así es: los menús desplegables y contextuales, el menú de pantalla, las barras de herramientas, la acción de los botones del dispositivo señalador en cuestión, los tipos de línea, los patrones de sombreado, las formas y las fuentes, los archivos de ayuda, los comandos externos, las abreviaturas e incluso los propios comandos inherentes al programa pueden ser editados, modificados o personalizados sin mayor problema, como hemos visto. Pues ahora también la línea de estado. Y aún así, la verdadera potencia de personalización vendrá con la creación de letreros de diálogo en DCL y de programas utilitarios en AutoLISP o VBA.

La línea de estado, en los programas basados en Windows, es la que se encuentra ocupando la parte inferior de la pantalla. Además sólo suele ocupar una línea, de ahí su nombre. Esta área de pantalla proporciona información al usuario acerca de los parámetros y condiciones del programa.

En AutoCAD 14, la línea de estado muestra lo siguiente, de izquierda a derecha:

- Coordenadas del cursor, que además es botón de conmutación entre coordenadas rectangulares absolutas/polares relativas/Desactivado.

- Forzado de cursor, botón de Activado/Desactivado.

- Rejilla, botón de Activado/Desactivado.

- Modo Orto, botón de Activado/Desactivado.

- Modos de referencia, botón de Activado/Desactivado. Si no hay modos prefijados, el botón accede al comando REFENT (OSNAP en inglés) para fijar modos.

- Espacio Modelo Flotante/Papel, en entorno Espacio Papel.

- Variable TILEMODE, cambia entre Espacio Modelo Mosaico y Espacio Papel/Modelo Flotante.

Pues bien, esta el la línea de estado por defecto, pero nosotros podemos personalizarla añadiéndole elementos por la izquierda. Para ello utilizamos la variable de AutoCAD MODEMACRO.

NUEVE.2. LA VARIABLE MODEMACRO

La variable de sistema de AutoCAD MODEMACRO almacena una cadena de texto, la cual se refiere a la configuración de la línea de estado. Por defecto está vacía, lo cual indica que la línea de estado mantiene la configuración inicial básica (la anteriormente descrita).

Esta configuración básica no se puede modificar inicialmente, sino añadirle elementos por su izquierda. Para ello editaremos la variable MODEMACRO -como se sabrá, esto se puede hacer escribiendo directamente su nombre o con el comando MODIVAR de AutoCAD (SETVAR en inglés)- y le daremos un valor nuevo.

Una forma elemental de personalizar la línea de estado es añadiendo un texto fijo a la izquierda. Para ello, dicho texto lo habremos de introducir en la variable MODEMACRO. Por ejemplo, podemos editar la variable y escribir:

Personalización de la línea de estado

Ahora, a la izquierda de las coordenadas (en una casilla semejante) aparecerá el texto fijo Personalización de la línea de estado.

En principio la longitud de una cadena para MODEMACRO es de 255 caracteres, aunque mediante concatenación de cadenas en AutoLISP se pueden introducir más, como veremos en su momento. Sin embargo, y lo estudiaremos enseguida, todo lo que se introduzca en esta variable no quiere decir que vaya a ser mostrado en la línea de comandos. Así que, el texto que aparecerá no tiene longitud de cadena fija, sino la impuesta quizá por el gestor gráfico configurado y las dimensiones del monitor, así como la configuración de fuentes y demás. De todas formas, si la cadena es muy larga, las casillas por defecto irán desapareciendo por la derecha a medida que crece nuestra propia configuración por la izquierda.

Para introducir una cadena nula habremos de escribir un punto (.) más un INTRO tras la solicitud de MODEMACRO.

La variable MODEMACRO no se guarda, y al comenzar un nuevo dibujo, abrir uno existente o arrancar AutoCAD se establece como nula. Por ello, las definiciones que se realicen en ella se perderán en dichos casos. Para que esto no ocurra habremos de recurrir a métodos del tipo de la función S::STARTUP o del archivo ACAD.LSP. Todo esto se explica claramente en la sección ONCE.15.1. del MÓDULO ONCE sobre programación en AutoLISP.

Como decimos, no todo lo que se introduce en MODEMACRO ha de ser texto fijo, sino que podemos construir cadenas que extraigan valores de variables y se actualicen en consecuencia, por ejemplo; u otras que según qué condiciones, muestren una cosa u otra. Ello se consigue con la definición de MODEMACRO mediante un lenguaje basado en cadenas de texto llamado DIESEL.

 

NUEVE.3. EL LENGUAJE DIESEL

El leguaje DIESEL (Direct Interpretively Evaluated String Expression Language) es un lenguaje de cadenas de texto que se interpreta y evalúa por AutoCAD directamente. En este leguaje todas las expresiones son cadenas de texto, y los resultados también lo son.

La sintaxis general de las expresiones DIESEL es la siguiente:

$(función,argumento1,argumento2,...)

Como podemos apreciar es un lenguaje basado en signos de dólar $, paréntesis ( ) y comas ,. El carácter $ especifica que se trata de una expresión DIESEL, es un identificador especial para ello. A continuación irá siempre un paréntesis de apertura y el nombre de la función DIESEL en cuestión. Tras una coma, toda la serie de argumentos necesitados por la función, separados todos ellos por comas también. Estos argumentos pueden ser valores, cadenas u otras expresiones DIESEL. Para finalizar, un paréntesis de cierre acaba la expresión.

 

NUEVE.3.1. Catálogo de funciones DIESEL

Veremos ahora el juego de funciones DIESEL de las que disponemos para construir expresiones. En ellas se indicará el nombre de la función en mayúsculas y los argumentos en cursiva y minúsculas. Los argumentos entre corchetes cursivos definen parámetros opcionales. Están ordenadas alfabéticamente.

NOTA: El número máximo de parámetros o argumentos admitidos en una función DIESEL es de diez, incluyendo el propio nombre de la función.

$(+, valor1 [, valor2,... valor9])

Efectúa la suma de todos los valores indicados.

$(-, valor1 [, valor2,... valor9])

Resta del primer valor indicado, todos los demás.

$(*, valor1 [, valor2,... valor9])

Efectúa el producto de todos los valores indicados.

$(/, valor1 [, valor2,... valor9])

Divide el primer valor indicado entre todos los demás.

$(=, valor1, valor2)

Compara ambos valores indicados. Si los valores son iguales el resultado es 1 (la condición es cierta); en caso contrario el resultado es 0 (la condición es falsa).

$(<, valor1, valor2)

Compara ambos valores indicados. Si el valor primero es menor que el segundo el resultado es 1 (la condición es cierta); en caso contrario el resultado es 0 (la condición es falsa).

$(>, valor1, valor2)

Compara ambos valores indicados. Si el valor primero es mayor que el segundo el resultado es 1 (la condición es cierta); en caso contrario el resultado es 0 (la condición es falsa).

 $(!=, valor1, valor2)

Compara ambos valores indicados. Si los valores son diferentes el resultado es 1 (la condición es cierta); en caso contrario el resultado es 0 (la condición es falsa).

$(<=, valor1, valor2)

Compara ambos valores indicados. Si el valor primero es menor o igual que el segundo el resultado es 1 (la condición es cierta); en caso contrario el resultado es 0 (la condición es falsa).

$(>=, valor1, valor2)

Compara ambos valores indicados. Si el valor primero es mayor o igual que el segundo el resultado es 1 (la condición es cierta); en caso contrario el resultado es 0 (la condición es falsa).

$(AND, valor1 [, valor2,... valor9])

Operador lógico Y.

$(ANGTOS, valor [, modo, precisión])

El valor es editado como ángulo (lo convierte en) en el formato indicado en modo y con la precisión indicada en precisión. Los valores de modo posibles son:

Valor ------- Descripción

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

0 ----------- Grados sexagesimales
1 ----------- Grados/minutos/segundos
2 ----------- Grados centesimales
3 ----------- Radianes
4 ----------- Orientación geográfica (N, S, E u O)

 

$(EDTIME, hora, formato)

La hora o fecha indicada se edita con el formato indicado en formato. Los posibles valores para formato son (se proporciona un ejemplo de devolución de la función):

Valor ------- Tipo ---------------------- Ejemplo de salida

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

D --------- día --------------------------- 8
DD --------
día --------------------------- 08
DDD -------
día --------------------------- Jue
DDDD ------
día --------------------------- Jueves
M ---------
mes ------------------------- 7
MO --------
mes ------------------------- 07
MON
---------- mes ------------------------- Jul
MONTH -----
mes ------------------------- Julio
YY --------
año -------------------------- 99
YYYY ------
año -------------------------- 1999
H ---------
horas ------------------------ 4
HH --------
horas ------------------------ 04
MM --------
minutos ---------------------- 53
SS --------
segundos -------------------- 17
MSEC ------
milésimas de segundo ------ 506
AM/PM -----
mañana/tarde -------------- AM
am/pm -----
mañana/tarde -------------- am
A/P -------
mañana/tarde -------------- A
a/p -------
mañana/tarde -------------- a

La fecha y la hora actual se extraen de la variable DATE de AutoCAD. Esta variable, si intentamos mostrar su resultado directamente en la línea de estado -con la función GETVAR que veremos enseguida- (o guardarlo en una variable desde AutoLISP), devolverá un número real. Para convertirlo necesitamos utilizar la función EDTIME.

$(EQ, valor1, valor2)

Compara si ambas cadenas son idénticas. Si lo son devuelve 1 (condición verdadera), si no devuelve 0 (condición falsa).

$(EVAL, cadena)

La cadena indicada es evaluada por DIESEL, obteniendo el resultado correspondiente de esa evaluación.

$(FIX, valor)

Devuelve la parte entera del valor especificado.

$(GETENV, variable_entorno)

Extrae el valor de la variable de entorno indicada.

$(GETVAR, variable_sistema)

Extrae el valor de la variable de sistema de AutoCAD indicada.

$(IF, condición, acción_se_cumple [,acción_no_se_cumple])

Evalúa la expresión indicada en condición y, según sea cierta (1) o no (0), efectúa las acciones indicadas.

$(INDEX, índice, cadena)

Si cadena es una expresión DIESEL con elementos separados por comas, esta función extrae el elemento indicado según el orden en índice. El primer elemento tiene índice 0, el segundo 1, el tercero 2, y así sucesivamente.

$(LINELEN)

Extrae el número máximo de caracteres que se pueden visualizar en la actual línea de estado de la pantalla gráfica. Se suele utilizar antes de modificar MODEMACRO, por ejemplo.

$(NTH, índice, argumento1 [, argumento2,... argumento8])

Evalúa el argumento cuyo índice se indica y obtiene su resultado. El primer argumento tiene índice 0, el segundo 1, el tercero 2, y así sucesivamente.

$(OR, valor1 [, valor2,... valor9])

Operador lógico O.

$(RTOS, valor [, modo, precisión])

El valor es editado como número real (lo convierte en) en el formato indicado en modo y con la precisión indicada en precisión. Los valores de modo posibles son:

Valor ------- Descripción

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

1 ----------- Científico
2 ----------- Decimal
3 ----------- Pies y pulgadas I (fracción decimal)
4 ----------- Pies y pulgadas II (fracción propia)
5 ----------- Fraccional

 

$(STRLEN, cadena)

Extrae la longitud en caracteres de la cadena indicada.

$(SUBSTR, cadena, inicio [, longitud])

Extrae una subcadena de la cadena indicada, comenzando por el número de carácter indicado en inicio y con la longitud en caracteres indicada en longitud. El primer carácter empieza a numerarse desde 1. Si se omite la longitud, se obtiene todo el resto de la cadena a partir del carácter especificado.

$(UPPER, cadena)

Convierte a mayúsculas la cadena indicada.

$(XOR, valor1 [, valor2,... valor9])

Operador lógico O exclusivo.

DIESEL, entre otras utilidades que también veremos, es eminentemente utilizado para pasar cadenas de personalización de línea de estado a la variable MODEMACRO. Si embargo, con DIESEL también podemos crear efectos muy interesantes en los menús desplegables o utilizarlo para ciertos menesteres en AutoLISP. Todo ello se estudiará en su preciso momento.

 

NUEVE.3.1. DIESEL para la línea de estado

Habiendo comprendido la funcionalidad de la variable MODEMACRO y las funciones DIESEL disponibles, podremos percatarnos de que podemos conjugar ambos conocimientos para personalizar la línea de estado de AutoCAD de una manera mucho más eficiente que con un solo texto fijo.

Por ejemplo, si queremos mostrar continuamente en la línea de comandos una serie de textos fijos, pero además el nombre del dibujo actual y el nombre de la capa actual, a la solicitud de MODEMACRO podríamos escribir:

DIBUJO ACTUAL Nombre: $(getvar,dwgname) | Capa: $(getvar,clayer)

Los espacios que utilicemos fuera de las expresiones DIESEL serán interpretados y representados por AutoCAD como tales. Sin embargo, en las expresiones en sí se pueden dejar diversos espacios, pero sólo después de cada carácter de coma (,) como aclaración. Si se utilizan en otro sitio (tras el símbolo $, después del paréntesis de abrir o antes del paréntesis de cerrar) DIESEL no reconoce la sintaxis y puede que represente símbolos extraños en la línea de estado, además de dos signos de interrogación final (??) como mensaje de error. Las escritura en mayúsculas o minúsculas es indiferente.

En el ejemplo propuesto de establecen varios textos como fijos, además de espaciados de separación. Por otro lado se introducen dos funciones GETVAR de DIESEL que tienen la capacidad de extraer el valor de las variables de sistema de AutoCAD. La primera variable extraída es DWGNAME, que guarda el nombre del dibujo actual, y la segunda es CLAYER que guarda el nombre de la capa actual. Todo ello, con los textos por delante y por detrás, podría quedar así -en determinado momento- en la línea de estado:

DIBUJO ACTUAL Nombre: CABLE.DWG | Capa: SOMBREADO

Si durante la actual sesión de dibujo se cambia de capa, se abre un dibujo guardado o se guarda al actual con otro nombre, la variable MODEMACRO es reevaluada y la línea de estado se actualiza instantánea y automáticamente.

Sigamos con el mismo ejemplo. El problema es que, dependiendo de cómo hayamos guardado nuestro dibujo, puede ser que el nombre aparezca totalmente en minúsculas. Para evitar esto y asegurarnos que el resultado será el mostrado un poco más arriba, escribiríamos el siguiente valor más competo para MODEMACRO:

DIBUJO ACTUAL Nombre: $(upper,$(getvar,dwgname)) | Capa: $(getvar,clayer)

De esta manera extraemos el valor de la variable DWGNAME con GETVAR, pero lo filtramos con UPPER para que lo convierta a mayúsculas. Con la capa no es necesario, ya que siempre se guarda en mayúsculas.

NOTA: Hemos de procurar no olvidarnos de ninguna coma, ya que si no DIESEL no reconoce la expresión y funciona como no es debido, además de mostrar sus caracteres ?? de error.

La función de DIESEL para la línea de estado casi se reduce exclusivamente a la captura de valores de variables de AutoCAD y proceso posterior. Veamos un ejemplo más:

Guardar cada $(getvar,savetime) minutos.

Este valor de MODEMACRO hará que aparezca en la línea de estado el mensaje del texto fijo con el valor de la variable SAVETIME, que guarda el valor de los minutos entre guardado y guardado automático.

Pero las expresiones DIESEL se pueden ir complicando un poco:

Ventana $(if,$(=,$(getvar,cvport),1),Papel.,Modelo $(getvar,cvport).)

En este caso se escribe el texto fijo Ventana, después se comprueba con la función condicional IF si la variable CVPORT es igual a 1. Si así fuera se escribe Papel., lo que quedaría Ventana Papel., indicándonos que estamos en Espacio Papel. Si CVPORT es distinto de 1, escribe Modelo y luego un número que es el de la propia ventana, lo que podría quedar Ventana Modelo 3.. Los puntos que se aprecian son de final de línea, dependiendo con qué termine: con Papel o con Modelo y número de ventana.

Al cambiar de ventana, sea Mosaico o Flotante, o entre Espacio Modelo y Papel, los valores se actualizarán.

Y las expresiones DIESEL se pueden complicar aún más:

NOTA IMPORTANTE DE SINTAXIS: La expresiones que sean muy largas y no puedan ser introducidas correctamente en este formato (como la siguiente) se dividen en varias líneas, aunque el usuario debe saber que ha de formar una sola línea en la entrada de MODEMACRO.

DIESEL S.A. $(if,$(getvar,snapmode),Forzcursor:
X=$(rtos,$(index,0,$(getvar,snapunit)),2,0) Y=$(rtos,$(index,1,$(getvar,snapunit)),2,0)
Ángulo=$(angtos,$(getvar,snapang))°)

Esta expresión escribe un texto fijo de una empresa imaginaria llamada DIESEL S.A.. A continuación comprueba si la variable SNAPMODE está activada (igual a 1), es decir si está activado el Forzcursor. Esto se hace simplemente así: $(if,$(getvar..., esto es, no es necesario utilizar un operador de comparación, porque en realidad se determina si la variable existe, si es igual a 1. Si es 0, es como si no existiera y no se detecta.

Si el forzado de cursor no está activado no se hace nada más, simplemente se mantiene el texto inicial. En el momento en que se active esta característica, aparece un nuevo texto Forzcursor: X= que muestra el valor del intervalo en X, extraído como primer elemento (índice 0 en INDEX) de la variable SNAPUNIT, convertido a cadena (RTOS), ya que, como sabemos, a DIESEL sólo hay que darle cadenas, y estos valores son números reales, y pasado a decimal con precisión nula, sin decimales (modo 2 y precisión 0 de la función RTOS).

Posteriormente se escribe otro texto Y=, que muestra el intervalo en Y del Forzcursor y que está extraído de la misma manera que el anterior, pero ahora utilizando un índice 1 (segundo valor) para INDEX.

Por último, se escribe el último texto Ángulo= y se extrae el ángulo de forzado de la variable SNAPANG pasándolo a cadena con la función RTOS. Al final se coloca el símbolo de grados sexagesimales (º).

NOTA: Cuando hay que escribir estas funciones DIESEL tan extensas es fácil que nos equivoquemos y tengamos que repetir desde el principio. Existe un pequeño truco para evitar esta molestia, y es escribir la serie de funciones en un editor o procesador de texto, eso sí todo en una línea o, en su defecto, sin introducir caracteres INTRO. Al final, sólo habremos de copiar y luego pegar la línea en la línea de comandos de AutoCAD, tras la solicitud de MODEMACRO. Si existe algún error, la editaremos tranquilamente y volveremos a repetir la operación.

 

NUEVE.3.2. Expresiones DIESEL en menús

Ya al hablar de la creación de menús para AutoCAD, en el MÓDULO UNO, se explicó por encima la posibilidad de incluir expresiones DIESEL en sus definiciones. Y es que el lenguaje DIESEL no sólo sirve para personalizar la línea de estado, sino que también puede ser incluido, en forma de funciones, en la definición de cualquier tipo de menú, como decimos.

Dentro de un archivo de menú pueden aparecer expresiones en DIESEL fundamentalmente en dos áreas o elementos: entre los corchetes de la cadena textual que será mostrada o fuera de ellos, esto último es, en la macro de ejecución de la opción de menú.

 

NUEVE.3.2.1. DIESEL entre corchetes

Esta parte fue la explicada someramente en el MÓDULO de creación de menús.

Como vimos allí, una serie de funciones DIESEL pueden ser indicadas, entre los corchetes que almacenan el texto que aparecerá en el menú en pantalla, casi exclusivamente para realizar que una opción esté disponible o no y/o para colocar un símbolo de activación delante de ella. Y decimos casi exclusivamente porque, aparte de este uso, no se le suele dar otro al lenguaje DIESEL en la definición de menús entre los corchetes.

Para no redundar en lo ya explicado, simplemente veremos el ejemplo que se exponía un poco ampliado:

[$(if,$(getvar,tilemode),~) Esp. Papel]espaciop
[$(if,$(getvar,tilemode),~) Esp. Modelo]espaciom

Estas opciones dentro de un menú harán que los textos Esp. Papel y Esp. Modelo se encuentren no disponibles cuando o mientras TILEMODE tenga valor 1 (nos encontremos en el Espacio Modelo Mosaico). Recordemos que el carácter tilde (~), que sale pulsando la tecla ALT y, a la vez, 126 en el teclado numérico, hace que una opción se encuentre no disponible (gris o "apagada") dentro de un menú, con lo que no realizará acción alguna al ser pulsada.

En el momento en que TILEMODE valga 0 (pasemos a Espacio Papel/Modelo Flotante), las expresiones DIESEL se vuelven a evaluar y las opciones se encontrarán disponibles. Al estar ambas activas, si hacemos clic en cualquiera de ella se ejecutará el comando asociado, en este caso ESPACIOP para cambiar a Papel en la primera opción, y ESPACIOM para cambiar a Modelo Flotante en la segunda.

Sabemos también que, además de estar disponible o no una opción, tenemos la posibilidad de incluir una marca de verificación (P ) delante de la misma, dependiendo de si se encuentra activada o no. Para ello, hay que utilizar los caracteres de fin de exclamación y punto seguidos (!.). Veamos un ejemplo:

[$(if,$(getvar,gridmode),!.)Rejilla]^G
[$(if,$(getvar,orthomode),!.)Orto]^O
[$(if,$(getvar,snapmode),!.)Forzcursor]^B

Estas opciones de menú harán que delante de cada texto (Rejilla, Orto o Forzcursor) se coloque o no una marca de verificación, dependiendo si están activadas o no. Para saber esto se recurre a la extracción de los valores correspondientes con GETVAR de las variables asociadas a cada característica.

Veamos un último ejemplo en el se utilizan los dos métodos. Un menú desplegable, por ejemplo, podría ser así:

***POP1

[&Guardado]
[->&Guardar cada]
[$(if,$(=,$(getvar,savetime),20),!.)&20 min.]'savetime 20
[$(if,$(=,$(getvar,savetime),30),!.)&30 min.]'savetime 30
[$(if,$(=,$(getvar,savetime),45),!.)&45 min.]'savetime 45
[<-$(if,$(=,$(getvar,savetime),60),!.)&60 min.]'savetime 60
[--]
[$(if,$(=,$(getvar,savetime),0),~)&No guardar]'savetime 0

Este ejemplo crea un menú de frecuencia de guardado automático, en el que se puede elegir el tiempo de esta característica de AutoCAD 14. Las cuatro primeras opciones establecen la variable SAVETIME a 20, 30, 45 ó 60 minutos. Además, comparando el valor que se acaba de introducir en la variable con él mismo, se activan o no las distintas marcas de verificación, que indican cuál de las opciones está activa. La última opción, establece SAVETIME a 0 minutos y se desactiva a sí misma. Esto se hace para que no esté disponible hasta que se elija otra vez una de las otras, evidentemente.

Por último, recordar que ambas estructuras de opciones de menú, ya sea la de estar disponible o no o la de la marca de verificación, se pueden combinar dentro de una misma opción concatenando los signos (~!.). También decir que en los dispositivos gráficos que no admiten la señal P , se puede utilizar cualquier otro carácter, como la letra c, por ejemplo (!c).

 

NUEVE.3.2.2. DIESEL en la macro

Como decimos, una expresión DIESEL puede aparecer también en una macro de menú (o incluso de un botón de barra de herramientas).

La manera de realizar estas llamadas es similar a la que utilizábamos para los submenús, pero empleando un nombre de sección especial M, e incluyendo a continuación la expresión DIESEL. La sintaxis pues sería:

$M=expresión_DIESEL

Veamos un ejemplo. La siguiente expresión define una opción de menú que es un conmutador entre Espacio Modelo Flotante y Espacio Papel:

[EM/EP]^C^C^P$M=$(if,$(and,$(=,$(getvar,tilemode),0),
$(=,$(getvar,cvport),1)),Espaciom,Tilemode 0 Espaciop)

 

Primeramente se efectúan dos cancelaciones y se desactiva el eco de menú (^C^C^P). A continuación viene la llamada a la expresión DIESEL ($M=). Dicha expresión incluye una función condicional IF que examina los valores de TILEMODE y CVPORT. Si es 0 TILEMODE, y al mismo tiempo CVPORT vale 1, esto significa que nos encontramos en el entorno Espacio Papel, por lo que se conmuta a Espacio Modelo Flotante con el comando ESPACIOM. En caso contrario, se desactiva TILEMODE (por si se encontrara con valor 1) y se cambia a Espacio Papel con el comando ESPACIOP de AutoCAD.

 

NUEVE.3.3. Expresiones DIESEL en botones

La manera de utilización de expresiones en DIESEL en la macro de un botón de una barra de herramientas es exactamente la misma que la vista para la macro de una opción de menú. Por ejemplo, el último ejemplo explicado (conmutador EM/EP), podría haber sido incluido con la misma sintaxis (excepto, evidentemente, la opción de menú en sí) en una macro dentro de la definición de un botón.

NUEVE.3.4. Expresiones DIESEL en archivos de guión

Decir que también es posible escribir funciones DIESEL 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, por lo que habrá que invocar a la variable MODEMACRO anteriormente. Por ejemplo:

MODEMACRO
Capa actual: $(getvar,clayer)

 

NUEVE.3.5. Variables USERn1 a USERn5 y MACROTRACE

Como hemos podido comprobar, el lenguaje DIESEL es muy limitado con respecto a otros entornos de desarrollo mucho más avanzados. Y es que en un principio, para AutoCAD, se incluyó como apoyo a los demás aspectos personalizables. Por no disponer, no disponemos en DIESEL ni de la ventaja de declarar variables de usuario y asignarles valores posteriormente.

Se incluyen en AutoCAD quince variables independientes de usuario que son: de USERI1 a USERI5, de USERR1 a USERR5 y de USERS1 a USERS5. Las variables USERI pueden almacenar valores enteros, USERR valores reales y USERS cadenas de texto. Estas últimas son las que más nos interesan, ya que DIESEL es un lenguaje que trabaja con cadenas de texto, como ya sabemos.

Dichas variables podemos utilizarlas en cualquier momento, ya sea para almacenar un dato y después recuperarlo, ya sea para cualquier otro menester; están a disposición del usuario. Así mismo pueden ser utilizadas a la hora de programar en DIESEL, ya que a ellas se puede acceder como a cualquier otra variable de sistema en AutoCAD 14. Todas ellas se vacían igual que MODEMACRO, esto es, con un punto (e INTRO).

En DIESEL no existe ninguna función que permita editar o modificar los valores de las variables de sistema, por lo que habremos de recurrir al comando MODIVAR (SETVAR en el programa en inglés) de AutoCAD. Aún así, todo este proceso resulta muy engorroso y asaz limitado en el fondo, ya que sólo puede utilizarse en macros y combinando la rutina DIESEL con las llamadas a MODIVAR.

Simplemente que quede la idea de estas quince variables que podemos utilizar como memoria temporal.

NOTA: Las variables USERS1 a USERS5 se utilizan también para pasar valores de AutoLISP a expresiones DIESEL.

Por otro lado, decir que la variable MACROTRACE es una herramienta de depuración para expresiones DIESEL. Al activarse (valor 1), todas las expresiones, incluidas las utilizadas en los menús (y botones) y en la línea de estado, son evaluadas. De esta manera se comprueba si se han escrito correctamente. No obstante, conviene evitar la evaluación excesiva.

 

NUEVE.4. EJEMPLOS PRÁCTICOS EN DIESEL

NUEVE.4.1. Línea de estado 1

Usuario: $(getvar,loginname) | Código de idioma ISO: $(getvar,locale)


NUEVE.4.2. Línea de estado 2

Último punto: $(getvar,lastpoint) | Último ángulo: $(if,$(<=,$(getvar,
lastangle),0),negativo o cero,$(getvar,lastangle))

 

NUEVE.4.3. Línea de estado 3

Versión de AutoCAD: $(substr,$(getvar,acadver),1,2) | Directorio raíz
de instalación: $(substr,$(getvar,acadprefix),1,3)

 

NUEVE.4.4. Visibilidad de objetos Proxy

***POP1

[&Objetos Proxy]
[$(if,$(=,$(getvar,proxyshow),1),!.)&Todo]'proxyshow 1
[$(if,$(=,$(getvar,proxyshow),2),!.)&Borde]'proxyshow 2
[--]
[$(if,$(=,$(getvar,proxyshow),0),!.~)&Nada]'proxyshow 0

 

NUEVE.4.5. Orden de objetos

***POP15

[&Ordenación de objetos]
[$(if,$(=,$(getvar,sortents),1),!.,$(if,$(=,$(getvar,sortents),0),~))
Ordena para la &designación]'sortents 1
[$(if,$(=,$(getvar,sortents),2),!.,$(if,$(=,$(getvar,sortents),0),~))
Ordena para la &referencia]'sortents 2
[$(if,$(=,$(getvar,sortents),4),!.,$(if,$(=,$(getvar,sortents),0),~))
Ordena para el re&dibujado]'sortents 4
[$(if,$(=,$(getvar,sortents),8),!.,$(if,$(=,$(getvar,sortents),0),~))
Ordena para las &fotos]'sortents 8
[$(if,$(=,$(getvar,sortents),16),!.,$(if,$(=,$(getvar,sortents),0),~))
Ordena para el re&generado]'sortents 16
[$(if,$(=,$(getvar,sortents),32),!.,$(if,$(=,$(getvar,sortents),0),~))
Ordena para la &trazado]'sortents 32
[$(if,$(=,$(getvar,sortents),64),!.,$(if,$(=,$(getvar,sortents),0),~))
Ordena para la &PostScript]'sortents 64
[--]
[$(if,$(=,$(getvar,sortents),0),!.)De&sactiado]'sortents 0
[$(if,$(!=,$(getvar,sortents),0),!.)Acti&vado]'sortents 1

 

NOTAS INTERESANTES:

  1. Este ejemplo no contempla todos los posibles valores de la variable SORTENTS, ya que se admite la suma de bits para la compaginación.

 

NUEVE.4.6. Ventanas en mosaico y flotantes

***POP1

[&Ventanas]
[Mosaic&o/Flotantes]^C^C$M=$(if,$(=,$(getvar,tilemode),0),_mview,_vports)


NUEVE.FIN. EJERCICIOS PROPUESTOS

  1. Añadir a la línea de estado un texto que especifique si el modo de forzado del cursor (Forzcursor) está o no activado, así como si está establecido en isométrico o no.
  2. Añadir a la línea de estado de AutoCAD un texto que indique la coordenada X y la coordenada Y del centro de la vista de la ventana gráfica actual. Así mismo, y por delante, se indicará que número de ventana es.
  3. Añadir a la línea de estado la fecha y hora actuales en el formato deseado por el creador.
  4. Crear un menú desplegable que permita seleccionar las distintas modalidades de sombra. Al elegir cada una de ellas se activará por delante una marca de verificación. Además, habrá una opción que permita realizar el SOMBRA con la opción elegida.
  5. Diséñese un menú desplegable que permita ejecutar los comandos de configuración de ventanas en mosaico y múltiples o flotantes. Según nos encontremos en Espacio Modelo Mosaico o Espacio Papel/Modelo Flotante, la opción correspondiente estará activa y la otra no.
  6. Crear un conmutador en un menú para alternar entre sombreado de doble o simple rayado para patrones de usuario.
  7. Crear un completo conjunto de expresiones DIESEL para la línea de estado que permita informar en diversos momentos de distintas situaciones del programa. La visualización de unas u otras se controlará desde un menú cualquiera. Deberá estar personalizado para un técnico en diseño de jardines.

 

 (Los ejercicios resueltos de este MÓDULO y del anterior en la próxima entrega).

 

Autor: Jonathan Préstamo Rodríguez

Para: La Web del Programador