Титульная страница
ISO 9000 ISO 14000
GMP Consulting
 
Mastering 3D Studio MAX R3

Previous Table of Contents Next


Querybox

Sometimes we might need a more complex alert box. We also have a way to ask the user which direction to follow, using a Yes or No alert box. This is a querybox.

Continuing to use the previous example, we can ask the user whether he wants us to assign a standard material to the object, if the object has no material. Let’s do it, as in Figure 15.10.


FIGURE 15.10  A sample querybox

Substitute the line we edited previously with the following ones:

query = false
if obj.material == undefined then
(
query = querybox “Assign a default Standard Material to the object?” \
 title:“Object has no material assigned”
if query == true then obj.material = standardmaterial()
)
else query = true
if query == true then

We created a variable called query. If the object has no material, we ask the user if he wants us to assign a default material to it. If the user chooses Yes, the variable value will be true. Then, we’ll assign the material and the script will process the rest.

If the user chooses No, the variable value will be false, and the script will not proceed. In case the object already has a material assigned, the script will skip the querybox and will assign true to the variable, so it can proceed.

This version of the script is saved as utility_bump3.ms on the CD.

Yesnocancelbox

A yesnocancelbox is the same as the querybox, but also has a cancel button. Instead of returning true or false, it’ll return #yes, #no, or #cancel.

Building Rollouts

Rollouts are used when we have too much information and we want to organize it better. A good example is SuperSpray; its parameters are organized through rollouts, grouping like items together and rolling them up to save space.

A rollout is self-contained. All actions related to all UI items must be performed for each rollout, but there are ways to access other rollouts’ UI items values also. For instance, suppose you have the following rollouts:

rollout r1 “Rollout 1”
(
button b1 “First Button”
)
rollout r2 “Rollout 2”
(
button b2 “Second Button”
)

You could not use on b1 pressed do while in the second rollout (r2), because this button only exists in the first rollout (r1). On the other hand, you can enable or disable it using r1.b1.enabled = false ; by adding the rollout name before the UI item, you can access and change its properties.

Adding and Removing Rollouts

Every utility has a rollout automatically, but we can add as many more rollouts as needed to each utility. The rollouts we add work exactly the same as the utility’s main rollout, but more rollouts only appear when explicitly added to a utility or a floater. To add or remove rollouts we can use ADDROLLOUT and REMOVEROLLOUT. The following script is an example of adding and removing rollouts; its output is shown in Figure 15.11.


FIGURE 15.11  Multiple rollouts

rollout first “First Rollout”
 (
 label f “This is the First Rollout”
 )
rollout second “Second Rollout”
 (
 label s “This is the Second Rollout”
 )
utility main “Main Utility”
(
radiobuttons menus labels:#(“First”,”Second”)
on main open do addrollout first
on main close do
 (
 removerollout first
 removerollout second
 )
on menus changed state do
 (
 case state of
 (
 1: (
 removerollout second
 addrollout first
 )
 2: (
 removerollout first
 addrollout second rolledup:true
 )
 )
 )
)

In the second rollout, we added the rolledup option. It’ll define whether the rollout starts out opened or not.

Notice we also used two more events: on main open and on main close. They’re events to be executed when the utility is opened and closed. You can use them with utilities and rollouts.

Floater

Instead of using rollouts in utilities, we can use them in floaters. Floaters are dialog boxes with several rollouts; they look like areas from the Command Panel but “float” separately in the MAX window. An example of a floater is the Batch Renderer.

We can create a floater using the NEWROLLOUTFLOATER command and close any floater using CLOSEROLLOUTFLOATER. NEWROLLOUTFLOATER requires a caption string and the floater width and height (see Listing 15.4 for an example of this command). Let’s adjust the script we created to Divide Splines in Chapter 14 and make it a rollout floater script. We’ll need two UI items: a pickbutton to select the object and a spinner to specify the number of segments (the final result is shown in Figure 15.12).


FIGURE 15.12  A sample floater

Open a new script and type all the commands shown in Listing 15.4, or access this code on the CD that accompanies this book, in the file named floater_ divideshape.ms.


LISTING 15.4: The Floater script (floater_divideshape.ms)

rollout divide_params “Parameters”
(
pickbutton pick_shape “Select Shape Object” width:160
spinner steps “Steps: “ range:[3,1000,10] type:#integer enabled:false
fn convert_it shp =
 (
 x = shp
 tmp = copy x
 pick_shape.text = shp.name
 obj = converttosplineshape tmp
 ns = numsplines obj
 nv = numknots obj
 size = steps.value
 ratio = 1.0/size
 if ss != undefined then delete ss
 ss = splineshape()
 ss.name = x.name + “_Divided”
 ss.wirecolor = x.wirecolor
 ss.pivot = x.pivot
 for i in 1 to ns do
 (
 addnewspline ss
 for j in 1 to size do
 (
 pt = lengthinterp obj i (ratio*(j-1))
 addknot ss i #smooth #curve pt
 )
 if (isclosed obj i) then close ss i else
 (
 pt = lengthinterp obj i 1.0
 addknot ss i #smooth #curve pt
 )
 updateshape ss
 )
delete tmp
)
on pick_shape picked shp do
 (
 ss = undefined
 x = shp
 convert_it x
 steps.enabled = true
 )
on steps changed val do
 (
 convert_it x
 )
)
try (closerolloutfloater divide) catch()
divide = newrolloutfloater “Divide Splines” 200 116
addrollout divide_params divide

Basically, the spline creation is defined as a function that will be called from either the pickbutton or the spinner. When we pick a new shape, we define ss = undefined, resetting the function and creating a new spline. In addition, when selecting an object, we enable the spinner so the number of segments can be adjusted.

As always, some new concepts were introduced here. We used TRY and CATCH to make sure the floater was closed before opening a new one. TRY tests the function and CATCH will execute another function if the one that was tried didn’t work. In our situation, we’ll not have any function inside CATCH. If we did not use this, executing the script would create many floaters, one on top of the other.


Previous Table of Contents Next

© 2000, Frol (selection, edition, publication)

 
Rambler's Top100