308 lines
13 KiB
Python
308 lines
13 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
|
|
|
|
========================================================================================================================
|
|
'''
|
|
|
|
from maya import cmds, mel
|
|
from aTools.generalTools.aToolsGlobals import aToolsGlobals as G
|
|
from aTools.commonMods import uiMod
|
|
from aTools.commonMods import animMod
|
|
from aTools.commonMods import utilMod
|
|
from aTools.commonMods import aToolsMod
|
|
|
|
STORE_NODE = "tUtilities"
|
|
CAMERA_ATTR = "cameraSelected"
|
|
RANGE_ATTR = "timelineRange"
|
|
|
|
|
|
|
|
G.TU_movie = None
|
|
G.TU_audioFile = None
|
|
G.TU_audioOffsetSec = None
|
|
|
|
class TUtilities_Gui(uiMod.BaseSubUI):
|
|
|
|
|
|
def createLayout(self):
|
|
|
|
cmds.rowLayout(numberOfColumns=5, parent=self.parentLayout)
|
|
|
|
timelineRange = TimelineRange()
|
|
cmds.iconTextButton (style='iconAndTextVertical', w=self.wb, h=self.hb, image= uiMod.getImagePath("tUtilities_range"), highlightImage= uiMod.getImagePath("tUtilities_range copy"), command=timelineRange.setTimelineRange, annotation="Set timeline range\nRight click for options")
|
|
timelineRange.popupMenu()
|
|
|
|
cameraTools = CameraTools()
|
|
cmds.iconTextButton (style='iconAndTextVertical', w=self.wb, h=self.hb, image= uiMod.getImagePath("tUtilities_camera"), highlightImage= uiMod.getImagePath("tUtilities_camera copy"), command=cameraTools.playblastCamera, annotation="Playblast camera\nRight click to select camera")
|
|
cameraTools.popupMenu()
|
|
|
|
|
|
|
|
|
|
# end createLayout
|
|
|
|
class TimelineRange(object):
|
|
|
|
def __init__(self):
|
|
G.playBackSliderPython = G.playBackSliderPython or mel.eval('$aTools_playBackSliderPython=$gPlayBackSlider')
|
|
|
|
def popupMenu(self, *args):
|
|
cmds.popupMenu("timelineRangeMenu", postMenuCommand=self.populateMenu)
|
|
|
|
def populateMenu(self, menu, *args):
|
|
uiMod.clearMenuItems(menu)
|
|
uiMod.clearMenuItems(menu)
|
|
#cmds.menuItem(label="Clear motion trails", command=self.clear)
|
|
cmds.radioMenuItemCollection(parent=menu)
|
|
|
|
currRange = [cmds.playbackOptions(query=True, minTime=True), cmds.playbackOptions(query=True, maxTime=True)]
|
|
currRangeStr = "%s - %s"%(int(currRange[0]), int(currRange[1]))
|
|
|
|
#populate list
|
|
ranges = self.getTimelineRanges()
|
|
if ranges: ranges = eval(ranges)
|
|
if ranges:
|
|
for loopRange in ranges:
|
|
loopRangeStr = "%s - %s"%(int(loopRange[0]), int(loopRange[1]-1))
|
|
radioButton = (currRangeStr == loopRangeStr)
|
|
cmds.menuItem("menu_%s"%loopRange, radioButton=radioButton, label=loopRangeStr, parent=menu, command=lambda x, loopRange=loopRange, *args: self.setTimelineRange(loopRange))
|
|
cmds.menuItem( divider=True, parent=menu)
|
|
newMenu = cmds.menuItem(subMenu=True, label='Delete', parent=menu)
|
|
cmds.menuItem( divider=True, parent=menu)
|
|
for loopRange in ranges:
|
|
loopRangeStr = "%s - %s"%(int(loopRange[0]), int(loopRange[1]-1))
|
|
cmds.menuItem("menu_%s"%loopRange, label=loopRangeStr, parent=newMenu, command=lambda x, loopRange=loopRange, *args: self.deleteTimelineRange(loopRange))
|
|
cmds.menuItem( divider=True, parent=newMenu)
|
|
cmds.menuItem("menu_deleteAll", label="Delete All", parent=newMenu, command=self.deleteAllTimelineRange)
|
|
cmds.menuItem("toggleLipSyncModeMenu", label='Lip Sync Mode', checkBox=self.isLipSyncMode(), command=self.toggleLipSyncMode, parent=menu)
|
|
|
|
|
|
|
|
def getTimelineRanges(self):
|
|
return aToolsMod.loadInfoWithScene(STORE_NODE, RANGE_ATTR)
|
|
|
|
|
|
def setTimelineRange(self, range=None, *args):
|
|
|
|
rangeVisible = cmds.timeControl( G.playBackSliderPython, query=True, rangeVisible=True )
|
|
|
|
if not rangeVisible and not range:
|
|
range = [cmds.playbackOptions(query=True, minTime=True), cmds.playbackOptions(query=True, maxTime=True)+1]
|
|
|
|
if range or rangeVisible:
|
|
|
|
if not range: range = animMod.getTimelineRange(float=False)
|
|
rFrom = range[0]
|
|
rTo = range[1]-1
|
|
|
|
cmds.playbackOptions(minTime=rFrom, maxTime=rTo)
|
|
|
|
|
|
if self.getTimelineRanges() != None:
|
|
ranges = eval(self.getTimelineRanges())
|
|
else:
|
|
ranges = []
|
|
if not range in ranges:
|
|
ranges.append(range)
|
|
aToolsMod.saveInfoWithScene(STORE_NODE, RANGE_ATTR, ranges)
|
|
|
|
|
|
utilMod.deselectTimelineRange()
|
|
|
|
|
|
def deleteTimelineRange(self, range=None, *args):
|
|
|
|
ranges = eval(self.getTimelineRanges())
|
|
if not ranges: ranges = []
|
|
if range in ranges: ranges.remove(range)
|
|
aToolsMod.saveInfoWithScene(STORE_NODE, RANGE_ATTR, ranges)
|
|
|
|
def deleteAllTimelineRange(self, *args):
|
|
aToolsMod.saveInfoWithScene(STORE_NODE, RANGE_ATTR, [])
|
|
|
|
|
|
def toggleLipSyncMode(self, *args):
|
|
|
|
if self.isLipSyncMode():
|
|
cmds.timeControl(G.playBackSliderPython, edit=True, height=28)
|
|
else:
|
|
cmds.timeControl(G.playBackSliderPython, edit=True, height=200)
|
|
|
|
def isLipSyncMode(self, *args):
|
|
timelineHeight = cmds.timeControl(G.playBackSliderPython, query=True, height=True)
|
|
|
|
return timelineHeight > 28
|
|
|
|
|
|
class CameraTools(object):
|
|
|
|
|
|
def __init__(self):
|
|
animMod.getShotCamera()
|
|
G.playBackSliderPython = G.playBackSliderPython or mel.eval('$aTools_playBackSliderPython=$gPlayBackSlider')
|
|
|
|
|
|
def popupMenu(self):
|
|
cmds.popupMenu(postMenuCommand=self.populateMenu)
|
|
|
|
def populateMenu(self, menu, *args):
|
|
|
|
uiMod.clearMenuItems(menu)
|
|
|
|
cmds.radioMenuItemCollection(parent=menu)
|
|
|
|
#populate list
|
|
for loopCamera in utilMod.getAllCameras():
|
|
radioSelected = (animMod.getShotCamera() == loopCamera)
|
|
cameraName = cmds.listRelatives(loopCamera, allParents=True)[0]
|
|
cmds.menuItem("menu_%s"%loopCamera, label=str(cameraName), radioButton=radioSelected, parent=menu, command=lambda x, loopCamera=loopCamera, *args: aToolsMod.saveInfoWithScene(STORE_NODE, CAMERA_ATTR, loopCamera))
|
|
|
|
# last playblast menu
|
|
cmds.menuItem(divider=True, parent=menu)
|
|
checkBoxSelected = aToolsMod.getUserPref("saveAfterPlayblasting", default=True)
|
|
cmds.menuItem("saveAfterPlayblastingMenu", label='Save Maya File After Playblasting', checkBox=checkBoxSelected, command=self.setSaveAfterPlayblastingPref, parent=menu)
|
|
cmds.menuItem(divider=True, parent=menu)
|
|
cmds.menuItem (label="Duplicate Selected Camera", command=self.duplicateCamera, parent=menu)
|
|
cmds.menuItem (label="Playblast Viewport", command=self.playblastViewport, parent=menu)
|
|
cmds.menuItem (label="Play Last Playblast", command=self.playLastPlayblast, parent=menu)
|
|
|
|
def setSaveAfterPlayblastingPref(self, onOff):
|
|
self.setPref("saveAfterPlayblasting", onOff)
|
|
|
|
def setPref(self, pref, onOff):
|
|
aToolsMod.setUserPref(pref, onOff)
|
|
|
|
|
|
def playblastViewport(self, *args):
|
|
currCamera = utilMod.getCurrentCamera()
|
|
if currCamera:
|
|
self.doPlayblast(currCamera)
|
|
else:
|
|
cmds.warning( "Please set focus on a viewport" )
|
|
|
|
def playblastCamera(self, *args):
|
|
camera = animMod.getShotCamera()
|
|
if camera: self.doPlayblast(camera)
|
|
|
|
def doPlayblast(self, camera):
|
|
|
|
G.TU_movie = None
|
|
G.TU_audioFile = None
|
|
G.TU_audioOffsetSec = None
|
|
winName = 'playblastWindow'
|
|
overscan = cmds.getAttr("%s.overscan"%camera)
|
|
audioTrack = cmds.timeControl(G.playBackSliderPython, query=True, sound=True)
|
|
rangeVisible = cmds.timeControl(G.playBackSliderPython, query=True, rangeVisible=True )
|
|
widthHeight = utilMod.getRenderResolution()
|
|
|
|
if cmds.window(winName, query=True, exists=True): cmds.deleteUI(winName)
|
|
|
|
window = cmds.window(winName, widthHeight=widthHeight)
|
|
form = cmds.formLayout()
|
|
editor = cmds.modelEditor()
|
|
column = cmds.columnLayout('true')
|
|
|
|
cmds.formLayout( form, edit=True, attachForm=[(column, 'top', 0), (column, 'left', 0), (editor, 'top', 0), (editor, 'bottom', 0), (editor, 'right', 0)], attachNone=[(column, 'bottom'), (column, 'right')], attachControl=(editor, 'left', 0, column))
|
|
cmds.modelEditor(editor, edit=True, camera=camera, activeView=True)
|
|
cmds.showWindow( window )
|
|
cmds.window( winName, edit=True, topLeftCorner=(0, 0), widthHeight=[200,200])
|
|
utilMod.cameraViewMode(editor)
|
|
cmds.setAttr("%s.overscan"%camera, 1)
|
|
|
|
|
|
if rangeVisible:
|
|
range = animMod.getTimelineRange(float=False)
|
|
rFrom = range[0]
|
|
rTo = range[1]-1
|
|
else:
|
|
rFrom = cmds.playbackOptions(query=True, minTime=True)
|
|
rTo = cmds.playbackOptions(query=True, maxTime=True)
|
|
|
|
|
|
if G.currentStudio == None:
|
|
G.TU_movie = cmds.playblast(format="qt", sound=audioTrack, startTime=rFrom ,endTime=rTo , viewer=1, showOrnaments=0, offScreen=True, fp=4, percent=50, compression="png", quality=70, widthHeight=widthHeight, clearCache=True)
|
|
|
|
else:
|
|
|
|
fps = mel.eval("currentTimeUnitToFPS")
|
|
if audioTrack:
|
|
G.TU_audioFile = cmds.sound(audioTrack, query=True, file=True)
|
|
audioOffset = cmds.sound(audioTrack, query=True, offset=True)
|
|
G.TU_audioOffsetSec = str((rFrom - audioOffset)/-fps)
|
|
|
|
movieName = cmds.playblast(format="image", startTime=rFrom ,endTime=rTo , viewer=0, showOrnaments=0, offScreen=True, fp=4, percent=50, compression="jpg", quality=70, widthHeight=widthHeight, clearCache=True)
|
|
if movieName:
|
|
G.TU_movie = "%s.%s-%s#.jpg"%(movieName.split(".")[0], int(rFrom), int(rTo))
|
|
if audioTrack: G.TU_audioOffsetSec = audioOffset
|
|
self.playMovie(G.TU_movie, G.TU_audioFile, G.TU_audioOffsetSec)
|
|
|
|
if cmds.window(winName, query=True, exists=True): cmds.deleteUI(winName)
|
|
|
|
cmds.setAttr("%s.overscan"%camera, overscan)
|
|
|
|
if not G.TU_movie: return
|
|
save = aToolsMod.getUserPref("saveAfterPlayblasting", default=True)
|
|
if save and not rangeVisible: cmds.file(save=True)
|
|
|
|
|
|
def playMovie(self, movie, audioFile, audioOffsetSec):
|
|
|
|
|
|
if not movie:
|
|
cmds.warning( "No movie to play." )
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def playLastPlayblast(self, *args):
|
|
|
|
self.playMovie(G.TU_movie, G.TU_audioFile, G.TU_audioOffsetSec)
|
|
|
|
def duplicateCamera(self, *args):
|
|
sel = cmds.ls(selection=True)
|
|
camNode = utilMod.getCamFromSelection(sel)
|
|
|
|
if camNode:
|
|
dupCamNode = cmds.camera()
|
|
camTransformNode = camNode[0]
|
|
camShapeNode = camNode[1]
|
|
dupCamTransformNode = dupCamNode[0]
|
|
dupCamShapeNode = dupCamNode[1]
|
|
|
|
utilMod.transferAttributes(camTransformNode, dupCamTransformNode)
|
|
utilMod.transferAttributes(camShapeNode, dupCamShapeNode)
|
|
G.aToolsBar.align.align([dupCamTransformNode], camTransformNode)
|
|
cmds.select(dupCamTransformNode)
|
|
|
|
return
|
|
|
|
cmds.warning("No camera was created.")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|