def open_renderTemplate(json_filepath, renderTemplate_descriptor, assembly_descriptor, animationFile_version): renderTemplate_directory = os.path.join(os.getenv('JOB'), "software", "maya", "scenes", "public") renderTemplate_filepath = find_latest_version(renderTemplate_descriptor, renderTemplate_directory) logging.debug(renderTemplate_filepath) pm.openFile(renderTemplate_filepath, force=True) assembly_root_path = os.path.join(os.getenv('JOB'), "software", "maya", "scenes", "public") assembly_filepath = find_latest_version(assembly_descriptor, assembly_root_path) if assembly_filepath is None: assembly_filepath = os.path.join( assembly_root_path, os.getenv('JOB_ASSET_NAME') + "_" + assembly_descriptor + "_" + "v" + str(animationFile_version) + ".ma") logging.debug("assembly_filepath:" + assembly_filepath) print "[ HA MESSAGE ] Save file: ", assembly_filepath pm.renameFile(assembly_filepath) return assembly_filepath
def test_intance_from_meta(self): new_character = components.Character.create() instance = components.Character(new_character.pynode.name()) # Assertions # Meta node attributes self.assertTrue(pm.hasAttr(instance.pynode, "rootCtl")) self.assertTrue(pm.hasAttr(instance.pynode, "characterName")) self.assertTrue(pm.hasAttr(instance.pynode, "rootCtl")) self.assertTrue(pm.hasAttr(instance.pynode, "controlRig")) self.assertTrue(pm.hasAttr(instance.pynode, "deformationRig")) self.assertTrue(pm.hasAttr(instance.pynode, "geometryGroup")) self.assertTrue(pm.hasAttr(instance.pynode, "locatorsGroup")) self.assertTrue(pm.hasAttr(instance.pynode, "worldLocator")) # Main groups self.assertEqual(str(instance.control_rig), names.Character.control_rig.value) self.assertEqual(str(instance.deformation_rig), names.Character.deformation_rig.value) self.assertEqual(str(instance.geometry_grp), names.Character.geometry.value) self.assertEqual(str(instance.locators_grp), names.Character.locators.value) self.assertTrue(pm.objExists(instance.world_locator)) # Data struct self.assertEqual(instance.side, "char") self.assertEqual(instance.name, "character") # Save test scene pm.renameFile( self.get_temp_filename( "character_component_test_instance_from_meta.ma")) pm.saveFile(f=1)
def loadAnimFile(self, file_path, index): # NOTE 打开文件 pm.openFile(file_path, f=1) target = self.target_line.text() source = self.source_line.text() for hik_node in pm.ls(typ="HIKCharacterNode"): if source in str(hik_node): source = hik_node break else: err_msg = "%s - 找不到旧绑定 HIK角色 " % file_path self.error_list.append(err_msg) return # NOTE 导入 reference rig_path = self.rig_line.text() name, ext = os.path.splitext(os.path.basename(rig_path)) ref = pm.createReference(rig_path, r=1, namespace=name) target = "%s:%s" % (name, target) if ":" not in target else target if not pm.objExists(target): err_msg = "%s - 找不到新绑定 HIK角色 " % file_path self.error_list.append(err_msg) return # NOTE 重定向 pm.mel.hikSetCharacterInput(target, source) export_path = self.export_line.text() pm.renameFile(os.path.join(export_path, pm.sceneName().basename())) pm.saveFile(f=1)
def test_create_default(self): instance = luna_rig.components.Character.create() # Assertions # Metanode attributes self.assertTrue(pm.hasAttr(instance.pynode, "rootCtl")) self.assertTrue(pm.hasAttr(instance.pynode, "characterName")) self.assertTrue(pm.hasAttr(instance.pynode, "rootCtl")) self.assertTrue(pm.hasAttr(instance.pynode, "controlRig")) self.assertTrue(pm.hasAttr(instance.pynode, "deformationRig")) self.assertTrue(pm.hasAttr(instance.pynode, "geometryGroup")) self.assertTrue(pm.hasAttr(instance.pynode, "locatorsGroup")) self.assertTrue(pm.hasAttr(instance.pynode, "worldLocator")) # Instance members self.assertEqual(instance.tag, "character") self.assertEqual(str(instance.control_rig), static.CharacterMembers.control_rig.value) self.assertEqual(str(instance.deformation_rig), static.CharacterMembers.deformation_rig.value) self.assertEqual(str(instance.geometry_grp), static.CharacterMembers.geometry.value) self.assertEqual(str(instance.locators_grp), static.CharacterMembers.locators.value) self.assertTrue(pm.objExists(instance.world_locator)) # Save test scene pm.renameFile( self.get_temp_filename( "character_component_test_create_default.ma")) pm.saveFile(f=1)
def test_instance_from_meta(self): component1 = AnimComponent.create() new_component = AnimComponent(component1.pynode.name()) # Assertions # Structs self.assertEqual(new_component.name, "anim_component") self.assertEqual(new_component.side, "c") # Metanode self.assertEqual( str(new_component.pynode), "{0}_{1}_00_meta".format(new_component.side, new_component.name)) self.assertEqual(new_component.pynode.metaRigType.get(), AnimComponent.as_str()) self.assertEqual(new_component.pynode.version.get(), 1) self.assertEqual( str(new_component.root), "{0}_{1}_00_comp".format(new_component.side, new_component.name)) self.assertEqual( str(new_component.group_ctls), "{0}_{1}_00_ctls".format(new_component.side, new_component.name)) self.assertEqual( str(new_component.group_joints), "{0}_{1}_00_jnts".format(new_component.side, new_component.name)) self.assertEqual( str(new_component.group_parts), "{0}_{1}_00_parts".format(new_component.side, new_component.name)) # Meta parent attrs on hierarchy self.assertTrue(pm.hasAttr(new_component.root, "metaParent")) self.assertTrue(pm.hasAttr(new_component.group_ctls, "metaParent")) self.assertTrue(pm.hasAttr(new_component.group_joints, "metaParent")) self.assertTrue(pm.hasAttr(new_component.group_parts, "metaParent")) # Attributes on meta node self.assertTrue(pm.hasAttr(new_component.pynode, "rootGroup")) self.assertTrue(pm.hasAttr(new_component.pynode, "ctlsGroup")) self.assertTrue(pm.hasAttr(new_component.pynode, "jointsGroup")) self.assertTrue(pm.hasAttr(new_component.pynode, "partsGroup")) # Connections to metanode self.assertTrue( pm.isConnected(new_component.root.metaParent, new_component.pynode.rootGroup)) self.assertTrue( pm.isConnected(new_component.group_ctls.metaParent, new_component.pynode.ctlsGroup)) self.assertTrue( pm.isConnected(new_component.group_joints.metaParent, new_component.pynode.jointsGroup)) self.assertTrue( pm.isConnected(new_component.group_parts.metaParent, new_component.pynode.partsGroup)) # Save test scene pm.renameFile( self.get_temp_filename( "anim_component_test_instance_from_meta.ma")) pm.saveFile(f=1)
def saveScene(sceneName, directory, description, category): fullScenePath = _os.path.join(directory, sceneName+'.mb') _pmCore.renameFile(fullScenePath) _pmCore.saveFile() userName = _os.environ.get('AM_USERNAME') _, _, thumbNailPath = _Database.addFile(fullScenePath, sceneName, description, category, userName) _makeThumbnail(128, 128, thumbNailPath) fileID = _Database.getIDByFilePath(fullScenePath) return fileID[0]
def exporter_anim(self): #exporting animation pm.renameFile(pm.textField(self.fbxNameField, q = True, text = True) + '.ma')#changing name pm.select(pm.ls('Root_M', type='joint')[0]) #pm.select(pm.listRelatives(pm.ls('Root_M', type='joint')[0], ad=True, type='joint'), add=True) mel.eval('FBXExportBakeComplexAnimation -v true;FBXExportBakeComplexAnimation -q;') mel.eval('FBXExportAnimationOnly -v true;FBXExportAnimationOnly -q;') mel.eval('FBXExportUseSceneName -v true; FBXExportUseSceneName -q;') mel.eval('FBXExport -f "%s/%s.fbx" -s;' %(pm.textField(self.exportPathField, q = True, text = True).replace('\\', '/'), pm.textField(self.fbxNameField, q = True, text = True))) pm.renameFile(self.fileName + '.ma')
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 save_to_scratch(): scene_name = pm.sceneName() basename = os.path.basename(scene_name) scratch_file = tempfile.NamedTemporaryFile(suffix=basename, dir=SCRATCH, delete=False) scratch_file.close() pm.renameFile(scratch_file.name) pm.saveFile() pm.renameFile(scene_name) os.chmod(scratch_file.name, 0o0777) return scratch_file.name
def run(self): sceneName = pm.sceneName() rigData = self.getRigMetaData() # save to temp location and open tempPath = os.path.join(tempfile.gettempdir(), 'pulse_built_rig_temp.mb') pm.select(self.rig) pm.exportSelected(tempPath, type='mayaBinary', force=True) pm.openFile(tempPath, force=True) # rename opened file, but don't save filename = self.filename.format(rig=rigData) + '.mb' newName = os.path.join(os.path.dirname(sceneName), filename) pm.renameFile(newName)
def test_create_with_meta_parent(self): component1 = AnimComponent.create() component2 = AnimComponent.create(meta_parent=component1) self.assertTrue( pm.isConnected(component2.pynode.metaParent, component1.pynode.metaChildren[0])) self.assertEqual(component2.get_meta_parent(), component1) # Save test scene pm.renameFile( self.get_temp_filename( "anim_component_test_create_with_meta_parent.ma")) pm.saveFile(f=1)
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 animExpButton(self): try: #combined export button self.saveFileName = pm.saveAs(pm.sceneName()[:-3] + '_temp.ma') #saving as a backup before exporting if self.ingameExport.isChecked() == True:#motion export self.animExport_1() self.animExport_2() elif self.camExport.isChecked() == True: #camera export self.cameraExport() ''' DELETE LATER elif self.cutsceneExport.isChecked() == True: #self.cutSceneExport() pm.confirmDialog(title = 'SER 出力ツール', message = u'Not yet implemented /nまだ書いていません') pass ''' pm.openFile(self.saveFileName, force = True) #opening original file pm.renameFile(self.saveFileName.replace('_temp', '')) #renames the file back to the original name before it was os.remove(self.saveFileName) try: #spamming delete entry in case there are entries before already mel.eval('gameExp_DeleteAnimationClipLayout 0;') except: pass for i in pm.lsUI(windows = True):#closing the game exporter window if 'gameExporterWindow' in i: pm.deleteUI(i) #copy pasta part if self.camExport.isChecked() == True: #camera export copy2(self.exportPath.text() + r'/' + self.exportName.text() + '_cam.fbx', r'D:/SER/GIT/Assets/AssetBundle/Resources' + self.exportPath.text()[39:]) #r'D:\SER\GIT/Assets/AssetBundle/Resources' + print self.exportPath.text() + r'/' + self.exportName.text() + '_cam.fbx', r'D:/SER/GIT/Assets/AssetBundle/Resources' + self.exportPath.text()[39:] else: copy2(self.exportPath.text() + r'/' + self.exportName.text() + '.fbx', r'D:/SER/GIT/Assets/AssetBundle/Resources' + self.exportPath.text()[39:]) #r'D:\SER\GIT/Assets/AssetBundle/Resources' + print self.exportPath.text() + r'/' + self.exportName.text() + '.fbx', r'D:/SER/GIT/Assets/AssetBundle/Resources' + self.exportPath.text()[39:] pm.confirmDialog(title = 'SER 出力ツール', message = u'モーションは出力しました') print('SER Export complete!') except: pm.confirmDialog(title = 'SER 出力ツール', message = u'エラーが発生しました。早速チューまで連絡してください。') pm.openFile(self.saveFileName, force = True)#re-open the save file pm.renameFile(self.saveFileName.replace('_temp', '')) #renames the file back to the original name before it was os.remove(self.saveFileName)
def test_create_with_meta_parent(self): test_character = luna_rig.components.Character.create( name="test_character") component1 = luna_rig.AnimComponent.create(character=test_character) component2 = luna_rig.AnimComponent.create(meta_parent=component1, character=test_character) self.assertTrue( pm.isConnected(component2.pynode.metaParent, component1.pynode.metaChildren[0])) self.assertEqual(component2.meta_parent, component1) # Save test scene pm.renameFile( self.get_temp_filename( "anim_component_test_create_with_meta_parent.ma")) pm.saveFile(f=1)
def test_joint_chain(self): # Setup test scene pm.joint(n="c_spine_ik_00_jnt", p=[-1.447, 0, -0.979]) pm.joint(n="c_spine_ik_01_jnt", p=[6.67, 0, 0], r=1) pm.joint(n="c_spine_ik_02_jnt", p=[5.06, 0, 0], r=1) pm.joint(n="c_spine_ik_03_jnt", p=[5.06, 0, 0], r=1) # Assertions expected_chain = [ "c_spine_ik_00_jnt", "c_spine_ik_01_jnt", "c_spine_ik_02_jnt", "c_spine_ik_03_jnt" ] result_chain = jointFn.joint_chain("c_spine_ik_00_jnt") self.assertListEqual(result_chain, expected_chain) # Save test scene pm.renameFile(self.get_temp_filename("jointFn_test_joint_chain.ma")) pm.saveFile(f=1)
def setProject(): try: QtGui.QApplication.setOverrideCursor(QtCore.Qt.BusyCursor) container = sandbox.get(pm.workspace.path)[0] except: container = None finally: QtGui.QApplication.restoreOverrideCursor() dialog = BrowserDialog(modal=True) dialog.setBrowseType(BrowserDialog.BrowseContainers) dialog.setHintText("Select a container.") dialog.setCwd(pm.workspace.path) dialog.setSelectedItem(container) if dialog.exec_() == QtGui.QDialog.Accepted: container = dialog.selectedItem() if not container: return work_root = sandbox.get_path(container) # set the project mayautils.setProject(work_root) print "Set project to %s" % work_root # rename the scene to something sane # otherwise, the scene will be named something in the previous project pm.renameFile(os.path.join(pm.workspace.path, pm.workspace.fileRules["scene"], pm.sceneName().name)) # check if we have start_frame and end_frame properties available for l in container.labels.values(): if "frame_start" in l.properties and "frame_end" in l.properties: frame_start = l.properties.frame_start frame_end = l.properties.frame_end if frame_start is not None and frame_end is not None: pm.playbackOptions(animationStartTime=frame_start, minTime=frame_start, animationEndTime=frame_end, maxTime=frame_end) pm.currentTime(frame_start) print "Set frame range to: %d-%d" % (frame_start, frame_end) break
def test_duplicate_chain_replace_side(self): # Setup test scene pm.joint(n="c_spine_ik_00_jnt", p=[-1.447, 0, -0.979]) pm.joint(n="c_spine_ik_01_jnt", p=[6.67, 0, 0], r=1) pm.joint(n="c_spine_ik_02_jnt", p=[5.06, 0, 0], r=1) pm.joint(n="c_spine_ik_03_jnt", p=[5.06, 0, 0], r=1) jointFn.duplicate_chain(start_joint="c_spine_ik_00_jnt", replace_side="l") # Assertions self.assertTrue(pm.objExists("l_spine_ik_00_jnt")) self.assertTrue(pm.objExists("l_spine_ik_01_jnt")) self.assertTrue(pm.objExists("l_spine_ik_02_jnt")) self.assertTrue(pm.objExists("l_spine_ik_03_jnt")) # Save test scene pm.renameFile( self.get_temp_filename( "jointFn_test_duplicate_chain_replace_side.ma")) pm.saveFile(f=1)
def test_get_meta_children(self): component1 = AnimComponent.create() child_components = [] for i in range(5): child_components.append( AnimComponent.create(meta_parent=component1)) # Assertions for child in child_components: self.assertEqual(component1, child.get_meta_parent()) self.assertEqual(component1.pynode, child.get_meta_parent().pynode) self.assertListEqual(child_components, component1.get_meta_children()) self.assertListEqual( child_components, component1.get_meta_children(of_type=AnimComponent)) # Save test scene pm.renameFile( self.get_temp_filename("anim_component_test_get_meta_children.ma")) pm.saveFile(f=1)
def test_create_default(self): guide = pm.spaceLocator(n="temp_guide") guide.ty.set(5) instance = control.Control.create(name="arm_ik", side="r", object_to_match=guide, attributes="tr", delete_match_object=False) # Assertions self.assertTrue(instance.is_control(instance.transform)) self.assertEqual(instance.name, "arm_ik") self.assertEqual(instance.side, "r") self.assertEqual(instance.group.ty.get(), 5) self.assertTrue(instance.transform.sx.isLocked()) self.assertTrue(instance.transform.sy.isLocked()) self.assertTrue(instance.transform.sz.isLocked()) # Save test file pm.renameFile(self.get_temp_filename("control_test_create_default.ma")) pm.saveFile(f=1)
def test_duplicate_chain_start_end(self): # Setup test scene pm.joint(n="c_spine_ik_00_jnt", p=[-1.447, 0, -0.979]) pm.joint(n="c_spine_ik_01_jnt", p=[6.67, 0, 0], r=1) pm.joint(n="c_spine_ik_02_jnt", p=[5.06, 0, 0], r=1) pm.joint(n="c_spine_ik_03_jnt", p=[5.06, 0, 0], r=1) duplicated_chain = jointFn.duplicate_chain( start_joint="c_spine_ik_01_jnt", end_joint="c_spine_ik_02_jnt", replace_name=["arm", "fk"]) # Assertions self.assertTrue(pm.objExists("c_arm_fk_00_jnt")) self.assertTrue(pm.objExists("c_arm_fk_01_jnt")) self.assertEqual(duplicated_chain[0].getTranslation(), pm.PyNode("c_spine_ik_01_jnt").getTranslation()) # Save test scene pm.renameFile( self.get_temp_filename( "jointFn_test_duplicate_chain_start_end.ma")) pm.saveFile(f=1)
def test_rename(self): instance = luna_rig.Control.create(name="arm_ik", side="r", offset_grp=True, joint=1) # Expectated names expected_ctl_name = nameFn.generate_name(name="leg", side="l", suffix="ctl") expected_grp_name = nameFn.generate_name(name="leg", side="l", suffix="grp") expected_jnt_name = nameFn.generate_name(name="leg", side="l", suffix="cjnt") expected_ofs_name = nameFn.generate_name(name="leg", side="l", suffix="ofs") expected_extra_ofs_name = nameFn.generate_name(name="leg_00_extra", side="l", suffix="ofs") instance.insert_offset(extra_name="extra") instance.rename(side="l", name="leg") self.assertEqual(instance.transform.name(), expected_ctl_name) self.assertEqual(instance.group.name(), expected_grp_name) self.assertEqual(instance.joint.name(), expected_jnt_name) self.assertEqual(instance.offset_list[0].name(), expected_ofs_name) self.assertEqual(instance.offset.name(), expected_extra_ofs_name) # Save test file pm.renameFile(self.get_temp_filename("control_test_rename.ma")) pm.saveFile(f=1)
def test_get_meta_children(self): test_character = luna_rig.components.Character.create( name="test_character") component1 = luna_rig.AnimComponent.create(character=test_character) child_components = [] for i in range(5): child_components.append( luna_rig.AnimComponent.create(meta_parent=component1, character=test_character)) # Assertions for child in child_components: self.assertEqual(component1, child.meta_parent) self.assertEqual(component1.pynode, child.meta_parent.pynode) self.assertEqual(component1.character, child.character) self.assertListEqual(child_components, component1.get_meta_children()) self.assertListEqual( child_components, component1.get_meta_children(of_type=luna_rig.AnimComponent)) # Save test scene pm.renameFile( self.get_temp_filename("anim_component_test_get_meta_children.ma")) pm.saveFile(f=1)
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 # Check dome light backgrounds domes_to_fix = [] rs_domes = pm.ls(type='RedshiftDomeLight') if rs_domes: for rs_dome in rs_domes: if rs_dome.getAttr('background_enable') == 1 \ or rs_dome.getAttr('backPlateEnabled') == 1: domes_to_fix.append(rs_dome.name()) if domes_to_fix: message = 'Some DomeLights have <b>BackGround Render ' \ 'Enabled</b>:' \ '<br><br>%s<br><br>' \ 'Are you Sure?' % '<br>'.join(domes_to_fix) response = pm.confirmDialog( title='Dome Lights with Background Enabled?', message=message, button=['Yes', 'No'], defaultButton='No', cancelButton='No', dismissString='No' ) if response == 'No': return # abort on license fail dro.abortOnLicenseFail.set(1) 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() try: glossy_samples = dAO.GIGlossySamples.get() except AttributeError: glossy_samples = dAO.GISpecularSamples.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 = 800 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 = [] dir_sample_attr_name = 'aiSamples' # if pm.about(v=1) == "2014": # dir_sample_attr_name = 'aiSamples' for directional_light in all_directional_lights: if directional_light.aiAngle.get() == 0 and directional_light.attr(dir_sample_attr_name).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.radioButtonGrp('cgru_afanasy__separate_layers', q=1, sl=1) pause = pm.checkBox('cgru_afanasy__paused', q=1, v=1) life_time = pm.intField('cgru_afanasy__life_time', q=1, v=1) annotation = pm.textField('cgru_afanasy__annotation', q=1, text=True) submit_multiple_times = pm.intField('cgru_afanasy__submit_multiple_times', q=1, v=1) errors_avoid_host = pm.intField('cgru_afanasy__errors_avoid_host', q=1, v=1) errors_retries = pm.intField('cgru_afanasy__errors_retries', q=1, v=1) errors_task_same_host = pm.intField('cgru_afanasy__errors_task_same_host', q=1, v=1) errors_forgive_time = pm.intField('cgru_afanasy__errors_forgive_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 pm.optionVar['cgru_afanasy__annotation_ov'] = annotation pm.optionVar['cgru_afanasy__submit_multiple_times_ov'] = submit_multiple_times pm.optionVar['cgru_afanasy__errors_avoid_host_ov'] = errors_avoid_host pm.optionVar['cgru_afanasy__errors_retries_ov'] = errors_retries pm.optionVar['cgru_afanasy__errors_task_same_host_ov'] = errors_task_same_host pm.optionVar['cgru_afanasy__errors_errors_forgive_time_ov'] = errors_forgive_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) # 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) 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) logger.debug('annotation = %s' % annotation) logger.debug('separate_layers = %s' % separate_layers) logger.debug('errors_avoid_host = %s' % errors_avoid_host) logger.debug('errors_retries = %s' % errors_retries) logger.debug('errors_task_same_host = %s' % errors_task_same_host) logger.debug('errors_forgive_time = %s' % errors_forgive_time) if pm.checkBox('cgru_afanasy__close', q=1, v=1): pm.deleteUI(self.window) 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', 2) # 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 jobs = [] blocks = [] # # separate_layers: # 1 -> None -> submit one job with a single block with all layers # 2 -> Block -> submit one job with multiple blocks # 3 -> Job -> submit multiple jobs with a single block per layer # if separate_layers in [1, 2]: job = af.Job(job_name) jobs.append(job) if separate_layers in [2, 3]: # 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') ) # Fix the output path for this layer # by replacing the "masterLayer" with the layer name # without rs_ at the beginning layer_outputs = outputs if layer_name != 'defaultRenderLayer': layer_outputs[0] = outputs[0].replace( 'masterLayer', layer_name.replace('rs_', '') ) layer_outputs[1] = outputs[1].replace( 'masterLayer', layer_name.replace('rs_', '') ) outputs_split = afcommon.patternFromDigits( afcommon.patternFromStdC( afcommon.patternFromPaths( layer_outputs[0], layer_outputs[1] ) ) ).split(';') block.setFiles(outputs_split) block.setNumeric( start_frame, end_frame, frames_per_task, by_frame ) command = mrc_layer.build_command() block.setErrorsAvoidHost(errors_avoid_host) block.setErrorsRetries(errors_retries) block.setErrorsTaskSameHost(errors_task_same_host) block.setErrorsForgiveTime(errors_forgive_time) block.setCommand(command) if separate_layers == 2: blocks.append(block) else: job = af.Job('%s - %s' % (job_name, layer_name)) # add blocks job.blocks = [block] jobs.append(job) 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 ) command = mrc.build_command() block.setCommand(command) blocks.append(block) for job in jobs: job.setAnnotation(annotation) 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) else: job.setTimeLife(240 * 3600) job.setCmdPost('deletefiles -s "%s"' % os.path.abspath(filename)) if pause: job.offline() # add blocks if separate_layers in [1, 2]: job.blocks.extend(blocks) for i in range(submit_multiple_times): orig_job_name = job.data['name'] job.setName('%s - %03i' % (orig_job_name, i + 1)) status, data = job.send() # restore job name job.setName(orig_job_name) if not status: pm.PopupError('Something went wrong!') # 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) # disable abort on license fail redshift.abortOnLicenseFail.set(0)
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)
def extract_shot(self, shot_node_name): shot_node = pm.ls(shot_node_name, type="shot")[0] shot_name = shot_node.getShotName() split_string = shot_node.assets.get() requiered_nodes = [] if split_string is not None: requiered_nodes.extend(split_string.split(";")) # . . . . . . . . . . . . . . . . . . . . . . # collect info from shot node camera_shape = pm.PyNode(shot_node.getCurrentCamera()) camera_reference = \ pm.referenceQuery(camera_shape, referenceNode=True) camera_node = None if isinstance(camera_shape, pm.nt.Camera): camera_node = camera_shape.getParent() else: camera_node = camera_shape requiered_nodes.append(camera_reference) top_reference_nodes = pm.listReferences(recursive=False) for shot_element in pm.ls(type='shot'): if shot_element != shot_node: pm.delete(shot_element) gpu_cache_nodes = pm.ls(type='gpuCache') for gpu_cache in gpu_cache_nodes: gpu_cache_transform = gpu_cache.getParent() if gpu_cache_transform.name() not in requiered_nodes: pm.delete(gpu_cache_transform) first_frame = shot_node.getStartTime() last_frame = shot_node.getEndTime() self.bake_constraints(first_frame, last_frame) print("finish baking constraints") for reference_node in top_reference_nodes: if reference_node.refNode.name() not in requiered_nodes: reference_node.remove() # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . self.keyframesManager \ .limit_animation_curves(first_frame, last_frame) self.keyframesManager \ .move_animation_with_cutItem_data(first_frame, shot_node) # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . camera_publish_path = self.get_publish_camera_path(shot_name) self.export_camera(camera_node, camera_publish_path, first_frame, last_frame) self.publish_camera(shot_name, camera_publish_path) # . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . shot_publish_scene_path = self.get_publish_scene_path( shot_name, "maya_shot_work") pm.renameFile(shot_publish_scene_path) pm.saveFile(force=True, type='mayaAscii') self.publish_scene(shot_name) self.create_breakdown(shot_name, requiered_nodes)
def run(self): sceneName = pm.sceneName() rigData = self.getRigMetaData() filename = self.filename.format(rig=rigData) + '.mb' newName = os.path.join(os.path.dirname(sceneName), filename) pm.renameFile(newName)
def test_create_default(self): test_character = luna_rig.components.Character.create( name="test_character") new_component = luna_rig.AnimComponent.create(character=test_character) # Assertions # Metanode self.assertEqual( str(new_component.pynode), "{0}_{1}_00_meta".format(new_component.side, new_component.name)) self.assertEqual(new_component.pynode.metaType.get(), luna_rig.AnimComponent.as_str()) self.assertEqual( str(new_component.root), "{0}_{1}_00_comp".format(new_component.side, new_component.name)) self.assertEqual( str(new_component.group_ctls), "{0}_{1}_00_ctls".format(new_component.side, new_component.name)) self.assertEqual( str(new_component.group_joints), "{0}_{1}_00_jnts".format(new_component.side, new_component.name)) self.assertEqual( str(new_component.group_parts), "{0}_{1}_00_parts".format(new_component.side, new_component.name)) self.assertEqual( str(new_component.group_noscale), "{0}_{1}_00_noscale".format(new_component.side, new_component.name)) self.assertEqual( str(new_component.group_out), "{0}_{1}_00_out".format(new_component.side, new_component.name)) self.assertEqual(new_component.tag, "") # Character connection self.assertEqual(new_component.character, test_character) # Meta parent attrs on hierarchy self.assertTrue(pm.hasAttr(new_component.root, "metaParent")) self.assertTrue(pm.hasAttr(new_component.group_ctls, "metaParent")) self.assertTrue(pm.hasAttr(new_component.group_joints, "metaParent")) self.assertTrue(pm.hasAttr(new_component.group_parts, "metaParent")) self.assertTrue(pm.hasAttr(new_component.group_out, "metaParent")) self.assertTrue(pm.hasAttr(new_component.group_noscale, "metaParent")) # Attributes on meta node self.assertTrue(pm.hasAttr(new_component.pynode, "rootGroup")) self.assertTrue(pm.hasAttr(new_component.pynode, "ctlsGroup")) self.assertTrue(pm.hasAttr(new_component.pynode, "jointsGroup")) self.assertTrue(pm.hasAttr(new_component.pynode, "partsGroup")) self.assertTrue(pm.hasAttr(new_component.pynode, "noScaleGroup")) self.assertTrue(pm.hasAttr(new_component.pynode, "outGroup")) self.assertTrue(pm.hasAttr(new_component.pynode, "outHooks")) self.assertTrue(pm.hasAttr(new_component.pynode, "inHook")) self.assertTrue(pm.hasAttr(new_component.pynode, "bindJoints")) self.assertTrue(pm.hasAttr(new_component.pynode, "ctlChain")) self.assertTrue(pm.hasAttr(new_component.pynode, "controls")) # Connections to metanode self.assertTrue( pm.isConnected(new_component.root.metaParent, new_component.pynode.rootGroup)) self.assertTrue( pm.isConnected(new_component.group_ctls.metaParent, new_component.pynode.ctlsGroup)) self.assertTrue( pm.isConnected(new_component.group_joints.metaParent, new_component.pynode.jointsGroup)) self.assertTrue( pm.isConnected(new_component.group_parts.metaParent, new_component.pynode.partsGroup)) self.assertTrue( pm.isConnected(new_component.group_out.metaParent, new_component.pynode.outGroup)) self.assertTrue( pm.isConnected(new_component.group_noscale.metaParent, new_component.pynode.noScaleGroup)) # Name, side self.assertEqual(new_component.name, "anim_component") self.assertEqual(new_component.side, "c") # Save test scene pm.renameFile( self.get_temp_filename("anim_component_test_create_default.ma")) pm.saveFile(f=1)
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, pm.MayaAttributeError): # 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 # Check dome light backgrounds domes_to_fix = [] rs_domes = pm.ls(type='RedshiftDomeLight') if rs_domes: for rs_dome in rs_domes: if rs_dome.getAttr('background_enable') == 1 \ or rs_dome.getAttr('backPlateEnabled') == 1: domes_to_fix.append(rs_dome.name()) if domes_to_fix: message = 'Some DomeLights have <b>BackGround Render ' \ 'Enabled</b>:' \ '<br><br>%s<br><br>' \ 'Are you Sure?' % '<br>'.join(domes_to_fix) response = pm.confirmDialog( title='Dome Lights with Background Enabled?', message=message, button=['Yes', 'No'], defaultButton='No', cancelButton='No', dismissString='No') if response == 'No': return # abort on license fail dro.abortOnLicenseFail.set(1) 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() try: glossy_samples = dAO.GIGlossySamples.get() except AttributeError: glossy_samples = dAO.GISpecularSamples.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 = 800 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 = [] dir_sample_attr_name = 'aiSamples' # if pm.about(v=1) == "2014": # dir_sample_attr_name = 'aiSamples' for directional_light in all_directional_lights: if directional_light.aiAngle.get( ) == 0 and directional_light.attr( dir_sample_attr_name).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) depend_mask_global = pm.textField('cgru_afanasy__depend_mask_global', q=1, text=True) 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.radioButtonGrp('cgru_afanasy__separate_layers', q=1, sl=1) pause = pm.checkBox('cgru_afanasy__paused', q=1, v=1) life_time = pm.intField('cgru_afanasy__life_time', q=1, v=1) annotation = pm.textField('cgru_afanasy__annotation', q=1, text=True) submit_multiple_times = pm.intField( 'cgru_afanasy__submit_multiple_times', q=1, v=1) errors_avoid_host = pm.intField('cgru_afanasy__errors_avoid_host', q=1, v=1) errors_retries = pm.intField('cgru_afanasy__errors_retries', q=1, v=1) errors_task_same_host = pm.intField( 'cgru_afanasy__errors_task_same_host', q=1, v=1) errors_forgive_time = pm.intField('cgru_afanasy__errors_forgive_time', q=1, v=1) generate_previews = pm.checkBox('cgru_afanasy__generate_previews', 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 depend_mask_global = depend_mask_global.replace('"', '') 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__depend_mask_global_ov'] = \ depend_mask_global 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 pm.optionVar['cgru_afanasy__annotation_ov'] = annotation pm.optionVar[ 'cgru_afanasy__submit_multiple_times_ov'] = submit_multiple_times pm.optionVar['cgru_afanasy__errors_avoid_host_ov'] = errors_avoid_host pm.optionVar['cgru_afanasy__errors_retries_ov'] = errors_retries pm.optionVar[ 'cgru_afanasy__errors_task_same_host_ov'] = errors_task_same_host pm.optionVar[ 'cgru_afanasy__errors_errors_forgive_time_ov'] = errors_forgive_time pm.optionVar['cgru_afanasy__paused_ov'] = pause pm.optionVar['cgru_afanasy__generate_previews_ov'] = generate_previews # 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) # 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) 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) logger.debug('annotation = %s' % annotation) logger.debug('separate_layers = %s' % separate_layers) logger.debug('errors_avoid_host = %s' % errors_avoid_host) logger.debug('errors_retries = %s' % errors_retries) logger.debug('errors_task_same_host = %s' % errors_task_same_host) logger.debug('errors_forgive_time = %s' % errors_forgive_time) logger.debug('generate_previews = %s' % generate_previews) if pm.checkBox('cgru_afanasy__close', q=1, v=1): pm.deleteUI(self.window) 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', 2) # 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 jobs = [] blocks = [] # # separate_layers: # 1 -> None -> submit one job with a single block with all layers # 2 -> Block -> submit one job with multiple blocks # 3 -> Job -> submit multiple jobs with a single block per layer # if separate_layers in [1, 2]: job = af.Job(job_name) jobs.append(job) if separate_layers in [2, 3]: # render each layer separately rlm = pm.PyNode('renderLayerManager') layers = [ layer for layer in rlm.connections(type=pm.nt.RenderLayer) 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')) # Fix the output path for this layer # by replacing the "masterLayer" with the layer name # without rs_ at the beginning layer_outputs = outputs if layer_name != 'defaultRenderLayer': layer_outputs[0] = outputs[0].replace( 'masterLayer', layer_name.replace('rs_', '')) layer_outputs[1] = outputs[1].replace( 'masterLayer', layer_name.replace('rs_', '')) if generate_previews: outputs_split = afcommon.patternFromDigits( afcommon.patternFromStdC( afcommon.patternFromPaths( layer_outputs[0], layer_outputs[1]))).split(';') block.setFiles(outputs_split) block.setNumeric(start_frame, end_frame, frames_per_task, by_frame) command = mrc_layer.build_command() block.setErrorsAvoidHost(errors_avoid_host) block.setErrorsRetries(errors_retries) block.setErrorsTaskSameHost(errors_task_same_host) block.setErrorsForgiveTime(errors_forgive_time) block.setCommand(command) if separate_layers == 2: blocks.append(block) else: job = af.Job('%s - %s' % (job_name, layer_name)) # add blocks job.blocks = [block] jobs.append(job) else: # create only one block block = af.Block('All Layers', renderer_to_block_type.get(render_engine, 'maya')) if generate_previews: block.setFiles( afcommon.patternFromDigits( afcommon.patternFromStdC( afcommon.patternFromPaths(outputs[0], outputs[1]))).split(';')) block.setNumeric(start_frame, end_frame, frames_per_task, by_frame) command = mrc.build_command() block.setCommand(command) blocks.append(block) for job in jobs: job.setAnnotation(annotation) job.setFolder('input', os.path.dirname(filename)) job.setFolder('output', os.path.dirname(outputs[0])) job.setDependMaskGlobal(depend_mask_global) job.setHostsMask(hosts_mask) job.setHostsMaskExclude(hosts_exclude) if life_time > 0: job.setTimeLife(life_time * 3600) else: job.setTimeLife(240 * 3600) job.setCmdPost('deletefiles -s "%s"' % os.path.abspath(filename)) if pause: job.offline() # add blocks if separate_layers in [1, 2]: job.blocks.extend(blocks) for i in range(submit_multiple_times): orig_job_name = job.data['name'] job.setName('%s - %03i' % (orig_job_name, i + 1)) status, data = job.send() # restore job name job.setName(orig_job_name) if not status: pm.PopupError('Something went wrong!') # 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) # disable abort on license fail redshift.abortOnLicenseFail.set(0)
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)
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)
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 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 # 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 # 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"', '-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, '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') # 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)
# -*- coding: Shift_Jis -*- import pymel.core as pm import os # 新規シーンファイルをつくる pm.newFile() # ポリゴンの球をつくる pm.polySphere() # シーンファイルを保存するファイルパスを指定する pm.renameFile(os.getcwd() + '\\hello.ma') # シーンファイルを保存する pm.saveFile()
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)