MetaBox/Scripts/Animation/aTools/animTools/animBar/subUIs/specialTools_subUIs/selectSets.py
2025-01-14 03:08:55 +08:00

1008 lines
44 KiB
Python

'''
========================================================================================================================
Author: Alan Camilo
www.alancamilo.com
Modified: Michael Klimenko
Requirements: aTools Package
------------------------------------------------------------------------------------------------------------------------
To install aTools, please follow the instructions in the file how_to_install.txt
------------------------------------------------------------------------------------------------------------------------
To unistall aTools, go to menu (the last button on the right), Uninstall
========================================================================================================================
'''
from maya import cmds
from maya import mel
from maya import OpenMaya
from aTools.generalTools.aToolsGlobals import aToolsGlobals as G
from aTools.commonMods import uiMod
from aTools.commonMods import utilMod
from aTools.commonMods import animMod
from aTools.commonMods import aToolsMod
class SelectSets(object):
def __init__(self):
G.deferredManager.removeFromQueue("SS")
self.toolbar = "aTools_Select_Sets_Bar"
self.allWin = [self.toolbar]
self.barOffset = 0
self.defaultSetName = "aToolsSet_"
self.height = 50
self.buttonHeight = self.height -10
self.defaultColor = "purple"
self.colors = [{"name":"purple", "value":(0.640,0.215,0.995)},
{"name":"red", "value":(1,0.4,0.4)},
{"name":"orange", "value":(1,0.6,0.4)},
{"name":"yellow", "value":(1,0.97,0.4)},
{"name":"green", "value":(0.44,1,0.53)},
{"name":"blue", "value":(0.28,0.6,1)},
{"name":"gray", "value":(0.5,0.5,0.5)}
]
self.createRenameLayoutW = (len(self.colors)+1)*15
self.setToRename = None
self.selSetButtonWidth = {}
G.SS_messages = G.SS_messages or {"anim":[], "node":[], "scene":[]}
G.SS_showColors = G.SS_showColors or [loopColor["name"] for loopColor in self.colors]
G.SS_setsAndNodes = {}
G.SS_lastColorUsed = G.SS_lastColorUsed or self.defaultColor
#G.SS_messages = G.SS_messages or {"node":{}}
self.delWindows() # delete if open
self.saveSelectSetsDict()
self.addSceneMessages()
def popupMenu(self, *args):
cmds.popupMenu()
cmds.menuItem(subMenu=True, label='Show' , tearOff=True, postMenuCommand=self.updateshowColorsMenu)
for loopColor in self.colors:
colorName = loopColor["name"]
cmds.menuItem('colorMenu_%s'%colorName, label=utilMod.toTitle(colorName), checkBox=False, command=lambda x, colorName=colorName, *args: self.switchColor(colorName))
cmds.menuItem( divider=True )
cmds.menuItem(subMenu=True, label="Show Only")
for loopColor in self.colors:
colorName = loopColor["name"]
cmds.menuItem(label=utilMod.toTitle(colorName), command=lambda x, colorName=colorName, *args: self.isolateColor(colorName))
cmds.setParent( '..', menu=True )
cmds.menuItem('colorMenuShowAll', label="Show All Colors", command=self.showAllColors)
cmds.setParent( '..', menu=True )
cmds.menuItem( label="Import Select Sets", command=self.importSets)
cmds.menuItem( label="Export Select Sets", command=self.exportSets)
cmds.menuItem( label="Delete All", command=self.deleteAllSets)
def createWin(self):
self.aToolsSets = self.getaToolsSets()
self.mainWin = cmds.window(sizeable=True)
cmds.frameLayout(labelVisible=False, borderVisible=False, w=10)
cmds.rowLayout(numberOfColumns=2, adjustableColumn=1, columnAttach=([2, 'right', self.barOffset]))
cmds.text(label="")
self.mainLayout = cmds.rowLayout(numberOfColumns=5)
self.limboLayout = cmds.rowLayout(parent=self.mainLayout, w=1)
self.populateSelSetsButtons()
cmds.toolBar(self.toolbar, area='bottom', content=self.mainWin, allowedArea=['bottom'], height=self.height)
self.allWin.extend([self.mainWin, self.mainLayout])
self.highlightSelectedButtons()
G.deferredManager.sendToQueue(self.toggleSelSetsButtonColor, 1, "SS")
G.deferredManager.sendToQueue(self.adjustButtonsWidth, 1, "SS")
self.addScriptJobs()
def refreshToolBar(self, *args):
if not cmds.toolBar(self.toolbar, query=True, exists=True): return
self.saveSelectSetsDict()
G.deferredManager.sendToQueue(self.delWindows, 1, "SS")
if cmds.toolBar(self.toolbar, query=True, visible=True): G.deferredManager.sendToQueue(self.createWin, 1, "SS")
def toggleToolbar(self, forceOff=None):
visible = True
if cmds.toolBar(self.toolbar, query=True, exists=True):
visible = (False if forceOff else not cmds.toolBar(self.toolbar, query=True, visible=True))
cmds.toolBar(self.toolbar, edit=True, visible=visible)
if visible: self.adjustButtonsWidth()
else:
self.createWin()
if visible and len(self.aToolsSets) == 0: self.turnOnCreateNewSetField()
if cmds.iconTextButton("selectSetsBtn", query=True, exists=True):
if visible: cmds.iconTextButton("selectSetsBtn", edit=True, image=uiMod.getImagePath("specialTools_select_sets_active"), highlightImage= uiMod.getImagePath("specialTools_select_sets_active"))
else: cmds.iconTextButton("selectSetsBtn", edit=True, image=uiMod.getImagePath("specialTools_select_sets"), highlightImage= uiMod.getImagePath("specialTools_select_sets copy"))
def saveSelectSetsDict(self):
self.aToolsSets = self.getaToolsSets()
self.aToolsSetsDict = {}
for loopSet in self.aToolsSets: self.aToolsSetsDict[loopSet] = cmds.sets(loopSet, query=True, nodesOnly=True)
def beforeSave(self, *args):
self.rebuildAllSelectSets()
def rebuildAllSelectSets(self, selSetsSel=[]):
selSetsSel.extend(self.getSelectedSets())
for loopSet in list(self.aToolsSetsDict.keys()):
newSelSet = self.createSelSetIfInexistent(loopSet, self.aToolsSetsDict[loopSet])
if not newSelSet: continue
self.aToolsSetsDict[newSelSet] = self.aToolsSetsDict[loopSet]
existentNodes = sorted([loopNode for loopNode in self.aToolsSetsDict[loopSet] if cmds.objExists(loopNode)])
if newSelSet != loopSet: self.aToolsSetsDict.pop(loopSet, None)
cmds.sets(existentNodes, edit=True, addElement=newSelSet)
selSetsSel = [loopSel for loopSel in selSetsSel if cmds.objExists(loopSel)]
#if len(selSetsSel) > 0: cmds.select(selSetsSel)#NEED FIX
self.highlightSelectedButtons()
def createSelSetIfInexistent(self, selSet, nodes):
if not cmds.objExists(selSet):
existentNodes = [loopNode for loopNode in nodes if cmds.objExists(loopNode)]
if len(existentNodes) > 0: return cmds.sets(existentNodes, name=selSet, text="gCharacterSet")
else: return
return selSet
def checkIfElementsDeleted(self, selSet):
#print "checkIfElementsDeleted"
if selSet not in self.aToolsSetsDict: return
selSetContents = cmds.sets(selSet, query=True, nodesOnly=True)
dictContents = self.aToolsSetsDict[selSet]
#print "selSetContents != dictContents" , (selSetContents != dictContents)
if selSetContents != dictContents: self.rebuildAllSelectSets()
def addScriptJobs(self):
self.clearScriptJobs()
#G.selectSetsScriptJobs.append(cmds.scriptJob(runOnce = True, killWithScene = False, event =('PostSceneRead', self.refreshToolBar )))
G.selectSetsScriptJobs.append(cmds.scriptJob(runOnce = True, killWithScene = False, event =('NewSceneOpened', self.refreshToolBar )))
G.selectSetsScriptJobs.append(cmds.scriptJob(runOnce = False, killWithScene = False, event =('SelectionChanged', self.highlightSelectedButtons )))
def addSceneMessages(self):
self.removeMessages()
#SCENE MESSAGES
G.SS_messages["scene"].append(OpenMaya.MSceneMessage.addCallback( OpenMaya.MSceneMessage.kBeforeSave, self.beforeSave))
#G.SS_messages["scene"].append(OpenMaya.MSceneMessage.addCallback( OpenMaya.MSceneMessage.kAfterSave, self.afterSave))
G.SS_messages["scene"].append(OpenMaya.MSceneMessage.addCallback( OpenMaya.MSceneMessage.kAfterOpen, self.refreshToolBar))
def removeMessages(self):
try:
for loopId in G.SS_messages["scene"]:
OpenMaya.MSceneMessage.removeCallback(loopId)
except: pass
G.SS_messages["scene"] = []
def populateSelSetsButtons(self):
# + button
self.plusBtn = cmds.iconTextButton(style='iconAndTextVertical', h=25, w=25,
image=uiMod.getImagePath("specialTools_select_sets_+"),
highlightImage=uiMod.getImagePath("specialTools_select_sets_+ copy"),
command=self.turnOnCreateNewSetField,
annotation="Create new select set",
parent=self.mainLayout
)
self.selSetsLayout = cmds.rowLayout(numberOfColumns=200, parent=self.mainLayout)
# create UI
fieldUI = self.createTextField("create", self.createNewSelectSet, self.turnOffCreateNewSetField)
self.createNewSetLayout = fieldUI["mainLayout"]
self.createNewSetTextField = fieldUI["textField"]
#rename UI
fieldUI = self.createTextField("rename", self.renameSelectSet, self.turnOffRenameSetField)
self.renameSetLayout = fieldUI["mainLayout"]
self.renameSetTextField = fieldUI["textField"]
#sel sets buttons
for loopSet in self.aToolsSets: self.createSelSetButton(loopSet)
# Show All Button
self.showAllColorsButton = cmds.iconTextButton(style='iconOnly', h=25, w=1,
image=uiMod.getImagePath("specialTools_select_sets_show_all"),
highlightImage=uiMod.getImagePath("specialTools_select_sets_show_all copy"),
command=self.showAllColors, annotation="Show all colors",
parent=self.mainLayout,
visible=False
)
# X button
cmds.iconTextButton(style='iconOnly', h=25, w=25,
image=uiMod.getImagePath("specialTools_x"),
highlightImage=uiMod.getImagePath("specialTools_x copy"),
command=self.toggleToolbar, annotation="Hide toolbar",
parent=self.mainLayout
)
def createTextField(self, createRename, enterCommand, offCommand):
mainLayout = cmds.columnLayout(w=1, columnWidth=self.createRenameLayoutW,
parent=self.selSetsLayout,
visible=False
)
fistRowLayout = cmds.rowLayout(numberOfColumns=3, parent=mainLayout)
textField = cmds.textField(height=20, width=self.createRenameLayoutW-21,
alwaysInvokeEnterCommandOnReturn=True,
parent=fistRowLayout,
enterCommand=enterCommand
)
# X button text field
cmds.iconTextButton(style='iconOnly', h=18, w=18,
image=uiMod.getImagePath("specialTools_x"),
highlightImage=uiMod.getImagePath("specialTools_x copy"),
command=offCommand, annotation="Cancel",
parent=fistRowLayout
)
cmds.rowLayout(numberOfColumns=len(self.colors)+1, parent=mainLayout)
for loopColor in self.colors:
colorName = loopColor["name"]
colorValue = loopColor["value"]
cmds.iconTextButton("colorButton%s%s"%(createRename, colorName),
style='iconOnly',
bgc=colorValue,
height=15, width=15,
command=lambda colorName=colorName, *args: enterCommand(colorName=colorName)
)
return {"mainLayout":mainLayout, "textField":textField}
def guessNewSetName(self):
return ""
def turnOnCreateNewSetField(self):
cmds.iconTextButton (self.plusBtn, edit=True, visible=False, w=1)
cmds.columnLayout(self.createNewSetLayout, edit=True, visible=True, w=self.createRenameLayoutW)
self.turnOffRenameSetField()
cmds.textField(self.createNewSetTextField, edit=True, text=self.guessNewSetName())
self.highlightColorSelection()
cmds.setFocus(self.createNewSetTextField)
self.adjustButtonsWidth()
def turnOffCreateNewSetField(self):
if not cmds.columnLayout(self.createNewSetLayout, query=True, visible=True): return
cmds.iconTextButton (self.plusBtn, edit=True, visible=True, w=25)
cmds.columnLayout(self.createNewSetLayout, edit=True, visible=False, w=1)
viewports = [view for view in cmds.getPanel(type='modelPanel') if view in cmds.getPanel(visiblePanels=True)]
if len(viewports) > 0: cmds.setFocus(viewports[0])
self.adjustButtonsWidth()
def turnOnRenameSetField(self, renameSet):
extracted = self.extractInfoFromSelSet(renameSet)
selSetName = extracted["selSetName"]
colorName = extracted["colorName"]
G.SS_lastColorUsed = colorName
self.setToRename = renameSet
cmds.columnLayout(self.renameSetLayout, edit=True, visible=True, w=self.createRenameLayoutW)
self.turnOffCreateNewSetField()
cmds.textField(self.renameSetTextField, edit=True, text=selSetName)
self.sortSelSetButtons(renameSet=renameSet)
cmds.setFocus(self.renameSetTextField)
self.adjustButtonsWidth()
self.highlightColorSelection()
def turnOffRenameSetField(self):
if not cmds.columnLayout(self.renameSetLayout, query=True, visible=True): return
self.sortSelSetButtons()
viewports = [view for view in cmds.getPanel(type='modelPanel') if view in cmds.getPanel(visiblePanels=True)]
self.setToRename = None
cmds.columnLayout (self.renameSetLayout, edit=True, visible=False, w=1)
if len(viewports) > 0: cmds.setFocus(viewports[0])
self.adjustButtonsWidth()
def createNewSelectSet(self, setName=None, colorName=None):
if colorName:
G.SS_lastColorUsed = colorName
setName = cmds.textField(self.createNewSetTextField, query=True, text=True)
self.highlightColorSelection()
tmpSetName = setName.replace(" ", "")
if tmpSetName == "": return
sel = cmds.ls(selection=True)
if len(sel) == 0:
cmds.warning("Please select some objects.")
return
if not self.testRepeated(sel):
newSelSetName = "%s%s_%s"%(self.defaultSetName, G.SS_lastColorUsed, utilMod.toTitle(setName))
with G.aToolsBar.createAToolsNode: newSelSet = cmds.sets(sel, name=newSelSetName, text="gCharacterSet")
self.showColor(G.SS_lastColorUsed)
self.turnOffCreateNewSetField()
self.aToolsSets.append(newSelSet)
self.aToolsSets = sorted(self.aToolsSets)
self.createSelSetButton(newSelSet)
self.aToolsSetsDict[newSelSet] = sel
self.sortSelSetButtons(newSelSet)
self.blinkButton(newSelSet, 3)
self.highlightSelectedButtons(newSelSet)
def renameSelectSet(self, setName=None, colorName=None):
if not cmds.objExists(self.setToRename):
self.deleteSets([self.setToRename])
self.turnOffRenameSetField()
return
if colorName:
G.SS_lastColorUsed = colorName
if not setName:
setName = cmds.textField(self.renameSetTextField, query=True, text=True)
self.highlightColorSelection()
tmpSetName = setName.replace(" ", "")
if tmpSetName == "": self.turnOffRenameSetField(); return
newSelSetName = "%s%s_%s"%(self.defaultSetName, G.SS_lastColorUsed, setName)
if self.setToRename == newSelSetName: self.turnOffRenameSetField(); return
renamedSet = cmds.rename(self.setToRename, newSelSetName)
b = 'aToolsSetBtn_%s'%self.setToRename
if cmds.iconTextButton(b, query=True, exists=True):
function = lambda *args:cmds.deleteUI(b, control=True)
G.deferredManager.sendToQueue(function, 1, "SS")
self.showColor(colorName)
self.aToolsSets.remove(self.setToRename)
self.aToolsSets.append(renamedSet)
self.aToolsSets = sorted(self.aToolsSets)
self.aToolsSetsDict.pop(self.setToRename, None)
self.aToolsSetsDict[renamedSet] = cmds.sets(renamedSet, query=True, nodesOnly=True)
self.createSelSetButton(renamedSet)
self.sortSelSetButtons(renamedSet)
self.blinkButton(renamedSet, 3)
self.highlightSelectedButtons(renamedSet)
self.turnOffRenameSetField()
def highlightColorSelection(self):
fields = ["create", "rename"]
for loopColor in self.colors:
loopColorName = loopColor["name"]
if loopColorName == G.SS_lastColorUsed:
for loopField in fields: cmds.iconTextButton("colorButton%s%s"%(loopField, loopColorName), edit=True, image=uiMod.getImagePath('specialTools_gray_dot_c'), style='iconOnly')
else:
for loopField in fields: cmds.iconTextButton("colorButton%s%s"%(loopField, loopColorName), edit=True, style='textOnly')
def createSelSetButton(self, selSet):
extracted = self.extractInfoFromSelSet(selSet)
selSetName = extracted["selSetName"]
colorName = extracted["colorName"]
colorValue = extracted["colorValue"]
cmds.iconTextButton('aToolsSetBtn_%s'%selSet,
label=' %s '%selSetName,
image=uiMod.getImagePath('specialTools_select_sets_img'),
highlightImage=uiMod.getImagePath('specialTools_select_sets_highlight_img'),
height=self.buttonHeight,
bgc=colorValue,
command=lambda selSet=selSet, *args: self.selectSet(selSet),
dragCallback=lambda *args: self.turnOnRenameSetField(selSet),
ann='%s\n\nLeft click: select\nShift+click: add selection\nCtrl+click: subtract selection\nMiddle click: rename set\nCtrl+Shift+click: delete set\n\nRight click for options'%selSetName,
parent=self.selSetsLayout
)
self.selSetButtonPopUp(selSet)
G.deferredManager.sendToQueue(lambda *args: self.saveButtonWidth(selSet), 1, "SS")
G.deferredManager.sendToQueue(self.adjustButtonsWidth, 1, "SS")
def saveButtonWidth(self, selSet):
self.selSetButtonWidth[selSet] = cmds.iconTextButton('aToolsSetBtn_%s'%selSet, query=True, w=True)
def selSetButtonPopUp(self, selSet):
menu = cmds.popupMenu()
cmds.popupMenu(menu, edit=True, postMenuCommand=lambda *args: self.populateSelSetButtonsMenu(menu, selSet), postMenuCommandOnce=True)
def populateSelSetButtonsMenu(self, menu, selSet, *args):
extracted = self.extractInfoFromSelSet(selSet)
colorName = extracted["colorName"]
cmds.radioMenuItemCollection(parent=menu)
for loopColor in self.colors:
loopColorName = loopColor["name"]
radioSelected = (colorName == loopColorName)
cmds.menuItem(label=utilMod.toTitle(loopColorName), radioButton=radioSelected, command=lambda x, selSet=selSet, loopColorName=loopColorName, *args: self.renameSelectSetColor([selSet], loopColorName), parent=menu)
cmds.menuItem(divider=True, parent=menu)
cmds.menuItem(label='Add Selection', command=lambda *args: self.addSelection(selSet), parent=menu)
cmds.menuItem(label='Remove Selection', command=lambda *args: self.removeSelection(selSet), parent=menu)
cmds.menuItem(label='Update Selection', command=lambda *args: self.updateSelection(selSet), parent=menu)
cmds.menuItem(divider=True, parent=menu)
cmds.menuItem(label='Rename', command=lambda *args: self.turnOnRenameSetField(selSet), parent=menu)
cmds.menuItem(label='Delete', command=lambda *args: self.deleteSets([selSet]), parent=menu)
cmds.menuItem(label='Delete All %s'%utilMod.toTitle(colorName), command=lambda *args: self.deleteAllColorSet(colorName), parent=menu)
cmds.menuItem(divider=True, parent=menu)
duplicateToOtherMenu = cmds.menuItem(subMenu=True, label='Duplicate To Other Character', parent=menu, postMenuCommandOnce=True)
cmds.menuItem(duplicateToOtherMenu, edit=True, postMenuCommand=lambda *args:self.populateDuplicateToOtherMenu(duplicateToOtherMenu, selSet))
cmds.setParent( '..', menu=True )
cmds.menuItem(label='Show Only %s'%utilMod.toTitle(colorName), command=lambda *args: self.isolateColor(colorName), parent=menu)
cmds.menuItem(label='Hide %s'%utilMod.toTitle(colorName), command=lambda *args: self.hideColor(colorName), parent=menu)
def sortSelSetButtons(self, fromSelSet=None, renameSet=None):
if not fromSelSet: index = 0
else: index = self.aToolsSets.index(fromSelSet)
cmds.columnLayout(self.renameSetLayout, edit=True, parent=self.limboLayout)
for loopSet in self.aToolsSets[index:]:
extracted = self.extractInfoFromSelSet(loopSet)
colorName = extracted["colorName"]
if colorName not in G.SS_showColors:
cmds.iconTextButton('aToolsSetBtn_%s'%loopSet, edit=True, parent=self.limboLayout, visible=False)
continue
if loopSet == renameSet:
cmds.columnLayout(self.renameSetLayout, edit=True, parent=self.selSetsLayout)
cmds.iconTextButton('aToolsSetBtn_%s'%loopSet, edit=True, visible=False, w=1)
continue
cmds.iconTextButton('aToolsSetBtn_%s'%loopSet, edit=True, parent=self.limboLayout)
cmds.iconTextButton('aToolsSetBtn_%s'%loopSet, edit=True, parent=self.selSetsLayout, visible=True)
if loopSet in self.selSetButtonWidth: cmds.iconTextButton('aToolsSetBtn_%s'%loopSet, edit=True, w=self.selSetButtonWidth[loopSet])
def adjustButtonsWidth(self):
buttonSets = [loopSet for loopSet in self.aToolsSets if not self.isHidden(loopSet)]
self.resetButtonsWidth(buttonSets)
function = lambda *args:self.stretchButtonsWidth(buttonSets)
G.deferredManager.sendToQueue(function, 1, "SS")
def resetButtonsWidth(self, buttonSets):
for n, loopSet in enumerate(buttonSets):
if loopSet in self.selSetButtonWidth: cmds.iconTextButton('aToolsSetBtn_%s'%loopSet, edit=True, w=self.selSetButtonWidth[loopSet])
def stretchButtonsWidth(self, buttonSets):
if not cmds.window(self.mainWin, query=True, exists=True): return
mayaWinSize = cmds.window(self.mainWin, query=True, width=True)
buttonsLayoutSize = cmds.rowLayout(self.mainLayout, query=True, width=True)
if buttonsLayoutSize < mayaWinSize: return
diference = buttonsLayoutSize - mayaWinSize
sizeChart = [cmds.iconTextButton('aToolsSetBtn_%s'%loopSet, query=True, w=True) for loopSet in buttonSets]
x = 0
while True:
for n, loopSet in enumerate(buttonSets):
x += 1
if x > diference: break
if max(sizeChart) == 1:
x = diference +1
break
sizeChart[sizeChart.index(max(sizeChart))] = max(sizeChart) -1
if x > diference: break
for n, loopSet in enumerate(buttonSets):
cmds.iconTextButton('aToolsSetBtn_%s'%loopSet, edit=True, w=sizeChart[n])
def testRepeated(self, sel, warn=True):
for loopSet in self.aToolsSets:
if not cmds.objExists(loopSet): continue
if cmds.sets(sel, isMember=loopSet) and len(sel) == cmds.sets(loopSet, query=True, size=True):
color = self.extractInfoFromSelSet(loopSet)["colorName"]
if warn: cmds.warning("The selection is already a set: (%s) %s"%(color, loopSet[len(self.defaultSetName)+len(color)+1:]))
return True
def extractInfoFromSelSet(self, selSet):
selSetSplit = selSet[len(self.defaultSetName):].split("_")
selSetName = "_".join(selSetSplit[1:])
colorName = selSetSplit[0]
colorValue = None
for loopColor in self.colors:
loopColorName = loopColor["name"]
if colorName == loopColorName:
colorValue = loopColor["value"]
break
if not colorValue: return
return {"selSetName":selSetName, "colorName":colorName, "colorValue":colorValue, "selSet":selSet}
def getaToolsSets(self):
allSelSets = [loopSet for loopSet in cmds.ls(sets=True, exactType="objectSet") if cmds.sets(loopSet, query=True, text=True) == "gCharacterSet"]
aToolsSets = []
for loopSet in allSelSets:
if self.defaultSetName in loopSet:
if cmds.objExists(loopSet):
extracted = self.extractInfoFromSelSet(loopSet)
if not extracted: continue
selSetName = extracted["selSetName"]
colorName = extracted["colorName"]
colorValue = extracted["colorValue"]
selSet = extracted["selSet"]
for loopColor in self.colors:
loopColorName = loopColor["name"]
if self.defaultSetName in loopSet and colorName == loopColorName and cmds.sets(loopSet, query=True, text=True) == "gCharacterSet":
aToolsSets.append(loopSet)
continue
return aToolsSets
def delWindows(self):
if cmds.iconTextButton("selectSetsBtn", query=True, exists=True):
cmds.iconTextButton("selectSetsBtn", edit=True, image=uiMod.getImagePath("specialTools_select_sets"), highlightImage= uiMod.getImagePath("specialTools_select_sets copy"))
for loopWin in self.allWin:
if cmds.rowLayout(loopWin, query=True, exists=True): cmds.deleteUI(loopWin)
if cmds.window(loopWin, query=True, exists=True): cmds.deleteUI(loopWin)
if cmds.toolBar(loopWin, query=True, exists=True): cmds.deleteUI(loopWin)
self.clearScriptJobs()
def selectSet(self, selSet):
mod = uiMod.getModKeyPressed()
if not cmds.objExists(selSet):
self.rebuildAllSelectSets([selSet])
if mod == "ctrlShift": self.deleteSets([selSet])
return
if mod == "shift":
cmds.select(selSet, add=True)
elif mod == "ctrl":
cmds.select(selSet, deselect=True)
elif mod == "ctrlShift":
self.deleteSets([selSet])
else:
cmds.select(selSet, replace=True)
function = lambda *args: self.checkIfElementsDeleted(selSet)
G.deferredManager.sendToQueue(function, 1, "SS")
def deleteSets(self, selSets):
toRemove = []
for loopSet in selSets:
if cmds.objExists(loopSet):
cmds.delete(loopSet)
toRemove.append(loopSet)
b = 'aToolsSetBtn_%s'%loopSet
if cmds.iconTextButton(b, query=True, exists=True):
function = lambda b=b, *args:cmds.deleteUI(b, control=True)
G.deferredManager.sendToQueue(function, 1, "SS")
self.aToolsSetsDict.pop(loopSet, None)
for loopSet in toRemove: self.aToolsSets.remove(loopSet)
self.adjustButtonsWidth()
def deleteAllSets(self, *args):
message = "Delete all aTools select sets?"
confirm = cmds.confirmDialog( title='Confirm', message=message, button=['Yes','No'], defaultButton='Yes', cancelButton='No', dismissString='No' )
if confirm != 'Yes': return
self.deleteSets(self.aToolsSets)
self.toggleToolbar(forceOff=True)
def deleteAllColorSet(self, colorName):
message = "Delete all aTool %s sets?"%colorName
confirm = cmds.confirmDialog( title='Confirm', message=message, button=['Yes','No'], defaultButton='Yes', cancelButton='No', dismissString='No' )
if confirm != 'Yes': return
delSets = []
for loopSet in self.aToolsSets:
extracted = self.extractInfoFromSelSet(loopSet)
loopColorName = extracted["colorName"]
if loopColorName == colorName:
delSets.append(loopSet)
self.deleteSets(delSets)
def isHidden(self, selSet):
if not cmds.iconTextButton('aToolsSetBtn_%s'%selSet, query=True, exists=True): return True
if not cmds.iconTextButton('aToolsSetBtn_%s'%selSet, query=True, visible=True): return True
def getSelectedSets(self):
return [loopSet for loopSet in self.aToolsSets if cmds.iconTextButton('aToolsSetBtn_%s'%loopSet, query=True, exists=True) and cmds.iconTextButton('aToolsSetBtn_%s'%loopSet, query=True, style=True) != 'textOnly']
def highlightSelectedButtons(self, onlySelSet=None):
aToolsSets = [onlySelSet] if onlySelSet else self.aToolsSets
CurrSel = sorted(cmds.ls(selection=True))
if len(CurrSel) > 0:
smallDot = uiMod.getImagePath("specialTools_gray_dot_a")
bigDot = uiMod.getImagePath("specialTools_gray_dot_c")
for loopSet in aToolsSets:
if self.isHidden(loopSet): continue
if not cmds.objExists(loopSet): continue
nodes = sorted(cmds.sets(loopSet, query=True, nodesOnly=True))
if nodes == CurrSel:
cmds.iconTextButton('aToolsSetBtn_%s'%loopSet, edit=True, style='iconAndTextVertical', image=bigDot, highlightImage=bigDot)
elif set(CurrSel).issuperset(set(nodes)):
cmds.iconTextButton('aToolsSetBtn_%s'%loopSet, edit=True, style='iconAndTextVertical', image=smallDot, highlightImage=smallDot)
else:
cmds.iconTextButton('aToolsSetBtn_%s'%loopSet, edit=True, style='textOnly')
else:
for loopSet in self.aToolsSets:
if self.isHidden(loopSet): continue
cmds.iconTextButton('aToolsSetBtn_%s'%loopSet, edit=True, style='textOnly')
def togleBlinkButton(self, button, color):
white = cmds.iconTextButton(button, query=True, bgc=True) == [1,1,1]
if white: self.setButtonColor(button, color)
else: self.setButtonColor(button, (1,1,1))
def blinkButton(self, selSet, xTimes):
extracted = self.extractInfoFromSelSet(selSet)
colorValue = extracted["colorValue"]
G.aToolsBar.timeoutInterval.setTimeout((lambda *args: self.togleBlinkButton('aToolsSetBtn_%s'%selSet, colorValue)), sec=.05, xTimes=(xTimes*2))
def setButtonColor(self, button, color, *args):
if cmds.iconTextButton(button, query=True, exists=True): cmds.iconTextButton(button, edit=True, bgc=color)
def clearScriptJobs(self):
utilMod.killScriptJobs("G.selectSetsScriptJobs")
def showAllColors(self, *args):
pass
G.SS_showColors = self.getaToolsColors()[0]
self.updateshowColors(refresh=True)
def importSets(self, *args):
cmds.waitCursor(state=True)
setsData = aToolsMod.loadInfoWithUser("selectSets", "setsData")
self.createSetsFromData(setsData)
cmds.waitCursor(state=False)
def createSetsFromData(self, setsData):
if not setsData: return
newSets = setsData[0]
selArray = setsData[1]
for n, loopSet in enumerate(newSets):
sel = [loopSel for loopSel in selArray[n] if cmds.objExists(loopSel)]
if len(sel) > 0:
if not self.testRepeated(sel):
newSelSet = cmds.sets(sel, name=loopSet, text="gCharacterSet")
self.aToolsSetsDict[newSelSet] = sel
self.rebuildAllSelectSets()
self.refreshToolBar()
def exportSets(self, *args):
cmds.waitCursor(state=True)
#currSel = cmds.ls(selection=True)
self.aToolsSets = self.getaToolsSets()
setsData = self.getSetsData(self.aToolsSets)
aToolsMod.saveInfoWithUser("selectSets", "setsData", setsData)
#if len(currSel) > 0: cmds.select(currSel)
cmds.waitCursor(state=False)
cmds.warning("Select sets export done. Hit 'Import Select Sets' to import them to another scene.")
def getSetsData(self, sets):
setData = []
setContents = []
for loopSet in sets:
setContents.append(cmds.sets(loopSet, query=True, nodesOnly=True))
#cmds.select(loopSet)
#setContents.append(cmds.ls(selection=True))
setData.append(sets)
setData.append(setContents)
return setData
def populateDuplicateToOtherMenu(self, menu, selSet, *args):
extracted = self.extractInfoFromSelSet(selSet)
selSetName = extracted["selSetName"]
colorName = extracted["colorName"]
colorValue = extracted["colorValue"]
selSet = extracted["selSet"]
allColorSets = []
for loopSet in self.aToolsSets:
loopExtracted = self.extractInfoFromSelSet(loopSet)
loopColorName = loopExtracted["colorName"]
if colorName == loopColorName: allColorSets.append(loopSet)
newMenu = cmds.menuItem(subMenu=True, label=selSetName, parent=menu)
newMenuAllColors = cmds.menuItem(subMenu=True, label="All %s"%colorName, parent=menu)
cmds.menuItem(newMenu, edit=True, postMenuCommand=lambda *args: self.populateDuplicateButtonMenu(newMenu, [selSet], colorName))
cmds.menuItem(newMenuAllColors, edit=True, postMenuCommand=lambda *args: self.populateDuplicateButtonMenu(newMenuAllColors, allColorSets, colorName))
def populateDuplicateButtonMenu(self, menu, selSet, colorName):
outputNameSpaces = utilMod.listAllNamespaces()
uiMod.clearMenuItems(menu)
if not outputNameSpaces: return
for loopNameSpace in outputNameSpaces:
newMenu = cmds.menuItem(subMenu=True, label=loopNameSpace, parent=menu)
for loopColor in self.colors:
loopColorName = loopColor["name"]
if colorName != loopColorName:
cmds.menuItem(label=utilMod.toTitle(loopColorName), parent=newMenu, command=lambda x, loopNameSpace=loopNameSpace, loopColorName=loopColorName, *args:self.duplicateSet(selSet,loopNameSpace,loopColorName))
def duplicateSet(self, selSets, outputNameSpace, newColor):
cmds.waitCursor(state=True)
selSetsData = self.getSetsData(selSets)
selSets = selSetsData[0]
contents = selSetsData[1]
inputNameSpaces = []
newSelSets = []
separator = ":"
for loopContents in contents:
nameSpaces = utilMod.getNameSpace(loopContents)[0]
for loopNameSpace in nameSpaces:
if loopNameSpace[:-1] not in inputNameSpaces:
inputNameSpaces.append(loopNameSpace[:-1])
for inputNameSpace in inputNameSpaces:
selSetsStr = str(selSetsData)
selSetsData = eval(selSetsStr.replace("%s%s"%(inputNameSpace, separator), "%s%s"%(outputNameSpace, separator)))
for loopSet in selSets:
newSelSets.append(self.getRenamedColor(loopSet, newColor))
selSetsData[0] = newSelSets
self.createSetsFromData(selSetsData)
cmds.waitCursor(state=False)
def addSelection(self, selSet):
sel = cmds.ls(selection=True)
if len(sel) == 0: return
selSet = self.createSelSetIfInexistent(selSet, sel)
cmds.sets(sel, edit=True, addElement=selSet)
if selSet not in self.aToolsSetsDict: self.aToolsSetsDict[selSet] = []
for loopSel in sel:
if loopSel not in self.aToolsSetsDict[selSet]: self.aToolsSetsDict[selSet].append(loopSel)
self.blinkButton(selSet, 1)
self.highlightSelectedButtons(selSet)
def removeSelection(self, selSet):
sel = cmds.ls(selection=True)
if len(sel) == 0: return
selSet = self.createSelSetIfInexistent(selSet, sel)
cmds.sets(sel, edit=True, remove=selSet)
if selSet not in self.aToolsSetsDict: self.aToolsSetsDict[selSet] = []
for loopSel in sel:
if loopSel in self.aToolsSetsDict[selSet]: self.aToolsSetsDict[selSet].remove(loopSel)
self.blinkButton(selSet, 1)
self.highlightSelectedButtons(selSet)
def updateSelection(self, selSet):
sel = cmds.ls(selection=True)
if len(sel) == 0: return
selSet = self.createSelSetIfInexistent(selSet, sel)
cmds.sets(edit=True, clear=selSet)
cmds.sets(sel, edit=True, addElement=selSet)
self.aToolsSetsDict[selSet] = sel
self.blinkButton(selSet, 1)
self.highlightSelectedButtons(selSet)
def updateshowColorsMenu(self, *args):
for loopColor in self.colors:
loopColorName = loopColor["name"]
checkBox = (loopColorName in G.SS_showColors)
cmds.menuItem('colorMenu_%s'%loopColorName, edit=True, checkBox=checkBox)
def toggleSelSetsButtonColor(self):
visible = (len(G.SS_showColors) < len(self.colors))
w = 25 if visible else 1
cmds.iconTextButton(self.showAllColorsButton, edit=True, visible=visible, w=w)
self.sortSelSetButtons()
self.adjustButtonsWidth()
def showAllColors(self, *args):
G.SS_showColors = [loopColor["name"] for loopColor in self.colors]
self.toggleSelSetsButtonColor()
def isolateColor(self, color):
G.SS_showColors = [color]
G.SS_lastColorUsed = color
self.toggleSelSetsButtonColor()
def switchColor(self, color):
if color in G.SS_showColors: self.hideColor(color)
else: self.showColor(color)
self.toggleSelSetsButtonColor()
def hideColor(self, color):
if color in G.SS_showColors:
G.SS_showColors.remove(color)
self.toggleSelSetsButtonColor()
def showColor(self, color):
if color not in G.SS_showColors:
G.SS_showColors.append(color)
self.toggleSelSetsButtonColor()
def getRenamedColor(self, selSet, newColor):
extracted = self.extractInfoFromSelSet(selSet)
selSetName = extracted["selSetName"]
newSelSetName = "%s%s_%s"%(self.defaultSetName, newColor, selSetName)
return newSelSetName
def renameSelectSetColor(self, selSets, newColor):
for loopSet in selSets:
self.setToRename = loopSet
extracted = self.extractInfoFromSelSet(loopSet)
selSetName = extracted["selSetName"]
self.renameSelectSet(selSetName, newColor)