def createAssetCallBack(self, *args): name = pm.textFieldGrp('CrAsset_nameField', q=True, tx=True) if not name: return pm.confirmDialog( title='error', ma='center', message='please choose a name for the asset', button=['OK'], defaultButton='OK', dismissString='OK') workflow = pm.optionMenuGrp('CrAsset_workflowOpt', q=True, v=True) code = pm.textFieldGrp('CrAsset_codeField', q=True, tx=True) itemDict = database.createItem(self.type, name, self.path, workflow, code) print itemDict if itemDict == 'codeExists': return pm.confirmDialog(title='error', ma='center', message='this code already exists', button=['OK'], defaultButton='OK', dismissString='OK') pm.layoutDialog(dismiss='ok')
def addMultipleFolders(self, *args): sel = pm.treeView(self.widgetName, q=True, si=True) name = pm.textFieldGrp('addMulti_nameField', q=True, tx=True) start = pm.intFieldGrp('addMulti_rangeField', q=True, value1=True) end = pm.intFieldGrp('addMulti_rangeField', q=True, value2=True) step = pm.intFieldGrp('addMulti_rangeField', q=True, value3=True) zeroPad = pm.intFieldGrp('addMulti_zeroField',q=True, value1=True) if sel: for folder in sel: par = folder for i in range(start, end + 1, step): itemName = self.nextFolderName(name, par) + '{number:0{width}d}'.format(width=zeroPad, number=i) print itemName pm.treeView(self.widgetName, e=True, addItem=(itemName, par)) pm.treeView(self.widgetName, e=True, displayLabel=(itemName, itemName.split('_')[-1])) else: par = '' for i in range(start, end + 1, step): itemName = self.nextFolderName(name, par) + '{number:0{width}d}'.format(width=zeroPad, number=i) print itemName pm.treeView(self.widgetName, e=True, addItem=(itemName, par)) pm.treeView(self.widgetName, e=True, displayLabel=(itemName, itemName.split('_')[-1])) self.putFolderTree() pm.layoutDialog(dismiss='ok')
def cachePromptChangeList(*args): """ :rtype: object """ sel = pm.textScrollList('cacheScrollList', q=True, si=True) selString = ','.join(sel) pm.layoutDialog(dismiss=selString)
def addItemCallBack(self, *args): if not self.path: return pm.confirmDialog(title='error', ma='center', message='please choose a folder where to create the asset', button=['OK'], defaultButton='OK', dismissString='OK') pm.layoutDialog(ui=lambda: self.createAssetPrompt()) self.refreshList(path=self.path, task=self.task)
def showHideAttr(vis, picker, arg): """Code to show/hide attrs via showHide dialog. Don't worry about it.""" sel = pmc.ls(selection=True) pmc.layoutDialog(dismiss=True) curr = pmc.optionMenu(picker, q=True, v=True) for s in sel: for d in ["X", "Y", "Z"]: pmc.setAttr(s + "." + curr + d, k=vis, l=(not vis))
def createAssetCallBack(self, component, *args): if component: ns = pm.textFieldGrp('nsFieldPrompt', q=True, tx=True) database.addComponent(self.item, ns, component.task, component.code, 'reference', update=True) createdTasks = database.getShotCreatedTasks(self.item) for itemMData in createdTasks: database.addComponent(itemMData, ns, component.task, component.code, 'reference', update=True) pm.layoutDialog(dismiss='ok')
def addTab(self, _type): """ Method: addTab a method to add a tab Inputs: _type: A string identifyinfg the type of tab to add On Exit: A tab has been added """ # switch throught the different options if _type == "arm": # create a button prompt side = pm.layoutDialog(t="Pick Sides", ui=lrPrompt) # set up a settings object for the tab settings settings = pts.TabSettings() settings.m_baseName = self.m_tabList[0].getRigName() settings.m_tabName = "Arm Tab " + str(self.uID) self.uID = self.uID + 1 settings.m_limbName = "Arm" settings.m_sideSpecifier = side arm = par.ArmRig(settings.m_baseName) self.m_rigComponents.append(arm) settings.m_rigElement = arm # switch through the dificulty levels if self.m_skillLevel == "Novice": self.m_tabList.append(patn.ArmTabNovice(self.m_tabs, self, settings)) elif self.m_skillLevel == "Intermediate": self.m_tabList.append(pati.ArmTabIntermediate(self.m_tabs, self, settings)) elif self.m_skillLevel == "Experienced": self.m_tabList.append(pate.ArmTabExperienced(self.m_tabs, self, settings)) self.m_tabs.setSelectTabIndex(len(self.m_tabList)) self.m_helpBox.update()
def dialogWrap(windowClass, title=None, *args, **kwargs): """Wrapper for Maya's layoutDialogue class. It will take focus of the entire program. Note: Due to Python 2 limitations, *args and **kwargs can't be unpacked with the title keyword present, so don't try to clean up the code by enabling unpacking again. """ def uiScript(cls, clsArgs=(), clsKwargs={}): form = pm.setParent(query=True) parent = pm.uitypes.toQtObject(form) parent.layout().setSizeConstraint(QtWidgets.QLayout.SetFixedSize) windowInstance = cls(parent, *clsArgs, **clsKwargs) windowInstance.windowReady.emit() return windowInstance return pm.layoutDialog(ui=partial(uiScript, windowClass, clsArgs=args, clsKwargs=kwargs), title=title)
def dialog(cls, parent=None, *args, **kwargs): """Create the window as a dialog. For Maya versions after 2017, pm.layoutDialog is used. """ # This is quite buggy and can lock up Maya, so disable for now if False and not cls._Pre2017: # Note: Due to Python 2 limitations, *args and **kwargs can't be unpacked with the # title keyword present, so don't try to clean up the code by enabling unpacking again. def uiScript(cls, clsArgs=(), clsKwargs={}): form = pm.setParent(query=True) parent = pm.uitypes.toQtObject(form) parent.layout().setSizeConstraint( QtWidgets.QLayout.SetFixedSize) windowInstance = cls(parent, *clsArgs, **clsKwargs) windowInstance.windowReady.emit() return windowInstance # Set WindowID if needed but disable saving # TODO: Override output to match AbstractWindow.dialog # cmds.layoutDialog(dismiss=str(data)) to self.dialogAccept(data) class WindowClass(windowClass): if not hasattr(windowClass, 'WindowID'): WindowID = uuid.uuid4().hex def enableSaveWindowPosition(self, enable): return super(WindowClass, self).enableSaveWindowPosition(False) try: return pm.layoutDialog( ui=partial(uiScript, WindowClass, clsArgs=args, clsKwargs=kwargs), title=getattr(cls, 'WindowTitle', 'New Window'), ) finally: cls.clearWindowInstance(cls.WindowID) if parent is None: parent = getMainWindow() return super(MayaWindow, cls).dialog(parent=parent, *args, **kwargs)
def sceneRefCheck(silent=False): """ Compare the current scene references versions with metadata and update as needed :param silent: boolean :return: """ uptodate = True print 'init sceneChecking...' currentProject = database.getCurrentProject() projName = pm.fileInfo.get('projectName') if currentProject != projName: print 'ERROR sceneRefCheck: This file is from a project different from the current project' return item = Item(fromScene=True) # get current scene metadata # compare references and metadata and create lists of references to add, delete, update and replace refOnSceneList = pm.getReferences() toDelete = [x for x in refOnSceneList if x not in item.components] toAdd = [x for x in item.components if x not in refOnSceneList and x != 'cam'] toReplace = [x for x in item.components if item.components[x]['task'] != item.components[x]['proxyMode']] refToCheckUpdate = [x for x in refOnSceneList if x not in toDelete and x not in toReplace] toUpdate = {} # create the list of references to update depending on the assemble mode for ns in refToCheckUpdate: if item.components[ns]['assembleMode'] == 'camera': continue if item.components[ns]['assembleMode'] == 'reference': component = ReferenceComponent(ns, item.components[ns], parent=item) toUpdate[ns] = component.updateVersion(refOnSceneList[ns]) if item.components[ns]['assembleMode'] == 'xlo': component = XloComponent(ns, item.components[ns], parent=item) toUpdate[ns] = component.updateVersion(refOnSceneList[ns]) if item.components[ns]['assembleMode'] == 'cache': cache = CacheComponent(ns, item.components[ns], parent=item) toUpdate[ns] = cache.updateVersion(refOnSceneList[ns]) # If not in silent mode, show dialogs to the user choose which references should be processed if not silent: if toDelete: uptodate = False toDelete = pm.layoutDialog(ui=lambda: refCheckPrompt(toDelete, 'delete')).split(',') if toAdd: uptodate = False toAdd = pm.layoutDialog(ui=lambda: refCheckPrompt(toAdd, 'add')).split(',') if toReplace: uptodate = False toReplace = pm.layoutDialog(ui=lambda: refCheckPrompt(toReplace, 'replace')).split(',') upDateList = [x for x, y in toUpdate.iteritems() if y ] if upDateList: uptodate = False upDateList = pm.layoutDialog(ui=lambda: refCheckPrompt(upDateList, 'update')).split(',') toUpdate = {x: y for x, y in toUpdate.iteritems() if x in upDateList} else: toUpdate = {} if uptodate: pm.confirmDialog(title='Scene Check', ma='center', message='Versions ok!', button=['OK'], defaultButton='OK', dismissString='OK') # Do the processing # delete print 'toDelete:%s' % toDelete for ns in toDelete: refOnSceneList[ns].remove() # add print 'toAdd:%s' % toAdd for ns in toAdd: if item.components[ns]['assembleMode'] == 'camera': continue print ns if item.components[ns]['assembleMode'] == 'reference': component = ReferenceComponent(ns, item.components[ns], parent=item) component.addToScene() elif item.components[ns]['assembleMode'] == 'xlo': component = XloComponent(ns, item.components[ns], parent=item) component.addToScene() cache = CacheComponent(ns, item.components[ns], parent=item) cache.importCache() elif item.components[ns]['assembleMode'] == 'cache': cache = CacheComponent(ns, item.components[ns], parent=item) cache.addToScene() #update versions for ns, versions in toUpdate.iteritems(): if item.components[ns]['assembleMode'] == 'camera': continue if item.components[ns]['assembleMode'] == 'reference': component = ReferenceComponent(ns, item.components[ns], parent=item) componentPath = component.getPublishPath() refOnSceneList[ns].replaceWith(componentPath) if item.components[ns]['assembleMode'] == 'xlo': if 'ver' in versions: component = XloComponent(ns, item.components[ns], parent=item) componentPath = component.getPublishPath() refOnSceneList[ns].replaceWith(componentPath) if 'cacheVer' in versions: #todo check if need to delete old cache node cache = CacheComponent(ns, item.components[ns], parent=item) cache.importCache() if item.components[ns]['assembleMode'] == 'cache': component = CacheComponent(ns, item.components[ns], parent=item) componentPath = component.getPublishPath() refOnSceneList[ns].replaceWith(componentPath) # Replace for ns in toReplace: if item.components[ns]['assembleMode'] == 'reference': print item.components[ns]['task'], item.components[ns]['proxyMode'] item.components[ns]['task'] = item.components[ns]['proxyMode'] print item.components[ns]['task'], item.components[ns]['proxyMode'] component = ReferenceComponent(ns, item.components[ns], parent=item) print component.getPublishPath() # todo check if existe uma versao refOnSceneList[ns].replaceWith(component.getPublishPath()) item.putDataToDB() print 'done sceneChecking!'
def _show(): pm.layoutDialog(ui=_addLocMultiOptions)
def _retriveOptions(jNumber, dirAxis, jSpac, *args): self.jNumberVal = jNumber.getValue()[0] self.dirAxisVal = dirAxis.getValue() self.jSpacVal = jSpac.getValue()[0] pm.layoutDialog(dismiss="Continue")
def abortCreateCallback(self, *args): pm.layoutDialog(dismiss="Abort")
def genChain(self): """ Method: genChain A method to generate the joint chain """ #check if there is an existing joint chain isChainExist = self.m_rigElement.getIsGenerated() force = "False" if isChainExist: #generate a dialog window to define the force variable force = pm.layoutDialog(t = "Replace Chain?", ui = forcePrompt) if force == "True": #clear the rigElement self.m_rigElement.clear() #and set isChainExist to false isChainExist = False #if a chain doesn't exist at this point if not isChainExist: #create a list of the unicode strings representing #the selected joints and an empty list for their #pynode counterparts strList = self.m_jointTable.getAllItems() pyNodeList = [] #cycle through and convert to pyNode for jnt in strList: pyNodeList.append(pm.PyNode(jnt)) #check that there are some joints if pyNodeList == []: #currently print, will be refactored to use the help box self.m_gui.getHelp().update( _errorList =["ERROR","NO JOINTS","ERROR: No joints were passed in to generate the rig from"]) #otherwise continue with the generation else: #set the m_template joints equal to those passed in with hierarchy enforced pyNodeList = self.enforceHierarchy(pyNodeList) #now check if there is any nodes in the joint list if pyNodeList == []: #temp print, will use the help box eventually self.m_gui.getHelp().update( _errorList = ["ERROR","INCORRECT HIERARCHY","ERROR: The joints selected were not in a single hierarchy, either a joint was missing or one of them had two immediate children in the selection with it"]) else: #and set the root name for the arm self.m_rigElement.setRootName(self.addExtToNames(self.addExtToNames([self.m_rigName],self.m_sideSpecifier),self.m_limbName)[0]) result = self.m_rigElement.genArmRig(pyNodeList, _doIK = self.m_ikCheck.getValue(), _ikExt = self.m_ikExt, _doFK = self.m_fkCheck.getValue(), _fkExt = self.m_fkExt, _jntExt = self.m_jntExt, _ctrlExt = self.m_ctrlExt, _doTwist = self.m_twistCheck.getValue(), _twistStartIds = [-2], _numTwistJnts = self.m_numTwistJnts ) self.m_gui.getHelp().update( _errorList = result)
def cacheScene(task, code): ver = 0 collection = database.getCollection('shot') shotMData = database.getItemMData(task=task, code=code, itemType='shot') if 'caches' not in shotMData: shotMData['caches'] = copy.deepcopy(shotMData['components']) for item in shotMData['caches'].itervalues(): item['ver'] = 0 item['type'] = 'cache' item['assembleMode'] = 'cache' item['cacheVer'] = 0 item['name'] = '' itemComponents = shotMData['components'] itemCaches = shotMData['caches'] geoGroups = pm.ls('geo_group', r=True) choosen = pm.layoutDialog(ui=lambda: cachePrompt(geoGroups)) if 'Abort' in choosen: return path = database.getPath(shotMData, dirLocation='cacheLocation', ext='') cachePath = os.path.join(*path) if not os.path.exists(cachePath): os.makedirs(cachePath) choosenGeoGroups = [pm.PyNode(x) for x in choosen.split(',')] for geoGroup in choosenGeoGroups: # get all geometry on geo_group geosShape = geoGroup.getChildren(allDescendents=True, type='geometryShape') geos = [x.getParent() for x in geosShape] jobGeos = '' for geo in geos: if '|' in geo: logger.error('Naming problem on geo %s' % geo) else: jobGeos = jobGeos + ' -root ' + geo # make path and name for alembic file ns = geoGroup.namespace()[:-1] cacheMData = itemCaches[ns] # get the data for this component # get version and increment cacheMData['cacheVer'] += 1 ver = cacheMData['cacheVer'] # get cache publish path cacheName = database.templateName(cacheMData) + '_' + ns cacheFileName = str('v%03d_' % ver) + cacheName cacheFullPath = os.path.join(cachePath, cacheFileName) jobFile = " -file " + cacheFullPath + ".abc " # get scene frame range ini = str(int(pm.playbackOptions(q=True, min=True))) fim = str(int(pm.playbackOptions(q=True, max=True))) jobFrameRange = ' -frameRange ' + ini + ' ' + fim # set parameters for alembic cache jobAttr = ' -attr translateX -attr translateY -attr translateZ -attr rotateX ' \ '-attr rotateY -attr rotateZ -attr scaleX -attr scaleY -attr scaleZ -attr visibility' jobOptions = " -worldSpace -uv -writeVisibility" # build cache arguments jobArg = jobFrameRange + jobOptions + jobAttr + jobGeos + jobFile # do caching pm.AbcExport(j=jobArg) collection.find_one_and_update({ 'task': task, 'code': code }, {'$set': shotMData}) logger.info('Cache Ver: %s')
def createAssetCallBack(self, component, *args): if component: print component pm.layoutDialog(dismiss='ok')
import pymel.core as pm import lcPipe.ui.widgets as widgets pm.layoutDialog(ui=lambda: widgets.AssetPrompt())
def addMultipleFoldersCallback(self, *args): pm.layoutDialog(ui=self.addMultiPromp)
def makeShowHideDialog(): """A UI to show/hide channel box attributes for selected objects.""" pmc.layoutDialog(ui=dialogGuts, title="Lock+Hide/Unlock+Show")
def changeList(*args): sel = pm.textScrollList('scrollList', q=True, si=True) selString = ','.join(sel) pm.layoutDialog(dismiss=selString)
def abortMultipleFolders(self, *args): pm.layoutDialog(dismiss='cancel')
def addItemCallBack(self, *args): pm.layoutDialog(ui=lambda: self.createAssetPrompt()) self.refreshList(itemMData=self.item)
def okCallback(self, selected): logger.debug(selected.name()) pm.layoutDialog(dismiss='ok')