Maxscript, speed up your workflow

Every day I get asked if a can whip up a script for this or a script that etc. More often than not I just walk over to the artist machine and do a very simple type in, maybe a few lines at most and that will solve their problem. Now not that I mind walking to someones desk to help them I thought I might take a second to discuss some ideas about manipulating large numbers of objects quickly, effectively and working on specific object types.  I really believe that scripting can empower artists, many artists shy away from scripting especially when there sitting next to a TD but a simple understanding of some simple scripting ideas can speed up an artists ability to work.

I do not intend this to be a introduction to scripting. I just want to show you how you can manipulate objects quickly using simple loops, basic conditional statements and the max script listener.

For Loops

Loops are how we iterate over objects, numbers, arrays etc. I found the best explanation of it in the Maxscript help file, “The for loop iterates through a range of numbers, time values, or a sequenced collection of values, such as an array or object set.”

In this example we will be iterating over materials, a specific type of material. There are a number of way one can accomplish this you could simple iterate through sceneMaterials and check to see if each material is the correct class that you want, this however would be slow and unnecessary. Instead we are going to use the getClassInstances function that will return an array of objects of a given type. For exmaple:

getClassInstances Sphere -- This would return an array of every instance of a sphere in the scene.
getClassInstances VrayMtl -- This will return an array of every Vray Material in the scene.

It is very simple to use the array returned by getClassInstances() in a loop.
for i in (getClassInstances VrayMtl) do(print i) --This will print every Vray Material in the scene

So now that we can iterate a given type of object or “class” we really want to be able to do something with them. An important concept to understand is that when we loop through the returned array each item in the array as we move through it is stored in the variable “i”. Consider the following code:

for i in (getClassInstances Sphere) do(i.radius = 100)

That statement will set the radius of every sphere to equal 100. It does this by first collecting them using the getClassInstances() function and “moving” the variable “i” through the array where “i” is used to access the  radius property and set to 100. We could also do something a bit more interesting like set the radius of every sphere to be random. We will use the random function in this example to give us a random integer.
for i in (getClassInstances Sphere) do(i.radius = (random 25 100))
Now each sphere will have a random radius between the 25 and 100.

Unless you really wanted to create Spheres with a random radius lets move on and learn how to do something useful.

The Maxscript Listener

Using the listener you are able to record your “actions” so to speak. This is a very easy way to query a property that you may wish to manipulate in a script. For example you might want to turn off trace reflections on all V-Ray Materials. To do this open the max script listener (Maxscript -> Maxscript Listener or hit F11). Once the listener is open go to the Macro Reorder menu and enable the macro recorder.

Open Maxscript Listener Screen Capture

Select the Maxscript listener from the menu or hit "F11"

Maxscript Listener Enabled Screen Shot

Enable the macro recorder from the MacroRecorder menu in the Listener

If you now go and open the Material editor select a V-Ray Material and Turn off Trace reflections. Imediately you should notice that Listener updating, in this example it should read something like:

meditMaterials[1].option_traceReflection = off

In the above piece of code where are interested in everything after the “.”, meditMaterials provides access to the materials in the editor (another article for that).

Now using what we learnt in the section covering loops we can now go ahead an change every V-Ray material in the scene:for i in (getClassInstances VrayMtl) do(i.option_traceReflection = false)

How easy was that? As you can see simple type in expressions or loops can save you a great deal of time. Just to recap we very quickly went over using loops with the getClassInstances() function and using the listener to ascertain what property’s we need to change. If you have any question then please just post in the comments I will do my get back to ASAP. Also remember the maxscript help file is your friend it is a fantastic help, if you are having trouble of some of the more basic concepts I suggest you start there.

I hope that shed some light on some very simple scripts that you might be able to use. If you have an idea for a tutorial use this form, I am more than happy to tackle any challenges you have in 3d or 2d.

Cheers,

Dave

Comments
7 Responses to “Maxscript, speed up your workflow”
  1. Chris says:

    Hi.

    thanks for such a great website, like it alot.

    May I ask a cheeky question, do you know how or where I can find a script that allows you to select objects in your scene,
    and it copys the name of your object and pastes it onto your Material name.
    So its an automatic material namer.

    I have tried several times, but always fail, I am not a scripter and are obviously making simple scripting mistakes.

    thanks for any help you can give

  2. Dave says:

    This would not be hard to script. I will whip something up and post it.

    Cheers,
    Dave

  3. AHosking says:

    Simple!
    for i in geometry do(i.material.name = i.name)

  4. Dina says:

    Hi to all, how is the whole thing, I think every one is getting more from
    this web page, and your views are nice in support of new users.

  5. This post will help the internet viewers for setting up new blog or
    even a weblog from start to end.

Trackbacks
Check out what others are saying...
  1. […] the rest here: Maxscript, speed up your workflow : Dave and Goliath – Sydney … Kategorien3D Animation Tags: 3D Animation, animation, goliath, leave, projects, sydney, […]

  2. pligg.com says:

    Maxscript, speed up your workflow : Dave and Goliath – Sydney based 3d Animation, Visual Effects and Visualization…

    Maxscript, speed up your workflow : Dave and Goliath…



Leave A Comment