ONCE.16. INTERACCIÓN CON LETREROS EN DCL

Desde la versión 12 de AutoCAD el usuario tiene la posibilidad de elaborar sus propios cuadros o letreros de diálogo en lenguaje DCL para formar parte de aplicaciones personales. Todo lo referente al diseño de estos cuadros ya ha sido estudiado en el MÓDULO DIEZ de este curso. Pero como se dijo entonces, con DCL elaboramos la parte visible del cuadro, es decir su diseño gráfico aparente únicamente. Para hacer que funcionen y para controlarlos debemos recurrir, por ejemplo, a aplicaciones programadas en AutoLISP.

En la presente sección vamos a explicar todas las funciones del lenguaje AutoLISP referentes al control de letreros de diálogo programados en DCL. Se estudiarán todos los métodos para controlar un cuadro y se dispondrán diversos ejemplos que harán referencia al funcionamiento de los cuadros diseñados en el MÓDULO DIEZ. Empecemos sin más dilación.

 

ONCE.16.1. Carga, muestra, inicio, fin y descarga

Las primeras funciones que vamos a estudiar las hemos comentado ya a la hora de hablar del diseño en DCL. Son las utilizadas para cargar, visualizar y activar un cuadro de diálogo.

Como sabemos, para que un programa DCL funcione hace falta utilizar como mínimo tres expresiones AutoLISP: una para cargar el diseño del cuadro en memoria LOAD_DIALOG, otra para mostrarlo en pantalla NEW_DIALOG y otra para activarlo START_DIALOG.

(LOAD_DIALOG archivo_DCL)

LOAD_DIALOG carga en memoria el archivo .DCL de definición de cuadros de diálogo especificado. Un archivo .DCL puede tener más de una definición de cuadros de diálogo, en este caso se cargarían todas ellas. De la misma forma, es posible utilizar varias veces LOAD_DIALOG para cargar varios archivos .DCL, cada uno con uno o más diseños de letreros. archivo_DCL es la ruta y nombre del archivo en cuestión; es una cadena. Ejemplos:

(LOAD_DIALOG "prueba")
(LOAD_DIALOG "c:/archivs/lisp/cuadro.dcl")
(LOAD_DIALOG "c:\\mislsp\\helic-pol.dcl")

NOTA: No es imprescindible indicar la extensión, pero es conveniente por claridad.

Si la carga del archivo es fructífera se devuelve un número entero positivo que es un índice de carga que luego utilizaremos. Este índice comienza en 1, la primera vez que se carga un archivo con esta función, y continúa con 2, 3, 4, 5... Si la carga resulta fallida, se devuelve cero (0) o un número negativo.

NOTA: Todas estas indicaciones, a lo largo de este curso, acerca de lo que devuelve una función (si falla, si no falla, si encuentra o no un archivo, etc.) no son puro capricho, sino muy útiles a la hora de programar. Nótese que, tras haber estudiado el control de errores, podemos utilizar estas respuestas de AutoLISP para controlar el normal flujo de un programa. En este caso que nos ocupa, el hecho de que LOAD_DIALOG devuelva 0 si el proceso de carga falla, nos ofrece la posibilidad de controlar desde el propio programa AutoLISP la correcta o incorrecta carga en memoria de un archivo .DCL; tomando las oportunas decisiones en consecuencia.

El hecho de que LOAD_DIALOG devuelva un índice de carga nos hace pensar la manera de capturarlo para utilizarlo luego con la siguiente función. La manera es bien sencilla, ya que se hace mediante un simple SETQ. Esta será la forma habitual de suministrar esta función, por ejemplo:

(SETQ Ind (LOAD_DIALOG "c:/lisp/torno.dcl"))

De esta forma guardamos en una variable el índice que devuelva LOAD_DIALOG.


(NEW_DIALOG nombre_letrero índice_carga [acción [punto_pantalla]])

Esta función muestra en pantalla el letrero cuyo nombre se indique. No hemos de confundir este nombre de letrero con el nombre del archivo .DCL que, si el archivo sólo contiene una definición de cuadro de diálogo coincidirá habitualmente. El nombre del letrero es el que precede a :dialog en el archivo .DCL. Tengamos en cuenta que, como ya hemos dicho, un archivo puede contener la definición de varios letreros, por eso hay que indicar el nombre del que queremos visualizar. Con LOAD_DIALOG suministrábamos el nombre del archivo .DCL.

También habremos de indicar obligatoriamente con NEW_DIALOG el índice de carga devuelto por LOAD_DIALOG. Así, una manera típica de utilizar esta función tras usar LOAD_DIALOG y haber guardado el índice de carga en una variable llamada Ind (como en el ejemplo anterior), sería:

(NEW_DIALOG "torno" Ind)

NOTA: Aquí vemos como puede coincidir el nombre del archivo .DCL con el nombre del letrero (ver ejemplo anterior).

El argumento acción especifica la acción por defecto, en forma de expresión de AutoLISP, que se asignará a todos los elementos del cuadro que no tengan una acción asignada en el programa. Volveremos sobre este argumento de NEW_DIALOG cuando expliquemos mejor esto de las acciones.

El argumento punto_pantalla es un punto en 2D que especifica la posición inicial del letrero en pantalla, generalmente por la esquina superior izquierda. La posición por defecto es el centro de la pantalla, aunque hablaremos un poco más de este tema cuando se estudie la función DONE_DIALOG.

Si NEW_DIALOG se evalúa correctamente devuelve T, si no devuelve nil.

NOTA: En Windows el letrero queda ya inicializado con NEW_DIALOG, antes de utilizar la siguiente función. Hay que tener en cuenta este aspecto a la hora de hacer llamadas interactivas de NEW_DIALOG cuando hay casillas de un letrero que llaman a otro.

(START_DIALOG)

START_DIALOG inicializa el letrero de diálogo anteriormente mostrado en pantalla con NEW_DIALOG.

Una vez utilizada esta función, la cual no tiene argumentos, el letrero permanece activo hasta que el usuario señale un elemento que lleve asociada una acción de final de letrero (DONE_DIALOG) que lo cierre. Esta acción suele estar asociada habitualmente a los botones Aceptar y Cancelar.

START_DIALOG devuelve el estado en el que se ha cerrado el letrero. Si se ha hecho mediante la casilla Aceptar devuelve 1; si se ha pulsado Cancelar devuelve 0; si había letreros superpuestos y se han cerrado todos a la vez mediante TERM_DIALOG devuelve -1.

Por último, decir que, como enseguida veremos, en cada llamada a DONE_DIALOG se puede indicar un estado de terminación. Si así se ha hecho, START_DIALOG devuelve ese número de estado.

