MÓDULO DIEZ

Lenguaje DCL; personalización y creación de cuadros de diálogo

DIEZ.1. LENGUAJE DCL

A partir de la versión 12 de AutoCAD existe un lenguaje de programación de letreros de diálogo denominado DCL, el cual nos permitirá crear los cuadros necesarios para que nuestras aplicaciones AutoLISP sean más vistosas y coherentes. El lenguaje AutoLISP será estudiado en el siguiente MÓDULO de este curso.

Con DCL (Dialog Control Language, lenguaje de control de letreros de diálogo) se crean archivos de texto ASCII con extensión .DCL que contienen el diseño geométrico aparente completo de un cuadro de diálogo que queremos crear. No obstante, los elementos definidos en estos archivos han de controlarse desde rutinas en AutoLISP o C. Por esto, en este MÓDULO vamos a estudiar en profundidad cómo crear un cuadro de diálogo, e incluso lo cargaremos e inicializaremos para verlo en AutoCAD, pero hacerlo funcionar, no se explicará hasta el MÓDULO ONCE, en un apartado dedicado a tal efecto.

El aspecto de los cuadros definidos en cuanto a la forma de presentar las casillas, los recuadros, la flecha del cursor, etc., depende del dispositivo gráfico conectado. Lo que el usuario diseña mediante DCL es la distribución de los diferentes tipos de elementos o componentes dentro del cuadro.

Para simplificar el número de parámetros que definen la forma y distribución de los elementos dentro del cuadro, existen posiciones predefinidas en filas y columnas (no es necesario indicar coordenadas X e Y). Además, existe una herramienta de PDB (Programmable Dialogue Box) con elementos (tiles) predefinidos, que se pueden utilizar en la creación de cuadros personalizados.

 

DIEZ.2. ESTRUCRURA JERARQUIZADA DE DISEÑO

La estructura de un fichero DCL es un férrea disposición jerárquica de elementos o tiles que, desde un comienzo común, se van subdividiendo en otros elementos hasta llegar a la parte mínima de representación. Por ejemplo, observemos el cuadro de la página siguiente.

La manera de estructurar este cuadro sería la siguiente. Esencialmente está dividido en cuatro filas: la primera se corresponde con la de las áreas Mallas y Sólidos (de izquierda a derecha), la segunda corresponde a la casilla de verificación Diálogo al imprimir, la tercera a la casilla Gestión de archivos y la cuarta, y última, a la de los botones Aceptar y Cancelar.

A su vez, la primera fila se subdivide en dos columnas, el área Mallas y el área Sólidos. Y a su vez, cada área se vuelve a subdividir en otros elementos: el área Mallas en dos casillas de edición y un botón (3 elementos), y el área Sólidos en dos casillas de edición, una casilla de verificación y un botón (4 elementos). Las demás filas ya no se dividen más.

Pues bien, la forma de diseñar un fichero .DCL se basa precisamente en esa división estructurada, evidentemente recurriendo a la sintaxis propia del lenguaje. Esta sintaxis recuerda un tanto a la de programación en C o C++.

  

