Nessuna descrizione
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

sceneControl.py 66KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065
  1. from __future__ import print_function
  2. import os
  3. import os.path
  4. from os.path import abspath
  5. import nuke
  6. import KEnv
  7. import re
  8. from imp import reload
  9. from collections import OrderedDict
  10. # import ftrack_tools -> in getframerange(node)
  11. # martin@keller.io
  12. __version__ = '1.2'
  13. # default interface values
  14. projectDef = 'GEN'
  15. seasonDef = '01'
  16. episodeDef = '101'
  17. listTasks = ['taskOne___', 'taskTwo___']
  18. listDepts = ['departmentOne___', 'departmentTwo___']
  19. seqDef = ''
  20. shotDef = ''
  21. major_version = 1
  22. minor_version = 1
  23. user = 'xy'
  24. info = ''
  25. start = 1001
  26. cutIn = 1001
  27. cutOut = 1001
  28. end = 1001
  29. comment = ''
  30. # switches
  31. # generic project folder: //hades/p/_projekte/GENFOLDER
  32. GENFOLDER = 'GEN'
  33. INIT_DONE = False
  34. DEBUG = True
  35. UPDATE_TOOLSET = False
  36. WRITENODE_VERSION = 1.0
  37. USE_ENV_PROJECT_ROOT = 1
  38. WRITENODE_LABEL = 'exr compression: [value compression]'
  39. KELLERTABKNOBS = (
  40. 'extension', 'ext', 'ver', 'explore', 'divider3', 'playinrv', 'pushtorv', 'pushtorvappend', 'divider2', 'ignore',
  41. 'divider1', 'set',
  42. 'info', 'element', 'subtask', 'task', 'w_reload', 'useshotenv', 'keller')
  43. # globals
  44. sequenceGlobal=''
  45. shotGlobal=''
  46. # Plugin / commands
  47. class sceneControl(KellerNukePlugin):
  48. def configurePlugin(self):
  49. self.menu = nuke.menu('Nuke')
  50. m = self.menu.addMenu('SceneControl')
  51. m.addCommand('SceneControl', 'import sceneControl; sceneControl.createSceneControl()',shortcut='F12')
  52. m.addCommand('Increment Major', 'import sceneControl; sceneControl.increment_major_version()', tooltip='Increment Major version and save script.', shortcut='alt+shift+s')
  53. m.addCommand('Increment Minor', 'import sceneControl; sceneControl.increment_minor_version()', tooltip='Increment Minor version and save script.', shortcut='alt+s')
  54. m.addCommand('Reload Config', 'import sceneControl; sceneControl.kenvDelete()')
  55. m.addCommand('Helpers/Read/Set Missing Frames Mode', 'import sceneControl; sceneControl.setErrorMode()', tooltip='Sets the Error Mode on selected Read nodes.')
  56. m.addCommand('Helpers/Read/Set colorspace on Nodes', 'import sceneControl; sceneControl.setOcioRole()', tooltip='Sets the OCIO role on selected Read / Write nodes.')
  57. m.addCommand('Helpers/Read/Reload Reads', 'import sceneControl; sceneControl.refresh_read_nodes()', tooltip='Reload footage of selected Read / Write nodes.')
  58. #
  59. m.addCommand('Helpers/Write/Ignore selected Nodes', 'import sceneControl; sceneControl.setIgnoreFlag(True)')
  60. m.addCommand('Helpers/Write/Manage selected Nodes','import sceneControl; sceneControl.setIgnoreFlag(False)')
  61. m.addCommand('Helpers/Write/Set colorspace on Nodes', 'import sceneControl; sceneControl.setOcioRole()', tooltip='Sets the OCIO role on selected Read / Write nodes.')
  62. m.addCommand('Helpers/Write/Update Write Nodes Tab', 'import sceneControl; sceneControl.updateWriteNodeConfig()', tooltip='Updates Keller Tab and functions of selected write nodes.')
  63. m.addCommand('Helpers/Write/Remove Write Nodes Tab', 'import sceneControl; sceneControl.removeKellerTab()', tooltip='Removes Keller Tab on selected Write Nodes.')
  64. #internal
  65. m.addCommand('Debug/Enable Debug Mode', 'import sceneControl; sceneControl.setDebug(True)')
  66. m.addCommand('Debug/Disable Debug Mode', 'import sceneControl; sceneControl.setDebug(False)')
  67. m.addCommand('Debug/DeleteKEnv', 'import sceneControl; sceneControl.kenvDelete()')
  68. m.addCommand('Debug/Internal/ReloadTasks', 'import sceneControl; sceneControl.kenvReloadTasks()', index=10)
  69. #m.addCommand('Debug/Internal/GetRenderpath', 'import sceneControl; sceneControl.kenvGetRenderpath(task,element)', index=11)
  70. #m.addCommand('Debug/Internal/GetPreviewOutput', 'import sceneControl; sceneControl.kenvGetPreviewOutput()', index=12)
  71. m.addCommand('Debug/Internal/WriteNodeSetPath', 'import sceneControl; sceneControl.kenvWriteSetPath(writeNode)', index=13)
  72. m.addCommand('Debug/Internal/WriteNodeReloadTasks', 'import sceneControl; sceneControl.kenvWriteReloadTasks(writeNode)', index=14)
  73. m.addCommand('Debug/Internal/KEnvQuery', 'import sceneControl; sceneControl.kenvQuery(query,**kwargs)', index=15)
  74. # TODO: add command to delete keller tab.
  75. # TODO: remove the commands from the menu
  76. #m.findItem('Draw/ReloadTasks').setVisible(False)
  77. #m.findItem('Draw/GetRenderpath').setVisible(False)
  78. #m.findItem('Draw/WriteNodeSetPath').setVisible(False)
  79. #m.findItem('Draw/WriteNodeReloadTasks').setVisible(False)
  80. #
  81. nuke.addOnCreate(onCreateWrite, nodeClass=('Write'))
  82. nuke.addOnScriptLoad(onScriptLoad)
  83. nuke.addKnobChanged(onKnobChanged)
  84. nuke.addOnDestroy(onDestroy)
  85. def unconfigurePlugin(self):
  86. self.menu.removeItem('SceneControl')
  87. self.menu.removeItem('Increment Major')
  88. self.menu.removeItem('Increment Minor')
  89. self.menu.removeItem('Reload Config')
  90. self.menu.removeItem('Helpers/Read/Set Missing Frames Mode')
  91. self.menu.removeItem('Helpers/Read/Set colorspace on Nodes')
  92. self.menu.removeItem('Helpers/Read/Reload Reads')
  93. self.menu.removeItem('Helpers/Write/Ignore selected Nodes')
  94. self.menu.removeItem('Helpers/Write/Manage selected Nodes')
  95. self.menu.removeItem('Helpers/Write/Set colorspace on Nodes')
  96. self.menu.removeItem('Helpers/Write/Update Write Nodes Tab')
  97. self.menu.removeItem('Helpers/Write/Remove Write Nodes Tab')
  98. #
  99. self.menu.removeItem('Debug/Enable Debug Mode')
  100. self.menu.removeItem('Debug/Disable Debug Mode')
  101. self.menu.removeItem('Debug/DeleteKEnv')
  102. self.menu.removeItem('Debug/Internal/ReloadTasks')
  103. #self.menu.removeItem('Debug/Internal/GetRenderpath')
  104. #self.menu.removeItem('Debug/Internal/GetPreviewOutput')
  105. self.menu.removeItem('Debug/Internal/WriteNodeSetPath')
  106. self.menu.removeItem('Debug/Internal/WriteNodeReloadTasks')
  107. self.menu.removeItem('Debug/Internal/KEnvQuery')
  108. #
  109. nuke.removeOnCreate(onCreateWrite)
  110. nuke.removeOnScriptLoad(onScriptLoad)
  111. nuke.removeKnobChanged(onKnobChanged)
  112. nuke.removeOnDestroy(onDestroy)
  113. # EVENTS
  114. def onScriptLoad():
  115. sc = getSceneControl()
  116. if sc is None:
  117. createSceneControl()
  118. else:
  119. # SceneControl in script
  120. if kenvModuleLoaded():
  121. print('SceneControl: Info. Script Load. Generating KEnv environment...')
  122. initSceneControlValues(sc)
  123. # init shot
  124. set_shot()
  125. def onKnobChanged():
  126. # sceneControl ready
  127. k = nuke.thisKnob()
  128. refresh = ['project','dept','task','element','sequence','shot','major_version','minor_version','info','user','useEnvProjectRoot']
  129. task_refresh = ['dept','task']
  130. exr_compression = ['compression',]
  131. if k.name() in task_refresh:
  132. print('SceneControl: Info. Event task_refresh triggered.')
  133. # Department changed, loading new tasks
  134. kenvReloadTasks()
  135. if k.name() in refresh:
  136. print('SceneControl: Info. Event refresh triggered.')
  137. # Config changed, loading new tasks
  138. kenvGetWorkFile()
  139. pass
  140. # exr compression on write nodes
  141. if k.name() in exr_compression:
  142. # get the node
  143. n = nuke.thisNode()
  144. if k.value().startswith('Zip'):
  145. # % (r * 255, g * 255, b * 255, 1), 16): change r g and b to your liking
  146. hexColour = int('%02x%02x%02x%02x' % (184, 184, 0, 1), 16)
  147. n['tile_color'].setValue(hexColour)
  148. if k.value().startswith('DW'):
  149. # % (r * 255, g * 255, b * 255, 1), 16): change r g and b to your liking
  150. hexColour = int('%02x%02x%02x%02x' % (1 * 255, 0.666 * 255, 0.266 * 255, 1), 16)
  151. n['tile_color'].setValue(hexColour)
  152. def onCreateWrite():
  153. n = nuke.thisNode()
  154. createCustomWrite(n)
  155. return
  156. def onDestroy():
  157. print('SceneControl: Info. Nice meeting you. Removing Kenv now...')
  158. try:
  159. del(nuke.kenv)
  160. except:
  161. print('SceneControl: Info. KEnv was already gone.')
  162. # SceneControl
  163. def getSceneControl():
  164. c = nuke.exists('sceneCtrl')
  165. if c:
  166. sc = nuke.toNode('sceneCtrl')
  167. else:
  168. print('SceneControl: Error. No SceneControl node found. Creating one for you.')
  169. import sceneControl
  170. deselectAll()
  171. sceneControl.createSceneControl()
  172. sc = nuke.toNode('sceneCtrl')
  173. return sc
  174. def createSceneControl():
  175. # deselect all nodes
  176. deselectAll()
  177. # createUI
  178. print('SceneControl: Info. Creating SceneControl at Nuke root level.')
  179. #with nuke.root():
  180. # for calling from within groups
  181. try:
  182. nuke.thisParent().begin()
  183. except:
  184. pass
  185. scenecontrol = createSceneControlUI()
  186. # fill out
  187. kenvLoaded = kenvModuleLoaded()
  188. if kenvLoaded is not None:
  189. initSceneControlValues(scenecontrol)
  190. pass
  191. else:
  192. pass
  193. sc = nuke.toNode('sceneCtrl')
  194. # Init done. Callbacks now armed.
  195. global INIT_DONE
  196. INIT_DONE = True
  197. # touch
  198. sc.knobs()['major_version'].setValue(0)
  199. sc.knobs()['major_version'].setValue(1)
  200. try:
  201. nuke.thisParent().end()
  202. except:
  203. pass
  204. return sc
  205. def createSceneControlUI():
  206. n = nuke.Node('NoOp')
  207. n.setName('sceneCtrl')
  208. n['hide_input'].setValue(True)
  209. # % (r * 255, g * 255, b * 255, 1), 16): change r g and b to your liking
  210. hexColour = int('%02x%02x%02x%02x' % (0.2 * 255, 0.478 * 255, 0.647 * 255, 1), 16)
  211. n['tile_color'].setValue(hexColour)
  212. n['label'].setValue('_\n__')
  213. # ###########################
  214. # ---------------------------
  215. # tab main
  216. # ---------------------------
  217. # ###########################
  218. k = nuke.Tab_Knob('main', 'Main')
  219. n.addKnob(k)
  220. # Project
  221. k = nuke.String_Knob('project', 'Project')
  222. k.setTooltip('Project Shortname')
  223. n.addKnob(k)
  224. n.knob('project').setValue(projectDef)
  225. n.knob('project').setFlag(nuke.STARTLINE)
  226. # Department
  227. k = nuke.Enumeration_Knob('dept', 'Dept', listDepts)
  228. k.setTooltip('Department. Changes tasks and servers.')
  229. n.addKnob(k)
  230. n.knob('dept').clearFlag(nuke.STARTLINE)
  231. # Task
  232. k = nuke.Enumeration_Knob('task', 'Task', listTasks)
  233. n.addKnob(k)
  234. n.knob('task').clearFlag(nuke.STARTLINE)
  235. k = nuke.String_Knob('element', 'Element')
  236. k.setTooltip('Optional Element.')
  237. n.addKnob(k)
  238. n.knob('element').setValue('')
  239. n.knob('element').clearFlag(nuke.STARTLINE)
  240. # Update from KEnv
  241. k = nuke.PyScript_Knob('reloadConfig', 'Reload', 'sceneControl.kenvDelete()')
  242. k.setTooltip('Reload project config file.')
  243. n.addKnob(k)
  244. # Season
  245. k = nuke.String_Knob('season', 'Season')
  246. n.addKnob(k)
  247. n.knob('season').setValue(seasonDef)
  248. n.knob('season').setVisible(False)
  249. # Episode
  250. k = nuke.String_Knob('episode', 'Episode')
  251. n.addKnob(k)
  252. n.knob('episode').setValue(episodeDef)
  253. n.knob('episode').setVisible(False)
  254. # _______________________________________________________________
  255. k = nuke.Text_Knob('divider1', '')
  256. n.addKnob(k)
  257. # _______________________________________________________________
  258. # Sequence
  259. k = nuke.String_Knob('sequence', 'Seq')
  260. k.setTooltip(
  261. 'can be a sequence number or gen when doing generic tasks.\n\ncomp_001_010.comp_v01.ms.nk\ncomp_gen.footageIngest_v01.ms.nk')
  262. n.addKnob(k)
  263. n.knob('sequence').setValue(seqDef)
  264. # Shot
  265. k = nuke.String_Knob('shot', 'Shot')
  266. k.setTooltip(
  267. 'can be a shot number or gen in a multiShot context.\n\ncomp_001_010.comp_v01.ms.nk\ncomp_001_gen.comp_v01.ms.nk')
  268. n.addKnob(k)
  269. n.knob('shot').setValue(shotDef)
  270. n.knob('shot').clearFlag(nuke.STARTLINE)
  271. # Major Version
  272. k = nuke.Int_Knob('major_version', 'Major')
  273. n.addKnob(k)
  274. k.setTooltip('Increment Major Version and save script')
  275. n.knob('major_version').setValue(major_version)
  276. k = nuke.PyScript_Knob('increment_major_version', '+', 'sceneControl.increment_major_version()')
  277. n.addKnob(k)
  278. # Minor Version
  279. k = nuke.Int_Knob('minor_version', 'Minor')
  280. n.addKnob(k)
  281. k.setTooltip('Increment Minor Version and save script')
  282. n.knob('minor_version').setValue(minor_version)
  283. n.knob('minor_version').clearFlag(nuke.STARTLINE)
  284. k = nuke.PyScript_Knob('increment_minor_version', '+', 'sceneControl.increment_minor_version()')
  285. n.addKnob(k)
  286. # Save
  287. k = nuke.PyScript_Knob('save_script', 'Save', 'sceneControl.save_script()')
  288. k.setTooltip('Save Script with current Major and Minor')
  289. n.addKnob(k)
  290. # Overwrite
  291. k = nuke.Boolean_Knob('overwrite', 'Overwrite')
  292. k.setTooltip('Automatically overwrite Scriptfiles without asking.')
  293. n.addKnob(k)
  294. n.knob('overwrite').setValue(0)
  295. n.knob('overwrite').setVisible(True)
  296. # Info / Comment
  297. k = nuke.String_Knob('info', 'Info')
  298. k.setTooltip('Additional (mandatory) File Info.')
  299. n.addKnob(k)
  300. n.knob('info').setValue(info)
  301. # User Short
  302. k = nuke.String_Knob('user', 'User')
  303. n.addKnob(k)
  304. k.setTooltip('User Short. Reading Env Variable: USER')
  305. n.knob('user').setValue(user)
  306. n.knob('user').clearFlag(nuke.STARTLINE)
  307. # Divider _______________________________________________________________
  308. k = nuke.Text_Knob('divider2', '')
  309. n.addKnob(k)
  310. # _______________________________________________________________
  311. # Foldername preview
  312. k = nuke.String_Knob('folder', 'Folder')
  313. n.addKnob(k)
  314. n.knob('folder').setValue('')
  315. n.knob('folder').setEnabled(False)
  316. k.setTooltip('Save folder Preview.')
  317. # Foldername preview
  318. k = nuke.Boolean_Knob('useEnvProjectRoot', 'Use Env Project Root')
  319. n.addKnob(k)
  320. n.knob('useEnvProjectRoot').setValue(USE_ENV_PROJECT_ROOT)
  321. k.setTooltip('Use env variables for 2d and 3d servers set in the site_config.\nUse these env variables before nuke startup.')
  322. n.knob('useEnvProjectRoot').clearFlag(nuke.STARTLINE)
  323. # Filename preview
  324. k = nuke.String_Knob('file', 'File')
  325. n.addKnob(k)
  326. n.knob('file').setValue('')
  327. n.knob('file').setEnabled(False)
  328. k.setTooltip('Save file Preview.')
  329. # Divider _______________________________________________________________
  330. k = nuke.Text_Knob('divider3', '')
  331. n.addKnob(k)
  332. # _______________________________________________________________
  333. # FrameStart
  334. k = nuke.Int_Knob('fStart', 'Start')
  335. n.addKnob(k)
  336. k.setTooltip('Startframe')
  337. n.knob('fStart').setValue(start)
  338. # FrameCutIn
  339. k = nuke.Int_Knob('fCutIn', 'CutIn')
  340. n.addKnob(k)
  341. k.setTooltip('CutIn')
  342. n.knob('fCutIn').setValue(cutIn)
  343. n.knob('fCutIn').clearFlag(nuke.STARTLINE)
  344. # FrameCutOut
  345. k = nuke.Int_Knob('fCutOut', 'CutOut')
  346. n.addKnob(k)
  347. k.setTooltip('CutOut')
  348. n.knob('fCutOut').setValue(cutOut)
  349. n.knob('fCutOut').clearFlag(nuke.STARTLINE)
  350. # FrameEnd
  351. k = nuke.Int_Knob('fEnd', 'End')
  352. n.addKnob(k)
  353. k.setTooltip('Endframe')
  354. n.knob('fEnd').setValue(end)
  355. n.knob('fEnd').clearFlag(nuke.STARTLINE)
  356. # Button Get Framerange (ftrack)
  357. k = nuke.PyScript_Knob('get_framerange', 'Get Range', 'sceneControl.get_framerange(nuke.thisNode())')
  358. n.addKnob(k)
  359. n.knob('get_framerange').setTooltip('Get Framerange from FTrack.\nPlease check you firewall rules and and allow ftrack ip 104.155.3.128 on port 443')
  360. # Button Set Framerange
  361. k = nuke.PyScript_Knob('set_framerange', 'Set Range', 'sceneControl.set_framerange(nuke.thisNode())')
  362. n.addKnob(k)
  363. n.knob('set_framerange').setTooltip('Set Framerange from SceneControl Interface')
  364. n.knob('set_framerange').clearFlag(nuke.STARTLINE)
  365. # Comment
  366. k = nuke.Multiline_Eval_String_Knob('comment', 'Comment')
  367. n.addKnob(k)
  368. n.knob('comment').setValue(comment)
  369. # Update / publish
  370. if UPDATE_TOOLSET:
  371. # Button update Layer
  372. k = nuke.PyScript_Knob('update_layer', 'Update Layer', 'sceneControl.update_layer()')
  373. n.addKnob(k)
  374. n.knob('update_layer').setFlag(nuke.STARTLINE)
  375. # Button connect all Layers
  376. k = nuke.PyScript_Knob('autoconnect_layers', 'Connect Layers', 'sceneControl.autoconnect_layers(nuke.thisNode())')
  377. n.addKnob(k)
  378. n.knob('autoconnect_layers').setFlag(nuke.STARTLINE)
  379. # Button remove all layers
  380. k = nuke.PyScript_Knob('remove_all_layers', 'Remove All Layers', 'sceneControl.remove_all_layers(nuke.thisNode())')
  381. n.addKnob(k)
  382. n.knob('remove_all_layers').setTooltip('Removes all Layers in SceneControl.')
  383. # Button delete all reads
  384. k = nuke.PyScript_Knob('remove_scnctrl_reads', 'Delete All Reads',
  385. 'sceneControl.remove_scnctrl_reads(nuke.thisNode())')
  386. n.addKnob(k)
  387. n.knob('remove_scnctrl_reads').setTooltip('Deletes all reads created by SceneControl.')
  388. n.knob('remove_scnctrl_reads').setFlag(nuke.STARTLINE)
  389. n.knob('remove_scnctrl_reads').setVisible(False)
  390. # Button publish Shot
  391. k = nuke.PyScript_Knob('publish_shot', 'Publish', 'sceneControl.publish_shot()')
  392. n.addKnob(k)
  393. n.knob('publish_shot').setFlag(nuke.STARTLINE)
  394. # invisible helpers
  395. # helper
  396. k = nuke.Int_Knob('layerNum', 'Slots')
  397. n.addKnob(k)
  398. n.knob('layerNum').setValue(0)
  399. n.knob('layerNum').setVisible(False)
  400. # used for resolving expressions
  401. k = nuke.EvalString_Knob('eval_helper', 'eval_helper')
  402. n.addKnob(k)
  403. n.knob('eval_helper').setValue('')
  404. n.knob('eval_helper').setVisible(False)
  405. # for debug disable above
  406. k = nuke.Boolean_Knob('stereoToggle', 'Stereo Toggle')
  407. n.addKnob(k)
  408. n.knob('stereoToggle').setValue(0)
  409. n.knob('stereoToggle').setVisible(False)
  410. # used for resolving expressions
  411. k = nuke.EvalString_Knob('precomp_output', 'Precomp Output')
  412. n.addKnob(k)
  413. n.knob('precomp_output').setValue('')
  414. n.knob('precomp_output').setVisible(False)
  415. # for debug disable above
  416. k = nuke.Boolean_Knob('debug', 'Debug')
  417. n.addKnob(k)
  418. n.knob('debug').setValue(1)
  419. n.knob('debug').setVisible(False)
  420. # end helper
  421. # return sceneControl Object
  422. sc = nuke.toNode(n.name())
  423. return sc
  424. def initSceneControlValues(sceneControl):
  425. if sceneControl is not None:
  426. k = sceneControl.knobs()
  427. # debug
  428. k['debug'].setValue(DEBUG)
  429. proj = checkEnvEntry('PROJECT')
  430. if proj is None:
  431. proj = GENFOLDER
  432. kenvReloadTasks()
  433. proj = checkEnvEntry('PROJECT')
  434. k['project'].setValue(proj)
  435. try:
  436. k['user'].setValue(checkEnvEntry('USER'))
  437. except:
  438. print('SceneControl: Warning. Please enter your shortname.')
  439. # export Sequence and Shot Environment variables
  440. exportEnv()
  441. # KEnv functions
  442. def kenvCheck():
  443. try:
  444. nuke.kenv
  445. except:
  446. kenvCreate()
  447. print('SceneControl: Info. Creating kenv.')
  448. def kenvModuleLoaded():
  449. from imp import reload
  450. try:
  451. import KEnv
  452. reload(KEnv)
  453. except:
  454. print('SceneControl: Error. No KEnv module found')
  455. return False
  456. return KEnv
  457. def kenvCreate():
  458. try:
  459. project = os.environ['PROJECT']
  460. except:
  461. project = GENFOLDER
  462. # KEnv
  463. env = KEnv.create(PROJECT=project, APP_ID='nuke')
  464. # save KEnv to Nuke to access if by other nodes / tools
  465. nuke.kenv = env
  466. def kenvDelete():
  467. try:
  468. del(nuke.kenv)
  469. print('SceneControl: Info. Deleting nuke.kenv.')
  470. except:
  471. print('SceneControl: Info. nuke.kenv not found.')
  472. def kenvReloadTasks():
  473. sceneControl = getSceneControl()
  474. k = sceneControl.knobs()
  475. kenvCheck()
  476. # KEnv query
  477. dept = nuke.kenv.get('DEPARTMENTS')
  478. k['dept'].setValues(dept)
  479. tasks = nuke.kenv.get('TASKS', DEPT=k['dept'].value(), APP_ID='nuke')
  480. k['task'].setValues(tasks)
  481. return tasks
  482. def kenvGetWriteOutput(writeTask, writeElement, writeInfo, ext):
  483. sceneControl = getSceneControl()
  484. k = sceneControl.knobs()
  485. kenvCheck()
  486. # debug
  487. if k['debug'].getValue():
  488. print(('SceneControl: Debug. WriteTask: %s, WriteElement: %s, WriteInfo: %s') % (writeTask, writeElement, writeInfo))
  489. # useEnvProjectRoot
  490. useEnv = k['useEnvProjectRoot'].value()
  491. if writeElement == '':
  492. writeElement = None
  493. if writeInfo == '':
  494. writeInfo = None
  495. if writeTask.lower() == 'scripttask':
  496. # get task from sceneControl and not from the write node
  497. # sceneControl task
  498. task = k['task'].value()
  499. writeTask = task
  500. # KEnv query
  501. renderpath = kenvQuery('RENDER_2D_FILE', element=writeElement, task=writeTask, minor_version=None, info=writeInfo, ext=ext, USE_ENV_PROJECTROOT=useEnv)
  502. else:
  503. # KEnv query
  504. renderpath = kenvQuery('PRECOMP_FILE', element=writeElement, task=writeTask, minor_version=None, info=writeInfo, ext=ext, USE_ENV_PROJECTROOT=useEnv)
  505. return renderpath
  506. def kenvGetWorkFile():
  507. sceneControl = getSceneControl()
  508. k = sceneControl.knobs()
  509. kenvCheck()
  510. info = k['info'].value()
  511. if info == '':
  512. info = None
  513. element = k['element'].value()
  514. if element == '':
  515. element = None
  516. # KEnv query
  517. script = kenvQuery('WORK_FILE', element=element, info=info)
  518. dir = kenvQuery('WORK_DIR', element=element, info=info)
  519. try:
  520. k['folder'].setValue(dir+'/')
  521. except:
  522. print(('SceneControl: Error. Error setting directory: %s') % dir)
  523. try:
  524. k['file'].setValue(script.split('/')[-1])
  525. except:
  526. print(('SceneControl: Error. Error setting file: %s') % script)
  527. # main Kenv Query
  528. def kenvQuery(query , **kwargs):
  529. # sceneControl
  530. sceneControl = getSceneControl()
  531. k = sceneControl.knobs()
  532. kenvCheck()
  533. # sceneControl values:
  534. debug = k['debug'].getValue()
  535. project = k['project'].value()
  536. dept = k['dept'].value()
  537. sequence = k['sequence'].value()
  538. shot = k['shot'].value()
  539. element = k['element'].value()
  540. task = k['task'].value()
  541. major_version = int(k['major_version'].value())
  542. minor_version = int(k['minor_version'].value())
  543. user = k['user'].value()
  544. info = k['info'].value()
  545. ext = 'exr'
  546. app_id = 'nuke'
  547. # useEnvProjectRoot
  548. useEnv = k['useEnvProjectRoot'].value()
  549. # read out kwargs
  550. for k,v in kwargs.items():
  551. if k == 'project':
  552. project = v
  553. if k == 'dept':
  554. dept = v
  555. if k == 'sequence':
  556. sequence = v
  557. if k == 'shot':
  558. shot = v
  559. if k == 'element':
  560. element = v
  561. if k == 'task':
  562. task = v
  563. if k == 'major_version':
  564. major_version = v
  565. if k == 'minor_version':
  566. minor_version = v
  567. if k == 'user':
  568. user = v
  569. if k == 'info':
  570. info = v
  571. if k == 'ext':
  572. ext = v
  573. if k == 'app_id':
  574. app_id = v
  575. if k == 'useEnv':
  576. useEnv = v
  577. # info
  578. infostr=''
  579. if info == '':
  580. info = None
  581. infostr = 'None'
  582. # element
  583. elementstr=''
  584. if element == '':
  585. element = None
  586. elementstr = 'None'
  587. # debug
  588. if debug:
  589. print('SceneControl: Debug kenv query:')
  590. print('PROJECT: ' + project)
  591. print('SHOT: ' + shot)
  592. print('SEQUENCE: ' + sequence)
  593. print('DEPT: ' + dept)
  594. print('TASK: ' + task)
  595. print('MAJOR_VERSION: ' + str(int(major_version)))
  596. if minor_version is None:
  597. print('MINOR_VERSION: ' + 'None')
  598. else:
  599. print('MINOR_VERSION: ' + str(int(minor_version)))
  600. print('ELEMENT: ' + elementstr)
  601. print('INFO: ' + infostr)
  602. print('USER: ' + user)
  603. print('EXT: ' + ext)
  604. print('APP_ID: ' + app_id)
  605. # KEnv
  606. if minor_version is None:
  607. result = nuke.kenv.get(query, PROJECT=project, DEPT=dept, SEQUENCE=sequence, SHOT=shot, ELEMENT=element, TASK=task, MAJOR_VERSION=int(major_version), INFO=info, EXT=ext, USER=user, APP_ID=app_id, USE_ENV_PROJECTROOT=useEnv)
  608. else:
  609. result = nuke.kenv.get(query, PROJECT=project, DEPT=dept, SEQUENCE=sequence, SHOT=shot, ELEMENT=element, TASK=task, MAJOR_VERSION=int(major_version), MINOR_VERSION=int(minor_version), INFO=info, EXT=ext, USER=user, APP_ID=app_id, USE_ENV_PROJECTROOT=useEnv)
  610. if debug:
  611. print('SceneControl: Debug kenv query: ' + result)
  612. return result
  613. # called from write nodes
  614. def kenvWriteSetPath(n):
  615. print('Our_Write: Info. Setting output file path')
  616. sceneControl = getSceneControl()
  617. k = sceneControl.knobs()
  618. kenvCheck()
  619. #debug
  620. if k['debug'].getValue():
  621. print(('SceneControl: Debug. Setting path on: %s') % n.name())
  622. subtask = n.knob('subtask').value()
  623. if subtask is None:
  624. subtask = ''
  625. element = n.knob('element').value()
  626. if element == '':
  627. element = None
  628. info = n.knob('info').value()
  629. if info == '':
  630. info = None
  631. ext = n.knob('extension').value()
  632. # dummy
  633. file = ''
  634. file = kenvGetWriteOutput(subtask, element, info, ext)
  635. if file != '':
  636. try:
  637. n.knob('file').setValue(file)
  638. except:
  639. pass
  640. return
  641. def kenvWriteReloadSubTasks(n):
  642. sceneControl = getSceneControl()
  643. kenvCheck()
  644. # KEnv query
  645. tasks = nuke.kenv.get('SUBTASKS_2D')
  646. try:
  647. n.knob('subtask').setValues(tasks)
  648. except:
  649. pass
  650. return
  651. # helpers
  652. # todo: set selected Reads to framerange
  653. def setIgnoreFlag(state):
  654. s = nuke.selectedNodes()
  655. if len(s) == 0:
  656. nuke.message('Please select some Nodes first.')
  657. return
  658. for n in s:
  659. if n.Class() == 'Write' or n.Class() == 'DeepWrite':
  660. try:
  661. n.knobs()['ignore'].setValue(state)
  662. except:
  663. print(('SceneControl: Warning. Cannot find ignore flag on: %s') % n.name())
  664. def setErrorMode():
  665. n = nuke.selectedNodes()
  666. if len(n) == 0:
  667. nuke.message('Please select some Nodes first.')
  668. return
  669. w = nuke.nodes.Read()
  670. onerror = w['on_error'].values()
  671. # spaces in the names
  672. quoted = ['{%s}' % c for c in onerror]
  673. p = nuke.Panel('Missing Frames')
  674. p.addEnumerationPulldown('Missing Frames', ' '.join(quoted))
  675. p.show()
  676. ret = p.value('Missing Frames')
  677. sel = nuke.selectedNodes()
  678. for s in sel:
  679. if s.Class() == 'Read' or s.Class() == 'DeepRead':
  680. s.knobs()['on_error'].setValue(ret)
  681. def setOcioRole():
  682. n = nuke.selectedNodes()
  683. if len(n) == 0:
  684. nuke.message('No node(s) selected.')
  685. # create temporary write node
  686. w = nuke.nodes.Write(file_type='exr')
  687. colorspace = w['colorspace'].values()
  688. # delete write node
  689. nuke.delete(w)
  690. choice = []
  691. for s in colorspace:
  692. if not s.startswith('Colorspaces/'):
  693. choice.append(s.split('\t')[0])
  694. else:
  695. choice.append(s)
  696. # spaces in the names
  697. quoted = ['{%s}' % c for c in choice]
  698. # TODO: create cascading Enumeration pulldown. Not possible with panel?
  699. p = nuke.Panel('Colorspace')
  700. p.addEnumerationPulldown('Colorspace', ' '.join(quoted))
  701. p.show()
  702. ret = p.value('Colorspace')
  703. if ret is not None:
  704. for s in n:
  705. if s.Class() == 'Read' or s.Class() == 'Write':
  706. s.knobs()['colorspace'].setValue(ret)
  707. def setDebug(state):
  708. sceneControl = getSceneControl()
  709. if sceneControl is None:
  710. print('SceneControl: Error. No SceneControl node found. Exiting.')
  711. return
  712. k = sceneControl.knobs()
  713. k['debug'].setValue(state)
  714. if state is False:
  715. print('SceneControl: Info. Set SceneControl Debug Mode to: False')
  716. else:
  717. print('SceneControl: Info. Set SceneControl Debug Mode to: True')
  718. def deselectAll():
  719. for each in nuke.allNodes():
  720. each.knob('selected').setValue(False)
  721. return
  722. def getFilename():
  723. return nuke.Root()['name'].getValue()
  724. def find_node_by_type(nodename, nodeclass):
  725. nodes = nuke.allNodes()
  726. for n in nodes:
  727. if n.Class() == nodeclass:
  728. if n.knob('label').getValue().lower() == nodename.lower():
  729. return n
  730. return None
  731. def updateWriteNodePaths():
  732. nodes = nuke.allNodes()
  733. for n in nodes:
  734. if n.Class() == 'Write' or n.Class() == 'DeepWrite':
  735. try:
  736. if n.knobs()['ignore'].value() == True:
  737. print('SceneControl: Info. Found ignore flag on %s. Skipping.' % n.name())
  738. else:
  739. try:
  740. print('SceneControl: Info. Setting output file on %s.' % n.name())
  741. nuke.toNode(n.name()).knobs()['set'].execute()
  742. except:
  743. print('SceneControl: Error. Error setting output file on %s.' % n.name())
  744. except:
  745. print ('SceneControl: Info. Skipping Node %s. Old Write Node. Consider creating a new one.' % n.name())
  746. def updateWriteNodeConfig():
  747. # TODO: more automated update function.
  748. import sceneControl
  749. # save these for reapplying later on
  750. saveKnobs = ('info', 'element', 'subtask', 'ignore')
  751. # get all reads
  752. nodes = [node for node in nuke.selectedNodes() if node.Class() == 'Write']
  753. if len(nodes) >0:
  754. for n in nodes:
  755. knobs = n.knobs()
  756. # save config
  757. try:
  758. info = knobs['info'].value()
  759. element = knobs['element'].value()
  760. subtask = knobs['subtask'].value()
  761. ignore = knobs['ignore'].value()
  762. except:
  763. pass
  764. for c in KELLERTABKNOBS:
  765. try:
  766. n.removeKnob(knobs[c])
  767. except:
  768. pass
  769. # create new Keller tab
  770. sceneControl.createCustomWrite(n)
  771. # refresh subtasks
  772. sceneControl.kenvWriteReloadSubTasks(n)
  773. # restore old values
  774. try:
  775. n.knobs()['info'].setValue(info)
  776. except:
  777. print('SceneControl: Error. Node %s. Cannot set value on knob: %s') % (n.name(), info)
  778. try:
  779. n.knobs()['element'].setValue(element)
  780. except:
  781. print('SceneControl: Error. Node %s. Cannot set value on knob: %s') % (n.name(), element)
  782. try:
  783. n.knobs()['subtask'].setValue(subtask)
  784. except:
  785. print('SceneControl: Error. Node %s. Cannot set value on knob: %s') % (n.name(), subtask)
  786. else:
  787. pass
  788. return
  789. def removeKellerTab():
  790. # get all reads
  791. nodes = [node for node in nuke.selectedNodes() if node.Class() == 'Write']
  792. if len(nodes) >0:
  793. for n in nodes:
  794. knobs = n.knobs()
  795. # save config
  796. try:
  797. info = knobs['info'].value()
  798. element = knobs['element'].value()
  799. subtask = knobs['subtask'].value()
  800. ignore = knobs['ignore'].value()
  801. except:
  802. pass
  803. for c in KELLERTABKNOBS:
  804. try:
  805. n.removeKnob(knobs[c])
  806. except:
  807. pass
  808. else:
  809. pass
  810. return
  811. def refresh_read_nodes():
  812. nodes = nuke.selectedNodes()
  813. if len(nodes)==0:
  814. nodes = nuke.allNodes()
  815. print('SceneControl: Info. No node selected. Reloading all reads.')
  816. for n in nodes:
  817. if n.Class() == 'Read' or n.Class() == 'DeepRead':
  818. try:
  819. nuke.toNode(n.name()).knobs()['reload'].execute()
  820. print('SceneControl: Info. Reloading %s.' % n.name())
  821. except:
  822. pass
  823. def autoconnect_layers(node):
  824. n = nuke.thisNode()
  825. nu = n['layerNum'].getValue()
  826. num = int(nu)
  827. for i in range(1, num + 1):
  828. create_deepreadnode(i, autoconnect=True)
  829. create_readnode(i, autoconnect=True)
  830. return
  831. def checkEnvEntry(value):
  832. try:
  833. val = os.environ[value]
  834. except:
  835. print(('SceneControl: Info. Env variable %s not set.') %value)
  836. return None
  837. return val
  838. def exportEnv():
  839. sceneControl = getSceneControl()
  840. k = sceneControl.knobs()
  841. project = k['project'].value()
  842. if project == '':
  843. project = 'None'
  844. # temp
  845. if project == 'HOTZ':
  846. project = 'HOT'
  847. sequence = k['sequence'].value()
  848. if sequence == '':
  849. sequence = 'None'
  850. shot = k['shot'].value()
  851. if shot == '':
  852. shot = 'None'
  853. os.environ['JOB'] = str(project)
  854. os.environ['PREFIX'] = str(project) # houdini world
  855. os.environ['SEQUENCE'] = str(sequence)
  856. os.environ['SEQ'] = str(sequence) # houdini world
  857. os.environ['SHOT'] = str(shot)
  858. print('SceneControl: Info. Exported Env Variables SEQUENCE: {0} and SHOT: {1}'.format(sequence,shot))
  859. return
  860. def set_shot():
  861. global sequenceGlobal
  862. global shotGlobal
  863. envExportNeeded = False
  864. sceneControl = getSceneControl()
  865. k = sceneControl.knobs()
  866. # sequence
  867. sequence = k['sequence'].value()
  868. if sequence != 'gen' and sequence !='':
  869. if sequence != sequenceGlobal:
  870. print('SceneControl: Info. Env Export needed')
  871. envExportNeeded = True
  872. # new sequence
  873. sequenceGlobal = sequence
  874. # shot
  875. shot = k['shot'].value()
  876. if shot != 'gen' and shot !='':
  877. if shot != shotGlobal:
  878. print('SceneControl: Info. Env Export needed')
  879. envExportNeeded = True
  880. # new sequence
  881. shotGlobal = shot
  882. # sequence and or shot changed
  883. if envExportNeeded:
  884. # export sequence and shot
  885. exportEnv()
  886. # refresh ocio config
  887. print('SceneControl: Info. Reloading ocio config.')
  888. try:
  889. v = nuke.ViewerProcess.node().knob('view').getValue()
  890. # reset viewer to default project viewerprocess
  891. nuke.ViewerProcess.node().knob('view').setValue(0)
  892. except:
  893. # empty script without viewer...
  894. pass
  895. # reload ocio config
  896. nuke.root().knobs()['reloadConfig'].execute()
  897. try:
  898. # set viewerProcess back
  899. nuke.ViewerProcess.node().knob('view').setValue(int(v))
  900. except:
  901. # empty script without viewer...
  902. pass
  903. # write nodes
  904. def createCustomWrite(n):
  905. # Task
  906. '''
  907. taskList = ('comp',)
  908. try:
  909. taskList = sceneControl.kenvReloadTasks()
  910. except:
  911. print('Our_Write: Error. Cannot call sceneControl.kenvReloadTasks()')
  912. pass
  913. '''
  914. try:
  915. tab = n.knobs()['keller'].value()
  916. except:
  917. tab = None
  918. if tab is None:
  919. pass
  920. else:
  921. # already existing
  922. return
  923. # check element
  924. import sceneControl
  925. sceneControl = sceneControl.getSceneControl()
  926. element = sceneControl.knobs()['element'].value()
  927. # create tab
  928. print('Our_Write: Info. Creating KellerTab')
  929. k = nuke.Tab_Knob('keller', 'Keller')
  930. n.addKnob(k)
  931. exts = n.knobs()['file_type'].values()
  932. k = nuke.Enumeration_Knob('extension', 'Extension', exts)
  933. n.addKnob(k)
  934. n.knob('extension').setValue('exr')
  935. n.knob('extension').setFlag(nuke.STARTLINE)
  936. # task
  937. subTaskList = ('--------------->',)
  938. k = nuke.Enumeration_Knob('subtask', 'Subtask', subTaskList)
  939. k.setTooltip('Defaults to the Task selected in sceneControl, ignoring Element and Info.\nAll other subtasks are pre-renders and get rendered into the precomp (=prerender) directory.')
  940. n.addKnob(k)
  941. n.knob('subtask').setFlag(nuke.STARTLINE)
  942. # Reload
  943. k = nuke.PyScript_Knob('w_reload', 'Reload', 'sceneControl.kenvWriteReloadSubTasks(nuke.thisNode())')
  944. k.setTooltip('Reloads the subtasks. If the project_config.py was changed you need to re-init the config with the SceneControl button \'reload\'.')
  945. k.setTooltip('Reload Tasks')
  946. n.addKnob(k)
  947. # element
  948. k = nuke.String_Knob('element', 'Element')
  949. k.setTooltip('Optional Specifier. For example [BG]_denoise. [FG]_denoise.')
  950. n.addKnob(k)
  951. # if element is in sceneControl
  952. n.knob('element').setValue(element)
  953. # info
  954. k = nuke.String_Knob('info', 'Info')
  955. k.setTooltip('Optional Info before Framenumber.\nPRO_comp3d_001_010.comp3d_v008.[acescg].%04d.exr')
  956. n.addKnob(k)
  957. n.knob('info').setValue('')
  958. # set
  959. k = nuke.PyScript_Knob('set', 'Set', 'sceneControl.kenvWriteSetPath(nuke.thisNode())')
  960. k.setTooltip('Set Output Path of this node')
  961. n.addKnob(k)
  962. n.knob('set').setFlag(nuke.STARTLINE)
  963. # _______________________________________________________________
  964. k = nuke.Text_Knob('divider1', '')
  965. n.addKnob(k)
  966. # _______________________________________________________________
  967. # ignore
  968. k = nuke.Boolean_Knob('ignore', 'ignore in sceneControl')
  969. n.addKnob(k)
  970. n.knob('ignore').setValue(0)
  971. # _______________________________________________________________
  972. k = nuke.Text_Knob('divider2', '')
  973. n.addKnob(k)
  974. # _______________________________________________________________
  975. # play in new rv
  976. k = nuke.PyScript_Knob('playinrv', 'Play in RV', 'playInRV.playInRV(nuke.thisNode(),0)')
  977. n.addKnob(k)
  978. n.knob('playinrv').setTooltip('Opens new instance of RV')
  979. n.knob('playinrv').setFlag(nuke.STARTLINE)
  980. # push to rv
  981. k = nuke.PyScript_Knob('pushtorv', 'Push to RV', 'playInRV.playInRV(nuke.thisNode(),1)')
  982. n.addKnob(k)
  983. n.knob('pushtorv').setTooltip('Push to tagged RV. Will open RV and uses this instance to directly push sequences.')
  984. # push to rv / append
  985. k = nuke.PyScript_Knob('pushtorvappend', 'Push to RV (append)', 'playInRV.playInRV(nuke.thisNode(),2)')
  986. n.addKnob(k)
  987. n.knob('pushtorvappend').setTooltip('Push to RV and append to existing sources')
  988. n.knob("pushtorvappend").clearFlag(nuke.STARTLINE)
  989. k = nuke.Boolean_Knob("useshotenv", "use shot env")
  990. n.addKnob(k)
  991. n.knob("useshotenv").setTooltip("Use Sequence and Shot Env entries in order for RV to load shot specific configs.")
  992. n.knob("useshotenv").setValue(1)
  993. # _______________________________________________________________
  994. k = nuke.Text_Knob("divider3", "")
  995. n.addKnob(k)
  996. # _______________________________________________________________
  997. # explore
  998. k = nuke.PyScript_Knob("explore", "Explore", "exploreThis.exploreThis()")
  999. n.addKnob(k)
  1000. n.knob("explore").setTooltip("Open Folder")
  1001. # version
  1002. k = nuke.Array_Knob("ver", "Version")
  1003. n.addKnob(k)
  1004. n.knob("ver").setValue(WRITENODE_VERSION)
  1005. n.knob("ver").setVisible(False)
  1006. # label
  1007. if n.knob("label").value() != "":
  1008. n.knob("label").setValue('\n' + WRITENODE_LABEL)
  1009. else:
  1010. n.knob("label").setValue(WRITENODE_LABEL)
  1011. n.knob('file_type').setValue('exr')
  1012. k = n.knob('compression')
  1013. if k.value().startswith('Zip'):
  1014. # % (r * 255, g * 255, b * 255, 1), 16): change r g and b to your liking
  1015. hexColour = int('%02x%02x%02x%02x' % (184, 184, 0, 1), 16)
  1016. n['tile_color'].setValue(hexColour)
  1017. if k.value().startswith('DW'):
  1018. # % (r * 255, g * 255, b * 255, 1), 16): change r g and b to your liking
  1019. hexColour = int('%02x%02x%02x%02x' % (1 * 255, 0.666 * 255, 0.266 * 255, 1), 16)
  1020. n['tile_color'].setValue(hexColour)
  1021. # saving
  1022. def save_script():
  1023. sceneControl = getSceneControl()
  1024. k = sceneControl.knobs()
  1025. # overwrite existing scene without notice?
  1026. owrite = k['overwrite'].value()
  1027. # info
  1028. info = k['info'].value()
  1029. if info == '':
  1030. info = None
  1031. # element
  1032. element = k['element'].value()
  1033. if element == '':
  1034. element = None
  1035. # useEnvProjectRoot
  1036. useEnv = k['useEnvProjectRoot'].value()
  1037. # KEnv Query
  1038. script = kenvQuery('WORK_2D_SCENE_FILE',useEnv = False)
  1039. # get work_2d_scene_file
  1040. print(('SceneControl: Info. Checking script file: %s') %script)
  1041. # old Scriptname
  1042. oldname = nuke.Root()["name"].value()
  1043. # Nuke set filename
  1044. nuke.Root()["name"].setValue(script)
  1045. # check if folder exists
  1046. folder = os.path.dirname(script)
  1047. if not os.path.exists(folder):
  1048. os.makedirs(folder)
  1049. else:
  1050. # folder existing. Moving on
  1051. pass
  1052. # check if file exists
  1053. if os.path.isfile(script):
  1054. if owrite:
  1055. # good to go: change write nodes first
  1056. updateWriteNodePaths()
  1057. set_shot()
  1058. nuke.scriptSave()
  1059. else:
  1060. s = "SceneControl. Overwrite Nuke Script? %s" % script
  1061. overwrite = nuke.ask(s)
  1062. if overwrite:
  1063. # good to go: change write nodes first
  1064. updateWriteNodePaths()
  1065. set_shot()
  1066. nuke.scriptSave()
  1067. else:
  1068. nuke.Root()["name"].setValue(oldname)
  1069. else:
  1070. # good to go: change write nodes first
  1071. updateWriteNodePaths()
  1072. set_shot()
  1073. nuke.scriptSave()
  1074. def increment_major_version():
  1075. sceneControl = getSceneControl()
  1076. k = sceneControl.knobs()
  1077. major = k["major_version"].getValue()
  1078. major = int(major) + 1
  1079. k["major_version"].setValue(major)
  1080. k["minor_version"].setValue(1)
  1081. # call save script
  1082. save_script()
  1083. return
  1084. def increment_minor_version():
  1085. sceneControl = getSceneControl()
  1086. k = sceneControl.knobs()
  1087. minor = k["minor_version"].getValue()
  1088. minor = int(minor) + 1
  1089. k["minor_version"].setValue(minor)
  1090. # call save script
  1091. save_script()
  1092. return
  1093. # framerange
  1094. def get_framerange_OLD(node):
  1095. '''
  1096. # TODO: ftrack query or KEnv query
  1097. # Connect to FTrack
  1098. frameStart = 1001
  1099. frameCutIn = 1010
  1100. frameCutOut = 1100
  1101. frameEnd = 1109
  1102. n = nuke.thisNode()
  1103. k = n.knobs()
  1104. sequence = k["sequence"].getText()
  1105. shot = k["shot"].getText()
  1106. user = k["shortname"].getText()
  1107. if user == "":
  1108. nuke.message("Please fill out your shortname in the User field. E.g. \"ms\"")
  1109. return
  1110. try:
  1111. conn = FTrackConnector(shortname=user)
  1112. project = conn.getProject("drr")
  1113. shot = project.getShot(sequence, shot)
  1114. frameStart = shot.get("custom_attributes").get("fstart")
  1115. frameCutIn = shot.get("custom_attributes").get("fcutin")
  1116. frameCutOut = shot.get("custom_attributes").get("fcutout")
  1117. frameEnd = shot.get("custom_attributes").get("fend")
  1118. except Exception as e:
  1119. nuke.message(
  1120. "No Connection could be established. Check Firewall and enable 104.155.61.233 Port 443\n\n" + str(e))
  1121. node.knob("fStart").setValue(int(frameStart))
  1122. node.knob("fCutIn").setValue(int(frameCutIn))
  1123. node.knob("fCutOut").setValue(int(frameCutOut))
  1124. node.knob("fEnd").setValue(int(frameEnd))
  1125. return None
  1126. '''
  1127. def get_framerange(node):
  1128. import ftrack_tools
  1129. sceneControl = getSceneControl()
  1130. k = sceneControl.knobs()
  1131. proj = k['project'].value()
  1132. seq = k['sequence'].value()
  1133. shot = k['shot'].value()
  1134. # ftrack query
  1135. p = ftrack_tools.get_project(proj)
  1136. if proj == 'HOTZ':
  1137. proj = 'HOT'
  1138. shotcode = proj + '_' + seq + '_' + shot
  1139. if k["debug"].getValue():
  1140. print(('SceneControl: Debug. Project: %s') %proj)
  1141. print(('SceneControl: Debug. Sequence: %s') % seq)
  1142. print(('SceneControl: Debug. Shot: %s') % shot)
  1143. print(('SceneControl: Debug. FTrack Shotcode: %s') %shotcode)
  1144. s = p.get_shot(shotcode)
  1145. st,en = s.get_framerange()
  1146. ha = s.get_handles()
  1147. k['fStart'].setValue(int(st))
  1148. k['fCutIn'].setValue(int(st) + int(ha))
  1149. k['fEnd'].setValue(int(en))
  1150. k['fCutOut'].setValue(int(en) - int(ha))
  1151. return None
  1152. def set_framerange(node):
  1153. frameCutIn = node.knob("fCutIn").getValue()
  1154. frameCutOut = node.knob("fCutOut").getValue()
  1155. nuke.root()["first_frame"].setValue(frameCutIn)
  1156. nuke.root()["last_frame"].setValue(frameCutOut)
  1157. return None
  1158. def remove_expressions():
  1159. #todo: create **kwargs for replacement
  1160. n = nuke.thisNode()
  1161. k = n.knobs()
  1162. nodes = nuke.allNodes()
  1163. for no in nodes:
  1164. if no.Class() == "Read" or no.Class() == "DeepRead" or no.Class() == "Write":
  1165. s = no.knob("file").getValue()
  1166. k["eval_helper"].setValue(s)
  1167. res = k["eval_helper"].evaluate()
  1168. res = res.replace("\\", "/")
  1169. res = res.replace("//hades/p/_projekte/DRR", "$env(JOB)")
  1170. s = no.knob("file").setValue(res)
  1171. return None
  1172. def remove_expression_links():
  1173. nodes = nuke.allNodes()
  1174. for n in nodes:
  1175. if n.Class() == "Read" or n.Class() == "DeepRead" or n.Class() == "Write":
  1176. for k in n.knobs():
  1177. n.knobs()[k].clearAnimated()
  1178. return None
  1179. def replace_frame_with_padded_frames():
  1180. nodes = nuke.allNodes()
  1181. for n in nodes:
  1182. if n.Class() == "Read" or n.Class() == "DeepRead":
  1183. file = n.knob("file").getValue()
  1184. sub = file.split(".")[-2]
  1185. file = file.replace(sub, "####")
  1186. n.knob("file").setValue(file)
  1187. return None
  1188. # layer
  1189. def get_layer_versions():
  1190. # TODO: filter out temporary files: tmp, temp, ifd, ass
  1191. sceneControl = getSceneControl()
  1192. k = sceneControl.knobs()
  1193. # get renderpath to look for layers
  1194. path = kenvQuery('RENDER_3D_DIR')
  1195. t = k["task"].value()
  1196. task = '_' + t
  1197. folder = os.path.dirname(str(path))
  1198. if not os.path.exists(folder):
  1199. msg = "SceneControl. Error.\nNo renders found in:\n%s\nIs the task %s correct?" % (path, t)
  1200. nuke.message(msg)
  1201. return
  1202. # find top folders in renderdir of current shot in current department
  1203. folders = [name for name in os.listdir(path) if os.path.isdir(os.path.join(path, name))]
  1204. # debug
  1205. if k["debug"].getValue():
  1206. print(('SceneControl: Debug. Folders found: %s') %folders)
  1207. # dict holding info about layer and their version.
  1208. layer_dict = {}
  1209. for f in folders:
  1210. print(('SceneControl: Info: Adding folder: %s') %f)
  1211. # extract layer name
  1212. lay = f.split('.')[1]
  1213. pattern = re.compile('_[vV]\d+')
  1214. layer = re.sub(pattern, "", lay)
  1215. layer = layer.replace(task, '')
  1216. if k["debug"].getValue():
  1217. print(('SceneControl: Debug. Layer: %s') % layer)
  1218. # extract version string
  1219. pattern2 = re.compile('[vV]\d+')
  1220. ver = pattern2.findall(f)
  1221. version = ver[-1].replace('v', '').replace('V', '')
  1222. version = int(version)
  1223. if k["debug"].getValue():
  1224. print(('SceneControl: Debug. Version: %s') % version)
  1225. # if layer is already loaded
  1226. if layer in layer_dict:
  1227. # check if version in dict is smaller than found version
  1228. if layer_dict[layer] < version:
  1229. layer_dict[layer] = version
  1230. else:
  1231. pass
  1232. else:
  1233. layer_dict[layer] = version
  1234. if k["debug"].getValue():
  1235. print(('SceneControl: Debug. get_layer_version()) Layerdict: %s') % layer_dict)
  1236. return layer_dict
  1237. def get_layer_versions_OLD():
  1238. sceneControl = getSceneControl()
  1239. k = sceneControl.knobs()
  1240. # renderpath = '//hades/p/_projekte/HOTZ/500_renders/Shots/001/010'
  1241. # path = kenvGetRenderPath()
  1242. path = kenvQuery('RENDER_3D_DIR')
  1243. task = k["task"].value()
  1244. folder = os.path.dirname(str(path))
  1245. if not os.path.exists(folder):
  1246. msg = "SceneControl. Error.\nNo renders found in:\n%s\nIs the Task %s correct?" % (path, task)
  1247. nuke.message(msg)
  1248. return
  1249. # find top folders in renderdir of current shot in current department
  1250. folders = [name for name in os.listdir(path) if os.path.isdir(os.path.join(path, name))]
  1251. # debug
  1252. if k["debug"].getValue():
  1253. print(('SceneControl: Debug. Folders found: %s') %folders)
  1254. # dict holding info about layer and their version. BEN:3, SOR:4, ENV:1
  1255. layer_dict = {}
  1256. for f in folders:
  1257. print(('SceneControl: Info: Adding folder: %s') %f)
  1258. # TODO: also add layers with variants. Eg. DRR Layer example: HOT_shots_001_010.beauty_light_v001/HOT_shots_001_010.beauty_light_v001.1023.exr
  1259. try:
  1260. layer = f.split('.')[1].split('_')[0]
  1261. except:
  1262. print(('SceneControl: Error. Layer %s is not conform in naming. Skipping.') %f)
  1263. break
  1264. version = int(f.split('_')[-1].replace('v', ''))
  1265. if layer in layer_dict:
  1266. # check if version in dict is smaller than found version
  1267. if layer_dict[layer] < version:
  1268. layer_dict[layer] = version
  1269. else:
  1270. pass
  1271. else:
  1272. layer_dict[layer] = version
  1273. if k["debug"].getValue():
  1274. print(('SceneControl: Debug. get_layer_version()) Layerdict: %s') % layer_dict)
  1275. return layer_dict
  1276. def update_layer():
  1277. n = nuke.thisNode()
  1278. # get newest files on disk
  1279. layer_dict = get_layer_versions()
  1280. if bool(layer_dict) is True:
  1281. layer_dict_new_entries = OrderedDict(sorted(layer_dict.items(), key=lambda t: t[0]))
  1282. nu = n['layerNum'].getValue()
  1283. num = int(nu)
  1284. # get new entries
  1285. for layer, version in layer_dict.items():
  1286. if num < 1:
  1287. c = 0
  1288. else:
  1289. c = num
  1290. for i in range(1, num + 1):
  1291. if n.knob("layer_name_" + str(i)) is not None and n.knob("layer_name_" + str(i)).getValue() == layer:
  1292. # layer already in list. Just update version
  1293. n.knob("layer_version_" + str(i)).setValue(version)
  1294. del layer_dict_new_entries[layer]
  1295. break
  1296. # new entries
  1297. if len(layer_dict_new_entries) > 0:
  1298. c += 1
  1299. for layer, version in layer_dict_new_entries.items():
  1300. k = nuke.String_Knob("layer_name_" + str(c), str(c))
  1301. n.addKnob(k)
  1302. n.knob("layer_name_" + str(c)).setValue(layer)
  1303. # Version
  1304. k = nuke.Int_Knob("layer_version_" + str(c), "version")
  1305. n.addKnob(k)
  1306. n.knob("layer_version_" + str(c)).clearFlag(nuke.STARTLINE)
  1307. n.knob("layer_version_" + str(c)).setValue(version)
  1308. # Button Read
  1309. func = "sceneControl.create_readnode(" + str(c) + ")"
  1310. name = "create_readnode_" + str(c)
  1311. k = nuke.PyScript_Knob(name, "Read", func)
  1312. n.addKnob(k)
  1313. # Button Deep Read
  1314. func = "sceneControl.create_deepreadnode(" + str(c) + ")"
  1315. name = "create_deepreadnode_" + str(c)
  1316. k = nuke.PyScript_Knob(name, "Deep", func)
  1317. n.addKnob(k)
  1318. # Button Crypto
  1319. #func = "sceneControl.create_readnode(" + str(c) + ")"
  1320. #name = "create_readnode" + str(c)
  1321. #k = nuke.PyScript_Knob(name, "Crypto", func)
  1322. #n.addKnob(k)
  1323. # Include in publish
  1324. k = nuke.Boolean_Knob("include_in_publish_" + str(c), "Publish")
  1325. n.addKnob(k)
  1326. n.knob("include_in_publish_" + str(c)).clearFlag(nuke.STARTLINE)
  1327. n.knob("include_in_publish_" + str(c)).setValue(1)
  1328. n.knob("include_in_publish_" + str(c)).setTooltip("Include this layer in publish.")
  1329. num = num + 1
  1330. c = c + 1
  1331. n.knob("layerNum").setValue(c - 1)
  1332. layer_dict = None
  1333. return
  1334. else:
  1335. # dict is empty
  1336. return
  1337. def remove_layer(c):
  1338. n = nuke.thisNode()
  1339. # remove entire line
  1340. k = "layer_name_" + str(c)
  1341. n.removeKnob(n.knobs()[k])
  1342. k = "layer_version_" + str(c)
  1343. n.removeKnob(n.knobs()[k])
  1344. k = "create_readnode_" + str(c)
  1345. n.removeKnob(n.knobs()[k])
  1346. k = "create_deepreadnode_" + str(c)
  1347. n.removeKnob(n.knobs()[k])
  1348. k = "include_in_publish_" + str(c)
  1349. n.removeKnob(n.knobs()[k])
  1350. # adjust number of layers
  1351. nu = n["layerNum"].getValue()
  1352. nu = nu - 1
  1353. n.knob("layerNum").setValue(int(nu))
  1354. if n.knob("layerNum").getValue() < 0:
  1355. n.knob("layerNum").setValue(0)
  1356. return
  1357. def remove_all_layers(node):
  1358. n = nuke.thisNode()
  1359. nu = n["layerNum"].getValue()
  1360. num = int(nu)
  1361. for i in range(num, 0, -1):
  1362. remove_layer(i)
  1363. return
  1364. # publish // redo this
  1365. def publish_shot():
  1366. n = nuke.thisNode()
  1367. k = n.knobs()
  1368. print ("SceneControl: Checking Versions...")
  1369. maximum = return_highest_layer_version()
  1370. major = k["major_version"].getValue()
  1371. if major < maximum:
  1372. if nuke.ask(
  1373. 'SceneControl: Layer found with higher version than the Major file version. Continue with publish?'):
  1374. pass
  1375. else:
  1376. "SceneControl: Terminating Publish"
  1377. return
  1378. print ("SceneControl: Publishing Shot")
  1379. # sequence
  1380. sequence = k["sequence"].getText()
  1381. # shot
  1382. shot = k["shot"].getText()
  1383. # cutIn and cutOut
  1384. frameCutIn = n.knob("fCutIn").getValue()
  1385. frameCutOut = n.knob("fCutOut").getValue()
  1386. # precompCutIn and precompCutOut
  1387. precompframeCutIn = n.knob("pCutIn").getValue()
  1388. precompframeCutOut = n.knob("pCutOut").getValue()
  1389. # eye
  1390. eye = n.knob("eye").getValue()
  1391. # rendered on studio funk farm
  1392. studioFunkRender = n.knob("studio_funk_render").getValue()
  1393. # comment
  1394. comment = k["comment"].getText()
  1395. # shortname
  1396. shortname = k["user"].getText()
  1397. if shortname == "":
  1398. nuke.message("Please fill out your shortname in the User field. E.g. \"ms\"")
  1399. return
  1400. # precomp render path
  1401. major = k["major_version"].getValue()
  1402. major = "v" + str(int(major)).zfill(3)
  1403. path = k["comp_output_path"].getText()
  1404. path = path.replace("MAJORVERSION", str(major))
  1405. output = k["comp_output_file"].getText()
  1406. output = output.replace("MAJORVERSION", str(major))
  1407. path = path.replace("\\", "/")
  1408. precomp = "%s/%s" % (path, output)
  1409. # evaluate expressions
  1410. k["eval_helper"].setValue(precomp)
  1411. precomp = k["eval_helper"].evaluate()
  1412. precomp = precomp.replace("\\", "/")
  1413. frames = precomp.split(".")[-2]
  1414. precomp = precomp.replace(frames, "####")
  1415. precomp_dir = os.path.dirname(precomp)
  1416. # debug
  1417. debug = k["Debug"].getValue()
  1418. # gather Layers and versions to publish (exclude flagged Layers)
  1419. layernum = k["layerNum"].getValue()
  1420. num = int(layernum)
  1421. layer = {}
  1422. publish = {}
  1423. metadata = {}
  1424. skip_copy_layers = []
  1425. for c in range(1, num + 1, 1):
  1426. layername = n.knob("layer_name_" + str(c)).getValue()
  1427. layerversion = n.knob("layer_version_" + str(c)).getValue()
  1428. if n.knob("include_in_publish_" + str(c)).getValue() == 1:
  1429. layer[layername] = str(int(layerversion)).zfill(3)
  1430. if n.knob("copy_layer_" + str(c)).getValue() == 1:
  1431. skip_copy_layers.append(layername)
  1432. # search for readnodes that are linked in SceneControl
  1433. meta = return_readnodes("layer_version_" + str(c))
  1434. node = nuke.toNode(str(meta))
  1435. if node is not None:
  1436. if node.metadata() != {}:
  1437. for k, v in node.metadata().iteritems():
  1438. # print (k > v)
  1439. if k == "exr/DRR_Scene":
  1440. metadata[layername + "_Scene"] = v
  1441. if k == "exr/DRR_Shader":
  1442. metadata[layername + "_Shader"] = v
  1443. if k == "exr/DRR_FXAssembly":
  1444. metadata[layername + "_FXAssembly"] = v
  1445. else:
  1446. print ("SceneControl: No Metadata availible")
  1447. else:
  1448. # should not be included in publish
  1449. pass
  1450. """
  1451. publish["nukescript"] = nukescript
  1452. # //hades/p/_projekte/DRR/02_Shots/SEQ_0200/SHOT_0200_0010/04_Lighting/02_work/nuke/lighting/
  1453. publish["sequence"] = sequence
  1454. # 0160
  1455. publish["shot"] = shot
  1456. # 0040
  1457. publish["cut_in"] = frameCutIn
  1458. # 1009
  1459. publish["cut_out"] = frameCutOut
  1460. # 1109
  1461. publish["precomp_cut_in"] = precomp_cut_in
  1462. # 1009
  1463. publish["precomp_cut_out"] = precomp_cut_out
  1464. # 1009
  1465. publish["comment"] = comment
  1466. # "My Comment\nAnother comment.\nYet another comment."
  1467. publish["shortname"] = shortname
  1468. # "ms"
  1469. publish["layer"] = layer
  1470. # {"CHAR": "011", "VOL": "011", "DUS": "009", "ENV": "011"}
  1471. publish["skip_copy_layers"] = skip_copy_layers
  1472. # ("CHAR","ENV")
  1473. publish["metadata"] = layer
  1474. # {"CHAR_Scene": "/path/to/desertRuins_MOD_v037.003.json", "CHAR_Shader": "/path/to/desertRuins_MOD_v037.003.shdAssembly.json", "CHAR_FXAssembly": "/path/to/FXAssembly"}
  1475. publish["precomp_dir"] = precomp_dir
  1476. # //hades/p/_projekte/DRR/02_Shots/SEQ_0160/SHOT_0160_0040/04_Lighting/02_work/nuke/lighting/render/SHOT_0160_0040_LIG_v001
  1477. publish["email_recipients"] = ["martin@saechsinger.de"]
  1478. """
  1479. save_script(publish=True)
  1480. # nukescript
  1481. nukescript = nuke.Root()["name"].getValue()
  1482. # prepare publish dict
  1483. publish["nukescript"] = nukescript
  1484. publish["sequence"] = sequence
  1485. publish["cut_in"] = frameCutIn
  1486. publish["cut_out"] = frameCutOut
  1487. publish["shot"] = shot
  1488. publish["comment"] = comment
  1489. publish["shortname"] = shortname
  1490. publish["layer"] = layer
  1491. publish["skip_copy_layers"] = skip_copy_layers
  1492. publish["precomp_dir"] = precomp_dir
  1493. publish["metadata"] = metadata
  1494. publish["eye"] = eye
  1495. if studioFunkRender:
  1496. publish["precomp_cut_in"] = precompframeCutIn
  1497. publish["precomp_cut_out"] = precompframeCutOut
  1498. # save script (scene control will get deleted)
  1499. # do the publish
  1500. if debug == 1.0:
  1501. reload(publisher)
  1502. print ("SceneControl: ____Test Publish:____")
  1503. for k, v in publish.items(): print (k, '>', v)
  1504. else:
  1505. reload(publisher)
  1506. for k, v in publish.items(): print (k, '>', v)
  1507. publisher.Lighting(**publish).publish()
  1508. return None
  1509. def return_readnodes(layername):
  1510. nodes = nuke.allNodes()
  1511. for n in nodes:
  1512. if n.Class() == "Read":
  1513. filepath = n.knob("file").getValue()
  1514. if layername in filepath:
  1515. return n.name()
  1516. return None
  1517. def create_readnode_old(c, autoconnect=None):
  1518. # TODO: create just one function for read, deep read and cryptomatte
  1519. n = nuke.thisNode()
  1520. k = n.knobs()
  1521. layer = n.knob("layer_name_" + str(c)).getValue()
  1522. a = "layer_version_" + str(c)
  1523. version = "v[format %%03d [value SceneControl.%s]]" % a
  1524. # replace [ASSETVERSION] with version of SceneControl
  1525. # Read
  1526. path = k["output_path"].getText()
  1527. output = k["output_file"].getText()
  1528. path = path.replace("LAYERVERSION", str(version))
  1529. path = path.replace("\\", "/")
  1530. output = output.replace("LAYERVERSION", str(version))
  1531. path = path.replace("LAYER", str(layer))
  1532. output = output.replace("LAYER", str(layer))
  1533. file = "%s/%s" % (path, output)
  1534. k["eval_helper"].setValue(file)
  1535. checkfile = k["eval_helper"].evaluate()
  1536. checkfile = checkfile.replace("\\", "/")
  1537. # create Read __________________________________________________
  1538. read = nuke.nodes.Read()
  1539. read.setName(layer)
  1540. read["file"].setValue(file)
  1541. missing = k["missing_frames"].getText()
  1542. if missing == "error":
  1543. read["on_error"].setValue(0)
  1544. elif missing == "black":
  1545. read["on_error"].setValue(1)
  1546. elif missing == "checkerboard":
  1547. read["on_error"].setValue(2)
  1548. elif missing == "nearest frame":
  1549. read["on_error"].setValue(3)
  1550. read["first"].setExpression("[value SceneControl.fStart]")
  1551. read["origfirst"].setExpression("[value SceneControl.fStart]")
  1552. read["last"].setExpression("[value SceneControl.fEnd]")
  1553. read["origlast"].setExpression("[value SceneControl.fEnd]")
  1554. read["label"].setValue("scnCtrl")
  1555. # position Read
  1556. if autoconnect is None:
  1557. # connect to selectedNode
  1558. try:
  1559. selectedNode = nuke.selectedNode()
  1560. except:
  1561. selectedNode = None
  1562. if selectedNode is not None:
  1563. selectedNode.setInput(0, read)
  1564. read.setXYpos(selectedNode.xpos(), selectedNode.ypos() - 150)
  1565. else:
  1566. # connect to dots with starts with layer name
  1567. dot = find_node_by_type(layer, "Dot")
  1568. if dot is not None:
  1569. dot.setInput(0, read)
  1570. read.setXYpos(dot.xpos() - 37, dot.ypos() - 150)
  1571. else:
  1572. pass
  1573. dot = None
  1574. return
  1575. def create_deepreadnode_old(c, autoconnect=None):
  1576. n = nuke.thisNode()
  1577. k = n.knobs()
  1578. layer = n.knob("layer_name_" + str(c)).getValue()
  1579. a = "layer_version_" + str(c)
  1580. version = "v[format %%03d [value SceneControl.%s]]" % a
  1581. # replace [ASSETVERSION] with version of SceneControl
  1582. # DeepRead __________________________________________________
  1583. path = k["output_path"].getText()
  1584. output = k["deep_output_file"].getText()
  1585. path = path.replace("LAYERVERSION", str(version))
  1586. path = path.replace("\\", "/")
  1587. output = output.replace("LAYERVERSION", str(version))
  1588. path = path.replace("LAYER", str(layer))
  1589. output = output.replace("LAYER", str(layer))
  1590. deep_subfolder = k["deep_subfolder"].getText()
  1591. if not deep_subfolder:
  1592. file = "%s/%s" % (path, output)
  1593. else:
  1594. file = "%s/%s/%s" % (path, deep_subfolder, output)
  1595. k["eval_helper"].setValue(file)
  1596. checkfile = k["eval_helper"].evaluate()
  1597. checkfile = checkfile.replace("\\", "/")
  1598. # create DeepRead
  1599. read = nuke.nodes.DeepRead()
  1600. read.setName(layer + "_Deep")
  1601. read["file"].setValue(file)
  1602. missing = k["missing_frames"].getValue()
  1603. if missing == "error":
  1604. read["on_error"].setValue(0)
  1605. elif missing == "black":
  1606. read["on_error"].setValue(1)
  1607. elif missing == "checkerboard":
  1608. read["on_error"].setValue(2)
  1609. elif missing == "nearest frame":
  1610. read["on_error"].setValue(3)
  1611. read["on_error"].setValue(1)
  1612. read["first"].setExpression("[value SceneControl.fStart]")
  1613. read["origfirst"].setExpression("[value SceneControl.fStart]")
  1614. read["last"].setExpression("[value SceneControl.fEnd]")
  1615. read["origlast"].setExpression("[value SceneControl.fEnd]")
  1616. read["label"].setValue("scnCtrl")
  1617. # position Deep Read
  1618. if autoconnect is None:
  1619. # connect to selectedNode
  1620. try:
  1621. selectedNode = nuke.selectedNode()
  1622. except:
  1623. selectedNode = None
  1624. if selectedNode is not None:
  1625. read.setXYpos(selectedNode.xpos() - 37, selectedNode.ypos() - 25)
  1626. else:
  1627. # connect to dots with starts with layer name
  1628. dot = find_node_by_type(layer + "_Deepread", "Dot")
  1629. if dot is not None:
  1630. dot.setInput(0, read)
  1631. read.setXYpos(dot.xpos() - 50, dot.ypos() - 150)
  1632. else:
  1633. pass
  1634. dot = None
  1635. return
  1636. def return_highest_layer_version():
  1637. n = nuke.thisNode()
  1638. k = n.knobs()
  1639. # gather Layers and versions to publish (exclude flagged Layers)
  1640. layernum = k["layerNum"].getValue()
  1641. num = int(layernum)
  1642. maximum = 1
  1643. for c in range(1, num + 1, 1):
  1644. value = n.knob("layer_version_" + str(c)).getValue()
  1645. if value > maximum:
  1646. maximum = value
  1647. print ("SceneControl: Highest Version is: %s" % int(maximum))
  1648. return int(maximum)
  1649. def debugQuery():
  1650. sceneControl = getSceneControl()
  1651. k = sceneControl.knobs()
  1652. # element
  1653. element = k['element'].value()
  1654. if element is None or len(element)==0:
  1655. element = 'None'
  1656. # info
  1657. info = k['info'].value()
  1658. if info is None or len(info)==0:
  1659. info = 'None'
  1660. print('SceneControl: Debug kenv query:')
  1661. print('PROJECT: ' + os.environ['PROJECT'])
  1662. print('SEQUENCE: ' + k['sequence'].value())
  1663. print('SHOT: ' + k['shot'].value())
  1664. print('DEPT: ' + k['dept'].value())
  1665. print('TASK: ' + k['task'].value())
  1666. print('MAJOR_VERSION: ' + str(int(k['major_version'].value())))
  1667. print('MINOR_VERSION: ' + str(int(k['minor_version'].value())))
  1668. print('ELEMENT: ' + element)
  1669. print('INFO: ' + info)
  1670. print('USER: ' + k['user'].value())
  1671. print('EXT: exr')
  1672. print('APP_ID: nuke')
  1673. return
  1674. # deprecated
  1675. def load_precomp():
  1676. major = nuke.thisNode().knob("major_version").getValue()
  1677. major = "v" + str(int(major)).zfill(3)
  1678. n = nuke.thisNode()
  1679. k = n.knobs()
  1680. path = k["comp_output_path"].getText()
  1681. path = path.replace("MAJORVERSION", str(major))
  1682. output = k["comp_output_file"].getText()
  1683. output = output.replace("MAJORVERSION", str(major))
  1684. path = path.replace("\\", "/")
  1685. file = "%s/%s" % (path, output)
  1686. # dance the resolve dance
  1687. k["precomp_output"].setValue(file)
  1688. precomp = k["precomp_output"].evaluate()
  1689. precomp = precomp.replace("\\", "/")
  1690. sub = precomp.split(".")[-2]
  1691. precomp = precomp.replace(sub, "####")
  1692. # create the read file
  1693. read = nuke.nodes.Read()
  1694. read.setName("Precomp")
  1695. read["file"].setValue(precomp)
  1696. read["first"].setExpression("[value SceneControl.fStart]")
  1697. read["origfirst"].setExpression("[value SceneControl.fStart]")
  1698. read["last"].setExpression("[value SceneControl.fEnd]")
  1699. read["origlast"].setExpression("[value SceneControl.fEnd]")
  1700. try:
  1701. selectedNode = nuke.selectedNode()
  1702. except:
  1703. selectedNode = None
  1704. if selectedNode is not None:
  1705. read.setXYpos(selectedNode.xpos() + 100, selectedNode.ypos())
  1706. return None
  1707. def create_writenode():
  1708. major = nuke.thisNode().knob("major_version").getValue()
  1709. major = "v" + str(int(major)).zfill(3)
  1710. write = nuke.nodes.Write()
  1711. write.setName("Precomp")
  1712. n = nuke.thisNode()
  1713. k = n.knobs()
  1714. path = k["comp_output_path"].getText()
  1715. # path = path.replace("MAJORVERSION", str(major))
  1716. output = k["comp_output_file"].getText()
  1717. # output = output.replace("MAJORVERSION", str(major))
  1718. path = path.replace("\\", "/")
  1719. file = "%s/%s" % (path, output)
  1720. write["file"].setValue(file)
  1721. write["views"].setValue("left")
  1722. write["file_type"].setValue("exr")
  1723. write["create_directories"].setValue(1)
  1724. write["metadata"].setValue(4)
  1725. try:
  1726. selectedNode = nuke.selectedNode()
  1727. except:
  1728. selectedNode = None
  1729. if selectedNode is not None:
  1730. write.setInput(0, selectedNode)
  1731. write.setXYpos(selectedNode.xpos(), selectedNode.ypos() + 66)
  1732. return
  1733. def remove_scnctrl_reads(node):
  1734. nodes = nuke.allNodes()
  1735. for n in nodes:
  1736. if n.Class() == "Read" or n.Class() == "DeepRead":
  1737. s = n.knob("label").getValue()
  1738. if s.startswith("scnCtrl"):
  1739. nuke.delete(n)
  1740. else:
  1741. pass
  1742. return