NOTA: mientras un cuadro permanece activo no es posible llamar a funciones de AutoLISP que afectan a la pantalla o requieren entradas del usuario que no tienen que ver con el cuadro. Esto ocurre por ejemplo con COMMAND y con todas las funciones GET.... La función SSGET —ya veremos— se puede utilizar, siempre que no sea una de sus opciones interactivas que solicita la acción del usuario.

(DONE_DIALOG [estado])

Esta función cierra el letrero activo actual. Debe ser llamada desde una expresión de control de los componentes de un letrero. Generalmente será llamada desde la función que defina la acción del botón Aceptar (enseguida veremos todo esto).

La función DONE_DIALOG devuelve las coordenadas X e Y (generalmente de la esquina superior izquierda) correspondientes a la posición del letrero en el momento de cerrarse. Estas coordenadas pueden ser utilizadas para luego proporcionarlas en sucesivas llamadas a NEW_DIALOG que, como hemos comentado antes, admite como argumento unas coordenadas.

Entonces, si calculáramos un valor por defecto para las coordenadas de un cuadro a la hora de abrirse por primera vez (siempre que no exista ya un valor de coordenadas) y capturáramos la salida de DONE_DIALOG así, por ejemplo:

(SETQ CoorCuadro (DONE_DIALOG))

podríamos luego llamar al mismo cuadro utilizando dichas coordenadas. De esta manera el cuadro siempre aparecería en el último lugar en pantalla en el que se cerró. A veces esto puede resultar útil y a veces molesto.

Si se especifica un argumento en estado, debe ser un valor entero positivo. Este argumento indica un estado de terminación que será el que se devuelva en sucesivas llamadas a START_DIALOG. De esta forma se podrá asignar una acción diferente dependiendo desde qué casilla o botón se haya realizado el cierre.

(TERM_DIALOG)

Esta función cancela todos los letreros anidados en pantalla, si los hubiera. Siempre devuelve nil. START_DIALOG, que ha activado el primer letrero desde el que después han salido los demás, devuelve en este caso -1 una vez cancelados todos.

(UNLOAD_DIALOG índice_carga)

Una vez utilizado el diseño del cuadro DCL, es decir una vez mostrado en pantalla, el cuadro puede ser descargado mediante la función UNLOAD_DIALOG (aunque se siga interactuando con él). O sea, el cuadro puede ser descargado inmediatamente después de utilizar START_DIALOG (para liberar espacio en memoria). UNLOAD_DIALOG siempre devuelve nil.


A modo de resumen podríamos decir que el epígrafe de esta sección ONCE.16.1. describe muy bien la manera básica de manejo de cuadros desde AutoLISP. Veamos un ejemplo simplificado:

(SETQ Ind (LOAD_DIALOG "archivo")); Carga
(NEW_DIALOG "cuadro" Ind); Muestra
...
(START_DIALOG); Inicio
(UNLOAD_DIALOG Ind); Descarga
...
(DONE_DIALOG); Fin
...

 

ONCE.16.2. Gestión de elementos del letrero

Una vez estudiada la manera de iniciar y terminar un cuadro en pantalla, vamos a ver cómo gestionar sus componentes incluidos, estableciendo así valores por defecto en el inicio, extrayendo del letrero dichos valores para su proceso, asignando acciones a botones, etcétera. Además afianzaremos lo aprendido anteriormente viendo ya ejemplos prácticos.

Para todo ello vamos a ir desarrollando un ejemplo al cual se referirán todas las explicaciones. Este ejemplo se corresponde con uno de los explicados en el MÓDULO DIEZ, concretamente el de control de variables de AutoCAD 14. Para mayor comodidad mostramos aquí el letrero de diálogo y su código en DCL (un poco variado al final):

NOTA: Los ejemplos que mostremos irán precedidos de epígrafes que estarán identificados por número de ejemplo y número de parte.

Letrero 1

 

Código DCL 1 —VARIABLES.DCL—

dcl1.zip

La función con la que comenzaremos es SET_TILE. SET_TILE asigna un valor al elemento cuya clave —atributo key de DCL— se indica. El atributo valor es una cadena de texto que especifica el valor que se asignará a determinado tile o elemento, como ya hemos dicho, identificado por su key.

Todo texto que aparece en un letrero de diálogo ha de ser una cadena, es decir, texto alfanumérico en formato ASCII, y no valores numéricos en formato numérico. Así por ejemplo:

(SET_TILE "Num" "23.32")
(SET_TILE "Telef" "944661234")
(SET_TILE "ValText" "Marca de moleteado")

Será muchas veces práctica habitual rellenar casillas de un cuadro con valores del sistema por defecto. En este caso, si el valor corresponde a una variable alfanumérica (de AutoCAD o del usuario) no habrá ningún problema en especificar, por ejemplo:

(SET_TILE "Estilo" (GETVAR "textstyle"))

lo que cogerá el valor de la variable de AutoCAD 14 TEXTSTYLE y la introducirá en el elemento con key="Estilo", que podría ser una :edit_box. Pero si el valor es numérico, habremos de convertirlo antes a formato ASCII para después introducirlo en el elemento en cuestión. Esto lo realizaremos con cualquiera de las funciones a tal efecto ya estudiadas, por ejemplo:

(SET_TILE "TiempSal" (ITOA (GETVAR "savetime")))

lo que cogerá el valor de SAVETIME, que es numérico entero, lo convertirá a cadena ASCII con la función ITOA y lo asignará al tile identificado por TiempSal.

NOTA: En la relación de variables de AutoCAD 14 que aparece en el APÉNDICE B de este curso, se especifica para cada una el tipo de formato de datos, así como los valores que admite. De toda maneras, para saber si una variable es numérica o alfanumérica únicamente deberemos teclear su nombre. Si al preguntarnos por el nuevo valor (si no es de sólo lectura) el valor por defecto aparece entrecomillado, es una cadena o variable alfanumérica; si no, es numérica.

Lo primero que debemos hacer en un programa AutoLISP que controla un letrero de diálogo, y después de cargarlo y mostrarlo en pantalla, es rellenar sus casillas con valores por defecto, activar las opciones de casillas de activación y botones excluyentes por defecto, etcétera. Como sabemos, esto lo podemos hacer en el propio archivo .DCL (atributo value), pero es preferible realizarlo desde AutoLISP.