DCL se basa en la escritura de lo que se denominan tiles, componentes o elementos. Estos componentes —que iremos viendo poco a poco— son nombres mnemotécnicos precedidos de un carácter de dos puntos (:). Tras el tile se escribe una llave de apertura ({) que englobará a todos los argumentos y tiles incluidos que contenga el anterior, acabando con una llave de cierre (}). Dichos elementos incluidos, o los propios argumentos del elemento externo, se separan con caracteres punto y coma (;). Los comentarios se pueden indicar con una doble barra (//) al principio de la línea o en la forma /*comentario*/ para incluirlos en la mitad de una línea. Además, se suelen sangrar la líneas para mostrar claramente el carácter de anidación de elementos. Están admitidos espacios y tabuladores como separadores por claridad.

 

DIEZ.3. TÉCNICA DE DISEÑO

La organización básica de los diversos componentes de un cuadro es en filas y columnas. Estas se definen con los elementos :row y :column. La utilidad de programación distribuye los componentes dentro de ellas, de manera que tiendan a ocupar todo el espacio de manera simétrica y ordenada. Es por ello que deberemos distribuir la información del cuadro para que quede simétrica. Así por ejemplo, en el cuadro mostrado al principio de esta página, las dos áreas de la primera fila no contienen el mismo número de elementos, por eso no queda muy vistoso. Determinados atributos como fixed_width o fixed_height permiten restringir el espacio ocupado por los componentes.

Existen algunas reglas que debemos (podemos) seguir para el correcto diseño estético y funcional de los cuadros, que se resumen en los siguientes puntos:

— Distribuir los elementos en una disposición que facilite su empleo, de forma que resulte cómodo con el cursor desplazarse de uno a otro. Por ejemplo, para una serie de botones excluyentes es preferible disponerlos en una columna que en una fila. El cursor recorre más espacio entre botón y botón en el último caso. Respetar el orden natural de introducción de datos, como por ejemplo X, Y y Z para las coordenadas.

— Repartir los elementos de manera homogénea por la superficie del cuadro, sin apelotonamientos. Respetar la coherencia con los cuadros existentes en AutoCAD. Así, las casillas que llaman a un subcuadro tienen un título que termina en puntos suspensivos como Mostrar... y las que ocultan el cuadro para señalar algo en pantalla tienen un carácter < como en Designar <. El título de casillas de edición termina en dos puntos. También conviene que la primera letra de los títulos se ponga en mayúsculas. No poner un punto al final de los títulos de casillas.

— Asegurar que los cuadros son reversibles, es decir, que el usuario pueda hacer pruebas sin miedo a cometer actos irreparables. Informarle en todo momento de las consecuencias de su utilización, en forma de avisos o errores en la línea inferior del cuadro (elemento errtile) o cuadros de advertencia en los casos graves mediante la función de AutoLISP ALERT (se estudiará en el siguiente MÓDULO). Examinar todos los datos introducidos por el usuario para detectar valores fuera de rango. Desactivar componentes cuando proceda, para que el usuario vea que no puede utilizarlos.

— Disponer de teclas rápidas para la mayoría de elementos del cuadro. Estas se indican mediante el carácter & (como en los menús) dentro del texto del atributo label. Si hay que incluir abreviaturas en los textos, que sean fácilmente comprensibles. Incluir en las casillas valores por defecto razonables.

— Tener en cuenta que el tamaño de los cuadros se mide en número de caracteres. Influye decisivamente la fuente de letra y la resolución especificada en el gestor gráfico. Una mayor resolución hace que se puedan mostrar cuadros más grandes. Pero una fuente de letra grande, hace que los cuadros ocupen más superficie en pantalla. Así, un mismo cuadro podría no caber en determinadas configuraciones gráficas. Procurar si es posible que el cuadro quepa en la resolución básica de VGA o SVGA(640 × 800 puntos).

Todo esto puede sonarnos raro o no entender algo de momento, pero poco a poco iremos repasándolo e incidiendo en ello mientras creemos nuestros propios cuadros de diálogo.

 

DIEZ.4. LAS HERRAMIENTAS

A partir de aquí vamos a ir explicando las características y componentes propios del lenguaje DCL, es decir la manera de llevar a la práctica todo lo expuesto hasta ahora.

La forma elegida para explicar este lenguaje de programación es, al entender del autor de este curso, la más coherente. En un principio vamos a explicar todos los tiles que existen para programar en DCL, después se detallarán los argumentos que podemos utilizar con dichos tiles y, por último, se establecerá una correspondencia entre los tiles y los argumentos, es decir, con cuáles de ellos podemos usar qué argumentos.

Tras todo esto, podemos empezar a volcar lo aprendido en la creación de cuadros de diálogo. Lo haremos con múltiples ejemplos. Este MÓDULO no está previsto para un aprendizaje de principio a fin, sino más bien para empezar estudiando los ejemplos y, mientras se estudian y comprenden las explicaciones de ellos, ir continuamente atrás a conocer la sintaxis de cada elemento y de cada argumento. Al final el aprendizaje será óptimo.

Las convenciones utilizadas para las sintaxis en este MÓDULO van a ser las siguientes:

· Nombres de tiles y argumentos predefinidos en minúsculas normales.
· Texto en itálica minúscula indica un nombre representativo.
· Puntos suspensivos en itálica indican la posibilidad de indicar más argumentos.
· Una barra vertical indica doble posibilidad.

Comencemos pues.

 

DIEZ.4.1. Los tiles o elementos

Existe distintos tipos de tiles que vamos a ir viendo a lo largo de este MÓDULO DIEZ. Todos ellos se pueden clasificar en cuatro grandes grupos o categorías:

1. Grupos de componentes (Tile Clusters): No se puede seleccionar el grupo sino sólo los componentes individuales dentro del grupo. No pueden tener acciones asignadas, salvo los grupos de botones excluyentes. Son los siguientes:

Cuadro de diálogo en su conjunto, :dialog
Columna, :column
Columna encuadrada o enmarcada, :boxed_column
Fila, :row
Fila encuadrada o enmarcada, :boxed_row
Columna de botones de selección excluyentes, :radio_column
Columna de botones excluyentes enmarcada, :boxed_radio_column
Fila de botones de selección excluyentes, :radio_row
Fila de botones excluyentes enmarcada, :boxed_radio_row

2. Componentes individuales de acción (Tiles): al ser seleccionados, se ejecuta la acción asignada. Esta acción se asigna a través de la clave (atributo key) que identifica cada componente. Son los siguientes:

Casilla de activación o conmutador, :toggle
Botón de acción, :button
Botón excluyente, :radio_button
Casilla de edición, :edit_box
Botón de imagen o icono, :image_button
Casilla o recuadro de lista, :list_box
Lista desplegable, :popup_list
Barra de exploración o deslizador, :slider

3. Componentes decorativos e informativos: no realizan acciones ni pueden designarse. Muestran información en forma de texto o imágenes. Son:

Croquis o Imagen, :image
Texto, :text
Componente en blanco, spacer
Componente sin tamaño, spacer_0
Componente de tamaño 1, spacer_1
Concatenación de textos, :concatenation
Partes de una concatenación, :text_part
Párrafo de textos, :paragraph

4. Botones de salida y componentes de error: realizan las acciones de validar o anular el cuadro y el tratamiento de errores. Son:

Mensaje de error, errtile
Casilla de Aceptar, ok_only
Casillas Aceptar y Cancelar, ok_cancel
Casillas Aceptar, Cancelar y Ayuda..., ok_cancel_help
Las tres casillas, más mensaje de error, ok_cancel_help_errtile
Las tres casillas, más casilla información, ok_cancel_help_info

Pasamos ahora a ver los atributos y, luego, se explicará cada uno de los tiles y se indicará qué atributos admite.

 

DIEZ.4.2. Los atributos predefinidos

Los atributos de un componente de cuadro definen su aspecto y funcionalidad. Su nombre está normalizado en inglés y cada uno acepta un valor que puede ser uno de los siguientes:

— Valor entero: generalmente representa un tamaño en número de caracteres. Por ejemplo width=18.

— Valor real: en estos casos hay que indicar el dígito correspondiente a la unidad (no vale .7 sino que debe ser 0.7). Por ejemplo aspect_ratio=0.85.

— Cadena de texto entrecomillada: se distinguen las mayúsculas y minúsculas. No es lo mismo key="defecto" que key="Defecto". Si la cadena contiene comillas en su interior, hay que indicarlas mediante el código de control \". Además, se admite \\ para indicar el carácter contrabarra, \n para indicar un cambio de línea y \t para indicar una tabulación.

— Palabra reservada: son términos normalizados en inglés, que se indican sin comillas. También se distinguen mayúsculas y minúsculas. No es lo mismo alignment=centered que alignment=Centered. Normalmente todas se indican en minúsculas, la válida es la primera.

Además de los atributos predefinidos, el usuario puede crear sus propios atributos. Todos los valores asignados a elementos del cuadro, y los obtenidos desde un cuadro tras la actuación del usuario, son siempre cadenas de texto. Por este motivo, en los programas de AutoLISP que hacen funcionar el cuadro, se recurre a las funciones de conversión desde y a cadenas de texto, como ATOI, ATOF, ITOA, RTOS, etcétera, que ya estudiaremos.

Cada tipo de elemento admite varios atributos, pero no todos. Existen atributos específicos, como por ejemplo edit_limit que sólo se utiliza en las casillas de edición (elemento :edit_box).

A continuación se verán todos los atributos disponibles con sus correspondientes explicaciones.

 

DIEZ.4.2.1. Atributos de título, clave y valor inicial

label="cadena";

Puede ser el título del cuadro, una fila o columna enmarcada, una casilla, una imagen, etc. El valor es un texto entre comillas. La tecla aceleradora se indica mediante & (el atributo mnemonic también sirve para especificar una tecla aceleradora). El título puede ser un espacio en blanco o una cadena nula.

key="cadena";

Permite definir la acción que se efectuará sobre o desde el elemento en el programa AutoLISP que hace funcionar el cuadro. Es un texto entre comillas. Debe especificarse en todos aquellos componentes que actúan. Debido a que distingue mayúsculas, conviene indicarlo siempre en minúsculas para que no haya problemas, aunque puede hacerse de otro modo si luego no nos equivocamos en el programa AutoLISP.

value="cadena";

Es el valor presentado al inicializar el cuadro. Se indica como un texto entre comillas. En general, se modificará durante la utilización del cuadro por parte del usuario.

list="cadena";

Líneas de texto que situar inicialmente en las listas desplegables o casillas de lista (componentes :popup_list y :list_box). Se presentan al inicializar el cuadro, aunque pueden ser modificados durante la utilización del mismo. Para separar las diferentes líneas de texto, se emplea el código de cambio de línea \n. Dentro de las líneas se puede incluir el carácter tabulador \t.

alignment=palabra_reservada;

Controla la justificación de un componente dentro de su grupo. Así, una casilla puede estar centrada en el espacio disponible de una fila, o alineada a la derecha por ejemplo. Los valores posibles son left, right o centered para la justificación horizontal y top, bottom o centered para la justificación vertical. Si no se indica, los valores por defecto son left y centered respectivamente.

children_alignment=palabra_reservada;

Controla la alineación de todos los componentes de un grupo, por ejemplo dentro de una fila o columna enmarcada, o una fila o columna de botones excluyentes. Los valores posibles son los mismos que para alignment.

color=valor_entero|palabra_reservada;

Sólo se utiliza con elementos :image e :image_button. Puede ser un valor entero (número de color de AutoCAD) o una de las palabras reservadas que se indican en la siguiente tabla:

Palabra reservada ------- Color

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

dialog_line ------------ Color de línea actual de los cuadros de diálogo.
dialog_foreground ----- Color de primer plano del cuadro de diálogo
------------------------- actual (para texto).
dialog_background ----- Color de fondo del cuadro de diálogo actual.
graphics_background --- Fondo actual de la pantalla de gráficos de
------------------------- AutoCAD (normalmente equivale a 0).
graphics_foreground --- Primer plano actual de la pantalla de gráficos de
------------------------- AutoCAD (normalmente equivale a 7).
black ------------------ Color 0 de AutoCAD (negro).
red --------------------- Color 1 de AutoCAD (rojo).
yellow ----------------- Color 2 de AutoCAD (amarillo).
green ------------------ Color 3 de AutoCAD (verde).
cyan -------------------- Color 4 de AutoCAD (ciano).
blue -------------------- Color 5 de AutoCAD (azul).
magenta ----------------- Color 6 de AutoCAD (magenta).
white ------------------- Color 7 de AutoCAD (blanco).

 

is_bold=palabra_reservada;


Los valores posibles son
true (texto en negrita) o false (texto normal, valor por defecto).

password_char="carácter";

Se utiliza para evitar que otros usuarios vean el valor introducido en la casilla (por ejemplo, en una casilla de solicitud de contraseña). En ésta aparecerá el carácter especificado en password_char, en lugar de los caracteres introducidos por el usuario durante la utilización del cuadro.

layout=palabra_reservada;

Los valores posibles son horizontal (por defecto) y vertical. Para :slider.

 

DIEZ.4.2.2. Atributos de tamaño

width=valor;

Es un número (puede ser real, aunque generalmente se usa entero) que especifica la anchura mínima en número de caracteres de texto. Esta anchura se ampliará automáticamente si el componente lo necesita, a no ser que se indique un atributo del tipo fixed_.... Si se omite, el componente utiliza la anchura mínima para que quepa.

height=valor;

Tiene el mismo significado y formato que width. En las casillas y botones de imagen debe especificarse.

fixed_width=palabra_reservada;

Especifica si la anchura de un componente puede rellenar el espacio disponible. Los valores son true y false (por defecto). Si se indica true, el componente mantiene su tamaño sin ampliarse para ocupar el espacio disponible.

fixed_height=palabra_reservada;

Especifica si la altura de un componente puede rellenar el espacio disponible. Tiene el mismo significado y opciones que fixed_width.

fixed_width_font=palabra_reservada;

Especifica si un cuadro de lista o lista desplegable mostrará texto con un tipo de letra de caudal fijo, es decir, la separación entre caracteres es siempre la misma (por ejemplo la "i" y la "m" ocupan el mismo espacio). Se utiliza para facilitar la alineación de las columnas con tabulaciones. Los valores son true y false (por defecto).

edit_width=valor;

Es la anchura en caracteres de la parte visible de edición o introducción de datos para las casillas de edición. Controla los caracteres que se muestran en la ventana de la casilla, aunque el usuario podría introducir más. Si no se indica, la casilla ocupa todo el espacio. En caso contrario, la casilla se alinea por la derecha. Puede ser un número real, aunque generalmente sea un entero.

children_fixed_width=palabra_reservada;

Especifica si todos los componentes de un grupo pueden ocupar toda la anchura disponible. Si algún componente tiene atribuida una anchura específica mediante width ésta se respeta. Los valores posibles son true y false (por defecto). En principio, conviene no utilizar este atributo.

children_fixed_height=palabra_reservada;

Especifica si todos los componentes de un grupo pueden ocupar toda la altura disponible. Tiene el mismo significado y opciones que children_fixed_width.

aspect_ratio=valor_real;

Es el cociente entre la anchura y la altura de la imagen en una casilla o botón de imagen. Si se indica 0, el componente toma el tamaño de la imagen.

 

DIEZ.4.2.3. Atributos de limitaciones de uso

edit_limit=valor_entero;

Es el número máximo de caracteres que el usuario puede introducir en una casilla de edición. Se indica un número entero entre 1 y 256. Por defecto es un valor 132. El número de caracteres visibles en la casilla (controlado por edit_width) será generalmente menor. Si el usuario introduce más caracteres, éstos se irán desplazando en la ventana visible de la casilla, aceptándose todos hasta llegar al máximo establecido por edit_limit.

min_value=valor_entero;

Es el valor mínimo de un deslizador en su extremo o tope inicial. Se indica un número entero con signo. Valor por defecto = 0. El mínimo posible es -32768.

max_value=valor_entero;

Es el valor máximo de un deslizador en su extremo o tope final. Se indica un número entero con signo. El valor por defecto es 10000. El máximo posible es 32767. El formato es el mismo que min_value.

small_increment=valor_entero;

Es el valor incremental mínimo para el desplazamiento del cursor deslizante. Se obtiene pulsando las flechas en los extremos del deslizador. Por defecto es una centésima del rango total. Así, un deslizador cuyos valores permitidos son entre 0 y 100, ofrecerá un incremento mínimo de 1 en un principio.

big_increment=valor_entero;

Es el valor incremental mayor para el desplazamiento del cursor deslizante. Se obtiene pulsando a un lado y otro del cursor deslizante, sobre la barra del deslizador. El valor por defecto es un décimo del rango total. Un deslizador cuyos valores son entre 0 y 100, ofrecerá un incremento de 10 por defecto. El formato es el mismo que small_increment.

 

DIEZ.4.2.4. Atributos de funcionalidad

action="(expresión_AutoLISP)";

Expresión de AutoLISP que ejecuta la acción que se efectuará cuando se pulsa el componente. También se denomina "retorno de llamada". Debe ir entre comillas. Si desde el programa en AutoLISP se utiliza ACTION_TILE (se verá en el próximo MÓDULO) ésta tiene preferencia sobre la acción especificada en action.

mnemonic="carácter";

Carácter de tecla aceleradora para el componente. Debe ser una cadena de un sólo carácter entre comillas. El carácter debe ser uno de los que forman el título (atributo label). Si el usuario pulsa la tecla con ese carácter (da igual mayúsculas o minúsculas), se activa el componente pero no se selecciona. Resulta más sencillo indicar las teclas aceleradoras mediante & (al igual que en los menús hacíamos) en el título especificado en label.

initial_focus="cadena";

Identificación clave o key (argumento key) del componente del cuadro que se presenta iluminado al entrar en el cuadro y que por lo tanto recibe la pulsación inicial del teclado.

allow_accept=palabra_reservada;

El componente se activa al pulsar la tecla de aceptación (normalmente INTRO). Los valores posibles son true y false (por defecto). Al aceptar un cuadro, se considera pulsado también el botón por defecto (aquél que tiene definido is_default como true).

is_default=palabra_reservada;

El componente se selecciona al pulsar INTRO. Los valores posibles son true y false (por defecto). Sólo un componente del cuadro puede tener este atributo como true (por defecto, es la casilla de validación Aceptar).

is_cancel=palabra_reservada;

El componente se selecciona al cancelar con ESC. Los valores posibles son true y false (por defecto). Sólo un componente del cuadro puede tener este atributo como true (por defecto es la casilla de cancelación Cancelar). El formato es el mismo que el de is_default.

is_enabled=palabra_reservada;

El componente aparece habilitado o no inicialmente. Los valores posibles son true (por defecto) y false. Si se define como false, el componente se muestra atenuado en gris, indicando que se encuentra inhabilitado.
 

is_tab_stop=palabra_reservada;

El componente se activa al desplazarse el usuario por el cuadro mediante el tabulador. Los valores posibles son true (por defecto) y false. Si se define como false, el componente no se activa con la tecla de tabulado y ésta lo pasa por alto.

tabs ="cadena";

Posiciones de tabulación en número de caracteres. Se utiliza en las casillas de lista y listas desplegables para alinear verticalmente columnas de texto (por ejemplo en el cuadro de control de capas, la casilla de lista con los nombres, estados, colores y tipos de línea). Se indica una cadena de texto con las posiciones de tabulación.

tab_truncate=palabra_reservada;

Los valores posibles son true y false (por defecto). Si se define como true, el texto de un cuadro de lista o lista desplegable se truncará al rebasar la posición de una tabulación existente.

multiple_select=palabra_reservada;

Establece la posibilidad de seleccionar más de un elemento en una lista de casilla o lista desplegable. Los valores posibles son true y false (por defecto). Si se indica true se permite iluminar o seleccionar varios elementos. En caso contrario sólo uno.

 

DIEZ.4.3. Los tiles y sus atributos
DIEZ.4.3.1. Grupos de componentes

:dialog {atributos...}

Es el componente que engloba a todos los demás y define el cuadro de diálogo. Los atributos permitidos son:

label -- Título en el borde superior del letrero.
value -- Título opcional; invalida al anterior.
initial_focus -- Clave (atributo key) del elemento que se activa inicialmente al desplegarse el cuadro en
----------------- pantalla.

:column {atributos...}

Agrupa en una columna a todos los componentes incluidos en su definición. Los atributos permitidos son:

label -- Título en el borde superior de la columna.
width -- Anchura mínima.
height -- Altura mínima.
fixed_widht -- Anchura fija.
fixed_height -- Altura fija.
children_ fixed_widht -- Anchura fija para todos los componentes.
children_ fixed_height -- Altura fija para todos los componentes.
alignment -- Alineación si está incluida en otro elemento.
children_alignment -- Alineación para todos los componentes.

:boxed_column {atributos...}

Agrupa a todos los componentes incluidos en su definición en una columna enmarcada o encuadrada mediante un rectángulo. Los atributos permitidos son los mismos que los de :column. label indica el título en el borde superior del marco. Si se indica como título un espacio en blanco, label = " ", se deja un espacio encima de la columna. Si se indica cadena nula, label = "", no existe ese espacio.

:row {atributos...}

Agrupa en una fila a todos los componentes incluidos en su definición. Los atributos posibles y su funcionalidad son los mismos que para :column.

:boxed_row {atributos...}

Agrupa a todos los componentes incluidos en su definición en una fila enmarcada o encuadrada mediante un rectángulo. Los atributos y la consideración para label, igual que en :boxed_column.

:radio_column {atributos...}

Agrupa en una columna a una serie de botones de acción excluyentes. Cada botón será un componente :radio_button. Sólo uno de los botones puede encontrarse activado cada vez.

key -- Clave de acción para la columna. Se puede indicar una clave, al contrario que en :column o ----
------
:boxed_column.
value -- Valor de clave (atributo key) del botón inicialmente activado.

:boxed_radio_column {atributos...}

Agrupa a una serie de botones de acción excluyentes en una columna enmarcada dentro de un rectángulo. Su funcionamiento es similar al de :radio_column.

label -- Título en el borde superior del marco. Las mismas posibilidades que en :boxed_column.
key -- Clave de acción para la columna. Se puede indicar una clave, al contrario que en :column o

:boxed_column.

value -- Valor de clave (atributo key) del botón inicialmente activado.

:radio_row {atributos...}

Agrupa en una fila a una serie de botones de acción excluyentes. Cada botón será un elemento :radio_button. Su funcionamiento y atributos son los de :radio_column.

:boxed_radio_row {atributos...}

Agrupa a una serie de botones de acción excluyentes, en una fila enmarcada dentro de un rectángulo. Cada botón será un elemento :radio_button. Su funcionamiento y atributos son los de :boxed_radio_column.

  

DIEZ.4.3.2. Componentes individuales de acción

:toggle {atributos...}

Casilla de activación o conmutador que puede valer 0 ó 1. Si se encuentra activada, se muestra con una señal en su interior en forma de × o ü.

label -- Título a la derecha de la casilla.
value -- Estado inicial de la casilla. Por defecto es 0, desactivada. Si es 1 la casilla está activada.
key -- Clave de acción asignada a la casilla.
action -- Acción asignada por defecto a la casilla.
width -- Anchura mínima.
height -- Altura mínima.
fixed_width -- Anchura fija.
fixed_height -- Altura fija.
alignment -- Alineación de la casilla, respecto al elemento en el que estáincluida.
is_enabled -- Estado de habilitación.
is_tab_stop -- Tabulador tiene o no en cuenta esta casilla. 

:button {atributos...}

Botón con un texto en su interior que efectúa una acción al ser pulsado. Los atributos posibles y su funcionalidad son los mismos que para :toggle añadiéndose los siguientes y con su característica propia en label:

mnemonic -- Carácter de tecla mnemotécnica para seleccionar.
is_default -- Botón seleccionado o no al pulsar INTRO.
is_cancel -- Botón seleccionado o no al pulsar ESC.
label -- Texto que aparece dentro del botón.

:radio_button {atributos...}

Botón componente dentro de una fila o columna de botones excluyentes. Su valor puede ser 0 ó 1. Como sólo uno de ellos puede estar activado en cada grupo del tipo :...radio... se activará el último al que se haya asignado valor 1. Atributos los de :toggle, con las siguientes puntualizaciones y excepciones:

label -- Título a la derecha del botón.
value -- Estado inicial del botón. Por defecto es 0, desactivado. Si es 1 el botón está activado.
mnemonic -- Carácter de tecla mnemotécnica.

:edit_box {atributos...}


Casilla para que el usuario introduzca datos, con un título a su izquierda, y una ventana donde el usuario escribe valores o modifica los existentes. El título se justifica por la derecha. Atributos los de
:toggle más las siguientes puntualizaciones y añadidos:

label -- Título a la izquierda de la casilla.
value -- Contenido inicial de la casilla. Aparece justificado a la izquierda.
mnemonic -- Carácter mnemotécnico.
allow_accept -- La casilla se activa al pulsar INTRO.
edit_width -- Anchura en caracteres de la ventana de edición.
edit_limit -- Número máximo de caracteres que el usuario puede introducir.

:image_button {atributos...}

Presenta una imagen o icono en lugar de texto. Al ser designado, se devuelven las coordenadas del punto de designación. Esto resulta útil para asignar diferentes acciones a zonas de la imagen. Por ejemplo, este mecanismo se utiliza en el cuadro del comando de AutoCAD 14 DDVPOINT. El tamaño se especifica mediante una anchura y altura, o mediante uno de ambos atributos y aspect_ratio. Atributos los de :toggle más los siguientes:

mnemonic -- Carácter mnemotécnico.
allow_accept -- Activado o no a pulsar INTRO.
aspect_ratio -- Relación entre altura y anchura de la imagen.
color -- Color de fondo de la imagen.

:list_box {atributos...}

Casilla que contiene una lista de términos organizados en filas. Si hay más filas de las que caben en el tamaño de la casilla, se despliega un cursor deslizante para moverse por la lista. El atributo value contiene los números de orden de todos los términos inicialmente iluminados o seleccionados en la lista. Sus atributos son los de :toggle, teniendo en cuenta las siguientes consideraciones:

label -- Título encima de la casilla de lista.
value -- Cadena entrecomillada que contiene cero ("") o más números enteros separados por espacios. ----
-------- Cada número es un índice (se empieza a contar desde
0) que designa el elemento de la lista que
-------- aparece seleccionado inicialmente. Si
multiple_select es false, sólo un elemento puede estar
-------- seleccionado.
mnemonic -- Carácter de tecla mnemotécnica.
allow_accept -- Activada o no al pulsar INTRO.
list -- Lista de términos inicialmente incluidos en la casilla.
tabs -- Posiciones de tabulación para presentar los términos en columnas.

:popup_list {atributos...}

Casilla con una flecha a su derecha que, al señalarse despliega una lista. Sólo uno de los términos de la lista puede estar designado. Sus atributos y funcionalidad son los mismos que para :list_box, exceptuando allow_accept y multiple_select, y añadiendo edit_width:

label -- Título a la izquierda de la casilla.
value -- Cadena entrecomillada que contiene un número entero (por defecto 0) con el índice del elemento de
-------- la lista que aparece seleccionado inicialmente en la ventana de la casilla, cuando no
-------- está desplegada la lista.
edit_width -- Anchura en caracteres de la ventana de lista. 

:slider {atributos...}

Barra deslizante, con un cursor que se desplaza y flechas en sus extremos. Los atributos son los mismos que para :toggle, con las siguientes consideraciones y añadidos:

value -- Cadena entrecomillada que contiene un número entero con el valor inicial del cursor deslizante. Por
--------- defecto es el establecido en
min_value.
layout -- Orientación horizontal o vertical de la barra.
min_value -- Valor mínimo en el extremo inicial.
max_value -- Valor máximo en el extremo final.
small_increment -- Incremento mínimo al pulsar las flechas de los extremos.
big_increment -- Incremento mayor al señalar la barra a ambos lados del cursor.

 

DIEZ.4.3.3. Componentes decorativos e informativos

:image {atributos...}

Rectángulo en el que se presenta una imagen vectorial (debe ser un archivo .SLD de foto de AutoCAD). Se debe especificar una anchura y altura, o bien uno de ambos atributos y aspect_ratio. Sus atributos son los mismos que para :image_button excepto allow_accept.

:text {atributos...}

Componente que muestra una cadena de texto. Para los textos fijos, se especifica un atributo label con su contenido. Para los textos variables, se especifica una clave de acción mediante el atributo key. Los atributos posibles son los siguientes:

label -- Texto fijo.
key -- Clave para texto variable.
value -- Estado inicial.
height -- Altura mínima.
width -- Anchura mínima.
fixed_height -- Altura fija.
fixed_width -- Anchura fija.
alignment -- Alineación respecto a donde está incluido.
is_bold -- Si es true muestra el texto en negrita.

:concatenation {:text_part... }

Línea de texto formada por varios componentes :text_part sucesivos. Se utiliza para presentar un mensaje que consta de varias partes que pueden variar independientemente entre sí en tiempo real. No tiene atributos.

:text_part {atributos...}

Componente de texto que forma parte de :concatenation. Los atributos que puede incluir son label, con el contenido del texto, y key.  

:paragraph {:text_part...|:concatenation...}

Conjunto de componentes :text_part o :concatenation dispuestos en vertical. Se utiliza para construir párrafos. No tiene atributos.

:spacer {atributos... }

Componente en blanco que se utiliza para mejorar el aspecto cuando la distribución homogénea y simétrica de los elementos de un cuadro no ofrece una estética adecuada. El tamaño se especifica mediante los atributos height, width, fixed_height, fixed_width y alignment.

spacer_0;

Se trata de un componente predefinido (por eso se indica como los atributos, sin llaves, sin : y con ; al final) sin tamaño concreto, que se inserta para situar un espacio en una zona determinada y ensanchar el resto de componentes.

spacer_1;

Componente predefinido de tamaño unitario, es decir, el mínimo visible para el usuario. Se utiliza por los mismos motivos que spacer_0.

 

DIEZ.4.3.4. Botones de salida y componentes de error

errtile;

Componente predefinido (se indica como los atributos, sin llaves, sin : y con ; al final) de error que aparece como una línea de texto en la parte inferior del cuadro. Tiene asignada la clave (atributo key) error.

ok_only;

Componente predefinido que contiene una :row con el botón de validación Aceptar. Tiene asignada la clave accept.

ok_cancel;

Componente predefinido que contiene una :row con los botones Aceptar y Cancelar. Tienen asignadas las claves accept y cancel.

ok_cancel_help;

Componente predefinido que contiene una :row con los botones Aceptar, Cancelar y Ayuda.... Tienen asignadas las claves accept, cancel y help

ok_cancel_help_errtile;

Componente predefinido que contiene dos :row, una con los botones Aceptar, Cancelar y Ayuda... y otra con el componente de error. Tienen asignadas las claves accept, cancel, help y error. Es la combinación más habitual en la mayoría de cuadros de diálogo.

ok_cancel_help_info;

Componente predefinido que contiene una :row con los botones Aceptar, Cancelar, Ayuda... e Info.... Tienen asignadas las claves accept, cancel, help e info.

NOTA: Uno de estos elementos ok_... habrá de exitir siempre en un cuadro de diálogo para que éste funcione correctamente. La no presencia de uno de ellos, producirá un error al cargarse el letrero.

 

DIEZ.4.4. Elementos predefinidos

Para mayor facilidad existen, como acabamos de ver, unos aspectos y tamaños predefinidos de cuadros, que AutoCAD asume por defecto, y que están almacenados en dos archivos: BASE.DCL y ACAD.DCL (en el directorio \SUPPORT\).

Los elementos o componentes predefinidos se indican como si fueran un atributo más. Por ejemplo, el elemento predefinido para incluir la casilla de validación Aceptar. Este elemento se llama ok_button y en la versión española de AutoCAD se ha cambiado el texto que visualiza por Aceptar, en lugar de OK. Su definición en el archivo BASE.DCL llama a otro elemento predefinido en el mismo archivo, como se muestra a continuación:

retirement_button : button {
fixed_width = true;
width = 8;
alignment = centered;
}
ok_button : retirement_button {
label = "Aceptar";
key = "accept";
is_default = true;
}

En primer lugar, el elemento :retirement_button define una casilla (instrucción DCL :button), con el atributo fixed_width = true para que la casilla no se extienda todo el espacio disponible en el cuadro sino sólo el tamaño del texto Aceptar, con el atributo width = 8 que es la longitud de la casilla, y con el atributo alignment = centered para que la casilla ocupe el centro de la fila del cuadro en que se utiliza. El atributo key asocia una clave de acción al elemento. Desde el programa en AutoLISP que controla el cuadro, el valor accept permitirá especificar una acción para efectuar al salir del cuadro. Ese valor predefinido del atributo key hace referencia siempre a las casillas de validación de todos los cuadros.

A continuación, el elemento ok_button llama a :retirement_button con sus atributos y añade tres nuevos atributos: label = "Aceptar" que es el texto en el interior de la casilla, key = "accept" que es el texto asociado a la aplicación, e is_default = true para que acepte la casilla al terminar el cuadro con INTRO.

De forma similar, el elemento ok_cancel se definiría:

ok_cancel:retirement_button {
label = "Cancelar";
key = "cancel";
is_cancel = true;
}

La casilla ok_button existe en un componente predefinido llamado ok_only. Ambas casillas juntas, existen en un grupo predefinido en fila, con el nombre ok_cancel. Añadiendo una tercera casilla Ayuda..., existe también como grupo predefinido con el nombre ok_cancel_help. De esta forma, a base de módulos incluidos unos en otros, se pueden utilizar en los cuadros elementos comunes predefinidos.

 

DIEZ.5. PROGRAMANDO CUADROS DCL

Una vez llegado a este punto, y tras ver todos los tiles y argumentos que podemos utilizar, vamos a llevar todo a la práctica comenzando a programar nuestros propios letreros de diálogo. Como ya hemos comentado, estos letrero por ahora no funcionarán, porque hay que controlarlos desde AutoLISP, tema que se explicará en el MÓDULO ONCE. Pero podremos ver como quedan en pantalla y, una vez dominado el proceso de diseño, podremos subir un escalón más y hacer que funcionen, como decimos, desde un programa en AutoLISP.

El primer ejemplo que vamos a estudiar es el más sencillo que podemos encontrar. Se trata de un cuadro de diálogo que simplemente muestre un texto dentro de él y un botón Aceptar para cerrarlo.

 

DIEZ.5.1. Ejemplo sencillo: letrero informativo

Lo que queremos conseguir es el cuadro de diálogo de la figura siguiente:

 

 

 Lo primero que vamos a ver es un esquema jerárquico de la división del cuadro en elementos. Este esquema conviene hacerlo siempre antes de diseñar un cuadro, sobre todo cuando es complejo, para ir guiándonos a la hora de escribir el código en DCL. A continuación examinaremos dicho código perteneciente a este cuadro, acompañado de una explicación que se proporciona.

Análisis jerárquico

:dialog
---
|__ :row
------
|__ :column
---------
|__ :text
---------
|__ ok_only

Código

prueba:dialog {label="Prueba en DCL";
:row {
:column {
:text {label="Esto es una prueba";alignment=centered;}
ok_only;
}
}
}

Explicación

Lo primero que se hace es comenzar el cuadro con el tile :dialog, el cual ha de ir siempre precedido del nombre identificador que le queremos dar al cuadro. Este nombre será el que luego se maneje desde AutoLISP. Un carácter { abre dicho tile para introducir todo el resto del programa. :dialog siempre habrá de estar al principio de un programa en DCL y lo contendrá por completo. El atributo label para :dialog da un nombre al letreto de diálogo en su parte superior (barra de título); es la zona de color generalmente azul (navy). Al final, siempre un carácter ; que separa argumentos.

A continuación, y sin indicar otros atributos para :dialog porque no nos interesa, definimos una fila con :row. Dentro de ella se encuentra una columna definida con :column. Dentro de esta columna, un texto centrado en ella (alignment=centered) que dice Esto es una prueba (label). Entre argumentos seguimos separando con ;, incluso al final, ya que lo que venga después, en el fondo, son argumentos del tile que engloba a todo, de :dialog.

Dentro de la misma columna insertamos también un botón Aceptar, el cual, al ser un elemento predefinido no comienza con :, y se centra automáticamente. Al final cerramos todas la llaves abiertas, la de :column, la de :row y la de :dialog.

¿Por qué hemos definido los elementos dentro de una columna, que se encuentra a su vez dentro de una fila, y no dentro de dos filas separadas? La razón es simple. Si el código de este programa hubiera sido así:

prueba:dialog {label="Prueba en DCL";
:row {
:text {label="Esto es una prueba";alignment=centered;}
}
:row {
ok_only;
}
}

tanto el texto como el botón Aceptar se situarían donde se encuentran en el ejemplo anterior, es decir, uno debajo del otro, pero alineados ambos a la izquierda. ¿Por qué? Sencillamente porque se encuentran situados en dos filas y, al indicar que queden centrados (alignment para el texto y por defecto en ok_only), se centrarán con respecto a la fila, es decir con una justificación vertical centrada.

Si se centra un elemento con respecto a una columna, se centrará dejando espacio a su izquierda y a su derecha (se coloca en el centro de la columna). Por el contrario, si se centra un elemento con respecto a una fila, se centrará dejando espacio arriba y abajo (se coloca en el centro de la fila). El resultado del programa anterior es el siguiente:


Por otro lado, los elementos
ok_... se centran también si no se encuentran dentro de ninguna fila ni columna. Así, el ejemplo válido (no este anterior) también podía haberse conseguido así:

prueba:dialog {label="Prueba en DCL";
:row {
:column {
:text {label="Esto es una prueba";alignment=centered;}
}
}
ok_only;
}

NOTA: Para que un cuadro funcione, y como hemos dicho ya anteriormente, siempre debe existir alguno de los elementos ok_....

Hablando ahora de la disposición del código en el archivo ASCII, decir que lo más lógico es indicarlo como se muestra en estos ejemplos. Los tiles que se encuentren dentro de otros suelen separarse de los anteriores por un INTRO, y cuando un tile supone el fin de una ramificación del árbol jerárquico, se coloca entero en una línea (con sus atributos y llave de fin). Además, se pueden indicar tabuladores y espaciados para sangrar líneas (como se ve en prueba.zip) y proporcionar claridad a la jerarquía. También puede haber espacio de claridad en cualquier otro punto: después y antes de los caracteres =, entre argumentos y etcétera.

Por último, decir que el ; tras ok_only es necesario, aunque después no aparezcan más argumentos.

 

DIEZ.5.1.1. Cómo cargar y visualizar el cuadro

En el MÓDULO siguiente trataremos todo lo referente a la interacción de AutoLISP con los cuadros de diálogo en DCL. Sin embargo, y para que podamos ver nuestro nuevo cuadro en pantalla, vamos a explicar muy por encima los pasos que debemos seguir para cargar un cuadro en AutoCAD.

1º. Guardar nuestro archivo de definición con extensión .DCL, por ejemplo, PRUEBA.DCL, y en un directorio de un disco, por ejemplo en C:\DCL\ del disco duro.

2º. En la línea de comandos de AutoCAD 14 escribir la siguiente línea de AutoLISP y pulsar INTRO (hay que escribirla como se indica: con los paréntesis, espacios, comillas, barras inclinadas normales y demás):

(load_dialog "c:/dcl/prueba.dcl")

Evidentemente, la ruta de acceso y el archivo corresponderán a nuestro nombre y ubicación propios.

Esto devolverá un índice de carga (un número en la línea de comandos). Por ejemplo 64. La primera vez que se cargue un cuadro será 1, luego 2, 3, 4...

3º. Escribir esta otra línea ahora:

(new_dialog "prueba" 64)(start_dialog)

Lo que ahora aquí es "prueba" se corresponde con el nombre indicado inmediatamente antes del tile :dialog, no con el nombre de archivo. De todas formas, se recomienda hacer coincidir estos dos nombres para evitar confusiones. Lo que aquí es 64 es el índice devuelto en la operación anterior realizada. Deberemos indicar el que nos haya devuelto AutoLISP a nosotros. Entre el primer paréntesis de cierre y el segundo de apertura no hay espacio.

Tras esto el cuadro se muestra en pantalla y responde.

 

DIEZ.5.2. Ejemplo con casillas de verificación

En el siguiente ejemplo vamos a definir un cuadro de diálogo como el siguiente:

  

Análisis jerárquico

:dialog
|__ :row
|---|__ :boxed_column
|---| |__ :toggle
|---| |__ :toggle
|---| |__ :toggle
|---|__ :boxed_column
|------|__ :toggle
|------|__ :toggle
|------|__ :toggle
|__ spacer_1
|__ :row
|---|__ :toggle
|__ :row
|---|__ :toggle
|__ spacer_1
|__ ok_cancel 

Código

// Ejemplo con casillas de verificación
verif:dialog {label="Casillas";
:row {
:boxed_column {label="Primeras casillas";
:toggle {label="Casilla 1";value=1;}
:toggle {label="Casilla 2";}
:toggle {label="Casilla 3";}
}
:boxed_column {label="Segundas casillas";
:toggle {label="Casilla 4";}
:toggle {label="Casilla 5";value=1;is_tab_stop=false;}
:toggle {label="Casilla 6";value=1;is_tab_stop=false;}
}
}
spacer_1;
:row {:toggle {label="Otra casilla en otra fila";value=1;is_enabled=false;}}
:row {:toggle {label="Otra casilla más en la última fila";}}
spacer_1;
ok_cancel;
}
// Fin del ejemplo


(El ejemplo correctamente sangrado lo tienes en ejemplo.zip)

 

Explicación

Como podemos ver este ejemplo ya está un poco más elaborado. Tras el comienzo de rigor, podemos ver en la estructura jerárquica proporcionada que este letrero de diálogo se divide principalmente en tres filas. La primera fila está a su vez dividida en dos columnas, que en este caso son enmarcadas (:boxed_column), cada una con su título superior y con tres casillas de verificación dentro.

Las otras dos filas no se subdividen en columnas y únicamente tienen un elemento :toggle cada una. Al final existe un tile predefinido ok_cancel, que muestra los botones de Aceptar y Cancelar.

Apreciamos algo nuevo en este cuadro con respecto al anterior; es la introducción de dos elementos predefinidos spacer_1, los cuales introducen una línea (altura de 1 carácter) para separar las dos casilla inferiores tanto de las :boxed_column (por arriba) como de los botones de ok_cancel (por abajo). Como ya hemos comentado anteriormente, los cuadros de diálogo se "autocomponen" en el espacio que ocupan, es decir, el hecho de que indiquemos dos líneas en blanco con spacer_1 no quiere decir que el cuadro vaya a resultar más grande, sino que los elementos incluidos en él se apelotonarán entre sí para dejar dicho espacio libre.

La diferencia que existe entre spacer_1 y spacer_0, es que éste último no tiene un tamaño concreto —como spacer_1 de tamaño un carácter— sino que se inserta para situar un espacio en una zona determinada y ensanchar el resto de los componentes.

NOTA: Pruébese a definir el cuadro sin los tiles spacer_1.

Vemos también en el ejemplo, que algunas casillas aparecen por defecto señaladas. Esto se consigue haciendo el atributo value igual a 1. value hace que al iniciar el cuadro los elementos tengan el valor de la cadena indicada por defecto. Un elemento :toggle no contiene cadenas, ya que es una especie de conmutador, y todos estos conmutadores tienen dos estados: señalado o no señalado, valor 1 y valor 0 respectivamente.

De todas formas, en ejemplos como el que veremos a continuación, el cual contiene conmutadores para variables de AutoCAD, lo más lógico sería que el cuadro se inicializara mostrando por defecto los valores actuales en el sistema. Esto sólo se consigue desde AutoLISP y será tratado en el próximo MÓDULO.

Lo siguiente que podemos apreciar a simple vista es la no disponibilidad de la penúltima de las casillas, la que dice Otra casilla en otra fila. Esto es debido al atributo is_enabled=false. Este atributo permite habilitar o inhabilitar al inicio del cuadro los diversos componentes que lo admiten. Nótese que, aunque esté inhabilitado, la casilla está activada (value=1), esto es perfectamente factible.

En la práctica, lo más lógico será inhabilitar o habilitar los elementos según qué condiciones del sistema desde AutoLISP.

Por último existe otra característica en la que quizá no hemos reparado al observar el cuadro pero que está ahí. Sólo debemos pulsar repetidamente la tecla TAB para recorrer cada uno de los elementos del letrero (como es típico en cuadros tipo Windows) para darnos cuenta de que tanto Casilla 5 como Casilla 6 las pasa por alto. El atributo que define esta característica es is_tab_stop cuando es igual a false. Por defecto es true en todos los tiles; solamente es false en los que se indica expresamente —como aquí— o en los que están inhabilitados con is_enabled=false, que acabamos de comentar.

 

DIEZ.5.3. Letrero de control de variables de AutoCAD


Veamos ahora un pequeño ejemplo de cuadro en el que se combinan varios elementos. Se corresponde con el primer ejemplo que aparece en este MÓDULO (figura primera), el de control de variables de AutoCAD denominado Variables y que se encuentra en la página segunda de este MÓDULO DIEZ.

Existen numerosas variables de sistema de AutoCAD 14 que, o bien no se encuentra definido ningún acceso directo a ellas en ningún cuadro de diálogo, o bien nos los encontramos dichos accesos desperdigados por entre los menús o botones de las barras de herramientas del programa. El cuadro que estudiaremos a continuación recoge una serie de estas variables, proporcionando un buen y rápido acceso a las mismas.

Análisis jerárquico

:dialog
|__ :row
|---|__ :boxed_column
|---|---|__ :edit_box
|---|---|__ :edit_box
|---|---|__ spacer_1
|---|---|__ :button
|---|__ :boxed_column
|-------|__ :edit_box
|-------|__ :edit_box
|-------|__ spacer_1
|-------|__ :toggle
|-------|__ :button
|__ :row
|---|__ :toggle
|__ :row
|---|__ :toggle
|__ :row
|__ ok_cancel

Código

//Archivo .DCL de control de variables de AutoCAD.
variables:dialog {label="Variables";
:row {
:boxed_column {label="Mallas";
:edit_box {label="SURFTAB&1";edit_width=3;edit_limit=3;key="Surf1";}
:edit_box {label="SURFTAB&2";edit_width=3;edit_limit=3;key="Surf2";}
spacer_1;
:button {label="De&fecto";fixed_width=true;alignment=centered;key="Def1";}
}
:boxed_column {label="Sólidos";
:edit_box {label="Isolíneas";edit_width=2;edit_limit=2;key="Iso";
mnemonic="s";}
:edit_box {label="Suavizado";edit_width=4;edit_limit=8;key="Suav";
mnemonic="v";}
spacer_1;
:toggle {label="Si&lueta";key="Sil";}
:button {label="Defe&cto";fixed_width=true;alignment=centered;key="Def2";}
}
}
spacer_1;
:row {:toggle {label="&Diálogo al imprimir";key="Dia";}}
:row {:toggle {label="&Gestión de archivos";key="Ges";}}
spacer_1;
:row {ok_cancel_help;}
}


(El ejemplo correctamente sangrado lo tienes en variables.zip)

Explicación

Descubrimos aquí otro nuevo tile, :edit_box. :edit_box define una casilla de edición en la que el usuario introducirá datos, en este caso valores a las variables en cuestión. A estas casillas, entre otros, casi siempre les acompañan dos argumentos muy típicos para ellas, los cuales son edit_with y edit_limit. edit_with controla el tamaño físico de la casilla, o sea, el tamaño en caracteres que nosotros veremos en el letrero de diálogo. Pero, como sabemos, a veces el tamaño físico aparente poco tiene que ver con el número de caracteres que podemos introducir en una casilla.

Muchas veces, como decimos, una casilla tiene una longitud aparentemente pequeña y, sin embargo, debemos introducir en ella una cadena de caracteres extensa. Lo que ocurre es que, al llegar escribiendo al final aparente de la casilla, se produce un scroll o desplazamiento hacia la izquierda y, mientras se van escondiendo los primeros caracteres introducidos, podemos seguir escribiendo por la derecha hasta un tope. Este tope real de escritura es el que se controla mediante edit_limit, argumento también indicado en las casillas editables del ejemplo.

Un nuevo argumento que podemos observar es key. key define una palabra clave para cada elemento del cuadro que luego será utilizada desde AutoLISP para controlar dicho elemento. Todos los componentes que interactúan en un letrero de diálogo deben poseer un argumento key. Así, y después en AutoLISP, podremos indicar que "tal elemento con determinada key realice tal acción" al determinarse unas características concretas en la sesión actual de dibujo.

NOTA: Todo esto se estudiará en el MÓDULO siguiente, por ahora que quede afianzada la idea.

Con respecto a la clave introducida en el atributo key, decir que se realiza distinción entre mayúsculas y minúsculas. Por ejemplo, si le damos una clave "Suav" a un tile y, después, desde AutoLISP indicamos "suav", el elemento no será reconocido y no funcionará correctamente.

Examinemos ahora los elementos :button introducidos. Estos elemento definen botones que, al ser pulsados realizarán una determinada acción controlada desde AutoLISP. El argumento label indica el nombre que ocupará el espacio del botón. El argumento fixed_width, por su lado, indica si un elemento tiende o no a ocupar el espacio disponible. En este caso, si se establece como true, o no se establece (true es la opción predeterminada), el botón ocupará todo el espacio del que dispone de lado a lado de :boxed_column. El efecto no es muy atractivo —pruébese a quitarle dicho atributo o a declararlo como true— por lo que se suele establecer como false fixed_width en los botones de acción, lo que hace que el tamaño físico de los mismos se trunque con respecto al tamaño de texto que lleva dentro.

En el código que define este cuadro de diálogo podemos apreciar los caracteres & introducidos en las cadenas de etiquetas label. Estos caracteres funcionan de la misma manera que lo hacían en la definición de menús, vista en el MÓDULO UNO de este curso. Es decir, el carácter que sigue a & será una definición de tecla rápida o mnemotécnica (que aparecerá subrayada) la cual, con solo ser pulsada (o con ALT dependiendo del momento), hará acceder directamente al elemento que la lleve en su definición. Pero ojo, es una acceso rápido no una tecla de acción. Por ejemplo, los botones definidos que establecerían una configuración por defecto de las variables del cuadro, al pulsar una de las teclas mnemotécnicas que llevan implícitos serán designados (se dibuja una pequeña línea de puntos alrededor del texto) pero no pulsados. Para pulsarlos habría que presionar INTRO.

Las consideraciones que debemos observar a la hora de definir estas teclas son las mismas que en los menús. Por ejemplo, no podemos definir dos iguales en un mismo letrero (si existen dos iguales sólo funcionará la primera definida en el archivo .DCL o irán rotando), ni letras acentuadas, etcétera.

Otra forma de definir estas teclas mnemotécnicas es con el atributo mnemonic. Podemos ver un par de ejemplos en el código anterior (en las :edit_box Isolíneas y Suavizado). mnemonic se hace igual a un carácter (si se indica más de uno únicamente se toma el primero) que ha de corresponder con uno existente en el atributo label. Si no existe en la cadena de label dicho carácter, la definición será ignorada. Si existen dos caracteres iguales en label, se toma como válido el primero.

NOTA: Cuidado con los botones Ayuda e Info... que vienen con los caracteres "u" e "I" predefinidos como teclas mnemotécnicas.

Por último decir que el tile predefinido ok_button_help, que muestra los tres botones correspondientes, está introducido dentro de la definición de una :row. Como sabemos esto no es necesario, pero se suele establecer así por mayor estructuración y claridad.

NOTA: En este cuadro de este último ejemplo existen un par de aspectos que demuestran lo que nunca se debe hacer a la hora de diseñar un letrero de diálogo, y si queremos que resulte vistoso. No es que quede mal del todo, pero apréciese la falta de gusto al incluir más elementos en la :boxed_column de la derecha que en la de la izquierda. También apréciese lo desigual de las dos :edit_box de la :boxed_column derecha. Podían haberse hecho iguales limitando después su tamaño real mediante edit_limit.

 

DIEZ.5.4. Parámetros de control de una curva

Vamos a crear ahora un cuadro que controla los parámetros de creación de una curva helicoidal en 3D mediante una polilínea. El programa AutoLISP que controla por completo este cuadro se explicará, como ejemplo también, en el MÓDULO siguiente. El letrero es el siguiente:

 

Análisis jerárquico

:dialog
|__ :row
|---|__ :image
|---|__ :boxed_column
|-------|__ :radio_row
|-------|---|__ :radio_button
|-------|---|__ :radio_button
|-------|__ :edit_box
|-------|__ :edit_box
|__ :row
|---|__ :boxed_column
|---|---|__ :edit_box
|---|---|__ :popup_list
|---|__ :boxed_column
|-------|__ :radio_row
|-------|---|__ :radio_button
|-------|---|__ :radio_button
|-------|__ :edit_box
|-------|__ :edit_box
|__ :row
|---|__ ok_cancel
|__ :row
|__ errtile


Código

helice:dialog {label="Hélice con Polilínea 3D";
:row {
:image {width=20;aspect_ratio=0.8;color=0;fixed_height=true;key=img;}
:boxed_column {label="Radios";
:radio_row {
:radio_button {label="&Iguales";value="1";key=igu;}
:radio_button {label="&Diferentes";key=dif;}
}
:edit_box {label="Radio i&nicial:";edit_width=6;fixed_width=true;key=radin;}
:edit_box {label="Radio &final: ";edit_width=6;fixed_width=true;
is_enabled=false;key=radif;}
spacer_1;
}
}
:row {
:boxed_column {label="Vueltas";fixed_width=true;
:edit_box {label="Nº &vueltas:";edit_width=2;edit_limit=2;key=nv;}
:popup_list {label="&Precisión:";edit_width=8;list="8 ptos.\n16 ptos.\n24 ptos.\n32 ptos.";key=pre;}
spacer_1;
}
:boxed_column {label="Paso/Altura";
:radio_row {
:radio_button {label="P&aso";value="1";key=bpas;}
:radio_button {label="Altu&ra";key=balt;}
}
:edit_box {label="Pas&o:";edit_width=8;key=pas;}
:edit_box {label="Al&tura:";edit_width=8;is_enabled=false;key=alt;}
}
}
:row {ok_cancel;}
:row {errtile;}
}

(El ejemplo correctamente sangrado lo tienes en helice.zip)


Explicación

El cuadro es muy parecido a los anteriores, únicamente se ha pretendido introducir elementos que no se habían visto aún. Como hemos podido venir comprobando, la estructura de un cuadro de diálogo es siempre la misma. Como los argumentos son comunes a todos los tiles, simplemente hemos de adaptar su significado a cada uno de ellos.

En este último ejemplo que vamos a comentar se han introducido, como decimos, elementos nuevos. El primero con el que nos tropezamos es :image. Este tile define un hueco para insertar una imagen que será una foto .SLD de AutoCAD. Los argumentos mínimos para definir un hueco de imagen son los que se corresponden a la altura y a la anchura. Esto podemos definirlo con width y height, o con cualquiera de los dos y aspect_ratio. La diferencia consiste en que, con los dos argumentos width y height damos a la imagen una altura y una anchura numérica como tal, y con cualquiera de estos y aspect_ratio, le proporcionamos una altura o una anchura y un factor de proporción de aspecto que hará que el cuadro —y por ende la imagen— sea más o menos cuadrado o más o menos rectangular. Un aspect_ratio de 1 define un cuadrado.

Lo normal es introducir también un atributo color con :image para darle un color de fondo.

El atributo fixed_heigth=true ajusta el cuadro un poco. Y es que, como sabemos, la técnica de construcción de un letrero de diálogo mediante DCL no es una ciencia exacta. Al final, el cuadro se reajusta y establece un poco a sí mismo dependiendo de los valores mayores de una columna y/o una fila, del número de elementos, etcétera.

Otro nuevo tile es :radio_row. :radio_row define una fila de botones excluyentes. Éstos son esas pequeñas casillas circulares que sólo puede estar una activada en cada grupo. Cada elemento de una :radio_row ha de ser un :radio_button. Estos últimos se definen con su label correspondiente y, en este caso, con un value=1 en uno de los botones para que aparezca señalado al abrir el cuadro. Al otro no hace falta ponerle value=0, pues al ser botones excluyentes aparecerá sin señalar por defecto. Existe también una :radio_column con el mismo significado que :radio_row pero en formato de columna.

También hemos introducido el elemento :popup_list, que define una lista desplegable. Aparte de otros argumentos ya conocidos, :popup_list introduce el argumento list, que declara todos lo elementos que contiene la lista desplegable. Estos elementos han de ir seguidos y separados por el código de control \n que define un salto de línea.

Por último tenemos un elemento predefinido muy utilizado que es errtile. errtile define al final de cuadro de diálogo (normalmente) una línea de errores. Simplemente deja un hueco en el que irán apareciendo los errores pertinentes según cometa algún fallo el usuario. Todo esto, evidentemente, se controla desde AutoLISP.

Así como el botón de Aceptar tiene definida la clave (atributo key) accept, el botón Cancelar la clave cancel, el botón Ayuda... la clave help y el botón Info... la clave info, la línea de error errtile tiene definida la clave error. Todo esto lo utilizaremos para interactuar desde AutoLISP.

NOTA: Los tres espacios blancos en Radio final: hacen que las casillas :edit_box queden alineadas.

NOTA: Al cargar un archivo DCL y cuando se produce un error, a veces se crea un archivo denominado ACAD.DCE que puede ayudarnos a depurar errores de sintaxis.

Pues bien, hasta aquí este MÓDULO de programación en DCL. Cierto es que no se han mostrado ejemplos de todos los elementos, pero quedan todos explicados. Es trabajo del lector aplicar lo aprendido a diversos ejemplos propios de letreros de diálogo. La mecánica es en todos la misma y quien hace uno no tiene ningún problema en hacer más. En el MÓDULO ONCE, sobre programación en AutoLISP, se estudiará la manera de hacer que estos cuadros que hemos diseñado funcionen en condiciones. Allí se verá algún ejemplo más de algún letrero de diálogo.

 

DIEZ.FIN. EJERCICIOS PROPUESTOS

  1. Escríbase el código DCL necesario para mostrar los siguientes letreros de diálogo expuestos:

a)

 

b-1)

 

