在Nuke中从文件夹创建下拉菜单,然后评估第一个下拉菜单以填充第二个下拉菜单
我想创建一个面板,让它在Nuke启动时自动打开,并设置一些参数。
我想在同一个面板上放几个下拉菜单,这些下拉菜单里的选项来自文件夹。
我遇到的问题是,我希望第一个下拉菜单的选择能够影响第二个下拉菜单的内容,第二个下拉菜单的选项也要根据第一个下拉菜单的选择来变化,依此类推。简单来说,就是要逐层深入文件夹结构,每个下拉菜单的结果都要作为一个变量。
我现在进展不大,不过
import os
import nuke
import nukescripts
## define panel
pm = nuke.Panel("project Manager")
## create pulldown menus
jobPath = pm.addEnumerationPulldown( 'project', os.walk('/Volumes/Production_02/000_jobs/projects').next()[1])
seqPath = pm.addEnumerationPulldown('sequence', os.walk('/Volumes/Production_02/000_jobs/projects').next()[1])
shotPath = pm.addEnumerationPulldown('shot', os.walk('/Volumes/Production_02/000_jobs/projects').next()[1])
print jobPath
print seqPath
print shotPath
#pm.addKnob(job)
#pm.addKnob(seq)
#pm.addKnob(shot)
pm.show()
另外,下拉菜单里显示的字符串是被[' ']包围的,这是什么情况呢?
谢谢!
1 个回答
0
你可能想用 PythonPanel
,而不是老式的 Panel
,后者其实是一个TCL的包装器。这样一来,当面板上的旋钮被改变时,你就能收到回调通知。
下面是一个基本的例子:
import os
import nuke
import nukescripts.panels
class ProjectManager(nukescripts.panels.PythonPanel):
def __init__(self, rootDir='/Volumes/Production_02/000_jobs/projects'):
super(ProjectManager, self).__init__('ProjectManager', 'id.ProjectManager')
self.rootDir = rootDir
self.project = self.sequence = self.shot = None
projectDirs = [x for x in os.listdir(rootDir)
if os.path.isdir(os.path.join(rootDir, x))]
self.project = projectDirs[0]
self.projectEnum = nuke.Enumeration_Knob('project', 'project', projectDirs)
self.addKnob(self.projectEnum)
self.seqEnum = nuke.Enumeration_Knob('sequence', 'sequence', [])
self.addKnob(self.seqEnum)
self.shotEnum = nuke.Enumeration_Knob('shot', 'shot', [])
self.addKnob(self.shotEnum)
self._projectChanged()
def _projectChanged(self):
self.project = self.projectEnum.value()
projectDir = os.path.join(self.rootDir, self.project)
projectSeqDirs = [x for x in os.listdir(projectDir)
if os.path.isdir(os.path.join(projectDir, x))]
self.seqEnum.setValues(projectSeqDirs)
self._sequenceChanged()
def _sequenceChanged(self):
s = self.seqEnum.value()
if s:
self.sequence = s
seqDir = os.path.join(self.rootDir, self.project, s)
seqShotDirs = [x for x in os.listdir(seqDir)
if os.path.isdir(os.path.join(seqDir, x))]
else:
self.sequence = None
seqShotDirs = []
self.shotEnum.setValues(seqShotDirs)
self._shotChanged()
def knobChanged(self, knob):
if knob is self.projectEnum:
self._projectChanged()
elif knob is self.seqEnum:
self._sequenceChanged()
elif knob is self.shotEnum:
self.shot = self.shotEnum.value()
p = ProjectManager()
if p.showModalDialog():
print p.project, p.sequence, p.shot
请注意,这个例子只是为了展示 PythonPanel
子类的基本设计。它在Nuke的上下文中有一些小的逻辑问题,并且是为了尽可能清晰而写的,而不是为了效率或符合习惯用法。
总之,希望这能给你一个关于如何构建你想要的东西的思路。