def deleteSelectedModule(self,*args): selectedModule = cmds.textScrollList(self.UIElements['animationModule_textScroll'],q=True,selectItem=True)[0] selectedModuleNamespace = self.selectedBlueprintModule + ':' + selectedModule moduleNameInfo = utils.findAllModuleNames('/Modules/Animation') modules = moduleNameInfo[0] moduleNames = moduleNameInfo[1] selectedModuleName = selectedModule.rpartition('_')[0] if selectedModuleName in moduleNames: moduleIndex = moduleNames.index(selectedModuleName) module = modules[moduleIndex] mod = __import__('Animation.'+module,{},{}, [module]) reload(mod) moduleClass = getattr(mod,mod.CLASS_NAME) moduleInst = moduleClass(selectedModuleNamespace) moduleInst.uninstall() self.refreshAnimationModuleList()
def setupModuleSpecificControls(self): currentlySelectedModuleInfo = cmds.textScrollList(self.UIElements["animationModule_textScroll"], q=True, selectItem=True) currentlySelectedModuleNamespace = None if currentlySelectedModuleInfo != None: currentlySelectedModuleNamespace = currentlySelectedModuleInfo[0] if currentlySelectedModuleNamespace == self.previousAnimationModule and self.selectedBlueprintModule == self.previousBlueprintModule: return existingControls = cmds.columnLayout(self.UIElements["moduleSpecificControlsColumn"], q=True, childArray=True) if existingControls != None: cmds.deleteUI(existingControls) cmds.button(self.UIElements["matchingButton"], edit=True, enable=False) cmds.setParent(self.UIElements["moduleSpecificControlsColumn"]) moduleNameInfo = utils.findAllModuleNames("/Modules/Animation") modules = moduleNameInfo[0] moduleNames = moduleNameInfo[1] if currentlySelectedModuleInfo != None: currentlySelectedModule = currentlySelectedModuleNamespace.rpartition("_")[0] if currentlySelectedModule in moduleNames: # Matching button enabled? # Should that actually be _weight? moduleWeightValue = cmds.getAttr(self.selectedBlueprintModule+":SETTINGS."+currentlySelectedModuleNamespace+"_weight") matchButtonEnable = moduleWeightValue == 0.0 moduleIndex = moduleNames.index(currentlySelectedModule) module = modules[moduleIndex] cmds.attrControlGrp(attribute=self.selectedBlueprintModule+":"+currentlySelectedModuleNamespace+":module_grp.lod", label="Module_LOD") mod = __import__("Animation."+module, {}, {}, [module]) reload(mod) moduleClass = getattr(mod, mod.CLASS_NAME) moduleInst = moduleClass(self.selectedBlueprintModule+":"+currentlySelectedModuleNamespace) moduleInst.UI(self.UIElements["moduleSpecificControlsColumn"]) # Set parent back to module specific controls layout self.UIElements["moduleSpecificControls_preferencesFrame"] = cmds.frameLayout(borderVisible=True, label="preferences", collapsable=True) self.UIElements["moduleSpecificControls_preferencesColumn"] = cmds.columnLayout(columnAttach=["both", 5], adj=True) cmds.attrControlGrp(attribute=self.selectedBlueprintModule+":"+currentlySelectedModuleNamespace+":module_grp.iconScale", label="Icon Scale") value = cmds.getAttr(self.selectedBlueprintModule+":"+currentlySelectedModuleNamespace+":module_grp.overrideColor") self.UIElements["iconColor"] = cmds.colorIndexSliderGrp(label="Icon Color", maxValue=32, v=value, cc=partial(self.iconColor_callback, currentlySelectedModuleNamespace)) moduleInst.UI_preferences(self.UIElements["moduleSpecificControls_preferencesColumn"]) cmds.button(self.UIElements["matchingButton"], edit=True, enable=matchButtonEnable, c=moduleInst.match) self.previousBlueprintModule = self.selectedBlueprintModule self.previousAnimationModule = currentlySelectedModuleNamespace
def setupModuleSpecificControls(self): currentlySelectedModuleInfo = cmds.textScrollList(self.UIElements['animationModule_textScroll'],q=True, selectItem=True) currentlySelectedModuleNamespace = None if currentlySelectedModuleInfo != None: currentlySelectedModuleNamespace = currentlySelectedModuleInfo[0] if currentlySelectedModuleNamespace == self.previousAnimationModule and self.selectedBlueprintModule == self.previousBlueprintModule: return existingControls = cmds.columnLayout(self.UIElements['moduleSpecificControlsColumn'], q=True, childArray=True) if existingControls != None: cmds.deleteUI(existingControls) cmds.button(self.UIElements['matchingButton'],edit=True, enable=False) cmds.setParent(self.UIElements['moduleSpecificControlsColumn']) moduleNameInfo = utils.findAllModuleNames('/Modules/Animation') modules = moduleNameInfo[0] moduleNames = moduleNameInfo[1] if currentlySelectedModuleInfo != None: currentlySelectedModule = currentlySelectedModuleNamespace.rpartition('_')[0] if currentlySelectedModule in moduleNames: moduleWeightValue = cmds.getAttr(self.selectedBlueprintModule + ':SETTINGS.' + currentlySelectedModuleNamespace + '_weight') matchButtonEnable = moduleWeightValue == 0.0 moduleIndex = moduleNames.index(currentlySelectedModule) module = modules[moduleIndex] cmds.attrControlGrp(attribute=self.selectedBlueprintModule + ':' + currentlySelectedModuleNamespace + ':module_grp.lod', label='Module LOD') mod = __import__('Animation.' + module, {},{},[module]) reload(mod) moduleClass = getattr(mod,mod.CLASS_NAME) moduleInst = moduleClass(self.selectedBlueprintModule + ':' + currentlySelectedModuleNamespace) moduleInst.UI(self.UIElements['moduleSpecificControlsColumn']) cmds.setParent(self.UIElements['moduleSpecificControlsColumn']) self.UIElements['moduleSpecificControls_preferencesFrame'] = cmds.frameLayout(borderVisible=True, label='prefrences',collapsable=True) self.UIElements['moduleSpecificControls_preferencesColumn'] = cmds.columnLayout(columnAttach=['both', 5], adj=True) cmds.attrControlGrp(attribute=self.selectedBlueprintModule + ':' + currentlySelectedModuleNamespace + ':module_grp.iconScale', label='Icon Scale') value = cmds.getAttr(self.selectedBlueprintModule + ':' + currentlySelectedModuleNamespace + ':module_grp.overrideColor') + 1 self.UIElements['iconColor'] = cmds.colorIndexSliderGrp(label='Icon Colour', maxValue=32, v=value, cc=partial(self.iconColour_callback, currentlySelectedModuleNamespace)) moduleInst.UI_preferences(self.UIElements['moduleSpecificControls_preferencesColumn']) cmds.button(self.UIElements['matchingButton'], edit=True, enable=matchButtonEnable, c=moduleInst.match) self.previousBlueprintModule = self.selectedBlueprintModule self.previousAnimationModule = currentlySelectedModuleNamespace
def lock(self, *args): result = pm.confirmDialog( messageAlign='center', title='Lock Blueprints', message= 'Locking will convert modules to joints. This action can not bet undone. \n Modification to blueprint system can not be done after this.', button=['Accept', 'Cancel'], defaultButton='Accept', cancelButton='Cancel') if result != 'Accept': return moduleInfo = [] #store (module, userSpecifiedName) pairs #find all modules in scene and store them in moduleInfo list [moduleName, userSpecifiedName] pm.namespace(setNamespace=":") namespace = pm.namespaceInfo(listOnlyNamespaces=True) moduleNameInfo = utils.findAllModuleNames("/Modules/Blueprint") validModules = moduleNameInfo[0] validModuleNames = moduleNameInfo[1] for n in namespace: splitString = n.partition("__") if splitString[1] != "": module = splitString[0] userSpecifiedName = splitString[2] if module in validModuleNames: index = validModuleNames.index(module) moduleInfo.append([validModules[index], userSpecifiedName]) if len(moduleInfo) == 0: pm.confirmDialog(messageAlign='center', title='Lock Blueprints', message='No Blueprint Modules in scene', button=['Accept'], defaultButton='Accept') return print moduleInfo moduleInstances = [] #lock phase 1 - gather tranform/rotation info of joints for module in moduleInfo: mod = __import__('Blueprint.' + module[0], {}, {}, [module[0]]) reload(mod) moduleClass = getattr(mod, mod.CLASS_NAME) moduleInst = moduleClass(userSpecifiedName=module[1]) moduleInfo = moduleInst.lock_phase1() moduleInstances.append((moduleInst, moduleInfo)) print moduleInfo #lock phase 2 for module in moduleInstances: module[0].lock_phase2(module[1])
def duplicateSelectedModule(self,*args): self.deleteScriptJob() result = cmds.confirmDialog(messageAlign='center',title='Duplicate Control Module',message='Duplicate animation as well as controls?',button=['Yes','No','Cancel'],defaultButton='Yes',cancelButton='Cancel',dismissString='Cancel') if result == 'Cancel': self.setupScriptJob() return duplicateWithAnimation = False if result == 'Yes': duplicateWithAnimation = True selectedModule = cmds.textScrollList(self.UIElements['animationModule_textScroll'],q=True,selectItem=True)[0] selectedModuleNamespace = self.selectedBlueprintModule + ':' + selectedModule moduleNameInfo = utils.findAllModuleNames('/Modules/Animation') modules = moduleNameInfo[0] moduleNames = moduleNameInfo[1] selectedModuleName = selectedModule.rpartition('_')[0] if selectedModuleName in moduleNames: moduleIndex = moduleNames.index(selectedModuleName) module = modules[moduleIndex] mod = __import__('Animation.'+module,{},{}, [module]) reload(mod) moduleClass = getattr(mod,mod.CLASS_NAME) moduleInst = moduleClass(selectedModuleNamespace) selectedIndex = cmds.textScrollList(self.UIElements['animationModule_textScroll'],q=True, selectIndexedItem=True)[0] previousSelection = cmds.ls(selection=True) moduleInst.duplicateControlModule(withAnimation=duplicateWithAnimation) utils.forceSceneUpdate() if len(previousSelection) != 0: cmds.select(previousSelection, replace=True) else: cmds.select(clear=True) self.refreshAnimationModuleList(index= selectedIndex) self.setupScriptJob()
def duplicateSelectedModule(self, *args): self.deleteScriptJob() result = cmds.confirmDialog(messageAlign="center", title="Duplicate Control Module", message="Duplicate animation as well as controls?", button=["Yes", "No", "Cancel"], defaultButton="Yes", cancelButton="Cancel", dismissString="Cancel") if result == "Cancel": self.setupScriptJob() return duplicateWithAnimation = False if result == "Yes": duplicateWithAnimation = True selectedModule = cmds.textScrollList(self.UIElements["animationModule_textScroll"], q=True, selectItem=True)[0] selectedModuleNamespace = self.selectedBlueprintModule + ":" + selectedModule moduleNameInfo = utils.findAllModuleNames("/Modules/Animation") modules = moduleNameInfo[0] moduleNames = moduleNameInfo[1] selectedModuleName = selectedModule.rpartition("_")[0] if selectedModuleName in moduleNames: moduleIndex = moduleNames.index(selectedModuleName) module = modules[moduleIndex] mod = __import__("Animation."+module, {}, {}, [module]) reload(mod) moduleClass = getattr(mod, mod.CLASS_NAME) moduleInst = moduleClass(selectedModuleNamespace) selectedIndex = cmds.textScrollList(self.UIElements["animationModule_textScroll"], q=True, selectIndexedItem=True) previousSelection = cmds.ls(sl=True) moduleInst.duplicateControlModule(withAnimation=duplicateWithAnimation) # Refresh animation module list utils.forceSceneUpdate() if len(previousSelection) != 0: cmds.select(previousSelection, replace=True) else: cmds.select(clear=True) self.refreshAnimationModuleList(index = selectedIndex) self.setupScriptJob()
def canModuleBeMirrored(self, module): moduleNameInfo = utils.findAllModuleNames("/Modules/Blueprint") validModules = moduleNameInfo[0] validModuleNames = moduleNameInfo[1] moduleName = module.partition("__")[0] if not moduleName in validModuleNames: return False index = validModuleNames.index(moduleName) mod = __import__("Blueprint." + validModules[index], {}, {}, validModules[index]) reload(mod) moduleClass = getattr(mod, mod.CLASS_NAME) moduleInst = moduleClass("null", None) return moduleInst.canModuleBeMirrored()
def deleteSelectedModule(self, *args): selectedModule = cmds.textScrollList(self.UIElements["animationModule_textScroll"], q=True, selectItem=True)[0] selectedModuleNamespace = self.selectedBlueprintModule + ":" + selectedModule moduleNameInfo = utils.findAllModuleNames("/Modules/Animation") modules = moduleNameInfo[0] moduleNames = moduleNameInfo[1] selectedModuleName = selectedModule.rpartition("_")[0] if selectedModuleName in moduleNames: moduleIndex = moduleNames.index(selectedModuleName) module = modules[moduleIndex] mod = __import__("Animation."+module, {}, {}, [module]) reload(mod) moduleClass = getattr(mod, mod.CLASS_NAME) moduleInst = moduleClass(selectedModuleNamespace) moduleInst.uninstall() self.refreshAnimationModuleList()
def mirrorModules(self): # Make a progress bar to inform the user how long the mirror process is taking. mirrorModulesProgress_UI = cmds.progressWindow( title="Mirror Module(s)", status="This may take a few minutes...", isInterruptable=False) mirrorModulesProgress = 0 mirrorModulesProgress_stage1_proportion = 15 mirrorModulesProgress_stage2_proportion = 70 mirrorModulesProgress_stage3_proportion = 10 moduleNameInfo = utils.findAllModuleNames("/Modules/Blueprint") validModules = moduleNameInfo[0] validModuleNames = moduleNameInfo[1] for module in self.moduleInfo: moduleName = module[0].partition("__")[0] if moduleName in validModuleNames: index = validModuleNames.index(moduleName) module.append(validModules[index]) #077 mirrorModulesProgress_progressIncrement = mirrorModulesProgress_stage1_proportion / len( self.moduleInfo) for module in self.moduleInfo: userSpecifiedName = module[0].partition("__")[2] mod = __import__("Blueprint." + module[5], {}, {}, [module[5]]) reload(mod) moduleClass = getattr(mod, mod.CLASS_NAME) moduleInst = moduleClass(userSpecifiedName, None) hookObject = moduleInst.findHookObject() newHookObject = None hookModule = utils.stripLeadingNamespace(hookObject)[0] hookFound = False for m in self.moduleInfo: if hookModule == m[0]: hookFound = True if m == module: continue hookObjectName = utils.stripLeadingNamespace(hookObject)[1] newHookObject = m[1] + ":" + hookObjectName if not hookFound: newHookObject = hookObject module.append(newHookObject) hookConstrained = moduleInst.isRootConstrained() module.append(hookConstrained) mirrorModulesProgress += mirrorModulesProgress_progressIncrement cmds.progressWindow(mirrorModulesProgress_UI, edit=True, pr=mirrorModulesProgress) #078 mirrorModulesProgress_progressIncrement = mirrorModulesProgress_stage2_proportion / len( self.moduleInfo) for module in self.moduleInfo: newUserSpecifiedName = module[1].partition("__")[2] mod = __import__("Blueprint." + module[5], {}, {}, [module[5]]) reload(mod) # Create all the modules the re-hook moduleClass = getattr(mod, mod.CLASS_NAME) moduleInst = moduleClass(newUserSpecifiedName, None) moduleInst.mirror(module[0], module[2], module[3], module[4]) mirrorModulesProgress += mirrorModulesProgress_progressIncrement cmds.progressWindow(mirrorModulesProgress_UI, edit=True, pr=mirrorModulesProgress) # 083 # Mirror hooking mirrorModulesProgress_progressIncrement = mirrorModulesProgress_stage3_proportion / len( self.moduleInfo) for module in self.moduleInfo: newUserSpecifiedName = module[1].partition("__")[2] mod = __import__("Blueprint." + module[5], {}, {}, [module[5]]) reload(mod) moduleClass = getattr(mod, mod.CLASS_NAME) moduleInst = moduleClass(newUserSpecifiedName, None) moduleInst.rehook(module[6]) hookConstrained = module[7] if hookConstrained: moduleInst.constrainRootToHook() mirrorModulesProgress += mirrorModulesProgress_progressIncrement cmds.progressWindow(mirrorModulesProgress_UI, edit=True, pr=mirrorModulesProgress) #084 # Mirror Groups if self.group != None: cmds.lockNode("Group_container", lock=False, lockUnpublished=False) groupParent = cmds.listRelatives(self.group, parent=True) if groupParent != None: groupParent = groupParent[0] # Recursive method self.processGroup(self.group, groupParent) cmds.lockNode("Group_container", lock=True, lockUnpublished=True) cmds.select(clear=True) cmds.progressWindow(mirrorModulesProgress_UI, edit=True, endProgress=True) utils.forceSceneUpdate()
def modifySelected(self,*args): if cmds.checkBox(self.UIElements['symmetryMoveCheckBox'],q=True,value=True): self.deleteSymmetryMoveExpressions() self.setupSymmetryMoveExpressions() #video 45 selectedNodes = cmds.ls(selection=True) if len(selectedNodes) <= 1: self.moduleInstance = None selectedModuleNamespace = None currentModuleFile = None cmds.button(self.UIElements['ungroupBtn'], edit=True, enable=False) cmds.button(self.UIElements['mirrorModuleBtn'], edit=True, enable=False) if len(selectedNodes) == 1: lastSelected = selectedNodes[0] if lastSelected.find('Group__') == 0: cmds.button(self.UIElements['ungroupBtn'], edit=True, enable=True) cmds.button(self.UIElements['mirrorModuleBtn'], edit=True, enable=True, label='Mirror Group') namespaceAndNode = utils.stripLeadingNamespace(lastSelected) if namespaceAndNode != None: namespace = namespaceAndNode[0] moduleNameInfo = utils.findAllModuleNames('/Modules/Blueprint') validModules = moduleNameInfo[0] validModuleNames = moduleNameInfo[1] index = 0 for moduleName in validModuleNames: moduleNameIncSuffix = moduleName + '__' if namespace.find(moduleNameIncSuffix) == 0: currentModuleFile = validModules[index] selectedModuleNamespace = namespace break index += 1 controlEnable = False userSpecifiedName = '' constrainCommand = self.constrainRootToHook constrainLabel = 'Constrain Root> Hook' if selectedModuleNamespace != None: controlEnable = True userSpecifiedName = selectedModuleNamespace.partition('__')[2] mod = __import__('Blueprint.' + currentModuleFile, {},{},[currentModuleFile]) reload(mod) moduleClass = getattr(mod,mod.CLASS_NAME) self.moduleInstance = moduleClass(userSpecifiedName, None) cmds.button(self.UIElements['mirrorModuleBtn'], edit=True, enable=True, label='Mirror Module') if self.moduleInstance.isRootConstrained(): constrainCommand = self.unconstrainRootFromHook constrainLabel = 'Unconstrain Root' cmds.button(self.UIElements['rehookBtn'],edit=True, enable=controlEnable) cmds.button(self.UIElements['snapRootBtn'],edit=True, enable=controlEnable) cmds.button(self.UIElements['constrainRootBtn'],edit=True, enable=controlEnable, label=constrainLabel, c=constrainCommand) cmds.button(self.UIElements['deleteModuleBtn'],edit=True, enable=controlEnable, c=self.deleteModule) cmds.textField(self.UIElements['moduleName'],edit=True, enable=controlEnable, text=userSpecifiedName) self.createModuleSpecificControls() self.createScriptJob()
def lock(self, *args): if not self.isRootTransformInstalled(): result = cmds.confirmDialog(messageAlign='center', title='Lock Character',message='we have detected that you dont have a root transform(global control) instance. \n would you like to go back and edit your blueprint setup?\n (it is recommanded that all rigs have at least one global control module).',button=['Yes','No'],defaultButton='Yes',dismissString='Yes') if result == 'Yes': return result = cmds.confirmDialog(messageAlign='center', title='Lock Blueprints',message='The action of locking a character will convert the current blueprint module to joints. \nThis action can not be undone. \nModification to the blueprint system can not be made after this point. \n Do you want to continue?', button=['Accept','Cancel'] ,defaultButton='Accept',cancelButton='Cancel', dismissString='Cancel') if result != 'Accept': return self.deleteSymmetryMoveExpressions() cmds.checkBox(self.UIElements['symmetryMoveCheckBox'], edit=True, value=False) self.deleteScriptJob() moduleInfo = [] #store(module,userSpecifiedName) pairs cmds.namespace(setNamespace=':') namespaces = cmds.namespaceInfo(listOnlyNamespaces=True) moduleNameInfo = utils.findAllModuleNames('/Modules/Blueprint') validModules = moduleNameInfo[0] validModuleNames = moduleNameInfo[1] for n in namespaces: splitString = n.partition('__') if splitString[1] != '': module = splitString[0] userSpecifiedName = splitString[2] if module in validModuleNames: index = validModuleNames.index(module) moduleInfo.append([validModules[index], userSpecifiedName]) if len(moduleInfo) == 0: cmds.confirmDialog(messageAlign='center', title='Lock Blueprints', message='There appear to be no blueprint module \ninstances in the current scene. \nAborting lock.',button=['Accept'],defaultButton='Accept') return moduleInstances =[] for module in moduleInfo: mod=__import__('Blueprint.'+module[0],{},{},[module[0]]) reload(mod) moduleClass = getattr(mod, mod.CLASS_NAME) moduleInst = moduleClass(module[1], None) moduleInfo = moduleInst.lock_phase1() moduleInstances.append((moduleInst,moduleInfo)) for module in moduleInstances: module[0].lock_phase2(module[1]) groupContainer = 'Group_container' if cmds.objExists(groupContainer): cmds.lockNode(groupContainer, lock=False, lockUnpublished=False) cmds.delete(groupContainer) for module in moduleInstances: hookObject = module[1][4] module[0].lock_phase3(hookObject) sceneLockedlocator = cmds.spaceLocator(n='Scene_Locked')[0] cmds.setAttr(sceneLockedlocator+'.visibility',0) cmds.lockNode(sceneLockedlocator,lock=True, lockUnpublished=True) cmds.select(clear=True) self.modifySelected() cmds.tabLayout(self.UIElements['tabs'], edit=True, enable=False) cmds.button(self.UIElements['lockBtn'], edit=True, enable=False) cmds.button(self.UIElements['publishBtn'], edit=True, enable=True)
def publish(self,*args): result = cmds.confirmDialog(messageAlign='center', title='Publish Character', message='The action of publishing cannot be undone. Are you sure you wish to continue?',button=['Accept','Cancel'], defaultButton='Accept',cancelButton='Cancel',dismissString='Cancel') if result != 'Accept': return result = cmds.promptDialog(title='Publish Character',message='Please specify a character name ([a-z][A-Z][0-9] and _ only):',button=['Accept','Cancel'],defaultButton='Accept',cancelButton='Cancel',dismissString='Cancel') if result == 'Accept': characterName = cmds.promptDialog(q=True, text=True) characterFileName = os.environ['RIGGING_TOOL_ROOT'] + '/Characters/' + characterName + '.ma' if os.path.exists(characterFileName): cmds.confirmDialo(title='Publish Character', message='Character already exists with that name.Aborting publish', button=['Accept'],defaultButton='Accept') return cmds.lockNode('Scene_Locked',lock=False,lockUnpublished=False) cmds.delete('Scene_Locked') cmds.namespace(setNamespace=':') namespaces = cmds.namespaceInfo(listOnlyNamespaces=True) moduleNameInfo = utils.findAllModuleNames('/Modules/Blueprint') validModules = moduleNameInfo[0] validModuleNames = moduleNameInfo[1] foundModuleInstances = [] for n in namespaces: splitString = n.partition('__') if splitString[1] != '': module = splitString[0] if module in validModuleNames: foundModuleInstances.append(n) moduleGroups = [] moduleContainers = [] for moduleInstance in foundModuleInstances: moduleGroups.append(moduleInstance + ':module_grp') moduleContainers.append(moduleInstance + ':module_container') for container in moduleContainers: cmds.lockNode(container,lock=False,lockUnpublished=False) characterGroup = cmds.group(empty=True, name='character_grp') for group in moduleGroups: cmds.parent(group,characterGroup, absolute=True) cmds.select(characterGroup, replace=True) cmds.addAttr(at='bool', defaultValue=0,keyable=False,longName='moduleMaintenanceVisibility') cmds.addAttr(at='bool', defaultValue=1,keyable=True,longName='animationControlVisibility') invertModuleMaintenanceVisibility = cmds.shadingNode('reverse',n='reverse_moduleMaintenanceVisibility',asUtility=True) cmds.connectAttr(characterGroup+'.moduleMaintenanceVisibility',invertModuleMaintenanceVisibility+'.inputX',force=True) moduleVisibilityMultiply = cmds.shadingNode('multiplyDivide',n='moduleVisibilityMultiply',asUtility=True) cmds.connectAttr(invertModuleMaintenanceVisibility+'.outputX',moduleVisibilityMultiply+'.input1X') cmds.connectAttr(characterGroup+'.animationControlVisibility',moduleVisibilityMultiply+'.input2X') characterNodes = list(moduleContainers) characterNodes.append(characterGroup) characterNodes.append(invertModuleMaintenanceVisibility) characterNodes.append(moduleVisibilityMultiply) characterContainer = cmds.container(name='character_container') utils.addNodeToContainer(characterContainer, characterNodes) cmds.container(characterContainer,edit=True,publishAndBind=[characterGroup+'.animationControlVisibility','animControlVis']) for container in moduleContainers: moduleNamespace = utils.stripLeadingNamespace(container)[0] blueprintJointsGrp = moduleNamespace+':blueprint_joints_grp' cmds.connectAttr(characterGroup+'.moduleMaintenanceVisibility', blueprintJointsGrp+'.visibility') cmds.setAttr(blueprintJointsGrp+'.overrideEnabled',1) publishedNames = cmds.container(container,q=True, publishName=True) userSpecifiedName = moduleNamespace.partition('__')[2] for name in publishedNames: cmds.container(characterContainer,edit=True,publishAndBind=[container+'.'+name, userSpecifiedName+'_'+name]) characterContainers = list(moduleContainers) characterContainers.append(characterContainer) cmds.select(all=True) topLevelTransforms = cmds.ls(sl=True, transforms=True) cmds.select(clear=True) topLevelTransforms.remove(characterGroup) if len(topLevelTransforms) != 0: nonBlueprintGroup = cmds.group(topLevelTransforms, absolute=True, parent=characterGroup,name='non_blueprint_grp') cmds.setAttr(nonBlueprintGroup+'.overrideEnabled',1) cmds.setAttr(nonBlueprintGroup+'.overrideDisplayType',2)#Reference display type cmds.select(nonBlueprintGroup,replace=True) cmds.addAttr(at='bool',defaultValue=1, longName='display',k=True) visibilityMultiply = cmds.shadingNode('multiplyDivide', n='non_blueprint_visibilityMultiply',asUtility=True) cmds.connectAttr(invertModuleMaintenanceVisibility+'.outputX',visibilityMultiply+'.input1X',force=True) cmds.connectAttr(nonBlueprintGroup+'.display',visibilityMultiply+'.input2X',force=True) cmds.connectAttr(visibilityMultiply+'.outputX',nonBlueprintGroup+'.visibility',force=True) nonBlueprintContainer = cmds.container(addNode=nonBlueprintGroup, ihb=True, includeNetwork=True, includeShapes=True, name='non_blueprint_container') utils.addNodeToContainer(characterContainer,nonBlueprintContainer) characterContainers.append(nonBlueprintContainer) publishedName = 'displayNonBlueprintNodes' cmds.container(nonBlueprintContainer, edit=True, publishAndBind=[nonBlueprintGroup+'.display',publishedName]) cmds.container(characterContainer, edit=True, publishAndBind=[nonBlueprintContainer+'.'+publishedName,publishedName]) for container in characterContainers: cmds.lockNode(container, lock=True,lockUnpublished=True) cmds.select(characterContainer) cmds.file(characterFileName,exportSelected=True, type='mayaAscii') scenePublished = cmds.spaceLocator(n='Scene_Published')[0] cmds.setAttr(scenePublished+'.visibility',0) cmds.lockNode(scenePublished,lock=True,lockUnpublished=True) cmds.select(clear=True) cmds.button(self.UIElements['publishBtn'],edit=True,enable=False)
def delete(self): cmds.lockNode(self.containerName, lock=False, lockUnpublished=False) validModuleInfo = utils.findAllModuleNames('/Modules/Blueprint') validModules = validModuleInfo[0] validModuleNames = validModuleInfo[1] hookedModules= set() for jointInf in self.jointInfo: joint = jointInf[0] translationControl = self.getTranslationControl(self.moduleNamespace + ':' + joint) connections = cmds.listConnections(translationControl) for connection in connections: moduleInstance = utils.stripLeadingNamespace(connection) if moduleInstance != None: splitString = moduleInstance[0].partition('__') if moduleInstance[0] != self.moduleNamespace and splitString[0] in validModuleNames: index = validModuleNames.index(splitString[0]) hookedModules.add((validModules[index],splitString[2])) for module in hookedModules: mod = __import__('Blueprint.' + module[0], {},{},[module[0]]) moduleClass = getattr(mod, mod.CLASS_NAME) moduleInst = moduleClass(module[1],None) moduleInst.rehook(None) if cmds.attributeQuery('mirrorLinks', node=self.moduleNamespace + ':module_grp', exists=True): mirrorLinks = cmds.getAttr(self.moduleNamespace + ':module_grp.mirrorLinks') linkedBlueprint = mirrorLinks.rpartition('__')[0] cmds.lockNode(linkedBlueprint + ':module_container',lock=False, lockUnpublished=False) cmds.deleteAttr(linkedBlueprint + ':module_grp.mirrorLinks') cmds.lockNode(linkedBlueprint + ':module_container',lock=True, lockUnpublished=True) moduleTransform = (self.moduleNamespace + ':module_transform') moduleTransformParent = cmds.listRelatives(moduleTransform, parent=True) cmds.delete(self.containerName) cmds.namespace(setNamespace = ':') cmds.namespace(removeNamespace = self.moduleNamespace) if moduleTransformParent != None: parentGroup = moduleTransformParent[0] children = cmds.listRelatives(parentGroup, children=True) children = cmds.ls(children,transforms=True) if len(children) == 0: cmds.select(parentGroup, replace=True) import System.groupSelected as groupSelected reload(groupSelected) groupSelected.UngroupSelected()
def modifySelected(self, *args): if cmds.checkBox(self.UIElements["symmetryMoveCheckBox"], q=True, value=True): self.deleteSymmetryMoveExpressions() self.setupSymmetryMoveExpressions() selectedNodes = cmds.ls(selection=True) if len(selectedNodes) <= 1: self.moduleInstance = None selectedModuleNamespace = None currentModuleFile = None cmds.button(self.UIElements["ungroupBtn"], edit=True, enable=False) cmds.button(self.UIElements["mirrorModuleBtn"], edit=True, enable=False) if len(selectedNodes) == 1: lastSelected = selectedNodes[0] if lastSelected.find("Group__") == 0: cmds.button(self.UIElements["ungroupBtn"], edit=True, enable=True) cmds.button(self.UIElements["mirrorModuleBtn"], edit=True, enable=True, label="Mirror Group") namespaceAndNode = utils.stripLeadingNamespace(lastSelected) if namespaceAndNode != None: namespace = namespaceAndNode[0] moduleNameInfo = utils.findAllModuleNames("/Modules/Blueprint") validModules = moduleNameInfo[0] validModuleNames = moduleNameInfo[1] index = 0 for moduleName in validModuleNames: moduleNameIncSuffix = moduleName + "__" if namespace.find(moduleNameIncSuffix) == 0: currentModuleFile = validModules[index] selectedModuleNamespace = namespace break index += 1 controlEnable = False userSpecifiedName = "" constrainCommand = self.constrainRootToHook constrainLabel = "Constrain Root > Hook" if selectedModuleNamespace != None: controlEnable = True userSpecifiedName = selectedModuleNamespace.partition("__")[2] mod = __import__("Blueprint."+currentModuleFile, {},{}, [currentModuleFile]) reload(mod) moduleClass = getattr(mod, mod.CLASS_NAME) self.moduleInstance = moduleClass(userSpecifiedName, None) cmds.button(self.UIElements["mirrorModuleBtn"], edit=True, enable=True, label="Mirror Module") if self.moduleInstance.isRootConstrained(): constrainCommand = self.unconstrainRootFromHook constrainLabel = "Unconstrain Root" #cmds.button(self.UIElements["mirrorModuleBtn"], edit=True, enable=controlEnable) cmds.button(self.UIElements["rehookBtn"], edit=True, enable=controlEnable) cmds.button(self.UIElements["snapRootBtn"], edit=True, enable=controlEnable) cmds.button(self.UIElements["constrainRootBtn"], edit=True, enable=controlEnable, label=constrainLabel, c=constrainCommand ) cmds.button(self.UIElements["deleteModuleBtn"], edit=True, enable=controlEnable, c=self.deleteModule) cmds.textField(self.UIElements["moduleName"], edit=True, enable=controlEnable, text=userSpecifiedName) self.createModuleSpecificControls() self.createScriptJob()
def lock(self, *args): if not self.isRootTransformInstalled(): result = cmds.confirmDialog(messageAlign="center", title="Lock Character", message="We have detected that you dont have a root transform (global control) instance.\nWould you like to go back and edit your blueprint setup?\n (It is recommended that all rigs have at least one global control module).", button=["Yes", "No"], defaultButton="Yes", dismissString="Yes") if result == "Yes": return result = cmds.confirmDialog(messageAlign="center", title="Lock Blueprints", message="The action of locking a character will convert the current blueprint modules to joints. \nThis action cannot be undone. \nModifications to the blueprint system cannot be made after this point. \n Do you want to continue?", button=["Accept", "Cancel"], defaultButton="Accept", cancelButton="Cancel", dismissString="Cancel") if result != "Accept": return self.deleteSymmetryMoveExpressions() cmds.checkBox(self.UIElements["symmetryMoveCheckBox"], edit=True, value=False) self.deleteScriptJob() moduleInfo = [] #store [module, userSpecifiedName] pairs cmds.namespace(setNamespace=":") namespaces = cmds.namespaceInfo(listOnlyNamespaces=True) moduleNameInfo = utils.findAllModuleNames("/Modules/Blueprint") validModules = moduleNameInfo[0] validModuleNames = moduleNameInfo[1] for n in namespaces: splitString = n.partition("__") if splitString[1] != "": module = splitString[0] userSpecifiedName = splitString[2] if module in validModuleNames: index = validModuleNames.index(module) moduleInfo.append([validModules[index], userSpecifiedName]) if len(moduleInfo) == 0: cmds.confirmDialog(messageAlign="center", title="Lock Blueprints", message="There appear to be no blueprint module \ninstances in the current scene. \nAborting lock", button=["Accept"], defaultButton="Accept") return moduleInstances = [] for module in moduleInfo: mod = __import__("Blueprint."+module[0], {},{},module[0]) reload(mod) moduleClass = getattr(mod, mod.CLASS_NAME) moduleInst = moduleClass(module[1], None) moduleInfo = moduleInst.lock_phase1() moduleInstances.append((moduleInst, moduleInfo)) for module in moduleInstances: module[0].lock_phase2(module[1]) groupContainer = "Group_container" if cmds.objExists(groupContainer): cmds.lockNode(groupContainer, lock=False, lockUnpublished=False) cmds.delete(groupContainer) for module in moduleInstances: hookObject = module[1][4] module[0].lock_phase3(hookObject) sceneLockedLocator = cmds.spaceLocator(n="Scene_Locked")[0] cmds.setAttr(sceneLockedLocator+".visibility", 0) cmds.lockNode(sceneLockedLocator, lock=True, lockUnpublished=True) cmds.select(clear=True) self.modifySelected() cmds.tabLayout(self.UIElements["tabs"], edit=True, enable=False) cmds.button(self.UIElements["lockBtn"], edit=True, enable=False) cmds.button(self.UIElements["publishBtn"], edit=True, enable=True)
def publish(self, *args): result = cmds.confirmDialog(messageAlign="center", title="Publish Character", message="The action of publishing cannot be undone.\nAre you sure you wish to continue?",button=["Accept","Cancel"], defaultButton="Accept", cancelButton="Cancel", dismissString="Cancel") if result != "Accept": return result = cmds.promptDialog(title="Publish Character", message="Please specify a character name [a-z] [A-Z] and _ only: ", button=["Accept","Cancel"],defaultButton="Accept", cancelButton="Cancel", dismissString="Cancel") if result == "Accept": characterName = cmds.promptDialog(q=True, text=True) characterFileName = os.environ["RIGGING_TOOL_ROOT"]+"/Characters/"+characterName+".ma" if os.path.exists(characterFileName): cmds.confirmDialog(title="Publish Character", message="Character already exists with that name. Aborting Publish.", button=["Accept"], defaultButton="Accept") return cmds.lockNode("Scene_Locked", lock=False, lockUnpublished=False) cmds.delete("Scene_Locked") cmds.namespace(setNamespace=":") namespaces = cmds.namespaceInfo(listOnlyNamespaces=True) moduleNameInfo = utils.findAllModuleNames("/Modules/Blueprint") validModules = moduleNameInfo[0] validModuleNames = moduleNameInfo[1] foundModuleInstances = [] for n in namespaces: splitString = n.partition("__") if splitString[1] != "": module = splitString[0] if module in validModuleNames: foundModuleInstances.append(n) moduleGroups = [] moduleContainers = [] for moduleInstance in foundModuleInstances: moduleGroups.append(moduleInstance+":module_grp") moduleContainers.append(moduleInstance+":module_container") for container in moduleContainers: cmds.lockNode(container, lock=False, lockUnpublished=False) characterGroup = cmds.group(empty=True, name="character_grp") for group in moduleGroups: cmds.parent(group, characterGroup, absolute=True) cmds.select(characterGroup, replace=True) cmds.addAttr(at="bool", defaultValue=0, keyable=False, longName="moduleMaintenanceVisibility") cmds.addAttr(at="bool", defaultValue=1, keyable=True, longName="animationControlVisibility") invertModuleMaintenanceVisibility = cmds.shadingNode("reverse", n="reverse_moduleMaintenanceVisibility", asUtility=True) cmds.connectAttr(characterGroup+".moduleMaintenanceVisibility", invertModuleMaintenanceVisibility+".inputX",force=True) moduleVisibilityMultiply = cmds.shadingNode("multiplyDivide", n="moduleVisibilityMultiply", asUtility=True) cmds.connectAttr(invertModuleMaintenanceVisibility+".outputX", moduleVisibilityMultiply+".input1X") cmds.connectAttr(characterGroup+".animationControlVisibility", moduleVisibilityMultiply+".input2X") characterNodes = list(moduleContainers) characterNodes.append(characterGroup) characterNodes.append(invertModuleMaintenanceVisibility) characterNodes.append(moduleVisibilityMultiply) characterContainer = cmds.container(name="character_container") utils.addNodeToContainer(characterContainer, characterNodes) cmds.container(characterContainer, edit=True, publishAndBind=[characterGroup+".animationControlVisibility", "animControlVis"]) for container in moduleContainers: moduleNamespace = utils.stripLeadingNamespace(container)[0] blueprintJointsGrp = moduleNamespace+":blueprint_joints_grp" cmds.connectAttr(characterGroup+".moduleMaintenanceVisibility", blueprintJointsGrp+".visibility") cmds.setAttr(blueprintJointsGrp+".overrideEnabled", 1) publishedNames = cmds.container(container, q=True, publishName=True) userSpecifiedName = moduleNamespace.partition("__")[2] for name in publishedNames: cmds.container(characterContainer, edit=True, publishAndBind=[container+"."+name, userSpecifiedName+"_"+name]) characterContainers = list(moduleContainers) characterContainers.append(characterContainer) cmds.select(all=True) topLevelTransforms = cmds.ls(sl=True, transforms=True) cmds.select(clear=True) topLevelTransforms.remove(characterGroup) if len(topLevelTransforms) != 0: nonBlueprintGroup = cmds.group(topLevelTransforms, absolute=True, parent=characterGroup, name="non_blueprint_grp") cmds.setAttr(nonBlueprintGroup+".overrideEnabled", 1) cmds.setAttr(nonBlueprintGroup+".overrideDisplayType", 2) #Reference display type cmds.select(nonBlueprintGroup, replace=True) cmds.addAttr(at="bool", defaultValue=1, longName="display", k=True) visibilityMultiply = cmds.shadingNode("multiplyDivide", n="non_blueprint_visibilityMultiply", asUtility=True) cmds.connectAttr(invertModuleMaintenanceVisibility+".outputX", visibilityMultiply+".input1X", force=True) cmds.connectAttr(nonBlueprintGroup+".display", visibilityMultiply+".input2X", force=True) cmds.connectAttr(visibilityMultiply+".outputX", nonBlueprintGroup+".visibility", force=True) nonBlueprintContainer = cmds.container(addNode=nonBlueprintGroup, ihb=True, includeNetwork=True, includeShapes=True, name="non_blueprint_container") utils.addNodeToContainer(characterContainer, nonBlueprintContainer) characterContainers.append(nonBlueprintContainer) publishedName = "displayNonBlueprintNodes" cmds.container(nonBlueprintContainer, edit=True, publishAndBind=[nonBlueprintGroup+".display", publishedName]) cmds.container(characterContainer, edit=True, publishAndBind=[nonBlueprintContainer+"."+publishedName, publishedName]) for container in characterContainers: cmds.lockNode(container, lock=True, lockUnpublished=True) cmds.select(characterContainer) cmds.file(characterFileName, exportSelected=True, type="mayaAscii") scenePublished = cmds.spaceLocator(n="Scene_Published")[0] cmds.setAttr(scenePublished+".visibility", 0) cmds.lockNode(scenePublished, lock=True, lockUnpublished=True) cmds.select(clear=True) cmds.button(self.UIElements["publishBtn"], edit=True, enable=False)