Si inicializáramos elementos desde DCL y posteriormente desde AutoLISP, se daría una redundancia no deseada. Por ejemplo, si inicializamos una casilla de edición :edit_box en DCL, que contiene una valor de una variable de AutoCAD, como value="25" y luego, desde AutoLISP la volvemos a inicializar con el valor de la variable en el momento de mostrar el cuadro (que es lo lógico), se producirá un instantáneo "baile" de números (entre el de value y el actual, si no coinciden) que no es vistoso para el usuario. Por ello, normalmente desecharemos la asignación por defecto desde DCL y la realizaremos desde AutoLISP.

Todas la operaciones de relleno de casillas, asignación de acciones a botones, y en general todos los acceso al cuadro de diálogo (que ya veremos) se introducen antes de la función START_DIALOG y después de NEW_DIALOG, si no no funcionará. Veamos ahora entonces cómo comenzaríamos el ejemplo de programa que nos ocupa.

Código AutoLISP 1 —VARIABLES.LSP— (primera parte)

lisp1-1.zip

Comentarios al código AutoLISP 1 —VARIABLES.LSP— (primera parte)

Lo primero que hacemos aquí es definir una función que es comando de AutoCAD (Var); como sabemos podríamos haber definido una función interna para luego llamarla desde otra que sea comando de AutoCAD.

Posteriormente cargamos el cuadro de diálogo con LOAD_DIALOG guardando en la variable Ind el índice de carga. A continuación, mostramos el cuadro en pantalla con NEW_DIALOG proporcionando el índice devuelto por la función anterior y guardado en Ind.

Una vez hecho esto tenemos que inicializar todas las casillas, introduciendo correlativamente en cada elemento, identificado por su key, el valor correspondiente. Nótese que este caso son valores de variables numéricas de AutoCAD, por lo que debemos utilizar funciones ITOA y RTOS (esta última en el caso del suavizado por ser valor real) para convertir los datos a cadenas de texto.

NOTA: Como ya dijimos en el MÓDULO DIEZ, en DCL se realiza distinción entre mayúsculas y minúsculas, por lo que al identificar las key hay que introducir el mismo nombre que se escribió en el archivo .DCL; no es lo mismo Suav que suav.

Como sabemos, en el caso de casillas de activación :toggle (y de otros elementos como botones excluyentes), un valor de 0 significa desactivado y un valor de 1 significa activado. Aún así, 1 y 0 siguen siendo valores numéricos enteros, por lo que se utiliza para su conversión la función ITOA.

 

(ACTION_TILE clave acción)

Esta es la siguiente subr de AutoLISP que vamos a explicar. ACTION_TILE asigna una expresión AutoLISP indicada en acción al elemento o tile expresado por la clave de su atributo key en el diseño DCL. Ambos argumentos han de expresarse entre comillas dobles ("") por ser cadenas. Por ejemplo:

(ACTION_TILE "bot1" "(SETQ Var1 12) (SETQ Var2 0)")

Lo más lógico parece ser indicar bastantes más acciones que realizar en una asignación con ACTION_TILE. Por eso, la práctica habitual aconseja asignar como acción una llamada a una subrutina o función interna dentro del programa AutoLISP, así:

(ACTION_TILE "bot1" "(Acc1)")

De esta forma asignamos al tile que tenga como key bot1 una secuencia de acciones contenidas en la función Acc1. Esta función deberá estar definida posteriormente, y ya detrás de START_DIALOG, con su DEFUN particular. Sigamos con nuestro ejemplo para entenderlo mejor.

Código AutoLISP 1 —VARIABLES.LSP— (segunda parte)

lisp1-2.zip

Comentarios al código AutoLISP 1 —VARIABLES.LSP— (segunda parte)

Los dos primeros ACTION_TILE que se definen asignan a cada unos de los botones de valores por defecto del letrero un par de acciones, englobadas ellas en sendas subrutinas que luego se definirán. El tercer y último ACTION_TILE asigna al botón Aceptar (recordemos que se le da predeterminadamente accept como key) otra subrutina denominada Chequear. Ésta comprobará la existencia de errores en las entradas realizadas por el usuario en el cuadro y, cuando termine, cederá el control a la siguiente función, al IF. Si errores, que es una variable que definiremos después, tiene algún valor no se realizará nada (sólo se mostrará un mensaje de error que veremos luego en la función Chequear). Si errores es nil, es decir si no hay errores (como veremos), se pasa a la función Aceptar, que terminará el cuadro (como veremos).

NOTA: No sólo podemos asignar acciones a los botones, sino a casi cualquier elemento de un letrero de diálogo. Imaginemos, por ejemplo, la posibilidad de realizar una serie de acciones al activar una casilla :toggle (mostrar otro cuadro, comprobar valores...), aunque no sea muy usual.

A continuación, y tras la definición y asignación de valores y acciones en el cuadro, se activa con START_DIALOG y se descarga de memoria con UNLOAD_DIALOG, pues ya no interesa ocupar memoria con él.

Como ya se dijo, y ahora comprenderemos, con la función NEW_DIALOG se puede indicar una acción por defecto. Esta acción por defecto se aplicará a todos aquellos elementos que no tengan después una acción asignada. Así si deseamos asignar la misma acción a varios elementos de un cuadro, podemos hacerlos en NEW_DIALOG, ahorrándonos espacio en el archivo AutoLISP y su consiguiente memoria en el sistema.

NOTA: Si un elemento tiene asignada una acción con ACTION_TILE, ésta se efectúa ignorando la opción por defecto de NEW_DIALOG. Es posible una tercera manera de asignar una acción a un elemento: el atributo action dentro de un archivo en DCL. También en este caso ACTION_TILE tiene prioridad sobre action. Como norma general usaremos ACTION_TILE para asignar acciones a los diversos tiles de un letrero de diálogo.

La expresión de acción asignada a un elemento puede acceder a una serie de variables que informan sobre el estado del elemento o la manera en que el usuario ha modificado dicho elemento. Estas variables son de sólo lectura y pueden verse en la tabla siguiente:

Variable ---- Significado

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

$key -------- Se ha seleccionado el atributo key del componente. Esta variable se aplica
a todas las acciones.

$value ------ Es el valor actual del componente expresado como cadena. Esta variable se
aplica a todas las acciones. Si el componente es una casilla de edición
:edit_box
se mostrará su valor como cadena; si es una casilla de verificación
:toggle o un botón excluyente :radio_button, se mostrará una cadena "0", para el componente desactivado, o una cadena "1", para el componente activado. Si el componente es un cuadro de lista :list_box o una lista desplegable :popup_list y ningún elemento se encuentra seleccionado, el valor de $value será nil.

$data -------- Son los datos gestionados por la aplicación (si los hay) establecidos justo después de NEW_DIALOG mediante CLIENT_DATA_TILE (se verá). Esta variables se aplica a todas las acciones, pero no tiene sentido amenos que la aplicación ya la haya inicializado llamando aCLIENT_DATA_TILE.

