Last active
November 21, 2017 09:11
-
-
Save ivogrig/bca0daa0c3ca0ddb2c70 to your computer and use it in GitHub Desktop.
Example command for removing zero rotations from a locator item.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
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