Profiling code.

I’ve been wondering lately, when it comes to finding nodes in a scene, nodes which may or may no exist, which will be faster?

using a Try, Except?
or using maya’s built in objExists command?

My theory was that the Try, Except would be faster as objExists would have to loop over all nodes in the scene. At least as far as I assume.
So i put it to the test.

The first thing I neede ws a profiler. A little googling and I turned up Pyhtons Timeit module.

This can be imported using

This will print the result of running the specified function one milling times. Its is run this many times to ensure consistency in the results.
That can be reduced by adding the number flag, to specify how many times the code is run, so:

This will run the code ten thousand times. Its quicker and consistant enough for my requirements.

Getting into the problem at hand, I setup two functions, one as a Try, Except and another as objExists.
I ran each one in an empty scene and each one in a scene which included a complex character rig.
The code and results are below:

The results

The Try, Except took:
0.398722180715 in an empty scene and
0.376243066404 in a complex rig scene

where as the objExists took
0.0698589508479 in an empty scene and
0.0415636909748 in a complex rig scene

astonishing, and, contrary to my expectations, the Try, Except took nearly ten fold longer than the objExists!
From this I learned: Using specific commands looks to be faster than using Try, Except! I’ll have to test more commands and find out :)
If you’d like to try this code yourself, you can see the result for each funstion by changing this line:

To this:

Cheers!

Removing unknown nodes from your scene

I’ve recently found myself working in files with which
a co-worker has used a plugin which I don’t have.
Said plugin has created nodes which my version of Maya
does not recognize, so on load I get the classic error raised :

errors

Through dealing with this I’ve developed a solution:
Find and delete said nodes!….. Brutal.

Now we can find these nodes using

But if we try to delete them we get an error “#Error: Node is locked and cannot be deleted.”

so we need to unlock them with:

then we can delete them with:

No bringing it all together in one script:

And there you have it! No longer shall you be plagued by errors on boot up :)

Its been a while..

I’ve been knuckled down with working full time! But its time to get back onto this blogging business.
Starting with revisiting an old tool feels appropriate!
Having written a tool for upsaving your scene some years ago
I’ve since learned a lot about string formatting and array navigation in Python.
The tool is simple, it finds out where your current scene is located and its name,
then looks for a number at the end of the name, adds 1 to it and saves the file, with the new name in
the same directory.

Set project button!

Nice little tool which looks for you ‘scenes’ folder and sets the project to that location:

Updated save tool!

I’ve updated the savetool to keep a master version of the file! I’m now refefing to it as an Up Save tool.

Breaking Skinclusters?

Skin Clusters break sometimes. Or you just want to copy skinning from one character to another.

Usually when I have a skin cluster playing up I rebind a duplicate of the mesh to the joints and copy the skin weights from the original mesh.
To do this:
1. Duplicate mesh
2. bind duplicated mesh to the same joints as the original
3. copy skin weights over from old mesh with Skin > Edit Smooth Skin > Copy Skin Weights

Gives you a fresh skin cluster but with the skinning you’d setup already.