b-2)

 (Este cuadro saldrá al pinchar el botón Mostrar... del anterior.)

 

c)

 

 

 

EJERCICIOS RESUELTOS DEL MÓDULO OCHO

NOTA: Se emplea la misma sintaxis que en los ejemplos del MÓDULO OCHO: espacios representados por el símbolo È y localización de un INTRO con el símbolo ¿ .

EJERCICIO I

(...)

 

EJERCICIO II

(...)

 

EJERCICIO III

circleÈ 100,100È 10¿
select
È lÈ ¿
line
È 10,125È 250,10È ¿
matchprop
È lÈ pÈ ¿

 

EJERCICIO IV

lineÈ 140,172È 260,57È ¿
ucs
È obÈ l¿

 

EJERCICIO V

boxÈ 10,10,10È cÈ 50¿
vpoint
È nonÈ *1,-1,1¿

 

EJERCICIO VI

(Ejercicio completo para resolver por técnicos y/o especialistas).

 

 

EJERCICIOS RESUELTOS DEL MÓDULO NUEVE

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

EJERCICIO I

Forzado: $(if,$(=,$(getvar,snapmode),0),DESACTIVADO,ACTIVADO) | Estilo: $(if,$(=,$(getvar,snapstyl),0),ESTÁNDAR,ISOMÉTRICO)

 

