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
MODEMACROLa 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 $(<, valor1, valor2)
Compara ambos valores indicados. Si el valor primero es menor que el segundo el resultado es $(>, valor1, valor2)
Compara ambos valores indicados. Si el valor primero es mayor que el segundo el resultado es Compara ambos valores indicados. Si los valores son diferentes el resultado es $(<=, valor1, valor2)
Compara ambos valores indicados. Si el valor primero es menor o igual que el segundo el resultado es $(>=, valor1, valor2)
Compara ambos valores indicados. Si el valor primero es mayor o igual que el segundo el resultado es $(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 Valor ------- Descripción
-----------------------------------------------------------
0 $(EDTIME, hora, formato)
La hora o fecha indicada se edita con el formato indicado en Valor ------- Tipo ---------------------- Ejemplo de salida
1 ----------- Grados/minutos/segundos
2 ----------- Grados centesimales
3 ----------- Radianes
4 ----------- Orientación geográfica (N, S, E u O)
-----------------------------------------------------------------------
D --------- La fecha y la hora actual se extraen de la variable $(EQ, valor1, valor2)
Compara si ambas cadenas son idénticas. Si lo son devuelve $(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 $(INDEX, índice, cadena)
Si $(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 $(NTH, índice, argumento1 [, argumento2,... argumento8])
Evalúa el argumento cuyo índice se indica y obtiene su resultado. El primer argumento tiene índice $(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 Valor ------- Descripción
------------------------------------------
1 $(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 $(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 NUEVE.3.1. DIESEL para la línea de estado
Habiendo comprendido la funcionalidad de la variable 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 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 ( En el ejemplo propuesto de establecen varios textos como fijos, además de espaciados de separación. Por otro lado se introducen dos funciones 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 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 DIBUJO ACTUAL Nombre: $(upper,$(getvar,dwgname)) | Capa: $(getvar,clayer)
De esta manera extraemos el valor de la variable 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 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 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 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 DIESEL S.A. $(if,$(getvar,snapmode),Forzcursor: Esta expresión escribe un texto fijo de una empresa imaginaria llamada 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 Posteriormente se escribe otro texto Por último, se escribe el último texto 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 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 Estas opciones dentro de un menú harán que los textos En el momento en que Sabemos también que, además de estar disponible o no una opción, tenemos la posibilidad de incluir una marca de verificación ( [$(if,$(getvar,gridmode),!.)Rejilla]^G Estas opciones de menú harán que delante de cada texto ( Veamos un último ejemplo en el se utilizan los dos métodos. Un menú desplegable, por ejemplo, podría ser así:
***POP1 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 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 ( 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=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), Primeramente se efectúan dos cancelaciones y se desactiva el eco de menú ( 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 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 NUEVE.3.5. Variables 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 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 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 Simplemente que quede la idea de estas quince variables que podemos utilizar como memoria temporal.
NOTA: Las variables Por otro lado, decir que la variable 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)
Último punto: $(getvar,lastpoint) | Último ángulo: $(if,$(<=,$(getvar, NUEVE.4.3. Línea de estado 3
Versión de AutoCAD: $(substr,$(getvar,acadver),1,2) | Directorio raíz NUEVE.4.4. Visibilidad de objetos Proxy
***POP1 NUEVE.4.5. Orden de objetos
***POP15 NOTAS INTERESANTES
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
2 ----------- Decimal
3 ----------- Pies y pulgadas I (fracción decimal)
4 ----------- Pies y pulgadas II (fracción propia)
5 ----------- Fraccional
X=$(rtos,$(index,0,$(getvar,snapunit)),2,0) Y=$(rtos,$(index,1,$(getvar,snapunit)),2,0)
Ángulo=$(angtos,$(getvar,snapang))°)
[$(if,$(getvar,tilemode),~) Esp. Modelo]espaciom
[$(if,$(getvar,orthomode),!.)Orto]^O
[$(if,$(getvar,snapmode),!.)Forzcursor]^B
[&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
$(=,$(getvar,cvport),1)),Espaciom,Tilemode 0 Espaciop)
Capa actual: $(getvar,clayer)
NUEVE.4.2. Línea de estado 2
lastangle),0),negativo o cero,$(getvar,lastangle))
de instalación: $(substr,$(getvar,acadprefix),1,3)
[&Objetos Proxy]
[$(if,$(=,$(getvar,proxyshow),1),!.)&Todo]'proxyshow 1
[$(if,$(=,$(getvar,proxyshow),2),!.)&Borde]'proxyshow 2
[--]
[$(if,$(=,$(getvar,proxyshow),0),!.~)&Nada]'proxyshow 0
[&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
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
(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 |