import errno
import os
import nuke_internal as nuke
from .panels import PythonPanel
[docs]def getNukeUserFolder():
for d in nuke.pluginPath():
if os.path.isdir(d):
if d.endswith(".nuke"):
return d
return None
[docs]def buildPresetFileList(fullPath):
fileList = []
if not os.path.exists(fullPath) or not os.path.isdir(fullPath):
return fileList
fileName = fullPath + "/user_presets.py"
if os.path.exists(fileName):
fileList.append(fileName)
filecontents = os.listdir(fullPath + '/')
for d in filecontents:
newPath = os.path.join(fullPath, d)
if os.path.isdir(newPath):
fileList += buildPresetFileList(newPath)
return fileList
[docs]class CreateNodePresetsPanel(PythonPanel):
def __init__(self, node):
self.node = node
# Loop through and find all user folders
userFolder = getNukeUserFolder()
newFileList = []
if userFolder != None:
userFolder = os.path.join(userFolder, "NodePresets")
fileList = buildPresetFileList(userFolder)
for file in fileList:
# We need to convert these absolute filenames into items that can be passed to a cascading enumeration knob.
# First strip the nuke user folder path from the start
newFileName = file[len(str(userFolder)):].replace("\\", "/")
# Now strip the "/user_presets.py" part from the end
endSize = 16
if len(newFileName) > endSize:
newFileName = newFileName[:len(newFileName) - endSize]
if newFileName != "/user_presets.py":
if newFileName[:1] == '/':
newFileName = newFileName[1:]
newFileList.append(newFileName)
PythonPanel.__init__( self, 'Create Node Preset', 'uk.co.thefoundry.CreateNodePreset')
self.menuItemChoice = nuke.CascadingEnumeration_Knob('menuItemChoice','Presets menu', ['root'] + newFileList)
self.menuItemChoice.setTooltip("The menu location that the Preset will appear in. Specify 'root' to place the Preset in the main Presets menu.")
self.menuPath = nuke.String_Knob('presetname', 'Name:')
self.menuPath.setFlag(0x00001000)
self.okButton = nuke.PyScript_Knob ('create', 'Create')
self.okButton.setFlag(0x00001000)
self.cancelButton = nuke.PyScript_Knob ('cancel', 'Cancel')
# ADD KNOBS
self.addKnob(self.menuItemChoice)
self.addKnob(self.menuPath)
self.addKnob(self.okButton)
self.addKnob(self.cancelButton)
def createPreset(self):
if createNodePreset(self.node, str(self.menuPath.value())):
self.finishModalDialog( True )
def getPresetPath(self):
if str(self.menuItemChoice.value()) == "root":
self.menuPath.setValue("")
else:
self.menuPath.setValue(self.menuItemChoice.value() + "/")
def knobChanged( self, knob ):
if knob == self.okButton:
self.createPreset()
elif knob == self.cancelButton:
self.finishModalDialog( False )
elif knob == self.menuItemChoice:
self.getPresetPath()
[docs]class UserPresetsLoadPanel(PythonPanel):
def __init__(self):
PythonPanel.__init__( self, 'Load User Preset', 'uk.co.thefoundry.LoadUserPreset')
self.presets = []
self.presets = nuke.getUserPresets()
self.menuItemChoice = nuke.Enumeration_Knob('menuItemChoice','Menu item', self.presets)
self.okButton = nuke.PyScript_Knob ('load', 'Load')
self.okButton.setFlag(0x00001000)
self.cancelButton = nuke.PyScript_Knob ('cancel', 'Cancel')
# ADD KNOBS
self.addKnob(self.menuItemChoice)
self.addKnob(self.okButton)
self.addKnob(self.cancelButton)
def loadPreset(self):
if nuke.applyUserPreset(str(self.menuItemChoice.value())):
self.finishModalDialog( True )
def knobChanged( self, knob ):
if knob == self.okButton:
self.loadPreset()
elif knob == self.cancelButton:
self.finishModalDialog( False )
[docs]class UserPresetsDeletePanel(PythonPanel):
def __init__(self):
PythonPanel.__init__( self, 'Delete User Preset', 'uk.co.thefoundry.DeleteUserPreset')
self.presets = []
self.presets = nuke.getUserPresets()
self.menuItemChoice = nuke.Enumeration_Knob('menuItemChoice','Menu item', self.presets)
self.okButton = nuke.PyScript_Knob ('delete', 'Delete')
self.okButton.setFlag(0x00001000)
self.cancelButton = nuke.PyScript_Knob ('cancel', 'Cancel')
# ADD KNOBS
self.addKnob(self.menuItemChoice)
self.addKnob(self.okButton)
self.addKnob(self.cancelButton)
def deletePreset(self):
if deleteUserNodePreset(nuke.getNodeClassName(), str(self.menuItemChoice.value())):
self.finishModalDialog( True )
def knobChanged( self, knob ):
if knob == self.okButton:
self.deletePreset()
elif knob == self.cancelButton:
self.finishModalDialog( False )
[docs]class PresetsLoadPanel(PythonPanel):
def __init__(self):
PythonPanel.__init__( self, 'Load Preset', 'uk.co.thefoundry.LoadPreset')
self.presets = []
self.presets = nuke.getPresets()
self.menuItemChoice = nuke.Enumeration_Knob('menuItemChoice','Menu item', self.presets)
self.okButton = nuke.PyScript_Knob ('load', 'Load')
self.okButton.setFlag(0x00001000)
self.cancelButton = nuke.PyScript_Knob ('cancel', 'Cancel')
# ADD KNOBS
self.addKnob(self.menuItemChoice)
self.addKnob(self.okButton)
self.addKnob(self.cancelButton)
def loadPreset(self):
if nuke.applyPreset(str(self.menuItemChoice.value())):
self.finishModalDialog( True )
def knobChanged( self, knob ):
if knob == self.okButton:
self.loadPreset()
elif knob == self.cancelButton:
self.finishModalDialog( False )
[docs]class PresetsDeletePanel(PythonPanel):
def __init__(self):
PythonPanel.__init__( self, 'Delete Preset', 'uk.co.thefoundry.DeletePreset')
self.presets = []
self.presets = nuke.getPresets()
self.menuItemChoice = nuke.Enumeration_Knob('menuItemChoice','Menu item', self.presets)
self.okButton = nuke.PyScript_Knob ('delete', 'Delete')
self.okButton.setFlag(0x00001000)
self.cancelButton = nuke.PyScript_Knob ('cancel', 'Cancel')
# ADD KNOBS
self.addKnob(self.menuItemChoice)
self.addKnob(self.okButton)
self.addKnob(self.cancelButton)
def deletePreset(self):
if deleteNodePreset(nuke.getNodeClassName(), str(self.menuItemChoice.value())):
self.finishModalDialog( True )
def knobChanged( self, knob ):
if knob == self.okButton:
self.deletePreset()
elif knob == self.cancelButton:
self.finishModalDialog( False )
[docs]def processPresetFile(location):
fulName = ""
if str(location).endswith('/') or str(location).endswith('\\'):
fulName = str(location) + "user_presets.py"
else:
fulName = str(location) + "/user_presets.py"
if os.path.exists(fulName):
try:
module = nuke.loadModuleFromPath('user_presets', fulName)
module.nodePresetsStartup()
except:
pass
[docs]def buildUserPresetLoadPanel():
presets = []
presets = nuke.getUserPresets()
if presets == []:
nuke.message("No user presets defined.")
else:
UserPresetsLoadPanel().showModalDialog()
[docs]def buildPresetLoadPanel():
presets = []
presets = nuke.getPresets()
if presets == []:
nuke.message("No presets defined.")
else:
PresetsLoadPanel().showModalDialog()
[docs]def buildPresetSavePanel(nodeName, node = None):
if (node == None):
node = nuke.toNode(nodeName)
return CreateNodePresetsPanel(node).showModalDialog()
[docs]def buildUserPresetDeletePanel():
presets = []
presets = nuke.getUserPresets()
if presets == []:
nuke.message("No user presets defined.")
else:
UserPresetsDeletePanel().showModalDialog()
[docs]def buildPresetDeletePanel():
presets = []
presets = nuke.getPresets()
if presets == []:
nuke.message("No presets defined.")
else:
PresetsDeletePanel().showModalDialog()
[docs]def getItemDirName(d, item):
# Convert a preset's name (including it's menu hierarchy) into the corresponding directory
# for it's user_presets.py file
itemName = os.path.join(d, "NodePresets")
itemName = os.path.join(itemName, item[1])
length = len(os.path.basename(itemName))
itemName = itemName[:len(itemName) - length - 1]
return itemName
[docs]def saveNodePresets():
# Get the root location for writing preset files to. By default we get the nuke user folder (.nuke),
# and a NodePresets sub-directory is created below this.
# user_presets.py files are then written in a directory tree inside this in a hierarchy that mimics their
# names at creation (ie '/' separated strings to specify a relative directory path)
# find the .nuke folder path
d = getNukeUserFolder()
if d != None and os.path.isdir(d):
userPresets = nuke.getAllUserPresets()
deletedPresets = nuke.getDeletedPresets()
for k in userPresets:
dirName = getItemDirName(d, k)
try:
os.makedirs(dirName)
except OSError as exc:
if exc.errno == errno.EEXIST:
pass
else: raise
with open(os.path.join(dirName, "user_presets.py"), "w") as outfile:
outfile.write('import nuke\n')
outfile.write('def nodePresetsStartup():\n')
if userPresets != []:
for k in userPresets:
filename = os.path.join(getItemDirName(d, k), "user_presets.py")
with open(filename, "a") as outfile:
namePair = k
knobValues = nuke.getUserPresetKnobValues(namePair[0], namePair[1])
outfile.write(' nuke.setUserPreset("%s", "%s", %s)\n' % (k[0], k[1], repr(knobValues)))
if deletedPresets != []:
filename = os.path.join(d, "user_presets.py")
with open(filename, "w") as outfile:
outfile.write('import nuke\n')
outfile.write('def nodePresetsStartup():\n')
for k in deletedPresets:
namePair = k
outfile.write(' nuke.deletePreset("%s", "%s")\n' % (namePair[0], namePair[1]))
[docs]def createNodePreset(node, name):
nuke.saveUserPreset(node, name)
saveNodePresets()
[docs]def deleteNodePreset(classname, presetName):
if nuke.ask("Are you sure you want to delete preset " + presetName + "?"):
nuke.deletePreset(classname, presetName)
saveNodePresets()
[docs]def deleteUserNodePreset(classname, presetName):
if nuke.ask("Are you sure you want to delete preset " + presetName + "?"):
nuke.deleteUserPreset(classname, presetName)
saveNodePresets()