MetaBox/Scripts/Animation/aTools/generalTools/tumbleOnObjects.py
2025-01-14 03:08:55 +08:00

113 lines
4.3 KiB
Python

'''
========================================================================================================================
Author: Alan Camilo
www.alancamilo.com
Requirements: aTools Package
------------------------------------------------------------------------------------------------------------------------
To install aTools, please follow the instructions in the file how_to_install.txt
------------------------------------------------------------------------------------------------------------------------
To unistall aTools, go to menu (the last button on the right), Uninstall
========================================================================================================================
Tumble on objects was adapted from:
'''
from maya import cmds
from maya import mel
from aTools.generalTools.aToolsGlobals import aToolsGlobals as G
from aTools.commonMods import utilMod
import math
class TumbleOnObjects(object):
def __init__(self):
self.currentLocalTumble = cmds.tumbleCtx ("tumbleContext", query=True, localTumble=True)
self.unitMultiplier = {"mm": 0.1,
"cm": 1.0,
"m" : 100.0,
"in": 2.54,
"ft": 30.48,
"yd": 91.44}
def switch(self, onOff):
utilMod.killScriptJobs("G.tumbleOnObjectsScriptJobs")
if onOff:
cmds.tumbleCtx ("tumbleContext", edit=True, localTumble=0)
#scriptJob
G.tumbleOnObjectsScriptJobs.append(cmds.scriptJob(runOnce = False, killWithScene = False, event =('DragRelease', self.update )))
G.tumbleOnObjectsScriptJobs.append(cmds.scriptJob(runOnce = False, killWithScene = False, event =('SelectionChanged', self.update )))
G.tumbleOnObjectsScriptJobs.append(cmds.scriptJob(runOnce = False, killWithScene = False, event =('timeChanged', self.update )))
self.update()
else:
cmds.tumbleCtx ("tumbleContext", edit=True, localTumble=self.currentLocalTumble)
def update(self):
sel = cmds.ls(selection=True)
if len(sel) > 0:
sel = sel[-1]
allowedTypes = ["transform", "joint"]
if cmds.nodeType(sel) in allowedTypes :
currUnit = cmds.currentUnit(query=True, linear=True)
unitMultiplier = self.unitMultiplier[currUnit]
isMesh = cmds.listRelatives(sel, allDescendents=True, noIntermediate=True, type="mesh") != None
if isMesh:
bb = cmds.xform(sel, query=True, boundingBox=True, ws=True)
x = ((bb[0] + bb[3])/2.)
y = ((bb[1] + bb[4])/2.)
z = ((bb[2] + bb[5])/2.)
else:
xyz = cmds.xform(sel, query=True, ws=True, rotatePivot=True)
x = xyz[0]
y = xyz[1]
z = xyz[2]
x = x * unitMultiplier
y = y * unitMultiplier
z = z * unitMultiplier
cams = cmds.ls(dag=True, cameras=True )
"""
for loopCam in cams:
if math.isnan(cmds.getAttr("%s.centerOfInterest"%loopCam)):
print "center is NAN"
if math.isnan(x) or math.isnan(y) or math.isnan(z):
print "tumble returns"
print xyz
for cam in cams:
t = cmds.xform(cam, query=True, ws=True, rotatePivot=True)
print cam, t
return
"""
cmds.undoInfo(stateWithoutFlush=False)
for loopCam in cams:
try: cmds.setAttr("%s.tumblePivot"%loopCam, x, y, z)
except: pass
cmds.undoInfo(stateWithoutFlush=True)