forked from andybclarke/Nuke_prefs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
MultiChannelSplitSgtk.py~
149 lines (128 loc) · 5.32 KB
/
MultiChannelSplitSgtk.py~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#################################################################
# MultiChannelSplit
#
# @author simon jokuschies
# @email info@leafpictures.de
# @version 2.0
#
# description:
# the script splits a multichannel exr into single layers
# and autocrops them automatically.
#
# instalation
#
# put script in nuke home directory
# in menu.py write these two lines:
# import MultiChannelSplit
# nuke.menu("Nuke").addCommand('Scripts/MultiChannelSplit', 'MultiChannelSplit.MultiChannelSplit()');
#
#################################################################
import nuke
import os,sys
def getUniqueChannelLayerList(readNode):
'''
return all channel layer that are included in the selected read node
return: string-array
'''
#function that returns unique channel layers
rawChannelList = readNode.channels()
channelLayerList = []
for channel in rawChannelList:
channelLayer = channel.split(".")
channelLayerList .append(channelLayer[0])
return list(set(channelLayerList))
def createPanel():
'''
panel - prepare for render or not
if set each shuffle node gets an own write node to render out the shuffled data
in addition there will be a folder created for every channel layer
return panel
'''
p = nuke.Panel('MultiChannelSplit')
p.setWidth(400)
p.addBooleanCheckBox("auto crop?", True)
p.addBooleanCheckBox("prepare for output?", False)
return p
def createPanel_renderloc():
'''
panel to set render location
return panel
'''
p = nuke.Panel('MultiChannelSplit - set renderpath')
p.setWidth(400)
p.addFilenameSearch("render to: ", "")
return p
def createFolders(path):
'''
create folder if not exist
return true if suceeded, false otherwise
'''
if not os.path.isdir(path):
try:
os.makedirs(path)
return True
except:
return False
def MultiChannelSplit():
'''
main function
split the selected read node in separate channel layers
if set create separate folders and write nodes
'''
selectedNodes = nuke.selectedNodes()
lenSelectedNodes= len(selectedNodes)
shuffles=[]
renderTo=""
p_renderLoc=None
if len(selectedNodes)>0:
p=createPanel()
if p.show():
if p.value("prepare for output?") == True:
p_renderLoc = createPanel_renderloc()
p_renderLoc.show()
#main procedure
#create shuffle, shuffle channel in, curvetool crop, create cropnode and paste that information in, delete crop node
for readNode in selectedNodes:
if readNode.Class()=="SgtkRead":
uniqueLayers = getUniqueChannelLayerList(readNode)
for channelLayer in uniqueLayers:
shuffleNode = nuke.nodes.Shuffle(name="Shuffle_"+channelLayer)
shuffles.append(shuffleNode.name())
shuffleNode.knob("in").setValue(channelLayer)
shuffleNode.setInput(0,readNode)
#auto crop if selected
if p.value("auto crop?")==True:
curveNode = nuke.nodes.CurveTool(name="Autocrop_"+channelLayer, inputs = [shuffleNode], operation="Auto Crop")
curveNode.knob("ROI").setValue([0,0,readNode.width(),readNode.height()])
nuke.execute(curveNode, readNode.knob("first").value(), readNode.knob("last").value())
cropNode = nuke.nodes.Crop(name="Crop_"+channelLayer, inputs = [curveNode])
cropNode.knob("hide_input").setValue(True)
cropNode.knob("box").copyAnimations(curveNode.knob("autocropdata").animations())
nuke.delete(curveNode)
cropNode.knob("postage_stamp").setValue(True)
#create folders for all layer and create write node for every shuffle
if p_renderLoc!=None:
renderTo = p_renderLoc.value("render to: ")
#createFolder
createFolders(renderTo+"/"+channelLayer)
#create write node
write = nuke.nodes.Write()
write.knob("file_type").setValue("exr")
write.knob("file").setValue(renderTo+channelLayer+"/"+channelLayer+"_%04d.exr")
write.knob("compression").setValue("Zip (16 scanlines)")
write.knob("channels").setValue("rgba")
if p.value("auto crop?")==True:
write.setInput(0,cropNode)
else:
write.setInput(0,shuffleNode)
else:
nuke.message("No read node selected")
#hide all created shuffle inputs
for shuffleNode in shuffles:
if p.value("auto crop?")==False:
temp = nuke.toNode(shuffleNode)
temp.knob("hide_input").setValue(True)
temp.knob("postage_stamp").setValue(True)
nuke.message("Finished shuffling channels and autocropping them")
else:
nuke.message("Please select a read node first")