$reason ------ Es el código de razón que indica la acción del usuario que ha provocadola acción. Se emplea con los tiles :edit_box, :list_box, :image_button y :slider. Esta variable indica por qué se ha producido la acción. Su valor se define para cualquier tipo de acción, pero sólo hace falta inspeccionarla cuando dicha acción está asociada a alguno de los componente comentados.

$x ------------- La coordenada X de una selección de :image_button. Es la cadena que contiene la coordenada X del punto designado por el usuario al escoger un componente :image_button. No tiene ningún significado para los demás tiles. La coordenada X forma parte del rango que devuelve DIMX_TILE para el componente, que ya estudiaremos.

$y -------------- Lo mismo que la anterior pero para la coordenada Y. Forma parte del rango de DIMY_TILE.

Por ejemplo, si se quiere detectar cuál es el botón concreto que ha seleccionado un usuario, se asigna la misma expresión (variable) a los botones, incluyendo en ella la variable $key:

(ACTION_TILE "botón1" "(SETQ elem $key)(DONE_DIALOG)")
(ACTION_TILE "botón2" "(SETQ elem $key)(DONE_DIALOG)")

En cuanto el usuario señala un botón, $key devuelve la clave asociada a dicho elemento, que se almacena en la variable elem y se cierra el cuadro. Al salir, examinando la variable elem se puede averiguar qué botón ha sido pulsado.

Ejemplo con $value:

(ACTION_TILE "casilla" "(SETQ val $value)")

En este segundo ejemplo, al introducir el usuario un valor en una casilla de edición cuya clave key es casilla la variable $value devuelve ese valor y la expresión de acción lo almacena en val.

La variable $reason devuelve el código de razón que indica el tipo de acción que el usuario ha realizado sobre el elemento. La mayoría de las veces el valor devuelto es 1, que indica que se ha designado dicho elemento. Pero hay cuatro tipos de elementos que pueden expresar otras acciones del usuario que la simple designación: casillas de edición, listas, imágenes y deslizadores. A continuación se explican de una manera más detallada los códigos de razón que puede devolver $reason (también denominados de retorno de llamada).

· Código 1: El usuario ha designado el elemento, o ha pulsado INTRO si se trataba del elemento por defecto. Se aplica a todos los elementos, pero sólo es necesario examinar este valor para los cuatro tipos enumerados más arriba, puesto que en los demás es el único valor posible.

· Código 2: Se aplica a casillas de edición. Significa que el usuario ha entrado en la casilla, ha realizado modificaciones en el texto contenido, pero ha salido de ella pulsando tabulador o seleccionando otro componente. Conviene comprobar en este caso la validez del valor de la casilla antes de realizar ninguna acción, pues el usuario podría haber dejado incompleta su modificación del texto.

· Código 3: Se aplica a cursores deslizantes. Significa que el usuario ha arrastrado el cursor deslizante, pero no ha realizado una selección final. En este caso conviene mostrar el valor en que ha dejado el usuario el cursor, bien mediante un texto o en la casilla de edición que pueda haber junto al deslizador, pero sin realizar la acción asignada al elemento por si el usuario modifica posteriormente el cursor deslizante.

· Código 4: Se aplica a cuadros de lista y casilla de imagen. En el caso de cuadros de lista significa que el usuario ha realizado una doble pulsación sobre uno de los nombres de la lista. Si el cuadro de lista es el elemento principal de un cuadro, la doble pulsación debe tener asociada la selección del nombre y además el cierre del cuadro. En este caso, la acción asignada debe distinguir el código de razón 1 (una simple pulsación que selecciona el nombre de la lista pero no cierra el cuadro) del código 4 (selección del nombre y cierre). Si el cuadro de lista es un elemento que acompaña a otros en el cuadro, la doble y la simple pulsación se traducen en el mismo efecto de seleccionar un nombre, con lo que la acción asignada no tendría por qué distinguir en principio los dos códigos posibles. En el caso de casilla de imagen, también significa que el usuario ha realizado una doble pulsación sobre ella. La acción asignada puede así distinguir una simple de una doble pulsación y realizar operaciones diferentes si procede.


(GET_TILE clave)

La función GET_TILE extrae el valor actual del elemento del cuadro de diálogo identificado por su key en clave.

Suele ser habitual emplear GET_TILE a la hora de realizar la acción asignada al botón Aceptar. De esta forma extraemos los valores últimos introducimos por el usuario haciéndolos efectivos. También se puede utilizar en la función que controle los errores del cuadro para escribir un mensaje en la línea de errores (key error). Lo veremos enseguida en nuestro primer ejemplo, a continuación de MODE_TILE.

(MODE_TILE clave modo)

MODE_TILE establece un modo para el elemento cuya clave se indique. Los valores de modo se expresan en la siguiente tabla:

Modo -- Descripción

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

  1. Habilita el elemento (lo pone en negro).
  2. Inhabilita el elemento (lo pone en gris).
  3. Ilumina, resalta o hace que parpadee el elemento.
  4. Selecciona el contenido de una casilla de edición :edit_box.
  5. Resalta una casilla de imagen o anula el resaltado.

Esta función podemos utilizarla para controlar el aspecto de determinados elementos con respecto a otros, por ejemplo si al seleccionar una casilla de selección nos interesa que otra determinada se inhabilite, porque son incompatibles. Lo vemos ahora en la siguiente parte de nuestro ejemplo.

Código AutoLISP 1 —VARIABLES.LSP— (última parte)

lisp1-3.zip

Comentarios al código AutoLISP 1 —VARIABLES.LSP— (última parte)

A partir de donde lo habíamos dejado, el siguiente paso consiste en crear las funciones a las que llaman las diferentes acciones de los botones.

Las funciones Defecto1 y Defecto2, correspondientes a la pulsación de uno de los dos botones que rellenan su parte de cuadro con los valores por defecto, contienes funciones SET_TILE que colocan en cada casilla o cuadro de edición un valor que nosotros hemos considerado por defecto para cada variable. Además, contienen una última función SET_TILE que asigna una cadena vacía a la línea de error, identificada por la key error, como sabemos. De esto hablaremos ahora mismo al comentar la función Chequear.

La función Chequear lo primero que hace es iniciar una variable denominada errores como nula, sin valor (nil). Esto se hace por si el cuadro ya había sido utilizado y la variable valiera T (haber cometido un error y salir con Cancelar sin arreglarlo), lo cual sería antiproducente para nuestros objetivos.

