This is a very WIP "tool set" that I use daily in production when working on facial blendshapes, or organic modelling in general. It's simply a set of individual tools and scripts that are useful in speeding up day to day tasks.

I wanted to avoid having a jumble of odd scripts cluttering up my maya self or script editor, so I aimed to build a base for everything in one "tool". The idea behind this is that it is a very crude plugin system, where I can quickly and easily add to the current list of tools if I have need for something or an idea I want to explore. Following a simple python class template, I can code up a new tool and have it up and running with automatic UI quickly.

Overall, the tool is being updated constantly, and its main aim is to give me a project to explore and improve my python knowledge.

Workflow tab:

Collection of day to day scripts/tools to help speed up workflow.

Deformer Weights tab:

A set of tools to help speed up the process of painting deformer weights. These tools work on any selection type whether it be full object, face, vertex, edge. Contains tools to invert, smooth, add/replace/subtract, copy and import/export weight values. Using the "as percentage" options allows you to reduce or increase weight values base on their original value and without affecting blank (0) areas.

Blendshape manager tab:

One of the most WIP aspects of the tool, meant as a somewhat easier way to deal with blendshape nodes directly. This allows to add/remove targets, add inbetweens, connect/disconnect meshes and build corrective expressions (relies on shape_shape naming). Lots more to do on this tool, not sure how useful it'll still be with the later Maya versions having better tools natively though.

Automatic UI:

I wanted to have the ability to build UI for scripts as quickly as possible, so I started to build a "UI builder" class at the core of the tool. So with a few lines of code I'm able to easily get a working UI for any script that's "plugged in" to the tool set.

So for example, the following code:

widgets =         [
                    {"name":"blendshapeNode","title":"Blendshape Node","type":"selectLoader", "callback":None,"flags":["nodesOnly"]},
                    {"name":"blendshapeTargets","title":"Blendshape Targets","type":"selectLoader", "callback":None,"flags":["useChannelBox"]},
                    {"name":"frameStart","title":"Start Frame", "type":"spinbox","values":{"default":1001,"min":1,"max":10000,"step":1}, "callback":None},
                    {"name":"frameSize","title":"On/Off Length", "type":"spinbox","values":{"default":10,"min":1,"max":100,"step":1}, "callback":None},
                    {"name":"frameHoldSize","title":"Hold Length", "type":"spinbox","values":{"default":5,"min":1,"max":100,"step":1}, "callback":None},
                    {"name":"textSize","title":"Text Size", "type":"spinbox","values":{"default":0.05,"min":0.0,"max":100.0,"step":0.01}, "callback":None,"flags":["useDouble"]},
                    {"name":"dailyBlendshapeTargets","title":"Daily Blendshape Targets", "type":"button", "callback":self.dailyBlendshapeTargets}
windowParams =    {
                    "title":"Daily Blendshape Targets",

self.jhQuickUi.buildWindow(windowParams, widgets)

Will give you:


All images and work © 2024 Jake Harrell unless stated otherwise