def lcObj_exportObjs(*args, **kwargs): ''' Export .obj files from selected geometry, either as one combined file or as individual files per object. Will recognize and convert poly smooth preview to geometry for export ''' global prefix path = pm.textField(prefix+'_textField_export_path', query=True, text=True) objPrefix = pm.textField(prefix+'_textField_prefix', query=True, text=True) if objPrefix: objPrefix+='_' if path: sel = pm.ls(sl=True) if sel: sel = geometry.filterForGeometry(sel) print sel #undo is the easiest way to work on geometry temporarily pm.undoInfo(openChunk=True) if pm.checkBox(prefix+'_checkBox_use_smooth', query=True, v=True): for obj in sel: pm.select(obj) #find the objects currently displayed as smooth and create converted poly copies if pm.displaySmoothness(q=True, polygonObject=True)[0] == 3: pm.mel.performSmoothMeshPreviewToPolygon() if pm.checkBox(prefix+'_checkBox_export_indi', query=True, v=True): #export objects individually for obj in sel: pm.select(obj) name = str(obj) exportString = path+'/'+objPrefix+name+'.obj' pm.exportSelected(exportString, force=True, options='groups=1;ptgroups=1;materials=0;smoothing=1;normals=1', type='OBJexport', pr=True, es=True) else: #export as one object pm.select(sel) name = '' while name == '': dialog = pm.promptDialog(title='OBJ Name', message='Enter Name:', button=['OK', 'Cancel'], defaultButton='OK', cancelButton='Cancel', dismissString='Cancel') if dialog == 'OK': name = pm.promptDialog(query=True, text=True) if name: exportString = path+'/'+objPrefix+name+'.obj' pm.exportSelected(exportString, force=True, options='groups=1;ptgroups=1;materials=0;smoothing=1;normals=1', type='OBJexport', pr=True, es=True) else: pm.warning("You didn't type a name for your obj") if dialog == 'Cancel': break pm.undoInfo(closeChunk=True) pm.undo() pm.select(clear=True) else: pm.warning('Did you specify a path?')
def multi_BasicSettings(): # Basic Settings pm.text(l='', h=5) multi_nameField = pm.textFieldGrp('hp3dNameField', l='Name', text='', cw=[2, 150], cc=fun.partial(multi_nameChange, 'hp3dNameField'), fcc=True) pm.rowColumnLayout(nc=2) pm.text(l='Basic Settings', w=75, al='left', en=False) pm.separator(w=marginWidth-75, h=14) pm.setParent(multiLight_layout) multi_color = pm.colorSliderGrp('hp3dColorSlider', label='Color', rgb=(1, 1, 1), cw=[3, 20], dc=fun.partial(multi_colorChange, '.color', 'all', 'hp3dColorSlider')) multi_intensity = pm.floatSliderGrp('hp3dIntensitySlider', label='Intensity', field=True, v=1.000, fmx=1000000000, pre=3, cw=[3, 20], dc=fun.partial(multi_floatChange, '.intensity', 'all', 'hp3dIntensitySlider')) # pm.text(l='', h=3) # GUI SPACER pm.rowColumnLayout(nc=2) pm.text(l='', w=142) # GUI SPACER global multi_illDefault_box multi_illDefault_box = pm.checkBox(l='Illuminates by Default', v=1, cc=multi_illDefault) pm.setParent(multiLight_layout) pm.rowColumnLayout(nc=3) pm.text(l='', w=142) # GUI SPACER multi_emitDiff_box = pm.checkBox('hp3dEmitDiffCheckbox', l='Emit Diffuse', v=1, w=120, cc=fun.partial(multi_checkboxChange, '.emitDiffuse', 'all', 'hp3dEmitDiffCheckbox')) multi_emitSpec_box = pm.checkBox('hp3dEmitSpecCheckbox', l='Emit Specular', v=1, cc=fun.partial(multi_checkboxChange, '.emitSpecular', 'all', 'hp3dEmitSpecCheckbox')) pm.setParent(multiLight_layout) pm.rowColumnLayout(nc=3) pm.text(l='Decay Rate', w=140, al='right') pm.text(l='', w=3) multi_decayRate_menu = pm.optionMenu('hp3dDecayRateMenu', bgc=primary_componentColor, cc=fun.partial(multi_menuChange, '.decayRate', 'not directional', 'hp3dDecayRateMenu')) pm.menuItem(l='No Decay', da=0) pm.menuItem(l='Linear', da=1) pm.menuItem(l='Quadratic', da=2) pm.menuItem(l='Cubic', da=3) pm.setParent(multiLight_layout)
def UI_custom(self): numJoints = len(self.jointInfo) pm.rowLayout(numberOfColumns = 2, columnWidth = [1, 100], adjustableColumn = 2) pm.text(label = "Number of Joints: ") self.numberOfJointsField = pm.intField(value = numJoints, minValue = 2, changeCommand = self.ChangeNumberOfJoints) pm.setParent('..') joints = self.GetJoints() self.CreateRotationOrderUIControl(joints[0]) pm.separator(style = 'in') pm.text(label = "Orientation: ", align = "left") pm.rowLayout(numberOfColumns = 3) pm.attrEnumOptionMenu(attribute = "%s:module_grp.sao_local" %self.moduleNamespace, label = "Local: ") pm.text(label = " will be oriented to ") pm.attrEnumOptionMenu(attribute = "%s:module_grp.sao_world" %self.moduleNamespace, label = "World: ") pm.setParent('..') pm.separator(style = 'in') interpolating = False if pm.objExists("%s:interpolation_container" %self.moduleNamespace): interpolating = True pm.rowLayout(numberOfColumns = 2, columnWidth = [1, 80], adjustableColumn = 2) pm.text(label = "Interpolate: ") pm.checkBox(label = "", value = interpolating, onCommand = partial(self.SetupInterpolation, True), offCommand = self.DeleteInterpolation)
def doExecution(*args): is_find = pm.checkBox( UI_name[0], q=True, value=True ) is_fix = pm.checkBox( UI_name[1], q=True, value=True ) is_fixLayer = pm.checkBox( UI_name[2], q=True, value=True ) shader_info_all_layers = [] if( is_find ): findErrorShape() if( is_fixLayer ): #// collect shaders info in each layer shader_info_all_layers = collectShaderInfoInLayer() if( is_fix ): fixComponentShading() if( is_fixLayer ): for shd_layer in shader_info_all_layers: #// switch to a specified layer curr_layer = shd_layer[0] pm.editRenderLayerGlobals( currentRenderLayer=curr_layer ) #// parsing string for mesh & shader from list #// assign shader to mesh from list for shd in shd_layer[1]: obj = shd[0] SG = shd[1] pm.sets( SG, edit=True, forceElement=obj ) pm.editRenderLayerGlobals( currentRenderLayer='defaultRenderLayer' ) return 1
def __init__(self): title = 'pbRenderableCurve' version = 1.02 if pm.window('pbRCurve', exists=True): pm.deleteUI('pbRCurve') with pm.window('pbRCurve', title='{0} | {1}'.format(title, version), s=False) as window: with pm.columnLayout(): with pm.frameLayout(l='Selection:', cll=True, bs='out'): with pm.columnLayout(): self.selField = pm.textFieldGrp(text='No Curves Selected', ed=False, l='Curve:', cw2=[72, 192]) with pm.rowLayout(nc=2): self.bRenderable = pm.checkBox(l='Renderable', cc=self.bcRenderable) with pm.frameLayout(l='Mesh Settings:', cll=True, bs='out') as self.meshUI: with pm.columnLayout(): with pm.rowLayout(nc=4): self.useNormal = pm.checkBox(l='Use Normal', cc=self.bcUseNormal) self.normalVector = [pm.intField(width=62, en=False, value=0, cc=self.setNormal), pm.intField(width=62, en=False, value=1, cc=self.setNormal), pm.intField(width=62, en=False, value=0, cc=self.setNormal)] self.meshAttrs = [AttrSlider(maxValue=128, name='Thickness', obj=getCurves, type_='float', fmn=0.0001), AttrSlider(value=3, minValue=3, maxValue=64, name='Sides', obj=getCurves, fmn=3, fmx=100), AttrSlider(minValue=1, maxValue=32, name='Samples', obj=getCurves, fmn=1, fmx=128)] with pm.frameLayout('Shell Settings:', cll=True, bs='out') as self.shellUI: with pm.columnLayout(): self.bShell = pm.checkBox(l='Enable Shell', cc=self.bcShell) self.shellAttrs = [AttrSlider(value=1, minValue=-64, maxValue=64, name='ShellThickness', obj=getCurves, type_='float'), AttrSlider(value=1, minValue=1, maxValue=64, name='ShellDivisions', obj=getCurves, fmn=1, fmx=32)] window.show() pm.scriptJob(event=['SelectionChanged', self.refresh], protected=True, p=window) self.refresh()
def __init__(self, opts): self.opts = opts with pm.frameLayout('Export Meshes (.FBX)', collapsable=True, cl=False, bs='out'): with pm.columnLayout(width=250): pm.text(l='Export List:') pm.separator(height=4) self.meshList = pm.textScrollList(height=250, width=250, ams=True, dkc=self._remove) with pm.rowColumnLayout(nc=3, cw=[(1, 82), (2, 82), (3, 82)]): pm.button(l='Add', c=self._add) pm.button(l='Remove', c=self._remove) pm.button(l='Clear', c=self._clear) with pm.rowColumnLayout(nc=2, cw=[(1, 124), (2,124)]): self.prefix = pm.checkBox(label='Prefix', value=self.opts['prefix'], cc=self.save) self.suffix = pm.checkBox(label='Suffix', value=self.opts['suffix'], cc=self.save) self.prefix_text = pm.textField(en=self.prefix.getValue(), text=self.opts['prefix_text'], cc=self.save) self.suffix_text = pm.textField(en=self.suffix.getValue(), text=self.opts['suffix_text'], cc=self.save) pm.text(l='Export Path:') with pm.rowColumnLayout(nc=2, cw=[(1, 215), (2, 32)]): self.fbxPath = pm.textField(text=self.opts['fbxPath'], cc=self._pathRefreash) pm.button(l='...', c=self._path) with pm.rowColumnLayout(nc=3): self.center = pm.checkBox(label='Move to Orgin', v=self.opts['center'], cc=self.save) self.child = pm.checkBox(label='Export Childern', v=self.opts['child'], cc=self.save) pm.button(l='FBXPreset', c=self._fbxPreset) with pm.rowColumnLayout(nc=2, cw=[(1, 124), (2, 124)]): pm.button(l='Selected', c=self._selected) pm.button(l='All', c=self._all) self._refresh()
def __init__(self): respresets = [4096, 2048, 1024, 512, 256, 128, 64, 32] with pm.frameLayout(l='Options', cll=True, cl=False, bs='out'): with pm.columnLayout(): pm.text('Map Size:') pm.separator(st='in', width=160, height=8) with pm.rowColumnLayout(nc=3, cw=[20, 60]): pm.text(l='Width:') self.width = pm.intField(v=1024, width=42) with pm.optionMenu(): for i in respresets: pm.menuItem(l=i) pm.text(l='Height:') self.height = pm.intField(v=1024, width=42) with pm.optionMenu(): for i in respresets: pm.menuItem(l=i) pm.button(l='Get Map Size') pm.separator(st='in', width=160, height=8) with pm.columnLayout(): self.compSpace = pm.checkBox(l='Retain Component Spaceing', cc=lambda *args: pm.texMoveContext('texMoveContext', e=True, scr=self.compSpace.getValue()), v=pm.texMoveContext('texMoveContext', q=True, scr=True)) self.pixelUnits = pm.checkBox(l='Transform In Pixels')
def __init__(self): ''' # class to sort and give info on shaders ''' self.layout = pm.rowColumnLayout(numberOfColumns= 3, columnWidth=([1, 150], [2, 150], [3, 250])) pm.columnLayout() pm.text(label= 'Shaders') self.shader_list = pm.textScrollList(width= 150, height= 200, selectCommand= pm.Callback(self.update_connections_list)) pm.button(label= 'Refresh', width= 150, command= pm.Callback(self.update_shader_list)) pm.setParent(self.layout) pm.columnLayout() pm.text(label='Connections') self.connections_list = pm.textScrollList(width= 150, height= 200, selectCommand= pm.Callback(self.write_info)) self.check_box = pm.checkBox(label= 'Select Node') pm.setParent(self.layout) pm.columnLayout() pm.text(label='Node Info') self.info_field = pm.scrollField(wordWrap= True, width= 250, height= 200) self.attr_check_box = pm.checkBox(label= 'Show All') self.update_shader_list()
def get_check_box_states_and_run(*args, **kwargs): """Gets the data from UI and runs the script """ freeze = pm.checkBox("FBJ_checkBox1", q=True, v=True) apply_to_children = pm.checkBox("FBJ_checkBox2", q=True, v=True) selection_list = pm.ls(sl=1, type="joint") do_fix(selection_list, freeze, apply_to_children) pm.select(selection_list)
def __init__(self, opts): self.opts = opts with pm.frameLayout(l='UV Snapshot:', cll=True, cl=False, bs='out'): with pm.columnLayout(width=162): self.path = pm.textFieldButtonGrp(l='Path:', bl='...', cw3=[28, 104, 32], bc=self.set_path) self.col = pm.colorSliderGrp(l='Color:', cw3=[32, 48, 74]) with pm.rowLayout(nc=2): self.of = pm.checkBox(l='Open File') self.aa = pm.checkBox(l='Anti-Alias', v=True) pm.button(l='Save Snapshot', width=156, c=self.snap_shot)
def value(self, value=None): """returns or set the check box value """ from pymel.core import checkBox if value is not None: # set the value checkBox(self, e=1, v=value) else: # get the value return checkBox(self, q=1, v=1)
def create(self): self.main_layout = pm.columnLayout(adjustableColumn= True, width= 400) main_frame = pm.frameLayout( label='%s' % (self.light), collapsable= True) pm.frameLayout( label='Light Attributes', collapsable= True) pm.attrColorSliderGrp( at='%s.color' % (self.light), columnWidth4= [100, 75, 175, 50]) pm.attrFieldSliderGrp(at='%s.intensity' % (self.light), columnWidth4= [100, 75, 175, 50]) pm.attrFieldSliderGrp(at='%s.coneAngle' % (self.light), columnWidth4= [100, 75, 175, 50]) pm.attrFieldSliderGrp(at='%s.penumbraAngle' % (self.light), columnWidth4= [100, 75, 175, 50]) pm.attrFieldSliderGrp(at='%s.dropoff' % (self.light), columnWidth4= [100, 75, 175, 50]) pm.attrEnumOptionMenu( label='Decay Rate', attribute='%s.decayRate' % (self.light) ) pm.setParent(main_frame) pm.frameLayout(label= 'Shadows', collapsable= True) pm.attrColorSliderGrp( at='%s.shadowColor' % (self.light), columnWidth4= [100, 75, 175, 50]) self.check_box = pm.checkBox(label= 'Use Ray Trace Shadows', changeCommand= pm.Callback(self.shadows)) self.light_radius = pm.attrFieldSliderGrp( at='%s.lightRadius' % (self.light), enable= False, columnWidth4= [100, 75, 175, 50]) self.shadow_rays = pm.attrFieldSliderGrp( at='%s.shadowRays' % (self.light), enable= False, columnWidth4= [100, 75, 175, 50]) self.ray_depth = pm.attrFieldSliderGrp( at='%s.rayDepthLimit' % (self.light), enable= False, columnWidth4= [100, 75, 175, 50]) pm.setParent(main_frame) pm.frameLayout(label= 'Decay Regions', collapsable= True) # useDecayRegions decay_regions_value = pm.getAttr('%s.useDecayRegions' % (self.light)) self.decay_check_box = pm.checkBox(label= 'Use Decay Regions', value= decay_regions_value, changeCommand= pm.Callback(self.chane_decay_regions)) pm.attrControlGrp(attribute= '%s.startDistance1' % (self.light)) pm.attrControlGrp(attribute= '%s.endDistance1' % (self.light)) pm.attrControlGrp(attribute= '%s.startDistance2' % (self.light)) pm.attrControlGrp(attribute= '%s.endDistance2' % (self.light)) pm.attrControlGrp(attribute= '%s.startDistance3' % (self.light)) pm.attrControlGrp(attribute= '%s.endDistance3' % (self.light)) pm.setParent(main_frame) pm.rowColumnLayout(numberOfColumns= 2, columnWidth= [200, 200]) pm.button(label= 'Select Light', width= 200, command= pm.Callback(self.select)) pm.button(label= 'Save Preset', width= 200, command= pm.Callback(self.preset)) pm.button(label= 'Hide', command= pm.Callback(self.hide)) pm.button(label= 'Show', command= pm.Callback(self.show)) return self.main_layout
def placeHighLight(*args): ### UI setup global UI_name UI_name = [ 'txtBtn_light', 'txtBtn_camera', 'txtBtn_object', 'txtBtn_HLitPoint', 'btn_placeHLit', 'chk_interaction' ] if pm.window( 'winPlaceHLit', exists=True ): pm.deleteUI( 'winPlaceHLit', window=True ) ui_layout['window'] = pm.window( 'winPlaceHLit', title='Place Highlight', sizeable=False, h=100, w=250 ) ui_layout['mainLayout'] = pm.columnLayout( columnAlign='left', columnAttach=['left', 0] ) #// get active camera activeViewCamera = getActiveCam() '''loc_light_probe = pm.createNode('locator', name='light_probe') pm.lockNode(loc_light_probe, lock=False)''' #// sub layout #// sub1 ui_layout['ui_sub1'] = pm.rowLayout(nc=2, cw=[(1, 210), (2, 40)], p=ui_layout['mainLayout'] ) pm.textFieldButtonGrp( UI_name[0], label='Light: ', text='', buttonLabel='Pick',editable=False, buttonCommand='pickLit()', cw=[(1,50), (2,120), (3,40)], p=ui_layout['ui_sub1'] ) pm.button( 'btn_sel_light' ,label='Sel', command=pm.Callback( doSelItem, UI_name[0] ), p=ui_layout['ui_sub1'] ) #// sub2 ui_layout['ui_sub2'] = pm.rowLayout(nc=2, cw=[(1, 210), (2, 40)], p=ui_layout['mainLayout'] ) pm.textFieldButtonGrp( UI_name[1], label='Camera: ', text=activeViewCamera, buttonLabel='Pick', editable=False, buttonCommand='pickCam()', cw=[(1,50), (2,120), (3,40)], p=ui_layout['ui_sub2'] ) pm.button( 'btn_sel_camera' ,label='Sel', command=pm.Callback( doSelItem, UI_name[1] ), p=ui_layout['ui_sub2'] ) #// sub3 ui_layout['ui_sub3'] = pm.rowLayout(nc=2, cw=[(1, 210), (2, 40)], p=ui_layout['mainLayout'] ) pm.textFieldButtonGrp( UI_name[2], label='Object: ', text='', buttonLabel='Pick', editable=False, buttonCommand='pickTgtObj()', cw=[(1,50), (2,120), (3,40)], p=ui_layout['ui_sub3'] ) pm.button( 'btn_sel_obj' ,label='Sel', command=pm.Callback( doSelItem, UI_name[2] ), p=ui_layout['ui_sub3'] ) #// sub4 ui_layout['ui_sub4'] = pm.rowLayout(nc=2, cw=[(1, 210), (2, 40)], p=ui_layout['mainLayout'] ) pm.textFieldButtonGrp( UI_name[3], label='Point: ', text='', buttonLabel='Pick', editable=False, buttonCommand='pickHLitPt()', cw=[(1,50), (2,120), (3,40)], p=ui_layout['ui_sub4'] ) pm.button( 'btn_sel_point' ,label='Sel', command=pm.Callback( doSelItem, UI_name[3] ), p=ui_layout['ui_sub4'] ) #// sub5 ui_layout['ui_sub5'] = pm.rowLayout(nc=2, cw=[(1, 70), (2, 50)], p=ui_layout['mainLayout'] ) pm.button( UI_name[4] ,label='Place Light!', command='doPlaceHLight()', p=ui_layout['ui_sub5'] ) pm.checkBox( UI_name[5], label='interactive mode', onCommand=pm.Callback( doInteractionON ), offCommand=pm.Callback( doInteractionOFF ), p=ui_layout['ui_sub5'] ) pm.showWindow( ui_layout['window'] ) pm.spaceLocator( name='light_probe' ) pm.lockNode( 'light_probe', lock=True ) pm.textFieldButtonGrp( 'txtBtn_HLitPoint', edit=True, text='light_probe' ) #// clean make live and scriptJob after exit script pm.scriptJob( uiDeleted=[ ui_layout['window'], pm.Callback( flushScript ) ] )
def checkbox_state(*args): check_cnt = 0 while pm.checkBox('%s%s' % ('shotCheckBox', str(check_cnt)), ex=1): check_cnt += 1 for k in range(0, check_cnt): state = pm.checkBox('shotCheckBox%s' % str(k), q=1, v=1) if not state: pm.textField('%s%s' % (shot_num_name, str(k)), e=1, en=0) pm.textField('%s%s' % (shot_name_name, str(k)), e=1, en=0) else: pm.textField('%s%s' % (shot_num_name, str(k)), e=1, en=1) pm.textField('%s%s' % (shot_name_name, str(k)), e=1, en=1)
def __init_window__(self): self.window = pm.window(menuBar=False, widthHeight=[200, 100], title="PYMHUD by Daniel S�nchez Quir�s") self.columna = pm.columnLayout(adjustableColumn=True) # Name row self.row1 = pm.rowLayout(numberOfColumns=3, adjustableColumn=True, parent=self.columna) pm.text("Name:", al="left", parent=self.row1) self.nameQ = pm.textField(parent=self.row1) pm.checkBox( label="", parent=self.row1, offCommand=Callback(self.nameHud, False), onCommand=Callback(self.nameHud, True) ) # Scene row self.row2 = pm.rowLayout(numberOfColumns=3, adjustableColumn=True, parent=self.columna) pm.text("Scene Name:", al="left") self.sceneNameQ = pm.textField(parent=self.row2) pm.checkBox( label="", parent=self.row2, offCommand=Callback(self.sceneHud, False), onCommand=Callback(self.sceneHud, True), ) # Date row self.row3 = pm.rowLayout(numberOfColumns=3, adjustableColumn=True, parent=self.columna) pm.text("Date:", al="left") pm.checkBox( label="", parent=self.row3, offCommand=Callback(self.dateHud, False), onCommand=Callback(self.dateHud, True) ) # rame counter row self.row4 = pm.rowLayout(numberOfColumns=3, adjustableColumn=True, parent=self.columna) pm.text("Frame Counter:", al="left") pm.checkBox(label="", parent=self.row4, offCommand=Callback(self.frameHud), onCommand=Callback(self.frameHud)) pm.showWindow(self.window)
def binMeshTranslatorOpts(parent, action, initialSettings, resultCallback): print "Parent", parent print "Action", action print "InitialSettings", initialSettings print "ResultCallback", resultCallback useTransform = True oneFilePerMesh = False createProxies = True proxyRes = 0.1 exportDir = "" if initialSettings is not None and len(initialSettings) > 0: #oneFilePerMesh=0;createProxies=1;proxyRes=0.1;exportDir=;createProxies=1 opts = initialSettings.split(";") for opt in opts: name, value = opt.split("=") if name == "oneFilePerMesh": oneFilePerMesh = int(value) if name == "createProxies": createProxies = int(value) if name == "useTransform": useTransform = int(value) if name == "proxyRes": proxyRes = float(proxyRes) if action == "post": print "post action" pm.setParent(parent) with pm.columnLayout(adj = True): pm.checkBox("MSH_OPTS_DOTRANSFORM", label = "Use Transform", v=useTransform) pm.checkBox("MSH_OPTS_ONEFILE", label = "One File Per Mesh", v=oneFilePerMesh) pm.checkBox("MSH_OPTS_DOPROX", label = "Create ProxyFiles", v=createProxies) pm.floatFieldGrp("MSH_OPTS_PROXPERC", label="Proxy Resolution", v1 = proxyRes) #pm.textFieldGrp("MSH_OPTS_PATH", label="ExportDir:", text=exportDir) if action == "query": resultOptions = "" print "Query action" oneFilePerMesh = pm.checkBox("MSH_OPTS_ONEFILE", query=True, v=True) resultOptions += "oneFilePerMesh={0}".format(int(oneFilePerMesh)) doProx = pm.checkBox("MSH_OPTS_DOPROX", query=True, v=True) resultOptions += ";createProxies={0}".format(int(doProx)) proxyRes = pm.floatFieldGrp("MSH_OPTS_PROXPERC", query=True, v1 = True) resultOptions += ";proxyRes={0}".format(proxyRes) #exportDir = pm.textFieldGrp("MSH_OPTS_PATH", query=True, text = True) #resultOptions += ";exportDir='{0}'".format(exportDir) doTransform = pm.checkBox("MSH_OPTS_DOTRANSFORM", query=True, v=True) resultOptions += ";useTransform={0}".format(int(doTransform)) melCmd = '{0} "{1}"'.format(resultCallback,resultOptions) pm.mel.eval(melCmd) return 1
def toggleEnable(control, *args): # Get the state of the control state = pc.checkBox(uiWidgets[control], q=1, enable=1) if (state): # If enabled, we grey it state = pc.checkBox(uiWidgets[control], edit=1, enable=0) # Button update pc.button(uiWidgets[control+'Button'], edit=1, label='Unlock') else: state = pc.checkBox(uiWidgets[control], edit=1, enable=1) pc.button(uiWidgets[control+'Button'], edit=1, label='Lock')
def __init__(self, title, widthHeight, tabs_names, frameLayoutPerTab, collapseStyle=0, descr=''): super(Exporter, self).__init__(title, widthHeight, tabs_names, frameLayoutPerTab) self.localProject = os.environ[ 'MAYA_PROJECT' ] self.localUser=os.environ[ 'USER' ] self.path = os.path.join(self.localProject+ "/export/GEO") self.scene_name = cmds.file(q=True, sn=True, shn=True).split('.')[0] self.folder_path = os.path.join(self.path, 'OBJ', self.localUser, self.scene_name) self.type = 'OBJ' self.extension = 'obj' self.curFr=1001 # GUI BUILDING # self.fl = self.frameLayouts[0][0].columnLayout col = pm.columnLayout(p=self.fl, h=self.wh[1]/2) flow_1=pm.flowLayout(p=col, w=self.wh[0]) self.type_om = win.AW_optionMenu(label="File Type", options=['OBJ','ZBRUSH', 'MUDBOX', 'FBX', 'MB', 'MA', 'ALEMBIC'], parent=flow_1, cc=self._updateDirectory) self.autoCheck = pm.checkBox(l='Auto-detect Folder', p=flow_1, v=1) pm.flowLayout(p=col, w=self.wh[0]) pm.text(l='Directory:') self.path_tf=pm.textField(w=self.wh[0]/1.3,cc=self._update_path_tf) pm.button(label='Browse',w=80, c=self._browser, bgc=self.col_fls[1]) self.path_tf.setText(self.folder_path) flow_3 = pm.flowLayout(w=self.wh[0], p=col) self.combined_cb = pm.checkBox(l='Export Per Object', v=1, cc=self._change_combined_cb, p=flow_3) pm.text(l='Combined Name:',p=flow_3,w=200) self.combined_tf = pm.textField(tx='', p=flow_3,w=300, editable=False) flow_4 = pm.flowLayout(w=self.wh[0],p=col) self.framesCheck = pm.checkBox(l='Frame Range', w=200,p=flow_4, v=0, cc=self._framesCallback) self.fr_st = pm.textField(editable=False,w=100,tx=str(int(pm.playbackOptions(ast=True, q=True))),p=flow_4) self.fr_end = pm.textField(editable=False,w=100,tx=str(int(pm.playbackOptions(aet=True, q=True))),p=flow_4) pm.text(l='\n', p=col) flow_col = pm.flowLayout(p=col, w=self.wh[0]) col_1 = pm.columnLayout(p=flow_col, w=self.wh[0]/2) col_2 = pm.columnLayout(p=flow_col, w=self.wh[0]/2) self.export_btn = pm.button(label='Export', bgc=self.col_fls[4], c=self._export, p=col_1, w=self.wh[0]/4) flow_5 = pm.flowLayout(w=self.wh[0],p=col_2) self.recursiveCheck = pm.checkBox(l='Check all folders inside', v=1, p=flow_5) self.list_btn = pm.button(label='List Files in Directory', bgc=self.col_fls[5], c=partial(self._getDirectoryFiles,True), p=flow_5, w=self.wh[0]/4) self.import_btn = pm.button(label='Import Directory', bgc=self.col_fls[5], c=self._customImport, p=col_2, w=self.wh[0]/2.5) pm.text(l='\n',p=col) pm.button(label='Swap Namespace with Name', bgc=self.col_fls[6], c=self._swapNamespace, p=col_2,w=self.wh[0]/2.5)
def create_ui(self): self.layout = pm.columnLayout(adjustableColumn= True) self.root_joint = pm.checkBox(label='Create Root Joint') self.export = pm.checkBox(label='Export When Finished') self.delete = pm.checkBox(label='Delete When Finished') self.visibility = pm.checkBox(label='Visibility State', value= 1) self.start_end_fields = pm.intFieldGrp( numberOfFields=2, label=u'Start & End Frames', value1=0, value2=100, columnWidth3= [105,90,90]) pm.text(label= '') pm.button(label= 'Bake Simulation', height= 190, command= pm.Callback(self.bake_simulation)) return self.layout
def _buildPrefUi(self): # delete previous UI if pmc.window(self.uiPrefName, exists=True): pmc.deleteUI(self.uiPrefName, window=True) # create UI self.uiPref['win'] = pmc.window(self.uiPrefName, title=self.uiPrefTitle, menuBar=True, width=300, height=200, sizeable=False) self.uiPref['mainLay'] = pmc.columnLayout() self.uiPref['titleTxt'] = pmc.text(label='Preferences', backgroundColor=[0,0,0], enableBackground=True, height=20, width=200) self.uiPref['optLay'] = pmc.rowLayout(numberOfColumns=2, columnWidth2=(125, 75)) self.uiPref['optTxt'] = pmc.text(label='Format filter') self.uiPref['chkLay'] = pmc.columnLayout() v=False if '.obj' in self.filtersList: v=True self.uiPref['objChb'] = pmc.checkBox(label='Obj', value=v) v=False if '.ma' in self.filtersList: v=True self.uiPref['maChb'] = pmc.checkBox(label='Ma', value=v) v=False if '.mb' in self.filtersList: v=True self.uiPref['mbChb'] = pmc.checkBox(label='Mb', value=v) v=False if '.fbx' in self.filtersList: v=True self.uiPref['fbxChb'] = pmc.checkBox(label='Fbx', value=v) pmc.setParent('..') pmc.setParent('..') pmc.rowLayout(numberOfColumns=2, columnWidth2=(100, 100)) self.uiPref['cancelBtn'] = pmc.button(label='Cancel', height=30, width=95) self.uiPref['saveBtn'] = pmc.button(label='Save', height=30, width=95) # command self.uiPref['cancelBtn'].setCommand(pmc.Callback(self._deletePrefUi)) self.uiPref['saveBtn'].setCommand(pmc.Callback(self._getNewFilter)) # show main ui pmc.showWindow(self.uiPref['win'])
def lcObjToolsUI(dockable=False, *args, **kwargs): ''' ''' global prefix ci = 0 #color index iterator windowName = 'lcObjTools' shelfCommand = 'import lct.src.lcObjTools.lcObjTools as lcObj\nreload(lcObj)\nlcObj.lcObjToolsUI()' icon = basePath+'lcObjTools.png' winWidth = 204 winHeight = 158 mainWindow = lcWindow(windowName=windowName, width=winWidth, height=winHeight, icon=icon, shelfCommand=shelfCommand, annotation=annotation, dockable=dockable, menuBar=True) mainWindow.create() # pm.columnLayout(prefix+'_columLayout_main') # pm.rowColumnLayout(nc=2, cw=([1,150], [2,50]) ) pm.textField(prefix+'_textField_export_path', w=150) pm.button(prefix+'_button_browse_path', l='Browse', bgc=colorWheel.getColorRGB(ci), annotation='Choose an export directory', w=50, command=lambda *args: path.browsePathTextField(prefix+'_textField_export_path', "Wavefront Obj (*.obj)", 'Obj Export Location') ) ci+=1 pm.setParent(prefix+'_columLayout_main') # pm.checkBox(prefix+'_checkBox_export_indi', l='Export Individual', v=False) pm.checkBox(prefix+'_checkBox_use_smooth', l='Use Smooth Preview', v=True) # pm.rowColumnLayout(nc=2, cw=([1,100], [2,100]) ) pm.textField(prefix+'_textField_prefix', w=100) pm.text(l=' Prefix_', al='left') pm.setParent(prefix+'_columLayout_main') # pm.rowColumnLayout(nc=2, cw=([1,169], [2,31]) ) pm.columnLayout(w=169) pm.button(prefix+'_button_export', l='Export OBJ', bgc=colorWheel.getColorRGB(ci), annotation='Export the selected geometry', w=168, h=30, command=lambda *args: lcObj_exportObjs() ) ci+=1 pm.button(prefix+'_button_Import', l='Import Multiple OBJs', bgc=colorWheel.getColorRGB(ci), annotation='Clean import more than one obj', w=168, h=20, command=lambda *args: lcObj_importMultiple() ) ci+=1 pm.setParent('..') pm.columnLayout(w=31) pm.iconTextButton(prefix+'_button_open_folder', style='iconOnly', image=iconBasePath+'folder_30x50.png', annotation='Open the export folder', w=30, h=50, command=lambda *args: path.openFilePath(pm.textField(prefix+'_textField_export_path', query=True, text=True) ) ) ci+=1 # mainWindow.show() plugin.reloadPlugin(plugin='objExport', autoload=True)
def __init__(self, lightTransform, lightType, lightShape): self.lightLinked = pm.lightlink(query=True, shapes=False, light=lightShape) self.lightTransform = lightTransform self.lightType = lightType self.lightShape = lightShape self.lightFrame_layout = pm.frameLayout(l='{0} ({1})'.format(lightTransform, lightType), cl=True, cll=True, w=marginWidth, bgc=frameColor, ann="Settings for {0}".format(lightTransform), p=lights_layout) self.indivLight_layout = pm.columnLayout() self.warningCheck() pm.text(l='', h=5) self.nameField = pm.textFieldGrp(l='Name', text=lightTransform, cw=[2, 150], cc=self.nameChange, fcc=True) pm.rowColumnLayout(nc=2) pm.text(l='Basic Settings', w=75, al='left', en=False) pm.separator(w=marginWidth-75, h=14) pm.setParent(self.indivLight_layout) pm.text(l='', h=2) pm.rowColumnLayout(nc=5) pm.button(l='Select', w=(marginWidth/3)-5, al='center', bgc=primary_componentColor, c=self.selectLight) pm.text(l='') # GUI SPACER pm.button(l='Delete', w=(marginWidth/3)-5, al='center', bgc=primary_componentColor, c=self.deleteLight) pm.text(l='') # GUI SPACER pm.button(l='Duplicate', w=(marginWidth/3)-5, al='center', bgc=primary_componentColor, c=self.duplicateLight) pm.setParent(self.indivLight_layout) pm.text(l='', h=2) # GUI SPACER pm.attrColorSliderGrp(at=lightShape+'.color', cw=[[2, 75], [3, 120]], sb=True) pm.attrFieldSliderGrp(at=lightShape+'.intensity', cw=[[2, 75], [3, 120]], hmb=False) # pm.text(l='', h=3) # GUI SPACER pm.rowColumnLayout(nc=2) pm.text(l='', w=142) # GUI SPACER self.illDefault_box = pm.checkBox(l='Illuminates by Default', v=self.check_illumByDefault(), cc=self.illumDefaultCommand) pm.setParent(self.indivLight_layout) pm.rowColumnLayout(nc=3) pm.text(l='', w=142) # GUI SPACER emitDif_box = pm.checkBox(l='Emit Diffuse', w=120) emitSpec_box = pm.checkBox(l='Emit Specular') pm.setParent(self.indivLight_layout) pm.connectControl(emitDif_box, lightShape+'.emitDiffuse') pm.connectControl(emitSpec_box, lightShape+'.emitSpecular') pm.setParent(lights_layout)
def __init__(self, baseUi, parent): BaseUi.__init__(self, parent) self.uiparent = parent self.baseUi = baseUi self.tmpJnts = [] self.defaultAxis = 'y' #ui try: pm.deleteUI(self.rigCol) except: pass with pm.columnLayout(adj=True, rs=3, parent=self.uiparent) as self.rigCol: with pm.rowColumnLayout(nc=2, co=[(1, 'left', 155), (2, 'left', 5)]): pm.text(l='axis') with pm.optionMenu(w=60) as self.axisMenu: pm.menuItem(l='x') pm.menuItem(l='y') pm.menuItem(l='z') with pm.columnLayout(adj=True, rs=2, co=['left', 165]): self.ribbonChkBox = pm.checkBox(l='Ribbon Lo/Hi', v=False) with pm.rowColumnLayout(nc=3, co=[(1, 'left', 30), (2, 'left', 5), (3, 'left', 5)]): pm.text(l='tmpJnts') self.tmpJntsTxtFld = pm.textField(w=230, ed=False) self.loadTmpJntButt = pm.button(l='<<', c=pm.Callback(self.loadTmpJnts)) self.axisMenu.setValue(self.defaultAxis) self.baseUi.clearElemSideTxtFld()
def multi_MentalRaySettings(): # Mental Ray Settings pm.rowColumnLayout(nc=2) pm.text(l='Mental Ray Settings', w=106, al='left', en=False) pm.separator(w=marginWidth-106, h=14) pm.setParent(multiLight_layout) pm.rowColumnLayout(nc=2) pm.text(l='', w=142) # GUI SPACER multi_MrAreaLight_box = pm.checkBox('hp3dUseShapeCheckbox', l='Use Light Shape', cc=fun.partial(multi_checkboxChange, '.areaLight', 'area & spot', 'hp3dUseShapeCheckbox')) pm.setParent(multiLight_layout) pm.rowColumnLayout(nc=3) pm.text(l='Type', w=140, al='right') pm.text(l='', w=3) multi_areaType_menu = pm.optionMenu('hp3dAreaTypeMenu', bgc=primary_componentColor, cc=fun.partial(multi_menuChange, '.areaType', 'area & spot', 'hp3dAreaTypeMenu')) pm.menuItem(l='Rectangle', da=0) pm.menuItem(l='Disc', da=1) pm.menuItem(l='Sphere', da=2) pm.menuItem(l='Cylinder', da=3) pm.menuItem(l='Custom', da=4) pm.setParent(multiLight_layout) multi_highSamples = pm.intFieldGrp('hp3dHighSamplesField', numberOfFields=1, label='High Samples', v1=8, cc=fun.partial(multi_samplesChange, 'highSamp')) multi_highSampLimit = pm.intFieldGrp('hp3dHighSampleLimitField', numberOfFields=1, label='High Sample Limit', v1=1, cc=fun.partial(multi_samplesChange, 'highSampLimit')) multi_lowSamples = pm.intFieldGrp('hp3dLowSamplesField', numberOfFields=1, label='Low Samples', v1=1, cc=fun.partial(multi_samplesChange, 'lowSamp')) pm.setParent(multiLight_layout)
def lcBake_convert_lightmap(bakeSetListDropdown, cameraListDropdown, *args, **kwargs): ''' ''' numItems = bakeSetListDropdown.getNumberOfItems() if numItems > 0: currentBakeSet = bakeSetListDropdown.getValue() if currentBakeSet: currentCamera = cameraListDropdown.getValue() outputDirectory = pm.textField(prefix+'_textField_texture_path', query=True, text=True) if os.path.exists(outputDirectory): shadows = pm.checkBox(prefix+'_checkBox_shadows', query=True, value=True) if pm.control('bakeWindow', exists = True): pm.deleteUI('bakeWindow') bakeWindow = pm.window('bakeWindow', t='Batch Bake', widthHeight=[100, 100], rtf=True, mnb=False, mxb=False, s=False) pm.columnLayout() pm.text(l='') pm.text(l='') pm.text(l=' Bake In Progress ') pm.text(l=' ...... ') pm.text(l='') pm.text(l='') bakeWindow.show() pm.refresh() #pm.pause(seconds=10) convertString = bake.convertLightmap(currentBakeSet, currentCamera, outputDirectory, shadows) print('Convert Command: {0}'.format(convertString) ) pm.deleteUI('bakeWindow') pm.select(clear=True) else: pm.warning('Path not found: {0}'.format(outputDirectory) )
def create(self): self.checkBox = pm.checkBox(label = 'Modify Weighting', onCommand = pm.Callback(self.editFields), offCommand = pm.Callback(self.editFields) ) self.antiField = pm.intFieldGrp( numberOfFields=2, label='Antialias/Noise Quality', extraLabel = 'Weight %' , value2 = 45 , enable1 = False , enable2 = False, changeCommand=pm.Callback(self.updateTotal)) self.compField = pm.intFieldGrp( numberOfFields=2, label='Composition/Focal Length', extraLabel = 'Weight %' , value2 = 45 , enable1 = False , enable2 = False ,changeCommand=pm.Callback(self.updateTotal)) self.proField = pm.intFieldGrp( numberOfFields=2, label='Professionalism', extraLabel = 'Weight %' ,value2 = 10 ,enable1 = False , enable2 = False, changeCommand=pm.Callback(self.updateTotal)) self.lateField = pm.intFieldGrp( numberOfFields=1, label='Late Deduction' , changeCommand=pm.Callback(self.updateTotal)) self.totalField = pm.intFieldGrp( numberOfFields=1, label='Total Grade',enable1 = False, changeCommand=pm.Callback(self.updateTotal)) # attaching the controls pm.formLayout( self.layout, edit=1, attachForm=[[self.checkBox, "left", 140], [self.checkBox, "top", 5]]) pm.formLayout( self.layout, edit=1, attachOppositeControl=[[self.antiField ,"top", 40, self.checkBox], [self.antiField, "right", 10, self.checkBox]]) pm.formLayout( self.layout, edit=1, attachOppositeControl=[[self.compField ,"top", 40, self.antiField], [self.compField, "right", 10, self.antiField]]) pm.formLayout( self.layout, edit=1, attachOppositeControl=[[self.proField ,"top", 40, self.compField], [self.proField, "right", 10, self.compField]]) pm.formLayout( self.layout, edit=1, attachOppositeControl=[[self.lateField ,"top", 40, self.proField], [self.lateField, "left", 0, self.proField]]) pm.formLayout( self.layout, edit=1, attachOppositeControl=[[self.totalField ,"top", 40, self.lateField], [self.totalField, "left", 0, self.lateField]]) pm.setParent(self.columnLayout) pm.text(label = '') self.warning = pm.text(label='') pm.text(label = '') #pm.button( label = 'Output Grade and Comment' , width = 480) return None
def create(self): self.main_layout = pm.columnLayout(adjustableColumn= True, width= 400) main_frame = pm.frameLayout( label='%s' % (self.light), collapsable= True) pm.frameLayout( label='Light Attributes', collapsable= True) pm.attrColorSliderGrp( at='%s.color' % (self.light), columnWidth4= [100, 75, 175, 50]) pm.attrFieldSliderGrp( at='%s.intensity' % (self.light), columnWidth4= [100, 75, 175, 50]) pm.attrFieldSliderGrp(at='%s.ambientShade' % (self.light), columnWidth4= [100, 75, 175, 50]) pm.setParent(main_frame) pm.frameLayout(label= 'Shadows', collapsable= True) pm.attrColorSliderGrp( at='%s.shadowColor' % (self.light), columnWidth4= [100, 75, 175, 50]) self.check_box = pm.checkBox(label= 'Use Ray Trace Shadows', changeCommand= pm.Callback(self.shadows)) self.shadow_radius = pm.attrFieldSliderGrp( at='%s.shadowRadius' %(self.light), enable= False, columnWidth4= [100, 75, 175, 50]) self.shadow_rays = pm.attrFieldSliderGrp( at='%s.shadowRays' % (self.light), enable= False, columnWidth4= [100, 75, 175, 50]) self.ray_depth = pm.attrFieldSliderGrp( at='%s.rayDepthLimit' % (self.light), enable= False, columnWidth4= [100, 75, 175, 50]) pm.setParent(main_frame) pm.rowColumnLayout(numberOfColumns= 2, columnWidth= [200, 200]) pm.button(label= 'Select Light', width= 200, command= pm.Callback(self.select)) pm.button(label= 'Delete UI', width= 200, command= pm.Callback(self.delete)) pm.button(label= 'Hide', command= pm.Callback(self.hide)) pm.button(label= 'Show', command= pm.Callback(self.show)) return self.main_layout
def renaming(): preName = pm.textFieldGrp('pre',q = 1,tx = 1) sideB = pm.radioButtonGrp('side',q = 1,sl = 1) sideList = ['l','r','m'] objName = pm.textFieldGrp('obj',q = 1,tx = 1) startNum = pm.textFieldGrp('starNum',q = 1,tx = 1) paddingNum = pm.textFieldGrp('paddingNum',q = 1,tx = 1) suffixName = pm.textFieldGrp('suffix',q = 1,tx = 1) jointEnd = pm.checkBox('je',q = 1,v = 1) sels = pm.ls(sl = 1) for num,sel in enumerate(sels): if len(str(startNum)) < paddingNum: number = str(0) + str(startNum) preNames = '' if preName != '': preNames = preName + '_' name = preNames + objName + '_' + sideList[sideB] + '_' + number + '_' + suffixName pm.rename(sel,name) if jointEnd == 1: name = preNames + objName + '_' + sideList[sideB] + '_' + number + '_' + 'je' pm.rename(sels[-1],name) print name startNum = int(startNum) + 1
def MakeCheckboxStandalone(boxLabel, initialValue, extraLabel=None, changeCommand=None, leftColumnWidth=__LEFT_COLUMN_WIDTH__, annotation=None, switchLabels=False): """ Creates & returns a PyMel checkbox that is not specifically linked to an attribute. :param boxLabel: string, label to right of checkbox (or to left of checkbox, with colon, if extraLabel is also defined). :param initialValue: bool, initial value. :param extraLabel: string, label to the right of the checkbox if boxLabel is also defined. :param changeCommand: bound method to be executd when checkbox value changes, or None. :param leftColumnWidth: float, width of left-hand label. :param annotation: toolTip annotation, or None. :param switchLabels: True = extraLabel to left (with colon) & boxLabel to right, False = vice versa. """ rowLayout = MakeRowLayout(2 if(extraLabel is not None) else 1, leftColumnWidth=leftColumnWidth + __CHECKBOX_OFFSET__, rightColumnWidth=__MIDDLE_COLUMN_WIDTH__ + __RIGHT_COLUMN_WIDTH__) if(extraLabel is not None): if(switchLabels) : boxLabel, extraLabel = extraLabel, boxLabel if(boxLabel): boxLabel += ':' MakeText(boxLabel, annotation) boxLabel = extraLabel checkbox = pm.checkBox(label=boxLabel, value=initialValue) if(changeCommand is not None): checkbox.changeCommand(changeCommand) if(annotation is not None): checkbox.setAnnotation(annotation) SetAsChildLayout(rowLayout) return (rowLayout, checkbox)
def multi_checkboxChange(attr, lightType, component, *args): value = pm.checkBox(component, q=True, v=True) sel_lights = pm.ls(sl=True, lights=True, dag=True) new_list = sortBy_type(sel_lights, lightType) for each in new_list: pm.setAttr(each+attr, value)
def uvmp_snapshot_window_update(*args, **kwargs): ''' update the snapshot window on user interaction ''' checkBoxState = pm.checkBox(prefix + '_custom_snapshot_size', query=True, value=True) # toggle input based on checkbox pm.intField(prefix + '_snapshot_width', edit=True, enable=checkBoxState) pm.intField(prefix + '_snapshot_height', edit=True, enable=checkBoxState) pm.optionMenu(prefix + '_optionMenu_width', edit=True, enable=(not checkBoxState)) pm.optionMenu(prefix + '_optionMenu_height', edit=True, enable=(not checkBoxState)) if not checkBoxState: # update custom fields with dropdown values width = int( pm.optionMenu(prefix + '_optionMenu_width', query=True, value=True)) height = int( pm.optionMenu(prefix + '_optionMenu_height', query=True, value=True)) pm.intField(prefix + '_snapshot_width', edit=True, value=width) pm.intField(prefix + '_snapshot_height', edit=True, value=height) selWidth = pm.optionMenu(prefix + '_optionMenu_width', query=True, select=True) selHeight = pm.optionMenu(prefix + '_optionMenu_height', query=True, select=True) snapWidth = pm.intField(prefix + '_snapshot_width', query=True, value=True) snapHeight = pm.intField(prefix + '_snapshot_height', query=True, value=True) lct_cfg.set('lcUVToolsSnapshotCustom', checkBoxState) lct_cfg.set('lcUVToolsSnapshotSelHeight', selHeight) lct_cfg.set('lcUVToolsSnapshotSelWidth', selWidth) lct_cfg.set('lcUVToolsSnapshotCustomHeight', snapHeight) lct_cfg.set('lcUVToolsSnapshotCustomWidth', snapWidth)
def lcBake_convert_lightmap(bakeSetListDropdown, cameraListDropdown, *args, **kwargs): ''' ''' numItems = bakeSetListDropdown.getNumberOfItems() if numItems > 0: currentBakeSet = bakeSetListDropdown.getValue() if currentBakeSet: currentCamera = cameraListDropdown.getValue() outputDirectory = pm.textField(prefix + '_textField_texture_path', query=True, text=True) if os.path.exists(outputDirectory): shadows = pm.checkBox(prefix + '_checkBox_shadows', query=True, value=True) if pm.control('bakeWindow', exists=True): pm.deleteUI('bakeWindow') bakeWindow = pm.window('bakeWindow', t='Batch Bake', widthHeight=[100, 100], rtf=True, mnb=False, mxb=False, s=False) pm.columnLayout() pm.text(l='') pm.text(l='') pm.text(l=' Bake In Progress ') pm.text(l=' ...... ') pm.text(l='') pm.text(l='') bakeWindow.show() pm.refresh() #pm.pause(seconds=10) convertString = bake.convertLightmap(currentBakeSet, currentCamera, outputDirectory, shadows) print('Convert Command: {0}'.format(convertString)) pm.deleteUI('bakeWindow') pm.select(clear=True) else: pm.warning('Path not found: {0}'.format(outputDirectory))
def makeReversefoot(jntnamelist, sfx, sfx_r, mirror): locatorslist = {} i = 0 jntnamelist = jntnamelist revjntnamelist = [] for jnt in jntnamelist: locator = pm.ls(jnt)[0] pos = locator.getTranslation() if jnt not in locatorslist: locatorslist[str(0 + i) + jnt] = pos pm.delete(jnt) i += 1 ##Make joints at each locators position for k in sorted(locatorslist.items())[0:-1]: pm.joint(n=str(k[0]), p=locatorslist[k[0]]) ##Make Heel joint heel = pm.joint(n=jntnamelist[5] + "1", p=locatorslist["5" + jntnamelist[5]]) pm.parent(heel, w=True) ##Make Reverse joints chain obj = pm.ls(jntnamelist[2], type="joint") newandle = pm.duplicate(obj, rc=True) pm.parent(newandle, w=True) toe = pm.reroot(jntnamelist[4] + "1") pm.parent(jntnamelist[4] + "1", jntnamelist[5] + "1") rev = pm.ls(jntnamelist[5] + "1", dag=True) ##Rename reverse joints for jnt in rev: revjnt = pm.rename(jnt, "Rev_" + str(jnt[0:-1])) revjntnamelist.append(revjnt) ##Look wheather the checkbox is on or off mirrorEnable = pm.checkBox(mirror, query=True, v=True) ##Make Iksolver(if mirror is on, mirror joint chain) if mirrorEnable == True: mirrorJnt(revjntnamelist, sfx, sfx_r) applyIK(sfx) applyIK(sfx_r) else: sfx = "" applyIK(sfx)
def get_user_selected_options(): """ Get the user-selected options from the Mimic UI and output a complete UserOptions tuple. Queries checkboxes only! :return: """ values = [] # Get user-selected options from UI for i in range(len(_fields)): field = _fields[i] checkbox_name = format_field_name_for_checkbox(field) checkbox_value = pm.checkBox(checkbox_name, value=True, query=True) values.append(checkbox_value) # Create a new tuple from the above return UserOptions(*values)
def generate_repr_of_scene_caller(cls): """helper method to call Reference.generate_repr_of_scene() with data coming from UI """ generate_gpu = 1 if pm.checkBoxGrp('generate_repr_types_checkbox_grp', q=1, v1=1) else 0 generate_ass = 1 if pm.checkBoxGrp('generate_repr_types_checkbox_grp', q=1, v2=1) else 0 generate_rs = 1 if pm.checkBoxGrp('generate_repr_types_checkbox_grp', q=1, v3=1) else 0 skip_existing = \ pm.checkBox('generate_repr_skip_existing_checkBox', q=1, v=1) cls.generate_repr_of_scene( generate_gpu, generate_ass, generate_rs, skip_existing )
def orientJoints(*args): selectedJoints = pm.ls(selection = True, type = 'joint') allJoints = [] orientDescendents = pm.checkBox(orientChildrenBox, query = True, value = True) for joint in selectedJoints: allJoints.append(joint) if orientDescendents: descendents = pm.listRelatives(joint, allDescendents = True) allJoints = allJoints + descendents for joint in allJoints: allChildren = list(reversed(pm.listRelatives(joint, children = True))) if len(allChildren) == 0: aimConstraintParentTowardsChild(joint, pm.listRelatives(joint, parent = True), True) elif len(allChildren) >= 1: aimConstraintParentTowardsChild(joint, allChildren, False) pm.select(selectedJoints, r = True)
def show(self): window = pm.window(self.windowName,title=self.windowName) with window: with pm.frameLayout(bs='in',label=u'頂点を円上に整列'): with pm.frameLayout(bs='in', label=u'射影平面'): self.rc1 = pm.radioCollection() with pm.rowLayout(numberOfColumns=3): pm.radioButton('X', label=u'YZ', select=True) pm.radioButton('Y', label=u'XZ') pm.radioButton('Z', label=u'XY') with pm.frameLayout(bs='in', label=u'円の半径'): self.rc2 = pm.radioCollection() with pm.rowLayout(numberOfColumns=3): pm.radioButton('Min', label=u'最短値', select=True) pm.radioButton('Cen', label=u'中間値') pm.radioButton('Max', label=u'最長値') self.checkBox = pm.checkBox(label = u'ワールド軸 (off / ローカル)', value=True) pm.button(label='Submit',width=40,height=32,command=pm.Callback(self.callBack))
def generate_repr_of_all_references_caller(cls): """a helper method that calls References.generate_repr_of_all_references() with paremeters from the UI """ generate_gpu = pm.checkBoxGrp('generate_repr_types_checkbox_grp', q=1, v1=1) generate_ass = pm.checkBoxGrp('generate_repr_types_checkbox_grp', q=1, v2=1) generate_rs = pm.checkBoxGrp('generate_repr_types_checkbox_grp', q=1, v3=1) skip_existing = \ pm.checkBox('generate_repr_skip_existing_checkBox', q=1, v=1) cls.generate_repr_of_all_references( generate_gpu, generate_ass, generate_rs, skip_existing )
def prompt_ui(): win = pm.window(title="Create Geosphere", width=200) layout = pm.formLayout() rlayout = pm.rowLayout(parent=layout, numberOfColumns=2) iter_field_lbl = pm.text("Iterations", parent=rlayout) iter_field = pm.intField(min=1, max=5, step=1, v=1, parent=rlayout) quads_chbox = pm.checkBox(label="Create Quads?", v=False, parent=layout) def on_ok(*args): create(quads_chbox.getValue(), iter_field.getValue()) win.delete() ok_button = pm.button(label="Create mah Geosphere!", command=on_ok, parent=layout) layout.redistribute() win.show()
def uvmp_rotate(angle=0, *args, **kwargs): ''' rotate uv's based on an angle with aspect ratio correction ''' shell = pm.checkBox(prefix + '_checkBox_shell', q=True, v=True) sel = pm.ls(sl=True) if sel: uvs = pm.polyListComponentConversion(sel, toUV=True) pm.select(uvs, replace=True) try: texDim = lcTexture.TextureEditor().getTextureDimensions() if shell: uvCenter = lcGeometry.UV().getBoundingBoxCenter(shell=True) lcGeometry.UV().rotateShell(angle, uvCenter, texDim) else: uvCenter = lcGeometry.UV().getBoundingBoxCenter() lcGeometry.UV().rotate(angle, uvCenter, texDim) except: lcUtility.Utility.lc_print_exception('something went wrong') finally: pm.select(sel, replace=True)
def createTrailUv(poly,*args): sel = pm.ls(sl=1,type='transform') if sel: poly=sel[0] if poly == '': pm.warning('No trail selected / found') return startEdge = pm.ls(poly+ '.e[0]',fl=1)[0] edges = pm.polySelectSp(startEdge,ring=1) pm.select(cl=1) ringEdges = pm.ls(edges,fl=1) leftSideVtx = [] rightSideVtx = [] ''' for edge in ringEdges[1:-1]: sew = pm.polyMapSewMove(edge,nf=10,lps=0, ch=1) #pm.delete(sew) pm.select(poly) norm = pm.polyNormalizeUV (normalizeType=1 ,preserveAspectRatio=0) #pm.delete(norm) ''' for edge in ringEdges: vtxs = edge.connectedVertices() leftSideVtx.append(vtxs[0]) rightSideVtx.append(vtxs[1]) leftLength = getTotalEdgesLength(leftSideVtx) #print leftLength rightLength = getTotalEdgesLength(rightSideVtx) #print rightLength uvDistorted = pm.checkBox('cbUV',q=1,v=1) setPosUv(leftSideVtx,leftLength,'left',uvDistorted) setPosUv(rightSideVtx,rightLength,'right',uvDistorted) pm.select(poly)
def uvmp_scale(uvw=[1, 1], *args, **kwargs): ''' commands for scaling uvs or uv shells ''' shell = pm.checkBox(prefix + '_checkBox_shell', q=True, v=True) sel = pm.ls(sl=True) if sel: uvs = pm.polyListComponentConversion(sel, toUV=True) pm.select(uvs, replace=True) try: if shell: uvCenter = lcGeometry.UV().getBoundingBoxCenter(shell=True) lcGeometry.UV().scaleShell(uvw, uvCenter) lcGeometry.UV().grabShell( ) # not necessary to grab the shell, but makes for better visual feedback else: uvCenter = lcGeometry.UV().getBoundingBoxCenter() lcGeometry.UV().scale(uvw, uvCenter) except: lcUtility.Utility.lc_print_exception('something went wrong') finally: pm.select(sel, replace=True)
def setup_ui(self): with pm.verticalLayout(): pm.separator(height=40, style="none") pm.checkBox(label='Setup General Hotkeys', value=pm.optionVar.get( HotkeyOptionsMenu.kSetupGeneralHotkeys, True), changeCommand=self.set_option_var_general) pm.checkBox(label='Setup Animation Hotkeys', value=pm.optionVar.get( HotkeyOptionsMenu.kSetupAnimationHotkeys, True), changeCommand=self.set_option_var_animation) pm.checkBox(label='Setup Modeling Hotkeys', value=pm.optionVar.get( HotkeyOptionsMenu.kSetupModelingHotkeys, True), changeCommand=self.set_option_var_modeling) pm.checkBox(label='Setup Rigging Hotkeys', value=pm.optionVar.get( HotkeyOptionsMenu.kSetupRiggingHotkeys, True), changeCommand=self.set_option_var_rigging)
def attrBoolControlGrp(*args, **kwargs): attribute = kwargs.pop('attribute', kwargs.pop('a', None)) assert attribute is not None, "You must passed an attribute" changeCommand = kwargs.pop('changeCommand', kwargs.pop('cc', None)) if changeCommand: def cc(newVal): pm.setAttr(attribute, newVal) changeCommand(newVal) else: cc = lambda newVal: pm.setAttr(attribute, newVal) if kwargs.pop('edit', kwargs.pop('e', False)): ctrl = args[0] pm.checkBox(ctrl, edit=True, value=pm.getAttr(attribute), changeCommand=cc) pm.scriptJob(parent=ctrl, replacePrevious=True, attributeChange=[ attribute, lambda: pm.checkBox( ctrl, edit=True, value=pm.getAttr(attribute)) ]) elif kwargs.pop('query', kwargs.pop('q', False)): # query pass else: # create labelText = kwargs.pop('label', None) if not labelText: labelText = pm.mel.interToUI(attribute.split('.')[-1]) ctrl = args[0] pm.rowLayout(numberOfColumns=1, columnWidth1=285, columnAttach1='right') pm.checkBox(ctrl, label=labelText, value=pm.getAttr(attribute), changeCommand=cc) pm.setParent('..') pm.scriptJob(parent=ctrl, attributeChange=[ attribute, lambda: pm.checkBox( ctrl, edit=True, value=pm.getAttr(attribute)) ]) return ctrl
def create(self): ''' # creates the actual ui ''' self.layout = pm.rowColumnLayout(numberOfColumns=3, columnWidth=([1, 150], [2, 100], [3, 300])) self.checkbox = pm.checkBox(label='Apply Transforms') pm.button(label='Create Light', height=100, command=pm.Callback(self.create_light)) pm.scrollField(width=300, height=100, wordWrap=True, enable=True, text='Preset Name: %s\n' % (self.data[0]) + 'Light Type: %s\n' % (self.data[1]) + 'Description: %s' % (self.data[2])) pm.separator() pm.separator() pm.separator()
def fx_prefixName(arg): name =pm.textField('fx_prefixNametxt',tx=1,q=1) selcbs = pm.checkBox("fx_prefixNamecb" ,q=True,v=True) readonlylist = pm.ls(ro=1,type="mesh") if selcbs==0: sels =pm.ls(sl=1,long=1) selall = pm.listRelatives(sels,ad=1) meshshapes =[a.getParent() for a in selall if a.nodeType()=="mesh"] else: meshshapes =[a for a in pm.ls(type="mesh",long=1) if a not in readonlylist] if selcbs==1: for m in range(len(meshshapes)): clothsels = pm.rename(meshshapes[m].getParent(),name+"_cloth_geo"+str(m+1)) pm.rename(meshshapes[m],clothsels+"Shape") else: for m in range(len(meshshapes)): print clothsels = pm.rename(meshshapes[m],name+"_cloth_geo"+str(m+1)) pm.rename(clothsels.getShape(),clothsels+"Shape") geogrp = pm.group(meshshapes,name=name+"_cloth_geo") allgrp = pm.group(geogrp,name = name+"_all") pm.parent(allgrp,w=1)
def _add_mFIZ_controller_to_scene(self, *args): """ """ # Get the user input name and filter out special characters name = get_textField_input(ADD_CONTROLLER_TEXTFIELD_NAME, filter=True) ## Create a new tab in the mFIZ UI for the new controller controller = mFIZ_utils.add_mFIZ_controller_to_scene(name) # Set the state of the Stop Playback on Disconnect attribute on the node # based on user input in the Setup Tab stop_on_disconnect = pm.checkBox(self.stop_playback_checkBox, query=True, value=True) controller.node.setAttr('stopPlaybackOnDisconnect', stop_on_disconnect, lock=True) ## Assign the controller to the controls tabLayout tab_layout = self.controls_tab_layout ctrl = controller.ctrl ctrl_name = str(ctrl) tab_name = ctrl_name.replace('_CTRL', '') tab = self._build_program_tab(controller, tab_name, tab_layout, tab_layout) self._assign_tabs([(tab, tab_name)], tab_layout) ## Move the "Setup" tab to the end tab_labels = pm.tabLayout(tab_layout, query=True, tabLabel=True) num_tabs = len(tab_labels) setup_tab_index = tab_labels.index( 'Setup') + 1 # Tabs are 1-based indeces pm.tabLayout(tab_layout, edit=True, moveTab=[setup_tab_index, num_tabs])
def Folli(self): if pm.checkBox( self.folli_ctrl, q=True, v=True, ) == False: radius = pm.floatField(self.radius, q=True, value=True) countV = int(pm.floatField(self.folli, q=True, value=True)) [ adbFolli.Folli(1, countV, radius=radius, sub=x) for x in pm.selected() ] else: radius = pm.floatField(self.radius, q=True, value=True) countV = int(pm.floatField(self.folli, q=True, value=True)) folli = [ adbFolli.Folli(1, countV, radius=radius, sub=x) for x in pm.selected() ] [x.addControls() for x in folli]
def wnd_rowPad(): global txt_jointField, chk_appendPad pm.frameLayout(collapsable=True, label="Pad Object", width=500) pm.rowLayout(numberOfColumns=3, columnWidth=[(1, 150), (2, 200), (3, 100)]) pm.text(label="Choose an object to pad") txt_jointField = pm.textField(placeholderText="Choose joint", editable=False) pm.button(label="Choose Item", command=pm.Callback(selectItem)) pm.setParent("..") pm.rowLayout(numberOfColumns=2, columnWidth=[(1, 350)]) pm.text("Automatically append \"pad\" to end?") chk_appendPad = pm.checkBox("appendPad", value=True, label="") pm.setParent("..") pm.rowLayout(numberOfColumns=3) pm.text(width=150, label="") pm.button(label="Pad this", command=pm.Callback(padObject)) pm.text(width=150, label="") pm.setParent("..") pm.setParent("..")
def createGuideCallback(self, *args): fromScene = pm.checkBox(self.getFromSceneCheckbox, q=True, v=True) rigName = pm.textFieldGrp(self.characterNameTextField, tx=True, q=True) fingersSetup = self.getFingerSetup() self.bipedInstance = biped.Biped(rigName=rigName, handFingers=fingersSetup[0], footFingers=fingersSetup[1]) if fromScene: self.bipedInstance.getDictsFromScene() fingerSetup = self.getFingerSetupFromScene() self.setFingerSetup(fingerSetup=fingerSetup) self.bipedInstance.generateGuides() guideGrp = pm.PyNode('GUIDES') guideGrp.visibility.set(True) try: rigGrp = pm.PyNode(self.bipedInstance.name.upper()) rigGrp.visibility.set(False) except: logger.warn('no rig...')
def __init__(self): self.windows_name = 'cgru_afanasy_wnd' if pm.window(self.windows_name, exists=True): pm.deleteUI(self.windows_name) self.window = pm.window(self.windows_name, t='Afanasy') with pm.columnLayout(adj=True): labels_width = 90 with pm.rowLayout(nc=2, adj=2, cw2=(labels_width, 50)): pm.text(l='Start Frame') pm.intField('cgru_afanasy__start_frame', v=pm.optionVar.get('cgru_afanasy__start_frame_ov', 1)) with pm.rowLayout(nc=2, adj=2, cw2=(labels_width, 50)): pm.text(l='End Frame') pm.intField('cgru_afanasy__end_frame', v=pm.optionVar.get('cgru_afanasy__end_frame_ov', 1)) with pm.rowLayout(nc=2, adj=2, cw2=(labels_width, 50)): pm.text(l='Frame Per Task') pm.intField('cgru_afanasy__frames_per_task', v=pm.optionVar.get( 'cgru_afanasy__frames_per_task_ov', 1)) with pm.rowLayout(nc=2, adj=2, cw2=(labels_width, 50)): pm.text(l='By Frame') pm.intField('cgru_afanasy__by_frame', v=pm.optionVar.get('cgru_afanasy__by_frame_ov', 1)) pm.checkBox('cgru_afanasy__paused', l='Start Paused', v=0) pm.checkBox('cgru_afanasy__separate_layers', l='Submit Render Layers as Separate Tasks', v=1) pm.button(l='LAUNCH', c=self.launch) pm.checkBox('cgru_afanasy__close', l='Close After', v=1) pm.showWindow(self.window)
def buildRig(self): """Building the Rig and the connections """ self.saveData() """ -------------------- Z AXIS -------------------- """ if pm.checkBox( "myChBxZ", q=True, v=True, ) == 1 and pm.checkBox( "myChBxX", q=True, v=True, ) == 0: self.tiltZ.buildRig() """ -------------------- X AXIS -------------------- """ if pm.checkBox( "myChBxX", q=True, v=True, ) == 1 and pm.checkBox( "myChBxZ", q=True, v=True, ) == 0: self.tiltX.buildRig() """ -------------------- Z AND X AXIS -------------------- """ if pm.checkBox( "myChBxZ", q=True, v=True, ) == 1 and pm.checkBox( "myChBxX", q=True, v=True, ) == 1: self.tiltBoth.buildRig()
def create_ui(self): ''' # this creates the ui # returns the layout for the gui components ''' self.layout = pm.columnLayout(adjustableColumn=True) self.root_joint = pm.checkBox(label='Create Root Joint') self.export = pm.checkBox(label='Export When Finished') self.delete = pm.checkBox(label='Delete When Finished') self.visibility = pm.checkBox(label='Visibility State', value=1) self.group = pm.checkBox(label='Group System', value=1) self.combine = pm.checkBox(label='Combine Meshes', value=0) self.start_end_fields = pm.intFieldGrp(numberOfFields=2, label=u'Start & End Frames', value1=0, value2=100, columnWidth3=[105, 90, 90]) pm.text(label='') pm.button(label='Bake Simulation', height=130, command=pm.Callback(self.bake_simulation)) return self.layout
def CreateClothWindow(self,*args): if pm.window("cloth", exists = True): pm.deleteUI("cloth") cloth = pm.window("Create Cloth", t = "Create Cloth", w = 400, h = 600) pm.columnLayout(adj = True, cal = "center", columnAttach=('both', 25)) pm.separator(h = 30) pm.text("Cloth Simulation with PBD and exact CCD", font = "boldLabelFont") pm.separator(h = 30) pm.frameLayout(label = "Cloth Subdivisions", collapsable = True, borderStyle = "etchedIn") self.GlobalVars["SubX"] = pm.intSliderGrp(l = "Subdivision X", min = 1, max = 20, value = 10, field = True) self.GlobalVars["SubY"] = pm.intSliderGrp(l = "Subdivision Y", min = 1, max = 20, value = 10, field = True) pm.setParent("..") pm.frameLayout(label = "Position Constraints", collapsable = True, borderStyle = "etchedIn") pm.gridLayout(numberOfColumns = 2, cellWidthHeight = (180,20)) self.GlobalVars["Locator_LeftTopCorner"] = pm.checkBox(label = "Locator_LeftTopCorner") self.GlobalVars["Locator_RightTopCorner"] = pm.checkBox(label = "Locator_RightTopCorner") self.GlobalVars["Locator_RightBottomCorner"] = pm.checkBox(label = "Locator_RightBottomCorner") self.GlobalVars["Locator_LeftBottomCorner"] = pm.checkBox(label = "Locator_LeftBottomCorner") self.GlobalVars["Locator_Middle"] = pm.checkBox(label = "Locator_Middle") pm.setParent("..") pm.setParent("..") pm.frameLayout(label = "Gravity", collapsable = True, borderStyle = "etchedIn") self.GlobalVars["GraV"] = pm.floatSliderGrp(l = "Gravity", min = 0.0, max = 9.8, field = True) pm.setParent("..") pm.frameLayout(label = "Wind Force", collapsable = True, borderStyle = "etchedIn") self.GlobalVars["Wind_X"] = pm.floatSliderGrp(l = "Wind Force_X", min = -10.0, max = 10, value = 0.0, field = True) self.GlobalVars["Wind_Y"] = pm.floatSliderGrp(l = "Wind Force_Y", min = -10.0, max = 10, value = 0.0, field = True) self.GlobalVars["Wind_Z"] = pm.floatSliderGrp(l = "Wind Force_Z", min = -10.0, max = 10, value = 0.0, field = True) self.GlobalVars["Noise"] = pm.floatSliderGrp(l = "Noise", min = 0.0, max = 2, value = 0.0, field = True) pm.setParent("..") pm.separator(h = 10) self.GlobalVars["DefaultText"] = pm.checkBox(label = "Default Texture") pm.separator(h = 10) pm.button(l = "Create", c = self.CreateCloth) pm.showWindow(cloth)
def _get_settings_for_postproc(robot): """ Get program settings from the Mimic UI. :return program_settings: dictionary """ # Get all important settings using_time_interval = pm.radioCollection('sample_rate_radio_collection', query=True, select=True) == 'rb_timeInterval' using_keyframes_only = not using_time_interval # TODO: Clever, but not expandable time_interval_value = pm.textField('t_timeBetweenSamples', query=True, text=True) time_interval_units = 'seconds' \ if pm.radioButtonGrp('time_unit_radio_group', query=True, sl=True) == 1 \ else 'frames' ignore_warnings = pm.checkBox('cb_ignoreWarnings', value=True, query=True) processor_type = pm.optionMenu('postProcessorList', query=True, value=True) output_directory = pm.textField('t_programDirectoryText', text=True, query=True) output_filename = pm.textField('t_outputFileName', text=True, query=True) template_filename = pm.textField('t_templateFileName', text=True, query=True) overwrite_option = pm.checkBox('cb_overwriteFile', value=True, query=True) # Get time interval in seconds animation_settings = _get_settings_for_animation(robot) framerate = animation_settings['Framerate'] if time_interval_units == 'seconds': sample_rate_sec = float(time_interval_value) else: # time_interval_units == 'frames' sample_rate_sec = float(time_interval_value) / float(framerate) time_interval_in_seconds = sample_rate_sec # Check for warnings if using_time_interval: # Confirm that the time interval is valid try: time_interval_value = float(time_interval_value) assert time_interval_value > 0 except ValueError: if time_interval_units == 'seconds': warning = 'Time interval must be a float' raise Exception(warning) else: # time_interval_units == 'frames' warning = 'Time interval must be a float' raise Exception(warning) except AssertionError: if time_interval_units == 'seconds': warning = 'Time interval must be greater than zero' raise Exception(warning) else: # time_interval_units = 'frames' warning = 'Time interval must be greater than zero' raise Exception(warning) # Check if the robot-postproc compatibility warning was triggered processor = postproc_setup.POST_PROCESSORS[processor_type]() warning = _check_robot_postproc_compatibility(robot, processor) if warning != '': if not ignore_warnings: raise Exception(warning) else: warning += '\n' pm.scrollField(OUTPUT_WINDOW_NAME, insertText=warning, edit=True) # Assign values to output dict postproc_settings = { 'Using Time Interval': using_time_interval, 'Using Keyframes Only': using_keyframes_only, 'Time Interval Value': time_interval_value, 'Time Interval Units': time_interval_units, 'Time Interval in Seconds': time_interval_in_seconds, 'Ignore Warnings': ignore_warnings, 'Processor Type': processor_type, 'Output Directory': output_directory, 'Output Filename': output_filename, 'Template Filename': template_filename, 'Overwrite Option': overwrite_option } return postproc_settings
def createTrail(): if pm.window('trailUI', ex=1): pm.deleteUI('trailUI') pm.window('trailUI') pm.columnLayout(adj=1) fsSample = pm.floatSliderGrp('sampleSlider', label='Sample by', cw=(1, 70), adj=1, en=1, minValue=0.01, maxValue=100, fieldMinValue=0.01, fieldMaxValue=100, pre=2, field=1, v=1) pm.separator(height=4, style="in") startFrame = pm.playbackOptions(q=1, min=1) currentFrame = pm.currentTime(q=1) if currentFrame > startFrame: startFrame = currentFrame pm.intSliderGrp('startFrameSlider', label='Start frame', cw=(1, 70), adj=1, en=1, minValue=0, maxValue=100, fieldMinValue=0, fieldMaxValue=10000, field=1, v=startFrame) pm.popupMenu(button=3, pmc=functools.partial(setTime, 'start')) pm.intSliderGrp('endFrameSlider', label='End frame', cw=(1, 70), adj=1, en=1, minValue=0, maxValue=100, fieldMinValue=0, fieldMaxValue=10000, field=1, v=startFrame + 30) pm.popupMenu(button=3, pmc=functools.partial(setTime, 'end')) pm.intSliderGrp('trailDivisions', label='Trail divisions', cw=(1, 70), adj=1, en=1, minValue=1, maxValue=100, fieldMinValue=1, fieldMaxValue=10000, field=1, v=40) pm.separator(height=4, style="in") cbUvDistorted = pm.checkBox('cbUV', l='UV distorted', v=1) pm.separator(height=4, style="in") rowBtn = pm.rowColumnLayout(numberOfRows=1) pm.button(l='Create Trail', command=functools.partial(createTrailMesh)) pm.button(l='Rebuil uvs', c=functools.partial(createTrailUv, '')) pm.button(l='ELP !!!', c=openHelpPage) pm.showWindow('trailUI')
def ui(self): template = pm.uiTemplate('ExampleTemplate', force=True) template.define(pm.button, height=30, w=80) template.define(pm.frameLayout, mw=2, mh=2, borderVisible=False, labelVisible=False) if pm.window(self.name, q=1, ex=1): pm.deleteUI(self.name) with pm.window("TiltTool_win", t=self.title, s=False, tlb=True, mnb=True) as win: with template: with pm.frameLayout(): with pm.columnLayout(adj=True, rs=10): pm.text(label="OPTIONS", h=30, fn="boldLabelFont") with pm.frameLayout(): with pm.columnLayout(adj=True, rs=5): with pm.rowLayout(columnWidth3=(0, 0, 0), adj=True, numberOfColumns=4): pm.text(label="Tilt Control ", align='left') self.tiltCtrl = pm.textFieldGrp( pht="Select the tilt control", cw1=150, tx=self.tiltCtrl_txt) pm.text(label="< < < ") pm.button(label="Add", h=25, backgroundColor=colordic['green3'], c=pm.Callback(self.getCtrl)) with pm.rowLayout(columnWidth3=(0, 0, 0), adj=True, numberOfColumns=4): pm.text(label="Mesh ", align='left') self.mesh = pm.textFieldGrp( pht="Select the mesh", cw1=150, tx=self.mesh_txt) pm.text(label="< < < ") pm.button(label="Add", h=25, backgroundColor=colordic['green3'], c=pm.Callback(self.getMesh)) with pm.rowLayout(columnWidth3=(0, 0, 0), adj=True, numberOfColumns=4): pm.text(label="Target Parent Group", align='left') self.target = pm.textFieldGrp( pht="Select the target", cw1=150, tx=self.parent_txt) pm.text(label="< < < ") pm.button(label="Add", h=25, backgroundColor=colordic['green3'], c=pm.Callback(self.getTarget)) with pm.rowLayout(columnWidth3=(0, 0, 0), adj=True, numberOfColumns=4): pm.text(label="Mesh Last Offset Ctrl", align='left') self.offset_ctrl = pm.textFieldGrp( pht="Select the target", cw1=150, tx=self.offset_txt) pm.text(label="< < < ") pm.button(label="Add", h=25, backgroundColor=colordic['green3'], c=pm.Callback(self.getOffsetCtrl)) pm.separator() pm.text(label="RIGGING", h=20, fn="boldLabelFont") pm.separator() with pm.rowLayout(columnWidth3=(0, 0, 0), numberOfColumns=7): pm.text( label=" CHOOSE AXIS ", h=50, ) if self.axisZ_setdata == 'True': pm.checkBox("myChBxZ", l="Z axis", h=25, value=True) else: pm.checkBox("myChBxZ", l="Z axis", h=25, value=False) if self.axisX_setdata == 'True': pm.checkBox("myChBxX", l="X axis", h=25, value=True) else: pm.checkBox("myChBxX", l="X axis", h=25, value=False) pm.button(label="Save Data", w=88, h=25, backgroundColor=colordic['blue'], c=pm.Callback(self.saveData)) pm.button(label="Clear Info", w=88, h=25, backgroundColor=colordic['darkblue'], c=pm.Callback(self.refresh)) with pm.rowLayout(columnWidth3=(0, 0, 0), numberOfColumns=2): pm.button(label="Build Basic Guide", w=197, backgroundColor=colordic['grey'], c=pm.Callback(self.buildGuide)) pm.button(label="Build Basic Rig", w=197, backgroundColor=colordic['grey'], c=pm.Callback(self.buildRig))
def show(self): # some default values section_label_height = 30 labels_width = 140 if pm.window(self.windows_name, exists=True): pm.deleteUI(self.windows_name) self.window = pm.window(self.windows_name, t='Afanasy Job Submission') with pm.columnLayout(adj=True): pm.text(l='<h1><b>Job Parameters<b><h1>', h=section_label_height) with pm.rowLayout(nc=4, adj=2, cl4=['right', 'left', 'center', 'center'], cw4=(labels_width, 40, 15, 15)): pm.text(l='<div align="right"><b>Start Frame</b></div>') start_time_int_field = pm.intField( 'cgru_afanasy__start_frame', v=pm.optionVar.get('cgru_afanasy__start_frame_ov', 1)) pm.button(l='<', ann='Use minimum animation range', c=functools.partial( self.set_field_value, start_time_int_field, functools.partial(pm.playbackOptions, q=True, min=True))) pm.button(l='<<', ann='Use minimum playback range', c=functools.partial( self.set_field_value, start_time_int_field, functools.partial(pm.playbackOptions, q=True, ast=True))) with pm.rowLayout(nc=4, adj=2, cw4=(labels_width, 40, 15, 15)): pm.text(l='<b>End Frame</b>') end_time_int_field = pm.intField( 'cgru_afanasy__end_frame', v=pm.optionVar.get('cgru_afanasy__end_frame_ov', 1)) pm.button(l='<', ann='Use maximum animation range', c=functools.partial( self.set_field_value, end_time_int_field, functools.partial(pm.playbackOptions, q=True, max=True))) pm.button(l='<<', ann='Use maximum playback range', c=functools.partial( self.set_field_value, end_time_int_field, functools.partial(pm.playbackOptions, q=True, aet=True))) with pm.rowLayout(nc=2, adj=2, cw2=(labels_width, 50)): pm.text(l='<b>Frame Per Task</b>') pm.intField('cgru_afanasy__frames_per_task', v=pm.optionVar.get( 'cgru_afanasy__frames_per_task_ov', 1)) with pm.rowLayout(nc=2, adj=2, cw2=(labels_width, 50)): pm.text(l='<b>By Frame</b>') pm.intField('cgru_afanasy__by_frame', v=pm.optionVar.get('cgru_afanasy__by_frame_ov', 1)) with pm.rowLayout(nc=2, adj=2, cw2=(labels_width, 50)): pm.text(l='<b>Global Depend Mask</b>') pm.textField('cgru_afanasy__depend_mask_global', text=pm.optionVar.get( 'cgru_afanasy__depend_mask_global_ov', '')) with pm.rowLayout(nc=2, adj=2, cw2=(labels_width, 50)): pm.text(l='<b>Host Mask</b>') pm.textField('cgru_afanasy__hosts_mask', text=pm.optionVar.get( 'cgru_afanasy__hosts_mask_ov', '')) with pm.rowLayout(nc=2, adj=2, cw2=(labels_width, 50)): pm.text(l='<b>Host Exclude</b>') pm.textField('cgru_afanasy__hosts_exclude', text=pm.optionVar.get( 'cgru_afanasy__hosts_exclude_ov', '')) with pm.rowLayout(nc=2, adj=2, cw2=(labels_width, 50)): pm.text(l='<b>Life Time (hours)</b>') pm.intField('cgru_afanasy__life_time', v=pm.optionVar.get('cgru_afanasy__life_time_ov', 240)) with pm.rowLayout(nc=2, adj=2, cw2=(labels_width, 50)): pm.text(l='<b>Annotation</b>') pm.textField('cgru_afanasy__annotation', text=pm.optionVar.get( 'cgru_afanasy__annotation_ov', '')) pm.separator() pm.text(l='<h1><b>Block Parameters<b><h1>', h=section_label_height) with pm.rowLayout(nc=2, adj=2, cw2=(labels_width, 50)): pm.text(l='<b>Errors Avoid Host</b>') pm.intField('cgru_afanasy__errors_avoid_host', v=pm.optionVar.get( 'cgru_afanasy__errors_avoid_host_ov', 3), min=0, max=127) with pm.rowLayout(nc=2, adj=2, cw2=(labels_width, 50)): pm.text(l='<b>Errors Retries</b>') pm.intField('cgru_afanasy__errors_retries', v=pm.optionVar.get( 'cgru_afanasy__errors_retries_ov', 3), min=0, max=127) with pm.rowLayout(nc=2, adj=2, cw2=(labels_width, 50)): pm.text(l='<b>Errors Task Same Host</b>') pm.intField('cgru_afanasy__errors_task_same_host', v=pm.optionVar.get( 'cgru_afanasy__errors_task_same_host_ov', 3), min=0, max=127) with pm.rowLayout(nc=2, adj=2, cw2=(labels_width, 50)): pm.text(l='<b>Errors Forgive Time</b>', ann='in seconds') pm.intField('cgru_afanasy__errors_forgive_time', ann='in seconds', v=pm.optionVar.get( 'cgru_afanasy__errors_errors_forgive_time_ov', 18000), min=0) pm.separator() pm.text(l='<h1><b>Submission Details<b><h1>', h=section_label_height) with pm.rowLayout(nc=2, adj=2, cl2=('right', 'left'), cw2=(labels_width, 50)): pm.text(l='<b>Start Paused</b>', al='right') pm.checkBox('cgru_afanasy__paused', l='', v=pm.optionVar.get('cgru_afanasy__paused_ov', 0)) pm.radioButtonGrp( 'cgru_afanasy__separate_layers', numberOfRadioButtons=3, label='<b>Submit Render Layers<br>as Separate:</b>', labelArray3=['None', 'Block', 'Job'], # adj=1, cw4=[labels_width, 50, 50, 50], sl=pm.optionVar.get('cgru_afanasy__separate_layers_ov', 2)) with pm.rowLayout(nc=2, adj=2, cw2=(labels_width, 50)): ann = """This is a weird hack! When used in conjunction with the <b>Skip Existence Frames<b> parameter of the maya render settings and the Frames Per Task parameters is equal or greater than the number of frames in the animation range, it allows the Maya scene to be loaded only once per farm machine. But then to be able to use all farmers there should be at least the same amount of Jobs that there are farm machines. So with this parameter it is possible to submit the same job multiple times.. But it is a bad hack. This system will be updated in Afanasy.""" pm.text(l='<b>Submit Multiple Times</b>', ann=ann) pm.intField('cgru_afanasy__submit_multiple_times', ann=ann, v=pm.optionVar.get( 'cgru_afanasy__submit_multiple_times_ov', 1)) with pm.rowLayout(nc=2, adj=2, cl2=('right', 'left'), cw2=(labels_width, 40)): pm.text(l='<b>Generate Previews</b>', al='right') pm.checkBox('cgru_afanasy__generate_previews', l='', v=pm.optionVar.get( 'cgru_afanasy__generate_previews_ov', 1)) with pm.rowLayout(nc=2, adj=2, cl2=('right', 'left'), cw2=(labels_width, 40)): pm.text(l='<b>Close After</b>', al='right') pm.checkBox('cgru_afanasy__close', l='', v=1) pm.button(l='SUBMIT', c=self.launch) pm.showWindow(self.window)
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 show(self): if pm.window(self.windows_name, exists=True): pm.deleteUI(self.windows_name) self.window = pm.window(self.windows_name, t='Afanasy') with pm.columnLayout(adj=True): labels_width = 90 with pm.rowLayout(nc=4, adj=2, cw4=(labels_width, 40, 15, 15)): pm.text(l='Start Frame') start_time_int_field = pm.intField( 'cgru_afanasy__start_frame', v=pm.optionVar.get('cgru_afanasy__start_frame_ov', 1)) pm.button(l='<', ann='Use minimum animation range', c=functools.partial( self.set_field_value, start_time_int_field, functools.partial(pm.playbackOptions, q=True, min=True))) pm.button(l='<<', ann='Use minimum playback range', c=functools.partial( self.set_field_value, start_time_int_field, functools.partial(pm.playbackOptions, q=True, ast=True))) with pm.rowLayout(nc=4, adj=2, cw4=(labels_width, 40, 15, 15)): pm.text(l='End Frame') end_time_int_field = pm.intField( 'cgru_afanasy__end_frame', v=pm.optionVar.get('cgru_afanasy__end_frame_ov', 1)) pm.button(l='<', ann='Use maximum animation range', c=functools.partial( self.set_field_value, end_time_int_field, functools.partial(pm.playbackOptions, q=True, max=True))) pm.button(l='<<', ann='Use maximum playback range', c=functools.partial( self.set_field_value, end_time_int_field, functools.partial(pm.playbackOptions, q=True, aet=True))) with pm.rowLayout(nc=2, adj=2, cw2=(labels_width, 50)): pm.text(l='Frame Per Task') pm.intField('cgru_afanasy__frames_per_task', v=pm.optionVar.get( 'cgru_afanasy__frames_per_task_ov', 1)) with pm.rowLayout(nc=2, adj=2, cw2=(labels_width, 50)): pm.text(l='By Frame') pm.intField('cgru_afanasy__by_frame', v=pm.optionVar.get('cgru_afanasy__by_frame_ov', 1)) with pm.rowLayout(nc=2, adj=2, cw2=(labels_width, 50)): pm.text(l='Host Mask') pm.textField('cgru_afanasy__hosts_mask', text=hostmaskServeur) with pm.rowLayout(nc=2, adj=2, cw2=(labels_width, 50)): pm.text(l='Host Exclude') pm.textField('cgru_afanasy__hosts_exclude', text=pm.optionVar.get( 'cgru_afanasy__hosts_exclude_ov', '')) with pm.rowLayout(nc=2, adj=2, cw2=(labels_width, 50)): pm.text(l='Life Time (hours)') pm.intField('cgru_afanasy__life_time', v=pm.optionVar.get('cgru_afanasy__life_time_ov', -1)) pm.checkBox('cgru_afanasy__paused', l='Start Paused', v=0) pm.checkBox('cgru_afanasy__separate_layers', l='Submit Render Layers as Separate Tasks', v=pm.optionVar.get('cgru_afanasy__separate_layers_ov', 1)) pm.button(l='LAUNCH', c=self.launch) pm.checkBox('cgru_afanasy__close', l='Close After', v=1) pm.showWindow(self.window)