En el número anterior dijimos que los elementos de interfaz de usuario a los que abreviadamente se denominan elementos IU son los componentes básicos que pueden verse en los paneles de control: los botones, los recuadros de entrada de datos, las cajas de listas, etc. Como ya explicamos entonces, el desarrollador de plug-ins tendrá que definir a los elementos IU dentro de sentencias utility o rollout y atar a cada uno un controlador de eventos. Así, cuando el usuario realiza una acción determinada y prevista por el controlador, se activa la ejecución del código que el programador haya incluido dentro del bloque de sentencias de dicho controlador. En el artículo anterior explicamos brevemente cómo podemos emplear los elementos Label y Button, pero hay muchos más...
Checkbox: este elemento IU consiste en la típica caja de chequeo, es decir, en un recuadro que el usuario puede marcar o no. La caja puede, pues, tener dos estados: marcada (true) o no marcada (false). Y en cuanto al formato, tenemos...
Checkbox variable_de_acceso "string" (checked:estado)
Variable_de_acceso es, como su nombre indica, el nombre de la variable de acceso que emplearemos para acceder a las "propiedades" del elemento IU. Y string es el texto que aparecerá al lado del recuadro del elemento. En la Figura 1 tenemos un ejemplo sencillo de uso de checkbox.
figura1: "Prueba de uso de checkbox"
utility nada1 "probando checkbox"
(
label help1 "probando el uso de checkbox"
checkbox chequeo1 "checkbox a probar" checked:false align:#center
on chequeo1 changed true do
(
max quick render
)
)
En este sencillo ejemplo se ordena un render rápido en cuanto el usuario marca el recuadro del checkbox, pero esto no es muy corriente. Lo normal es que el estado de un elemento checkbox se emplee para afectar al comportamiento de un proceso después de que, por ejemplo, se haya apretado un botón, tal y como sucede en el caso de la Figura 2.
figura2: "Otra prueba de uso de checkbox"
utility nada1 "boton y checkbox"
(
label help1 "probando el uso de checkbox"
checkbox chequeo1 "checkbox a probar" checked:false align:#right
button miboton "boton magico"
on miboton pressed do
(
if chequeo1.checked==true then (max quick render) else (render camera:$camera01)
)
)
En este ejemplo se emplea un controlador de eventos para el botón, pero no para el elemento checkbox. Sin embargo, es el estado de este elemento el que determina la acción a realizar cuando el usuario pulsa el botón. Para preguntar por una propiedad de un elemento se emplea la variable de acceso de dicho elemento seguida del operador punto y el nombre de la propiedad que nos interesa. Así pues, en la sentencia "if" del ejemplo 2 se está preguntando si el estado de la propiedad "checked" del elemento es igual (==) al valor true (marcado). Si este es el caso se ejecuta un render rápido de la ventana activa y si no lo es se efectúa un render de la camara01.
Otra cosa, el estado de la propiedad checked de un elemento Checkbox es false por defecto a menos que indiquemos lo contrario en la declaración de dicho elemento. Al crear este elemento es opcional declarar el estado de esta propiedad (por eso la hemos metido entre paréntesis al describir el formato).
Checkbutton: este elemento IU funciona exactamente como Checkbox, aunque en este caso se trata de un botón que puede estar pulsado (true) o no pulsado (false). Su formato es este:
Checkbutton Variable_de_acceso "string" (highlightcolor:color tooltip:string checked:valor_booleano images:datos_imagen)
Ya conocemos el propósito de los dos primeros parámetros. En cuanto a los restantes son opcionales y el programador puede optar por escribirlos o no. El primero, highlight, sirve para indicar el color de fondo del botón cuando éste se haya pulsado, desconocemos el propósito de tooltip, e images funciona exactamente igual que la propiedad del mismo nombre en los elementos button. En la Figura 3 tenemos un ejemplo de uso de dos botones checkbutton.
figura3: "Una prueba de uso de checkbutton"
utility nada1 "boton y checkbutton"
(
label help1 "probando el uso de checkbox"
checkbutton chequeo1 "checkbutton a probar" highlightcolor:([250,250,0] as color) checked:true
checkbutton chequeo2 "otro checkbutton" images:#("boton1.bmp", undefined,1,1,1,1,1)
button miboton "boton magico"
on miboton pressed do
(
if chequeo1.checked==true then (max quick render) else (render camera:$camera01)
if chequeo2.checked==true then render camera:$camera01 outputwidth:160 outputheight:100
)
)
El primero de los botones aparece pulsado por defecto porque su propiedad checked está inicializada como true. Además, este botón adquiere un fondo de color amarillo al estar marcado. Eso se debe a que ese es el color que se ha especificado para la propiedad highlightcolor. Y por otro lado, en cuanto a los paréntesis que engloban el valor rgb del color, los hemos puesto porque hay que indicar que el vector es un color. Esto se consigue con las palabras "as" y "color" pero, al colocarlas, MAXScript entenderá que estamos intentado definir propiedades (as y color) que no existen, razón por la que aislamos el valor de color con los paréntesis. Y en cuanto al segundo botón, os remitimos a la explicación que ya dimos para el parámetro images del elemento button. (En cualquier caso, para que funcione hay que tener una imagen llamada boton1.bmp en el subdirectorio images o en el de scripts).
Por último, hay que señalar que la ejecución del ejemplo 3 hará que se efectúen dos renders (uno por cada if).
Colorpicker: se emplea a los elementos de este tipo para crear "cajas de selección de color" utilizables por el usuario. El formato de colorpicker es...
Colorpicker Variable_de_acceso ("string" color:color fieldwidth:ancho_caja height:altura_caja)
El valor que pongamos en la propiedad color será el color que aparecerá inicialmente en la caja de muestra de color, en fieldwidth pondremos el ancho que deseamos para la caja y en height su altura. Para comprender mejor esto hay que comprobar el funcionamiento del ejemplo práctico de la Figura 4. Cread un par de objetos, dejad a ambos como seleccionados, y luego ejecutad el script y cargadlo. Al ejecutarlo aparecerá un pequeño panel con el elemento colorpicker. Este será una caja de color que, al pinchar sobre ella, os llevará a una ventana llamada "Color Selector" donde elegiréis un color empleando las herramientas de dicha ventana. Este nuevo color se guardará en la variable que hemos de escribir después de "changed". En el ejemplo, el nuevo color se aplicará a la selección de objetos. Además, al salir de la ventana, el nuevo color sustituirá al anterior en el recuadro colorpicker.
figura4: "Una prueba de uso de colorpicker"
utility nada1 "usa colorpicker con una selec..."
(
label help1 "probando el uso de colorpicker"
colorpicker yuyu "color de selección:" color:([40,180,25] as color) fieldwidth:80 height:40
on yuyu changed nuevo_color do $.wirecolor=nuevo_color
)
Dropdownlist: los elementos IU de este tipo se utilizan para crear recuadros de selección desplegables. El formato de la sentencia es:
Dropdownlist Variable_de_acceso ("string" items:#(lista_de_strings) selection:número height:altura_caja)
El campo items se utiliza para guardar una lista de strings de texto, siendo los elementos de esta lista los que aparecerán en un recuadro desplegable cuando el usuario pinche sobre el recuadro inicial de selección (que sólo tiene una línea de texto de altura). Para especificar la altura en líneas de texto del recuadro desplegable hay que emplear el campo height cuyo valor por defecto es de 10. Si no cambiamos este valor y si nuestro número de elementos es menor, entonces MAXScript ajustará la altura del cuadro a este número. Por otro lado, si el número de elementos es mayor que el número de líneas máximo del recuadro, entonces MAXScript incluirá de manera automática un par de flechas "de navegación". Si queremos ajustar el número de líneas del recuadro al número de elementos de la lista de strings, habremos de poner el valor de height al número de elementos del campo items más dos. Finalmente, el campo Selection se emplea para indicar el número que corresponde al primer elemento de la lista (por defecto es 1)