def MyCMD_checkFile(self): saveMode = self.win.QC_CBB_SaveMode.currentIndex() #currentFile = cmds.file(q=1, sn=1) currentFile = "%s" %pm.Env().sceneName() projectFolder = str(self.win.QC_LB_ProjectFolder.text()) mayaFileName = str(self.win.QC_LB_MayaFileName.text()) SaveName = projectFolder + '\\scenes\\' + mayaFileName __ifSeccess = 0 if saveMode == 0: try: #cmds.file(rename=SaveName) #cmds.file(force=1, save=1) pm.saveAs(SaveName, f=1) __ifSeccess = 1 except: __ifSeccess = 0 elif saveMode == 1: if os.path.exists(currentFile): try: shutil.copyfile(currentFile, SaveName) __ifSeccess = 1 except: __ifSeccess = 0 else: QMessageBox.question(None, u'注意', u'当前文件不存在:\n' + currentFile) if __ifSeccess == 1: QMessageBox.information(None, u'成功', u'下列文件上传成功:\n' + SaveName) self.win.QC_LB_MayaFilePath.setText(SaveName) elif __ifSeccess == 0: QMessageBox.critical(None, u'失败', u'下列文件上传失败:\n' + SaveName) return
def save_file(path): if os.path.exists(os.path.split(path)[0]): pass else: os.makedirs(os.path.split(path)[0]) pm.saveAs(path) print(u'文件另存为:{}'.format(path))
def save_as(self, file_to_save_to): # type: (workfile) -> None # call super for context change super(MayaEngine, self).save_as(file_to_save_to) # now save the file pm.saveAs(file_to_save_to["path"])
def saveAs(self): """ Save the currently open as a version of this item :return: """ fileName = self.getWorkPath(make=True) pm.saveAs(fileName)
def start(*args): from maya import standalone standalone.initialize(name='python') from pymel import core core.openFile(args[0], f=True) result = None if args[1].endswith('.mel'): try: core.mel.eval('source \"%s\"' % args[1]) result = True except Exception as error: warnings.warn(str(error), Warning) result = False else: code_dirname = os.path.dirname(args[1]) code_name = os.path.splitext(os.path.basename(args[1]))[0] for module_loader, name, ispkg in pkgutil.iter_modules([code_dirname]): if name != code_name: continue loader = module_loader.find_module(name) try: module = loader.load_module(name) result = True except Exception as error: warnings.warn(str(error), Warning) result = False if not result: return if args[2] != 'None': core.saveAs(args[2], f=True, iv=True, pmt=True) standalone.uninitialize(name='python')
def setUp(self): self.temp = tempfile.mkdtemp(prefix='referencesTest') print "created temp dir: %s" % self.temp # Refs: # sphere.ma # (no refs) # cube.ma # :sphere => sphere.ma # cone.ma # :cubeInCone => cube.ma # :cubeInCone:sphere => sphere.ma # master.ma # :sphere1 => sphere.ma # :sphere2 => sphere.ma # :cube1 => cube.ma # :cube1:sphere => sphere.ma # :cone1 => cone.ma # :cone1:cubeInCone => cube.ma # :cone1:cubeInCone:sphere => sphere.ma # create sphere file print "sphere file" # cmds.file(new=1, f=1) pm.newFile(f=1) sphere = pm.polySphere() # We will use this to test failed ref edits... pm.addAttr(sphere, ln='zombieAttr') self.sphereFile = pm.saveAs(os.path.join(self.temp, 'sphere.ma'), f=1) # create cube file print "cube file" pm.newFile(f=1) pm.polyCube() pm.createReference(self.sphereFile, namespace='sphere') pm.PyNode('sphere:pSphere1').attr('translateX').set(2) self.cubeFile = pm.saveAs(os.path.join(self.temp, 'cube.ma'), f=1) # create cone file print "cone file" pm.newFile(f=1) pm.polyCone() pm.createReference(self.cubeFile, namespace='cubeInCone') pm.PyNode('cubeInCone:pCube1').attr('translateZ').set(2) pm.PyNode('cubeInCone:sphere:pSphere1').attr('translateZ').set(2) self.coneFile = pm.saveAs(os.path.join(self.temp, 'cone.ma'), f=1) print "master file" pm.newFile(f=1) self.sphereRef1 = pm.createReference(self.sphereFile, namespace='sphere1') pm.PyNode('sphere1:pSphere1').attr('translateY').set(2) self.sphereRef2 = pm.createReference(self.sphereFile, namespace='sphere2') pm.PyNode('sphere2:pSphere1').attr('translateY').set(4) self.cubeRef1 = pm.createReference(self.cubeFile, namespace='cube1') pm.PyNode('cube1:sphere:pSphere1').attr('translateY').set(6) pm.PyNode('cube1:pCube1').attr('translateY').set(6) self.coneRef1 = pm.createReference(self.coneFile, namespace='cone1') self.masterFile = pm.saveAs(os.path.join(self.temp, 'master.ma'), f=1)
def saved_file(tmpdir): pm.newFile(force=True) path = os.path.join(tmpdir.dirname, "maya_test_scene.ma") pm.saveAs(path) return path
def saveChar(self, charName): print 'saveChar' if os.path.isdir(CHARACTERS_PATH): currentCharacters = set(os.listdir(CHARACTERS_PATH)) if charName not in currentCharacters: if os.path.isdir(os.path.join(CHARACTERS_PATH, '01_default')): shutil.copytree( os.path.join(CHARACTERS_PATH, '01_default'), os.path.join(CHARACTERS_PATH, charName)) mayaFile = os.path.join(CHARACTERS_PATH, charName, '03_rigging', '05_approved', charName + '.ma') pm.saveAs(mayaFile) else: pm.warning( 'File not saved, couldnt find a default character directory!!!' ) else: mayaFile = os.path.join(CHARACTERS_PATH, charName, '03_rigging', '05_approved', charName + '.ma') if os.path.isfile(mayaFile): pm.warning('File exists!!!') else: pm.saveAs(mayaFile)
def SNV(*args): sceneNameFull = pm.sceneName() # full scene name with path, version, ext scenePath = os.path.dirname(sceneNameFull) # scene path sceneNameVerExt = sceneNameFull.split('/')[-1] # scene name with version an ext sceneNameVer, ext = sceneNameVerExt.split('.') # get EXT ver = sceneNameVer.split('_')[-1] # get VERSION verNext = int(ver) + 1 partQnt = len(sceneNameVer.split('_')) - 1 # get quantity of scene name parts, separated with '_' sceneNameParts = sceneNameVer.split('_')[0 : partQnt] sceneName = '' # recreate scene name from parts for i in range (0 , partQnt): sceneName += sceneNameParts[i] + '_' sceneNameFullNew = '{0}/{1}{2:0>3}.{3}'.format(scenePath, sceneName, verNext, ext) if os.path.exists(sceneNameFullNew): confirm = pm.confirmDialog ( title = 'File exists!', message= 'Overwrite file?' + '\r\n\r\n' + str('{0}{1:0>3}.{2}'.format( sceneName, verNext, ext)), button=['Yes','No'], defaultButton='Yes', cancelButton='No', dismissString='No' ) if confirm == 'Yes': pm.saveAs(sceneNameFullNew) pm.mel.addRecentFile (sceneNameFullNew, 'mayaBinary') print 'File overrited: ' + str(sceneNameFullNew) else: sys.exit() else: pm.saveAs(sceneNameFullNew) pm.mel.addRecentFile (sceneNameFullNew, 'mayaBinary') print 'File saved: ' + str(sceneNameFullNew)
def importAnimation(self, speak=0,lib=1): print 'Importing Animation' rigFile = os.path.join(CHARACTERS_PATH,self.name,'rigging',self.name + '.ma') pm.openFile(rigFile,f=1) if lib: importAnimPath = ANIM_LIB_PATH else: fbxPath = os.path.split(self.fbxFile)[0] importAnimPath = fbxPath + '/' + 'animations/' animFiles = [f for f in os.listdir(importAnimPath) if f.endswith('.fbx')] #self.logger.info('########### Importing animations from library ############') for anim in animFiles: pm.mel.eval('FBXImportFillTimeline -v 1;') cmd = 'FBXImport -f "' + importAnimPath + anim+ '" -caller \"FBXMayaTranslator\" -importFormat \"fbx;v=0\"' pm.mel.eval(cmd) #self.logger.info('Imported %s ', (importAnimPath + anim)) #pm.importFile(importAnimPath + anim, type='FBX',mergeNamespacesOnClash=0,rpr=anim.split('.')[0],options = 'v=0;',loadReferenceDepth = 'all') start = pm.playbackOptions(q=1,ast=1) end = pm.playbackOptions(q=1,aet=1) pm.bakeResults( 'shadowJoint',t=(start,end), simulation=True ) self.saveAnimation(anim.split('.')[0]) pm.openFile(rigFile,f=1) if speak: #self.logger.info('Creating speak anims ') for anim in speakAnims: pm.openFile(rigFile,f=1) animationFile = os.path.join(CHARACTERS_PATH,self.name,'animation',anim + '.ma') #self.logger.info('%s created',animationFile) pm.saveAs(animationFile,f=1)
def save_file(self): file = pm.textField(self.asset_name, query=True, text=True) new_file = file + '_v' + '001' updated_path = os.path.join(self.save_path, new_file + ".ma").replace('\\', '/') pm.saveAs(updated_path, force=True) clear_window('incremental_save')
def saveFile(self, mayaFalse): if pm.confirmDialog(title=u'SER シーン管理', message=u'上書きしますか?', button=[u'はい', u'いいえ'], defaultButton=u'はい', cancelButton=u'いいえ', dismissString=u'いいえ'): if pm.textField(self.sceneName, q=True, text=True) in pm.sceneName( ): #check if the text field option is the same as the current scene file print 'overwrite and save' pm.saveFile() #saving before exporting self.saveImageCreate(False) self.mainBody(self.path, False) pm.confirmDialog(message=u'保存しました!', title=u'Prism Scene Manager') else: print 'save new file' pm.saveAs(pm.radioButton(pm.radioCollection( self.radColle, sl=True, q=True), q=True, annotation=True) + '/' + pm.textField(self.sceneName, q=True, text=True), type='mayaAscii') #saving before exporting pm.saveFile() #save? self.saveImageCreate(False) self.mainBody(self.path, False) #call mainBody once more pm.confirmDialog(message=u'保存しました!', title=u'Prism Scene Manager')
def increment_and_save(current_file, entity_type="Asset", publish=0): scene_directory = pm.workspace.expandName(pm.workspace.fileRules["scene"]) file_name = scene_directory.rsplit("/", 1)[1][4:] # model_a if "Shot" == entity_type: file_name = scene_directory.rsplit("/", 1)[1] # Shot_### processed_file = None if current_file and publish: processed_file = "{}/{}_processed.{}.ma".format( scene_directory, file_name, str(int(current_file.split(".")[1][1:]) + 1).zfill(4)) elif current_file and not publish: pm.openFile(current_file, f=1) processed_file = current_file.replace("original", "processed").replace( "published", "scenes") # print ">> checked out" elif not current_file: directory = pm.util.common.path(scene_directory) files = directory.files(file_name + "_processed.*.ma") if files: latest_processed = max(files, key=get_version) old = max(files, key=get_version).split(".")[1] new = "{:04d}".format(int(old) + 1) version = ".{}.".format(new) processed_file = version.join(latest_processed.split(".")[::2]) else: processed_file = "{}/{}_processed.0001.ma".format( scene_directory, file_name) # print ">> new:", processed_file pm.saveAs(processed_file) return processed_file
def saveChar(self,charName): print 'saveChar' if os.path.isdir(CHARACTERS_PATH): mayaFile = os.path.join(CHARACTERS_PATH,charName,'rigging',charName + '.ma') if os.path.isfile(mayaFile): pm.warning('File exists!!!') else: pm.saveAs(mayaFile,type='mayaAscii')
def setUp(self): self.temp = tempfile.mkdtemp(prefix='referencesTest') print "created temp dir: %s" % self.temp # Refs: # sphere.ma # (no refs) # cube.ma # :sphere => sphere.ma # cone.ma # :cubeInCone => cube.ma # :cubeInCone:sphere => sphere.ma # master.ma # :sphere1 => sphere.ma # :sphere2 => sphere.ma # :cube1 => cube.ma # :cube1:sphere => sphere.ma # :cone1 => cone.ma # :cone1:cubeInCone => cube.ma # :cone1:cubeInCone:sphere => sphere.ma # create sphere file print "sphere file" # cmds.file(new=1, f=1) pm.newFile(f=1) sphere = pm.polySphere() # We will use this to test failed ref edits... pm.addAttr(sphere, ln='zombieAttr') self.sphereFile = pm.saveAs( os.path.join( self.temp, 'sphere.ma' ), f=1 ) # create cube file print "cube file" pm.newFile(f=1) pm.polyCube() pm.createReference( self.sphereFile, namespace='sphere' ) pm.PyNode('sphere:pSphere1').attr('translateX').set(2) self.cubeFile = pm.saveAs( os.path.join( self.temp, 'cube.ma' ), f=1 ) # create cone file print "cone file" pm.newFile(f=1) pm.polyCone() pm.createReference( self.cubeFile, namespace='cubeInCone' ) pm.PyNode('cubeInCone:pCube1').attr('translateZ').set(2) pm.PyNode('cubeInCone:sphere:pSphere1').attr('translateZ').set(2) self.coneFile = pm.saveAs( os.path.join( self.temp, 'cone.ma' ), f=1 ) print "master file" pm.newFile(f=1) self.sphereRef1 = pm.createReference( self.sphereFile, namespace='sphere1' ) pm.PyNode('sphere1:pSphere1').attr('translateY').set(2) self.sphereRef2 = pm.createReference( self.sphereFile, namespace='sphere2' ) pm.PyNode('sphere2:pSphere1').attr('translateY').set(4) self.cubeRef1 = pm.createReference( self.cubeFile, namespace='cube1' ) pm.PyNode('cube1:sphere:pSphere1').attr('translateY').set(6) pm.PyNode('cube1:pCube1').attr('translateY').set(6) self.coneRef1 = pm.createReference( self.coneFile, namespace='cone1' ) self.masterFile = pm.saveAs(os.path.join(self.temp, 'master.ma'), f=1)
def saveAnimation(self,animFile): print 'Saving file' start = pm.playbackOptions(q=1,ast=1) end = pm.playbackOptions(q=1,aet=1) length = int(end - start) saveName = animFile.replace('lib',self.name) + '_' + str(length) + '.ma' pm.playbackOptions(aet = end-1) animationFile = os.path.join(CHARACTERS_PATH,self.name,'animation',saveName) pm.saveAs(animationFile,f=1)
def publish(self): originalName = pm.sceneName() self.publishVer += 1 fullPath = self.getPublishPath(make=True) # save scene pm.saveAs(fullPath) pm.renameFile(originalName) self.putDataToDB()
def saveRenderFile(self, forAnim, cacheFolder, log): lightingFolder = pm.optionVar.get('lightingFolderString', '') lightingString = pm.optionVar.get('lightingString', '') animString = pm.optionVar.get('animString', '') timeUnit = pm.currentUnit(q=1, time=True) startTime = pm.playbackOptions(query=True, minTime=True) endTime = pm.playbackOptions(query=True, maxTime=True) print 'Saving render file asfasfasfsfasf' pm.newFile(force=True) pm.currentUnit(time=timeUnit) pm.currentTime(startTime, edit=True) pm.playbackOptions(ast=startTime) pm.playbackOptions(aet=endTime) pm.playbackOptions(minTime=startTime) pm.playbackOptions(maxTime=endTime) workspace = pm.workspace.path print workspace print forAnim animRoot = forAnim.replace('\\', '/').replace(workspace, '') lightingFile = animRoot.split('/')[-1].replace(animString, lightingString) foldersToFile = animRoot.split('/')[2:-1] for folder in foldersToFile: if not os.path.isdir(os.path.join(lightingFolder, folder)): os.mkdir(os.path.join(lightingFolder, folder)) lightingFolder = os.path.join(lightingFolder, folder) else: lightingFolder = os.path.join(lightingFolder, folder) fullPath = os.path.join(lightingFolder, lightingFile) f, ext = os.path.splitext(lightingFile) print ext filetype = 'mayaAscii' if ext == '.mb': filetype = 'mayaBinary' pm.saveAs(fullPath, f=1, type=filetype) for reference in self.exportReferences: self.importAlembic(reference[1], reference[2], cacheFolder) for cam in self.userCameras: self.importAlembicCamera(cam, cacheFolder) pm.saveFile()
def version_up(): path, file = os.path.split(pm.sceneName()) file = file.partition('.')[0][:-5] curdir_files = os.listdir(path) inc_files = [] for item in curdir_files: if file in item: inc_files.append(item) inc_files.sort() last_ver = int(inc_files[-1].partition('.')[0][-3:]) new_file = file + '_v' + str(last_ver + 1).zfill(3) updated_path = os.path.join(path, new_file + ".ma").replace('\\', '/') pm.saveAs(updated_path, force=True)
def publish(self): """ Publish the current file on the publish directory and update version :return: """ originalName = pm.sceneName() self.publishVer += 1 fullPath = self.getPublishPath(make=True) # save scene pm.saveAs(fullPath) pm.renameFile(originalName) self.putDataToDB()
def createFailedEdits(self): # Animate the zombieAttrs for transform in [x.getParent() for x in pm.ls(type='mesh')]: try: zombie = transform.attr('zombieAttr') except pm.MayaAttributeError: continue zombie.setKey(t=1, v=1) zombie.setKey(t=2, v=2) zombie.setKey(t=3, v=4) # want to create another successful edit, so we can tell just by number of edits # whether we got failed, successful, or both # failed = 1 # successful = 2 # both = 3 pm.setAttr(self.sphereRef1.namespace + ':pSphere1.rotate', (30, 0, 0)) self.masterFile = pm.saveAs(os.path.join(self.temp, 'master.ma'), f=1) # deleting the attr should give some failed ref edits in the master... pm.openFile(self.sphereFile, f=1) pm.SCENE.pSphere1.zombieAttr.delete() pm.saveFile(f=1) pm.openFile(self.masterFile, f=1) self.sphereRef1 = pm.FileReference(namespace='sphere1') self.sphereRef2 = pm.FileReference(namespace='sphere2') self.cubeRef1 = pm.FileReference(namespace='cube1') self.coneRef1 = pm.FileReference(namespace='cone1')
def createFailedEdits(self): # Animate the zombieAttrs for transform in [x.getParent() for x in pm.ls(type='mesh')]: try: zombie = transform.attr('zombieAttr') except pm.MayaAttributeError: continue zombie.setKey(t=1, v=1) zombie.setKey(t=2, v=2) zombie.setKey(t=3, v=4) # want to create another successful edit, so we can tell just by number of edits # whether we got failed, successful, or both # failed = 1 # successful = 2 # both = 3 pm.setAttr(self.sphereRef1.namespace + ':pSphere1.rotate', (30,0,0)) self.masterFile = pm.saveAs(os.path.join(self.temp, 'master.ma'), f=1) # deleting the attr should give some failed ref edits in the master... pm.openFile(self.sphereFile, f=1) pm.SCENE.pSphere1.zombieAttr.delete() pm.saveFile(f=1) pm.openFile(self.masterFile, f=1) self.sphereRef1 = pm.FileReference(namespace='sphere1') self.sphereRef2 = pm.FileReference(namespace='sphere2') self.cubeRef1 = pm.FileReference(namespace='cube1') self.coneRef1 = pm.FileReference(namespace='cone1')
def batch_render(output): scene_name = core.sceneName() basename = scene_name.basename() if not output: output = scene_name.dirname() render_exe = get_render_cmd() if not os.path.isfile(render_exe): core.workspace(fileRule=['images', output]) core.workspace(fileRule=['movie', output]) core.workspace(s=True) temp_path = os.path.join(tempfile.gettempdir(), basename) if os.path.isfile(temp_path): try: os.chmod(temp_path, 0777) except: pass try: os.remove(temp_path) except: pass render_file = core.saveAs(temp_path, f=True, iv=True, pmt=True) if os.path.isfile(render_exe): command = '{} -r file -rd \"{}\" \"{}\"'.format( render_exe, output, render_file) os.system(command) else: core.mel.eval('BatchRender;') output_file = os.path.join( output, 'scene_preview', '%s.mov' % basename.splitext()[0]) return output_file
def test_failed_ref_edits(self): # Animate the zombieAttrs for transform in [x.getParent() for x in pm.ls(type='mesh')]: try: zombie = transform.attr('zombieAttr') except pm.MayaAttributeError: continue zombie.setKey(t=1, v=1) zombie.setKey(t=2, v=2) zombie.setKey(t=3, v=4) self.masterFile = pm.saveAs( os.path.join( self.temp, 'master.ma' ), f=1 ) pm.openFile(self.sphereFile, f=1) pm.SCENE.pSphere1.zombieAttr.delete() pm.saveFile(f=1) # deleting the attr should give some failed ref edits... pm.openFile(self.masterFile, f=1) sphereRefs = [x for x in pm.listReferences(recursive=True) if x.path.endswith('sphere.ma')] for ref in sphereRefs: print "testing failed ref edits on: %s" % ref self.assertEqual(1, len(pm.referenceQuery(ref,successfulEdits=False,failedEdits=True,es=True))) self.assertEqual(1, len(cmds.referenceQuery(str(ref.refNode), successfulEdits=False,failedEdits=True,es=True)))
def aas_save_as(file_path=None): # get current name if not file_path: file_path = pm.sceneName() if not file_path: pm.mel.eval("SaveSceneAs;") return file_path = str(file_path) # get new version new_version_info = get_new_version.get_new_version(file_path) if not new_version_info: pm.mel.eval("SaveSceneAs;") return # get new file name new_version_path = new_version_info[0] pm.saveAs(new_version_path, force=True)
def saveNewVersion(self): path, filename = os.path.split(pm.sceneName()) name, extension = os.path.splitext(filename) version = name.split('_')[-1] newVersion = '' if int(version) < 9: newVersion = '0' + str(int(version) + 1) else: newVersion = str(int(version) + 1) print newVersion newName = filename.replace('_' + version + extension, '_' + newVersion + extension) pm.saveAs(os.path.join(path, newName), f=1) self.wipAnimTable.clearContents() self.bdPopulateFiles()
def createAnimFile(self): character = self.charNameEdit.text() animType = self.animTypeCombo.currentText() if character: if 'name' not in character: animNumber = self.getLastAnim(animType) fullName = character + '_' + animType + animNumber + '_01.ma' fullName = self.wipFolderPath + '/' + fullName print fullName if not os.path.isfile(fullName): pm.saveAs(fullName) self.bdPopulateFiles() else: pm.warning('File exist, will not overwrite') else: pm.warning('Enter a char name')
def saveNewVersion(self): path,filename = os.path.split(pm.sceneName()) name,extension = os.path.splitext(filename) version = name.split('_')[-1] newVersion = '' if int(version) < 9: newVersion = '0' + str(int(version) + 1) else: newVersion = str(int(version) + 1) print newVersion newName = filename.replace('_' + version + extension,'_' + newVersion + extension) pm.saveAs(os.path.join(path,newName),f=1) self.wipAnimTable.clearContents() self.bdPopulateFiles()
def exportCmd(*args, **kwargs): ''' export models with animation ''' kx = kxTool.KXTool() kx.getSceneName() sceneName = kx.sceneName scenePath = kx.scenePath cachePath = "{path}/{name}/{name}_cloth.abc".format(path=scenePath.replace( 'scenes', 'cache/alembic'), name=sceneName) cacheFile = name.compileFileName(cachePath) fileName = name.compileFileName("{path}/{name}_cloth.mb".format( path=scenePath, name=sceneName)) geos = pm.PyNode('kx_cloth_export_layer').listMembers() exportGeos = [] for geo in geos: dup = pm.duplicate(geo, name='{0}_toCloth'.format(geo.name()))[0] dup.setParent(w=1) shapes = dup.getShapes() pm.delete(shapes[1:]) pm.blendShape(geo, dup, o='world', w=(0, 1)) exportGeos.append(dup) cache.exportAbcCache(exportGeos, cacheFile, useTimeline=True, verbose=True) pm.newFile(f=1) sourceGrp = pm.createNode('transform', name='source_Grp') abcNodeName = cache.importAbcCache(cacheFile) objs = pm.PyNode(abcNodeName).outputs() for obj in objs: obj.rename(obj.name().replace('_toCloth', '_anim')) obj.setParent(sourceGrp) pm.saveAs(fileName, f=1) return fileName
def setUp(self): self.temp = os.path.join(tempfile.gettempdir(), "referencesTest") if not os.path.isdir(self.temp): os.makedirs(self.temp) print "created temp dir: %s" % self.temp # Refs: # sphere.ma # (no refs) # master.ma # :sphere1 => sphere.ma # :sphere2 => sphere.ma # create sphere file print "sphere file" # cmds.file(new=1, f=1) pm.newFile(f=1) sphere = pm.polySphere()[0] pm.addAttr(sphere, ln="zombieAttr1") pm.addAttr(sphere, ln="zombieAttr2") cmds.setAttr("%s.v" % sphere, lock=1) cmds.setAttr("%s.zombieAttr1" % sphere, lock=1) self.sphereFile = pm.saveAs(os.path.join(self.temp, "sphere.ma"), f=1) print "master file" pm.newFile(f=1) self.sphereRef1 = pm.createReference(self.sphereFile, namespace="sphere1") self.sphereRef2 = pm.createReference(self.sphereFile, namespace="sphere2") self.sphere1 = pm.PyNode("sphere1:pSphere1") self.sphere2 = pm.PyNode("sphere2:pSphere1") self.sphere1.attr("translateY").set(2) self.sphere2.attr("translateY").set(4) self.cube = pm.polyCube()[0] pm.addAttr(self.cube, ln="zombieAttr1") pm.addAttr(self.cube, ln="zombieAttr2") cmds.setAttr("%s.v" % self.cube, lock=1) cmds.setAttr("%s.zombieAttr1" % self.cube, lock=1) self.masterFile = pm.saveAs(os.path.join(self.temp, "master.ma"), f=1)
def saveChar(self, charName): print "saveChar" if os.path.isdir(CHARACTERS_PATH): currentCharacters = set(os.listdir(CHARACTERS_PATH)) if charName not in currentCharacters: if os.path.isdir(os.path.join(CHARACTERS_PATH, "01_default")): shutil.copytree( os.path.join(CHARACTERS_PATH, "01_default"), os.path.join(CHARACTERS_PATH, charName) ) mayaFile = os.path.join(CHARACTERS_PATH, charName, "03_rigging", "05_approved", charName + ".ma") pm.saveAs(mayaFile) else: pm.warning("File not saved, couldnt find a default character directory!!!") else: mayaFile = os.path.join(CHARACTERS_PATH, charName, "03_rigging", "05_approved", charName + ".ma") if os.path.isfile(mayaFile): pm.warning("File exists!!!") else: pm.saveAs(mayaFile)
def restore_anim(from_file, to_file): fbx_rig = 'c:\\repo\\StarIsland_content\\06_TimoBoll\\07_Rig\\00_TimoBoll\\01_Release\\timoboll_fbxOn_rig.ma' pm.openFile(from_file, force=1) anim_layers_data = get_anim_layer() anim_layers = [item[0] for item in anim_layers_data] start_frame = pm.playbackOptions(q=1, min=1) end_frame = pm.playbackOptions(q=1, max=1) ###### Copy mocap pm.select('root_jnt') lr.bdSelectHierarchyJnt() pm.copyKey() pm.openFile(fbx_rig, force=1) start_frame = pm.playbackOptions(min=start_frame) end_frame = pm.playbackOptions(max=end_frame) pm.currentTime(0) pm.select('root_jnt') lr.bdSelectHierarchyJnt() pm.pasteKey() pm.saveAs(to_file) select_all() pm.copyKey() ##Copy Base Anim pm.openFile(from_file, force=1) set_active_layer('BaseAnimation') select_all() pm.copyKey() pm.openFile(to_file, force=1) start_frame = pm.playbackOptions(min=start_frame) end_frame = pm.playbackOptions(max=end_frame) pm.currentTime(start_frame) select_all() pm.setKeyframe() pm.pasteKey() pm.saveFile()
def saveFile(describe): #按照描述保存文件 # #参数describe: 需要输入描述字符串, 如: 'CHRcolor'等, 保存文件时加入到文件名中. # pnm = ProjNameMatch() fileName = pm.Env().sceneName().namebase dir = pnm.setFileName(fileName) dir = pm.Path(pnm.getProjDirectorys()[-1] + pnm.getProjDirectorys()[0] + '/scenes') project_name = pnm.getResults('project_name') episode_number = pnm.getResults('episode_number') session_number = pnm.getResults('session_number') scene_number = pnm.getResults('scene_number') scene_describe = LAYER_FILENAME[describe] process_name = 'lr' version_number = 'c001' newFileName = '_'.join([ project_name, episode_number, session_number, scene_number, scene_describe, process_name, version_number ]) filePrefix = '_'.join([ project_name, episode_number, session_number, scene_number, scene_describe, process_name ]) versions = [] for f in dir.files(): subpnm = ProjNameMatch() if filePrefix in f.name: subpnm.setFileName(f.name) versions.append(subpnm.getResults('version_number')) if versions: versions.sort() version_number = 'c' + str(int(versions[-1][1:]) + 1).zfill(3) newFileName = '_'.join([ project_name, episode_number, session_number, scene_number, scene_describe, process_name, version_number ]) try: pm.saveAs("{0}/{1}.mb".format(dir, newFileName)) return newFileName except: raise "save this file failure!!!"
def setUp(self): print "getting temp dir" self.temp = os.path.join(tempfile.gettempdir(), 'referencesTest') if not os.path.isdir(self.temp): os.makedirs(self.temp) # create sphere file print "sphere file" # cmds.file(new=1, f=1) pm.newFile(f=1) sphere = pm.polySphere() # We will use this to test failed ref edits... pm.addAttr(sphere, ln='zombieAttr') self.sphereFile = pm.saveAs( os.path.join( self.temp, 'sphere.ma' ), f=1 ) # create cube file print "cube file" pm.newFile(f=1) pm.polyCube() pm.createReference( self.sphereFile, namespace='sphere' ) pm.PyNode('sphere:pSphere1').attr('translateX').set(2) self.cubeFile = pm.saveAs( os.path.join( self.temp, 'cube.ma' ), f=1 ) # create cone file print "cone file" pm.newFile(f=1) pm.polyCone() pm.createReference( self.cubeFile, namespace='cubeInCone' ) pm.PyNode('cubeInCone:pCube1').attr('translateZ').set(2) pm.PyNode('cubeInCone:sphere:pSphere1').attr('translateZ').set(2) self.coneFile = pm.saveAs( os.path.join( self.temp, 'cone.ma' ), f=1 ) print "master file" pm.newFile(f=1) self.sphereRef1 = pm.createReference( self.sphereFile, namespace='sphere1' ) pm.PyNode('sphere1:pSphere1').attr('translateY').set(2) self.sphereRef2 = pm.createReference( self.sphereFile, namespace='sphere2' ) pm.PyNode('sphere2:pSphere1').attr('translateY').set(4) self.cubeRef1 = pm.createReference( self.cubeFile, namespace='cube1' ) pm.PyNode('cube1:sphere:pSphere1').attr('translateY').set(6) pm.PyNode('cube1:pCube1').attr('translateY').set(6) self.coneRef1 = pm.createReference( self.coneFile, namespace='cone1' )
def setup_scene(source, target): import pymel.core as pm pm.openFile(source) top_level_dag = cmds.ls(assemblies=True) top_level_obj = "" for dag in top_level_dag: if cmds.listRelatives(dag, shapes=True): continue child_dag = cmds.listRelatives(dag, children=True) for dag in child_dag: if dag.count("Main") or dag.count("_Ctrl"): top_level_obj = dag if top_level_obj: break if not top_level_obj: return db.gen_failure_msg pm.delete(top_level_obj) pm.saveAs(target) return db.gen_success_msg
def exportCmd(*args, **kwargs): ''' export models with animation ''' kx = kxTool.KXTool() kx.getSceneName() sceneName = kx.sceneName scenePath = kx.scenePath cachePath = "{path}/{name}/{name}_cloth.abc".format(path = scenePath.replace('scenes', 'cache/alembic'), name = sceneName) cacheFile = name.compileFileName(cachePath) fileName = name.compileFileName("{path}/{name}_cloth.mb".format(path = scenePath, name = sceneName)) geos = pm.PyNode('kx_cloth_export_layer').listMembers() exportGeos = [] for geo in geos: dup = pm.duplicate(geo, name = '{0}_toCloth'.format(geo.name()))[0] dup.setParent(w=1) shapes = dup.getShapes() pm.delete(shapes[1:]) pm.blendShape(geo, dup, o = 'world', w = (0,1)) exportGeos.append(dup) cache.exportAbcCache(exportGeos, cacheFile, useTimeline = True, verbose = True) pm.newFile(f=1) sourceGrp = pm.createNode('transform', name = 'source_Grp') abcNodeName = cache.importAbcCache(cacheFile) objs = pm.PyNode(abcNodeName).outputs() for obj in objs: obj.rename(obj.name().replace('_toCloth', '_anim')) obj.setParent(sourceGrp) pm.saveAs(fileName, f=1) return fileName
def onSave(self, path): operation = self.cbSaveoperation.currentText() extension = self.sceneListExtension() self.log('Current scenes extension: {0}'.format(extension)) if operation == 'Skip': self.log('saving skipped') elif operation == 'SaveCurrent': if extension == 'fbx': self.log('Saving {0}'.format(path)) self.saveFbx(path) pm.newFile(f=1) else: self.log('Saving {0}'.format(path)) pm.saveAs(path, f=1) else: name = self.getFileName(path) extension = self.sceneListExtension() newName = os.path.dirname(path) + '/' + name + '_new.' + extension self.log('Saving {0}'.format(newName)) pm.saveAs(newName)
def runInitialStartup(): """ @ run this function on maya start. Returns: None. """ pm.select(cl=True) # make groups. topGrp = pm.PyNode('geo') modelGrp = pm.PyNode('test_grp') # get asset data from temp directory using json. jsonFilePath = tempfile.gettempdir() + '\\zSetAssetData.json' with open(os.path.join(tempfile.gettempdir(), jsonFilePath)) as fd: astData = json.load(fd) # set Values. pm.setAttr(topGrp + '.assetName', astData['name']) pm.setAttr(topGrp + '.assetName', l=True) pm.setAttr(topGrp + '.assetGrade', astData['grade']) pm.setAttr(topGrp + '.assetGrade', l=True) pm.setAttr(topGrp + '.assetUID', astData['uid']) pm.setAttr(topGrp + '.assetUID', l=True) modelGrp.rename(astData['name']) # get back to gpu folder. gpuPath = str() for each in astData['path'].split('.')[0].split('/')[:-1]: gpuPath += each + '/' if not os.path.isdir(gpuPath): os.makedirs(gpuPath) print 'path created.' # change gpu cache path. cacheFilePath = astData['path'].replace('.ma', '.abc') cacheNode = pm.PyNode('gpuCache') serverPath = bs_pathGenerator.bs_getEnvDetails()['rootPath'] cacheFilePath = cacheFilePath.replace(serverPath, '$BSW_PROD_SERVER/') cacheNode.cacheFileName.set(cacheFilePath) # save as file. pm.saveAs(astData['path']) return topGrp
def saveFile(describe): # 按照描述保存文件 # # 参数describe: 需要输入描述字符串, 如: 'CHRcolor'等, 保存文件时加入到文件名中. # pnm = ProjNameMatch() fileName = pm.Env().sceneName().namebase dir = pnm.setFileName(fileName) dir = pm.Path(pnm.getProjDirectorys()[-1] + pnm.getProjDirectorys()[0] + "/scenes") project_name = pnm.getResults("project_name") episode_number = pnm.getResults("episode_number") session_number = pnm.getResults("session_number") scene_number = pnm.getResults("scene_number") scene_describe = LAYER_FILENAME[describe] process_name = "lr" version_number = "c001" newFileName = "_".join( [project_name, episode_number, session_number, scene_number, scene_describe, process_name, version_number] ) filePrefix = "_".join([project_name, episode_number, session_number, scene_number, scene_describe, process_name]) versions = [] for f in dir.files(): subpnm = ProjNameMatch() if filePrefix in f.name: subpnm.setFileName(f.name) versions.append(subpnm.getResults("version_number")) if versions: versions.sort() version_number = "c" + str(int(versions[-1][1:]) + 1).zfill(3) newFileName = "_".join( [project_name, episode_number, session_number, scene_number, scene_describe, process_name, version_number] ) try: pm.saveAs("{0}/{1}.mb".format(dir, newFileName)) return newFileName except: raise "save this file failure!!!"
def process(self, instance): if 'workfile' in instance.context.data: host = pyblish.api.current_host() workfile = instance.context.data['workfile'] self.log.info("workfile '%s'" % workfile) if host == 'nuke': import nuke nuke.scriptSaveAs(workfile) elif host == 'maya': import pymel.core as pm if os.path.exists(workfile): pm.system.openFile(workfile, force=True) else: pm.saveAs(workfile, type='mayaAscii') proj_path = os.path.dirname(workfile) self.log.info("Setting Maya project to '%s'" % proj_path) pm.mel.setProject(proj_path) else: raise pyblish.api.ValidationError( "Can't find workfile in instance.context.")
def duplicateAssets(): path = pm.workspace.name + '/gfxlib/effects/' name = 'status_enhancement_' tempList = glob.glob(path + '*_t*_m.mb') for fl in tempList: path,filename = os.path.split(fl) #destFile = filename.replace('_m','_s') destFile = filename.replace('_m','_l') if(os.path.isfile(os.path.join(path,destFile))): pm.warning('File exists!') pm.openFile(os.path.join(path,destFile),f=1) else: shutil.copyfile(fl,os.path.join(path,destFile)) pm.openFile(os.path.join(path,destFile),f=1) modelGrp = pm.ls('model')[0] #modelGrp.scaleBy((0.5,0.5,0.5)) modelGrp.scaleBy((3.2,3.2,3.2)) pm.makeIdentity(modelGrp,apply=True,t=0,r=0,s=1) pm.saveAs(os.path.join(path,destFile),f=1) pm.mel.eval('rlExportGraphicsObjectNoBrowserN3')
def save(fileName=None, ext=None, applyInfo=False, mayaExts=MAYA_EXTS): """A wrapper for cmds.file(s=True) for convenience""" saveName = fileName if saveName is None: saveName = pm.sceneName() if 'untitled' in saveName: LOG.warning('The current scene has not yet been saved.') return None if ext is not None: if ext not in mayaExts: LOG.error('The provided file type `{0}` is not valid.'.format(ext)) return None saveName = forceExt(saveName, ext) if applyInfo: setFileInfo() result = pm.saveAs(saveName) CLEANLOG.info('Result: {0}'.format(result))
def createScene(fileName): pmc.newFile(new = True, force = True) basic.generate() pmc.saveAs("test.ma", type = "mayaAscii")
def launch(self, *args, **kwargs): """launch renderer command """ # do nothing if there is no window (called externally) if not pm.window('cgru_afanasy_wnd', ex= 1): return # get values separate_layers = pm.checkBox('af_separate', q=1, v=1) start_frame = int(pm.floatField('af_strFrmFfd', q=1, v=1)) end_frame = int(pm.floatField('af_endFrmFfd', q=1, v=1)) frames_per_task = pm.intField('af_frmPTask_F', q=1, v=1) by_frame = int(pm.floatField('af_stpFrmFfd', q=1, v=1)) hosts_mask = pm.textField('af_hostMask_F', q=1, text=1) hosts_exclude = pm.textField('af_hostExcl_F', q=1, text=1) priority = pm.intField('af_priority_F', q=1, v=1) pause = pm.checkBox('af_paused', q=1, v=1) close = pm.checkBox('af_close', q=1, v=1) # check values if start_frame > end_frame: temp = end_frame end_frame = start_frame start_frame = temp frames_per_task = max(1, frames_per_task) by_frame = max(1, by_frame) # store field values pm.optionVar['af_separate_layer_ov'] = separate_layers pm.optionVar['af_frmPTask_F_ov'] = frames_per_task pm.optionVar['af_hostMask_F_ov'] = hosts_mask pm.optionVar['af_hostExcl_F_ov'] = hosts_exclude pm.optionVar['af_priority_F_ov'] = priority pm.optionVar['af_paused_ov'] = pause pm.optionVar['af_close_ov'] = close # get paths scene_name = pm.sceneName() datetime = '%s%s' % ( time.strftime('%y%m%d-%H%M%S-'), str(time.time() - int(time.time()))[2:5] ) filename = '%s.%s.mb' % (scene_name, datetime) project_path = pm.workspace(q=1, rootDirectory=1) # ############################################################################ # maya images folder root, a default path for not separate_layers # changed by DavidPower outputs = pm.workspace(q= 1, rd= 1) + pm.workspace('images', q= 1, fre= 1) # ############################################################################ job_name = os.path.basename(scene_name) logger.debug('%ss %se %sr' % (start_frame, end_frame, by_frame)) logger.debug('scene = %s' % scene_name) logger.debug('file = %s' % filename) logger.debug('job_name = %s' % job_name) logger.debug('project_path = %s' % project_path) logger.debug('outputs = %s' % outputs) if pm.checkBox('af_close', q=1, v=1): pm.deleteUI('cgru_afanasy_wnd') cmd_buffer = [ '"%(filename)s"', '%(start)s', '%(end)s', '-by %(by_frame)s', '-hostsmask "%(msk)s"', '-hostsexcl "%(exc)s"', '-fpt %(fpt)s', '-name "%(name)s"', '-priority %(prio)s', '-pwd "%(pwd)s"', '-proj "%(proj)s"', '-images "%(images)s"', '-deletescene' ] kwargs = { 'filename': filename, 'start': start_frame, 'end': end_frame, 'by_frame': by_frame, 'msk': hosts_mask, 'exc': hosts_exclude, 'fpt': frames_per_task, 'name': job_name, 'prio': priority, 'pwd': project_path, 'proj': project_path, 'images': outputs } drg = pm.PyNode('defaultRenderGlobals') if drg.getAttr('currentRenderer') == 'mentalRay': cmd_buffer.append('-type maya_mental') if pause: cmd_buffer.append('-pause') #-----------------------------# currentRenderer = pm.PyNode('defaultRenderGlobals').getAttr('currentRenderer') sn = os.path.basename(cmds.file(q= 1, exn= 1)).split('.')[0] imgPrefix = pm.getAttr('vraySettings.fileNamePrefix') if currentRenderer == 'vray' else pm.getAttr('defaultRenderGlobals.imageFilePrefix') tmpPrefix = imgPrefix.replace('<Scene>', sn) if currentRenderer == 'vray': pm.setAttr('vraySettings.fileNamePrefix', tmpPrefix) else: pm.setAttr('defaultRenderGlobals.imageFilePrefix', tmpPrefix) #-----------------------------# # save file pm.saveAs( filename, force=1, type='mayaBinary' ) #-----------------------------# if currentRenderer == 'vray': pm.setAttr('vraySettings.fileNamePrefix', imgPrefix) else: pm.setAttr('defaultRenderGlobals.imageFilePrefix', imgPrefix) #-----------------------------# # rename back to original name pm.renameFile(scene_name) cmdList = [] # submit renders if separate_layers: # render each layer separately rlm = pm.PyNode('renderLayerManager') layers = [layer for layer in rlm.connections() if layer.renderable.get()] for layer in layers: layer_name = layer.name() kwargs['name'] = '%s:%s' % (job_name, layer_name) # ############################################################################ # update images path for each layers, and fix outputs if renderer is vray # changed by DavidPower kwargs['images'] = self.dpaf_outputsFix(layer) # ############################################################################ kwargs['start'] = int(self.dpaf_getOverrideData('defaultRenderGlobals.startFrame', layer_name)) kwargs['end'] = int(self.dpaf_getOverrideData('defaultRenderGlobals.endFrame', layer_name)) kwargs['by_frame'] = int(self.dpaf_getOverrideData('defaultRenderGlobals.byFrameStep', layer_name)) tmp_cmd_buffer = copy.copy(cmd_buffer) tmp_cmd_buffer.append( '-take %s' % layer.name() ) # create one big command afjob_cmd = ' '.join([ os.environ['CGRU_PYTHONEXE'], '"%s/python/afjob.py"' % os.environ['AF_ROOT'], '%s' % ' '.join(tmp_cmd_buffer) % kwargs ]) cmdList.append(afjob_cmd) else: # create one big command afjob_cmd = ' '.join([ os.environ['CGRU_PYTHONEXE'], '%s/python/afjob.py' % os.environ['AF_ROOT'], '%s' % ' '.join(cmd_buffer) % kwargs ]) cmdList.append(afjob_cmd) # call each command separately for cmd in cmdList: print(cmdList) os.system(cmd)
def launch(self, *args, **kwargs): """launch renderer command """ # do nothing if there is no window (called externally) if not self.window: return # get values start_frame = pm.intField('cgru_afanasy__start_frame', q=1, v=1) end_frame = pm.intField('cgru_afanasy__end_frame', q=1, v=1) frames_per_task = \ pm.intField('cgru_afanasy__frames_per_task', q=1, v=1) by_frame = pm.intField('cgru_afanasy__by_frame', q=1, v=1) hosts_mask = pm.textField('cgru_afanasy__hosts_mask', q=1, text=True) hosts_exclude = pm.textField('cgru_afanasy__hosts_exclude', q=1, text=True) separate_layers = \ pm.checkBox('cgru_afanasy__separate_layers', q=1, v=1) pause = pm.checkBox('cgru_afanasy__paused', q=1, v=1) # check values if start_frame > end_frame: temp = end_frame end_frame = start_frame start_frame = temp frames_per_task = max(1, frames_per_task) by_frame = max(1, by_frame) # store field values pm.optionVar['cgru_afanasy__start_frame_ov'] = start_frame pm.optionVar['cgru_afanasy__end_frame_ov'] = end_frame pm.optionVar['cgru_afanasy__frames_per_task_ov'] = frames_per_task pm.optionVar['cgru_afanasy__by_frame_ov'] = by_frame pm.optionVar['cgru_afanasy__hosts_mask_ov'] = hosts_mask pm.optionVar['cgru_afanasy__hosts_exclude_ov'] = hosts_exclude pm.optionVar['cgru_afanasy__separate_layers'] = separate_layers # get paths scene_name = pm.sceneName() datetime = '%s%s' % ( time.strftime('%y%m%d-%H%M%S-'), str(time.time() - int(time.time()))[2:5] ) filename = '%s.%s.mb' % (scene_name, datetime) project_path = pm.workspace(q=1, rootDirectory=1) outputs = ','.join( pm.renderSettings(fullPath=1, firstImageName=1, lastImageName=1) ) job_name = os.path.basename(scene_name) logger.debug('%ss %se %sr' % (start_frame, end_frame, by_frame)) logger.debug('scene = %s' % scene_name) logger.debug('file = %s' % filename) logger.debug('job_name = %s' % job_name) logger.debug('project_path = %s' % project_path) logger.debug('outputs = %s' % outputs) if pm.checkBox('cgru_afanasy__close', q=1, v=1): pm.deleteUI(self.window) cmd_buffer = [ '"%(filename)s"', '%(start)s', '%(end)s', '-by %(by_frame)s', '-hostsmask %(msk)s', '-hostsexcl %(exc)s', '-fpt %(fpt)s', '-name "%(name)s"', '-pwd "%(pwd)s"', '-proj "%(proj)s"', '-images "%(images)s"', '-deletescene' ] kwargs = { 'filename': filename, 'start': start_frame, 'end': end_frame, 'by_frame': by_frame, 'msk': hosts_mask, 'exc': hosts_exclude, 'fpt': frames_per_task, 'name': job_name, 'pwd': project_path, 'proj': project_path, 'images': outputs } drg = pm.PyNode('defaultRenderGlobals') render_engine = drg.getAttr('currentRenderer') if render_engine == 'mentalRay': cmd_buffer.append('-type maya_mental') elif render_engine == 'arnold': cmd_buffer.append('-type maya_arnold') # set the verbosity level to warning+info aro = pm.PyNode('defaultArnoldRenderOptions') aro.setAttr('log_verbosity', 1) if pause: cmd_buffer.append('-pause') # save file pm.saveAs( filename, force=1, type='mayaBinary' ) # rename back to original name pm.renameFile(scene_name) cmds = [] # submit renders if separate_layers: # render each layer separately rlm = pm.PyNode('renderLayerManager') layers = [layer for layer in rlm.connections() if layer.renderable.get()] for layer in layers: layer_name = layer.name() kwargs['name'] = '%s:%s' % (job_name, layer_name) tmp_cmd_buffer = copy.copy(cmd_buffer) tmp_cmd_buffer.append( '-take %s' % layer.name() ) # create one big command afjob_cmd = ' '.join([ os.environ['CGRU_PYTHONEXE'], '"%s/python/afjob.py"' % os.environ['AF_ROOT'], '%s' % ' '.join(tmp_cmd_buffer) % kwargs ]) cmds.append(afjob_cmd) else: # create one big command afjob_cmd = ' '.join([ os.environ['CGRU_PYTHONEXE'], '%s/python/afjob.py' % os.environ['AF_ROOT'], '%s' % ' '.join(cmd_buffer) % kwargs ]) cmds.append(afjob_cmd) # call each command separately for cmd in cmds: print(cmds) os.system(cmd)
def process(self, instance, context): if 'workfile' in instance.context.data: host = pyblish.api.current_host() workfile = instance.context.data['workfile'] self.log.info("workfile '%s'" % workfile) if host == 'nuke': import nuke nuke.scriptSaveAs(workfile) elif host == 'maya': import pymel.core as pm if os.path.exists(workfile): pm.system.openFile(workfile, force=True) else: if context.data['ftrackData']['Project']['code'] == 'hbt': from ftrack_kredenc import ft_maya reload(ft_maya) import maya_utils as mu reload(mu) try: if (context.data['ftrackData']['Task']['code']).lower() in ['anim', 'animation', 'render', 'layout', 'lighting', 'light']: shotId = os.getenv('FTRACK_SHOTID') session = ftrack_api.Session() shot = session.query('Shot where id is {}'.format(shotId)).one() handles = int(shot['custom_attributes']['handles']) sf = int(shot['custom_attributes']['fstart']) ef = int(shot['custom_attributes']['fend']) ft_maya.framerate_init() pm.playbackOptions(playbackSpeed = 1.0) pm.playbackOptions(ast=sf-handles, aet=ef+handles, min=sf-handles, max=ef+handles) #change path by hand publishArr = workfile.split('\\') del publishArr[-1] del publishArr[-1] del publishArr[-1] newPath = ("/".join(publishArr)) + "/publish/audio" mu.loadSound(newPath, sf = (sf-handles), fileTypes = ['wav']) except: pass import hbt_renderSetup reload(hbt_renderSetup) hbt_renderSetup.run() pm.saveAs(workfile, type='mayaAscii') #load sound if hbt project and has sound proj_path = os.path.dirname(workfile) self.log.info("Setting Maya project to '%s'" % proj_path) pm.mel.setProject(proj_path) elif host == 'houdini': import hou if os.path.exists(workfile): hou.hipFile.open(hou.expandString(workfile).replace('\\', '/')) else: hou.hipFile.save(hou.expandString(workfile).replace('\\', '/')) else: raise pyblish.api.ValidationError( "Can't find workfile in instance.context.")
def saveScene(**kwargs): sSceneType = "" sCurScnPath = pm.sceneName() if not sCurScnPath: sCurScnPath = "untitled" sSceneName = "untitled scene" sSceneTypeList = ['mayaAscii', 'mayaBinary'] else: sSceneName = sCurScnPath sExt = osp.splitext(sCurScnPath)[1].lower() sSceneTypeList = [] if sExt: if sExt == ".ma": sSceneTypeList = ['mayaAscii'] elif sExt == ".mb": sSceneTypeList = ['mayaBinary'] if not sSceneTypeList: raise ValueError("Invalid maya scene extension: '{}'".format(sExt)) #sSceneTypeList = mc.file(q=True, type=True) if len(sSceneTypeList) > 1: raise RuntimeError, 'Saving "{0}" : More than one type matches this file : {1}'\ .format(sCurScnPath, sSceneTypeList) else: sSceneType = sSceneTypeList[0] sWantedSceneType = kwargs.get('fileType', kwargs.get('ft', '')) if sWantedSceneType and (sWantedSceneType != sSceneType): if sWantedSceneType not in ('mayaAscii', 'mayaBinary'): raise ValueError('Invalid file type: "{0}"'.format(sWantedSceneType)) sSceneType = sWantedSceneType else: if not mc.file(q=True, modified=True): pm.displayWarning("Current scene has NO changes to save: '{}'.".format(sSceneName)) return sCurScnPath bPrompt = kwargs.get("prompt", True) if bPrompt: if kwargs.get("discard", True): buttonList = ("Save", "Don't Save", "Cancel") sDismiss = "Don't Save" sConfirmEnd = "?" else: buttonList = ("Save", "Cancel") sDismiss = "Cancel" sConfirmEnd = "!" sMsg = 'Save changes to :\n\n{0} {1}'.format(sSceneName, sConfirmEnd) sConfirm = pm.confirmDialog(title="DO YOU WANT TO...", message=sMsg, button=buttonList, defaultButton="Cancel", cancelButton="Cancel", dismissString=sDismiss, icon="question", ) else: sConfirm = "Save" if sConfirm == "Cancel": logMsg("Cancelled !" , warning=True) return "" elif sConfirm == "Don't Save": return sCurScnPath elif sConfirm == "Save": bNoFileCheck = kwargs.pop("noFileCheck", True) if (not sCurScnPath) or sCurScnPath == "untitled": sFileList = chooseMayaScene(ff=sSceneTypeList) if not sFileList: return "" if bNoFileCheck: pmu.putEnv("DAVOS_FILE_CHECK", "") return pm.saveAs(sFileList[0], force=True) else: if bNoFileCheck: pmu.putEnv("DAVOS_FILE_CHECK", "") if kwargs.get("checkError", True): try: assertCurrentSceneReadWithoutDataLoss() except AssertionError: return "" if sSceneType: return pm.saveFile(force=True, type=sSceneType) else: return pm.saveFile(force=True)
def save_as(self, version): """The save_as action for maya environment. It saves the given Version instance to the Version.full_path. """ # do not save if there are local files self.check_external_files() # set version extension to ma version.extension = '.ma' project = version.project current_workspace_path = pm.workspace.path # create a workspace file inside a folder called .maya_files # at the parent folder of the current version workspace_path = os.path.dirname(version.path) # if the new workspace path is not matching the with the previous one # update the external paths to absolute version logger.debug("current workspace: %s" % current_workspace_path) logger.debug("next workspace: %s" % workspace_path) if current_workspace_path != workspace_path: logger.debug("changing workspace detected!") logger.debug("converting paths to absolute, to be able to " "preserve external paths") # replace external paths with absolute ones self.replace_external_paths(mode=1) # create the workspace folders self.create_workspace_file(workspace_path) # this sets the project pm.workspace.open(workspace_path) # create workspace folders self.create_workspace_folders(workspace_path) # only if the file is a new version if version.version_number == 1: # set scene fps self.set_fps(project.fps) # set render resolution self.set_resolution(project.width, project.height, project.pixel_aspect) # set the render range if version.type.type_for == 'Shot': self.set_frame_range( version.version_of.start_frame, version.version_of.end_frame ) # set the render file name and version self.set_render_fileName(version) # set the playblast file name self.set_playblast_file_name(version) # create the folder if it doesn't exists utils.createFolder(version.path) # delete the unknown nodes unknownNodes = pm.ls(type='unknown') pm.delete(unknownNodes) # set the file paths for external resources self.replace_external_paths(mode=1) # save the file pm.saveAs( version.full_path, type='mayaAscii' ) # update the reference list self.update_references_list(version) # append it to the recent file list self.append_to_recent_files( version.full_path ) return True
def launch(self, *args, **kwargs): """launch renderer command """ # do nothing if there is no window (called externally) if not self.window: return # warn the user about the ignore settings try: dAO = pm.PyNode('defaultArnoldRenderOptions') ignore_attrs = [ 'ignoreSubdivision', 'ignoreDisplacement', 'ignoreBump', 'ignoreMotionBlur' ] attr_values = [ (attr, dAO.getAttr(attr)) for attr in ignore_attrs if dAO.getAttr(attr) is True ] if any(attr_values): msg_text = '<br>'.join( map( lambda x: '%s: %s' % (x[0], x[1]), attr_values ) ) response = pm.confirmDialog( title='Ignore These Settings?', message='You have ignored:<br><br>%s<br><br><b>Is that ok?</b>' % msg_text, button=['Yes', 'No'], defaultButton='No', cancelButton='No', dismissString='No' ) if response == 'No': return except pm.MayaNodeError: # no Arnold pass # check if rendering with persp camera try: wrong_camera_names = [ 'perspShape', 'topShape', 'sideShape', 'fontShape', 'persp1Shape', 'perspShape1', ] renderable_cameras = [node for node in pm.ls(type='camera') if node.getAttr('renderable')] if any(map(lambda x: x.name() in wrong_camera_names, renderable_cameras)): response = pm.confirmDialog( title='Rendering with Persp?', message='You are rendering with <b>Persp Camera<b><br><br>Is that ok?</b>', button=['Yes', 'No'], defaultButton='No', cancelButton='No', dismissString='No' ) if response == 'No': return if len(renderable_cameras) > 1: response = pm.confirmDialog( title='Rendering more than one Camera?', message='You are rendering <b>more than one camera<b><br><br>Is that ok?</b>', button=['Yes', 'No'], defaultButton='No', cancelButton='No', dismissString='No' ) if response == 'No': return elif len(renderable_cameras) == 0: pm.confirmDialog( title='No <b>Renderable</b> camera!!!', message='There is no <b>renderable camera<b>!!!', button=['Ok'], defaultButton='Ok', cancelButton='Ok', dismissString='Ok' ) return except pm.MayaNodeError: # no default render globals node pass drg = pm.PyNode('defaultRenderGlobals') render_engine = drg.getAttr('currentRenderer') # RENDERER SPECIFIC CHECKS if render_engine == 'redshift': # if the renderer is RedShift # check if unifiedDisableDivision is 1 which will take too much time # to render dro = pm.PyNode('redshiftOptions') if dro.unifiedDisableDivision.get() == 1: response = pm.confirmDialog( title="Enabled **Don't Automatically Reduce Samples of Other Effects**", message='It is not allowed to render with the following option is enabled:<br>' '<br>' "Don't Automatically Reduce Samples of Other Effects: Enabled<br>" "<br>" "Please DISABLE it!", button=['OK'], defaultButton='OK', cancelButton='OK', dismissString='OK' ) return elif render_engine == 'arnold': # check if the samples are too high dAO = pm.PyNode('defaultArnoldRenderOptions') aa_samples = dAO.AASamples.get() diff_samples = dAO.GIDiffuseSamples.get() glossy_samples = dAO.GIGlossySamples.get() if int(pm.about(v=1)) >= 2017: sss_samples = dAO.GISssSamples.get() else: sss_samples = dAO.sssBssrdfSamples.get() total_diff_samples = aa_samples**2 * diff_samples**2 total_glossy_samples = aa_samples**2 * glossy_samples**2 total_sss_samples = aa_samples**2 * sss_samples**2 max_allowed_diff_samples = 225 max_allowed_glossy_samples = 100 max_allowed_sss_samples = 450 if total_diff_samples > max_allowed_diff_samples: pm.confirmDialog( title="Too Much Diffuse Samples!!!", message='You are using too much DIFFUSE SAMPLES (>%s)<br>' '<br>' 'Please either reduce AA samples of Diffuse ' 'Samples!!!' % max_allowed_diff_samples, button=['OK'], defaultButton='OK', cancelButton='OK', dismissString='OK' ) return if total_glossy_samples > max_allowed_glossy_samples: pm.confirmDialog( title="Too Much Glossy Samples!!!", message='You are using too much GLOSSY SAMPLES (>%s)<br>' '<br>' 'Please either reduce AA samples of Glossy ' 'Samples!!!' % max_allowed_glossy_samples, button=['OK'], defaultButton='OK', cancelButton='OK', dismissString='OK' ) return if total_sss_samples > max_allowed_sss_samples: pm.confirmDialog( title="Too Much SSS Samples!!!", message='You are using too much SSS SAMPLES (>%s)<br>' '<br>' 'Please either reduce AA samples of SSS ' 'Samples!!!' % max_allowed_sss_samples, button=['OK'], defaultButton='OK', cancelButton='OK', dismissString='OK' ) return # check Light Samples # check point lights with zero radius but more than one samples all_point_lights = pm.ls(type='pointLight') ridiculous_point_lights = [] for point_light in all_point_lights: if point_light.aiRadius.get() < 0.1 and point_light.aiSamples.get() > 1: ridiculous_point_lights.append(point_light) if ridiculous_point_lights: pm.confirmDialog( title="Unnecessary Samples on Point Lights!!!", message='You are using too much SAMPLES (>1)<br>' '<br>' 'on <b>Point lights with zero radius</b><br>' '<br>' 'Please reduce the samples to 1', button=['OK'], defaultButton='OK', cancelButton='OK', dismissString='OK' ) return # Check area lights with more than 2 samples all_area_lights = pm.ls(type=['areaLight', 'aiAreaLight']) ridiculous_area_lights = [] for area_light in all_area_lights: if area_light.aiSamples.get() > 2: ridiculous_area_lights.append(area_light) if ridiculous_area_lights: pm.confirmDialog( title="Unnecessary Samples on Area Lights!!!", message='You are using too much SAMPLES (>2) on<br>' '<br>' '<b>Area Lights</b><br>' '<br>' 'Please reduce the samples to 2', button=['OK'], defaultButton='OK', cancelButton='OK', dismissString='OK' ) return # Check directional lights with angle == 0 and samples > 1 all_directional_lights = pm.ls(type='directionalLight') ridiculous_directional_lights = [] for directional_light in all_directional_lights: if directional_light.aiAngle.get() == 0 and directional_light.aiSample.get() > 1: ridiculous_directional_lights.append(directional_light) if ridiculous_directional_lights: pm.confirmDialog( title="Unnecessary Samples on Directional Lights!!!", message='You are using too much SAMPLES (>1) on <br>' '<br>' '<b>Directional lights with zero angle</b><br>' '<br>' 'Please reduce the samples to 1', button=['OK'], defaultButton='OK', cancelButton='OK', dismissString='OK' ) return # get values start_frame = pm.intField('cgru_afanasy__start_frame', q=1, v=1) end_frame = pm.intField('cgru_afanasy__end_frame', q=1, v=1) frames_per_task = \ pm.intField('cgru_afanasy__frames_per_task', q=1, v=1) by_frame = pm.intField('cgru_afanasy__by_frame', q=1, v=1) hosts_mask = pm.textField('cgru_afanasy__hosts_mask', q=1, text=True) hosts_exclude = pm.textField('cgru_afanasy__hosts_exclude', q=1, text=True) separate_layers = \ pm.checkBox('cgru_afanasy__separate_layers', q=1, v=1) pause = pm.checkBox('cgru_afanasy__paused', q=1, v=1) life_time = pm.intField('cgru_afanasy__life_time', q=1, v=1) # check values if start_frame > end_frame: temp = end_frame end_frame = start_frame start_frame = temp frames_per_task = max(1, frames_per_task) by_frame = max(1, by_frame) # store without quota sign hosts_mask = hosts_mask.replace('"', '') hosts_exclude = hosts_exclude.replace('"', '') # store field values pm.optionVar['cgru_afanasy__start_frame_ov'] = start_frame pm.optionVar['cgru_afanasy__end_frame_ov'] = end_frame pm.optionVar['cgru_afanasy__frames_per_task_ov'] = frames_per_task pm.optionVar['cgru_afanasy__by_frame_ov'] = by_frame pm.optionVar['cgru_afanasy__hosts_mask_ov'] = hosts_mask pm.optionVar['cgru_afanasy__hosts_exclude_ov'] = hosts_exclude pm.optionVar['cgru_afanasy__separate_layers_ov'] = separate_layers pm.optionVar['cgru_afanasy__life_time_ov'] = life_time # get paths scene_name = pm.sceneName() datetime = '%s%s' % ( time.strftime('%y%m%d-%H%M%S-'), str(time.time() - int(time.time()))[2:5] ) filename = '%s.%s.mb' % (scene_name, datetime) project_path = pm.workspace(q=1, rootDirectory=1) outputs = \ pm.renderSettings(fullPath=1, firstImageName=1, lastImageName=1) # job_name = os.path.basename(scene_name) job_name = self.generate_job_name() logger.debug('%ss %se %sr' % (start_frame, end_frame, by_frame)) logger.debug('scene = %s' % scene_name) logger.debug('file = %s' % filename) logger.debug('job_name = %s' % job_name) logger.debug('project_path = %s' % project_path) logger.debug('outputs = %s' % outputs) if pm.checkBox('cgru_afanasy__close', q=1, v=1): pm.deleteUI(self.window) job = af.Job(job_name) stored_log_level = None if render_engine == 'arnold': # set the verbosity level to warning+info aro = pm.PyNode('defaultArnoldRenderOptions') stored_log_level = aro.getAttr('log_verbosity') aro.setAttr('log_verbosity', 1) # set output to console aro.setAttr("log_to_console", 1) elif render_engine == 'redshift': # set the verbosity level to detailed+info redshift = pm.PyNode('redshiftOptions') stored_log_level = redshift.logLevel.get() redshift.logLevel.set(2) # save file pm.saveAs( filename, force=1, type='mayaBinary' ) # rename back to original name pm.renameFile(scene_name) # create the render command mrc = MayaRenderCommandBuilder( name=job_name, file_full_path=filename, render_engine=render_engine, project=project_path, by_frame=by_frame ) # submit renders blocks = [] if separate_layers: # render each layer separately rlm = pm.PyNode('renderLayerManager') layers = [layer for layer in rlm.connections() if layer.renderable.get()] for layer in layers: mrc_layer = copy.copy(mrc) layer_name = layer.name() mrc_layer.name = layer_name mrc_layer.render_layer = layer_name # create a new block for this layer block = af.Block( layer_name, renderer_to_block_type.get(render_engine, 'maya') ) block.setFiles( afcommon.patternFromDigits( afcommon.patternFromStdC( afcommon.patternFromPaths(outputs[0], outputs[1]) ) ).split(';') ) block.setNumeric( start_frame, end_frame, frames_per_task, by_frame ) block.setCommand(mrc_layer.build_command()) blocks.append(block) else: # create only one block block = af.Block( 'All Layers', renderer_to_block_type.get(render_engine, 'maya') ) block.setFiles( afcommon.patternFromDigits( afcommon.patternFromStdC( afcommon.patternFromPaths(outputs[0], outputs[1]) ) ).split(';') ) block.setNumeric( start_frame, end_frame, frames_per_task, by_frame ) block.setCommand(mrc.build_command()) blocks.append(block) job.setFolder('input', os.path.dirname(filename)) job.setFolder('output', os.path.dirname(outputs[0])) job.setHostsMask(hosts_mask) job.setHostsMaskExclude(hosts_exclude) if life_time > 0: job.setTimeLife(life_time * 3600) job.setCmdPost('deletefiles "%s"' % os.path.abspath(filename)) if pause: job.offline() # add blocks job.blocks.extend(blocks) status, data = job.send() if not status: pm.PopupError('Something went wrong!') print('data: %s' % data) # restore log level if render_engine == 'arnold': aro = pm.PyNode('defaultArnoldRenderOptions') aro.setAttr('log_verbosity', stored_log_level) # disable set output to console aro.setAttr("log_to_console", 0) elif render_engine == 'redshift': redshift = pm.PyNode('redshiftOptions') redshift.logLevel.set(stored_log_level)
print "difference =", c.translate.get() - s.translate.get() # basic vector operation s2 = s.duplicate()[0] # move the new sphere relatively along the z axis s2.setTranslation([0,0,-2], relative=1) # cycle through and move some verts. # we're moving each verts a relative amount based on its vertex number num = s2.numVertices() for i, vert in enumerate(s2.verts): pm.move( vert, [ i / float(num), 0, 0 ], r=1) # save the current scene scene currScene = pm.saveAs( 'pymel_test_main.ma') # the parent property gives the parent directory of the current scene. # the / (slash or divide) operator serves as an os independent way of concatenating paths # it is a shortut to os.path.join exportScene = currScene.parent / 'pymel_test_ref.ma' # if a file already exists where we want to export, delete it first if exportScene.exists(): print "removing existing pymel export scene" exportScene.remove() print "exporting new scene:", exportScene pm.exportSelected( exportScene, f=1 ) # delete the original group
def saveScene(): saveFilePath = pm.textField('path_TFG2', q=True, text=True ) pm.saveAs(saveFilePath)
def export(fileNameFull, fileExt): # Export FILE (mb, ABC, ASS, XGen etc) if fileExt == 'mb': pm.saveAs(fileNameFull) pm.mel.addRecentFile (fileNameFull, "mayaBinary")
def launch(self, *args, **kwargs): """launch renderer command """ # do nothing if there is no window (called externally) if not self.window: return # warn the user about the ignore settings try: dAO = pm.PyNode('defaultArnoldRenderOptions') ignore_attrs = [ 'ignoreSubdivision', 'ignoreDisplacement', 'ignoreBump', 'ignoreMotionBlur' ] attr_values = [dAO.getAttr(attr) for attr in ignore_attrs] if any(attr_values): msg_text = '<br>'.join( map( lambda x, y: '%s: %s' % (x, y), ignore_attrs, attr_values ) ) response = pm.confirmDialog( title='Ignore These Settings?', message='You have ignored:<br><br>%s<br><br><b>Is that ok?</b>' % msg_text, button=['Yes', 'No'], defaultButton='No', cancelButton='No', dismissString='No' ) if response == 'No': return except pm.MayaNodeError: # no Arnold pass # check if rendering with persp camera try: wrong_camera_names = [ 'perspShape', 'topShape', 'sideShape', 'fontShape', 'persp1Shape', 'perspShape1', ] renderable_cameras = [node for node in pm.ls(type='camera') if node.getAttr('renderable')] if any(map(lambda x: x.name() in wrong_camera_names, renderable_cameras)): response = pm.confirmDialog( title='Rendering with Persp?', message='You are rendering with <b>Persp Camera<b><br><br>Is that ok?</b>', button=['Yes', 'No'], defaultButton='No', cancelButton='No', dismissString='No' ) if response == 'No': return if len(renderable_cameras) > 1: response = pm.confirmDialog( title='Rendering more than one Camera?', message='You are rendering <b>more than one camera<b><br><br>Is that ok?</b>', button=['Yes', 'No'], defaultButton='No', cancelButton='No', dismissString='No' ) if response == 'No': return except pm.MayaNodeError: # no default render globals node pass # get values start_frame = pm.intField('cgru_afanasy__start_frame', q=1, v=1) end_frame = pm.intField('cgru_afanasy__end_frame', q=1, v=1) frames_per_task = \ pm.intField('cgru_afanasy__frames_per_task', q=1, v=1) by_frame = pm.intField('cgru_afanasy__by_frame', q=1, v=1) hosts_mask = pm.textField('cgru_afanasy__hosts_mask', q=1, text=True) hosts_exclude = pm.textField('cgru_afanasy__hosts_exclude', q=1, text=True) separate_layers = \ pm.checkBox('cgru_afanasy__separate_layers', q=1, v=1) pause = pm.checkBox('cgru_afanasy__paused', q=1, v=1) # check values if start_frame > end_frame: temp = end_frame end_frame = start_frame start_frame = temp frames_per_task = max(1, frames_per_task) by_frame = max(1, by_frame) # store field values pm.optionVar['cgru_afanasy__start_frame_ov'] = start_frame pm.optionVar['cgru_afanasy__end_frame_ov'] = end_frame pm.optionVar['cgru_afanasy__frames_per_task_ov'] = frames_per_task pm.optionVar['cgru_afanasy__by_frame_ov'] = by_frame pm.optionVar['cgru_afanasy__hosts_mask_ov'] = hosts_mask pm.optionVar['cgru_afanasy__hosts_exclude_ov'] = hosts_exclude pm.optionVar['cgru_afanasy__separate_layers'] = separate_layers # get paths scene_name = pm.sceneName() datetime = '%s%s' % ( time.strftime('%y%m%d-%H%M%S-'), str(time.time() - int(time.time()))[2:5] ) filename = '%s.%s.mb' % (scene_name, datetime) project_path = pm.workspace(q=1, rootDirectory=1) outputs = ','.join( pm.renderSettings(fullPath=1, firstImageName=1, lastImageName=1) ) job_name = os.path.basename(scene_name) logger.debug('%ss %se %sr' % (start_frame, end_frame, by_frame)) logger.debug('scene = %s' % scene_name) logger.debug('file = %s' % filename) logger.debug('job_name = %s' % job_name) logger.debug('project_path = %s' % project_path) logger.debug('outputs = %s' % outputs) if pm.checkBox('cgru_afanasy__close', q=1, v=1): pm.deleteUI(self.window) cmd_buffer = [ '"%(filename)s"', '%(start)s', '%(end)s', '-by %(by_frame)s', '-hostsmask %(msk)s', '-hostsexcl %(exc)s', '-fpt %(fpt)s', '-name "%(name)s"', '-pwd "%(pwd)s"', '-proj "%(proj)s"', '-images "%(images)s"', '-deletescene' ] kwargs = { 'filename': filename, 'start': start_frame, 'end': end_frame, 'by_frame': by_frame, 'msk': hosts_mask, 'exc': hosts_exclude, 'fpt': frames_per_task, 'name': job_name, 'pwd': project_path, 'proj': project_path, 'images': outputs } drg = pm.PyNode('defaultRenderGlobals') render_engine = drg.getAttr('currentRenderer') if render_engine == 'mentalRay': cmd_buffer.append('-type maya_mental') elif render_engine == 'arnold': cmd_buffer.append('-type maya_arnold') # set the verbosity level to warnin+info aro = pm.PyNode('defaultArnoldRenderOptions') aro.setAttr('log_verbosity', 1) if pause: cmd_buffer.append('-pause') # set output to console dARO = pm.PyNode('defaultArnoldRenderOptions') dARO.setAttr("log_to_console", 1) # save file pm.saveAs( filename, force=1, type='mayaBinary' ) # rename back to original name pm.renameFile(scene_name) # disable set output to console dARO.setAttr("log_to_console", 0) cmds = [] # submit renders if separate_layers: # render each layer separately rlm = pm.PyNode('renderLayerManager') layers = [layer for layer in rlm.connections() if layer.renderable.get()] for layer in layers: layer_name = layer.name() kwargs['name'] = '%s:%s' % (job_name, layer_name) tmp_cmd_buffer = copy.copy(cmd_buffer) tmp_cmd_buffer.append( '-take %s' % layer.name() ) # create one big command afjob_cmd = ' '.join([ os.environ['CGRU_PYTHONEXE'], '"%s/python/afjob.py"' % os.environ['AF_ROOT'], '%s' % ' '.join(tmp_cmd_buffer) % kwargs ]) cmds.append(afjob_cmd) else: # create one big command afjob_cmd = ' '.join([ os.environ['CGRU_PYTHONEXE'], '%s/python/afjob.py' % os.environ['AF_ROOT'], '%s' % ' '.join(cmd_buffer) % kwargs ]) cmds.append(afjob_cmd) # call each command separately for cmd in cmds: print(cmds) os.system(cmd)
def launch(self, *args, **kwargs): """launch renderer command """ # do nothing if there is no window (called externally) if not self.window: return # warn the user about the ignore settings try: dAO = pm.PyNode('defaultArnoldRenderOptions') ignore_attrs = [ 'ignoreSubdivision', 'ignoreDisplacement', 'ignoreBump', 'ignoreMotionBlur' ] attr_values = [ (attr, dAO.getAttr(attr)) for attr in ignore_attrs if dAO.getAttr(attr) is True ] if any(attr_values): msg_text = '<br>'.join( map( lambda x: '%s: %s' % (x[0], x[1]), attr_values ) ) response = pm.confirmDialog( title='Ignore These Settings?', message='You have ignored:<br><br>%s<br><br><b>Is that ok?</b>' % msg_text, button=['Yes', 'No'], defaultButton='No', cancelButton='No', dismissString='No' ) if response == 'No': return except pm.MayaNodeError: # no Arnold pass # check if rendering with persp camera try: wrong_camera_names = [ 'perspShape', 'topShape', 'sideShape', 'fontShape', 'persp1Shape', 'perspShape1', ] renderable_cameras = [node for node in pm.ls(type='camera') if node.getAttr('renderable')] if any(map(lambda x: x.name() in wrong_camera_names, renderable_cameras)): response = pm.confirmDialog( title='Rendering with Persp?', message='You are rendering with <b>Persp Camera<b><br><br>Is that ok?</b>', button=['Yes', 'No'], defaultButton='No', cancelButton='No', dismissString='No' ) if response == 'No': return if len(renderable_cameras) > 1: response = pm.confirmDialog( title='Rendering more than one Camera?', message='You are rendering <b>more than one camera<b><br><br>Is that ok?</b>', button=['Yes', 'No'], defaultButton='No', cancelButton='No', dismissString='No' ) if response == 'No': return elif len(renderable_cameras) == 0: pm.confirmDialog( title='No <b>Renderable</b> camera!!!', message='There is no <b>renderable camera<b>!!!', button=['Ok'], defaultButton='Ok', cancelButton='Ok', dismissString='Ok' ) return except pm.MayaNodeError: # no default render globals node pass # get values start_frame = pm.intField('cgru_afanasy__start_frame', q=1, v=1) end_frame = pm.intField('cgru_afanasy__end_frame', q=1, v=1) frames_per_task = \ pm.intField('cgru_afanasy__frames_per_task', q=1, v=1) by_frame = pm.intField('cgru_afanasy__by_frame', q=1, v=1) hosts_mask = pm.textField('cgru_afanasy__hosts_mask', q=1, text=True) hosts_exclude = pm.textField('cgru_afanasy__hosts_exclude', q=1, text=True) separate_layers = \ pm.checkBox('cgru_afanasy__separate_layers', q=1, v=1) pause = pm.checkBox('cgru_afanasy__paused', q=1, v=1) life_time = pm.intField('cgru_afanasy__life_time', q=1, v=1) # check values if start_frame > end_frame: temp = end_frame end_frame = start_frame start_frame = temp frames_per_task = max(1, frames_per_task) by_frame = max(1, by_frame) # store without quota sign hosts_mask = hosts_mask.replace('"', '') hosts_exclude = hosts_exclude.replace('"', '') # store field values pm.optionVar['cgru_afanasy__start_frame_ov'] = start_frame pm.optionVar['cgru_afanasy__end_frame_ov'] = end_frame pm.optionVar['cgru_afanasy__frames_per_task_ov'] = frames_per_task pm.optionVar['cgru_afanasy__by_frame_ov'] = by_frame pm.optionVar['cgru_afanasy__hosts_mask_ov'] = hosts_mask pm.optionVar['cgru_afanasy__hosts_exclude_ov'] = hosts_exclude pm.optionVar['cgru_afanasy__separate_layers_ov'] = separate_layers pm.optionVar['cgru_afanasy__life_time_ov'] = life_time # get paths scene_name = pm.sceneName() datetime = '%s%s' % ( time.strftime('%y%m%d-%H%M%S-'), str(time.time() - int(time.time()))[2:5] ) filename = '%s.%s.mb' % (scene_name, datetime) project_path = pm.workspace(q=1, rootDirectory=1) # get output paths, set the RenderPass token to Beauty, # this will at least guarantee to get something outputs = \ pm.renderSettings( fullPath=1, firstImageName=1, lastImageName=1, leaveUnmatchedTokens=1, customTokenString="RenderPass=Beauty" ) job_name = os.path.basename(scene_name) logger.debug('%ss %se %sr' % (start_frame, end_frame, by_frame)) logger.debug('scene = %s' % scene_name) logger.debug('file = %s' % filename) logger.debug('job_name = %s' % job_name) logger.debug('project_path = %s' % project_path) logger.debug('outputs = %s' % outputs) if pm.checkBox('cgru_afanasy__close', q=1, v=1): pm.deleteUI(self.window) drg = pm.PyNode('defaultRenderGlobals') render_engine = drg.getAttr('currentRenderer') job = af.Job(job_name) stored_log_level = None if render_engine == 'arnold': # set the verbosity level to warning+info aro = pm.PyNode('defaultArnoldRenderOptions') stored_log_level = aro.getAttr('log_verbosity') aro.setAttr('log_verbosity', 1) # set output to console aro.setAttr("log_to_console", 1) elif render_engine == 'redshift': # set the verbosity level to detailed+info redshift = pm.PyNode('redshiftOptions') stored_log_level = redshift.logLevel.get() redshift.logLevel.set(2) # save file pm.saveAs( filename, force=1, type='mayaBinary' ) # rename back to original name pm.renameFile(scene_name) # create the render command mrc = MayaRenderCommandBuilder( name=job_name, file_full_path=filename, render_engine=render_engine, project=project_path, by_frame=by_frame ) # submit renders blocks = [] if separate_layers: # render each layer separately rlm = pm.PyNode('renderLayerManager') layers = [layer for layer in rlm.connections() if layer.renderable.get()] for layer in layers: mrc_layer = copy.copy(mrc) layer_name = layer.name() mrc_layer.name = layer_name mrc_layer.render_layer = layer_name # create a new block for this layer block = af.Block( layer_name, renderer_to_block_type.get(render_engine, 'maya') ) block.setFiles( afcommon.patternFromDigits( afcommon.patternFromStdC( afcommon.patternFromPaths(outputs[0], outputs[1]) ) ).split(';') ) block.setNumeric( start_frame, end_frame, frames_per_task, by_frame ) block.setCommand(mrc_layer.build_command()) blocks.append(block) else: # create only one block block = af.Block( 'All Layers', renderer_to_block_type.get(render_engine, 'maya') ) block.setFiles( afcommon.patternFromDigits( afcommon.patternFromStdC( afcommon.patternFromPaths(outputs[0], outputs[1]) ) ).split(';') ) block.setNumeric( start_frame, end_frame, frames_per_task, by_frame ) block.setCommand(mrc.build_command()) blocks.append(block) job.setFolder('input', os.path.dirname(filename)) job.setFolder('output', os.path.dirname(outputs[0])) job.setHostsMask(hosts_mask) job.setHostsMaskExclude(hosts_exclude) if life_time > 0: job.setTimeLife(life_time * 3600) job.setCmdPost('deletefiles "%s"' % os.path.abspath(filename)) if pause: job.offline() # add blocks job.blocks.extend(blocks) status, data = job.send() if not status: pm.PopupError('Something went wrong!') print('data: %s' % data) # restore log level if render_engine == 'arnold': aro = pm.PyNode('defaultArnoldRenderOptions') aro.setAttr('log_verbosity', stored_log_level) # disable set output to console aro.setAttr("log_to_console", 0) elif render_engine == 'redshift': redshift = pm.PyNode('redshiftOptions') redshift.logLevel.set(stored_log_level)