Skip to content

Instantly share code, notes, and snippets.

@ivogrig
Last active November 21, 2017 09:11
Show Gist options
  • Save ivogrig/bca0daa0c3ca0ddb2c70 to your computer and use it in GitHub Desktop.
Save ivogrig/bca0daa0c3ca0ddb2c70 to your computer and use it in GitHub Desktop.
Example command for removing zero rotations from a locator item.
"""
Example command for removing zero rotations from a locator item.
Clears the zero rotation offset while maintaining the pose. Acts on all selected locator items.
Limitation: Only works if the rotation item's location is subsequent to the zero rotation item
(As by default when using the skeleton tool)
Existing animation curves are removed
Simplified example, no argument handling or command helps/configs added.
"""
import lx
import lxifc
import lxu.command
import modo
class CmdClearZeroRotation(lxu.command.BasicCommand):
def __init__(self):
lxu.command.BasicCommand.__init__(self)
# Adding an optional argument 'clear'.
# If True, the zero rotation is cleared,
# if False, the rotation is cleared instead.
self.dyna_Add('clear', lx.symbol.sTYPE_BOOLEAN)
self.basic_SetFlags(0, lx.symbol.fCMDARG_OPTIONAL)
def cmd_Flags(self):
return lx.symbol.fCMD_MODEL | lx.symbol.fCMD_UNDO
def basic_Execute(self, msg, flags):
# Get the value of our 'clear' argument, defaulting to 1 if it was not passed
doClear = self.dyna_Int(0, 1)
# Get the current scene
scn = modo.Scene()
# Iterate all selected items that have locator as super type
for loc in scn.selectedByType(modo.c.LOCATOR_TYPE, superType=True):
# Create list of rotation items
# We assume the rotation item's index is the one following the the zero's index
rotationItems = [t for t in loc.transforms if t.type=='rotation']
# Find the zero rotation item
zeroItem = next((t for t in rotationItems if 'Rotation Zero' in t.name), None)
if zeroItem:
index = rotationItems.index(zeroItem)
# Find the next transform item and verify that it is a rotation
if len(rotationItems) >= index:
rotation = rotationItems[index+1]
if not rotation.type == 'rotation':
continue
matZero = modo.Matrix4( zeroItem.channel('matrix').get() )
matRot = modo.Matrix4( rotation.channel('matrix').get() )
if doClear:
# Multiply the matrices to get a single rotation
matResult = matRot * matZero
# Clear the zero item's rotation and set the rotation item values
zeroItem.set( (0,0,0) )
rotation.set( matResult.asEuler() )
else:
# Multiply the matrices to get a single rotation
matResult = matRot * matZero
# Clear the rotation and apply the values to the zero rotation
rotation.set( (0,0,0) )
zeroItem.set( matResult.asEuler() )
lx.bless(CmdClearZeroRotation, "test.clearZero")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment