import traceback import maya.cmds as cmds import maya.mel as mel import os, cPickle import glob from functools import partial def customMayaMenu(): gMainWindow = mel.eval('$temp1=$gMainWindow') menus = cmds.window(gMainWindow, q = True, menuArray = True) found = False for menu in menus: label = cmds.menu(menu, q = True, label = True) if label == "Epic Games": found = True if found == False: customMenu = cmds.menu(parent=gMainWindow, label = 'Epic Games') #tools path toolsPath = os.path.join(cmds.internalVar(usd = True), "mayaTools.txt") if os.path.exists(toolsPath): f = open(toolsPath, 'r') mayaToolsDir = f.readline() f.close() #ART cmds.menuItem(parent = customMenu, label = "Animation Rigging Toolset", bld = True, enable = False) cmds.menuItem(parent = customMenu, divider = True) cmds.menuItem(parent = customMenu, label = "Character Rig Creator", c = launchSkeletonBuilder) cmds.menuItem(parent = customMenu, label = "Edit Existing Character", c = editCharacter) cmds.menuItem(parent = customMenu, label = "Add Character For Animation", c = launchAddCharacter) cmds.menuItem(parent = customMenu, label = "Animation Interface", c = launchAnimUI) cmds.menuItem(parent = customMenu, label = "Settings", c = launchARTSettings) artHelp = cmds.menuItem(parent = customMenu, label = "Help", subMenu=True) cmds.menuItem(parent = artHelp, label = "Learning Videos", c = launchLearningVideos) cmds.menuItem(parent = artHelp, label = "Help Documentation", c = launchRigHelp) cmds.menuItem(parent = artHelp, label = "About", c = aboutARTTools) cmds.menuItem(parent = customMenu, divider = True) cmds.menuItem(parent = customMenu, label = "Misc. Tools", bld = True, enable = False) cmds.menuItem(parent = customMenu, divider = True) #PERFORCE p4Menu = cmds.menuItem(parent = customMenu, label = "Perforce", subMenu=True, to = True) cmds.menuItem("perforceSubmitMenuItem", parent = p4Menu, label = "Submit Current File", enable = False, c = p4Submit) cmds.menuItem("perforceAddAndSubmitMenuItem", parent = p4Menu, label = "Add and Submit Current File", enable = False, c = p4AddSubmit) cmds.menuItem("perforceCheckOutMenuItem", parent = p4Menu, label = "Check Out Current File", enable = False, c = p4CheckOut) cmds.menuItem("perforceFileHistoryMenuItem", parent = p4Menu, label = "Current File History", enable = False, c = p4GetHistory) cmds.menuItem("perforceGetLatestMenuItem", parent = p4Menu, label = "Get Latest Revision of Current File", enable = False, c = p4GetLatest) cmds.menuItem("perforceProjectList", parent = p4Menu, label = "Set Project", enable = False, subMenu = True) cmds.menuItem("perforceProject_New", parent = "perforceProjectList", label = "New Project", c = createNewProj) cmds.radioMenuItemCollection("perforceProjectRadioMenuCollection", parent = "perforceProjectList") cmds.menuItem(parent = customMenu, divider = True) #check settings to see if use source control is turned on toolsPath = os.path.join(cmds.internalVar(usd = True), "mayaTools.txt") if os.path.exists(toolsPath): f = open(toolsPath, 'r') mayaToolsDir = f.readline() f.close() settingsLocation = os.path.join(mayaToolsDir, "General", "Scripts", "projectSettings.txt") if os.path.exists(settingsLocation): f = open(settingsLocation, 'r') settings = cPickle.load(f) f.close() #find use source control value sourceControl = settings.get("UseSourceControl") if sourceControl: cmds.menuItem("perforceSubmitMenuItem", edit = True, enable = True) cmds.menuItem("perforceAddAndSubmitMenuItem", edit = True, enable = True) cmds.menuItem("perforceCheckOutMenuItem", edit = True, enable = True) cmds.menuItem("perforceFileHistoryMenuItem", edit = True, enable = True) cmds.menuItem("perforceGetLatestMenuItem", edit = True, enable = True) cmds.menuItem("perforceProjectList", edit = True, enable = True) #launch script job for checking Maya Tools cmds.scriptJob(event = ["NewSceneOpened", autoUpdateTools]) ############################################################################################# ############################################################################################# ############################################################################################# def p4ProjectMenu(*args): #clear any projects that are in the collection first items = cmds.lsUI(menuItems = True) for i in items: data = cmds.menuItem(i, q = True, docTag = True) if data == "P4Proj": cmds.deleteUI(i) #find projects toolsPath = os.path.join(cmds.internalVar(usd = True), "mayaTools.txt") if os.path.exists(toolsPath): f = open(toolsPath, 'r') mayaToolsDir = f.readline() f.close() projects = os.listdir(os.path.join(mayaToolsDir, "General", "Scripts")) p4Projects = [] #Test_Project_Settings for proj in projects: if proj.rpartition(".")[2] == "txt": if proj.partition("_")[2].partition("_")[0] == "Project": p4Projects.append(proj) #set the current project try: f = open(os.path.join(mayaToolsDir, "General", "Scripts", "projectSettings.txt", 'r')) settings = cPickle.load(f) f.close() currentProj = settings.get("CurrentProject") except: pass #add the projects to the menu for proj in p4Projects: projectName = proj.partition("_")[0] if projectName == currentProj: val = True else: val = False menuItem = cmds.menuItem(label = projectName, parent = "perforceProjectList", cl = "perforceProjectRadioMenuCollection", rb = val, docTag = "P4Proj", c = partial(setProj, projectName)) cmds.menuItem(parent = "perforceProjectList", optionBox = True, c = partial(editProj, projectName)) ############################################################################################# ############################################################################################# ############################################################################################# def setProj(projectName, *args): import perforceUtils reload(perforceUtils) perforceUtils.setCurrentProject(projectName) ############################################################################################# ############################################################################################# ############################################################################################# def editProj(projectName, *args): import perforceUtils reload(perforceUtils) perforceUtils.editProject(projectName) ############################################################################################# ############################################################################################# ############################################################################################# def createNewProj(*args): import perforceUtils reload(perforceUtils) perforceUtils.createNewProject() ############################################################################################# ############################################################################################# ############################################################################################# def autoUpdateTools(*args): import perforceUtils reload(perforceUtils) perforceUtils.p4_checkForUpdates() ############################################################################################# ############################################################################################# ############################################################################################# def launchARTSettings(*args): import ART_Settings reload(ART_Settings) ART_Settings.ART_Settings() ############################################################################################# ############################################################################################# ############################################################################################# def aboutARTTools(*args): cmds.confirmDialog(title = "About", message = "(c) Epic Games, Inc.\nCreated by: Jeremy Ernst\njeremy.ernst@epicgames.com\nVisit www.epicgames.com\n\nOS X Port by Alex Widener\nalexwidener.com\nalexwidener@gmail.com", icon = "information") ############################################################################################# ############################################################################################# ############################################################################################# def editCharacter(*args): if cmds.window("artEditCharacterUI", exists = True): cmds.deleteUI("artEditCharacterUI") window = cmds.window("artEditCharacterUI", w = 300, h = 400, title = "Edit Character", mxb = False, mnb = False, sizeable = False) mainLayout = cmds.columnLayout(w = 300, h = 400, rs = 5, co = ["both", 5]) #banner image toolsPath = os.path.join(cmds.internalVar(usd = True), "mayaTools.txt") if os.path.exists(toolsPath): f = open(toolsPath, 'r') mayaToolsDir = f.readline() f.close() cmds.image(w = 300, h = 50, image = os.path.join(mayaToolsDir, "General", "Icons", "ART", "artBanner300px.bmp"), parent = mainLayout) cmds.text(label = "", h = 1, parent = mainLayout) optionMenu = cmds.optionMenu("artProjOptionMenu", label = "Project:", w =290, h = 40, cc = getProjCharacters, parent = mainLayout) textScrollList = cmds.textScrollList("artProjCharacterList", w = 290, h = 300, parent = mainLayout) button = cmds.button(w = 290, h = 40, label = "Edit Export File", c = editSelectedCharacter, ann = "Edit the character's skeleton settings, joint positions, or skin weights.", parent = mainLayout) button2 = cmds.button(w = 290, h = 40, label = "Edit Rig File", c = editSelectedCharacterRig, ann = "Edit the character's control rig that will be referenced in by animation.", parent = mainLayout) cmds.text(label = "", h = 1) cmds.showWindow(window) getProjects() getProjCharacters() ############################################################################################# ############################################################################################# ############################################################################################# def getProjects(*args): toolsPath = os.path.join(cmds.internalVar(usd = True), "mayaTools.txt") if os.path.exists(toolsPath): f = open(toolsPath, 'r') mayaToolsDir = f.readline() f.close() projects = os.listdir(os.path.join(mayaToolsDir, "General", "ART", "Projects")) for project in projects: cmds.menuItem(label = project, parent = "artProjOptionMenu") ############################################################################################# ############################################################################################# ############################################################################################# def getProjCharacters(*args): toolsPath = os.path.join(cmds.internalVar(usd = True), "mayaTools.txt") if os.path.exists(toolsPath): f = open(toolsPath, 'r') mayaToolsDir = f.readline() f.close() proj = cmds.optionMenu("artProjOptionMenu", q = True, value = True) cmds.textScrollList("artProjCharacterList", edit = True, removeAll = True) #characters = glob.glob(os.path.join(mayaToolsDir, "General", "ART", "Projects", proj, "ExportFiles"), "*") # Maya has a bug up it's ass about the .DS_Store file, and it will not at all ignore it. I give up. if proj != os.path.join(mayaToolsDir, "General", "ART", "Projects", ".DS_Store", "ExportFiles"): characters = os.listdir(os.path.join(mayaToolsDir, "General", "ART", "Projects", proj, "ExportFiles")) else: pass for character in characters: if os.path.isfile(os.path.join(mayaToolsDir, "General", "ART", "Projects", proj, "ExportFiles", character)): if character.rpartition(".")[2] == "mb": niceName = character.rpartition(".")[0] niceName = niceName.partition("_Export")[0] cmds.textScrollList("artProjCharacterList", edit = True, append = niceName) ############################################################################################# ############################################################################################# ############################################################################################# def editSelectedCharacter(*args): toolsPath = os.path.join(cmds.internalVar(usd = True), "mayaTools.txt") if os.path.exists(toolsPath): f = open(toolsPath, 'r') mayaToolsDir = f.readline() f.close() proj = cmds.optionMenu("artProjOptionMenu", q = True, value = True) character = cmds.textScrollList("artProjCharacterList", q = True, si = True)[0] cmds.file(os.path.join(mayaToolsDir, "General", "ART", "Projects", proj, "ExportFiles", character + "_Export.mb"), open = True, force = True) cmds.deleteUI("artEditCharacterUI") launchSkeletonBuilder() ############################################################################################# ############################################################################################# ############################################################################################# def editSelectedCharacterRig(*args): toolsPath = os.path.join(cmds.internalVar(usd = True), "mayaTools.txt") if os.path.exists(toolsPath): f = open(toolsPath, 'r') mayaToolsDir = f.readline() f.close() proj = cmds.optionMenu("artProjOptionMenu", q = True, value = True) character = cmds.textScrollList("artProjCharacterList", q = True, si = True)[0] cmds.file(os.path.join(mayaToolsDir, "General", "ART", "Projects", proj, "AnimRigs", character + ".mb"), open = True, force = True) cmds.deleteUI("artEditCharacterUI") launchSkeletonBuilder() ############################################################################################# ############################################################################################# ############################################################################################# def changeMayaToolsLoc(*args): path = os.path.join(cmds.internalVar(usd = True), "mayaTools.txt") if os.path.exists(path): os.remove(path) cmds.confirmDialog(title = "Change Location", message = "Once you have chosen your new tools location, it is recommended that you restart Maya.", button = "OK") cmds.file(new = True, force = True) ############################################################################################# ############################################################################################# ############################################################################################# def launchSkeletonBuilder(*args): import ART_skeletonBuilder_UI reload(ART_skeletonBuilder_UI) UI = ART_skeletonBuilder_UI.SkeletonBuilder_UI() ############################################################################################# ############################################################################################# ############################################################################################# def launchAddCharacter(*args): import ART_addCharacter_UI reload(ART_addCharacter_UI) UI = ART_addCharacter_UI.AddCharacter_UI() ############################################################################################# ############################################################################################# ############################################################################################# def launchAnimUI(*args): import ART_animationUI reload(ART_animationUI) UI = ART_animationUI.AnimationUI() ############################################################################################# ############################################################################################# ############################################################################################# def launchEpic(*args): cmds.launch(web="http://www.epicgames.com") ############################################################################################# ############################################################################################# ############################################################################################# def launchUnreal(*args): cmds.launch(web="http://www.unrealengine.com") ############################################################################################# ############################################################################################# ############################################################################################# def launchAnimHelp(*args): toolsPath = os.path.join(cmds.internalVar(usd = True), "mayaTools.txt") if os.path.exists(toolsPath): f = open(toolsPath, 'r') mayaToolsDir = f.readline() f.close() if os.path.exists(mayaToolsDir + "General", "ART", "Help", "ART_AnimHelp.pdf"): cmds.launch(pdfFile = os.path.join(mayaToolsDir, "General", "ART", "Help", "ART_AnimHelp.pdf")) ############################################################################################# ############################################################################################# ############################################################################################# def launchRigHelp(self, *args): cmds.launch(web = "https://docs.unrealengine.com/latest/INT/Engine/Content/Tools/MayaRiggingTool/index.html") ############################################################################################# ############################################################################################# ############################################################################################# def launchLearningVideos(self, *args): import ART_Help reload(ART_Help) ART_Help.ART_LearningVideos() ############################################################################################# ############################################################################################# ############################################################################################# def setupScene(*args): cmds.currentUnit(time = 'ntsc') cmds.playbackOptions(min = 0, max = 100, animationStartTime = 0, animationEndTime = 100) cmds.currentTime(0) #check for skeleton builder or animation UIs if cmds.dockControl("skeletonBuilder_dock", exists = True): print "Custom Maya Menu: SetupScene" channelBox = cmds.formLayout("SkelBuilder_channelBoxFormLayout", q = True, childArray = True) if channelBox != None: channelBox = channelBox[0] #reparent the channelBox Layout back to maya's window cmds.control(channelBox, e = True, p = "MainChannelsLayersLayout") channelBoxLayout = mel.eval('$temp1=$gChannelsLayersForm') channelBoxForm = mel.eval('$temp1 = $gChannelButtonForm') #edit the channel box pane's attachment to the formLayout cmds.formLayout(channelBoxLayout, edit = True, af = [(channelBox, "left", 0),(channelBox, "right", 0), (channelBox, "bottom", 0)], attachControl = (channelBox, "top", 0, channelBoxForm)) #print "deleting dock and window and shit" cmds.deleteUI("skeletonBuilder_dock") if cmds.window("SkelBuilder_window", exists = True): cmds.deleteUI("SkelBuilder_window") if cmds.dockControl("artAnimUIDock", exists = True): channelBox = cmds.formLayout("ART_cbFormLayout", q = True, childArray = True) if channelBox != None: channelBox = channelBox[0] #reparent the channelBox Layout back to maya's window cmds.control(channelBox, e = True, p = "MainChannelsLayersLayout") channelBoxLayout = mel.eval('$temp1=$gChannelsLayersForm') channelBoxForm = mel.eval('$temp1 = $gChannelButtonForm') #edit the channel box pane's attachment to the formLayout cmds.formLayout(channelBoxLayout, edit = True, af = [(channelBox, "left", 0),(channelBox, "right", 0), (channelBox, "bottom", 0)], attachControl = (channelBox, "top", 0, channelBoxForm)) #print "deleting dock and window and shit" cmds.deleteUI("artAnimUIDock") if cmds.window("artAnimUI", exists = True): cmds.deleteUI("artAnimUI") ############################################################################################# ############################################################################################# ############################################################################################# def autoOpenAnimUI(): if cmds.objExists("*:master_anim_space_switcher_follow"): launchAnimUI() ############################################################################################# ############################################################################################# ############################################################################################# def p4GetLatest(*args): import perforceUtils reload(perforceUtils) perforceUtils.p4_getLatestRevision(None) ############################################################################################# ############################################################################################# ############################################################################################# def p4CheckOut(*args): import perforceUtils reload(perforceUtils) perforceUtils.p4_checkOutCurrentFile(None) ############################################################################################# ############################################################################################# ############################################################################################# def p4GetHistory(*args): import perforceUtils reload(perforceUtils) perforceUtils.p4_getRevisionHistory() ############################################################################################# ############################################################################################# ############################################################################################# def p4Submit(*args): import perforceUtils reload(perforceUtils) perforceUtils.p4_submitCurrentFile(None, None) ############################################################################################# ############################################################################################# ############################################################################################# def p4AddSubmit(*args): import perforceUtils reload(perforceUtils) perforceUtils.p4_addAndSubmitCurrentFile(None, None) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #LAUNCH SCRIPT JOBS scriptJobNum2 = cmds.scriptJob(event = ["PostSceneRead", autoOpenAnimUI]) scriptJobNum = cmds.scriptJob(event = ["NewSceneOpened", setupScene]) p4ScriptJob = cmds.scriptJob(event = ["NewSceneOpened", p4ProjectMenu])