def _extra_nodes_outside_track_geo(self): """ Check for nodes, apart from groups and camera lying outside of TRACK_GEO node :return: True if yes false otherwise """ children = cmds.listRelatives('TRACK_GEO', c=True) # Subtracting group nodes, cameras and child nodes of TRACK_GEO from the list of dag nodes. # This is to get extra nodes present outside TRACK_GEO if children: extras = list(set(cmds.ls(tr=True, dag=True)) - set(GROUP_NODES) - set(cmds.listCameras()) - set(children)) else: extras = list(set(cmds.ls(tr=True, dag=True)) - set(GROUP_NODES) - set(cmds.listCameras())) if extras: self.logger.error("Nodes present outside TRACK_GEO.", extra={ "action_show_more_info": { "label": "Show Info", "tooltip": "Show the extra nodes", "text": "Nodes outside TRACK_GEO:\n{}".format("\n".join(extras)) } } ) return False return True
def getCameraCharacter(): #Define the list Camera Class cmds.listCameras() #get the listCamera listCamera = cmds.listCameras() #debug information print #debug information for list of Cameras #print 'listCamera : ' + str(listCamera) cameraWant = listCamera[0] return cameraWant
def append_cam_to_list(self): self.ortho_list.clear() self.persp_list.clear() orthocam = cmds.listCameras(orthographic=True) for cam in orthocam: if cmds.nodeType(cam) == 'camera': cam = cmds.listRelatives(cam, parent=True)[0] self.ortho_list.addItem(cam) perspcam = cmds.listCameras(perspective=True) for cam in perspcam: if cmds.nodeType(cam) == 'camera': cam = cmds.listRelatives(cam, parent=True)[0] self.persp_list.addItem(cam)
def import2dTrackUI(): """ """ # Build UI Window window = 'import2dTrackUI' if cmds.window(window, q=True, ex=True): cmds.deleteUI(window) window = cmds.window(window, title='Import 2D Track', wh=[500, 350]) # Build UI Elements cmds.columnLayout(adjustableColumn=True) perspCamListTSL = cmds.textScrollList('importTrack_camListTSL', numberOfRows=8, ams=False) fileTFB = cmds.textFieldButtonGrp('importTrack_fileTFB', label='2D Track File', buttonLabel='Browse') cmds.textFieldButtonGrp(fileTFB, e=True, bc='glTools.ui.utils.loadFilePath("' + fileTFB + '",fileFilter="*.*")') cmds.textFieldGrp('importTrack_nameTFG', label="Point Name", text='trackPoint1') cmds.floatFieldGrp('importTrack_widthFFG', numberOfFields=1, label='Source Pixel Width', value1=2348) cmds.floatFieldGrp('importTrack_heightFFG', numberOfFields=1, label='Source Pixel Height', value1=1566) cmds.button(label='Import Track', c='import glTools.tools.import2dTrack;reload(glTools.tools.import2dTrack);glTools.tools.import2dTrack.import2dTrack()') cmds.button(label='Close', c='cmds.deleteUI("' + window + '")') # Build Camera List camList = cmds.listCameras(p=True) for cam in camList: cmds.textScrollList(perspCamListTSL, e=True, a=cam) # Show Window cmds.showWindow(window)
def OCT_CmeraCurves_zwz(): if mc.objExists('allCameraCurves'): mc.delete('allCameraCurves') mc.confirmDialog(title=u'温馨提示:', message=u'线框只与摄像机关联,未与渲染尺寸关联\n请把渲染尺寸比列匹配摄像机底片比列!', button=['OK'], defaultButton='Yes', dismissString='No') allCameras = mc.listCameras(p=True) allCameraCurves = [] for Camera in allCameras: cameraShape = mc.listRelatives(Camera, pa=True) if cameraShape != None and cameraShape[0] != 'perspShape': newCurve = mc.curve(n='%s_curve' % Camera, d=1, p=[(0, 0, 0), (0, 0, -1), (0, 0, -2), (0, 0, -3), (0, 0, -4), (0, 0, -5), (0, 0, -6), (0, 0, -7), (0, 0, -8), (0, 0, -9), (0, 0, -10), (0, 0, -11)]) curveShape = mc.listRelatives(newCurve) setExpForCurve_zwz(str(cameraShape[0]), str(curveShape[0])) cameraWs = mc.xform(Camera, q=True, ws=True, t=True) cameraWr = mc.xform(Camera, q=True, ws=True, ro=True) mc.select(newCurve) mc.move(cameraWs[0], cameraWs[1], cameraWs[2], newCurve, r=True) mc.xform(newCurve, r=True, ro=(cameraWr[0], cameraWr[1], cameraWr[2])) mc.parentConstraint(Camera, newCurve, mo=True, w=True) allCameraCurves.append(newCurve) mc.group(allCameraCurves, n='allCameraCurves') mc.xform('allCameraCurves', r=True, s=(10, 10, 10))
def type_camera(name): """ カメラかどうかを調べる """ if name in cmds.listCameras(p=1): return True else: return False
def get_selection_camera(): """ カメラのみを取得する """ selection = cmds.ls(sl=1, type="transform") if not selection or selection[0] not in cmds.listCameras(p=1): return None return selection[0]
def addCameras(self,*args): """ Add scene cameras to GUI drop-down menu """ cameras = cmds.listCameras() for each in cameras: cmds.menuItem(label=each,p=self.camMenu)
def clearCamera(self): camerasList = cmds.listCameras() for eachCamera in camerasList: if not eachCamera in [ 'front', 'side', 'top', 'persp' ] and eachCamera.startswith("ldmt_renderCamera"): cmds.delete(eachCamera)
def setMenuItemCamera(self) : cameras = mc.listCameras() exclude = ['front', 'side', 'top'] for each in cameras : if not each in exclude : mc.menuItem(l = each)
def _camera_naming(self): """Checks the naming of the camera. :param: group_nodes: The list of nodes that should be in the scene. This will be used to check node hierarchy once camera naming is validated. :return: True if yes False otherwise """ # Look for all the cameras present in the scene all_cameras = cmds.listCameras() # Remove the default_cameras from the list main_cam = list(set(all_cameras) - set(DEFAULT_CAMERAS)) if main_cam: if len(main_cam) > 1: # Checking if more than one CAM present self.logger.error( "More the one camera detected. Only CAM should be present." ) return False elif main_cam[0] != CAMERA_NAME: # Validating camera name self.logger.error("Incorrect camera name! Should be CAM.") return False else: self.logger.error("Camera (CAM) not present in the scene.") return False return True
def addCameras(self, *args): """ Add scene cameras to GUI drop-down menu """ cameras = cmds.listCameras() for each in cameras: cmds.menuItem(label=each, p=self.camMenu)
def camMovementDetector(): shotCam = [cam for cam in cmds.listCameras(perspective = True) if cam != 'persp' if cmds.objExists('%s.type' % cam) if cmds.getAttr('%s.type' % cam) == 'shotCam'] shotCam = shotCam[0] if shotCam else None animated_curves = [] anim_curves = cmds.findKeyframe(shotCam, curve = True) if anim_curves: keyframes_min_max = [] for crv in anim_curves: keys = cmds.keyframe(crv, valueChange = True, q = True) frames = cmds.keyframe(crv, timeChange = True, q = True) keyframes = dict( zip(keys, frames) ) if keyframes: if len(keyframes) > 1: start_anim = max( keyframes.values() ) stop_anim = min( keyframes.values() ) keyframes_min_max.append(start_anim) if start_anim not in keyframes_min_max else None keyframes_min_max.append(stop_anim) if stop_anim not in keyframes_min_max else None if keyframes_min_max: return min(keyframes_min_max), max(keyframes_min_max)
def findCamera(self, name): numName = len(name) allMyCamera = mc.listCameras(p=True) for myCamera in allMyCamera: if myCamera[-numName:] == name: return myCamera return None
def OCT_XXBDeleteUnUseCameras_zwz(): AllCameras = mc.listCameras(p=True) mydeCameras = [] if AllCameras: for Camera in AllCameras: try: unusecamera = mc.listRelatives( Camera, p=True, f=True)[0].split('|')[1].find('CAM') except: if not (Camera.find('Test_') >= 0 or Camera.find('camL') >= 0 or Camera.find('camR') >= 0 or Camera.find('camL') >= 0 or Camera.find('persp') >= 0 or Camera.find('MasterCam') >= 0 or Camera.find('dl') >= 0 or Camera.find('ml') >= 0 or Camera.find('ul') >= 0): mydeCameras.append(Camera) else: if unusecamera < 0: if not (Camera.find('Test_') >= 0 or Camera.find('camL') >= 0 or Camera.find('camR') >= 0 or Camera.find('camL') >= 0 or Camera.find('persp') >= 0 or Camera.find('MasterCam') >= 0 or Camera.find('dl') >= 0 or Camera.find('ml') >= 0 or Camera.find('ul') >= 0): mydeCameras.append(Camera) if mydeCameras: mc.delete(mydeCameras)
def exportFile(self, frameNumber = 1, tempExportPath = False): """ Export a single frame, and return the name of the created scene file """ reload(Exporter) renderCameraName = '' for cam in cmds.listCameras(): renderable = cmds.getAttr( '%s.renderable' % cam ) if renderable == 1: renderCameraName = cam break if renderCameraName == '': OpenMaya.MGlobal.displayError('No renderable camera in scene') saveFolder = cmds.getAttr( 'pbrt_settings.scene_path' ) if not os.path.exists(saveFolder): os.mkdir( saveFolder ) sceneFileBaseName = cmds.getAttr( 'pbrt_settings.scene_filename' ) + ('.%04i' % frameNumber) renderFolder = saveFolder + os.altsep + "renders" + os.altsep if not os.path.exists(renderFolder): os.mkdir(renderFolder) imageSaveName = renderFolder + sceneFileBaseName +'.'+ cmds.getAttr( 'pbrt_settings.image_format', asString = True ) self.imageSaveName = imageSaveName if tempExportPath: saveFolder += ('tmp') + os.altsep if not os.path.exists(saveFolder): os.mkdir( saveFolder ) else: for file_val in os.listdir(saveFolder): os.remove(saveFolder+file_val) os.rmdir( saveFolder ) os.mkdir( saveFolder ) else: saveFolder += ('%04i' % frameNumber) + os.altsep if not os.path.exists(saveFolder): os.mkdir( saveFolder ) sceneFileName = str(saveFolder + sceneFileBaseName + '.pbrt') renderWidth = cmds.getAttr( 'defaultResolution.width' ) renderHeight = cmds.getAttr( 'defaultResolution.height' ) verbosity = cmds.getAttr( 'pbrt_settings.verbosity' ) # launch export proc here ! pe = Exporter.Exporter(sceneFileName, imageSaveName, renderWidth, renderHeight, renderCameraName, verbosity ) try: pe.doIt( ) except: self.mProgress.endProgress() raise return sceneFileName
def erm_DeleteCamera(delCamera=0): erm_cam = list(set(mc.ls(mc.listCameras(),v = True)) - set(['front','persp','side','top'])) erm_ReturnText='' if delCamera: mc.delete(erm_cam) else: erm_ReturnText = era_SplitFlag().join(erm_cam) return erm_ReturnText
def get_scene_cameras(names_only=True): """ Returns a list of cameras present in the scene. :param names_only: bool. Return only names if True, nodes otherwise. :return List of names or Pymel nodes. """ li = [o for o in cmds.listCameras(p=True) if o != "persp"] return li if names_only else [pmc.PyNode(o) for o in li]
def shapshot_results(self, value): self.chosen_asset = value[0] cam_list = mc.listCameras() self.item_gui = co.CheckBoxOptions(parent=maya_main_window(), title="Select cameras to use:", options=cam_list) self.item_gui.submitted.connect(self.camera_results)
def reloadCameras(*args): cameras = cmds.listCameras(perspective=True) opCamera = cmds.optionMenu('opCamera', label='Camera: ', changeCommand=changeCamera, parent='column') for each in range(len(cameras)): cmds.menuItem(label=cameras[each], parent=opCamera)
def get_thumbnail(self): for camera in mc.listCameras(): if camera == "persp": pass else: mm.eval("viewFit -all;") mc.lookThru(camera) mc.playblast( cf= "H:\\Image Test\\" + camera + ".jpg" , fr=1, fmt="image", v=False, wh=[500, 300], orn=False, compression="jpg", quality=100, percent=100 )
def bake_CAM_ani(): sourceCAM=cmds.select('cam_hcam:shot') #确定UI上选择的摄像机,取得摄像机名称 #确定烘焙范围 cmds.listCameras( p=True ) #场景中所有透视摄像机 cameraName = cmds.camera() #创建新摄像机 cameraShape = cameraName[1]#获得新摄像机名称 bakeCAMnode='baked_CAM' cmds.rename(cameraShape,bakeCAMnode) #修改bakecam的名字 sourceCAMtransfer=cmds.listHistory( sourceCAM, il=1)[1] cmds.parentConstraint(sourceCAMtransfer, bakeCAMnode) cmds.select(bakeCAMnode) cmds.bakeSimulation(selectCam,t=(starten,ende),hi='below') cmds.select(bakeCAMnode) cmds.file(*args, **kwargs) pass
def execute(self, **kwargs): """ Main hook entry point :returns: A list of any items that were found to be published. Each item in the list should be a dictionary containing the following keys: { type: String This should match a scene_item_type defined in one of the outputs in the configuration and is used to determine the outputs that should be published for the item name: String Name to use for the item in the UI description: String Description of the item to use in the UI selected: Bool Initial selected state of item in the UI. Items are selected by default. required: Bool Required state of item in the UI. If True then item will not be deselectable. Items are not required by default. other_params: Dictionary Optional dictionary that will be passed to the pre-publish and publish hooks } """ items = [] # get the main scene: scene_name = cmds.file(query=True, sn=True) if not scene_name: raise TankError("Please Save your file before Publishing") scene_path = os.path.abspath(scene_name) name = os.path.basename(scene_path) # create the primary item - this will match the primary output 'scene_item_type': items.append({"type": "work_file", "name": name}) # if there is any geometry in the scene (poly meshes or nurbs patches), then # add a geometry item to the list: if cmds.ls(geometry=True, noIntermediate=True): items.append({"type":"geometry", "name":"All Scene Geometry"}) # look for cameras to publish for camera in cmds.listCameras(perspective=True): items.append({"type": "camera", "name": camera}) return items
def render(self): """ Starts the render """ try: # If MtoA was not found defaultTranslator = cmds.getAttr("defaultArnoldDisplayDriver.aiTranslator") except ValueError: cmds.warning("Current renderer is not set to Arnold.") return cmds.setAttr("defaultArnoldDisplayDriver.aiTranslator", "aton", type="string") # Updating the port from UI if self.defaultPort != 0: port = self.portSpinBox.value() cmds.setAttr("defaultArnoldDisplayDriver.port", port) else: cmds.warning("Current renderer is not set to Arnold or Aton driver is not loaded.") return # Adding time changed callback if self.timeChangedCB == None: self.timeChangedCB = OM.MEventMessage.addEventCallback("timeChanged", self.timeChnaged) # Adding selection changed callback if self.selectionChangedCB == None: self.selectionChangedCB = OM.MEventMessage.addEventCallback("SelectionChanged", self.selectionChanged) try: # If render session is not started yet cmds.arnoldIpr(mode="stop") except RuntimeError: pass # Temporary makeing hidden cameras visible before scene export hCams = [ x for x in cmds.listCameras() if not cmds.getAttr("%s.visibility" % x) or not cmds.getAttr("%s.visibility" % cmds.listRelatives(x, s=1)[0]) ] for i in hCams: cmds.showHidden(i) try: # Start IPR camera = self.getCamera() cmds.arnoldIpr(cam=camera, mode="start") except RuntimeError: cmds.warning("Current renderer is not set to Arnold.") # Update IPR self.IPRUpdate() sys.stdout.write("// Info: Aton - Render started.\n") # Setting back to default for i in hCams: cmds.hide(i) cmds.setAttr("defaultArnoldDisplayDriver.aiTranslator", defaultTranslator, type="string") cmds.setAttr("defaultArnoldDisplayDriver.port", self.defaultPort)
def process(self, context): if context.data['ftrackData']['Task']['type'] in ['Modelling']: return all_cameras = cmds.listCameras() self.log.info(all_cameras) cameras = [] for cam in all_cameras: if cam.lower().endswith('_cam'): cameras.append(cam) for camera in cameras: # Include namespace # Use short name name = cmds.ls(camera, long=False)[0].lower() instance = context.create_instance(name=name, family='camera') instance.add(camera) instance.data["publish"] = True instance.data["families"] = ['camera'] item = name.split('_')[0] instance.data['item'] = item instance.data["label"] = item + ' camera' self.log.debug("item {}, name {}".format(item, name)) if context.data['ftrackData']['Task']['type'] in ['Lighting']: instance.data['publish'] = False attrs = cmds.listAttr(camera, userDefined=True) or list() self.log.info("Found: %s" % camera) self.log.info("Overrides: %s" % attrs) for attr in attrs: try: value = cmds.getAttr(camera + "." + attr) except: self.log.warning("Could not read from: %s" % attr) continue self.log.debug("Adding %s=%s to %s" % ( attr, value, instance)) instance.data[attr] = value # ftrack data components = {'ma': {'path': ''}} instance.data['ftrackComponents'] = components self.log.info("Added: %s" % components)
def run(self): '''Runs codes to start checking.''' import maya.cmds as cmds self.result = cmds.listCameras() self.result.remove('front') self.result.remove('persp') self.result.remove('side') self.result.remove('top') return self.result
def YupZup(): if cmds.upAxis(q=True, axis=True) == "y": cmds.upAxis(ax="z", rv=True) else: cmds.upAxis(ax="y", rv=True) for cam in cmds.listCameras(): cmds.viewSet(cam, animate=False, home=True) cmds.viewFit(all=True)
def DOIT(*args): cameralist = cmds.listCameras() imageFile = '/groups2/papa/Rigging' for i in cameralist: imagePlaneName = cmds.imagePlane(c=i) print imagePlaneName cmds.setAttr(imagePlaneName[0] + '.imageName', '/groups2/papa/Rigging/theInspiration.JPG', type='string') cmds.warning('Welp, you asked for it.')
def _get_scene_cameras(self): cameras = cmds.listCameras(perspective=True) # replace shapes with transforms (maya returns shapes when other objects are parented under a camera) cam_shapes = cmds.ls(cameras, shapes=True) cameras = list( set( cmds.ls(cameras, type="transform") + cmds.ls( cmds.listRelatives(cam_shapes, parent=True, fullPath=True), type="transform"))) return cameras
def CleanAllCameras_zwz(): allCameras = mc.listCameras(p=True) for MyCamera in allCameras: MyCameraShape = mc.listRelatives(MyCamera, s=True, f=True) if MyCameraShape: mc.setAttr("%s.renderable" % MyCameraShape[0], 0) cmd = 'updateMayaSoftwareCameraControl;' try: mm.eval(cmd) except: pass
def listCam(self): camsTMP = cmds.listCameras() for i in camsTMP: cmds.setAttr(i + ".renderable", 0) if i != 'front' and i != 'persp' and i != 'side' and i != 'top': self.cams.append(i) if len(self.cams) == 1: self.cam = self.cams[0] self.lockTroughtCamera(self.cam) if len(self.cams) > 1: self.windowChooseCam()
def listCam(self): camsTMP = cmds.listCameras() for i in camsTMP: cmds.setAttr(i + ".renderable", 0) if i != "front" and i != "persp" and i != "side" and i != "top": self.cams.append(i) if len(self.cams) == 1: self.cam = self.cams[0] self.lockTroughtCamera(self.cam) if len(self.cams) > 1: self.windowChooseCam()
def getRenderCamerasList ( ) : renderCamerasList = [] cameras = cmds.listCameras () for cam in cameras : camShape = cam if cmds.objectType( cam ) == 'transform' : # != 'camera' : camShapes = cmds.listRelatives ( str ( cam ), shapes = True ) camShape = camShapes [ 0 ] if cmds.getAttr ( camShape + '.renderable' ) : renderCamerasList.append ( str ( cam ) ) return renderCamerasList
def process(self, context): all_cameras = cmds.listCameras() self.log.info(all_cameras) cameras = [] for cam in all_cameras: if cam.lower().endswith('_cam'): cameras.append(cam) cameras.append('persp') for camera in cameras: # Include namespace # Use short name name = cmds.ls(camera, long=False)[0].lower().rsplit("_cam", 1)[0] instance = context.create_instance(name=name, family='review') instance.add(camera) instance.data["families"] = ['review'] instance.data["label"] = name + ' camera' if camera == 'persp': instance.data['publish'] = False instance.data["families"].append('snapshot') if camera == 'shot_cam': instance.data["families"].append('snapshot') if context.data['ftrackData']['Task']['type'] in ['Lighting']: instance.data['publish'] = False attrs = cmds.listAttr(camera, userDefined=True) or list() self.log.info("Found: %s" % camera) self.log.info("Overrides: %s" % attrs) # task specific overrides if context.data['ftrackData']['Task']['type'] == 'Rigging': instance.data['show'] = ['polymeshes', 'nurbsCurves', 'joints'] # ftrack data components = {'review': {'path': '', 'reviewable': True, }, 'fullReview': {'path': '', 'reviewable': False, } } instance.data['ftrackComponents'] = components self.log.info("Added: %s" % components) self.log.info("components: %s" % instance.data['ftrackComponents'])
def getRenderCamerasList(): # renderCamerasList = [] cameras = cmds.listCameras() for cam in cameras: camShape = cam if cmds.objectType(cam) == 'transform': # != 'camera' : camShapes = cmds.listRelatives(str(cam), shapes=True) camShape = camShapes[0] if cmds.getAttr(camShape + '.renderable'): renderCamerasList.append(str(cam)) return renderCamerasList
def __init__(self): self.camList = mc.listCameras(p=True) self.minCameraNum = 2 self.maxCameraNum = 6 self.main_win_width = 400 self.main_win_Heigh = 25 self.view_win_width = 900 self.view_win_heigh = 150 self.camNumField = ''
def Cam_3_H_Model_Win_UI(self): #环幕 self.allCameras = mc.listCameras(p=True) if mc.window('Cam_Win_UI', ex=True): mc.deleteUI("Cam_Win_UI") win = mc.window('Cam_Win_UI', t='OCT_3_CamModel', wh=[500, 300], sizeable=True, rtf=True) mc.formLayout('formLyt', numberOfDivisions=100) two = mc.frameLayout('Cameras_Set', label=u'请选择需要预览的摄像机(面板可拉伸)', labelAlign='top', borderStyle='etchedOut', w=450, parent='formLyt') mc.columnLayout(rowSpacing=5) for cam in self.allCameras: mc.rowLayout(numberOfColumns=4, columnWidth4=(150, 100, 100, 100)) mc.text(cam, l=cam) mc.checkBox("%sL" % cam, l="L") mc.checkBox("%sM" % cam, l="M") mc.checkBox("%sR" % cam, l="R") mc.setParent('..') # self.uiTextSCameras = mc.textScrollList('selectCameras', append = self.allCameras, aas=True, allowMultiSelection=True, h=100, parent='Cameras_Set') mc.setParent('..') three = mc.columnLayout('Second_Set', parent='formLyt') mc.button('SetAll', label=u'Go', width=460, h=25, command=lambda *args: self.Cam_1_Model_Win_menu(), backgroundColor=(0.2, 0.8, 0.3), parent='Second_Set') mc.button('CloseWin', label=u'正常退出', width=460, h=25, command="", backgroundColor=(0.8, 0.2, 0.3), parent='Second_Set') mc.formLayout('formLyt', e=True, attachForm=[(two, 'top', 5), (two, 'left', 5), (two, 'right', 5), (three, 'left', 5), (three, 'bottom', 5)], attachControl=[(two, 'bottom', 1, three)], attachNone=[(three, 'top')], attachPosition=[(two, 'left', 0, 0), (two, 'top', 0, 0)]) mc.showWindow(win)
def listAllCameras(): cameraTransforms = [] listAllCameras = cmds.listCameras(p=True) #remove 'persp' camera if 'persp' in listAllCameras: listAllCameras.remove('persp') for c in listAllCameras: if cmds.objectType(c) == "camera": cp = cmds.listRelatives(c, p=True)[0] cameraTransforms.append(cp) else: cameraTransforms.append(c) return cameraTransforms
def runImportLight(self, arg=None): title = 'Light Template' allRefs = mc.file(q=True, r=True) rigGrp = 'Rig:Geo_Grp' selLight = str(self.ui.light_comboBox.currentText()) self.selLightPath = '%s/%s' % (self.lightRig, selLight) if not mc.objExists('Light_Grp'): if not self.selLightPath in allRefs: mc.file(self.selLightPath, r=True, uns=True, dns=True) mc.setAttr("vraySettings.relements_usereferenced", 1) else: self.messageBox('Warning', 'Light Rig Exists') if not mc.objExists('cam_grp'): if not self.turnTableCamera in allRefs: mc.file(self.turnTableCamera, r=True, uns=True, dns=True) mc.playbackOptions(min=1) mc.playbackOptions(max=100) mc.lookThru('turntable_cam') mc.setAttr('turntable_camShape.renderable', 1) allCams = mc.listCameras() for eachCam in allCams: shape = mc.listRelatives(eachCam, s=True)[0] mc.setAttr('%s.renderable' % shape, 0) if eachCam == 'turntable_cam': mc.setAttr('%s.renderable' % shape, 1) mc.setAttr('%s.displayFieldChart' % shape, 1) mc.setAttr('%s.displayResolution' % shape, 1) mc.setAttr('%s.overscan' % shape, 1.3) mc.setAttr('%s.backgroundColor' % shape, 0.5, 0.5, 0.5, type='double3') # mc.eval('setAttr "turntable_camShape.backgroundColor" -type double3 0.5 0.5 0.5 ;') if mc.objExists(rigGrp): mc.select(rigGrp) mm.eval('fitPanel -selected;') mc.currentTime(9) self.setStatus(title, True) else: self.messageBox('Warning', 'Turntable Camera Exists')
def list_cameras(self): """ Return a list of tuple representing the Maya cameras. Each tuple contains a camera name and its shape name. """ res = [] camera_names = cmds.listCameras() for camera_name in camera_names: camera_shape = cmds.listRelatives(camera_name, type="camera", s=True)[0] res.append((camera_name, camera_shape)) return res
def getCameras(renderableOnly=False): """ Returns list of cameras in the scene. Renderable cameras will be listed first. """ camera_list = [] #if os.environ['IC_ENV'] == 'MAYA': if os.environ['PREVIEW_APPCONNECT'] == 'maya': # noSelectText = "" # camera_list = [noSelectText, ] #camera_list = [] # cameras = mc.ls(cameras=True) persp_cameras = mc.listCameras(perspective=True) ortho_cameras = mc.listCameras(orthographic=True) cameras = persp_cameras + ortho_cameras for camera in cameras: if mc.getAttr(camera + '.renderable'): camera_list.insert(0, camera) elif renderableOnly == False: camera_list.append(camera) return camera_list
def __getAllCams(self): allSortedCam = [] cameras = mc.listCameras(p=True) for cam in cameras: shapeNode = mc.listRelatives(cam, s=True) if shapeNode == None: continue str = "attributeExists \"renderable\"" + " \"" + shapeNode[0] + "\"" status = mel.eval(str) if status: allSortedCam.append(cam) return allSortedCam
def get_camera(with_panel=None): all_cams = [cam for cam in mc.listCameras(p=1) if not mc.referenceQuery(cam, isNodeReferenced=True)] extra_cams = ['persp', 'left', 'right', 'top', 'side', 'bottom'] if with_panel: try: current_cam = pm.PyNode(pm.modelPanel(pm.getPanel(wf=True), q=True, cam=True)) return current_cam except RuntimeError: pass all_cam_transform = [str(cam) for cam in all_cams if str(cam) not in extra_cams] # print all_cam_transform if all_cam_transform: return all_cam_transform else: return ["persp"]
def doCheck(self): # get the list of cameras self.cameraList = cmds.listCameras() # determine how many cameras there are self.numberOfCameras = len(self.cameraList) if self.numberOfCameras > 4: returnString = str( self.numberOfCameras) + " cameras detected, should have 4." return returnString else: return ''
def runImportLight(self, arg = None) : title = 'Light Template' allRefs = mc.file(q = True, r = True) rigGrp = 'Rig:Geo_Grp' selLight = str(self.ui.light_comboBox.currentText()) self.selLightPath = '%s/%s' % (self.lightRig, selLight) if not mc.objExists('Light_Grp') : if not self.selLightPath in allRefs : mc.file(self.selLightPath,r=True, uns=True, dns=True ) mc.setAttr( "vraySettings.relements_usereferenced", 1) else : self.messageBox('Warning', 'Light Rig Exists') if not mc.objExists('cam_grp') : if not self.turnTableCamera in allRefs : mc.file(self.turnTableCamera, r=True, uns=True, dns=True) mc.playbackOptions( min=1 ) mc.playbackOptions( max=100 ) mc.lookThru('turntable_cam') mc.setAttr('turntable_camShape.renderable', 1) allCams = mc.listCameras() for eachCam in allCams : shape = mc.listRelatives(eachCam, s = True)[0] mc.setAttr('%s.renderable' % shape, 0) if eachCam == 'turntable_cam' : mc.setAttr('%s.renderable' % shape, 1) mc.setAttr('%s.displayFieldChart' % shape, 1) mc.setAttr('%s.displayResolution' % shape, 1) mc.setAttr('%s.overscan' % shape, 1.3) mc.setAttr('%s.backgroundColor' % shape, 0.5, 0.5, 0.5, type = 'double3') # mc.eval('setAttr "turntable_camShape.backgroundColor" -type double3 0.5 0.5 0.5 ;') if mc.objExists(rigGrp) : mc.select(rigGrp) mm.eval('fitPanel -selected;') mc.currentTime(9) self.setStatus(title, True) else : self.messageBox('Warning', 'Turntable Camera Exists')
def __validate_item_for_camera(self, item): """ Validate that the item is valid to be exported to a camera :param item: The item to validate :returns: A list of any errors found during validation """ errors = [] # compruebo que existe la cámara if not cmds.listCameras(perspective=True): errors.append("¡La escena no tiene ninguna cámara!") # devuelvo los errores return errors
def switch_persp_panel(): current_model = cmds.getPanel(wf=True) current_camera = cmds.modelEditor(current_model,q=True,cam=True) persp_cameras = cmds.listCameras(p=True) print persp_cameras try: if(camera_type(current_camera) == "orthographic"): cmds.lookThru("persp") else: if(len(persp_cameras) > 1): for c,n in itu.pairwise(persp_cameras): if(current_camera == c): if(persp_cameras.index(c) == (len(persp_cameras)-1)): cmds.lookThru(persp_cameras[0]) else: print n cmds.lookThru(n) except: print "No persp camera, create a new persp camera!"
def delete_perspective_camera(log=None): ''' delete all perspective cameras except 'persp' ''' if not log: import logging log = logging.getLogger() cam_persp = cmds.listCameras(perspective=True) cam_persp.remove('persp') if cam_persp: for cam in cam_persp: try: cmds.delete( cam ) except: log.error('can not delete camera:%s' % cam) log.error(traceback.format_exc()) else: log.warning('delete camera success:%s' % cam) else: log.debug('There is no perspective camera in the scene.')
def viewportSnap(): ''' Zbrush/Nvil like viewport snap ''' camList = cmds.listCameras(o=True) if 'bottom' not in camList: cmds.duplicate('top', name='bottom') cmds.setAttr('bottom.translateY', -512) cmds.setAttr('bottom.rotateX', 90) if 'back' not in camList: cmds.duplicate('front', name='back') cmds.setAttr('back.translateZ', -512) cmds.setAttr('back.rotateY', 180) if 'left' not in camList: cmds.duplicate('side', name='left') cmds.setAttr('left.translateX', -512) cmds.setAttr('left.rotateY', -90) if getCurrentCamera() == 'persp': tm = cmds.xform('persp', q=True, ws=True, matrix=True) perspV = MVector(-tm[8], -tm[9], -tm[10]) dotList = {} for view in camList: tm = cmds.xform(view, q=True, ws=True, matrix=True) tm = MVector(-tm[8], -tm[9], -tm[10]) tm = perspV * tm dotList[view] = tm bv = max(dotList, key=dotList.get) setCurrentCamera(bv) else: setCurrentCamera('persp')
def get_data_from_shotgun(cb010 = True, cb020 = True, cb030 = True, cb040 = True, cb050 = True, cb060 = True, optimizeEnv = True, rippleLyr = True, bgHillLyr = True, directory = 'I:/bubblebathbay/episodes', **kwargs): episode = kwargs['code'].split('_')[0] if kwargs['code'] else None shotName = kwargs['code'] if kwargs['code'] else None minTime = kwargs['sg_cut_in'] if kwargs['sg_cut_in'] else None maxTime = kwargs['sg_cut_out'] if kwargs['sg_cut_out'] else None timeOfDay = kwargs['sg_tod'] if kwargs['sg_tod'] else None oceanType = kwargs['sg_ocean_type'] if kwargs['sg_ocean_type'] else None if shotName: ## New File! cmds.file(new = True, force = True) ## Load plugins plugins_to_load = ['AbcImport', 'Mayatomr']; [cmds.loadPlugin(plug) for plug in plugins_to_load if not cmds.pluginInfo(plug, q = True, name = True, loaded = True)] ## Enable Mentalcore cmds.deleteUI('unifiedRenderGlobalsWindow') if cmds.window('unifiedRenderGlobalsWindow', exists = True, q = True) else None bbbLightTools._setRenderGlobals() if minTime and maxTime: ## Sync frame range from shotgun (min) cmds.playbackOptions(minTime = minTime, maxTime = maxTime, animationStartTime = minTime, animationEndTime = maxTime) sceneName = 'I:/bubblebathbay/episodes/%s/%s/Light/work/maya/' % (episode, shotName) ############################################################################################################ ## Fetch latest anim publish bbbLightTools._fetchAnimPublish(filteredPublish = 'Fetch Anim Publish', sceneName = sceneName) cmds.select(cmds.listRelatives('ABC_ANIM_CACHES_hrc', children = True, fullPath = True), replace = True) if cmds.objExists('ABC_ANIM_CACHES_hrc') and cmds.listRelatives('ABC_ANIM_CACHES_hrc', children = True) else None bbbLightTools.fetchShadersForSelected() ########################################################################################################### ## Fetch latest crease xml publish bbbLightTools._fetchAnimPublish(filteredPublish = 'Fetch Crease XML Publish', sceneName = sceneName) ########################################################################################################### ## Fetch latest camera publish bbbLightTools._fetchAnimPublish(filteredPublish = 'Fetch Camera Publish', sceneName = sceneName) shotCam = [cmds.listRelatives(cam, fullPath = True)[0] for cam in cmds.listCameras(perspective = True) if cam != 'persp' if cmds.objExists('%s.type' % cam) if cmds.getAttr('%s.type' % cam) == 'shotCam'] shotCam = shotCam[0] if shotCam else None cmds.setAttr("%s.displayResolution" % shotCam, 1) cmds.setAttr("%s.overscan" % shotCam, 1.3) ########################################################################################################### ## Fetch latest fx ocean publish bbbLightTools._fetchAnimPublish(filteredPublish = 'Fetch FX Publish', sceneName = sceneName) ## Fetch Static ENVs bbbLightTools._doSTATIC_import(path = '//192.168.5.253/BBB_main/bbb/i/bubblebathbay/episodes/ep000/ep000_sh010/Light/publish/maya', namespace = 'ep000_sh010_ep000sh010_LIGHTENV') if cb010 else None bbbLightTools._doSTATIC_import(path = '//192.168.5.253/BBB_main/bbb/i/bubblebathbay/episodes/ep000/ep000_sh020/Light/publish/maya', namespace = 'ep000_sh020_ep000sh020_LIGHTENV') if cb020 else None bbbLightTools._doSTATIC_import(path = '//192.168.5.253/BBB_main/bbb/i/bubblebathbay/episodes/ep000/ep000_sh030/Light/publish/maya', namespace = 'ep000_sh030_ep000sh030_LIGHTENV') if cb030 else None bbbLightTools._doSTATIC_import(path = '//192.168.5.253/BBB_main/bbb/i/bubblebathbay/episodes/ep000/ep000_sh040/Light/publish/maya', namespace = 'ep000_sh040_ep000sh040_LIGHTENV') if cb040 else None bbbLightTools._doSTATIC_import(path = '//192.168.5.253/BBB_main/bbb/i/bubblebathbay/episodes/ep000/ep000_sh050/Light/publish/maya', namespace = 'ep000_sh050_ep000sh050_LIGHTENV') if cb050 else None bbbLightTools._doSTATIC_import(path = '//192.168.5.253/BBB_main/bbb/i/bubblebathbay/episodes/ep000/ep000_Docks_Addon/Light/publish/maya', namespace = 'ep000_sh050_ep000sh060_LIGHTENV') if cb060 else None # Do static env quick optimize if optimizeEnv: if camMovementDetector(): bbbLightTools.optimizeScene( still = False, step = 5, offset = 1.1, startFrame = int( camMovementDetector()[0] ), endFrame = int( camMovementDetector()[1] ) ) else: bbbLightTools.optimizeScene(still = True, step = 5, offset = 1.1) ## Setup Lighting if timeOfDay: bbbLightTools.setTOD_automatic(TODay = "dawn") if timeOfDay == 'Dawn' else None bbbLightTools.setTOD_automatic(TODay = "sunrise") if timeOfDay == 'Sunrise' else None bbbLightTools.setTOD_automatic(TODay = "morning") if timeOfDay == 'Morning' else None bbbLightTools.setTOD_automatic(TODay = "midday") if timeOfDay == 'Day' else None bbbLightTools.setTOD_automatic(TODay = "afternoon") if timeOfDay == 'Afternoon' else None bbbLightTools.setTOD_automatic(TODay = "afternoon") if timeOfDay == 'AfternoonLate' else None bbbLightTools.setTOD_automatic(TODay = "sunset") if timeOfDay == 'Sunset' else None bbbLightTools.setTOD_automatic(TODay = "dusk") if timeOfDay == 'Dusk' else None bbbLightTools.setTOD_automatic(TODay = "night") if timeOfDay == 'Night' else None tod_setter(timeOfDay = timeOfDay) ## Finally, render setup! bbbLightTools.RenderSetup() if rippleLyr: ## Go to defaultRenderLayer before setting up ripple or bg hills separated render layers cmds.editRenderLayerGlobals(currentRenderLayer = 'defaultRenderLayer') ## Import ripple layer bbbLightTools.importRippleLayer() ## Ripple_Lyr bbbLightTools.setRippleLYR() if bgHillLyr: ## Go to defaultRenderLayer before setting up ripple or bg hills separated render layers cmds.editRenderLayerGlobals(currentRenderLayer = 'defaultRenderLayer') ## BGHills_Lyr bbbLightTools.setBGHills() ## Save scene! shotPath = '%s.generated__.ma' % shotName.replace('_', '') shotPath = '%s/%s/%s/Light/work/maya/%s' % (directory, episode, shotName, shotPath) if not os.path.exists( os.path.dirname(shotPath) ): os.makedirs( os.path.dirname(shotPath) ) cmds.file(rename = shotPath) cmds.file(save = True, type = "mayaAscii")
def setupUI(self): ''' Building the GUI ''' def resUpdateUI(value): self.resolutionSpinBox.setValue(value * 5) def resInfoUpdate(value): xres = self.getSceneOption(2) * value / 100 yres = self.getSceneOption(3) * value / 100 resolutionInfoLabel.setText("%sx%s"%(xres, yres)) def camUpdateUI(value): self.cameraAaSpinBox.setValue(value) def portUpdateUI(value): self.portSpinBox.setValue(value + self.defaultPort) def sequence_toggled(value): isChecked = bool(value) self.startLabel.setEnabled(isChecked) self.endLabel.setEnabled(isChecked) self.stepLabel.setEnabled(isChecked) self.startSpinBox.setEnabled(isChecked) self.endSpinBox.setEnabled(isChecked) self.stepSpinBox.setEnabled(isChecked) def resetUI(*args): self.portSpinBox.setValue(self.defaultPort) portSlider.setValue(0) self.extraHostLineEdit.setText("") self.cameraComboBox.setCurrentIndex(0) self.resolutionSpinBox.setValue(100) resolutionSlider.setValue(20) self.cameraAaSpinBox.setValue(self.getSceneOption(4)) cameraAaSlider.setValue(self.getSceneOption(4)) self.renderRegionXSpinBox.setValue(0) self.renderRegionYSpinBox.setValue(0) self.renderRegionRSpinBox.setValue(self.getSceneOption(2)) self.renderRegionTSpinBox.setValue(self.getSceneOption(3)) overscanSlider.setValue(0) self.motionBlurCheckBox.setChecked(self.getSceneOption(5)) self.subdivsCheckBox.setChecked(self.getSceneOption(6)) self.displaceCheckBox.setChecked(self.getSceneOption(7)) self.bumpCheckBox.setChecked(self.getSceneOption(8)) self.sssCheckBox.setChecked(self.getSceneOption(9)) self.shaderComboBox.setCurrentIndex(0) textureRepeatSlider.setValue(4) self.selectedShaderCheckbox.setChecked(0) self.startSpinBox.setValue(self.getSceneOption(10)) self.endSpinBox.setValue(self.getSceneOption(11)) self.stepSpinBox.setValue(1) self.seqCheckBox.setChecked(False) self.setAttribute(QtCore.Qt.WA_AlwaysShowToolTips) self.setAttribute(QtCore.Qt.WA_DeleteOnClose) mainLayout = QtWidgets.QVBoxLayout() mainLayout.setContentsMargins(5,5,5,5) mainLayout.setSpacing(2) generalGroupBox = QtWidgets.QGroupBox("General") generalGroupBox.setMaximumSize(9999, 150) generalLayout = QtWidgets.QVBoxLayout(generalGroupBox) # Port Layout portLayout = QtWidgets.QHBoxLayout() portLabel = QtWidgets.QLabel("Port:") portLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter) portLabel.setMinimumSize(75, 20) self.portSpinBox = QtWidgets.QSpinBox() self.portSpinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons) self.portSpinBox.setMaximum(1024) self.portSpinBox.setMaximum(9999) self.portSpinBox.setValue(self.defaultPort) portSlider = QtWidgets.QSlider() portSlider.setOrientation(QtCore.Qt.Horizontal) portSlider.setMinimum(0) portSlider.setMaximum(15) portSlider.setValue(0) portLayout.addWidget(portLabel) portLayout.addWidget(self.portSpinBox) portLayout.addWidget(portSlider) # Extra Host Layout extraHostLayout = QtWidgets.QHBoxLayout() extraHostLabel = QtWidgets.QLabel("Extra host:") extraHostLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter) extraHostLabel.setMinimumSize(75, 20) extraHostLabel.setMaximumSize(75, 20) self.extraHostLineEdit = QtWidgets.QLineEdit() extraHostLayout.addWidget(extraHostLabel) extraHostLayout.addWidget(self.extraHostLineEdit) # Camera Layout cameraLayout = QtWidgets.QHBoxLayout() cameraLabel = QtWidgets.QLabel("Camera:") cameraLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter) cameraLabel.setMaximumSize(75, 20) self.cameraComboBox = QtWidgets.QComboBox() self.cameraComboBoxDict = {} self.cameraComboBox.addItem("Current view") for i in cmds.listCameras(): self.cameraComboBox.addItem(i) self.cameraComboBoxDict[cmds.listCameras().index(i)+1] = i cameraLayout.addWidget(cameraLabel) cameraLayout.addWidget(self.cameraComboBox) overridesGroupBox = QtWidgets.QGroupBox("Overrides") overridesGroupBox.setMaximumSize(9999, 350) overridesLayout = QtWidgets.QVBoxLayout(overridesGroupBox) # Resolution Layout resolutionLayout = QtWidgets.QHBoxLayout() resolutionLabel = QtWidgets.QLabel("Resolution %:") resolutionLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter) resolutionLabel.setMinimumSize(75, 20) self.resolutionSpinBox = QtWidgets.QSpinBox() self.resolutionSpinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons) self.resolutionSpinBox.setMinimum(1) self.resolutionSpinBox.setMaximum(999) self.resolutionSpinBox.setValue(100) resolutionSlider = QtWidgets.QSlider() resolutionSlider.setOrientation(QtCore.Qt.Horizontal) resolutionSlider.setValue(20) resolutionSlider.setMaximum(40) xres, yres = self.getSceneOption(2), self.getSceneOption(3) resolutionInfoLabel = QtWidgets.QLabel("%sx%s"%(xres, yres)) resolutionInfoLabel.setMaximumSize(100, 20) resolutionInfoLabel.setEnabled(False) resolutionLayout.addWidget(resolutionLabel) resolutionLayout.addWidget(self.resolutionSpinBox) resolutionLayout.addWidget(resolutionSlider) resolutionLayout.addWidget(resolutionInfoLabel) # Camera AA Layout cameraAaLayout = QtWidgets.QHBoxLayout() cameraAaLabel = QtWidgets.QLabel("Camera (AA):") cameraAaLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter) cameraAaLabel.setMinimumSize(75, 20) self.cameraAaSpinBox = QtWidgets.QSpinBox() self.cameraAaSpinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons) self.cameraAaSpinBox.setMaximum(64) self.cameraAaSpinBox.setMinimum(-64) self.cameraAaSpinBox.setValue(self.getSceneOption(4)) cameraAaSlider = QtWidgets.QSlider() cameraAaSlider.setOrientation(QtCore.Qt.Horizontal) cameraAaSlider.setValue(self.cameraAaSpinBox.value()) cameraAaSlider.setMinimum(-3) cameraAaSlider.setMaximum(16) cameraAaSlider.valueChanged[int].connect(self.cameraAaSpinBox.setValue) cameraAaLayout.addWidget(cameraAaLabel) cameraAaLayout.addWidget(self.cameraAaSpinBox) cameraAaLayout.addWidget(cameraAaSlider) # Render region layout renderRegionLayout = QtWidgets.QHBoxLayout() renderRegionLabel = QtWidgets.QLabel("Region X:") renderRegionLabel.setMinimumSize(75, 20) renderRegionLabel.setMaximumSize(75, 99) renderRegionLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter) self.renderRegionXSpinBox = QtWidgets.QSpinBox() renderRegionYLabel = QtWidgets.QLabel("Y:") self.renderRegionYSpinBox = QtWidgets.QSpinBox() renderRegionRLabel = QtWidgets.QLabel("R:") self.renderRegionRSpinBox = QtWidgets.QSpinBox() renderRegionTLabel = QtWidgets.QLabel("T:") self.renderRegionTSpinBox = QtWidgets.QSpinBox() renderRegionGetNukeButton = QtWidgets.QPushButton("Get") renderRegionGetNukeButton.setMaximumSize(35, 18) renderRegionGetNukeButton.clicked.connect(self.getNukeCropNode) renderRegionLayout.addWidget(renderRegionLabel) renderRegionLayout.addWidget(self.renderRegionXSpinBox) renderRegionLayout.addWidget(renderRegionYLabel) renderRegionLayout.addWidget(self.renderRegionYSpinBox) renderRegionLayout.addWidget(renderRegionRLabel) renderRegionLayout.addWidget(self.renderRegionRSpinBox) renderRegionLayout.addWidget(renderRegionTLabel) renderRegionLayout.addWidget(self.renderRegionTSpinBox) renderRegionLayout.addWidget(renderRegionGetNukeButton) for i in [self.renderRegionXSpinBox, self.renderRegionYSpinBox, self.renderRegionRSpinBox, self.renderRegionTSpinBox]: i.setRange(-99999,99999) i.setMaximumSize(50,99) i.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons) self.renderRegionRSpinBox.setValue(self.getSceneOption(2)) self.renderRegionTSpinBox.setValue(self.getSceneOption(3)) # Overscan Layout overscanLayout = QtWidgets.QHBoxLayout() overscanLabel = QtWidgets.QLabel("Overscan:") overscanLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter) overscanLabel.setMinimumSize(75, 20) self.overscanSpinBox = QtWidgets.QSpinBox() self.overscanSpinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons) self.overscanSpinBox.setMinimum(0) self.overscanSpinBox.setMaximum(9999) self.overscanSpinBox.setValue(0) overscanSlider = QtWidgets.QSlider() overscanSlider.setOrientation(QtCore.Qt.Horizontal) overscanSlider.setValue(0) overscanSlider.setMaximum(250) overscanSlider.valueChanged[int].connect(self.overscanSpinBox.setValue) overscanSetButton = QtWidgets.QPushButton("Set") overscanSetButton.setMaximumSize(35, 18) overscanSetButton.clicked.connect(self.setOverscan) overscanLayout.addWidget(overscanLabel) overscanLayout.addWidget(self.overscanSpinBox) overscanLayout.addWidget(overscanSlider) overscanLayout.addWidget(overscanSetButton) # Shaders layout shaderLayout = QtWidgets.QHBoxLayout() shaderLabel = QtWidgets.QLabel("Shader override:") shaderLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter) shaderLabel.setMaximumSize(90, 20) self.shaderComboBox = QtWidgets.QComboBox() self.shaderComboBox.addItem("Disabled") self.shaderComboBox.addItem("Checker") self.shaderComboBox.addItem("Grey") self.shaderComboBox.addItem("Mirror") self.shaderComboBox.addItem("Normal") self.shaderComboBox.addItem("Occlusion") self.shaderComboBox.addItem("UV") self.selectedShaderCheckbox = QtWidgets.QCheckBox("Selected objects only") shaderLayout.addWidget(shaderLabel) shaderLayout.addWidget(self.shaderComboBox) shaderLayout.addWidget(self.selectedShaderCheckbox) textureRepeatLayout = QtWidgets.QHBoxLayout() textureRepeatLabel = QtWidgets.QLabel("Texture repeat:") textureRepeatLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter) textureRepeatLabel.setMinimumSize(90, 20) self.textureRepeatSpinbox = QtWidgets.QSpinBox() self.textureRepeatSpinbox.setValue(1) self.textureRepeatSpinbox.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons) textureRepeatSlider = QtWidgets.QSlider() textureRepeatSlider.setMinimum(1) textureRepeatSlider.setMaximum(64) textureRepeatSlider.setOrientation(QtCore.Qt.Horizontal) textureRepeatSlider.valueChanged[int].connect(self.textureRepeatSpinbox.setValue) textureRepeatSlider.setValue(4) textureRepeatLayout.addWidget(textureRepeatLabel) textureRepeatLayout.addWidget(self.textureRepeatSpinbox) textureRepeatLayout.addWidget(textureRepeatSlider) # Ignore Layout ignoresGroupBox = QtWidgets.QGroupBox("Ignore") ignoresGroupBox.setMaximumSize(9999, 75) ignoresLayout = QtWidgets.QVBoxLayout(ignoresGroupBox) ignoreLayout = QtWidgets.QHBoxLayout() ignoreLabel = QtWidgets.QLabel("Ignore:") ignoreLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter) self.motionBlurCheckBox = QtWidgets.QCheckBox("Motion Blur") self.motionBlurCheckBox.setChecked(self.getSceneOption(5)) self.subdivsCheckBox = QtWidgets.QCheckBox("Subdivs") self.subdivsCheckBox.setChecked(self.getSceneOption(6)) self.displaceCheckBox = QtWidgets.QCheckBox("Displace") self.displaceCheckBox.setChecked(self.getSceneOption(7)) self.bumpCheckBox = QtWidgets.QCheckBox("Bump") self.bumpCheckBox.setChecked(self.getSceneOption(8)) self.sssCheckBox = QtWidgets.QCheckBox("SSS") self.sssCheckBox.setChecked(self.getSceneOption(9)) ignoreLayout.addWidget(self.motionBlurCheckBox) ignoreLayout.addWidget(self.subdivsCheckBox) ignoreLayout.addWidget(self.displaceCheckBox) ignoreLayout.addWidget(self.bumpCheckBox) ignoreLayout.addWidget(self.sssCheckBox) # Sequence Layout sequenceGroupBox = QtWidgets.QGroupBox('Sequence') sequenceGroupBox.setMaximumSize(9999, 75) sequenceLayout = QtWidgets.QHBoxLayout(sequenceGroupBox) self.seqCheckBox = QtWidgets.QCheckBox() self.seqCheckBox.setMaximumSize(15, 25) self.seqCheckBox.stateChanged.connect(sequence_toggled) self.startLabel = QtWidgets.QLabel('Start frame:') self.startLabel.setEnabled(False) self.startSpinBox = QtWidgets.QSpinBox() self.startSpinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons) self.startSpinBox.setRange(0, 99999) self.startSpinBox.setValue(self.getSceneOption(10)) self.startSpinBox.setEnabled(False) self.endLabel = QtWidgets.QLabel('End frame:') self.endLabel.setEnabled(False) self.endSpinBox = QtWidgets.QSpinBox() self.endSpinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons) self.endSpinBox.setRange(0, 99999) self.endSpinBox.setValue(self.getSceneOption(11)) self.endSpinBox.setEnabled(False) self.stepLabel = QtWidgets.QLabel('By frame:') self.stepLabel.setEnabled(False) self.stepSpinBox = QtWidgets.QSpinBox() self.stepSpinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.NoButtons) self.stepSpinBox.setValue(1) self.stepSpinBox.setRange(1, 100) self.stepSpinBox.setEnabled(False) sequenceLayout.addWidget(self.seqCheckBox) sequenceLayout.addWidget(self.startLabel) sequenceLayout.addWidget(self.startSpinBox) sequenceLayout.addWidget(self.endLabel) sequenceLayout.addWidget(self.endSpinBox) sequenceLayout.addWidget(self.stepLabel) sequenceLayout.addWidget(self.stepSpinBox) # Main Buttons Layout mainButtonslayout = QtWidgets.QHBoxLayout() startButton = QtWidgets.QPushButton("Start / Refresh") stopButton = QtWidgets.QPushButton("Stop") resetButton = QtWidgets.QPushButton("Reset") startButton.clicked.connect(self.render) stopButton.clicked.connect(self.stop) resetButton.clicked.connect(resetUI) mainButtonslayout.addWidget(startButton) mainButtonslayout.addWidget(stopButton) mainButtonslayout.addWidget(resetButton) # Add Layouts to Main generalLayout.addLayout(portLayout) generalLayout.addLayout(extraHostLayout) generalLayout.addLayout(cameraLayout) overridesLayout.addLayout(resolutionLayout) overridesLayout.addLayout(cameraAaLayout) overridesLayout.addLayout(renderRegionLayout) overridesLayout.addLayout(overscanLayout) overridesLayout.addLayout(shaderLayout) overridesLayout.addLayout(textureRepeatLayout) ignoresLayout.addLayout(ignoreLayout) mainLayout.addWidget(generalGroupBox) mainLayout.addWidget(overridesGroupBox) mainLayout.addWidget(ignoresGroupBox) mainLayout.addWidget(sequenceGroupBox) mainLayout.addLayout(mainButtonslayout) # UI Updates self.connect(portSlider, QtCore.SIGNAL("valueChanged(int)"), portUpdateUI) self.connect(resolutionSlider, QtCore.SIGNAL("valueChanged(int)"), resUpdateUI) self.connect(self.resolutionSpinBox, QtCore.SIGNAL("valueChanged(int)"), resInfoUpdate) # IPR Updates self.connect(self.cameraComboBox, QtCore.SIGNAL("currentIndexChanged(int)"), lambda: self.IPRUpdate(0)) self.connect(self.resolutionSpinBox, QtCore.SIGNAL("valueChanged(int)"), lambda: self.IPRUpdate(1)) self.connect(self.cameraAaSpinBox, QtCore.SIGNAL("valueChanged(int)"), lambda: self.IPRUpdate(2)) self.connect(self.renderRegionXSpinBox, QtCore.SIGNAL("valueChanged(int)"), lambda: self.IPRUpdate(1)) self.connect(self.renderRegionYSpinBox, QtCore.SIGNAL("valueChanged(int)"), lambda: self.IPRUpdate(1)) self.connect(self.renderRegionRSpinBox, QtCore.SIGNAL("valueChanged(int)"), lambda: self.IPRUpdate(1)) self.connect(self.renderRegionTSpinBox, QtCore.SIGNAL("valueChanged(int)"), lambda: self.IPRUpdate(1)) self.connect(self.overscanSpinBox, QtCore.SIGNAL("valueChanged(int)"), lambda: self.IPRUpdate(1)) self.connect(self.motionBlurCheckBox, QtCore.SIGNAL("toggled(bool)"), lambda: self.IPRUpdate(3)) self.connect(self.subdivsCheckBox, QtCore.SIGNAL("toggled(bool)"), lambda: self.IPRUpdate(3)) self.connect(self.displaceCheckBox, QtCore.SIGNAL("toggled(bool)"), lambda: self.IPRUpdate(3)) self.connect(self.bumpCheckBox, QtCore.SIGNAL("toggled(bool)"), lambda: self.IPRUpdate(3)) self.connect(self.sssCheckBox, QtCore.SIGNAL("toggled(bool)"), lambda: self.IPRUpdate(3)) self.connect(self.shaderComboBox, QtCore.SIGNAL("currentIndexChanged(int)"), lambda: self.IPRUpdate(4)) self.connect(self.textureRepeatSpinbox, QtCore.SIGNAL("valueChanged(int)"), lambda: self.IPRUpdate(5)) self.connect(self.selectedShaderCheckbox, QtCore.SIGNAL("toggled(bool)"), lambda: self.IPRUpdate(4)) self.setLayout(mainLayout)
def render(self): ''' Starts the render ''' try: # If MtoA was not found defaultTranslator = cmds.getAttr("defaultArnoldDisplayDriver.aiTranslator") except ValueError: cmds.warning("Current renderer is not set to Arnold.") return cmds.setAttr("defaultArnoldDisplayDriver.aiTranslator", "aton", type="string") # Updating extraHost and port from UI if self.defaultPort != 0: extraHost = self.extraHostLineEdit.text() port = self.portSpinBox.value() cmds.setAttr("defaultArnoldDisplayDriver.extraHost", extraHost, type="string") cmds.setAttr("defaultArnoldDisplayDriver.port", port) else: cmds.warning("Current renderer is not set to Arnold or Aton driver is not loaded.") return # Adding time changed callback if self.timeChangedCB == None: self.timeChangedCB = OM.MEventMessage.addEventCallback("timeChanged", self.timeChnaged) # Adding selection changed callback if self.selectionChangedCB == None: self.selectionChangedCB = OM.MEventMessage.addEventCallback('SelectionChanged', self.selectionChanged) try: # If render session is not started yet cmds.arnoldIpr(mode='stop') except RuntimeError: pass # Temporary makeing hidden cameras visible before scene export hCams = [] for i in cmds.listCameras(): if not cmds.getAttr(i + ".visibility"): hCams.append(i) sl = cmds.listRelatives(i, s=1) if sl and not cmds.getAttr(sl[0] + ".visibility"): hCams.append(sl[0]) for i in hCams: cmds.showHidden(i) # Set Progressive refinement to off if self.sequence_enabled: cmds.setAttr("defaultArnoldRenderOptions.progressive_rendering", False) try: # Start IPR cmds.arnoldIpr(cam=self.getCamera(), mode='start') sys.stdout.write("// Info: Aton - Render started.\n") except RuntimeError: cmds.warning("Current renderer is not set to Arnold.") # Sequence Rendering if self.sequence_enabled: self.frame_sequence.start() # Update IPR self.IPRUpdate() # Setting back to default for i in hCams: cmds.hide(i) cmds.setAttr("defaultArnoldDisplayDriver.aiTranslator", defaultTranslator, type="string") cmds.setAttr("defaultArnoldDisplayDriver.port", self.defaultPort)
def populateCameraBox(self): cameras = cmds.listCameras() self.cameraBox.addItems(cameras)
def render_all_cameras(): cameras = cmds.listCameras(perspective=True) for camera in cameras: if camera != "persp": cmds.Mayatomr(preview=True, camera=camera)
def use_camera(self, cameraName='perspShape'): for cam in cmds.listCameras(): camattr = cam + '.renderable' cmds.setAttr(camattr, 0) cmds.setAttr((cameraName + '.renderable'), 1)
def setupUi(self): def updateUi(): self.resolutionSpinBox.setValue(resolutionSlider.value()*5) self.cameraAaSpinBox.setValue(cameraAaSlider.value()) def regionUpdateUi(): self.renderRegionRSpinBox.setValue(self.getSceneOptions()["width"] * self.resolutionSpinBox.value() / 100) self.renderRegionTSpinBox.setValue(self.getSceneOptions()["height"] * self.resolutionSpinBox.value() / 100) def resetUi(*args): self.cameraComboBox.setCurrentIndex(0) self.resolutionSpinBox.setValue(100) self.cameraAaSpinBox.setValue(self.getSceneOptions()["AASamples"]) self.renderRegionXSpinBox.setValue(0) self.renderRegionYSpinBox.setValue(0) self.renderRegionRSpinBox.setValue(self.getSceneOptions()["width"]) self.renderRegionTSpinBox.setValue(self.getSceneOptions()["height"]) self.motionBlurCheckBox.setChecked(not self.getSceneOptions()["motionBlur"]) self.subdivsCheckBox.setChecked(not self.getSceneOptions()["subdivs"]) self.displaceCheckBox.setChecked(not self.getSceneOptions()["displace"]) self.bumpCheckBox.setChecked(not self.getSceneOptions()["bump"]) self.sssCheckBox.setChecked(not self.getSceneOptions()["sss"]) self.setObjectName(self.windowName) self.setWindowTitle("Aton") self.setWindowFlags(QtCore.Qt.Tool) self.setAttribute(QtCore.Qt.WA_DeleteOnClose) self.setMinimumSize(400, 200) self.setMaximumSize(400, 200) mainLayout = QtGui.QVBoxLayout() mainLayout.setContentsMargins(5,5,5,5) mainLayout.setSpacing(2) overridesGroupBox = QtGui.QGroupBox("Overrides") overridesLayout = QtGui.QVBoxLayout(overridesGroupBox) cameraLayout = QtGui.QHBoxLayout() cameraLabel = QtGui.QLabel("Camera:") cameraLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter) cameraLabel.setMaximumSize(75, 20) cameraLabel.setMinimumSize(75, 20) self.cameraComboBox = QtGui.QComboBox() self.cameraComboBoxDict = {} self.cameraComboBox.addItem("Current (%s)"%self.getSceneOptions()["camera"]) for i in cmds.listCameras(): self.cameraComboBox.addItem(i) self.cameraComboBoxDict[cmds.listCameras().index(i)+1] = i cameraLayout.addWidget(cameraLabel) cameraLayout.addWidget(self.cameraComboBox) resolutionLayout = QtGui.QHBoxLayout() resolutionLabel = QtGui.QLabel("Resolution %:") resolutionLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter) resolutionLabel.setMinimumSize(75, 20) self.resolutionSpinBox = QtGui.QSpinBox() self.resolutionSpinBox.setButtonSymbols(QtGui.QAbstractSpinBox.NoButtons) self.resolutionSpinBox.setMinimum(1) self.resolutionSpinBox.setMaximum(900) self.resolutionSpinBox.setValue(100) resolutionSlider = QtGui.QSlider() resolutionSlider.setOrientation(QtCore.Qt.Horizontal) resolutionSlider.setValue(20) resolutionSlider.setMaximum(20) resolutionSlider.sliderMoved.connect(self.resolutionSpinBox.setValue) resolutionLayout.addWidget(resolutionLabel) resolutionLayout.addWidget(self.resolutionSpinBox) resolutionLayout.addWidget(resolutionSlider) cameraAaLayout = QtGui.QHBoxLayout() cameraAaLabel = QtGui.QLabel("Camera (AA):") cameraAaLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter) cameraAaLabel.setMinimumSize(75, 20) self.cameraAaSpinBox = QtGui.QSpinBox() self.cameraAaSpinBox.setButtonSymbols(QtGui.QAbstractSpinBox.NoButtons) self.cameraAaSpinBox.setMaximum(64) self.cameraAaSpinBox.setValue(self.getSceneOptions()["AASamples"]) cameraAaSlider = QtGui.QSlider() cameraAaSlider.setOrientation(QtCore.Qt.Horizontal) cameraAaSlider.setValue(self.cameraAaSpinBox.value()) cameraAaSlider.setMaximum(16) cameraAaSlider.sliderMoved.connect(self.cameraAaSpinBox.setValue) cameraAaLayout.addWidget(cameraAaLabel) cameraAaLayout.addWidget(self.cameraAaSpinBox) cameraAaLayout.addWidget(cameraAaSlider) renderRegionLayout = QtGui.QHBoxLayout() renderRegionLabel = QtGui.QLabel("Region X:") renderRegionLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter) self.renderRegionXSpinBox = QtGui.QSpinBox() renderRegionYLabel = QtGui.QLabel("Y:") self.renderRegionYSpinBox = QtGui.QSpinBox() renderRegionRLabel = QtGui.QLabel("R:") self.renderRegionRSpinBox = QtGui.QSpinBox() renderRegionTLabel = QtGui.QLabel("T:") self.renderRegionTSpinBox = QtGui.QSpinBox() renderRegionCheckBox = QtGui.QCheckBox() renderRegionGetNukeButton = QtGui.QPushButton("Get") renderRegionGetNukeButton.clicked.connect(self.getNukeCropNode) renderRegionCheckBox.setLayoutDirection(QtCore.Qt.RightToLeft) renderRegionLayout.addWidget(renderRegionLabel) renderRegionLayout.addWidget(self.renderRegionXSpinBox) renderRegionLayout.addWidget(renderRegionYLabel) renderRegionLayout.addWidget(self.renderRegionYSpinBox) renderRegionLayout.addWidget(renderRegionRLabel) renderRegionLayout.addWidget(self.renderRegionRSpinBox) renderRegionLayout.addWidget(renderRegionTLabel) renderRegionLayout.addWidget(self.renderRegionTSpinBox) renderRegionLayout.addWidget(renderRegionGetNukeButton) for i in [renderRegionLabel, renderRegionYLabel, renderRegionRLabel, renderRegionTLabel]: i.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter) for i in [self.renderRegionXSpinBox, self.renderRegionYSpinBox, self.renderRegionRSpinBox, self.renderRegionTSpinBox]: i.setRange(0,99999) i.setMaximumSize(60,25) i.setButtonSymbols(QtGui.QAbstractSpinBox.NoButtons) self.renderRegionRSpinBox.setValue(self.getSceneOptions()["width"]) self.renderRegionTSpinBox.setValue(self.getSceneOptions()["height"]) ignoreLayout = QtGui.QHBoxLayout() ignoreLabel = QtGui.QLabel("Ignore:") ignoreLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignVCenter) self.motionBlurCheckBox = QtGui.QCheckBox("Motion Blur") self.motionBlurCheckBox.setChecked(not self.getSceneOptions()["motionBlur"]) self.subdivsCheckBox = QtGui.QCheckBox("Subdivs") self.subdivsCheckBox.setChecked(not self.getSceneOptions()["subdivs"]) self.displaceCheckBox = QtGui.QCheckBox("Displace") self.displaceCheckBox.setChecked(not self.getSceneOptions()["displace"]) self.bumpCheckBox = QtGui.QCheckBox("Bump") self.bumpCheckBox.setChecked(not self.getSceneOptions()["bump"]) self.sssCheckBox = QtGui.QCheckBox("SSS") self.sssCheckBox.setChecked(not self.getSceneOptions()["sss"]) ignoreLayout.addWidget(self.motionBlurCheckBox) ignoreLayout.addWidget(self.subdivsCheckBox) ignoreLayout.addWidget(self.displaceCheckBox) ignoreLayout.addWidget(self.bumpCheckBox) ignoreLayout.addWidget(self.sssCheckBox) mainButtonslayout = QtGui.QHBoxLayout() startButton = QtGui.QPushButton("Start / Refresh") stopButton = QtGui.QPushButton("Stop") resetButton = QtGui.QPushButton("Reset") startButton.clicked.connect(self.render) stopButton.clicked.connect(self.stop) resetButton.clicked.connect(resetUi) mainButtonslayout.addWidget(startButton) mainButtonslayout.addWidget(stopButton) mainButtonslayout.addWidget(resetButton) overridesLayout.addLayout(cameraLayout) overridesLayout.addLayout(resolutionLayout) overridesLayout.addLayout(cameraAaLayout) overridesLayout.addLayout(renderRegionLayout) overridesLayout.addLayout(ignoreLayout) mainLayout.addWidget(overridesGroupBox) mainLayout.addLayout(mainButtonslayout) self.connect(resolutionSlider, QtCore.SIGNAL("valueChanged(int)"), updateUi) self.connect(self.resolutionSpinBox, QtCore.SIGNAL("valueChanged(int)"), regionUpdateUi) self.connect(self.resolutionSpinBox, QtCore.SIGNAL("editingFinished()"), regionUpdateUi) self.connect(cameraAaSlider, QtCore.SIGNAL("valueChanged(int)"), updateUi) self.setLayout(mainLayout)
def get_camera(self): camera_animation = mc.listCameras()[0] mc.lookThru (camera_animation) print camera_animation
def execute(self, tasks, work_template, comment, thumbnail_path, sg_task, primary_task, primary_publish_path, progress_cb, **kwargs): """ Main hook entry point :param tasks: List of secondary tasks to be published. Each task is a dictionary containing the following keys: { item: Dictionary This is the item returned by the scan hook { name: String description: String type: String other_params: Dictionary } output: Dictionary This is the output as defined in the configuration - the primary output will always be named 'primary' { name: String publish_template: template tank_type: String } } :param work_template: template This is the template defined in the config that represents the current work file :param comment: String The comment provided for the publish :param thumbnail: Path string The default thumbnail provided for the publish :param sg_task: Dictionary (shotgun entity description) The shotgun task to use for the publish :param primary_publish_path: Path string This is the path of the primary published file as returned by the primary publish hook :param progress_cb: Function A progress callback to log progress during pre-publish. Call: progress_cb(percentage, msg) to report progress to the UI :param primary_task: The primary task that was published by the primary publish hook. Passed in here for reference. This is a dictionary in the same format as the secondary tasks above. :returns: A list of any tasks that had problems that need to be reported in the UI. Each item in the list should be a dictionary containing the following keys: { task: Dictionary This is the task that was passed into the hook and should not be modified { item:... output:... } errors: List A list of error messages (strings) to report } """ def FindFirstImageOfSequence(FolderPath): ImgsList=[] for file in (os.listdir(FolderPath)): SeqImgName = str.split(str(file),".")[1] ImgsList.append(SeqImgName) First_elmnt=ImgsList[0] return First_elmnt def FindFirstImageOfSequence(FolderPath): ImgsList=[] for file in (os.listdir(FolderPath)): if file.endswith(".png"): SeqImgName = str.split(str(file),".")[1] ImgsList.append(int(SeqImgName)) First_elmnt=ImgsList[0] return First_elmnt def FindLastImageOfSequence(FolderPath): ImgsList=[] for file in (os.listdir(FolderPath)): if file.endswith(".png"): SeqImgName = str.split(str(file),".")[1] ImgsList.append(int(SeqImgName)) Last_elmnt=ImgsList[-1] return Last_elmnt def FindLengthOfSequence(FolderPath): ImgsList=[] for file in (os.listdir(FolderPath)): if file.endswith(".png"): SeqImgName = str.split(str(file),".")[1] ImgsList.append(int(SeqImgName)) Length_seq=len(ImgsList) return Length_seq def MakeListOfSequence(FolderPath): ImgsList=[] for file in (os.listdir(FolderPath)): if file.endswith(".png"): SeqImgName = str.split(str(file),".")[1] ImgsList.append(int(SeqImgName)) return ImgsList def FindMissingFramesFromSequence(SequenceSet,inputStart,inputEnd): # my_list= list(range( int(FindFirstImageOfSequence(os.path.dirname(RenderPath))) , int(FindLastImageOfSequence(os.path.dirname(RenderPath))) )) my_list= list(range( inputStart, inputEnd)) MissingFrames = set(my_list)-set(SequenceSet) return sorted(MissingFrames) def combineMediaFiles(fileList,output,concatTxt=None, ffmpeg_path = "ffmpeg"): rootPath = str.split(str(fileList[0]),"/q")[0] mediaType = str.rsplit(str(fileList[0]),".",1)[1] mediaFilePresent = False mediaListFile = rootPath+'/tmp_'+mediaType+'List.txt' if concatTxt != None: mediaListFile = concatTxt with open(mediaListFile, 'w') as mediaTxtFile: for mediaFile in fileList: if os.path.exists(mediaFile): mediaFilePresent = True #print mediaFile shotPath = str.split(str(mediaFile),"/")[-1] if 'Sequences' in mediaFile: shotPath = str.split(str(mediaFile),"Sequences")[1][1:] if concatTxt != None: shotPath = str.split(str(mediaFile),os.path.dirname(concatTxt))[1][1:] mediaTxtFile.write("file '" +shotPath+"'") mediaTxtFile.write('\r\n') else: print("AUDIO FILE NOT FOUND : " + str(mediaFile)) # results.append({"task":"audio stuff", "errors":("AUDIO FILE NOT FOUND : " + str(mediaFile))}) if mediaFilePresent: # command = os.path.normpath(ffmpeg_path + ' -f concat -i '+mediaListFile+' -c copy '+output + " -y") # command = os.path.normpath(ffmpeg_path + ' -f concat -r 24 -i '+mediaListFile+' -vcodec mjpeg -r 24 -qscale 1 -pix_fmt yuvj420p -acodec pcm_s16le -ar 48000 -ac 2 '+output + " -y") command = os.path.normpath(ffmpeg_path + ' -f concat -r 24 -i '+mediaListFile+' -vcodec mjpeg -r 24 -qscale 1 -pix_fmt yuvj420p '+output + " -y") command = str.replace(str(command), "\\" , "/") #print command value = subprocess.call(command, creationflags=CREATE_NO_WINDOW, shell=False) return output else: return None def findLastVersion(FolderPath,returnFile=False,returnFilePath=False): if os.path.exists(FolderPath): fileList=os.listdir(FolderPath) else: return 0 if fileList != []: fileList.sort() lastVersion = fileList[-1] version = int(re.findall('\d+', lastVersion)[-1]) if returnFilePath: return FolderPath+"/"+lastVersion if returnFile: return lastVersion return version #return str(FolderPath+"/"+lastVersion) else: return 0 def orderMovs(movList,orderList): tmp = "" def setAudioToCorrectPath(): scenePath = cmds.file(q=True,sceneName=True) scene_template = tk.template_from_path(scenePath) flds = scene_template.get_fields(scenePath) audio_template = tk.templates["shot_published_audio"] tank = sgtk.tank_from_entity('Project', 66) allShots = cmds.ls(type="shot") allAudio = cmds.ls(type="audio") reportList = [] returnList = [] for seqShot in allShots: audio = cmds.shot(seqShot,q=True,audio=True) audioFile = cmds.getAttr(audio+".filename")# "W:/RTS/1_PREPROD/13_ANIMATIC/q340/splitshots/wav new 01/q340_s260_snd_v001.wav"; #print audioFile flds['Shot'] = flds['Sequence']+"_"+seqShot audioOutputFile = audio_template.apply_fields(flds) #audioOutputPath = str.replace(str(audioOutputPath),"\\","/") #print audioFile audioFile = str.replace(str(audioFile),"Z:/Richard The Stork","W:/RTS") audioOutputPath = str.rsplit(str(audioOutputFile),"\\",1)[0] print audioOutputPath if os.path.exists(audioOutputPath): audioOutputFile = findLastVersion(audioOutputPath,True,True) if audioOutputFile != 0: newAudio = str.rsplit(audioOutputFile,"/",1)[-1] newAudio = str.split(newAudio,".")[0] print newAudio cmds.delete(audio) ref = cmds.file( audioOutputFile, r=True, type="audio",mergeNamespacesOnClash=False, namespace="audio") # offset = cmds.getAttr(seqShot+".sequenceStartFrame") cmds.setAttr(newAudio+".offset", offset) cmds.connectAttr(newAudio+".message", seqShot+".audio") shotEnd = cmds.getAttr(seqShot +".sequenceEndFrame") audioEnd = cmds.getAttr(newAudio+".endFrame") if audioEnd < shotEnd: reportList += [newAudio + " is shorter than shot !!!"] if audioEnd > shotEnd: reportList += [newAudio + " was longer than shot. now cut to match!!!"] cmds.setAttr(newAudio+".endFrame",shotEnd+1) returnList += [newAudio] else: print "skipped ", audio for report in reportList: print report return returnList def getStereoCams(sht): leftCam = "" rightCam = "" prevCamShape = cmds.shot(sht,q=True,cc=True) prevCam = cmds.listRelatives(prevCamShape,p=True) prevCamParent = cmds.listRelatives(prevCam,p=True) for obj in cmds.listRelatives(prevCamParent): if cmds.objectType(obj) == 'stereoRigTransform': leftCam = str(cmds.listConnections(obj+".leftCam",source=True)[0]) rightCam = str(cmds.listConnections(obj+".rightCam",source=True)[0]) return[leftCam,rightCam] wtd_fw = self.load_framework("tk-framework-wtd_v0.x.x") ffmpeg = wtd_fw.import_module("pipeline.ffmpeg") # ffmpeg.test() def _register_publish(path, name, sg_task, publish_version, tank_type, comment, thumbnail_path, context = None): """ Helper method to register publish using the specified publish info. """ ctx = self.parent.tank.context_from_path(str(path)) # construct args: args = {"tk": self.parent.tank,"sg_status_list": "cmpt","context": context,"comment": comment,"path": path,"name": name,"version_number": publish_version,"thumbnail_path": thumbnail_path,"sg_task": sg_task,"published_file_type":tank_type,"user": ctx.user,"created_by": ctx.user} print "-------------------" for a in args: print a , args[a] # print args # register publish; sg_data = tank.util.register_publish(**args) print 'Register in shotgun done!' return sg_data def orderShots(shotDictList): valueOrderList = [] valueOrderListSecondary = [] listIndex = 0 for sht in shotDictList: orderNr = str("00000"+str(sht['sg_cut_order']))[-4:] addValue = str(listIndex) if sht['sg_status_list'] == 'omt': addValue = 'omt' if sht['parent_shots'] == []: valueOrderList += [orderNr+">>"+addValue] else: valueOrderListSecondary += [orderNr+">>"+addValue] listIndex += 1 valueOrderList = sorted(valueOrderList)+sorted(valueOrderListSecondary) orderedList = [] for sht in valueOrderList: addValue = str.split(sht,'>>')[1] if addValue != "omt": orderedList+=[shotDictList[int(addValue)]] return orderedList def checkSoundCut(): allShots = cmds.ls(type="shot") allAudio = cmds.ls(type="audio") sequenceList = [] for seqShot in allShots: #print "---", seqShot shotStart = int(cmds.getAttr(seqShot +".sequenceStartFrame")) shotEnd = int(cmds.getAttr(seqShot +".sequenceEndFrame")) #print shotStart #print shotEnd sequenceList.append({"shot": seqShot}) audioList = [] audioIn = [] audioOut = [] for aud in allAudio: add = False aIn = 0 aOut= 0 audioStart = int(cmds.getAttr(aud+".offset" )) audioEnd = int(cmds.getAttr(aud+".endFrame"))-1 audioOriginalDuration = int(cmds.getAttr(aud+".duration")) audioDuration = audioEnd-audioStart if shotStart < audioStart < shotEnd: add = True if audioEnd > shotEnd: aOut = shotEnd - audioStart if shotStart < audioEnd < shotEnd: add = True aIn = audioDuration-(audioEnd-shotStart) if audioStart < shotStart < audioEnd: add = True aIn = shotStart - audioStart if audioStart < shotEnd < audioEnd: add = True aOut = audioDuration-(audioEnd-shotEnd)+1 if add: audioList.append([aud,aIn,aOut]) sequenceList[-1]["audioList"] = audioList tmpFolder = "C:/temp" if not os.path.exists(tmpFolder): os.makedirs(tmpFolder) scenePath = cmds.file(q=True,sceneName=True) scene_template = tk.template_from_path(scenePath) audio_template = tk.templates["shot_published_audio"] flds = scene_template.get_fields(scenePath) flds['Step'] = 'snd' soundCheckList = ["These audio cuts dont match the camera cuts."] for audio in sequenceList: if audio['audioList'] != []: #print audio['shot'] flds['Shot'] = flds['Sequence']+"_"+str(audio['shot']) i=0 newAudio =[] soundCheckList += [""] soundCheckList += ["audio files overlapping shot " + audio['shot']] for aud in audio['audioList']: inSec = float(aud[1])/24 outSec = float(aud[2])/24 print aud[0],inSec,outSec # print "------>>>>>>>>>", aud soundCheckList += [aud[0] +" cut in offset = "+ str(aud[1]) +" cut out offset = "+ str(aud[2])] return sequenceList def MakeSoundCuts(ffmpegPath,Input,Output,Position,Duration ): time01= Position time02= Duration if os.path.isfile(Output): os.remove(Output) subprocess.call('%s -i "%s" -ss "%s" -t "%s" -acodec copy "%s"' %(ffmpegPath,Input,time01,time02,Output)) def fixSound(sequenceList): tmpFolder = "C:/temp" if not os.path.exists(tmpFolder): os.makedirs(tmpFolder) scenePath = cmds.file(q=True,sceneName=True) scene_template = tk.template_from_path(scenePath) audio_template = tk.templates["shot_published_audio"] flds = scene_template.get_fields(scenePath) flds['Step'] = 'snd' for audio in sequenceList: if audio['audioList'] != []: print audio['shot'] flds['Shot'] = flds['Sequence']+"_"+str(audio['shot']) i=0 newAudio =[] for aud in audio['audioList']: inSec = float(aud[1])/24 outSec = float(aud[2])/24 print aud[0],inSec,outSec if outSec == 0.0: outSec = 10000 input = cmds.getAttr(aud[0]+'.filename') output = tmpFolder+"/"+audio['shot']+"_part"+str(i)+str.split(str(input),"/")[-1] i+=1 MakeSoundCuts(ffmpegPath,input,output,inSec,outSec) newAudio +=[output] audioOutput = audio_template.apply_fields(flds) # version UP latestVersion = findLastVersion(os.path.dirname(audioOutput))+1 flds['version'] = latestVersion audioOutput = audio_template.apply_fields(flds) # combine mergedAudio = combineMediaFiles(newAudio,audioOutput,tmpFolder+"/tmp_wavList.txt",ffmpegPath) ver = str(findLastVersion(os.path.dirname(audioOutput),True)) newAudioName = str.rsplit(ver,"_",1)[0] cmds.file( audioOutput, i=True, type="audio",mergeNamespacesOnClash=False, namespace=flds['Shot']+"_audio",resetError=True) crappyAudioName = str.split(ver,".")[0] cmds.rename(crappyAudioName,newAudioName) cutIn = cmds.getAttr(audio['shot']+".startFrame") cutOut = cmds.getAttr(audio['shot']+".endFrame") cutDuration = cutOut-cutIn cmds.setAttr(newAudioName+".offset", cutIn) cmds.setAttr(newAudioName+".sourceEnd",cutDuration+1) cmds.connectAttr(newAudioName+".message", audio['shot']+".audio",f=True) print "-----------------------------------------------------------------------------________________-------------------------------------------------------------------------" # PUBLISH file_template = tk.template_from_path(audioOutput) flds = file_template.get_fields(audioOutput) print audioOutput ctx = tk.context_from_path(audioOutput) print ctx sg_task = tk.shotgun.find("Task",[['content', 'is',"Sound"],["entity",'is',ctx.entity]], ['id']) try: sg_task = sg_task[0] except indexError: print "SKIPPED - are the folders already created on shotgun?????" errors.append("SKIPPED - are the folders already created on shotgun?????") if sg_task != []: _register_publish(audioOutput,newAudioName,sg_task,flds['version'],"Audio", "publish","",ctx) else: print "SKIPPED - are the folders already created on shotgun?????" errors.append("SKIPPED - are the folders already created on shotgun?????") #popup('error',"skipped creation of "+newAudioName+" - are the folders already created on shotgun??") for audio in sequenceList: if audio['audioList'] != []: for aud in audio['audioList']: if cmds.objExists(aud[0]): print "------------------",aud[0],"------------------------" cmds.delete(aud[0]) shots = cmds.ls(type="shot") shotCams = [] unUsedCams = [] sides=["L","R"] pbShots = [] CutInList = [] parentShotList = [] # these booleans can be used for noOverscan = False resetCutIn = False # template stuff... # tk = tank.tank_from_path("W:/RTS/Tank/config") tk = self.parent.tank scenePath = cmds.file(q=True,sceneName=True) scene_template = tk.template_from_path(scenePath) flds = scene_template.get_fields(scenePath) flds['width'] = 1724 flds['height'] = 936 pb_template = tk.templates["maya_seq_playblast_publish"] pb_template_current = tk.templates["maya_seq_playblast_current"] pbArea_template = tk.templates["maya_seq_playblast_publish_area"] audio_template = tk.templates["shot_published_audio"] mov_template = tk.templates["maya_seq_playblast_publish_currentshots_mov"] concatMovTxt = tk.templates["maya_seq_playblast_publish_concatlist"] pbMov = tk.templates["maya_seq_playblast_publish_mov"] pbMp4 = tk.templates["maya_seq_playblast_review_mp4"] # get extra shot info through shotgun fields = ['id'] sequence_id = self.parent.shotgun.find('Sequence',[['code', 'is',flds['Sequence'] ]], fields)[0]['id'] fields = ['id', 'code', 'sg_asset_type','sg_cut_order','sg_cut_in','sg_cut_out','sg_cut_duration','sg_status_list','parent_shots'] filters = [['sg_sequence', 'is', {'type':'Sequence','id':sequence_id}]] assets= self.parent.shotgun.find("Shot",filters,fields) results = [] errors = [] ffmpegPath = '"'+os.environ.get('FFMPEG_PATH') if "ffmpeg.exe" not in ffmpegPath: ffmpegPath += "\\ffmpeg.exe" ffmpegPath += '"' soundFixList = checkSoundCut() print soundFixList fixSound(soundFixList) for task in tasks: item = task["item"] output = task["output"] errors = [] #get shots from scan scene if item["type"] == "shot": shotTask = [item["name"]][0] pbShots += [shotTask] # get corresponding cut values from shotgun for sht in assets: shot_from_shotgun = str.split(sht['code'],"_")[1] if shot_from_shotgun == shotTask: CutInList += [sht['sg_cut_in']] parentShotList += [sht['parent_shots']] # set extra settings if item["type"] == "setting": if item["name"]=="overscan": noOverscan = True if item["name"]=="set Cut in": resetCutIn = True # if there is anything to report then add to result if len(errors) > 0: # add result: results.append({"task":task, "errors":errors}) # temporarily hide cams and curves modPan = cmds.getPanel(type="modelPanel") for pan in modPan: cmds.modelEditor( pan,e=True, alo= False, polymeshes =True ) cmds.modelEditor( pan,e=True,displayAppearance="smoothShaded") cmds.modelEditor( pan,e=True,displayTextures=True) allobjs = cmds.ls(type= "transform") boundingboxObjsList = [] for i in allobjs: if cmds.getAttr(i+".overrideEnabled"): if cmds.getAttr(i+".overrideLevelOfDetail") == 1: boundingboxObjsList.append(i) cmds.setAttr(i+".overrideLevelOfDetail",0) currentselection= cmds.ls(sl=True) cmds.select(cl=True) cmds.headsUpDisplay(lv=False) CamsList = cmds.listCameras() for Cam in CamsList: cmds.camera(Cam, e=True, dr=True, dgm=True,ovr=1.3) #Get USER USER = sgtk.util.get_current_user(tk) if USER == None: USER = {'email': '*****@*****.**', 'id': 63, 'image': 'https://sg-media-usor-01.s3.amazonaws.com/7df0575d53fc3b61c36343837da18effb72bb6ff/86f714413d0a2c68382b706e8e45991d41a0ffed/thumb_t.jpg?AWSAccessKeyId=AKIAIFHY52V77FIVWKLQ&Expires=1415784134&Signature=%2Ff4qeNQMq4oHscIKePb1IrtRPZQ%3D', 'login': '******', 'name': 'WTD RND', 'type': 'HumanUser'} # audio stuff ''' stepVersion = flds['version'] step = flds['Step'] audioList = [] for sht in shots: #print sht flds['Shot'] = (flds['Sequence']+"_"+sht) flds['version'] = findLastVersion(os.path.dirname(audio_template.apply_fields(flds))) flds['Step'] = 'snd' print flds['version'] if flds['version'] > 0: audioList += [str.replace(str(audio_template.apply_fields(flds)),"\\","/")] flds['Shot'] = flds['Sequence'] flds['version'] = stepVersion #set version back flds['Step'] = step audioOutput = pbArea_template.apply_fields(flds)+"/"+flds['Sequence']+"_"+flds['Step']+".wav" if audioList != []: combinedAudio = combineMediaFiles(audioList,audioOutput, ffmpeg_path = ffmpegPath) print ("combined audio at " + audioOutput) ''' # replacedAudio = setAudioToCorrectPath() # for aud in replacedAudio: # results.append({"task":{'item': aud , 'output': 'replaced' }}) Test = True; #Test = False; if Test: j = 0 RenderPath = "" for pbShot in pbShots: CutIn = CutInList[j] if parentShotList[j] != []: parentShot = str.split(parentShotList[j][0]['name'],"_")[-1] j += 1 sequenceName = flds ['Sequence'] shotName = pbShot # ... correct this in the templates? flds['Shot'] = flds['Sequence']+"_"+pbShot #get camera name from sequence shot shotCam = cmds.shot(pbShot, q=True, currentCamera=True) # overscanValue = cmds.getAttr(shotCam+".overscan") cmds.setAttr(shotCam+".overscan", 1.3) if noOverscan: cmds.setAttr(shotCam+".overscan", 1) shotCams = [shotCam] previewCam = shotCam if flds['Step'] == 's3d': shotCams = getStereoCams(pbShot) s = 0 for shotCam in shotCams: side = sides[s] s += 1 if flds['Step'] == 's3d': flds['eye'] = side cmds.shot(pbShot, e=True, currentCamera=shotCam) focal = cmds.getAttr(shotCam+'.focalLength') # make outputPaths from templates RenderPath = pb_template.apply_fields(flds) pbPath = str.split(str(RenderPath),".")[0] renderPathCurrent = pb_template_current.apply_fields(flds) pbPathCurrent = str.split(str(renderPathCurrent),".")[0] if not os.path.exists(os.path.dirname(pbPathCurrent)): os.makedirs(os.path.dirname(pbPathCurrent)) pbPathCurrentMov = mov_template.apply_fields(flds) if not os.path.exists(os.path.dirname(pbPathCurrentMov)): os.makedirs(os.path.dirname(pbPathCurrentMov)) # report progress: progress_cb(0, "Publishing", task) shotStart = cmds.shot(pbShot,q=True,sequenceStartTime=True) shotEnd = cmds.shot(pbShot,q=True,sequenceEndTime=True) progress_cb(25, "Making playblast %s" %pbShot) cmds.playblast(indexFromZero=False,filename=(pbPath),fmt="iff",compression="png",wh=(flds['width'], flds['height']),startTime=shotStart,endTime=shotEnd,sequenceTime=1,forceOverwrite=True, clearCache=1,showOrnaments=1,percent=100,offScreen=True,viewer=False,useTraxSounds=True) progress_cb(50, "Placing Slates %s" %pbShot) Film = "Richard the Stork" #GET CURRENT DATE today = datetime.date.today() todaystr = today.isoformat() """ Adding Slates to playblast files """ for i in range(int(shotStart),int(shotEnd)+1): FirstPartName = RenderPath.split( '%04d' )[0] EndPartName = '%04d' % i + RenderPath.split( '%04d' )[-1] ImageFullName = FirstPartName + EndPartName pbFileCurrent = pbPathCurrent+"."+EndPartName print 'fld ===>',flds print 'USER===>',USER ffmpeg.ffmpegMakingSlates(inputFilePath= ImageFullName, outputFilePath= ImageFullName, topleft = flds ['Sequence']+"_"+flds['Step']+"_v"+str('%03d' % (flds['version'])), topmiddle = Film, topright = str(int(CutIn))+"-"+str('%04d' %(i-int(shotStart)+CutIn))+"-"+str('%04d' %(int(shotEnd)-int(shotStart)+CutIn))+" "+str('%04d' %(i-int(shotStart)+1))+"-"+str('%04d' %(int(shotEnd)-int(shotStart)+1)), bottomleft = shotName+" - focal_Length "+ str(focal), bottommiddle = USER['name'], bottomright = todaystr , ffmpegPath =ffmpegPath, font = "C:/Windows/Fonts/arial.ttf" ) print("COPYING PNG "+ImageFullName+" TO "+pbFileCurrent+" FOR SHOT " + shotName) shutil.copy2(ImageFullName, pbFileCurrent) shotAudio = audio_template.apply_fields(flds) shotAudio = findLastVersion(os.path.dirname(shotAudio),True,True) if shotAudio == 0: print " NO PUBLISHED AUDIO FOUND" for aud in [parentShot,pbShot]: try: audio = cmds.shot(pbShot,q=True,audio=True) shotAudio = '"'+cmds.getAttr(audio+".filename")+'"' shotAudio = str.replace(str(shotAudio),"Z:/Richard The Stork/",'W:/RTS/') print "used audio from maya : ", shotAudio except: shotAudio = '' print ffmpeg.ffmpegMakingMovie(inputFilePath=renderPathCurrent, outputFilePath=pbPathCurrentMov, audioPath=shotAudio, start_frame=int(shotStart),end_frame=int(shotEnd), framerate=24 , encodeOptions='libx264',ffmpegPath=ffmpegPath) # end_frame=shotEnd cmds.shot(pbShot, e=True, currentCamera=previewCam) if currentselection != []: cmds.select(currentselection) if flds['Step'] == 'lay': sides = [''] for side in sides: if flds['Step'] == 's3d': flds['eye'] = side RenderPath = pb_template.apply_fields(flds) for i in boundingboxObjsList: cmds.setAttr(i+".overrideEnabled",True) cmds.setAttr(i+".overrideLevelOfDetail",1) sequenceTest= MakeListOfSequence(os.path.dirname(RenderPath)) FistImg= int(FindFirstImageOfSequence(os.path.dirname(RenderPath))) LastImg= int(FindLastImageOfSequence(os.path.dirname(RenderPath))) FramesMissingList= FindMissingFramesFromSequence( sequenceTest ,FistImg ,LastImg ) """ Copy empty frames """ # blackFrame = False # blackFrameName = "" # for n in FramesMissingList: # if blackFrame == False: # blackFrameName = FirstPartName+str('%04d' % n)+".png" # value = subprocess.call('%s -f lavfi -i color=c=black:s="%s" -vframes 1 "%s"' %(ffmpegPath,(str(flds['width'])+"x"+ str(flds['height'])),FirstPartName+str('%04d' % n)+".png")) # print '%s -f lavfi -i color=c=black:s="%s" -vframes 1 "%s"' %(ffmpegPath,(str(flds['width'])+"x"+ str(flds['height'])),FirstPartName+str('%04d' % n)+".png") # blackFrame = True # newFrameName = FirstPartName+str('%04d' % n)+".png" # if blackFrameName != newFrameName: # shutil.copy2(blackFrameName, newFrameName) FirstImageNumber= FindFirstImageOfSequence(os.path.dirname(RenderPath)) FirstImageNumberSecond= FirstImageNumber/24 ''' makeSeqMov ''' concatTxt = concatMovTxt.apply_fields(flds) pbMovPath = pbMov.apply_fields(flds) pbMp4Path = pbMp4.apply_fields(flds) pbMp4Path = str.replace(str(pbMp4Path),'\\','/') pbMovFile = str.split(str(pbMovPath),os.path.dirname(pbMovPath))[1][1:] # movList = [] # for mov in os.listdir(os.path.dirname(pbPathCurrentMov)): # movList += [os.path.dirname(pbPathCurrentMov)+"/"+mov] # print movList assetsOrdered = orderShots(assets) movList = [] for ass in assetsOrdered: for mov in os.listdir(os.path.dirname(pbPathCurrentMov)): movName = str.split(str(mov),".")[0] if ass['code'] == movName: movList += [os.path.dirname(pbPathCurrentMov)+"/"+mov] makeSeqMov = True if makeSeqMov: if not os.path.exists(os.path.dirname(pbMovPath)): self.parent.ensure_folder_exists(os.path.dirname(pbMovPath)) # os.makedirs(os.path.dirname(pbMovPath)) if not os.path.exists(os.path.dirname(pbMp4Path)): print "creating", pbMp4Path self.parent.ensure_folder_exists(os.path.dirname(pbMp4Path)) print "created", pbMp4Path # os.makedirs(os.path.dirname(pbMp4Path)) """ SEQUENCE MOV and MP4 Creation """ print "Making mov and mp4: \n", pbMovPath, ' --- ', pbMp4Path print combineMediaFiles(movList,pbMovPath,concatTxt,ffmpegPath) amount = 0 while not os.path.exists(pbMovPath) and amount < 10: time.sleep(1) amount += 1 print ffmpeg.ffmpegMakingMovie(pbMovPath,pbMp4Path,encodeOptions="libx264",ffmpegPath=ffmpegPath) # ---------------------------------------------- # UPLOAD MP4 # ---------------------------------------------- upload = True if upload: user = self.parent.context.user scenePath = cmds.file(q=True,sceneName=True) ctx = self.parent.tank.context_from_path(scenePath) fields = ['id'] sg_task = self.parent.shotgun.find("Task",[['content', 'is',ctx.step['name']],["entity",'is',ctx.entity]], fields) data = {'project': {'type':'Project','id':66}, 'entity': {'type':'Sequence', 'id':int(sequence_id)}, 'code': flds ['Sequence']+"_"+flds['Step']+"_v"+str('%03d' % (flds['version'])), 'sg_path_to_frames':os.path.dirname(RenderPath), 'sg_path_to_movie':pbMovPath, 'user': user, 'created_by': user, 'updated_by': user, 'sg_task': sg_task[0] } if not os.path.exists(os.path.dirname(pbMp4Path)): os.makedirs(os.path.dirname(pbMp4Path)) result = tk.shotgun.create('Version', data) print "---> UPLOADING ",pbMp4Path executed = tk.shotgun.upload("Version",result['id'],pbMp4Path,'sg_uploaded_movie') print executed # PUBLISH if sg_task != []: version = findLastVersion(os.path.dirname(pbMovPath)) #sg_task = sg_task[0] print sg_task _register_publish(pbMovPath,pbMovFile,sg_task,version,"Movie", "published playblast mov","",ctx) print "PUBLISHED" else: print "SKIPPED PUBLISH" # print "TODO : make mov of whole sequence with audio" return results