A continuación se extrae mediante GET_TILE el valor de cada uno de los elementos del cuadro de diálogo, guardándolos en variables de usuario (previa transformación en valores numéricos enteros o reales, con ATOI o ATOF respectivamente), y se comparan mediante IF con los valores permitidos por AutoCAD para cada variable de sistema. Es decir, si SURFTAB1 es menor de 2, por ejemplo, sabemos que AutoCAD produce un error. Lo mismo con los valores o rangos de las demás variables.

NOTA: Recordar que en el APÉNDICE B de este curso se ofrecen todos los valores posibles a todas las variables de AutoCAD 14. Aún así, si introducimos un valor descabellado a la pregunta de una variable en la línea de comandos, normalmente se nos ofrece un mensaje de error acompañado del rango de valores aceptados.

NOTA: La razón de que en este ejemplo no se controlen los valores altos de variables como SURFTAB1 o SURFTAB2, es porque desde un principio se limitó la entrada en las casillas de edición a un número máximo de 3 caracteres (argumento edit_limit). Por ello no es necesario un control tan exhaustivo. Para que el programa fuera completo, habría que permitir dichos valores y controlar sus entradas, aquí no se hizo porque valores de SURFTAB1 o SURFTAB2 mayores de 999 son realmente exagerados (ambos admiten hasta 32766). Si se quisieran introducir valores más altos habría que hacerlo desde línea de comandos.

Seguimos. Si se introduce un valor no válido en una casilla, se establece errores como T y se imprime un mensaje en la línea de errores. Esto se logra con SET_TILE, asignando a la key error un mensaje entre comillas. A continuación, se establece con MODE_TILE un modo 2 para el elemento que contiene el error, es decir, que se iluminará (generalmente en azul).

Todo esto se realiza al pulsar el botón Aceptar. Al terminar la función de chequeo de errores, el programa devuelve el control a la siguiente instrucción desde donde fue llamada dicha función, al IF del principio. Si errores tiene un valor no ocurre nada (lista vacía), se muestra el error pertinente (ya estaba mostrado) y no se sale del cuadro.

Al corregir el error y volver a pulsar Aceptar se repite todo el proceso. Si no hay ningún error se puede seguir adelante. También por ello al iniciar la rutina de control de errores hay que restablecer errores a nil.

Cuando todo está bien se pasa a la subrutina Aceptar, la cual introduce finalmente los valores válidos en las variables de sistema mediante SETVAR, extrayéndolas de los correspondientes tiles mediante GET_TILE (previa transformación a valores numéricos como anteriormente hemos explicado).

Al final es necesario acabar con DONE_DIALOG. Como sabemos, la key accept es predefinida y lleva una función predeterminada inherente. Al asociar nosotros accept con una rutina Aceptar, lo que hacemos es sobreescribir la rutina por defecto de accept —que lleva ya implícito un DONE_DIALOG—. Es por eso que debemos incluir DONE_DIALOG, porque si no el cuadro no se cerraría. El botón Cancelar cierra el cuadro sin más.

Existen un par de funciones más dentro de este grupo que no hemos explicado por no estar incluidas en el ejemplo, aunque una la hemos mencionado de pasada. Son CLIENT_DATA_TILE y GET_ATTR. La sintaxis de la primera (CLIENT_DATA_TILE) es la siguiente:

(CLIENT_DATA_TILE clave datos_cliente)

Esta función asocia datos procesados mediante una aplicación a un elemento de un letrero de diálogo. El argumento datos, así como el argumento clave, debe ser una cadena de texto. Una acción asignada al elemento puede hacer referencia a estos datos a través de la variables $data.

Una aplicación típica es la asignación de datos en una lista a una casilla desplegable:

