def getPref(self, pref): r = aToolsMod.loadInfoWithUser("userPrefs", pref) if r == None: default = self.getDefPref(pref) r = default return r
def loadHotkeys(self, defaults=False): allHotkeys = hotkeys.getHotkeys() hotkeysDict = [] for n, loopHotkey in enumerate(allHotkeys): for loopItem in loopHotkey: hotkeysDict.append(loopItem) for loopIndex, loopCommand in enumerate(hotkeysDict): command = loopCommand["command"] name = loopCommand["name"] key = loopCommand["hotkey"] alt = loopCommand["alt"] ctl = loopCommand["ctl"] toolTip = loopCommand["toolTip"] if not defaults: hotkeyData = aToolsMod.loadInfoWithUser("hotkeys", name) if hotkeyData != None: key = hotkeyData[0] alt = hotkeyData[1] ctl = hotkeyData[2] cmds.checkBox('ctl%s' % name, edit=True, value=ctl) cmds.checkBox('alt%s' % name, edit=True, value=alt) cmds.scrollField('key%s' % name, edit=True, text=key) self.updateHotkeyCheck(name)
def importSets(self, *args): cmds.waitCursor(state=True) setsData = aToolsMod.loadInfoWithUser("selectSets", "setsData") self.createSetsFromData(setsData) cmds.waitCursor(state=False)
def removeCustomSwitch(self, switch): allCustomSwitch = aToolsMod.loadInfoWithUser("spaceSwitch", "customSwitch") or [] allCustomSwitch.remove(switch) aToolsMod.saveInfoWithUser("spaceSwitch", "customSwitch", allCustomSwitch)
def __init__(self): if G.aToolsBar.motionTrail: return G.aToolsBar.motionTrail = self self.STORE_NODE = "specialTools" self.MOTION_TRAIL_ATTR = "twistIkObjs" self.PRE_POS_RANGE = "motionTrailPrePosRange" self.SIZE = "motionTrailSize" self.PREF_KEY = "motionTrailPrefKey" self.CAMERA_KEY = "motionTrailCameraRelative" self.mainGroupNode = "aTools_MotionTrail" self.queueOrder = 5 self.prePosRanges = [3, 6, 12, 24, "Playback Range"] self.defaultPrePosRange = 24 self.twistIkObjs = [] self.constraintLocators = [] self.firstFrame = 0 self.lastFrame = 0 self.nodeInfo = {} self.offsetCtrlsPosition = {} self.onOff = False self.blockingMode = False self.lastCurvesEdited = None cameraRelativeMode = aToolsMod.loadInfoWithUser( "userPrefs", self.CAMERA_KEY) self.cameraRelativeMode = cameraRelativeMode if cameraRelativeMode != None else True #MOTION TRAIL DRAW self.color = { "curr_frame": (1, 0, 0), "key_before": (0, 0, 1), "key_after": (0, 1, 0), "frame_before": (0, 0, 1), "frame_after": (0, 1, 0), "dirty": (1, 1, 1), "line": [(1, 1, 1), (1, 1, 0), (0, 1, 1), (1, 0, 1)] } self.size = { "curr_frame": 5, "key_before": 3, "key_after": 3, "frame_before": 1, "frame_after": 1, "dirty": 1, "line": .5 } self.baseOpacity = 1 self.customSizes = [["small", 1], ["medium", 2], ["large", 4]] self.defaultSize = "medium" self.prefKeys = ["selection", "motionTrail"] self.defaultPrefKey = "selection" self.clear()
def getColoredKeys(self): if not G.TM_coloredKeys: r = aToolsMod.loadInfoWithUser("userPrefs", "coloredKeys") else: r = G.TM_coloredKeys if r == None: default = True r = default G.TM_coloredKeys = r return r
def remapNamespaces(self, *args): winName = "remapNamespacesWindow" if cmds.window(winName, query=True, exists=True): cmds.deleteUI(winName) window = cmds.window(winName, title="Remap Namespaces") cmds.columnLayout(adjustableColumn=True) cmds.rowColumnLayout(numberOfColumns=3) animData = aToolsMod.loadInfoWithUser("copyPasteAnim", "animData") inputNameSpaces = list( set(utilMod.getNameSpace(animData["objects"])[0])) outputNameSpaces = utilMod.listAllNamespaces() for loopNameSpace in inputNameSpaces: nameSpace = loopNameSpace[:-1] eval( "cmds.text('input%s', align='right', w=150, h=26, label='%s: ')" % (nameSpace, nameSpace)) eval("cmds.textField('output%s', w=150, h=26, text='%s')" % (nameSpace, nameSpace)) eval("cmds.button('output%s', w=26, h=26, label='...')" % (nameSpace)) if outputNameSpaces: cmds.popupMenu(button=1) for loopOutput in outputNameSpaces: cmds.menuItem("menu%s" % loopOutput, label=str(loopOutput), command=lambda x, loopOutput=loopOutput, nameSpace=nameSpace, *args: self. setOutputValue(loopOutput, nameSpace)) cmds.setParent('..') cmds.button(label="Paste Animation in Place", command=lambda *args: self.remapAndPasteAnimation( animData, inputNameSpaces, pasteInPlace=True)) cmds.button(label="Paste Original Animation", command=lambda *args: self.remapAndPasteAnimation( animData, inputNameSpaces, pasteInPlace=False)) cmds.showWindow(window)
def pasteAnimation(self, animData=None, pasteInPlace=True, onlySelectedNodes=None, *args): cmds.waitCursor(state=True) if not onlySelectedNodes: onlySelectedNodes = cmds.menuItem("onlySelectedNodesMenu", query=True, checkBox=True) if not animData: animData = aToolsMod.loadInfoWithUser("copyPasteAnim", "animData") animMod.applyAnimData(animData, pasteInPlace, onlySelectedNodes, showProgress=True) cmds.waitCursor(state=False)
def hasUpdate(self): return False response = None if utilMod.hasInternet(UPDATE_URL): try: response = urllib2.urlopen(UPDATE_URL, timeout=60) except: pass if response is None: message = "aTools warning: Internet connection not detected. Offline aTools.zip not detected. You are no longer up-to-date." offlinePath = aToolsMod.loadInfoWithUser("userPrefs", "offlinePath") if not offlinePath: cmds.warning(message) else: offlineFolder = offlinePath[0] offlineFilePath = "%s%saTools.zip" % (offlineFolder, os.sep) if not os.path.isfile(offlineFilePath): cmds.warning(message) return False fileModTime = os.path.getmtime(offlineFilePath) if str(fileModTime) != str(offlinePath[1]): return "offline_update" return False try: for line in response: latestVersion = line break if VERSION not in latestVersion: return latestVersion except IOError: pass return False
def checkUpdates(self, gui, layout, *args): if self.tryUpdate(): if not G.GT_wasUpdated: hasUpdate = self.hasUpdate() if hasUpdate != False: cmds.iconTextButton(label="Updating...", style='textOnly', h=gui.hb, parent=layout) cmds.progressBar("aToolsProgressBar", maxValue=100, width=50, parent=layout) if hasUpdate == "offline_update": offlinePath = aToolsMod.loadInfoWithUser( "userPrefs", "offlinePath") offlineFolder = offlinePath[0] offlineFilePath = "%s%saTools.zip" % (offlineFolder, os.sep) downloadUrl = "file:///%s%saTools.zip" % ( offlineFolder, os.sep) fileModTime = os.path.getmtime(offlineFilePath) offline = [offlineFilePath, fileModTime] else: downloadUrl = DOWNLOAD_URL offline = None function = lambda *args: self.updateaTools( downloadUrl, offline) G.deferredManager.sendToQueue(function, 1, "checkUpdates") return self.warnUpdate()
def openGui(self, *args): winName = "commandsWindow" height = 26 commands = [] names = [] hotkeysDict = [[]] allHotkeys = hotkeys.getHotkeys() totalItems = sum(len(x) for x in allHotkeys) itemsCount = 0 aB = 0 totalColums = 2 for n, loopHotkey in enumerate(allHotkeys): if itemsCount > (totalItems / totalColums) * (aB + 1): aB += 1 hotkeysDict.append([]) itemsCount += len(loopHotkey) for loopItem in loopHotkey: hotkeysDict[aB].append(loopItem) hotkeysDict[aB][-1]["colorValue"] = self.colorValues[ self.allColors[n]] if cmds.window(winName, query=True, exists=True): cmds.deleteUI(winName) window = cmds.window(winName, title="Commands and Hotkeys") mainLayout = cmds.columnLayout(adjustableColumn=True) columnsLayout = cmds.rowColumnLayout(numberOfColumns=totalColums) for loopColumn in xrange(totalColums): parent = cmds.rowColumnLayout(numberOfColumns=7, columnSpacing=([2, 5], [3, 3], [4, 3], [5, 1], [6, 5], [7, 5]), parent=columnsLayout) cmds.text(label='Command', h=height) cmds.text(label='Ctl', h=height) cmds.text(label='Alt', h=height) cmds.text(label='Key', h=height) cmds.text(label='', h=height) cmds.text(label='Set Hotkey', h=height) cmds.text(label='Assigned to', align="left", h=height) for loopIndex, loopCommand in enumerate(hotkeysDict[loopColumn]): command = loopCommand["command"] name = loopCommand["name"] key = loopCommand["hotkey"] alt = loopCommand["alt"] ctl = loopCommand["ctl"] toolTip = loopCommand["toolTip"] color = loopCommand["colorValue"] hotkeyData = aToolsMod.loadInfoWithUser("hotkeys", name) if hotkeyData != None: key = hotkeyData[0] alt = hotkeyData[1] ctl = hotkeyData[2] cmds.button("command%s" % name, label=utilMod.toTitle(name), command=command, annotation=toolTip, h=height, bgc=color, parent=parent) cmds.checkBox('ctl%s' % name, label='', value=ctl, changeCommand=lambda x, name=name, *args: self. updateHotkeyCheck(name), h=height, parent=parent) cmds.checkBox('alt%s' % name, label='', value=alt, changeCommand=lambda x, name=name, *args: self. updateHotkeyCheck(name), h=height, parent=parent) cmds.scrollField('key%s' % name, w=80, text=key, keyPressCommand=lambda x, name=name, *args: self.updateHotkeyCheck(name), h=height, parent=parent) cmds.button(label=" ", h=height, parent=parent) self.popSpecialHotkeys(name) cmds.button( label='>', command=lambda x, name=name, command=command, *args: self. setHotkey(self.getHotkeyDict([name], [command])), h=height, parent=parent) cmds.text("query%s" % name, align="left", label=self.hotkeyCheck(key, ctl, alt), font="plainLabelFont", h=height, parent=parent) commands.append(command) names.append(name) #cmds.button(label="Set Hotkey", command=lambda *args: getHotkeyDict([name], [command], [key], [alt], [ctl], [cmd])) self.updateHotkeyCheck(name) #cmds.rowLayout(numberOfColumns=2, columnAttach=([1, 'left', 0],[2, 'right', 0]), adjustableColumn=2) cmds.button(label="Load Defaults", command=lambda *args: self.loadHotkeys(True), parent=mainLayout) cmds.button(label="Set All Hotkeys", command=lambda *args: self.setHotkey( self.getHotkeyDict(names, commands)), parent=mainLayout) cmds.showWindow(window)
def populateMenu(self, menu, *args): uiMod.clearMenuItems(menu) tokenCustomDivider = False selObjects = cmds.ls(selection=True) if not selObjects: return channels = animMod.getAllChannels() channelList = {} tokenList = [] for n, loopObjectChannel in enumerate(channels): obj = selObjects[n] if loopObjectChannel: for loopChannel in loopObjectChannel: tokens = animMod.getTokens(obj, loopChannel) if tokens and len(tokens) > 1: if not channelList.has_key(loopChannel): channelList[loopChannel] = { "objects": [], "tokens": [] } channelList[loopChannel]["objects"].append(obj) channelList[loopChannel]["tokens"].append(tokens) for loopChannelList in channelList: newMenu = cmds.menuItem(subMenu=True, label=utilMod.toTitle(loopChannelList), parent=menu) objects = channelList[loopChannelList]["objects"] tokens = channelList[loopChannelList]["tokens"] mergedTokens = utilMod.mergeLists(tokens) tokenDict = [] for loopMergedTokens in mergedTokens: tokenDict.append({"token": loopMergedTokens, "objects": []}) for n, loopObject in enumerate(objects): t = tokens[n] if loopMergedTokens in t: tokenDict[-1]["objects"].append(loopObject) cmds.radioMenuItemCollection(parent=menu) for n, loopTokenDict in enumerate(tokenDict): tokenCustomDivider = True token = loopTokenDict["token"] objects = loopTokenDict["objects"] selectedList = [ cmds.getAttr("%s.%s" % (loopObj, loopChannelList)) for loopObj in objects ] radioSelected = False if len(set(selectedList)) == 1: if selectedList[0] == n: radioSelected = True cmds.menuItem(label=utilMod.toTitle(token), radioButton=radioSelected, parent=newMenu, command=lambda x, objects=objects, channel= loopChannelList, token=token, *args: self. spaceSwitch([objects, channel, token])) #ALL KEYS cmds.menuItem(divider=True, parent=newMenu) newMenu = cmds.menuItem(subMenu=True, label='All Keys', parent=newMenu) cmds.radioMenuItemCollection(parent=newMenu) for n, loopTokenDict in enumerate(tokenDict): token = loopTokenDict["token"] objects = loopTokenDict["objects"] selectedList = [ cmds.getAttr("%s.%s" % (loopObj, loopChannelList)) for loopObj in objects ] radioSelected = False if len(set(selectedList)) == 1: if selectedList[0] == n: radioSelected = True cmds.menuItem(label=utilMod.toTitle(token), radioButton=radioSelected, parent=newMenu, command=lambda x, objects=objects, channel= loopChannelList, token=token, *args: self. spaceSwitch([objects, channel, token], all=True)) # CUSTOM SWITCH allCustomSwitch = aToolsMod.loadInfoWithUser("spaceSwitch", "customSwitch") or [] channelboxSelObjs = animMod.channelBoxSel() if channelboxSelObjs: obj = ".".join(channelboxSelObjs[0].split(".")[:-1]) selectedSwitch = [ loopAttr.split(".")[-1] for loopAttr in channelboxSelObjs if utilMod.isDynamic(obj, loopAttr.split(".")[-1]) ] if len(selectedSwitch ) > 0 and selectedSwitch not in allCustomSwitch: allCustomSwitch.append(selectedSwitch) aToolsMod.saveInfoWithUser("spaceSwitch", "customSwitch", allCustomSwitch) # populate menu if len(allCustomSwitch) > 0: divider = False customSwitchesAdded = [] customSwitchesMenu = [] for loopObj in selObjects: for loopCustomSwitch in sorted(allCustomSwitch, key=len, reverse=True): if len(loopCustomSwitch) == 0: continue switchName = utilMod.getNameSpace([loopObj ])[1][0].split(".")[0] exit = False for loopAttr in loopCustomSwitch: objAttr = "%s.%s" % (loopObj, loopAttr) if not cmds.objExists(objAttr): exit = True break if exit: continue customSwitchesMenu.append({ "objects": [loopObj], "switches": loopCustomSwitch }) for loopMenu in customSwitchesMenu[:-1]: if loopObj in loopMenu["objects"] and len( loopCustomSwitch) < len( loopMenu["switches"] ) and utilMod.listIntersection( loopMenu["switches"], loopCustomSwitch) == loopCustomSwitch: customSwitchesMenu.pop() break if loopCustomSwitch == loopMenu["switches"]: loopMenu["objects"].append(loopObj) customSwitchesMenu.pop() break for loopSwitchMenu in customSwitchesMenu: objects = loopSwitchMenu["objects"] switches = loopSwitchMenu["switches"] switchName = ", ".join( list(set(utilMod.getNameSpace(objects)[1]))) if not divider and tokenCustomDivider: divider = cmds.menuItem(divider=True, parent=menu) cmds.radioMenuItemCollection(parent=menu) newMenu = cmds.menuItem(subMenu=True, label=switchName, parent=menu) radioSelected = [] for loopCustomSwitchAttr in switches: switchAttr = loopCustomSwitchAttr.split(".")[-1] objAttr = "%s.%s" % (objects[0], switchAttr) minValue = cmds.addAttr(objAttr, query=True, minValue=True) maxValue = cmds.addAttr(objAttr, query=True, maxValue=True) currValue = cmds.getAttr(objAttr) radioSelected.append((currValue == maxValue)) cmds.menuItem( label=switchAttr, radioButton=radioSelected[-1], parent=newMenu, command=lambda x, objects=objects, switchAttr= switchAttr, switches=switches, *args: self.spaceSwitch( [objects, switchAttr, switches], mode="custom")) switchAttr = "message" radioSelected = (list(set(radioSelected)) == [False]) cmds.menuItem( label="None", radioButton=radioSelected, parent=newMenu, command=lambda x, objects=objects, switchAttr=switchAttr, switches=switches, *args: self.spaceSwitch( [objects, switchAttr, switches], mode="custom")) #ALL KEYS cmds.menuItem(divider=True, parent=newMenu) allMenu = cmds.menuItem(subMenu=True, label='All Keys', parent=newMenu) radioSelected = [] cmds.radioMenuItemCollection(parent=menu) for loopCustomSwitchAttr in switches: switchAttr = loopCustomSwitchAttr.split(".")[-1] objAttr = "%s.%s" % (objects[0], switchAttr) minValue = cmds.addAttr(objAttr, query=True, minValue=True) maxValue = cmds.addAttr(objAttr, query=True, maxValue=True) currValue = cmds.getAttr(objAttr) radioSelected.append((currValue == maxValue)) cmds.menuItem(label=switchAttr, radioButton=radioSelected[-1], parent=allMenu, command=lambda x, objects=objects, switchAttr =switchAttr, switches=switches, *args: self. spaceSwitch([objects, switchAttr, switches], all=True, mode="custom")) switchAttr = "message" radioSelected = (list(set(radioSelected)) == [False]) cmds.menuItem(label="None", radioButton=radioSelected, parent=allMenu, command=lambda x, objects=objects, switchAttr= switchAttr, switches=switches, *args: self. spaceSwitch([objects, switchAttr, switches], all=True, mode="custom")) #DELETE cmds.menuItem(label="Remove", parent=newMenu, command=lambda x, switches=switches, *args: self. removeCustomSwitch(switches))
def getPrefSize(self): size = aToolsMod.loadInfoWithUser("userPrefs", self.SIZE) if not size: size = self.defaultSize return size
def getPrePosRange(self): range = aToolsMod.loadInfoWithUser("userPrefs", self.PRE_POS_RANGE) if not range: range = self.defaultPrePosRange return range
def getPrefKey(self): prefKey = aToolsMod.loadInfoWithUser("userPrefs", self.PREF_KEY) if not prefKey: prefKey = self.defaultPrefKey return prefKey
versionInfoPath = "%sversion_info.txt" % aToolsMod.getaToolsPath( inScriptsFolder=False) versionInfoContents = utilMod.readFile(versionInfoPath) VERSION = versionInfoContents[0].split(" ")[-1].replace("\n", "") WHATISNEW = "".join(versionInfoContents[1:]) KEYSLIST = [ "Up", "Down", "Left", "Right", "", "Page_Up", "Page_Down", "Home", "End", "Insert", "", "Return", "Space", "", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12" ] SITE_URL = "http://camiloalan.wix.com/atoolswebsite" ATOOLS_FOLDER = "http://www.trickorscript.com/aTools/" UPDATE_URL = "%slatest_version.txt" % ATOOLS_FOLDER DOWNLOAD_URL = "%saTools.zip" % ATOOLS_FOLDER lastUsedVersion = aToolsMod.loadInfoWithUser("userPrefs", "lastUsedVersion") HELP_URL = "http://camiloalan.wix.com/atoolswebsite#!help/cjg9" DONATE_URL = "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=5RQLT89A239K6" PREFS = [{ "name": "tumbleOnObjects", "command": "tumbleOnObjects.switch(onOff)", "default": True }, { "name": "autoFramePlaybackRange", "command": "framePlaybackRange.toggleframePlaybackRange(onOff)", "default": False }, { "name": "autoJumpToSelectedKey", "command": "jumpToSelectedKey.togglejumpToSelectedKey(onOff)", "default": False
def getMultiplier(self): name = aToolsMod.loadInfoWithUser("userPrefs", "microTransform") if name == None: name = self.defaultMultiplier return name