Foundry NUKE 10.5v5 -重新打开脚本时回调不工作



我写了一个自动写入节点,其中有回调和knobChange,但当我重新打开核弹脚本时,它们停止工作。因此,当创建自动写入节点时,它会按照预期工作,但是一旦保存并重新打开脚本,写入节点就会与回调和knobChange断开连接。我很感激你在这方面的帮助,因为我认为有些东西我忽视了或遗漏了。

这是代码-我可以简化,但无论如何现在。

import re
# Create write node
w = nuke.createNode('Write', inpanel=True)
count = 1
while nuke.exists('MN_AutoWrite_PUBLISH' + str(count)):
count += 1
w.knob('name').setValue('MN_AutoWrite_PUBLISH' + str(count))
# Create knobs
t = nuke.Tab_Knob("Project Path")
w.addKnob(t)
w.addKnob(nuke.String_Knob('proj_root', 'Project Root', ''))
w.addKnob(nuke.String_Knob('nes', '2D Folder', ''))
w.addKnob(nuke.String_Knob('seq', 'Sequence', ''))
w.addKnob(nuke.String_Knob('projShot', 'Shot', ''))
w.addKnob(nuke.String_Knob('projApp', 'App', ''))
w.addKnob(nuke.String_Knob('file_name', 'File Name', ''))
w.addKnob(nuke.String_Knob('projInit', 'Initials', ''))
w.addKnob(nuke.Text_Knob(''))
w.addKnob(nuke.Text_Knob('File Format'))
w.addKnob(nuke.String_Knob('pub', 'Fullpath', ''))
w.addKnob(nuke.Text_Knob(''))
w.addKnob(nuke.Boolean_Knob('png_bool', 'PNG', True))
w.addKnob(nuke.Boolean_Knob('tiff_bool', 'Tiff', False))
w.addKnob(nuke.Boolean_Knob('exr_bool', 'EXR', False))
w.addKnob(nuke.Text_Knob(''))
w.addKnob(nuke.Boolean_Knob('jpg_bool', 'Jpeg', False))
# Set output settings
w.knob('file_type').setValue('exr')
w.knob('create_directories').setValue('true')
def outputPath():
''' # Set output path '''
output_path = (w.knob('pub').getValue())
w.knob('file').fromScript(output_path)

# Set output path function
def updatePaths():
# global projFile
# global projSeq
# global InitReplacePublish
# global projInit
# Get file paths
saveDir = nuke.root()['name'].value()
dir = saveDir.split("/")
dirUnderScore = saveDir.split("_")
dirDot = saveDir.split(".")
projRoot = dir[0] + "/" + dir[1]
projNes = "/2D/_Renders/"
projSeq = dir[4] + "/"
projShot = dir[5] + "/"
projApp = "Nuke/"
projInit = dirUnderScore[-1].split(".")
projInitDot = projInit[0] + "."
split = dir[-1].split(".")
projFile = re.sub(r"(vd{3,})", "", split[0] + r".####" + setFileType())
projFileReplace = projFile.replace("__", "_",1)
InitReplacePublish = projFileReplace.replace(projInitDot, "Publish.",1)
#assembles full publhs output path
pub = projRoot+projNes+projSeq+projShot+projApp+"Publish/"+InitReplacePublish
print "--------------------------"
print "projInit:" + projInit [0]
print "projInitDot: " + projInitDot
print "split:" + split[0] 
print "projFile: " + projFile
print "projFileReplace: " + projFileReplace
print "InitReplacePublish: " + InitReplacePublish
print "--------------------------"   
# Update path knobs
w.knob('proj_root').setValue(projRoot)
w.knob('nes').setValue(projNes)
w.knob('seq').setValue(projSeq)
w.knob('projShot').setValue(projShot)
w.knob('projApp').setValue(projApp)
w.knob('file_name').setValue(InitReplacePublish)
w.knob('projInit').setValue(projInit[0])
w.knob('pub').setValue(pub)

outputPath()
def setFileType():
if w.knob('tiff_bool').getValue():
return ".tif"
elif w.knob('exr_bool').getValue():
return ".exr"
elif w.knob('png_bool').getValue():
return ".png"
elif w.knob('jpg_bool').getValue():
return ".jpg"
else:
print("ERROR: File type not selected")

def setFileTypeTiff():
w.knob('exr_bool').setValue(False)
w.knob('png_bool').setValue(False)
w.knob('jpg_bool').setValue(False)
w.knob('file_type').setValue('tiff')
w.knob('compression').setValue('LZW')
w.knob('datatype').setValue('16 bit')
updatePaths()

def setFileTypeEXR():
w.knob('tiff_bool').setValue(False)
w.knob('png_bool').setValue(False)
w.knob('jpg_bool').setValue(False)
w.knob('file_type').setValue('exr')
updatePaths()

def setFileTypePNG():
w.knob('tiff_bool').setValue(False)
w.knob('exr_bool').setValue(False)
w.knob('jpg_bool').setValue(False)
w.knob('file_type').setValue('png')
w.knob('datatype').setValue('16 bit')
updatePaths()

def setFileTypeJpg():
w.knob('tiff_bool').setValue(False)
w.knob('exr_bool').setValue(False)
w.knob('png_bool').setValue(False)
w.knob('file_type').setValue('jpeg')
updatePaths()

setFileTypePNG()
# Callbacks
def removeCallbacks():
nuke.removeOnScriptSave(updatePaths)
nuke.removeOnScriptClose(updatePaths)
nuke.removeBeforeRender(updatePaths)
nuke.removeOnDestroy(removeCallbacks)
print("REMOVED CALLBACKS")


# Add callbacks
nuke.addOnScriptSave(updatePaths)
nuke.addOnScriptClose(updatePaths)
nuke.addBeforeRender(updatePaths)
nuke.addOnDestroy(removeCallbacks)

w['knobChanged'].setValue('''
k = nuke.thisKnob().name()
if k == "tiff_bool":
setFileTypeTiff()
elif k == "exr_bool":
setFileTypeEXR()
elif k == "jpg_bool":
setFileTypeJpg()
elif k == "png_bool":
setFileTypePNG()
else:
outputPath()
''')
nuke.addOnScriptSave(updatePaths)
nuke.addOnScriptClose(updatePaths)
nuke.addBeforeRender(updatePaths)
nuke.addOnDestroy(removeCallbacks)

这些回调函数只在初始化代码时的脚本实例中有效。在那之后,他们就永远消失了!

如果你愿意,你可以在你的init.py中定义这些代码,尽管这些代码不会以这种方式保存到其他用户/安装。

对于这段代码,您最好使用Write节点的beforeRender/afterRender回调。在write节点上方便地将它们作为文本字段公开(尽管您必须在其中压缩代码)。一旦在这些字段中,它也会保存在脚本文件中。

相关内容

  • 没有找到相关文章

最新更新