(CLIENT_DATA_TILE "mod_sombra" "256_colores 256_col_resaltar_16_col_resaltar
16_col_rellenar")

De esta manera se asignan a la casilla con clave mod_sobra los cuatro elementos especificados lista.

Posteriormente, y mediante ACTION_TILE, es posible referirse a la lista a través de la variable $data, y/o al elemento o elementos seleccionados a través de la variables $value.

(GET_ATTR clave atributo)

Cuando definimos un archivo en DCL utilizamos diversos atributos asignados a los diversos elementos o tiles del letrero de diálogo. Con GET_ATTR podemos capturar los valores de esos atributos (label, value, width, edit_limit, key...) de cada elemento, indicando el valor de su clave o atributo key. Tanto clave como atributo son cadenas.

Por ejemplo, para extraer el valor por defecto con el que fue inicializado el cuadro en determinado componente, podríamos hacer:

(GET_ATTR "casilla" "value")

 

ONCE.16.3. Gestión de componentes de imagen

En esta siguiente sección se van a explicar unas funciones especiales para el control de las imágenes de los letreros DCL. Para ello recurriremos a un segundo ejemplo que viene como el anterior de uno de los ejemplos del MÓDULO DIEZ. En este caso utilizaremos el la creación de una curva helicoidal o hélice 3D mediante un polilínea 3D.

NOTA: El código de este programa (sin letrero de diálogo) se puede examinar en uno de los ejercicios resueltos de este mismo MÓDULO. Aquí, evidentemente, variará un tanto para adaptarlo a la introducción de datos desde el letrero.

Pero antes de comenzar con el ejemplo mostraremos antes el código AutoLISP de la primera parte del programa, el cual se refiere al relleno de casillas y control de valores por defecto. Esta parte todavía no incluye control de imágenes, por lo que dejaremos este tema para después.

Para mayor comodidad, se muestra aquí también tanto el letrero de diálogo en sí como el código DCL que lo define.

Letrero 2

 

Código DCL 2 —HELICE-POL.DCL—

dcl2.zip

Código AutoLISP 2 —HELICE-POL.LSP— (primera parte)

lisp2-1.zip

Comentarios al código AutoLISP 2 —HÉLICE-POL.LSP— (primera parte)

Lo primero que hacemos, como ya hemos de saber, es cargar y mostrar el letrero en pantalla. Seguidamente, y entre NEW_DIALOG y START_DIALOG se introduce toda la batería de funciones AutoLISP para rellenar el cuadro, establecer los valores por defecto y declarar las funciones de acción. Vamos a ir paso por paso.

La manera que se ha utilizado en este programa para rellenar los elementos del cuadro es un tanto diferente a la usada en el ejemplo anterior. Recuérdese que en dicho ejemplo lo que hacíamos era leer el valor de cada variable del sistema y rellenar las casillas. En éste la técnica es diferente, porque no son variables de sistema y tenemos que darle un valor por defecto. Para ello, nos inventamos unas variables (las acabadas en 0) que guardarán los valores por defecto o los últimos introducidos al volver a abrir el cuadro. Esta técnica ya se ha utilizado en otros ejemplos de programas hasta ahora. Se comprueba si la variable existe y, si no se le da un valor por defecto. La próxima vez que se abra el cuadro, la variable ya tendrá un valor (el dado por el usuario la última vez).

Nos inventamos también otras tres variables (op1, op2 y op3) que contendrán los valores por defecto de las dos :radio_row y de la :popup_list.

op1 se refiere a los botones excluyentes de Iguales y Diferentes. Entonces, si op1 no tiene valor (no existe; igual a nil), se le da un valor por defecto de 1. Inmediatamente después se comprueba el valor de op1; si es 1 se activa la casilla de Iguales y se llama a la subrutina Iguales; si no es 1 se activa la casilla Diferentes y se llama a la subrutina Diferentes. Ambas subrutinas se mostrarán más adelante (contienen los MODE_TILE para que se inhabilite o no la casilla del radio final dependiendo si ambos son iguales o diferentes).

op2 se refiere a la lista desplegable Precisión:. Si no tiene un valor se le da por defecto 0. A continuación se asigna dicho valor a la lista desplegable. En las listas desplegables y cajas de lista, el primer valor es identificado como 0, el segundo como 1, el tercero como 2, y así sucesivamente. De esta forma aprovechamos esta nomenclatura para declarar la variable.

Por su lado, op3 funciona de manera igual que op1. Más adelante en el programa incluiremos las funciones necesarias que lean el cuadro a la hora de cerrarlo para actualizar todos estos valores por los indicados por el usuario.

A continuación se asignan las subrutinas de acción a los elementos que las necesitan, es decir, al botón Aceptar y a los elementos :radio_button, que deberán inhabilitar o no determinadas casillas según qué condiciones.

Por último de incluye el START_DIALOG y la llamada a la subrutina que realiza el dibujo final de la hélice. Veremos luego por qué se escribe aquí.

A continuación se explican las funciones para controlar componentes de imagen y se sigue después con el ejemplo.

(START_IMAGE clave)

Esta función inicia la creación de una imagen en un cuadro de imagen. Hay que suministrarle como argumento la clave o atributo key de la casilla de imagen correspondiente en el archivo en DCL.

Las llamadas al resto de funciones que gestionen el componente de imagen se realizarán entre START_IMAGE y END_IMAGE, la cual enseguida veremos.

(SLIDE_IMAGE X Y anchura altura archivo_foto)

SLIDE_IMAGE visualiza una foto de AutoCAD en la casilla de imagen que se ha inicializado con START_IMAGE.

Los argumento X e Y se refieren al vértice superior izquierdo de la imagen de la foto con respecto al origen de la casilla, es decir, especifican un desfase de la posición de la foto en referencia a la casilla que la contiene. Evidentemente, si se indican ambos como 0, el vértice superior izquierdo de la foto coincide con el de la casilla.

Los argumentos anchura y altura especifican ambos tamaños de la imagen de foto. Y por último se escribe el nombre de la foto de AutoCAD y la ruta de acceso si es necesario. Si la foto se encuentra en una biblioteca de fotos o fototeca, hay que indicar el nombre de esta y, después, el nombre de la foto entre paréntesis. Este último argumento irá entre comillas por ser una cadena. La extensión .SLD no es obligatoria, pero conveniente por claridad.

Veamos unos ejemplos:

(SLIDE_IMAGE 0 0 10 10 "planta")
(SLIDE_IMAGE 1 0 12 45 "c:/dcl/fotos/planta.lsd")
(SLIDE_IMAGE 0 0 100 100 "c:\\dcl\\fotos\\fotos1(planta)")

Con respecto a la altura y la anchura de la foto, se puede pensar que puede resultar un poco complicado calcularlas, ya que en DCL se miden las distancias en caracteres y nunca sabremos exactamente cuánto darle a cada valor, porque el resultado final es un tanto arbitrario. Para ahorrarnos dicho cálculo, podemos hacer que AutoLISP calcule por nosotros ambas medidas. Esto se realiza con las dos siguientes funciones que explicamos.

(DIMX_TILE X clave)

y

(DIMY_TILE X clave)

Estas dos funciones de AutoLISP devuelven la anchura o dimensión X (DIMX_TILE) y la altura o dimensión Y (DIMY_TILE) del elemento DCL cuya clave se indica. Podemos utilizarlo con cualquier tile, aunque habitualmente se usan con los que implican imágenes.

El origen de la casilla siempre se considera el vértice superior izquierdo. Los valores devueltos son siempre relativos a ese origen, por eso hay que considerarlos hacia la derecha y hacia abajo. De esta manera podríamos escribir una muestra de imagen con SLIDE_IMAGE así:

(SLIDE_IMAGE 0 0 (DIMX_TILE "casilla") (DIMY_TILE "casilla") "foto1.sld")

De esta forma no habremos de preocuparnos por calcular el ancho y el alto que debe ocupar la foto.

Existe otra forma de utilizar estas dos funciones. Como sabemos también hay un elemento que no es sólo una imagen, sino un botón de imagen. Normalmente esta casilla de imagen se utiliza como un simple botón, es decir, su designación da lugar a una acción. Sin embargo, se pueden definir regiones o zonas de la casilla, de manera que la acción que haya que efectuar sea diferente según en qué zona señala el usuario. El retorno de llamada de una casilla de imagen, es la posición X e Y del punto en que ha señalado el usuario. Esta posición se puede obtener de las variables $x y $y ya vistas. Examinando las dimensiones de la casilla, se averigua en qué zona se ha señalado. Este mecanismo se utiliza por ejemplo en el cuadro de DDVPOINT para seleccionar los dos ángulos del punto de vista.

Por ejemplo, se dispone de una casilla de imagen cuya clave es ventanas y se desea considerar cuatro zonas diferenciadas, todas del mismo tamaño:

(ACTION_TILE "ventanas" "(sel_ventana $x $y)")
...
(DEFUN sel_ventana (x y)
--(SETQ mitadx (/ (DIMX_TILE "ventanas") 2) mitady (/ (DIMY_TILE "ventanas") 2))
--(COND
----(AND (< x mitadx)(> y mitady)) (SETQ acción "II"))
----(AND (< x mitadx)(< y mitady)) (SETQ acción "SI"))
----(AND (> x mitadx)(> y mitady)) (SETQ acción "ID"))
----(AND (> x mitadx)(< y mitady)) (SETQ acción "SD"))
--)
)