EJERCICIO II

ID de Ventana: $(getvar,cvport) | Centro de Ventana, X: $(index,0,$(getvar,viewctr)) Y: $(index,1,$(getvar,viewctr))

 

EJERCICIO III

$(edtime,$(getvar,date),DDD"," DD MON YYYY - H:MMam/pm)

 

EJERCICIO IV

***POP1
[Som&bra]
[$(if,$(=,$(getvar,shadedge),0),!.)&256 colores]'shadedge 0
[$(if,$(=,$(getvar,shadedge),1),!.)256 &resaltar]'shadedge 1
[$(if,$(=,$(getvar,shadedge),2),!.)&16 ocultar]'shadedge 2
[$(if,$(=,$(getvar,shadedge),3),!.)16 re&llenar]'shadedge 3
[--]
[&Sombra]^C^C_.shade

 

EJERCICIO V

***POP7
[&Ventanas]
[$(if,$(=,$(getvar,tilemode),0),~)En &mosaico]^C^C_.vports
[$(if,$(=,$(getvar,tilemode),1),~)&Flotantes]^C^C_.mview

 

EJERCICIO VI

***POP3
[Som&breado]
[Doble/Simple rayado]^C^C$M=$(if,$(=,$(getvar,hpdouble),0),'hpdouble1,'hpdouble 0)

 

EJERCICIO VII

(Ejercicio completo para resolver por técnicos y/o especialistas).

 

 

Autor: Jonathan Préstamo Rodríguez

Para: La Web del Programador