La acción asignada a la casilla
ventanas es la función sel_ventana que tiene dos variables dependientes x e y. Al señalar en la casilla, las variables $x y $y devuelven las coordenadas del punto de señalamiento, siempre referidas al origen en el vértice superior izquierdo de la casilla. La función sel_ventana se ejecuta con esos dos valores como variables dependientes o asociadas. Calcula en primer lugar la mitad de tamaño en X y en Y de la casilla. A continuación examina los valores de las variables x e y que son las devueltos por $x y $y. En función de que las coordenadas del punto señalado sean mayores o menores que las de la mitad de la casilla, tanto en X como en Y, se averigua en qué cuadrante ha señalado el usuario. La variable acción almacenará el resultado como una cadena de texto con las iniciales combinadas de inferior, superior, izquierda y derecha.

(FILL_IMAGE X Y anchura altura color)

Esta función rellena con un color plano uniforme la casilla inicializada con START_IMAGE. Hemos de indicar también un origen en X y en Y y una altura y anchura (normalmente con las dos funciones vistas anteriormente).

El argumento color especifica el color de AutoCAD (0 a 255) con el que se realizará el relleno. Además es posible indicar un número de color lógico según se indica en la siguiente tabla:

Color lógico ------- Significado

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

-2 ----------------- Color de fondo actual de la pantalla gráfica de AutoCAD.

-15 ---------------- Color de fondo del letrero de diálogo actual.

-16 ---------------- Color de primer plano (del texto) del letrero de diálogo actual.

-18 ---------------- Color de líneas del letrero de diálogo actual.

Así podremos, por ejemplo, hacer que desaparezca una casilla de imagen rellenándola con el color de fondo del letrero, o eliminar una foto representada para representar otra (sino se superpondrían).

(END_IMAGE)

Simplemente finaliza la gestión de un cuadro de imagen.

Por lo tanto podríamos resumir el proceso principal de gestión de una imagen así, por ejemplo:

(START_IMAGE "claveimg")
(SLIDE_IMAGE 0 0 (DIMX_TILE "claveimg") (DIMY_TILE "claveimg") "foto")
...
(END_IMAGE)

Código AutoLISP 2 —HELICE-POL.LSP— (segunda parte)

lisp2-2.zip

Comentarios al código AutoLISP 2 —HÉLICE-POL.LSP— (segunda parte)

Tras lo ya comentado, aquí definimos las dos primeras funciones internas de acción. En cada una de ellas se inicializa la casilla de imagen definida en el archivo DCL. A continuación se rellena de negro (color con el que se definió). Esto se hace porque, al cambiar entre radios iguales y diferentes queremos que la foto varíe, presentándose así una hélice recta o una hélice cónica según el caso. Por eso debemos hacer un relleno de negro, para que al cambiar de foto no se superponga a la que anteriormente había.

Después se muestra la imagen correspondiente —una u otra— y se finaliza con END_IMAGE. Por último, se utiliza MODE_TILE para activar o desactivar la casilla del radio final según convenga.

NOTA: Apréciese la utilización de DIMX_TILE y DIMY_TILE.

NOTA: Un truco para sacar las fotos en AutoCAD, las cuales luego rellenarán casillas de imágenes en cuadros de diálogo, es minimizar la sesión y ajustar la ventana del programa lo más posible a una equivalencia al cuadro que contendrá la imagen (a escala mayor). Si no hacemos esto, la foto se sacará en un formato que nada tiene que ver con el de la casilla en cuestión y, probablemente, se verá pequeña o descentrada.

Código AutoLISP 2 —HELICE-POL.LSP— (tercera parte)

lisp2-3.zip 

Comentarios al código AutoLISP 2 —HÉLICE-POL.LSP— (tercera parte)

Una vez establecidas las acciones para el cuadro de imagen, se definen las restantes, es decir la del paso y la de la altura. En este caso, únicamente se habilitan o inhabilitan las casillas correspondientes según el caso.

Después se define la función que controla los errores introducidos en el cuadro de diálogo al pulsar el botón Aceptar. Esto se hace de manera análoga al primer ejemplo explicado.

Por último, se define la función de aceptación. Lo que hace ésta es, primero asignar a las variables correspondientes los valores capturados de las casillas del paso y de la altura. Segundo, realiza lo mismo con las variables op1, op2 y op3. Tercero, extrae el valor de op2 (el de la precisión) y, según dicho valor, asigna una precisión u otra a la variable pv que se utilizará después en el dibujado de la hélice. Al final, se acaba con DONE_DIALOG y se asignan los valores pertinentes de las variables que se utilizan para guardar los valores por defecto a las variables que se usarán en la rutina de dibujo.

NOTA: Nótese que si los valores de la lista desplegable no hubieran sido cadenas con texto (8 ptos., 16 ptos., etc.), sino cadenas con un valor simple (8, 16...), podríamos haber capturado directamente el valor actual designado con la variable $value de ACTION_TILE y asignárselo como tal (pasándolo a valor numérico) a la variable pv.

Como ya hemos comentado, mientras un cuadro de diálogo esté activo no se pueden realizar operaciones de dibujo en el área gráfica. Cuando se ejecuta un programa AutoLISP como el que estamos viendo, tras leerse el principio, se queda "esperando" en el START_DIALOG hasta que se produzca un DONE_DIALOG y un final de letrero, realizando las llamadas a las subrutinas necesarias en cada momento. Sin embargo, hasta que el cuadro no esté cerrado del todo no se puede realizar ningún proceso más. Esto es, cuando se produce el DONE_DIALOG, el control se devuelve a la siguiente instrucción de START_DIALOG y es entonces cuando el cuadro estará perfecta y completamente cerrado.

Si hubiéramos puesto la llamada a la subrutina de dibujo (Dibujar_Hélice) después del DONE_DIALOG (en la rutina Aceptar), el cuadro no habría estado cerrado por completo, por lo que no se dibujaría la hélice y se produciría un mensaje de error. Al colocar susodicha llamada inmediatamente después de START_DIALOG, se produce el DONE_DIALOG, se devuelve el control a START_DIALOG y, ahora, el cuadro ya está cerrado, pudiéndose realizar la llamada y el consiguiente proceso de dibujado de la hélice.

La razón para la inclusión de la comparación con el IF es que, si sale con el código 1 de DONE_DIALOG es que viene el control de la rutina de aceptación, por lo que proseguirá el programa; si sale con un código distinto (0 en este caso) es que se ha pulsado Cancelar, por lo que no se proseguirá el programa.

Código AutoLISP 2 —HELICE-POL.LSP— (última parte)

lisp2-4.zip

Comentarios al código AutoLISP 2 —HÉLICE-POL.LSP— (última parte)

Por último, se define la rutina de dibujo, la de control de errores en tiempo de corrida y la que define el nuevo comando HÉLICE de AutoCAD 14.

Existe una función más de gestión de imágenes de cuadros de diálogo que no hemos visto por no estar incluida en el ejemplo. Veámosla ahora:

(VECTOR_IMAGE X1 Y1 X2 Y2 color)

La función AutoLISP VECTOR_IMAGE dibuja un vector en la casilla de imagen cuyo proceso se haya iniciado mediante START_IMAGE.

Para el dibujo de dicho vector se indican unas coordenadas X e Y de origen (argumentos X1 e Y1), unas coordenadas X e Y de destino (argumentos X2 e Y2) y un color (argumento color). Las coordenadas siempre referidas al vértice superior izquierdo de la casilla de imagen; el color puede ser cualquiera de los de AutoCAD o cualquiera de los colores lógicos expuestos en la tabla de la función FILL_IMAGE.

Esta función se puede utilizar para representar dibujos sencillos en las casillas o para dividirlas en cuadrantes, por ejemplo.

 

ONCE.16.4. Gestión de casillas de lista y listas desplegables

Al igual que lo visto hasta ahora, existen también tres funciones específicas para el manejo de casillas o cajas de listas y de listas desplegables. En este tipo de elementos del letrero, el programa de control AutoLISP debe tener acceso por un lado a la lista completa asignada al elemento y, por otro lado debe disponer de un retorno de llamada que especifique el elemento o elementos de la lista designados por el usuario.

La diferencia entre ambos elementos es que en las casillas con listados es posible permitir varias designaciones al tiempo, mientras que en las listas desplegables sólo es posible una.

Las funciones en concreto las veremos a enseguida y, para ello, vamos a utilizar un pequeño ejemplo de prueba cuyo código DCL se muestra a continuación del cuadro en sí.

Letrero 3

 

Código DCL 3 —PRUEBA.DCL—

dcl3.zip

Antes de ver el ejemplo en AutoLISP vamos a explicar estas tres funciones de control de cuadros de lista y listas desplegables.

(START_LIST clave [operación [índice]])

Esta función START_LIST inicia el proceso de control de una lista de casilla o desplegable. Ha de encontrarse situada entre NEW_DIALOG y START_DIALOG.

El argumento clave suministra la clave o atributo key del elemento en cuestión. Por su lado, operación es un número entero que puede tener uno de los valores siguientes:

Operación --- Significado

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

1 Cambiar contenido seleccionado de la lista.

2 Añadir nueva entrada a la lista.

  1. Suprimir lista actual y crear una nuevo (es el valor por defecto).

Estos valores de operación controlan la manera en que sucesivas funciones ADD_LIST (que ahora veremos) van a modificar la lista. El argumento índice sólo tiene efecto si se ha indicado un código 1 para operación. En este caso, índice especifica el número de orden (comenzando desde 0 como sabemos) del elemento de la lista que será cambiado en la posterior utilización de ADD_LIST. Veamos un ejemplo:

(START_LIST "listaobjetos" 1 4)
--(ADD_LIST "Objeto1")
(END_LIST)

Este ejemplo cambia el elemento quinto de la casilla por uno nuevo denominado Objeto1.

Otro ejemplo:

(SETQ ListaObjs ’("Objeto1" "Objeto2" "Objeto3"))
(START_LIST "listaobjetos" 2)
(MAPCAR ’ADD_LIST ListaObjs)

Este ejemplo añade varios elementos al final de la lista ya existente.

Último ejemplo:

(SETQ ListaObjs ’("Objeto1" "Objeto2" "Objeto3"))
(START_LIST "listaobjetos")
(MAPCAR ’ADD_LIST ListaObjs)

Este ejemplo reemplaza todos los elementos de la lista existente por los de la lista proporcionada. Se podría haber indicado el índice 3.

NOTA: No es posible eliminar o insertar en medio un elemento nuevo en la lista. Para hacerlo habría que reconstruir la lista desde el primer elemento.

(ADD_LIST cadena)

Esta función realiza una u otra función según el código de operación explicado en START_LIST. Sólo se puede incluir una cadena por cada ADD_LIST. Para añadir más de un elemento a una lista, por ejemplo, habría que hacer sucesivas llamadas a ADD_LIST.

 

 

(END_LIST)

Finaliza el proceso de control de caja de lista o lista desplegable iniciado por START_LIST. Siempre irá la última tras ésta y ADD_LIST.

Por lo tanto, la manera genérica de utilizar estas tres funciones es:

(START_LIST "lista")
--(ADD_LIST "cadena")
(END_LIST)

Veamos ahora pues el código AutoLISP de nuestro ejemplo:

Código AutoLISP 3 —PRUEBA.LSP— (primera parte)

lisp3-1.zip

Comentarios al código AutoLISP 3 —PRUEBA.LSP— (primera parte)

En esta primera del código en AutoLISP todavía no se utilizan las funciones de cajas de listas y listas desplegables, sino que se preparan dos lista para luego añadir a las predefinidas en el archivo .DCL.

Se le pide al usuario el número de términos que va a añadir a la caja de lista y, posteriormente, el número de términos que va a añadir a la lista desplegable. Para cada término se va solicitando un valor con el que se irá formando cada lista. Si es el primer valor se forma una lista con él, en los sucesivos se van añadiendo términos a la primera lista.

NOTA: La función APPEND aún no la hemos estudiado, pero se puede deducir fácilmente se funcionamiento.

Código AutoLISP 3 —PRUEBA.LSP— (última parte)

lisp3-2.zip

Comentarios al código AutoLISP 3 —PRUEBA.LSP— (última parte)

A continuación de lo anterior, se inicializa el cuadro y los distintos elementos también. Además se declaran los ACTION_TILE necesarios para el funcionamiento de los elementos con acción asociada. Estos elementos son el botón Aceptar, el cuál inicializará de nuevo lo elementos con su valores originales y cerrará el cuadro; la caja de lista, en la que al seleccionar un elemento se escribirá su número de orden en la casilla de edición inferior; y la lista desplegable, que realiza lo mismo que la caja de lista en la casilla inferior a ella. Estas acciones las podemos ver definidas en las subrutinas correspondientes; véase el funcionamiento y utilización de la variable $value.

La manera de añadir los elementos nuevos en la lista es la explicada en al teoría. Únicamente explicar que se utiliza la función NTH que va cogiendo cada elemento de la lista por su número de orden (empezando por el cero). Esta función se explicará en breve.

Por último, se define el nuevo comando de AutoCAD Prueba.

 

14ª fase intermedia de ejercicios

· Desarróllese un programa AutoLISP para controlar y hacer funcionar cada uno de los cuadros de diálogo de los ejercicios propuestos del MÓDULO DIEZ.