From bc65ccfc886d3826b90959cefbbe32a6c5a84623 Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 28 Jul 2017 16:27:07 +0100 Subject: [PATCH 01/38] updating to studio falvor - not including DL --- app.py | 14 +- gizmos/WriteTank.gizmo | 145 ++++++-- info.yml | 19 + python/tk_nuke_writenode/handler.py | 533 +++++++++++++++++++++++----- 4 files changed, 591 insertions(+), 120 deletions(-) diff --git a/app.py b/app.py index 25c4fd8..bff8dc3 100644 --- a/app.py +++ b/app.py @@ -148,7 +148,9 @@ def get_node_render_template(self, node): """ Return the render template for the specified node """ - return self.__write_node_handler.get_render_template(node) + write_type = self.__write_node_handler.get_node_write_type_name(node) + + return self.__write_node_handler.get_render_template(node, write_type) def get_node_publish_template(self, node): """ @@ -221,21 +223,19 @@ def __add_write_node_commands(self, context=None): Creates write node menu entries for all write node configurations """ context = context or self.context - + write_type = "Version" write_node_icon = os.path.join(self.disk_location, "resources", "tk2_write.png") - for profile_name in self.__write_node_handler.profile_names: # add to toolbar menu - cb_fn = lambda pn=profile_name: self.__write_node_handler.create_new_node(pn) + cb_fn = lambda pn=profile_name, wt=write_type: self.__write_node_handler.create_new_node(pn,wt) self.engine.register_command( - "%s [Shotgun]" % profile_name, + "%s" % profile_name, cb_fn, dict( type="node", icon=write_node_icon, context=context, ) - ) - + ) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 73f3eb8..c682a1a 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -21,9 +21,9 @@ version 6.3 # # Additional knob flags # --------------------- -# These are set/removed by doing +/-FLAG_NAME, e.g. +STARTLINE to ensure the knob starts a -# new line in the property editor. A full list of flags can be found here: -# http://docs.thefoundry.co.uk/nuke/63/ndkdevguide/knobs-and-handles/knobflags.html +# These are set/removed by doing +/-FLAG_NAME, e.g. +STARTLINE to ensure the knob starts a +# new line in the property editor.A full list of flags can be found here: +# http://docs.thefoundry.co.uk/nuke/63/ndkdevguide/knobs-and-handles/knobflags.html # ########################################################################################## ########################################################################################## @@ -36,23 +36,28 @@ Gizmo { l "Shotgun Write" } addUserKnob { - 4 tk_profile_list - l "Profile" - M {} - t "Select the Profile to use for this node" - +DO_NOT_WRITE + 1 precomp_render_template + l "Sgtk Precomp Template" + t "The Sgtk precomp template associated with this node" + +INVISIBLE } addUserKnob { - 1 tank_channel - l "Output" - t "Choose an output name for this Write Node to help identify it when you have more than one output in your scene." - +STARTLINE + 1 element_render_template + l "Sgtk Elements Template" + t "The Sgtk elements template associated with this node" + +INVISIBLE } addUserKnob { - 6 tk_use_name_as_channel - l "Use node name" - t "Use the node name in place of the output name" - -STARTLINE + 1 denoise_render_template + l "Sgtk Denoise Template" + t "The Sgtk denoise template associated with this node" + +INVISIBLE + } + addUserKnob { + 1 test_render_template + l "Sgtk Test Template" + t "The Sgtk test template associated with this node" + +INVISIBLE } addUserKnob { 6 tk_is_fully_constructed @@ -61,7 +66,7 @@ Gizmo { +DO_NOT_WRITE +STARTLINE +INVISIBLE - } + } addUserKnob { 1 profile_name l "Profile Name" @@ -103,32 +108,31 @@ Gizmo { l "Sgtk Cached Proxy Path" t "The path for this write node when rendering in proxy mode" +INVISIBLE - } + } addUserKnob { 1 tk_last_known_script l "Last Known Script" t "The last known script this Write node was saved in - used to determine if the script is being saved as a new file or not" +INVISIBLE - } + } addUserKnob { 1 tk_file_type l "File Type" t "The file type to be used for the write node output - this cached value is used if the profile can't be determined" +INVISIBLE - } + } addUserKnob { 1 tk_file_type_settings l "File Type Settings" t "A dictionary of file type settings to be applied to the Write node - this cached value is used if the profile can't be determined" +INVISIBLE - } + } addUserKnob { 1 tk_write_node_settings l "Write Node Settings" t "A string of tcl containing a record of settings for the internal write node at save time." +INVISIBLE - } - + } addUserKnob { 26 "" l "" @@ -158,7 +162,6 @@ Gizmo { T " " t "A preview of the file location generated by the node." } - addUserKnob { 26 path_warning l " " @@ -172,7 +175,6 @@ Gizmo { T "import nuke\nif hasattr(nuke, \"_shotgun_write_node_handler\"):\n nuke._shotgun_write_node_handler.on_reset_render_path_gizmo_callback()" +STARTLINE } - addUserKnob { 26 "" l "" @@ -193,12 +195,91 @@ Gizmo { t "Copies the current render/proxy path to the clipboard" -STARTLINE } - addUserKnob { 26 "" l "" +STARTLINE } + addUserKnob { + 4 write_type + l "SG Write Type" + t "Select the type of node you require this to be." + M {Version Precomp Element Denoise Test} + } + addUserKnob { + 25 "" + - STARTLINE + } + addUserKnob { + 4 tk_profile_list + l "Profile" + M {} + t "Select the Profile to use for this node" + -STARTLINE + +DO_NOT_WRITE + } + addUserKnob { + 1 tank_channel + l "Detail" + t "Choose an output name for this Write Node to help identify it when you have more than one output in your scene." + +STARTLINE + -INVISIBLE + } + addUserKnob { + 6 tk_use_name_as_channel + l "Use node name" + t "Use the node name in place of the output name" + -STARTLINE + +INVISIBLE + } + addUserKnob { + 26 version_divider + l "" + +STARTLINE + -INVISIBLE + } + addUserKnob { + 26 latest_version + l "Latest Version:" + t "Shows current task context of the script" + T " " + } + addUserKnob { + 26 version_date + l "Version Date:" + t "Shows current task context of the script" + T " " + +STARTLINE + } + addUserKnob { + 26 version_description + l "Description:" + t "Shows description of the latest version" + T " " + +STARTLINE + } + addUserKnob { + 32 sync_from_sg + l "Sync Global frames from SG" + T " " + +STARTLINE + } + addUserKnob { + 25 "" + - STARTLINE + } + addUserKnob { + 32 refresh_version_info + l "Refresh Info" + T " " + -STARTLINE + } + addUserKnob { + 26 "" + l "" + +STARTLINE + } + addUserKnob { 41 channels T Write1.channels @@ -233,7 +314,6 @@ Gizmo { 41 views T Write1.views } - addUserKnob { 26 "" l "" @@ -253,9 +333,16 @@ Gizmo { } addUserKnob { 41 Render + l "Local Render" T Write1.Render -STARTLINE } + addUserKnob { + 32 farm_render + l "Farm Render" + T " " + -STARTLINE + } addUserKnob { 41 first l "frame range" @@ -273,7 +360,6 @@ Gizmo { T Write1.use_limit -STARTLINE } - addUserKnob { 41 reading l "read file" @@ -296,7 +382,6 @@ Gizmo { T Write1.reload -STARTLINE } - addUserKnob { 26 "" l "" @@ -411,7 +496,7 @@ Gizmo { addUserKnob {41 afterFrameRender l "after each frame" T Write1.afterFrameRender} addUserKnob {1 tk_after_render l "after render"} addUserKnob {41 renderProgress l "render progress" T Write1.renderProgress} - + knobChanged "import nuke\nif hasattr(nuke, \"_shotgun_write_node_handler\"):\n nuke._shotgun_write_node_handler.on_knob_changed_gizmo_callback()" onCreate "import nuke\nif hasattr(nuke, \"_shotgun_write_node_handler\"):\n nuke._shotgun_write_node_handler.on_node_created_gizmo_callback()" } diff --git a/info.yml b/info.yml index c4802f5..0616f76 100644 --- a/info.yml +++ b/info.yml @@ -64,6 +64,25 @@ configuration: fields: context, version, SEQ, [channel], [output], [name], [width], [height], [eye], [TankType], * allows_empty: True default_value: null + precomp_render_template: + type: template + fields: context, version, SEQ, [channel], [output], [name], [width], [height], [eye], * + allows_empty: True + default_value: null + element_render_template: + type: template + fields: context, version, SEQ, [channel], [output], [name], [width], [height], [eye], * + allows_empty: True + default_value: null + denoise_render_template: + type: template + fields: context, version, SEQ, [channel], [output], [name], [width], [height], [eye], * + allows_empty: True + test_render_template: + type: template + fields: context, version, SEQ, [channel], [output], [name], [width], [height], [eye], * + allows_empty: True + default_value: null tile_color: type: list values: diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index a40313b..8b691c6 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -15,6 +15,9 @@ import datetime import base64 import re +import subprocess +import re +import traceback import nuke import nukescripts @@ -22,18 +25,24 @@ import tank from tank import TankError from tank.platform import constants +from tank_vendor import shotgun_api3 + +try: + import ConfigParser +except: + print( "Could not load ConfigParser module, sticky settings will not be loaded/saved" ) # Special exception raised when the work file cannot be resolved. class TkComputePathError(TankError): pass class TankWriteNodeHandler(object): - """ - Handles requests and processing from a tank write node. - """ + + # Handles requests and processing from a tank write node. + SG_WRITE_NODE_CLASS = "WriteTank" - SG_WRITE_DEFAULT_NAME = "ShotgunWrite" + SG_WRITE_DEFAULT_NAME = "SGWrite" WRITE_NODE_NAME = "Write1" OUTPUT_KNOB_NAME = "tank_channel" @@ -62,10 +71,13 @@ def __init__(self, app): self.__is_updating_proxy_path = False self.populate_profiles_from_settings() - + + # call and cache the version info + self._version_info = {} + self.get_sg_info() + ################################################################################################ - # Properties - + # Properties @property def profile_names(self): """ @@ -130,11 +142,11 @@ def get_node_tank_type(self, node): if settings: return settings["tank_type"] - def get_render_template(self, node): + def get_render_template(self, node, write_type): """ helper function. Returns the associated render template obj for a node """ - return self.__get_render_template(node) + return self.__get_render_template(node, write_type) def get_publish_template(self, node): """ @@ -142,12 +154,12 @@ def get_publish_template(self, node): """ return self.__get_publish_template(node) - def get_proxy_render_template(self, node): + def get_proxy_render_template(self, node, write_type): """ helper function. Returns the associated render proxy template obj for a node. If this hasn't been defined then it falls back to the regular render template. """ - return self.__get_render_template(node, is_proxy=True, fallback_to_render=True) + return self.__get_render_template(node, write_type ,is_proxy=True, fallback_to_render=True) def get_proxy_publish_template(self, node): """ @@ -210,7 +222,7 @@ def reset_render_path(self, node): self.__update_render_path(node, force_reset=True, is_proxy=is_proxy) self.__update_render_path(node, force_reset=True, is_proxy=(not is_proxy)) - def create_new_node(self, profile_name): + def create_new_node(self, profile_name, write_type): """ Creates a new write node @@ -244,7 +256,7 @@ def create_new_node(self, profile_name): self._app.log_debug("Created Shotgun Write Node %s" % node.name()) # set the profile: - self.__set_profile(node, profile_name, reset_all_settings=True) + self.__set_profile(node, profile_name, write_type, reset_all_settings=True) return node @@ -276,9 +288,11 @@ def process_placeholder_nodes(self): n.dependencies()[0].setSelected(True) except: pass + # set the write type for creation of correct output + write_type = self.get_node_write_type_name(node) # create the node: - new_node = self.create_new_node(profile_name) + new_node = self.create_new_node(profile_name, write_type) # set the output: self.__set_output(new_node, output_name) @@ -408,8 +422,7 @@ def convert_sg_to_nuke_write_nodes(self): # copy across any knob values from the internal write node. for knob_name, knob in int_wn.knobs().iteritems(): # skip knobs we don't want to copy: - if knob_name in ["file_type", "file", "proxy", "beforeRender", "afterRender", - "name", "xpos", "ypos"]: + if knob_name in ["file_type", "file", "proxy", "beforeRender", "afterRender", "name", "xpos", "ypos"]: continue if knob_name in new_wn.knobs(): @@ -435,7 +448,7 @@ def convert_sg_to_nuke_write_nodes(self): knob = nuke.String_Knob("tk_output") knob.setValue(sg_wn[TankWriteNodeHandler.OUTPUT_KNOB_NAME].value()) new_wn.addKnob(knob) - + # use node name for output knob = nuke.Boolean_Knob(TankWriteNodeHandler.USE_NAME_AS_OUTPUT_KNOB_NAME) knob.setValue(sg_wn[TankWriteNodeHandler.USE_NAME_AS_OUTPUT_KNOB_NAME].value()) @@ -541,9 +554,7 @@ def convert_nuke_to_sg_write_nodes(self): # copy across and knob values from the internal write node. for knob_name, knob in wn.knobs().iteritems(): # skip knobs we don't want to copy: - if knob_name in ["file_type", "file", "proxy", "beforeRender", "afterRender", - "name", "xpos", "ypos", "disable", "tile_color", "postage_stamp", - "label"]: + if knob_name in ["file_type", "file", "proxy", "beforeRender", "afterRender", "name", "xpos", "ypos", "disable", "tile_color", "postage_stamp", "label"]: continue if knob_name in int_wn.knobs(): @@ -565,6 +576,46 @@ def convert_nuke_to_sg_write_nodes(self): new_sg_wn.setXpos(node_pos[0]) new_sg_wn.setYpos(node_pos[1]) + def get_sg_info(self): + """ + Retrieves secific version info from SG and caches + """ + self._version_info = {} + sg = shotgun_api3.Shotgun( + base_url ="https://screenscene.shotgunstudio.com", + script_name="nuke_write_access", + api_key="289aad9e8eb0c385fc8732cf25536c9cb160d7081ea08479bc6cdb01092c3aa0") + + ctx_info = self._app.context + + filters = [ + ['entity', 'is', {'type': 'Shot', 'id': ctx_info.entity['id']}], + ['sg_task.Task.step.Step.id', 'is', ctx_info.step['id']] + ] + fields = ['id', 'code', 'sg_asset_type', 'created_at' , 'sg_version_number', 'description'] + additional_filter_presets = [ + { + "preset_name": "LATEST", + "latest_by": "ENTITIES_CREATED_AT" + }] + + self._version_info = sg.find_one("Version",filters,fields,additional_filter_presets = additional_filter_presets,include_archived_projects=False) + sg.close() + + def get_node_write_type_name(self, node): + """ + Return the name of the profile the specified node is using + """ + return node.knob("write_type").value() + + def sync_frames_from_SG(self): + eng = tank.platform.current_engine() + try: + app = eng.apps["tk-multi-setframerange"] + app.run_app() + except: + self._app.log_debug("Failed to sync frames") + raise ################################################################################################ # Public methods called from gizmo - although these are public, they should @@ -755,6 +806,7 @@ def on_before_render_gizmo_callback(self): self._app.log_error("The Write node's beforeRender setting failed " "to execute!") raise + def on_after_render_gizmo_callback(self): """ Callback from nuke whenever a tank write node has finished being rendered @@ -809,10 +861,10 @@ def __get_template(self, node, name): # the profile probably doesn't exist any more so # try to use the cached version template_name = node.knob(name).value() - + return self._app.get_template_by_name(template_name) - def __get_render_template(self, node, is_proxy=False, fallback_to_render=False): + def __get_render_template(self, node, write_type, is_proxy=False, fallback_to_render=False): """ Get a specific render template for the current profile @@ -822,10 +874,26 @@ def __get_render_template(self, node, is_proxy=False, fallback_to_render=False): """ if is_proxy: template = self.__get_template(node, "proxy_render_template") + if template or not fallback_to_render: + return template + if write_type == "Precomp": + template = self.__get_template(node, "precomp_render_template") + if template or not fallback_to_render: + return template + elif write_type == "Element": + template = self.__get_template(node, "element_render_template") + if template or not fallback_to_render: + return template + elif write_type == "Denoise": + template = self.__get_template(node, "denoise_render_template") + if template or not fallback_to_render: + return template + elif write_type == "Test": + template = self.__get_template(node, "test_render_template") if template or not fallback_to_render: return template - - return self.__get_template(node, "render_template") + else: + return self.__get_template(node, "render_template") def __get_publish_template(self, node, is_proxy=False): """ @@ -841,8 +909,9 @@ def __is_output_used(self, node): Determine if output key is used in either the render or the proxy render templates """ - render_template = self.__get_render_template(node, is_proxy=False) - proxy_render_template = self.__get_render_template(node, is_proxy=True) + write_type = self.get_node_write_type_name(node) + render_template = self.__get_render_template(node, write_type, is_proxy=False) + proxy_render_template = self.__get_render_template(node, write_type, is_proxy=True) for template in [render_template, proxy_render_template]: if not template: @@ -852,7 +921,7 @@ def __is_output_used(self, node): return True return False - + def __update_knob_value(self, node, name, new_value): """ Update the value for the specified knob on the specified node @@ -870,13 +939,13 @@ def __update_output_knobs(self, node): """ output_knob = node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME) name_as_output_knob = node.knob(TankWriteNodeHandler.USE_NAME_AS_OUTPUT_KNOB_NAME) - + output_is_used = self.__is_output_used(node) name_as_output = name_as_output_knob.value() - - output_knob.setEnabled(output_is_used and not name_as_output) - output_knob.setVisible(output_is_used) - name_as_output_knob.setVisible(output_is_used) + + # output_knob.setEnabled(output_is_used and not name_as_output) + # output_knob.setVisible(output_is_used) + # name_as_output_knob.setVisible(output_is_used) def __update_path_preview(self, node, is_proxy): """ @@ -886,7 +955,11 @@ def __update_path_preview(self, node, is_proxy): # this will be displayed on the node in the graph # useful to tell what type of node it is pn = node.knob("profile_name").value() - label = "Shotgun Write %s" % pn + + # set the write type for creation of correct output + write_type = self.get_node_write_type_name(node) + + label = "%s - %s" % (write_type, pn) self.__update_knob_value(node, "label", label) # get the render path: @@ -910,12 +983,50 @@ def __update_path_preview(self, node, is_proxy): file_name = os.path.basename(norm_path) render_dir = os.path.dirname(norm_path) - # now get the context path - context_path = None - for x in self._app.context.entity_locations: - if render_dir.startswith(x): - context_path = x - + # retrieve the correct context based on the dynamic + # file structure we have to separate out test + # renders from primary ones + # get the current script path: + script_path = self.__get_current_script_path() + work_template = self._app.tank.template_from_path(script_path) + curr_fields = work_template.get_fields(script_path) + curr_entity_type = self._app.context.entity['type'] + + if curr_entity_type == 'Shot': + fields ={ + + 'Shot': curr_fields['Shot'], + 'Step': curr_fields['Step'], + 'name': '', + 'output': '', + 'version': curr_fields['version'] + } + elif curr_entity_type == 'Asset': + fields ={ + + 'Shot': curr_fields['Asset'], + 'Step': curr_fields['Step'], + 'name': '', + 'output': '', + 'version': curr_fields['version'] + } + fields ={ + + 'Shot': curr_fields['Shot'], + 'Step': curr_fields['Step'], + 'name': '', + 'output': '', + 'version': curr_fields['version'] + } + + + if write_type != "Test": + context_info = self._app.tank.templates['shot_render_global'] + else: + context_info = self._app.tank.templates['shot_render_test_global'] + + context_path = context_info.apply_fields(fields) + if context_path: # found a context path! # chop off this bit from the normalized path @@ -951,8 +1062,7 @@ def set_path_knob(name, value): set_path_knob("path_context", context_path) set_path_knob("path_local", local_path) - set_path_knob("path_filename", file_name) - + set_path_knob("path_filename", file_name) def __apply_cached_file_format_settings(self, node): """ @@ -978,8 +1088,7 @@ def __apply_cached_file_format_settings(self, node): # update the node: self.__populate_format_settings(node, file_type, file_settings) - - def __set_profile(self, node, profile_name, reset_all_settings=False): + def __set_profile(self, node, profile_name, write_type, reset_all_settings=False): """ Set the current profile for the specified node. @@ -1010,12 +1119,20 @@ def __set_profile(self, node, profile_name, reset_all_settings=False): # keep track of the old profile name: old_profile_name = node.knob("profile_name").value() + # keep track of the old write type name: + old_write_type_name = node.knob("write_type").value() + # pull settings from profile: render_template = self._app.get_template_by_name(profile["render_template"]) publish_template = self._app.get_template_by_name(profile["publish_template"]) proxy_render_template = self._app.get_template_by_name(profile["proxy_render_template"]) proxy_publish_template = self._app.get_template_by_name(profile["proxy_publish_template"]) + precomp_render_template = self._app.get_template_by_name(profile["precomp_render_template"]) + element_render_template = self._app.get_template_by_name(profile["element_render_template"]) + denoise_render_template = self._app.get_template_by_name(profile["denoise_render_template"]) + test_render_template = self._app.get_template_by_name(profile["test_render_template"]) + file_type = profile["file_type"] file_settings = profile["settings"] tile_color = profile["tile_color"] @@ -1038,7 +1155,19 @@ def __set_profile(self, node, profile_name, reset_all_settings=False): reset_all_settings, promote_write_knobs, ) - + + # set the channel info based on the profile type + if profile_name == "Dpx": + self.__update_knob_value(node, "channels", "rgb") + elif profile_name == "Exr 16 bit (ZIP)": + self.__update_knob_value(node, "channels", "rgba") + elif profile_name == "Exr 16 bit(RLE)": + self.__update_knob_value(node, "channels", "rgba") + elif profile_name == "Jpeg": + self.__update_knob_value(node, "channels", "rgb") + else: + nuke.tprint("No profile with that name") + # cache the type and settings on the root node so that # they get serialized with the script: self.__update_knob_value(node, "tk_file_type", file_type) @@ -1095,6 +1224,10 @@ def __set_profile(self, node, profile_name, reset_all_settings=False): proxy_render_template.name if proxy_render_template else "") self.__update_knob_value(node, "proxy_publish_template", proxy_publish_template.name if proxy_publish_template else "") + self.__update_knob_value(node, "precomp_render_template", precomp_render_template.name) + self.__update_knob_value(node, "denoise_render_template", denoise_render_template.name) + self.__update_knob_value(node, "element_render_template", element_render_template.name) + self.__update_knob_value(node, "test_render_template", test_render_template.name) # If a node's tile_color was defined in the profile then set it: if not tile_color or len(tile_color) != 3: @@ -1104,7 +1237,20 @@ def __set_profile(self, node, profile_name, reset_all_settings=False): "setting will be ignored!") % profile_name) # reset tile_color knob value back to default: - default_value = int(node["tile_color"].defaultValue()) + if write_type == "Precomp": + default_value = 4121611007 + + elif write_type == "Element": + default_value = 1095751564801 + + elif write_type == "Denoise": + default_value = 309868287 + + elif write_type == "Test": + default_value = 4278190081 + + else: + default_value = int(node["tile_color"].defaultValue()) self.__update_knob_value(node, "tile_color", default_value) else: # build packed RGB @@ -1115,11 +1261,28 @@ def __set_profile(self, node, profile_name, reset_all_settings=False): self.__update_knob_value(node, "tile_color", packed_rgb) + # set the channel info based on the profile type + profile_channel = "rgb" + if profile_name == "Dpx": + profile_channel = "rgb" + elif profile_name == "Exr 16 bit (ZIP)": + profile_channel = "all" + elif profile_name == "Jpeg": + profile_channel = "rgb" + else: + nuke.tprint("No profile with that name") + + self.__update_knob_value(node, "channels", profile_channel) + + # Version info visibility + self.__update_version_preview(node, write_type) + + # Reset the render path but only if the named profile has changed - this will only # be the case if the user has changed the profile through the UI so this will avoid # the node automatically updating without the user's knowledge. - if profile_name != old_profile_name: - self.reset_render_path(node) + + self.reset_render_path(node) def __populate_initial_output_name(self, template, node): """ @@ -1147,11 +1310,15 @@ def __populate_initial_output_name(self, template, node): if not have_output_key: # Nothing to do! return - + if output_default is None: # no default name - use hard coded built in - output_default = "output" - + step_name = self._app.context.step['name']#.lower() + if step_name: + output_default = step_name + else: + output_default = "output" + # get the output names for all other nodes that are using the same profile used_output_names = set() node_profile = self.get_node_profile_name(node) @@ -1170,13 +1337,12 @@ def __populate_initial_output_name(self, template, node): while output_name in used_output_names: output_name = "%s%d" % (output_default, postfix) postfix += 1 - + + # finally, set the output name on the knob: node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setValue(output_name) - def __populate_format_settings( - self, node, file_type, file_settings, reset_all_settings=False, promoted_write_knobs=None - ): + def __populate_format_settings(self, node, file_type, file_settings, reset_all_settings=False, promoted_write_knobs=None): """ Controls the file format of the write node @@ -1505,7 +1671,9 @@ def __get_files_on_disk(self, node, is_proxy=False): Returns the files on disk associated with this node """ file_name = self.__get_render_path(node, is_proxy) - template = self.__get_render_template(node, is_proxy, fallback_to_render=True) + # set the write type for creation of correct output + write_type = self.get_node_write_type_name(node) + template = self.__get_render_template(node, write_type, is_proxy, fallback_to_render=True) if not template.validate(file_name): raise Exception("Could not resolve the files on disk for node %s." @@ -1569,7 +1737,6 @@ def __calculate_proxy_dimensions(self, node): #print ("sx:", scale_x, "sy:", scale_y, "tx:", offset_x, "ty:", offset_y, # "w:", scaled_format.width(), "h:", scaled_format.height()) return (scaled_format.width(), scaled_format.height()) - def __gather_render_settings(self, node, is_proxy=False): """ @@ -1580,7 +1747,10 @@ def __gather_render_settings(self, node, is_proxy=False): :param is_proxy: If True then compute the proxy path, otherwise compute the standard render path :returns: Tuple containing (render template, width, height, output name) """ - render_template = self.__get_render_template(node, is_proxy) + # set the write type for creation of correct output + write_type = self.get_node_write_type_name(node) + + render_template = self.__get_render_template(node, write_type, is_proxy) width = height = 0 output_name = "" @@ -1607,7 +1777,6 @@ def __gather_render_settings(self, node, is_proxy=False): return (render_template, width, height, output_name) - def __compute_render_path(self, node, is_proxy=False): """ Computes the render path for a node. @@ -1673,7 +1842,7 @@ def __compute_render_path_from(self, node, render_template, width, height, outpu if key_name in fields: del(fields[key_name]) - if key_name in render_template.keys: + if key_name in render_template.keys: if not output_name: if not render_template.is_optional(key_name): raise TkComputePathError("A valid output name is required by this profile for the '%s' field!" @@ -1682,10 +1851,9 @@ def __compute_render_path_from(self, node, render_template, width, height, outpu if not render_template.keys[key_name].validate(output_name): raise TkComputePathError("The output name '%s' contains illegal characters!" % output_name) fields[key_name] = output_name - + # update with additional fields from the context: fields.update(self._app.context.as_template_fields(render_template)) - # generate the render path: path = "" try: @@ -1707,8 +1875,11 @@ def __is_render_path_locked(self, node, render_path, cached_path, is_proxy=False The path is locked if a new path generated with the previous template fields would be different to the cached path ignoring the width & height fields. """ + # set the write type for creation of correct output + write_type = self.get_node_write_type_name(node) + # get the render template: - render_template = self.__get_render_template(node, is_proxy, fallback_to_render=True) + render_template = self.__get_render_template(node, write_type, is_proxy, fallback_to_render=True) if not render_template: return True @@ -1763,7 +1934,7 @@ def __setup_new_node(self, node): return self._app.log_debug("Setting up new node...") - + # populate the profiles list as this isn't stored with the file and is # dynamic based on the user's configuration profile_names = list(self._profile_names) @@ -1786,10 +1957,14 @@ def __setup_new_node(self, node): # sure we reset all settings reset_all_profile_settings = True + # set the write type for creation of correct output + write_type = self.get_node_write_type_name(node) + # ensure that the correct entry is selected from the list: self.__update_knob_value(node, "tk_profile_list", current_profile_name) + # and make sure the node is up-to-date with the profile: - self.__set_profile(node, current_profile_name, reset_all_settings=reset_all_profile_settings) + self.__set_profile(node, current_profile_name, write_type, reset_all_settings=reset_all_profile_settings) # ensure that the disable value properly propogates to the internal write node: write_node = node.node(TankWriteNodeHandler.WRITE_NODE_NAME) @@ -1806,7 +1981,13 @@ def __setup_new_node(self, node): # force output name to be the node name: new_output_name = node.knob("name").value() self.__set_output(node, new_output_name) - + + if write_type == "Version": + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + + # set the version info if it exists + self.__update_version_preview(node, write_type) + # now that the node is constructed, we can process knob changes # correctly. node.knob("tk_is_fully_constructed").setValue(True) @@ -1833,7 +2014,7 @@ def __on_knob_changed(self): """ node = nuke.thisNode() knob = nuke.thisKnob() - grp = nuke.thisGroup() + grp = nuke.thisGroup() if not self.__is_node_fully_constructed(node): # knobChanged will be called during script load for all knobs with non-default @@ -1846,30 +2027,162 @@ def __on_knob_changed(self): if knob.name() == "tk_profile_list": # change the profile for the specified node: new_profile_name = knob.value() - self.__set_profile(node, new_profile_name, reset_all_settings=True) - + # set the write type for creation of correct output + write_type = self.get_node_write_type_name(node) + self.__set_profile(node, new_profile_name, write_type, reset_all_settings=True) elif knob.name() == TankWriteNodeHandler.OUTPUT_KNOB_NAME: # internal cached output has been changed! new_output_name = knob.value() if node.knob(TankWriteNodeHandler.USE_NAME_AS_OUTPUT_KNOB_NAME).value(): # force output name to be the node name: new_output_name = node.knob("name").value() - self.__set_output(node, new_output_name) - + self.__set_output(node, new_output_name) elif knob.name() == "name": # node name has changed: if node.knob(TankWriteNodeHandler.USE_NAME_AS_OUTPUT_KNOB_NAME).value(): # set the output to the node name: - self.__set_output(node, knob.value()) - + self.__set_output(node, knob.value()) elif knob.name() == TankWriteNodeHandler.USE_NAME_AS_OUTPUT_KNOB_NAME: # checkbox controlling if the name should be used as the output has been toggled name_as_output = knob.value() - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(not name_as_output) - if name_as_output: - # update output to reflect the node name: - self.__set_output(node, node.knob("name").value()) - + if node.knob(TankWriteNodeHandler.USE_NAME_AS_OUTPUT_KNOB_NAME).value(): + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(not name_as_output) + if name_as_output: + # update output to reflect the node name: + self.__set_output(node, node.knob("name").value()) + else: + step_name = self._app.context.step['name'] + if step_name: + new_output_name = step_name + else: + new_output_name = "output" + self.__set_output(node, new_output_name) + elif knob.name() == "write_type": + # set the write type for creation of correct output + curr_entity_type = self._app.context.entity['type'] + if curr_entity_type == 'Shot': + write_type = self.get_node_write_type_name(node) + write_type_profile = "Dpx" + write_type_color = 0 + if write_type== "Version": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + self.__update_knob_value(node, "tank_channel", "") + write_type_profile = "Dpx" + elif write_type == "Precomp": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + write_type_profile = "Exr 16 bit (ZIP)" + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + elif write_type == "Element": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + write_type_profile = "Exr 16 bit (ZIP)" + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + elif write_type == "Denoise": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + write_type_profile = "Dpx" + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + elif write_type == "Test": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + write_type_profile = "Dpx" + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + # Pop warning that the renders saved to the Test location + user_name = self._app.context.user['name'].split() + nuke.message( + "Hi %s" % str(user_name[0]) + "\n" + "\n" + "Please be aware that this is a temporary location.\n" + "Renders saved here will be removed at the end of the week.\n") + # Updates the predefined profile based on the write type + self.__update_knob_value(node, "tk_profile_list", write_type_profile) + # reset profile + self.__set_profile(node, write_type_profile, write_type, reset_all_settings=True) + elif curr_entity_type == 'Asset': + write_type = self.get_node_write_type_name(node) + write_type_profile = "Exr 16 bit (ZIP)" + write_type_color = 0 + if write_type== "Version": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + self.__update_knob_value(node, "tank_channel", "") + write_type_profile = "Exr 16 bit (ZIP)" + elif write_type == "Precomp": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + write_type_profile = "Exr 16 bit (ZIP)" + elif write_type == "Element": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + write_type_profile = "Exr 16 bit (ZIP)" + elif write_type == "Denoise": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + write_type_profile = "Exr 16 bit (ZIP)" + elif write_type == "Test": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + write_type_profile = "Exr 16 bit (ZIP)" + # Pop warning that the renders saved to the Test location + user_name = self._app.context.user['name'].split() + nuke.message( + "Hi %s" % str(user_name[0]) + "\n" + "\n" + "Please be aware that this is a temporary location.\n" + "Renders saved here will be removed at the end of the week.\n") + # Updates the predefined profile based on the write type + self.__update_knob_value(node, "tk_profile_list", write_type_profile) + # reset profile + self.__set_profile(node, write_type_profile, write_type, reset_all_settings=True) + + + + + elif knob.name() == "sync_from_sg": + self.sync_frames_from_SG() + elif knob.name() == "refresh_version_info": + write_type = self.get_node_write_type_name(node) + self.get_sg_info() + self.__update_version_preview(node, write_type) + # node name has changed: + version_ui = ["latest_version", "version_date", "version_description"] + new_profile_name = node.knob("tk_profile_list").value() + # set the write type for creation of correct output + write_type = self.get_node_write_type_name(node) + write_type_color = 0 + if write_type== "Version": + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + self.__update_knob_value(node, "tank_channel", "") + write_type_color = 0 + self.__hide_UI(node, version_ui, True) + self.__set_profile(node, new_profile_name, write_type, reset_all_settings=True) + elif write_type == "Test": + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + write_type_color = 4278190081 + self.__hide_UI(node, version_ui, False) + self.__set_profile(node, new_profile_name, write_type, reset_all_settings=True) + # Pop warning that the renders saved to the Test location + # will be removed on a weekly basis + user_name = self._app.context.user['name'].split() + nuke.message( + "Hi %s" % str(user_name[0]) + "\n" + "\n" + "Please be aware that this is a temporary location.\n" + "Renders saved here will be removed at the end of the week.\n") + elif write_type == "Precomp": + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + write_type_color = 4278255361 + self.__hide_UI(node, version_ui, False) + self.__set_profile(node, new_profile_name, write_type, reset_all_settings=True) + elif write_type == "Element": + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + write_type_color = 1095751564801 + self.__hide_UI(node, version_ui, False) + self.__set_profile(node, new_profile_name, write_type, reset_all_settings=True) + self.__update_knob_value(node, "tile_color", write_type_color) + elif knob.name() == "sync_from_sg": + self.sync_frames_from_SG() + elif knob.name() == "refresh_version_info": + self.get_sg_info() + self.__update_version_preview(node, write_type) else: # Propogate changes to certain knobs from the gizmo/group to the # encapsulated Write node. @@ -1925,7 +2238,6 @@ def __get_current_script_path(self): return script_path - def __on_script_save(self): """ Called when the script is saved. @@ -1975,7 +2287,7 @@ def __on_script_save(self): "tk_write_node_settings", unicode(base64.b64encode(knob_changes)), ) - + def __on_user_create(self): """ Called when the user creates a Shotgun Write node. Not called when loading @@ -1991,16 +2303,71 @@ def __on_user_create(self): # setup the new node: self.__setup_new_node(node) - + + # set the write type for creation of correct output + write_type = self.get_node_write_type_name(node) + # populate the initial output name based on the render template: - render_template = self.get_render_template(node) + render_template = self.get_render_template(node, write_type) self.__populate_initial_output_name(render_template, node) + def __update_version_preview(self, node, write_type): + """ + #Updates the version info fields on the tank write node. + """ + # Version specific UI names + version_ui = ["latest_version", "version_date", "version_description", "Description", "refresh_version_info", "version_info_breaker"] + if write_type != "Version": + self.__hide_UI(node, version_ui, False) + if not self._version_info: + return + else: + self.__hide_UI(node, version_ui, True) + if self._version_info: + self.__update_knob_value(node, "latest_version", str(self._version_info['code'])) + self.__update_knob_value(node, "version_date", str(self._version_info['created_at'])) + self.__update_knob_value(node, "version_description", str(self._version_info['description'])) + if not self._version_info: + return + def __hide_UI(self, node, ui_name_array, visibility): + if not ui_name_array: + return + else: + for i in ui_name_array: + k = node.knob(i) + if k: + k.setVisible(visibility) + def __disable_UI(self, node, ui_name_array, enabled): + if not ui_name_array: + return + else: + for i in ui_name_array: + k = node.knob(i) + k.setEnabled(enabled) + def __update_knob_values(self, node, name, values_list): - - \ No newline at end of file + if not values_list: + return None + else: + k = node.knob(name) + if k.values != values_list: + k.setValues(values_list) + + def __get_list_index(self, the_list, item_name): + + if the_list: + if item_name in the_list: + return the_list.index(item_name) + else: + nuke.tprint ("Couldn't find the given item_name in list") + return 0 + + def __construct_version_name(self, node): + + if self._version_info: + print self._version_info From 3fd3733ddc6ae9477181382cf6a35b3597340160 Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 28 Jul 2017 17:12:51 +0100 Subject: [PATCH 02/38] removed farm render --- gizmos/WriteTank.gizmo | 6 ------ 1 file changed, 6 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index c682a1a..d3564d8 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -337,12 +337,6 @@ Gizmo { T Write1.Render -STARTLINE } - addUserKnob { - 32 farm_render - l "Farm Render" - T " " - -STARTLINE - } addUserKnob { 41 first l "frame range" From 2b8a907c41d7700421c50e256f6a8bdacdd993b9 Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 11 Aug 2017 09:06:49 +0100 Subject: [PATCH 03/38] cleaned up context finding --- python/tk_nuke_writenode/handler.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 8b691c6..68d226b 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -964,7 +964,6 @@ def __update_path_preview(self, node, is_proxy): # get the render path: path = self.__get_render_path(node, is_proxy) - # calculate the parts: context_path = local_path = file_name = "" @@ -1019,14 +1018,18 @@ def __update_path_preview(self, node, is_proxy): 'version': curr_fields['version'] } - - if write_type != "Test": - context_info = self._app.tank.templates['shot_render_global'] + if write_type == "Test": + context_info = self._app.tank.templates['shot_render_test_global'] + elif write_type == "Denoise": + context_info = self._app.tank.templates['shot_render_library_global'] + elif write_type == "Precomp": + context_info = self._app.tank.templates['shot_render_library_global'] + elif write_type == "Element": + context_info = self._app.tank.templates['shot_render_library_global'] else: - context_info = self._app.tank.templates['shot_render_test_global'] + context_info = self._app.tank.templates['shot_render_global'] context_path = context_info.apply_fields(fields) - if context_path: # found a context path! # chop off this bit from the normalized path From cf8e6f68a08835aeff7b3fd5b18bf55bee2905ae Mon Sep 17 00:00:00 2001 From: daawaa Date: Tue, 15 Aug 2017 13:12:42 +0100 Subject: [PATCH 04/38] remove general fields dict - now works off Asset/Shot --- python/tk_nuke_writenode/handler.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 68d226b..e0b39fd 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1009,14 +1009,14 @@ def __update_path_preview(self, node, is_proxy): 'output': '', 'version': curr_fields['version'] } - fields ={ - - 'Shot': curr_fields['Shot'], - 'Step': curr_fields['Step'], - 'name': '', - 'output': '', - 'version': curr_fields['version'] - } + # fields ={ + + # 'Shot': curr_fields['Shot'], + # 'Step': curr_fields['Step'], + # 'name': '', + # 'output': '', + # 'version': curr_fields['version'] + # } if write_type == "Test": context_info = self._app.tank.templates['shot_render_test_global'] From eb015e4103294dc1e23a137e218ab5578e8b61e3 Mon Sep 17 00:00:00 2001 From: daawaa Date: Wed, 16 Aug 2017 12:30:06 +0100 Subject: [PATCH 05/38] opened up version naming for Assets --- python/tk_nuke_writenode/handler.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index e0b39fd..9b8d4d7 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1984,10 +1984,13 @@ def __setup_new_node(self, node): # force output name to be the node name: new_output_name = node.knob("name").value() self.__set_output(node, new_output_name) - - if write_type == "Version": - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - + curr_entity_type = self._app.context.entity['type'] + if curr_entity_type == 'Shot': + if write_type == "Version": + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + if curr_entity_type == 'Asset': + if write_type == "Version": + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) # set the version info if it exists self.__update_version_preview(node, write_type) @@ -2105,7 +2108,7 @@ def __on_knob_changed(self): write_type_color = 0 if write_type== "Version": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) self.__update_knob_value(node, "tank_channel", "") write_type_profile = "Exr 16 bit (ZIP)" elif write_type == "Precomp": From 8d0963a240363bbcc28a1fd1942ece287d44646b Mon Sep 17 00:00:00 2001 From: daawaa Date: Wed, 16 Aug 2017 13:06:09 +0100 Subject: [PATCH 06/38] Fixed asset output setup --- python/tk_nuke_writenode/handler.py | 52 ++++++++++++++++------------- 1 file changed, 28 insertions(+), 24 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 9b8d4d7..4ea5de0 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -990,46 +990,49 @@ def __update_path_preview(self, node, is_proxy): work_template = self._app.tank.template_from_path(script_path) curr_fields = work_template.get_fields(script_path) curr_entity_type = self._app.context.entity['type'] - if curr_entity_type == 'Shot': fields ={ - 'Shot': curr_fields['Shot'], 'Step': curr_fields['Step'], 'name': '', 'output': '', 'version': curr_fields['version'] } + if write_type == "Test": + context_info = self._app.tank.templates['shot_render_test_global'] + elif write_type == "Denoise": + context_info = self._app.tank.templates['shot_render_library_global'] + elif write_type == "Precomp": + context_info = self._app.tank.templates['shot_render_library_global'] + elif write_type == "Element": + context_info = self._app.tank.templates['shot_render_library_global'] + else: + context_info = self._app.tank.templates['shot_render_global'] + + context_path = context_info.apply_fields(fields) + elif curr_entity_type == 'Asset': fields ={ - - 'Shot': curr_fields['Asset'], + 'Asset': curr_fields['Asset'], 'Step': curr_fields['Step'], + 'sg_asset_type': curr_fields['sg_asset_type'], 'name': '', 'output': '', 'version': curr_fields['version'] } - # fields ={ - - # 'Shot': curr_fields['Shot'], - # 'Step': curr_fields['Step'], - # 'name': '', - # 'output': '', - # 'version': curr_fields['version'] - # } - - if write_type == "Test": - context_info = self._app.tank.templates['shot_render_test_global'] - elif write_type == "Denoise": - context_info = self._app.tank.templates['shot_render_library_global'] - elif write_type == "Precomp": - context_info = self._app.tank.templates['shot_render_library_global'] - elif write_type == "Element": - context_info = self._app.tank.templates['shot_render_library_global'] - else: - context_info = self._app.tank.templates['shot_render_global'] + if write_type == "Test": + context_info = self._app.tank.templates['asset_render_test_global'] + elif write_type == "Denoise": + context_info = self._app.tank.templates['asset_render_library_global'] + elif write_type == "Precomp": + context_info = self._app.tank.templates['asset_render_library_global'] + elif write_type == "Element": + context_info = self._app.tank.templates['asset_render_library_global'] + else: + context_info = self._app.tank.templates['asset_render_global'] + + context_path = context_info.apply_fields(fields) - context_path = context_info.apply_fields(fields) if context_path: # found a context path! # chop off this bit from the normalized path @@ -1985,6 +1988,7 @@ def __setup_new_node(self, node): new_output_name = node.knob("name").value() self.__set_output(node, new_output_name) curr_entity_type = self._app.context.entity['type'] + if curr_entity_type == 'Shot': if write_type == "Version": node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) From 64a996ff04c7a73d8e2db5c4de4e31b4a0ff8a9f Mon Sep 17 00:00:00 2001 From: daawaa Date: Thu, 17 Aug 2017 12:32:15 +0100 Subject: [PATCH 07/38] Removed ZIP compression --- python/tk_nuke_writenode/handler.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 4ea5de0..4ca088f 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1165,9 +1165,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False # set the channel info based on the profile type if profile_name == "Dpx": self.__update_knob_value(node, "channels", "rgb") - elif profile_name == "Exr 16 bit (ZIP)": - self.__update_knob_value(node, "channels", "rgba") - elif profile_name == "Exr 16 bit(RLE)": + elif profile_name == "Exr 16 bit": self.__update_knob_value(node, "channels", "rgba") elif profile_name == "Jpeg": self.__update_knob_value(node, "channels", "rgb") @@ -1271,7 +1269,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False profile_channel = "rgb" if profile_name == "Dpx": profile_channel = "rgb" - elif profile_name == "Exr 16 bit (ZIP)": + elif profile_name == "Exr 16 bit": profile_channel = "all" elif profile_name == "Jpeg": profile_channel = "rgb" @@ -2081,11 +2079,11 @@ def __on_knob_changed(self): write_type_profile = "Dpx" elif write_type == "Precomp": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - write_type_profile = "Exr 16 bit (ZIP)" + write_type_profile = "Exr 16 bit" node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) elif write_type == "Element": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - write_type_profile = "Exr 16 bit (ZIP)" + write_type_profile = "Exr 16 bit" node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) elif write_type == "Denoise": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") @@ -2108,29 +2106,29 @@ def __on_knob_changed(self): self.__set_profile(node, write_type_profile, write_type, reset_all_settings=True) elif curr_entity_type == 'Asset': write_type = self.get_node_write_type_name(node) - write_type_profile = "Exr 16 bit (ZIP)" + write_type_profile = "Exr 16 bit" write_type_color = 0 if write_type== "Version": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) self.__update_knob_value(node, "tank_channel", "") - write_type_profile = "Exr 16 bit (ZIP)" + write_type_profile = "Exr 16 bit" elif write_type == "Precomp": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) - write_type_profile = "Exr 16 bit (ZIP)" + write_type_profile = "Exr 16 bit" elif write_type == "Element": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) - write_type_profile = "Exr 16 bit (ZIP)" + write_type_profile = "Exr 16 bit" elif write_type == "Denoise": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - write_type_profile = "Exr 16 bit (ZIP)" + write_type_profile = "Exr 16 bit" elif write_type == "Test": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) - write_type_profile = "Exr 16 bit (ZIP)" + write_type_profile = "Exr 16 bit" # Pop warning that the renders saved to the Test location user_name = self._app.context.user['name'].split() nuke.message( From 206f3e16631c65f29f94fef5963d6aae68dbfa6f Mon Sep 17 00:00:00 2001 From: daawaa Date: Mon, 21 Aug 2017 16:17:48 +0100 Subject: [PATCH 08/38] Adding cleanup as an option to the write node --- gizmos/WriteTank.gizmo | 8 +++++- python/tk_nuke_writenode/handler.py | 39 ++++++++++++++++++++++------- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index d3564d8..d093198 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -53,6 +53,12 @@ Gizmo { t "The Sgtk denoise template associated with this node" +INVISIBLE } + addUserKnob { + 1 cleanup_render_template + l "Sgtk Cleanup Template" + t "The Sgtk cleanup template associated with this node" + +INVISIBLE + } addUserKnob { 1 test_render_template l "Sgtk Test Template" @@ -204,7 +210,7 @@ Gizmo { 4 write_type l "SG Write Type" t "Select the type of node you require this to be." - M {Version Precomp Element Denoise Test} + M {Version Precomp Element Denoise Cleanup Test} } addUserKnob { 25 "" diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 4ca088f..b8f21a9 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -888,6 +888,10 @@ def __get_render_template(self, node, write_type, is_proxy=False, fallback_to_re template = self.__get_template(node, "denoise_render_template") if template or not fallback_to_render: return template + elif write_type == "Cleanup": + template = self.__get_template(node, "cleanup_render_template") + if template or not fallback_to_render: + return template elif write_type == "Test": template = self.__get_template(node, "test_render_template") if template or not fallback_to_render: @@ -1000,12 +1004,14 @@ def __update_path_preview(self, node, is_proxy): } if write_type == "Test": context_info = self._app.tank.templates['shot_render_test_global'] - elif write_type == "Denoise": - context_info = self._app.tank.templates['shot_render_library_global'] elif write_type == "Precomp": context_info = self._app.tank.templates['shot_render_library_global'] elif write_type == "Element": context_info = self._app.tank.templates['shot_render_library_global'] + elif write_type == "Denoise": + context_info = self._app.tank.templates['shot_render_library_global'] + elif write_type == "Cleanup": + context_info = self._app.tank.templates['shot_render_library_global'] else: context_info = self._app.tank.templates['shot_render_global'] @@ -1022,12 +1028,14 @@ def __update_path_preview(self, node, is_proxy): } if write_type == "Test": context_info = self._app.tank.templates['asset_render_test_global'] - elif write_type == "Denoise": - context_info = self._app.tank.templates['asset_render_library_global'] elif write_type == "Precomp": context_info = self._app.tank.templates['asset_render_library_global'] elif write_type == "Element": context_info = self._app.tank.templates['asset_render_library_global'] + elif write_type == "Denoise": + context_info = self._app.tank.templates['asset_render_library_global'] + elif write_type == "Cleanup": + context_info = self._app.tank.templates['asset_render_library_global'] else: context_info = self._app.tank.templates['asset_render_global'] @@ -1137,6 +1145,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False precomp_render_template = self._app.get_template_by_name(profile["precomp_render_template"]) element_render_template = self._app.get_template_by_name(profile["element_render_template"]) denoise_render_template = self._app.get_template_by_name(profile["denoise_render_template"]) + cleanup_render_template = self._app.get_template_by_name(profile["cleanup_render_template"]) test_render_template = self._app.get_template_by_name(profile["test_render_template"]) file_type = profile["file_type"] @@ -1170,7 +1179,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False elif profile_name == "Jpeg": self.__update_knob_value(node, "channels", "rgb") else: - nuke.tprint("No profile with that name") + nuke.tprint("No profile with the name:", profile_name) # cache the type and settings on the root node so that # they get serialized with the script: @@ -1229,8 +1238,9 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False self.__update_knob_value(node, "proxy_publish_template", proxy_publish_template.name if proxy_publish_template else "") self.__update_knob_value(node, "precomp_render_template", precomp_render_template.name) - self.__update_knob_value(node, "denoise_render_template", denoise_render_template.name) self.__update_knob_value(node, "element_render_template", element_render_template.name) + self.__update_knob_value(node, "denoise_render_template", denoise_render_template.name) + self.__update_knob_value(node, "cleanup_render_template", cleanup_render_template.name) self.__update_knob_value(node, "test_render_template", test_render_template.name) # If a node's tile_color was defined in the profile then set it: @@ -1250,6 +1260,9 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False elif write_type == "Denoise": default_value = 309868287 + elif write_type == "Cleanup": + default_value = 4287911423 + elif write_type == "Test": default_value = 4278190081 @@ -2076,7 +2089,7 @@ def __on_knob_changed(self): self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) self.__update_knob_value(node, "tank_channel", "") - write_type_profile = "Dpx" + write_type_profile = "Exr 16 bit" elif write_type == "Precomp": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") write_type_profile = "Exr 16 bit" @@ -2087,11 +2100,15 @@ def __on_knob_changed(self): node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) elif write_type == "Denoise": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - write_type_profile = "Dpx" + write_type_profile = "Exr 16 bit" + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + elif write_type == "Cleanup": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + write_type_profile = "Exr 16 bit" node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) elif write_type == "Test": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - write_type_profile = "Dpx" + write_type_profile = "Exr 16 bit" node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) # Pop warning that the renders saved to the Test location user_name = self._app.context.user['name'].split() @@ -2125,6 +2142,10 @@ def __on_knob_changed(self): self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) write_type_profile = "Exr 16 bit" + elif write_type == "Cleanup": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + write_type_profile = "Exr 16 bit" elif write_type == "Test": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) From ef519454d7a0742f54e2dba957e708538e3aa1f2 Mon Sep 17 00:00:00 2001 From: daawaa Date: Wed, 23 Aug 2017 09:43:06 +0100 Subject: [PATCH 09/38] rolling back that all renders go to 250 --- python/tk_nuke_writenode/handler.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index b8f21a9..0c4b9b6 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1005,13 +1005,13 @@ def __update_path_preview(self, node, is_proxy): if write_type == "Test": context_info = self._app.tank.templates['shot_render_test_global'] elif write_type == "Precomp": - context_info = self._app.tank.templates['shot_render_library_global'] + context_info = self._app.tank.templates['shot_render_global'] elif write_type == "Element": - context_info = self._app.tank.templates['shot_render_library_global'] + context_info = self._app.tank.templates['shot_render_global'] elif write_type == "Denoise": - context_info = self._app.tank.templates['shot_render_library_global'] + context_info = self._app.tank.templates['shot_render_global'] elif write_type == "Cleanup": - context_info = self._app.tank.templates['shot_render_library_global'] + context_info = self._app.tank.templates['shot_render_global'] else: context_info = self._app.tank.templates['shot_render_global'] @@ -1029,13 +1029,13 @@ def __update_path_preview(self, node, is_proxy): if write_type == "Test": context_info = self._app.tank.templates['asset_render_test_global'] elif write_type == "Precomp": - context_info = self._app.tank.templates['asset_render_library_global'] + context_info = self._app.tank.templates['asset_render_global'] elif write_type == "Element": - context_info = self._app.tank.templates['asset_render_library_global'] + context_info = self._app.tank.templates['asset_render_global'] elif write_type == "Denoise": - context_info = self._app.tank.templates['asset_render_library_global'] + context_info = self._app.tank.templates['asset_render_global'] elif write_type == "Cleanup": - context_info = self._app.tank.templates['asset_render_library_global'] + context_info = self._app.tank.templates['asset_render_global'] else: context_info = self._app.tank.templates['asset_render_global'] From ba0eca85149c3b4517f6832219512362ef1d1cd1 Mon Sep 17 00:00:00 2001 From: daawaa Date: Tue, 29 Aug 2017 16:40:29 +0100 Subject: [PATCH 10/38] added Final write type and reverted EXRs to be rgb --- gizmos/WriteTank.gizmo | 8 +++++++- info.yml | 8 ++++++++ python/tk_nuke_writenode/handler.py | 23 ++++++++++++++++++++++- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index d093198..d36004c 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -59,6 +59,12 @@ Gizmo { t "The Sgtk cleanup template associated with this node" +INVISIBLE } + addUserKnob { + 1 final_render_template + l "Sgtk Final Template" + t "The Sgtk Final template associated with this node" + +INVISIBLE + } addUserKnob { 1 test_render_template l "Sgtk Test Template" @@ -210,7 +216,7 @@ Gizmo { 4 write_type l "SG Write Type" t "Select the type of node you require this to be." - M {Version Precomp Element Denoise Cleanup Test} + M {Version Precomp Element Denoise Cleanup Final Test} } addUserKnob { 25 "" diff --git a/info.yml b/info.yml index 0616f76..ea1d81a 100644 --- a/info.yml +++ b/info.yml @@ -78,6 +78,14 @@ configuration: type: template fields: context, version, SEQ, [channel], [output], [name], [width], [height], [eye], * allows_empty: True + cleanup_render_template: + type: template + fields: context, version, SEQ, [channel], [output], [name], [width], [height], [eye], * + allows_empty: True + final_render_template: + type: template + fields: context, version, SEQ, [channel], [output], [name], [width], [height], [eye], * + allows_empty: True test_render_template: type: template fields: context, version, SEQ, [channel], [output], [name], [width], [height], [eye], * diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 0c4b9b6..7ee7ae1 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -892,6 +892,10 @@ def __get_render_template(self, node, write_type, is_proxy=False, fallback_to_re template = self.__get_template(node, "cleanup_render_template") if template or not fallback_to_render: return template + elif write_type == "Final": + template = self.__get_template(node, "final_render_template") + if template or not fallback_to_render: + return template elif write_type == "Test": template = self.__get_template(node, "test_render_template") if template or not fallback_to_render: @@ -1012,6 +1016,8 @@ def __update_path_preview(self, node, is_proxy): context_info = self._app.tank.templates['shot_render_global'] elif write_type == "Cleanup": context_info = self._app.tank.templates['shot_render_global'] + elif write_type == "Final": + context_info = self._app.tank.templates['shot_render_global'] else: context_info = self._app.tank.templates['shot_render_global'] @@ -1036,6 +1042,8 @@ def __update_path_preview(self, node, is_proxy): context_info = self._app.tank.templates['asset_render_global'] elif write_type == "Cleanup": context_info = self._app.tank.templates['asset_render_global'] + elif write_type == "Final": + context_info = self._app.tank.templates['asset_render_global'] else: context_info = self._app.tank.templates['asset_render_global'] @@ -1146,6 +1154,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False element_render_template = self._app.get_template_by_name(profile["element_render_template"]) denoise_render_template = self._app.get_template_by_name(profile["denoise_render_template"]) cleanup_render_template = self._app.get_template_by_name(profile["cleanup_render_template"]) + final_render_template = self._app.get_template_by_name(profile["final_render_template"]) test_render_template = self._app.get_template_by_name(profile["test_render_template"]) file_type = profile["file_type"] @@ -1241,6 +1250,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False self.__update_knob_value(node, "element_render_template", element_render_template.name) self.__update_knob_value(node, "denoise_render_template", denoise_render_template.name) self.__update_knob_value(node, "cleanup_render_template", cleanup_render_template.name) + self.__update_knob_value(node, "final_render_template", final_render_template.name) self.__update_knob_value(node, "test_render_template", test_render_template.name) # If a node's tile_color was defined in the profile then set it: @@ -1263,6 +1273,9 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False elif write_type == "Cleanup": default_value = 4287911423 + elif write_type == "Final": + default_value = 16711935 + elif write_type == "Test": default_value = 4278190081 @@ -1283,7 +1296,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False if profile_name == "Dpx": profile_channel = "rgb" elif profile_name == "Exr 16 bit": - profile_channel = "all" + profile_channel = "rgb" elif profile_name == "Jpeg": profile_channel = "rgb" else: @@ -2106,6 +2119,10 @@ def __on_knob_changed(self): self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") write_type_profile = "Exr 16 bit" node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + elif write_type == "Final": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + write_type_profile = "Exr 16 bit" + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) elif write_type == "Test": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") write_type_profile = "Exr 16 bit" @@ -2146,6 +2163,10 @@ def __on_knob_changed(self): self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) write_type_profile = "Exr 16 bit" + elif write_type == "Final": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + write_type_profile = "Exr 16 bit" elif write_type == "Test": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) From bac5096606c7b550dbba31e2adacf5451a62ad3c Mon Sep 17 00:00:00 2001 From: daawaa Date: Wed, 30 Aug 2017 15:39:20 +0100 Subject: [PATCH 11/38] Fixed cmp_Comp problem. Also remembers write type for SG node conversion --- app.py | 4 +- gizmos/WriteTank.gizmo | 6 + python/tk_nuke_writenode/handler.py | 176 ++++++++++++++-------------- 3 files changed, 94 insertions(+), 92 deletions(-) diff --git a/app.py b/app.py index bff8dc3..02d645c 100644 --- a/app.py +++ b/app.py @@ -236,6 +236,4 @@ def __add_write_node_commands(self, context=None): icon=write_node_icon, context=context, ) - ) - - + ) \ No newline at end of file diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index d36004c..6d5715f 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -218,6 +218,12 @@ Gizmo { t "Select the type of node you require this to be." M {Version Precomp Element Denoise Cleanup Final Test} } + addUserKnob { + 1 write_type_cache + l "SG Write Type Cache" + t "The cached Write Type for this node" + +INVISIBLE + } addUserKnob { 25 "" - STARTLINE diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 7ee7ae1..0d9429e 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -470,6 +470,12 @@ def convert_sg_to_nuke_write_nodes(self): knob = nuke.String_Knob("tk_proxy_publish_template") knob.setValue(sg_wn["proxy_publish_template"].value()) new_wn.addKnob(knob) + + #write type + knob = nuke.String_Knob("tk_write_type") + knob.setValue(sg_wn["write_type_cache"].value()) + new_wn.addKnob(knob) + # delete original node: nuke.delete(sg_wn) @@ -502,6 +508,7 @@ def convert_nuke_to_sg_write_nodes(self): # look for additional toolkit knobs: profile_knob = wn.knob("tk_profile_name") + write_knob = wn.knob("tk_write_type") output_knob = wn.knob("tk_output") use_name_as_output_knob = wn.knob(TankWriteNodeHandler.USE_NAME_AS_OUTPUT_KNOB_NAME) render_template_knob = wn.knob("tk_render_template") @@ -512,6 +519,7 @@ def convert_nuke_to_sg_write_nodes(self): if (not profile_knob or not output_knob or not use_name_as_output_knob + or not write_knob or not render_template_knob or not publish_template_knob or not proxy_render_template_knob @@ -527,7 +535,6 @@ def convert_nuke_to_sg_write_nodes(self): # create new Shotgun Write node: new_sg_wn = nuke.createNode(TankWriteNodeHandler.SG_WRITE_NODE_CLASS) new_sg_wn.setSelected(False) - # copy across file & proxy knobs as well as all cached templates: new_sg_wn["cached_path"].setValue(wn["file"].value()) new_sg_wn["tk_cached_proxy_path"].setValue(wn["proxy"].value()) @@ -567,6 +574,10 @@ def convert_nuke_to_sg_write_nodes(self): # explicitly copy some settings to the new Shotgun Write Node instead: for knob_name in ["disable", "tile_color", "postage_stamp"]: new_sg_wn[knob_name].setValue(wn[knob_name].value()) + + # set SG write type + write_name = write_knob.value() + new_sg_wn["write_type"].setValue(write_name) # delete original node: nuke.delete(wn) @@ -617,6 +628,31 @@ def sync_frames_from_SG(self): self._app.log_debug("Failed to sync frames") raise + def test_folder_for_renders(self, path): + """ + Tests a given folder location - mainly the writenode's file path for containing files + """ + + path_dir = os.path.dirname(path) + if os.path.isdir(path_dir): + nuke.tprint("Path exists...") + path_file_output_ext = os.path.split(path)[1] + path_items = os.listdir(path_dir) + path_items_ext = [] + if path_items: + print "Directory " + path_dir+ " contains:" + str(len(path_items)) + " files" + for file in path_items: + path_item_ext = os.path.split(file)[1] + if path_item_ext not in path_items_ext: + path_items_ext.append(path_item_ext) + + print path_item_ext + + else: + nuke.tprint(path + " doesn't exist.") + + + ################################################################################################ # Public methods called from gizmo - although these are public, they should # be considered as private and not used directly! @@ -1084,7 +1120,14 @@ def set_path_knob(name, value): set_path_knob("path_context", context_path) set_path_knob("path_local", local_path) - set_path_knob("path_filename", file_name) + set_path_knob("path_filename", file_name) + + # get the path depending if in full or proxy mode: + is_proxy = node.proxy() + render_path = self.__get_render_path(node, is_proxy) + + # self.test_folder_for_renders(render_path) + def __apply_cached_file_format_settings(self, node): """ @@ -1137,13 +1180,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False self.__apply_cached_file_format_settings(node) return - self._app.log_debug("Changing the profile for node '%s' to: %s" % (node.name(), profile_name)) - - # keep track of the old profile name: - old_profile_name = node.knob("profile_name").value() - # keep track of the old write type name: - old_write_type_name = node.knob("write_type").value() - + self._app.log_debug("Changing the profile for node '%s' to: %s" % (node.name(), profile_name)) # pull settings from profile: render_template = self._app.get_template_by_name(profile["render_template"]) @@ -1169,6 +1206,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False # update both the list and the cached value for profile name: self.__update_knob_value(node, "profile_name", profile_name) + self.__update_knob_value(node, "write_type_cache", write_type) self.__update_knob_value(node, "tk_profile_list", profile_name) # set the format @@ -1335,42 +1373,44 @@ def __populate_initial_output_name(self, template, node): have_output_key = True if output_default is None: output_default = key.default + print ("Output default is:", output_default ) if output_is_optional: - output_is_optional = template.is_optional(key_name) + output_is_optional = template.is_optional(key_name) + if not have_output_key: # Nothing to do! return - if output_default is None: - # no default name - use hard coded built in - step_name = self._app.context.step['name']#.lower() - if step_name: - output_default = step_name - else: - output_default = "output" - - # get the output names for all other nodes that are using the same profile - used_output_names = set() - node_profile = self.get_node_profile_name(node) - for n in self.get_nodes(): - if n != node and self.get_node_profile_name(n) == node_profile: - used_output_names.add(n.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).value()) - - # handle if output is optional: - if output_is_optional and "" not in used_output_names: - # default should be an empty string: - output_default = "" - - # now ensure output name is unique: - postfix = 1 - output_name = output_default - while output_name in used_output_names: - output_name = "%s%d" % (output_default, postfix) - postfix += 1 - - - # finally, set the output name on the knob: - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setValue(output_name) + # if output_default is None: + # # no default name - use hard coded built in + # step_name = self._app.context.step['name']#.lower() + # if step_name: + # output_default = step_name + # else: + # output_default = "output" + + # # get the output names for all other nodes that are using the same profile + # used_output_names = set() + # node_profile = self.get_node_profile_name(node) + # for n in self.get_nodes(): + # if n != node and self.get_node_profile_name(n) == node_profile: + # used_output_names.add(n.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).value()) + + # # handle if output is optional: + # if output_is_optional and "" not in used_output_names: + # # default should be an empty string: + # output_default = "" + + # # now ensure output name is unique: + # postfix = 1 + # output_name = output_default + # while output_name in used_output_names: + # output_name = "%s%d" % (output_default, postfix) + # postfix += 1 + + + # # finally, set the output name on the knob: + # node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setValue(output_name) def __populate_format_settings(self, node, file_type, file_settings, reset_all_settings=False, promoted_write_knobs=None): """ @@ -2007,12 +2047,13 @@ def __setup_new_node(self, node): # pasted the node will get a new name to avoid a collision # and we need to make sure we update the output name to # match that new name. - if node.knob(TankWriteNodeHandler.USE_NAME_AS_OUTPUT_KNOB_NAME).value(): - # force output name to be the node name: - new_output_name = node.knob("name").value() - self.__set_output(node, new_output_name) - curr_entity_type = self._app.context.entity['type'] + # if node.knob(TankWriteNodeHandler.USE_NAME_AS_OUTPUT_KNOB_NAME).value(): + # # force output name to be the node name: + # new_output_name = node.knob("name").value() + # self.__set_output(node, new_output_name) + curr_entity_type = self._app.context.entity['type'] + self.__set_output(node, "") if curr_entity_type == 'Shot': if write_type == "Version": node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) @@ -2182,55 +2223,12 @@ def __on_knob_changed(self): self.__update_knob_value(node, "tk_profile_list", write_type_profile) # reset profile self.__set_profile(node, write_type_profile, write_type, reset_all_settings=True) - - - - elif knob.name() == "sync_from_sg": + # Sync from SG self.sync_frames_from_SG() elif knob.name() == "refresh_version_info": - write_type = self.get_node_write_type_name(node) - self.get_sg_info() - self.__update_version_preview(node, write_type) - # node name has changed: - version_ui = ["latest_version", "version_date", "version_description"] - new_profile_name = node.knob("tk_profile_list").value() # set the write type for creation of correct output write_type = self.get_node_write_type_name(node) - write_type_color = 0 - if write_type== "Version": - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - self.__update_knob_value(node, "tank_channel", "") - write_type_color = 0 - self.__hide_UI(node, version_ui, True) - self.__set_profile(node, new_profile_name, write_type, reset_all_settings=True) - elif write_type == "Test": - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) - write_type_color = 4278190081 - self.__hide_UI(node, version_ui, False) - self.__set_profile(node, new_profile_name, write_type, reset_all_settings=True) - # Pop warning that the renders saved to the Test location - # will be removed on a weekly basis - user_name = self._app.context.user['name'].split() - nuke.message( - "Hi %s" % str(user_name[0]) + "\n" - "\n" - "Please be aware that this is a temporary location.\n" - "Renders saved here will be removed at the end of the week.\n") - elif write_type == "Precomp": - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) - write_type_color = 4278255361 - self.__hide_UI(node, version_ui, False) - self.__set_profile(node, new_profile_name, write_type, reset_all_settings=True) - elif write_type == "Element": - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) - write_type_color = 1095751564801 - self.__hide_UI(node, version_ui, False) - self.__set_profile(node, new_profile_name, write_type, reset_all_settings=True) - self.__update_knob_value(node, "tile_color", write_type_color) - elif knob.name() == "sync_from_sg": - self.sync_frames_from_SG() - elif knob.name() == "refresh_version_info": self.get_sg_info() self.__update_version_preview(node, write_type) else: From 5249d2556222a15448166d4cee88725a671103b1 Mon Sep 17 00:00:00 2001 From: daawaa Date: Thu, 31 Aug 2017 12:17:38 +0100 Subject: [PATCH 12/38] Added file tester for output location --- gizmos/WriteTank.gizmo | 7 +++++ python/tk_nuke_writenode/handler.py | 45 +++++++++++++++++++++++------ 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 6d5715f..fe1ab0f 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -181,6 +181,13 @@ Gizmo { t "" +STARTLINE } + addUserKnob { + 26 files_warning + l " " + T " " + t "" + +STARTLINE + } addUserKnob { 22 reset_path l "Reset Path" diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 0d9429e..4a62117 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -631,25 +631,35 @@ def sync_frames_from_SG(self): def test_folder_for_renders(self, path): """ Tests a given folder location - mainly the writenode's file path for containing files + + :returns: True/False """ path_dir = os.path.dirname(path) if os.path.isdir(path_dir): - nuke.tprint("Path exists...") - path_file_output_ext = os.path.split(path)[1] - path_items = os.listdir(path_dir) + # nuke.tprint("Path exists...") + file_output_ext = [] path_items_ext = [] + path_file_output_ext = os.path.split(path) + path_file_output_ext = os.path.splitext(path_file_output_ext[-1])[-1] + file_output_ext.append(path_file_output_ext) + path_items = os.listdir(path_dir) if path_items: - print "Directory " + path_dir+ " contains:" + str(len(path_items)) + " files" for file in path_items: - path_item_ext = os.path.split(file)[1] + path_item_ext = os.path.splitext(file)[1] if path_item_ext not in path_items_ext: path_items_ext.append(path_item_ext) - print path_item_ext + ext_match = list(set(path_items_ext).intersection(set(file_output_ext))) + + if ext_match: + return ext_match + else: + nuke.tprint("No matches") + return ext_match else: - nuke.tprint(path + " doesn't exist.") + return False @@ -1126,7 +1136,6 @@ def set_path_knob(name, value): is_proxy = node.proxy() render_path = self.__get_render_path(node, is_proxy) - # self.test_folder_for_renders(render_path) def __apply_cached_file_format_settings(self, node): @@ -1373,7 +1382,6 @@ def __populate_initial_output_name(self, template, node): have_output_key = True if output_default is None: output_default = key.default - print ("Output default is:", output_default ) if output_is_optional: output_is_optional = template.is_optional(key_name) @@ -1579,6 +1587,7 @@ def __update_render_path(self, node, force_reset=False, is_proxy=False): reset_path_button_visible = False path_warning = "" + files_warning = "" render_path = None cache_entry = None try: @@ -1604,6 +1613,24 @@ def __update_render_path(self, node, force_reset=False, is_proxy=False): else: # compute the render path: render_path = self.__compute_render_path_from(node, render_template, width, height, output_name) + if self.test_folder_for_renders(render_path): + ext_match = self.test_folder_for_renders(render_path) + ext_match_string = "" + if ext_match >1: + for i in ext_match: + ext_match_string += " " +i+ " " + else: + ext_match_string = ext_match[0] + files_warning += "" + ext_match_string + " files already in this location." + files_warning += "
   
" + files_warning += "
Test SG write type available for test renders.
" + self.__update_knob_value(node, "files_warning", + "Careful Now!
%s
" + % "
".join(self.__wrap_text(files_warning, 60))) + node.knob("files_warning").setVisible(True) + else: + self.__update_knob_value(node, "files_warning", "") + node.knob("files_warning").setVisible(False) except TkComputePathError, e: # update cache: From 4fd4ac27b0b0d08dc3b2a053ac9f88f72b23c1fb Mon Sep 17 00:00:00 2001 From: daawaa Date: Thu, 31 Aug 2017 16:33:51 +0100 Subject: [PATCH 13/38] added info button for write types/ normalised copied path --- gizmos/WriteTank.gizmo | 11 +++++------ python/tk_nuke_writenode/handler.py | 16 +++++++++------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index fe1ab0f..83bf987 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -194,12 +194,6 @@ Gizmo { T "import nuke\nif hasattr(nuke, \"_shotgun_write_node_handler\"):\n nuke._shotgun_write_node_handler.on_reset_render_path_gizmo_callback()" +STARTLINE } - addUserKnob { - 26 "" - l "" - T " " - +STARTLINE - } addUserKnob { 22 show_in_fs l "Jump to File System" @@ -225,6 +219,11 @@ Gizmo { t "Select the type of node you require this to be." M {Version Precomp Element Denoise Cleanup Final Test} } + addUserKnob { + 22 write_type_info + l "Info" + T " " + } addUserKnob { 1 write_type_cache l "SG Write Type Cache" diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 4a62117..797a852 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -18,6 +18,7 @@ import subprocess import re import traceback +import webbrowser import nuke import nukescripts @@ -652,11 +653,7 @@ def test_folder_for_renders(self, path): ext_match = list(set(path_items_ext).intersection(set(file_output_ext))) - if ext_match: - return ext_match - else: - nuke.tprint("No matches") - return ext_match + return ext_match else: return False @@ -797,7 +794,9 @@ def on_copy_path_to_clipboard_gizmo_callback(self): # get the path depending if in full or proxy mode: is_proxy = node.proxy() render_path = self.__get_render_path(node, is_proxy) - + system = sys.platform + if system == "win32": + render_path = os.path.normpath(render_path) # use Qt to copy the path to the clipboard: from sgtk.platform.qt import QtGui QtGui.QApplication.clipboard().setText(render_path) @@ -1623,7 +1622,7 @@ def __update_render_path(self, node, force_reset=False, is_proxy=False): ext_match_string = ext_match[0] files_warning += "" + ext_match_string + " files already in this location." files_warning += "
   
" - files_warning += "
Test SG write type available for test renders.
" + files_warning += "
Test SG write type available for test renders.
" self.__update_knob_value(node, "files_warning", "Careful Now!
%s
" % "
".join(self.__wrap_text(files_warning, 60))) @@ -2258,6 +2257,9 @@ def __on_knob_changed(self): write_type = self.get_node_write_type_name(node) self.get_sg_info() self.__update_version_preview(node, write_type) + elif knob.name() == "write_type_info": + write_type_url = "http://10.80.10.239/mediawiki-1.25.2/index.php?title=VFX_Wiki#SG_Write_Nodes" + webbrowser.open_new_tab(write_type_url) else: # Propogate changes to certain knobs from the gizmo/group to the # encapsulated Write node. From ab970714f57ad62179f9e186c5e9b24a76045e27 Mon Sep 17 00:00:00 2001 From: daawaa Date: Thu, 21 Sep 2017 14:36:35 +0100 Subject: [PATCH 14/38] added a window friendly version of the copy paths --- gizmos/WriteTank.gizmo | 11 +++++++++-- python/tk_nuke_writenode/handler.py | 11 ++++++----- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 83bf987..6fb63eb 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -203,8 +203,15 @@ Gizmo { } addUserKnob { 22 tk_copy_path - l "Copy Path to Clipboard" - T "import nuke\nif hasattr(nuke, \"_shotgun_write_node_handler\"):\n nuke._shotgun_write_node_handler.on_copy_path_to_clipboard_gizmo_callback()" + l "Copy Path" + T "import nuke\nif hasattr(nuke, \"_shotgun_write_node_handler\"):\n nuke._shotgun_write_node_handler.on_copy_path_to_clipboard_gizmo_callback(False)" + t "Copies the current render/proxy path to the clipboard" + -STARTLINE + } + addUserKnob { + 22 tk_copy_path_win + l "Copy Path - Windows" + T "import nuke\nif hasattr(nuke, \"_shotgun_write_node_handler\"):\n nuke._shotgun_write_node_handler.on_copy_path_to_clipboard_gizmo_callback(True)" t "Copies the current render/proxy path to the clipboard" -STARTLINE } diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 797a852..0efe5b8 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -784,7 +784,7 @@ def on_reset_render_path_gizmo_callback(self): self.reset_render_path(node) - def on_copy_path_to_clipboard_gizmo_callback(self): + def on_copy_path_to_clipboard_gizmo_callback(self, win_safe): """ Callback from the gizmo whenever the 'Copy path to clipboard' button is pressed. @@ -794,13 +794,14 @@ def on_copy_path_to_clipboard_gizmo_callback(self): # get the path depending if in full or proxy mode: is_proxy = node.proxy() render_path = self.__get_render_path(node, is_proxy) - system = sys.platform - if system == "win32": - render_path = os.path.normpath(render_path) + if win_safe: + system = sys.platform + if system == "win32": + render_path = os.path.normpath(render_path) # use Qt to copy the path to the clipboard: from sgtk.platform.qt import QtGui QtGui.QApplication.clipboard().setText(render_path) - + def on_before_render_gizmo_callback(self): """ Callback from nuke whenever a tank write node is about to be rendered. From 454d9b44486325c37c7d229c6d77e2318fc7badf Mon Sep 17 00:00:00 2001 From: daawaa Date: Wed, 27 Sep 2017 17:31:01 +0100 Subject: [PATCH 15/38] Added project specific output format settings. Also ticked 'fill' on Final SG writes for JKRY --- python/tk_nuke_writenode/handler.py | 179 +++++++++++++++++++++------- 1 file changed, 137 insertions(+), 42 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 0efe5b8..e409ed6 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -58,7 +58,8 @@ def __init__(self, app): """ self._app = app self._script_template = self._app.get_template("template_script_work") - + self._project = self._app.context.project['name'] + # cache the profiles: self._promoted_knobs = {} self._profile_names = [] @@ -2163,49 +2164,143 @@ def __on_knob_changed(self): # set the write type for creation of correct output curr_entity_type = self._app.context.entity['type'] if curr_entity_type == 'Shot': - write_type = self.get_node_write_type_name(node) - write_type_profile = "Dpx" - write_type_color = 0 - if write_type== "Version": - self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - self.__update_knob_value(node, "tank_channel", "") - write_type_profile = "Exr 16 bit" - elif write_type == "Precomp": - self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - write_type_profile = "Exr 16 bit" - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) - elif write_type == "Element": - self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - write_type_profile = "Exr 16 bit" - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) - elif write_type == "Denoise": - self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - write_type_profile = "Exr 16 bit" - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - elif write_type == "Cleanup": - self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + if self._project == "Lost In Space S1": + write_type = self.get_node_write_type_name(node) + # write_type_profile = "Dpx" write_type_profile = "Exr 16 bit" - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - elif write_type == "Final": - self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - write_type_profile = "Exr 16 bit" - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - elif write_type == "Test": - self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + write_type_color = 0 + if write_type== "Version": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + self.__update_knob_value(node, "tank_channel", "") + elif write_type == "Precomp": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + # write_type_profile = "Exr 16 bit" + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + elif write_type == "Element": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + # write_type_profile = "Exr 16 bit" + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + elif write_type == "Denoise": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + # write_type_profile = "Exr 16 bit" + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + elif write_type == "Cleanup": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + # write_type_profile = "Exr 16 bit" + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + elif write_type == "Final": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + # write_type_profile = "Exr 16 bit" + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + elif write_type == "Test": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + # write_type_profile = "Exr 16 bit" + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + # Pop warning that the renders saved to the Test location + user_name = self._app.context.user['name'].split() + nuke.message( + "Hi %s" % str(user_name[0]) + "\n" + "\n" + "Please be aware that this is a temporary location.\n" + "Renders saved here will be removed at the end of the week.\n") + # Updates the predefined profile based on the write type + self.__update_knob_value(node, "tk_profile_list", write_type_profile) + # reset profile + self.__set_profile(node, write_type_profile, write_type, reset_all_settings=True) + write_type = self.get_node_write_type_name(node) + write_type_profile = "Dpx" + write_type_color = 0 + if write_type== "Version": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.node(TankWriteNodeHandler.WRITE_NODE_NAME)["fill"].setValue(False) + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + self.__update_knob_value(node, "tank_channel", "") + node.knob("_promoted_1").setValue(False) + elif write_type == "Precomp": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.node(TankWriteNodeHandler.WRITE_NODE_NAME)["fill"].setValue(False) + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + node.knob("_promoted_1").setValue(False) + elif write_type == "Element": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.node(TankWriteNodeHandler.WRITE_NODE_NAME)["fill"].setValue(False) + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + node.knob("_promoted_1").setValue(False) + elif write_type == "Denoise": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.node(TankWriteNodeHandler.WRITE_NODE_NAME)["fill"].setValue(False) + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + node.knob("_promoted_1").setValue(False) + elif write_type == "Cleanup": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.node(TankWriteNodeHandler.WRITE_NODE_NAME)["fill"].setValue(False) + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + node.knob("_promoted_1").setValue(False) + elif write_type == "Final": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.node(TankWriteNodeHandler.WRITE_NODE_NAME)["fill"].setValue(True) + print "*****Set the Final-DPX to fill" + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + elif write_type == "Test": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + # write_type_profile = "Exr 16 bit" + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + # Pop warning that the renders saved to the Test location + user_name = self._app.context.user['name'].split() + nuke.message( + "Hi %s" % str(user_name[0]) + "\n" + "\n" + "Please be aware that this is a temporary location.\n" + "Renders saved here will be removed at the end of the week.\n") + # Updates the predefined profile based on the write type + self.__update_knob_value(node, "tk_profile_list", write_type_profile) + # reset profile + self.__set_profile(node, write_type_profile, write_type, reset_all_settings=True) + else: + write_type = self.get_node_write_type_name(node) + # write_type_profile = "Dpx" write_type_profile = "Exr 16 bit" - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) - # Pop warning that the renders saved to the Test location - user_name = self._app.context.user['name'].split() - nuke.message( - "Hi %s" % str(user_name[0]) + "\n" - "\n" - "Please be aware that this is a temporary location.\n" - "Renders saved here will be removed at the end of the week.\n") - # Updates the predefined profile based on the write type - self.__update_knob_value(node, "tk_profile_list", write_type_profile) - # reset profile - self.__set_profile(node, write_type_profile, write_type, reset_all_settings=True) + write_type_color = 0 + if write_type== "Version": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + self.__update_knob_value(node, "tank_channel", "") + elif write_type == "Precomp": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + # write_type_profile = "Exr 16 bit" + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + elif write_type == "Element": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + # write_type_profile = "Exr 16 bit" + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + elif write_type == "Denoise": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + # write_type_profile = "Exr 16 bit" + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + elif write_type == "Cleanup": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + # write_type_profile = "Exr 16 bit" + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + elif write_type == "Final": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + # write_type_profile = "Exr 16 bit" + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + elif write_type == "Test": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + # write_type_profile = "Exr 16 bit" + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + # Pop warning that the renders saved to the Test location + user_name = self._app.context.user['name'].split() + nuke.message( + "Hi %s" % str(user_name[0]) + "\n" + "\n" + "Please be aware that this is a temporary location.\n" + "Renders saved here will be removed at the end of the week.\n") + # Updates the predefined profile based on the write type + self.__update_knob_value(node, "tk_profile_list", write_type_profile) + # reset profile + self.__set_profile(node, write_type_profile, write_type, reset_all_settings=True) elif curr_entity_type == 'Asset': write_type = self.get_node_write_type_name(node) write_type_profile = "Exr 16 bit" From 40f98d8aedfc55bea5a788e7efa7c213a6cb1eb8 Mon Sep 17 00:00:00 2001 From: daawaa Date: Wed, 27 Sep 2017 17:31:57 +0100 Subject: [PATCH 16/38] Swapped SSVFX to JKRY --- python/tk_nuke_writenode/handler.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index e409ed6..0c95d74 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -2208,6 +2208,7 @@ def __on_knob_changed(self): self.__update_knob_value(node, "tk_profile_list", write_type_profile) # reset profile self.__set_profile(node, write_type_profile, write_type, reset_all_settings=True) + elif self._project == "Jack Ryan S1": write_type = self.get_node_write_type_name(node) write_type_profile = "Dpx" write_type_color = 0 From cc737d2cb8cd6c58b41c286009c86b8397f0301d Mon Sep 17 00:00:00 2001 From: daawaa Date: Thu, 28 Sep 2017 18:46:08 +0100 Subject: [PATCH 17/38] DPX default now to Cineon. cleaned up current context --- python/tk_nuke_writenode/handler.py | 32 ++++++++++++++++++----------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 0c95d74..10992a5 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -57,6 +57,7 @@ def __init__(self, app): Construction """ self._app = app + self._curr_entity_type = self._app.context.entity['type'] self._script_template = self._app.get_template("template_script_work") self._project = self._app.context.project['name'] @@ -1044,8 +1045,9 @@ def __update_path_preview(self, node, is_proxy): script_path = self.__get_current_script_path() work_template = self._app.tank.template_from_path(script_path) curr_fields = work_template.get_fields(script_path) - curr_entity_type = self._app.context.entity['type'] - if curr_entity_type == 'Shot': + + nuke.tprint("Current entity is: " +self._curr_entity_type) + if self._curr_entity_type == 'Shot': fields ={ 'Shot': curr_fields['Shot'], 'Step': curr_fields['Step'], @@ -1070,7 +1072,7 @@ def __update_path_preview(self, node, is_proxy): context_path = context_info.apply_fields(fields) - elif curr_entity_type == 'Asset': + elif self._curr_entity_type == 'Asset': fields ={ 'Asset': curr_fields['Asset'], 'Step': curr_fields['Step'], @@ -1342,6 +1344,8 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False # set the channel info based on the profile type profile_channel = "rgb" if profile_name == "Dpx": + if self._project == "Jack Ryan S1" or self._project == "SSVFX_PIPELINE": + node.knob("colorspace").setValue("Cineon") profile_channel = "rgb" elif profile_name == "Exr 16 bit": profile_channel = "rgb" @@ -2080,14 +2084,13 @@ def __setup_new_node(self, node): # new_output_name = node.knob("name").value() # self.__set_output(node, new_output_name) - curr_entity_type = self._app.context.entity['type'] self.__set_output(node, "") - if curr_entity_type == 'Shot': + if self._curr_entity_type == 'Shot': if write_type == "Version": node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - if curr_entity_type == 'Asset': + if self._curr_entity_type == 'Asset': if write_type == "Version": - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) # set the version info if it exists self.__update_version_preview(node, write_type) @@ -2162,8 +2165,7 @@ def __on_knob_changed(self): self.__set_output(node, new_output_name) elif knob.name() == "write_type": # set the write type for creation of correct output - curr_entity_type = self._app.context.entity['type'] - if curr_entity_type == 'Shot': + if self._curr_entity_type == 'Shot': if self._project == "Lost In Space S1": write_type = self.get_node_write_type_name(node) # write_type_profile = "Dpx" @@ -2208,7 +2210,7 @@ def __on_knob_changed(self): self.__update_knob_value(node, "tk_profile_list", write_type_profile) # reset profile self.__set_profile(node, write_type_profile, write_type, reset_all_settings=True) - elif self._project == "Jack Ryan S1": + elif self._project == "Jack Ryan S1" or self._project == "SSVFX_PIPELINE" : write_type = self.get_node_write_type_name(node) write_type_profile = "Dpx" write_type_color = 0 @@ -2216,32 +2218,38 @@ def __on_knob_changed(self): self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.node(TankWriteNodeHandler.WRITE_NODE_NAME)["fill"].setValue(False) node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + # node.knob("colorspace").setValue("Cineon") self.__update_knob_value(node, "tank_channel", "") node.knob("_promoted_1").setValue(False) elif write_type == "Precomp": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.node(TankWriteNodeHandler.WRITE_NODE_NAME)["fill"].setValue(False) node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + # node.knob("colorspace").setValue("Cineon") node.knob("_promoted_1").setValue(False) elif write_type == "Element": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.node(TankWriteNodeHandler.WRITE_NODE_NAME)["fill"].setValue(False) node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + # node.knob("colorspace").setValue("Cineon") node.knob("_promoted_1").setValue(False) elif write_type == "Denoise": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.node(TankWriteNodeHandler.WRITE_NODE_NAME)["fill"].setValue(False) node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + # node.knob("colorspace").setValue("Cineon") node.knob("_promoted_1").setValue(False) elif write_type == "Cleanup": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.node(TankWriteNodeHandler.WRITE_NODE_NAME)["fill"].setValue(False) node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + # node.knob("colorspace").setValue("Cineon") node.knob("_promoted_1").setValue(False) elif write_type == "Final": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.node(TankWriteNodeHandler.WRITE_NODE_NAME)["fill"].setValue(True) - print "*****Set the Final-DPX to fill" + # node.knob("colorspace").setValue("Cineon") + print "*****Set the Final-DPX fill to true" node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) elif write_type == "Test": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") @@ -2302,7 +2310,7 @@ def __on_knob_changed(self): self.__update_knob_value(node, "tk_profile_list", write_type_profile) # reset profile self.__set_profile(node, write_type_profile, write_type, reset_all_settings=True) - elif curr_entity_type == 'Asset': + elif self._curr_entity_type == 'Asset': write_type = self.get_node_write_type_name(node) write_type_profile = "Exr 16 bit" write_type_color = 0 From 0237f437c145208c4eadc66a9673c463c37cd515 Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 29 Sep 2017 14:52:44 +0100 Subject: [PATCH 18/38] Added embeded timecode info --- gizmos/WriteTank.gizmo | 5 +++++ python/tk_nuke_writenode/handler.py | 12 +++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 6fb63eb..b882916 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -531,6 +531,11 @@ Gizmo { xpos 195 ypos -74 } + AddTimeCode { + startcode 01:00:00:01 + metafps False + fps 23.98 + } Write { file "\[python __import__('nuke')._shotgun_write_node_handler.on_compute_path_gizmo_callback() if hasattr(__import__('nuke'), '_shotgun_write_node_handler') else nuke.thisParent().knob('cached_path').value()]" proxy "\[python __import__('nuke')._shotgun_write_node_handler.on_compute_proxy_path_gizmo_callback() if hasattr(__import__('nuke'), '_shotgun_write_node_handler') else nuke.thisParent().knob('tk_cached_proxy_path').value()]" diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 10992a5..c5c1a7f 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1046,7 +1046,6 @@ def __update_path_preview(self, node, is_proxy): work_template = self._app.tank.template_from_path(script_path) curr_fields = work_template.get_fields(script_path) - nuke.tprint("Current entity is: " +self._curr_entity_type) if self._curr_entity_type == 'Shot': fields ={ 'Shot': curr_fields['Shot'], @@ -1177,6 +1176,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False is False then the knob won't get reset to the value from the profile. """ # can't change the profile if this isn't a valid profile: + nuke.tprint("Current entity is: " +self._curr_entity_type) if profile_name not in self._profiles: # at the very least, try to restore the file format settings from the cached values: self.__apply_cached_file_format_settings(node) @@ -1354,6 +1354,16 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False else: nuke.tprint("No profile with that name") + timecode = "01:00:00:01" + proj_fps = 23.98 + if self._curr_entity_type == 'Shot': + if self._project == "": + print "Leaving tc blank for non-standard values" + # node.node("AddTimeCode1").knob("metafps").setValue(False) + else: + node.node("AddTimeCode1").knob("startcode").setValue(timecode) + node.node("AddTimeCode1").knob("fps").setValue(proj_fps) + self.__update_knob_value(node, "channels", profile_channel) # Version info visibility From 135d25dc2352cc7b5dbaca224c697f1f9814233d Mon Sep 17 00:00:00 2001 From: daawaa Date: Thu, 5 Oct 2017 12:14:56 +0100 Subject: [PATCH 19/38] Added feature that saves the users input to the tank_channel --- gizmos/WriteTank.gizmo | 7 +++++++ python/tk_nuke_writenode/handler.py | 13 ++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index b882916..52766d5 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -256,6 +256,13 @@ Gizmo { +STARTLINE -INVISIBLE } + addUserKnob { + 1 tank_channel_cache + l "" + t "Cache location for user entered text to change the output naming for write nodes" + +STARTLINE + +INVISIBLE + } addUserKnob { 6 tk_use_name_as_channel l "Use node name" diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index c5c1a7f..9e1d20c 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -474,6 +474,11 @@ def convert_sg_to_nuke_write_nodes(self): knob.setValue(sg_wn["proxy_publish_template"].value()) new_wn.addKnob(knob) + # Store tank_channel + knob = nuke.String_Knob("tk_tank_channel") + knob.setValue(sg_wn["tank_channel"].value()) + new_wn.addKnob(knob) + #write type knob = nuke.String_Knob("tk_write_type") knob.setValue(sg_wn["write_type_cache"].value()) @@ -518,6 +523,7 @@ def convert_nuke_to_sg_write_nodes(self): publish_template_knob = wn.knob("tk_publish_template") proxy_render_template_knob = wn.knob("tk_proxy_render_template") proxy_publish_template_knob = wn.knob("tk_proxy_publish_template") + tk_tank_channel = wn.knob("tk_tank_channel") if (not profile_knob or not output_knob @@ -545,7 +551,8 @@ def convert_nuke_to_sg_write_nodes(self): new_sg_wn["publish_template"].setValue(publish_template_knob.value()) new_sg_wn["proxy_render_template"].setValue(proxy_render_template_knob.value()) new_sg_wn["proxy_publish_template"].setValue(proxy_publish_template_knob.value()) - + new_sg_wn["tank_channel_cache"].setValue(tk_tank_channel.value()) + # set the profile & output - this will cause the paths to be reset: # Note, we don't call the method __set_profile() as we don't want to # run all the normal logic that runs as part of switching the profile. @@ -582,6 +589,10 @@ def convert_nuke_to_sg_write_nodes(self): write_name = write_knob.value() new_sg_wn["write_type"].setValue(write_name) + #Set tank channel + tank_channel_text = tk_tank_channel.value() + new_sg_wn["tank_channel"].setValue(tank_channel_text) + # delete original node: nuke.delete(wn) From 2dadb0995b91c0827bf4c5c0ff97986da181d155 Mon Sep 17 00:00:00 2001 From: daawaa Date: Tue, 17 Oct 2017 11:47:02 +0100 Subject: [PATCH 20/38] updated tank_channel name dissappearing. Removed login --- python/tk_nuke_writenode/handler.py | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 9e1d20c..3762845 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -26,7 +26,15 @@ import tank from tank import TankError from tank.platform import constants -from tank_vendor import shotgun_api3 +from tank_vendor import shotgun_api3 as sgapi + +try: + sg_login = "\\\\10.80.8.250\\VFX_Pipeline\\Pipeline\\Scripts" + sys.path.append(sg_login) + from shotgun.shotgun_login_node import ShotgunLogin +except: + print "Could not import SG login module" + try: import ConfigParser @@ -77,6 +85,8 @@ def __init__(self, app): # call and cache the version info self._version_info = {} + self._get_sg = ShotgunLogin(sgapi) + self.sg = self._get_sg.get_sg() self.get_sg_info() ################################################################################################ @@ -606,10 +616,6 @@ def get_sg_info(self): Retrieves secific version info from SG and caches """ self._version_info = {} - sg = shotgun_api3.Shotgun( - base_url ="https://screenscene.shotgunstudio.com", - script_name="nuke_write_access", - api_key="289aad9e8eb0c385fc8732cf25536c9cb160d7081ea08479bc6cdb01092c3aa0") ctx_info = self._app.context @@ -624,8 +630,8 @@ def get_sg_info(self): "latest_by": "ENTITIES_CREATED_AT" }] - self._version_info = sg.find_one("Version",filters,fields,additional_filter_presets = additional_filter_presets,include_archived_projects=False) - sg.close() + self._version_info = self.sg.find_one("Version",filters,fields,additional_filter_presets = additional_filter_presets,include_archived_projects=False) + self.sg.close() def get_node_write_type_name(self, node): """ @@ -2105,7 +2111,6 @@ def __setup_new_node(self, node): # new_output_name = node.knob("name").value() # self.__set_output(node, new_output_name) - self.__set_output(node, "") if self._curr_entity_type == 'Shot': if write_type == "Version": node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) @@ -2195,7 +2200,6 @@ def __on_knob_changed(self): if write_type== "Version": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - self.__update_knob_value(node, "tank_channel", "") elif write_type == "Precomp": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") # write_type_profile = "Exr 16 bit" @@ -2240,7 +2244,6 @@ def __on_knob_changed(self): node.node(TankWriteNodeHandler.WRITE_NODE_NAME)["fill"].setValue(False) node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) # node.knob("colorspace").setValue("Cineon") - self.__update_knob_value(node, "tank_channel", "") node.knob("_promoted_1").setValue(False) elif write_type == "Precomp": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") @@ -2295,7 +2298,6 @@ def __on_knob_changed(self): if write_type== "Version": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - self.__update_knob_value(node, "tank_channel", "") elif write_type == "Precomp": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") # write_type_profile = "Exr 16 bit" @@ -2338,7 +2340,6 @@ def __on_knob_changed(self): if write_type== "Version": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) - self.__update_knob_value(node, "tank_channel", "") write_type_profile = "Exr 16 bit" elif write_type == "Precomp": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") From fab09b720c22223e26c7e0037ecdf05e8ba27d7d Mon Sep 17 00:00:00 2001 From: daawaa Date: Tue, 24 Oct 2017 10:12:33 +0100 Subject: [PATCH 21/38] element/precomp default to rgba --- python/tk_nuke_writenode/handler.py | 54 +++++++++++------------------ 1 file changed, 20 insertions(+), 34 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 3762845..029e6d0 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -493,7 +493,6 @@ def convert_sg_to_nuke_write_nodes(self): knob = nuke.String_Knob("tk_write_type") knob.setValue(sg_wn["write_type_cache"].value()) new_wn.addKnob(knob) - # delete original node: nuke.delete(sg_wn) @@ -1193,7 +1192,6 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False is False then the knob won't get reset to the value from the profile. """ # can't change the profile if this isn't a valid profile: - nuke.tprint("Current entity is: " +self._curr_entity_type) if profile_name not in self._profiles: # at the very least, try to restore the file format settings from the cached values: self.__apply_cached_file_format_settings(node) @@ -1248,14 +1246,14 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False ) # set the channel info based on the profile type - if profile_name == "Dpx": - self.__update_knob_value(node, "channels", "rgb") - elif profile_name == "Exr 16 bit": - self.__update_knob_value(node, "channels", "rgba") - elif profile_name == "Jpeg": - self.__update_knob_value(node, "channels", "rgb") - else: - nuke.tprint("No profile with the name:", profile_name) + # if profile_name == "Dpx": + # self.__update_knob_value(node, "channels", "rgb") + # elif profile_name == "Exr 16 bit": + # self.__update_knob_value(node, "channels", "rgba") + # elif profile_name == "Jpeg": + # self.__update_knob_value(node, "channels", "rgb") + # else: + # nuke.tprint("No profile with the name:", profile_name) # cache the type and settings on the root node so that # they get serialized with the script: @@ -1359,13 +1357,16 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False self.__update_knob_value(node, "tile_color", packed_rgb) # set the channel info based on the profile type - profile_channel = "rgb" + profile_channel = "rgba" if profile_name == "Dpx": if self._project == "Jack Ryan S1" or self._project == "SSVFX_PIPELINE": node.knob("colorspace").setValue("Cineon") profile_channel = "rgb" elif profile_name == "Exr 16 bit": profile_channel = "rgb" + if (write_type == "Precomp" or + write_type == "Element"): + profile_channel = "rgba" elif profile_name == "Jpeg": profile_channel = "rgb" else: @@ -2192,37 +2193,30 @@ def __on_knob_changed(self): elif knob.name() == "write_type": # set the write type for creation of correct output if self._curr_entity_type == 'Shot': - if self._project == "Lost In Space S1": + if self._project == "Lost In Space S1" or self._project == "SSVFX_PIPELINE" : write_type = self.get_node_write_type_name(node) - # write_type_profile = "Dpx" write_type_profile = "Exr 16 bit" - write_type_color = 0 if write_type== "Version": + profile_channels = "rgb" self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) elif write_type == "Precomp": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - # write_type_profile = "Exr 16 bit" node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) elif write_type == "Element": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - # write_type_profile = "Exr 16 bit" node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) elif write_type == "Denoise": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - # write_type_profile = "Exr 16 bit" node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) elif write_type == "Cleanup": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - # write_type_profile = "Exr 16 bit" node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) elif write_type == "Final": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - # write_type_profile = "Exr 16 bit" node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) elif write_type == "Test": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - # write_type_profile = "Exr 16 bit" node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) # Pop warning that the renders saved to the Test location user_name = self._app.context.user['name'].split() @@ -2232,47 +2226,40 @@ def __on_knob_changed(self): "Please be aware that this is a temporary location.\n" "Renders saved here will be removed at the end of the week.\n") # Updates the predefined profile based on the write type - self.__update_knob_value(node, "tk_profile_list", write_type_profile) + self.__update_knob_value(node, "tk_profile_list", write_type_profile) # reset profile self.__set_profile(node, write_type_profile, write_type, reset_all_settings=True) - elif self._project == "Jack Ryan S1" or self._project == "SSVFX_PIPELINE" : + elif self._project == "Jack Ryan S1": write_type = self.get_node_write_type_name(node) write_type_profile = "Dpx" - write_type_color = 0 if write_type== "Version": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.node(TankWriteNodeHandler.WRITE_NODE_NAME)["fill"].setValue(False) node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - # node.knob("colorspace").setValue("Cineon") node.knob("_promoted_1").setValue(False) elif write_type == "Precomp": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.node(TankWriteNodeHandler.WRITE_NODE_NAME)["fill"].setValue(False) node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) - # node.knob("colorspace").setValue("Cineon") node.knob("_promoted_1").setValue(False) elif write_type == "Element": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.node(TankWriteNodeHandler.WRITE_NODE_NAME)["fill"].setValue(False) - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) - # node.knob("colorspace").setValue("Cineon") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) node.knob("_promoted_1").setValue(False) elif write_type == "Denoise": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.node(TankWriteNodeHandler.WRITE_NODE_NAME)["fill"].setValue(False) - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - # node.knob("colorspace").setValue("Cineon") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) node.knob("_promoted_1").setValue(False) elif write_type == "Cleanup": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.node(TankWriteNodeHandler.WRITE_NODE_NAME)["fill"].setValue(False) - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - # node.knob("colorspace").setValue("Cineon") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) node.knob("_promoted_1").setValue(False) elif write_type == "Final": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.node(TankWriteNodeHandler.WRITE_NODE_NAME)["fill"].setValue(True) - # node.knob("colorspace").setValue("Cineon") print "*****Set the Final-DPX fill to true" node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) elif write_type == "Test": @@ -2294,7 +2281,6 @@ def __on_knob_changed(self): write_type = self.get_node_write_type_name(node) # write_type_profile = "Dpx" write_type_profile = "Exr 16 bit" - write_type_color = 0 if write_type== "Version": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) @@ -2336,7 +2322,6 @@ def __on_knob_changed(self): elif self._curr_entity_type == 'Asset': write_type = self.get_node_write_type_name(node) write_type_profile = "Exr 16 bit" - write_type_color = 0 if write_type== "Version": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) @@ -2486,6 +2471,7 @@ def __on_script_save(self): nuke.WRITE_NON_DEFAULT_ONLY | nuke.TO_SCRIPT | nuke.TO_VALUE ) knob_changes = pickle.dumps(nk_data) + nuke.tprint(knob_changes) self.__update_knob_value( n, "tk_write_node_settings", From acccd3a51872b1a86020d83b73af1c79977b86da Mon Sep 17 00:00:00 2001 From: daawaa Date: Tue, 24 Oct 2017 15:50:13 +0100 Subject: [PATCH 22/38] Adjusted time code to take in first rame value --- gizmos/WriteTank.gizmo | 2 + python/tk_nuke_writenode/handler.py | 80 ++++++++++++++++++++++++++--- 2 files changed, 76 insertions(+), 6 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 52766d5..5c10cc2 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -542,6 +542,8 @@ Gizmo { startcode 01:00:00:01 metafps False fps 23.98 + useFrame True + frame 1 } Write { file "\[python __import__('nuke')._shotgun_write_node_handler.on_compute_path_gizmo_callback() if hasattr(__import__('nuke'), '_shotgun_write_node_handler') else nuke.thisParent().knob('cached_path').value()]" diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 029e6d0..4a86dfd 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -53,6 +53,7 @@ class TankWriteNodeHandler(object): SG_WRITE_NODE_CLASS = "WriteTank" SG_WRITE_DEFAULT_NAME = "SGWrite" WRITE_NODE_NAME = "Write1" + EMBED_TIME_CODE = "AddTimeCode1" OUTPUT_KNOB_NAME = "tank_channel" USE_NAME_AS_OUTPUT_KNOB_NAME = "tk_use_name_as_channel" @@ -1372,15 +1373,40 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False else: nuke.tprint("No profile with that name") - timecode = "01:00:00:01" - proj_fps = 23.98 + # Update embeded time code + + time_code = node.node(TankWriteNodeHandler.EMBED_TIME_CODE) + eng = tank.platform.current_engine() + app = eng.apps["tk-multi-setframerange"] + frame_range = app.get_frame_range_from_shotgun() if self._curr_entity_type == 'Shot': + proj_fps = 23.98 + timecode = "01:00:00:01" + if not frame_range[0]: + print "No frame range values found on SG" + shot_frame_range_start = 1 + use_start_frame = False + pass + else: + shot_frame_range_start = frame_range[0] + use_start_frame = True + if self._project == "": print "Leaving tc blank for non-standard values" - # node.node("AddTimeCode1").knob("metafps").setValue(False) + # node.node("AddTimeCode1").knob("metafps").setValue(False) + elif self._project == "The Favourite": + proj_fps = 24 + timecode = "01:00:00:01" + print "Project is The Favourite. Setting TC FPS to 24" else: - node.node("AddTimeCode1").knob("startcode").setValue(timecode) - node.node("AddTimeCode1").knob("fps").setValue(proj_fps) + proj_fps = 23.98 + timecode = "01:00:00:01" + + time_code.knobs()["startcode"].setValue(timecode) + time_code.knobs()["fps"].setValue(proj_fps) + time_code.knobs()["useFrame"].setValue(use_start_frame) + time_code.knobs()["frame"].setValue(shot_frame_range_start) + # nuke.tprint("Timecode values: ", timecode, proj_fps, "Use start frame", use_start_frame, "First frame from SG" ,shot_frame_range_start) self.__update_knob_value(node, "channels", profile_channel) @@ -2276,7 +2302,49 @@ def __on_knob_changed(self): # Updates the predefined profile based on the write type self.__update_knob_value(node, "tk_profile_list", write_type_profile) # reset profile - self.__set_profile(node, write_type_profile, write_type, reset_all_settings=True) + self.__set_profile(node, write_type_profile, write_type, reset_all_settings=True) + elif self._project == "The Favourite": + write_type = self.get_node_write_type_name(node) + write_type_profile = "Dpx" + if write_type== "Version": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + node.knob("_promoted_1").setValue(False) + elif write_type == "Precomp": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + node.knob("_promoted_1").setValue(False) + elif write_type == "Element": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + node.knob("_promoted_1").setValue(False) + elif write_type == "Denoise": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + node.knob("_promoted_1").setValue(False) + elif write_type == "Cleanup": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + node.knob("_promoted_1").setValue(False) + elif write_type == "Final": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + print "*****Set the Final-DPX fill to true" + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + elif write_type == "Test": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + # write_type_profile = "Exr 16 bit" + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + # Pop warning that the renders saved to the Test location + user_name = self._app.context.user['name'].split() + nuke.message( + "Hi %s" % str(user_name[0]) + "\n" + "\n" + "Please be aware that this is a temporary location.\n" + "Renders saved here will be removed at the end of the week.\n") + # Updates the predefined profile based on the write type + self.__update_knob_value(node, "tk_profile_list", write_type_profile) + # reset profile + self.__set_profile(node, write_type_profile, write_type, reset_all_settings=True) else: write_type = self.get_node_write_type_name(node) # write_type_profile = "Dpx" From 6a721b70961a306b58fc5a26c6e953c56b1dff49 Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 1 Dec 2017 11:55:20 +0000 Subject: [PATCH 23/38] setting EXR for precomps, element and denoise --- python/tk_nuke_writenode/handler.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 4a86dfd..c39a33f 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -2311,14 +2311,17 @@ def __on_knob_changed(self): node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) node.knob("_promoted_1").setValue(False) elif write_type == "Precomp": + write_type_profile = "Exr 16 bit" self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) node.knob("_promoted_1").setValue(False) elif write_type == "Element": + write_type_profile = "Exr 16 bit" self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) node.knob("_promoted_1").setValue(False) elif write_type == "Denoise": + write_type_profile = "Exr 16 bit" self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) node.knob("_promoted_1").setValue(False) @@ -2327,8 +2330,7 @@ def __on_knob_changed(self): node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) node.knob("_promoted_1").setValue(False) elif write_type == "Final": - self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - print "*****Set the Final-DPX fill to true" + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) elif write_type == "Test": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") From 8163acfe0ab1931b54896cbffdb1e6c5f41c8488 Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 1 Dec 2017 12:04:04 +0000 Subject: [PATCH 24/38] added cleanup EXR also added cleanup EXR also --- python/tk_nuke_writenode/handler.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index c39a33f..99e5e48 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -2326,6 +2326,7 @@ def __on_knob_changed(self): node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) node.knob("_promoted_1").setValue(False) elif write_type == "Cleanup": + write_type_profile = "Exr 16 bit" self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) node.knob("_promoted_1").setValue(False) From 4e0aa9cb060b69dd5f666000aa634daf0f67f771 Mon Sep 17 00:00:00 2001 From: daawaa Date: Thu, 11 Jan 2018 14:40:27 +0000 Subject: [PATCH 25/38] Update for Roto. Output will have RLE compression for smaller RGB output filesizes --- python/tk_nuke_writenode/handler.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 99e5e48..2d44cb4 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1227,6 +1227,12 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False tile_color = profile["tile_color"] promote_write_knobs = profile.get("promote_write_knobs", []) + if write_type == "Version" and file_type == "exr": + ctx_info = self._app.context + if ctx_info.step['name'] == "Roto": + nuke.tprint("Task context is:" + ctx_info.step['name']+". Applying RLE compression to Version output") + file_settings.update({'compression' : 'RLE'}) + # Make sure any invalid entries are removed from the profile list: list_profiles = node.knob("tk_profile_list").values() if list_profiles != self._profile_names: @@ -2225,7 +2231,7 @@ def __on_knob_changed(self): if write_type== "Version": profile_channels = "rgb" self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) elif write_type == "Precomp": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) @@ -2542,7 +2548,6 @@ def __on_script_save(self): nuke.WRITE_NON_DEFAULT_ONLY | nuke.TO_SCRIPT | nuke.TO_VALUE ) knob_changes = pickle.dumps(nk_data) - nuke.tprint(knob_changes) self.__update_knob_value( n, "tk_write_node_settings", From 6912fd25ca1c72107dec15e7c64cd5f0543661d6 Mon Sep 17 00:00:00 2001 From: daawaa Date: Thu, 11 Jan 2018 14:58:59 +0000 Subject: [PATCH 26/38] Setting up same EXR compression for test --- python/tk_nuke_writenode/handler.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 2d44cb4..ef72cbb 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1227,10 +1227,10 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False tile_color = profile["tile_color"] promote_write_knobs = profile.get("promote_write_knobs", []) - if write_type == "Version" and file_type == "exr": + if file_type == "exr" and write_type == "Version" or write_type == "Test": ctx_info = self._app.context if ctx_info.step['name'] == "Roto": - nuke.tprint("Task context is:" + ctx_info.step['name']+". Applying RLE compression to Version output") + nuke.tprint("Task context is " + ctx_info.step['name']+". Applying RLE compression to "+ write_type +" output.") file_settings.update({'compression' : 'RLE'}) # Make sure any invalid entries are removed from the profile list: From 0607801c9615f815cfbff7ef299c98861e618ef6 Mon Sep 17 00:00:00 2001 From: daawaa Date: Thu, 11 Jan 2018 16:34:29 +0000 Subject: [PATCH 27/38] Updated roto version to ZIP/16 bit half and rgba --- python/tk_nuke_writenode/handler.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index ef72cbb..ebb9511 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1200,6 +1200,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False # get the profile details: profile = self._profiles.get(profile_name) + ctx_info = self._app.context if not profile: # this shouldn't really every happen! self._app.log_warning("Failed to find a write node profile called '%s' for node '%s'!" @@ -1228,10 +1229,10 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False promote_write_knobs = profile.get("promote_write_knobs", []) if file_type == "exr" and write_type == "Version" or write_type == "Test": - ctx_info = self._app.context if ctx_info.step['name'] == "Roto": nuke.tprint("Task context is " + ctx_info.step['name']+". Applying RLE compression to "+ write_type +" output.") - file_settings.update({'compression' : 'RLE'}) + file_settings.update({'compression' : 'Zip (1 scanline)'}) + file_settings.update({'datatype' : '16 bit half'}) # Make sure any invalid entries are removed from the profile list: list_profiles = node.knob("tk_profile_list").values() @@ -1374,6 +1375,9 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False if (write_type == "Precomp" or write_type == "Element"): profile_channel = "rgba" + if ctx_info.step['name'] == "Roto": + profile_channel = "rgba" + elif profile_name == "Jpeg": profile_channel = "rgb" else: @@ -2231,7 +2235,7 @@ def __on_knob_changed(self): if write_type== "Version": profile_channels = "rgb" self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) elif write_type == "Precomp": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) From c949cdb44e8b1a68b7a7b6efe85868acb0a0582b Mon Sep 17 00:00:00 2001 From: daawaa Date: Tue, 13 Feb 2018 16:46:42 +0000 Subject: [PATCH 28/38] Added explicit vals for projects --- python/tk_nuke_writenode/handler.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index ebb9511..7f7070b 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1407,7 +1407,15 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False elif self._project == "The Favourite": proj_fps = 24 timecode = "01:00:00:01" - print "Project is The Favourite. Setting TC FPS to 24" + print "Project is The Favourite. Setting TC FPS to 24" + elif self._project == "The Little Stranger": + proj_fps = 24 + timecode = "01:00:00:01" + print "Project is The Little Stranger. Setting TC FPS to 24" + elif self._project == "SSVFX_PIPELINE": + proj_fps = 24 + timecode = "01:00:00:01" + print "Project is SSVFX_PIPELINE. Setting TC FPS to 24" else: proj_fps = 23.98 timecode = "01:00:00:01" From 0c7de3bfd2d57a251e11bb54a3ea3e15fb1dcbfc Mon Sep 17 00:00:00 2001 From: daawaa Date: Thu, 22 Feb 2018 09:39:11 +0000 Subject: [PATCH 29/38] zip1 compression on precomp/denoise/cleanup/element exrs --- python/tk_nuke_writenode/handler.py | 41 ++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 7f7070b..d0c67d1 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -236,6 +236,19 @@ def reset_render_path(self, node): self.__update_render_path(node, force_reset=True, is_proxy=is_proxy) self.__update_render_path(node, force_reset=True, is_proxy=(not is_proxy)) + def test_nodes_for_name (self, write_type): + # Cycles through script nodes to find clashing node names + existing_node_names = [n.name() for n in nuke.allNodes()] + # rename to our new default name: + postfix = 1 + while True: + new_name = "%s%d-%s" % (TankWriteNodeHandler.SG_WRITE_DEFAULT_NAME, postfix, write_type) + if new_name not in existing_node_names: + break + else: + postfix += 1 + return new_name + def create_new_node(self, profile_name, write_type): """ Creates a new write node @@ -1233,7 +1246,10 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False nuke.tprint("Task context is " + ctx_info.step['name']+". Applying RLE compression to "+ write_type +" output.") file_settings.update({'compression' : 'Zip (1 scanline)'}) file_settings.update({'datatype' : '16 bit half'}) - + elif (file_type == "exr" and write_type == "Element" or write_type == "Precomp" + or write_type == "Cleanup" or write_type == "Denoise"): + file_settings.update({'compression' : 'Zip (1 scanline)'}) + file_settings.update({'datatype' : '16 bit half'}) # Make sure any invalid entries are removed from the profile list: list_profiles = node.knob("tk_profile_list").values() if list_profiles != self._profile_names: @@ -1367,7 +1383,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False # set the channel info based on the profile type profile_channel = "rgba" if profile_name == "Dpx": - if self._project == "Jack Ryan S1" or self._project == "SSVFX_PIPELINE": + if self._project == "Jack Ryan S1": node.knob("colorspace").setValue("Cineon") profile_channel = "rgb" elif profile_name == "Exr 16 bit": @@ -2192,6 +2208,7 @@ def __on_knob_changed(self): node = nuke.thisNode() knob = nuke.thisKnob() grp = nuke.thisGroup() + write_type = self.get_node_write_type_name(node) if not self.__is_node_fully_constructed(node): # knobChanged will be called during script load for all knobs with non-default @@ -2205,11 +2222,10 @@ def __on_knob_changed(self): # change the profile for the specified node: new_profile_name = knob.value() # set the write type for creation of correct output - write_type = self.get_node_write_type_name(node) self.__set_profile(node, new_profile_name, write_type, reset_all_settings=True) elif knob.name() == TankWriteNodeHandler.OUTPUT_KNOB_NAME: # internal cached output has been changed! - new_output_name = knob.value() + new_output_name = knob.value() if node.knob(TankWriteNodeHandler.USE_NAME_AS_OUTPUT_KNOB_NAME).value(): # force output name to be the node name: new_output_name = node.knob("name").value() @@ -2237,8 +2253,7 @@ def __on_knob_changed(self): elif knob.name() == "write_type": # set the write type for creation of correct output if self._curr_entity_type == 'Shot': - if self._project == "Lost In Space S1" or self._project == "SSVFX_PIPELINE" : - write_type = self.get_node_write_type_name(node) + if self._project == "Lost In Space S1": write_type_profile = "Exr 16 bit" if write_type== "Version": profile_channels = "rgb" @@ -2252,10 +2267,10 @@ def __on_knob_changed(self): node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) elif write_type == "Denoise": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) elif write_type == "Cleanup": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) elif write_type == "Final": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) @@ -2321,7 +2336,7 @@ def __on_knob_changed(self): self.__update_knob_value(node, "tk_profile_list", write_type_profile) # reset profile self.__set_profile(node, write_type_profile, write_type, reset_all_settings=True) - elif self._project == "The Favourite": + elif self._project == "The Favourite" or self._project == "SSVFX_PIPELINE" : write_type = self.get_node_write_type_name(node) write_type_profile = "Dpx" if write_type== "Version": @@ -2341,12 +2356,12 @@ def __on_knob_changed(self): elif write_type == "Denoise": write_type_profile = "Exr 16 bit" self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) node.knob("_promoted_1").setValue(False) elif write_type == "Cleanup": write_type_profile = "Exr 16 bit" self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) node.knob("_promoted_1").setValue(False) elif write_type == "Final": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") @@ -2384,11 +2399,11 @@ def __on_knob_changed(self): elif write_type == "Denoise": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") # write_type_profile = "Exr 16 bit" - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) elif write_type == "Cleanup": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") # write_type_profile = "Exr 16 bit" - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) elif write_type == "Final": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") # write_type_profile = "Exr 16 bit" From bdf65369d9a75ba58601563ed9b887d44661c303 Mon Sep 17 00:00:00 2001 From: daawaa Date: Thu, 22 Feb 2018 12:11:42 +0000 Subject: [PATCH 30/38] fixed when changing beween Precomp(etc.)/Version --- python/tk_nuke_writenode/handler.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index d0c67d1..b180c11 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1246,6 +1246,9 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False nuke.tprint("Task context is " + ctx_info.step['name']+". Applying RLE compression to "+ write_type +" output.") file_settings.update({'compression' : 'Zip (1 scanline)'}) file_settings.update({'datatype' : '16 bit half'}) + else: + file_settings.update({'compression' : 'None'}) + file_settings.update({'datatype' : '16 bit half'}) elif (file_type == "exr" and write_type == "Element" or write_type == "Precomp" or write_type == "Cleanup" or write_type == "Denoise"): file_settings.update({'compression' : 'Zip (1 scanline)'}) From a0eed36106d195658a190a068e65d638c6e71b7e Mon Sep 17 00:00:00 2001 From: daawaa Date: Thu, 22 Feb 2018 13:09:59 +0000 Subject: [PATCH 31/38] fixed compressions error --- python/tk_nuke_writenode/handler.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index b180c11..cec1164 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1247,12 +1247,14 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False file_settings.update({'compression' : 'Zip (1 scanline)'}) file_settings.update({'datatype' : '16 bit half'}) else: - file_settings.update({'compression' : 'None'}) + nuke.tprint("Task context is " + ctx_info.step['name']+". Removing compression from "+ write_type +" output.") + file_settings.update({'compression' : 'none'}) file_settings.update({'datatype' : '16 bit half'}) elif (file_type == "exr" and write_type == "Element" or write_type == "Precomp" or write_type == "Cleanup" or write_type == "Denoise"): + nuke.tprint("Adding compression to "+ write_type +" output.") file_settings.update({'compression' : 'Zip (1 scanline)'}) - file_settings.update({'datatype' : '16 bit half'}) + file_settings.update({'datatype' : '16 bit half'}) # Make sure any invalid entries are removed from the profile list: list_profiles = node.knob("tk_profile_list").values() if list_profiles != self._profile_names: From 9d5ea2ec82f857befb9387b953094ac19de35e4a Mon Sep 17 00:00:00 2001 From: daawaa Date: Tue, 27 Feb 2018 12:24:01 +0000 Subject: [PATCH 32/38] Set Cleanup to DPX for Fav --- python/tk_nuke_writenode/handler.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index cec1164..757ccc2 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1244,16 +1244,16 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False if file_type == "exr" and write_type == "Version" or write_type == "Test": if ctx_info.step['name'] == "Roto": nuke.tprint("Task context is " + ctx_info.step['name']+". Applying RLE compression to "+ write_type +" output.") - file_settings.update({'compression' : 'Zip (1 scanline)'}) + file_settings.update({'compression' : 'Zip (1 scanline)'}) file_settings.update({'datatype' : '16 bit half'}) else: nuke.tprint("Task context is " + ctx_info.step['name']+". Removing compression from "+ write_type +" output.") - file_settings.update({'compression' : 'none'}) - file_settings.update({'datatype' : '16 bit half'}) + file_settings.update({'compression' : 'none'}) + file_settings.update({'datatype' : '16 bit half'}) elif (file_type == "exr" and write_type == "Element" or write_type == "Precomp" or write_type == "Cleanup" or write_type == "Denoise"): nuke.tprint("Adding compression to "+ write_type +" output.") - file_settings.update({'compression' : 'Zip (1 scanline)'}) + file_settings.update({'compression' : 'Zip (1 scanline)'}) file_settings.update({'datatype' : '16 bit half'}) # Make sure any invalid entries are removed from the profile list: list_profiles = node.knob("tk_profile_list").values() @@ -2345,7 +2345,7 @@ def __on_knob_changed(self): write_type = self.get_node_write_type_name(node) write_type_profile = "Dpx" if write_type== "Version": - self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) node.knob("_promoted_1").setValue(False) elif write_type == "Precomp": @@ -2364,7 +2364,7 @@ def __on_knob_changed(self): node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) node.knob("_promoted_1").setValue(False) elif write_type == "Cleanup": - write_type_profile = "Exr 16 bit" + write_type_profile = "Dpx" self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) node.knob("_promoted_1").setValue(False) From d46bd9861515eca660083ceae78ba76b505babef Mon Sep 17 00:00:00 2001 From: daawaa Date: Tue, 27 Feb 2018 12:30:33 +0000 Subject: [PATCH 33/38] fix error with dpx bit --- python/tk_nuke_writenode/handler.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 757ccc2..e57a511 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1255,6 +1255,9 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False nuke.tprint("Adding compression to "+ write_type +" output.") file_settings.update({'compression' : 'Zip (1 scanline)'}) file_settings.update({'datatype' : '16 bit half'}) + elif (file_type == "dpx" and write_type == "Cleanup"): + file_settings.update({'datatype' : '16 bit'}) + # Make sure any invalid entries are removed from the profile list: list_profiles = node.knob("tk_profile_list").values() if list_profiles != self._profile_names: From 0faf150e1a6e970c4fc39662e6700208ca2c924b Mon Sep 17 00:00:00 2001 From: daawaa Date: Tue, 27 Feb 2018 12:36:49 +0000 Subject: [PATCH 34/38] removed tprint --- python/tk_nuke_writenode/handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index e57a511..1dd720d 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1252,7 +1252,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False file_settings.update({'datatype' : '16 bit half'}) elif (file_type == "exr" and write_type == "Element" or write_type == "Precomp" or write_type == "Cleanup" or write_type == "Denoise"): - nuke.tprint("Adding compression to "+ write_type +" output.") + # nuke.tprint("Adding compression to "+ write_type +" output.") file_settings.update({'compression' : 'Zip (1 scanline)'}) file_settings.update({'datatype' : '16 bit half'}) elif (file_type == "dpx" and write_type == "Cleanup"): From 280939e822e45aba9b7647293658416239906531 Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 16 Mar 2018 10:09:39 +0000 Subject: [PATCH 35/38] removed script based access --- python/tk_nuke_writenode/handler.py | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 1dd720d..c4fbc44 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -28,14 +28,6 @@ from tank.platform import constants from tank_vendor import shotgun_api3 as sgapi -try: - sg_login = "\\\\10.80.8.250\\VFX_Pipeline\\Pipeline\\Scripts" - sys.path.append(sg_login) - from shotgun.shotgun_login_node import ShotgunLogin -except: - print "Could not import SG login module" - - try: import ConfigParser except: @@ -86,8 +78,6 @@ def __init__(self, app): # call and cache the version info self._version_info = {} - self._get_sg = ShotgunLogin(sgapi) - self.sg = self._get_sg.get_sg() self.get_sg_info() ################################################################################################ @@ -631,6 +621,8 @@ def get_sg_info(self): self._version_info = {} ctx_info = self._app.context + eng = tank.platform.current_engine() + sg = eng.shotgun filters = [ ['entity', 'is', {'type': 'Shot', 'id': ctx_info.entity['id']}], @@ -643,8 +635,8 @@ def get_sg_info(self): "latest_by": "ENTITIES_CREATED_AT" }] - self._version_info = self.sg.find_one("Version",filters,fields,additional_filter_presets = additional_filter_presets,include_archived_projects=False) - self.sg.close() + self._version_info = sg.find_one("Version",filters,fields,additional_filter_presets = additional_filter_presets,include_archived_projects=False) + sg.close() def get_node_write_type_name(self, node): """ @@ -1440,6 +1432,10 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False proj_fps = 24 timecode = "01:00:00:01" print "Project is SSVFX_PIPELINE. Setting TC FPS to 24" + elif self._project == "DeAging": + proj_fps = 25 + timecode = "01:00:00:01" + print "Project is DeAging. Setting TC FPS to 25" else: proj_fps = 23.98 timecode = "01:00:00:01" @@ -2431,7 +2427,7 @@ def __on_knob_changed(self): self.__update_knob_value(node, "tk_profile_list", write_type_profile) # reset profile self.__set_profile(node, write_type_profile, write_type, reset_all_settings=True) - elif self._curr_entity_type == 'Asset': + elif self._curr_entity_type == 'Asset': write_type = self.get_node_write_type_name(node) write_type_profile = "Exr 16 bit" if write_type== "Version": From eb7b4b8808795e6a95659cf6bf4890eec2561184 Mon Sep 17 00:00:00 2001 From: daawaa Date: Tue, 3 Apr 2018 15:44:07 +0100 Subject: [PATCH 36/38] added new proj TC --- python/tk_nuke_writenode/handler.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index c4fbc44..813f103 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1435,7 +1435,11 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False elif self._project == "DeAging": proj_fps = 25 timecode = "01:00:00:01" - print "Project is DeAging. Setting TC FPS to 25" + print "Project is DeAging. Setting TC FPS to 25" + elif self._project == "GOT8": + proj_fps = 23.976 + timecode = "01:00:00:01" + print "Project is GOT8. Setting TC FPS to 23.976" else: proj_fps = 23.98 timecode = "01:00:00:01" From b6caee756ad813b0b2334d46760c97abab94777a Mon Sep 17 00:00:00 2001 From: daawaa Date: Tue, 17 Apr 2018 14:44:23 +0100 Subject: [PATCH 37/38] turning off sg connection --- python/tk_nuke_writenode/handler.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 813f103..f9f19ee 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -78,7 +78,7 @@ def __init__(self, app): # call and cache the version info self._version_info = {} - self.get_sg_info() + # self.get_sg_info() ################################################################################################ # Properties @@ -1384,7 +1384,10 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False profile_channel = "rgba" if profile_name == "Dpx": if self._project == "Jack Ryan S1": - node.knob("colorspace").setValue("Cineon") + node.knob("colorspace").setValue("Cineon") + elif (self._project == "GOT8" or + self._project == "SSVFX_PIPELINE"): + node.node("Write1").knob("datatype").setValue("10 bit") profile_channel = "rgb" elif profile_name == "Exr 16 bit": profile_channel = "rgb" @@ -2479,7 +2482,7 @@ def __on_knob_changed(self): elif knob.name() == "refresh_version_info": # set the write type for creation of correct output write_type = self.get_node_write_type_name(node) - self.get_sg_info() + # self.get_sg_info() self.__update_version_preview(node, write_type) elif knob.name() == "write_type_info": write_type_url = "http://10.80.10.239/mediawiki-1.25.2/index.php?title=VFX_Wiki#SG_Write_Nodes" From 759c91cd51927f4bd513f95a8a46f222c0862e94 Mon Sep 17 00:00:00 2001 From: daawaa Date: Wed, 25 Apr 2018 13:18:52 +0100 Subject: [PATCH 38/38] fixed problem where channels value is lost at conversion --- python/tk_nuke_writenode/handler.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index f9f19ee..5e67aee 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -470,7 +470,12 @@ def convert_sg_to_nuke_write_nodes(self): knob = nuke.Boolean_Knob(TankWriteNodeHandler.USE_NAME_AS_OUTPUT_KNOB_NAME) knob.setValue(sg_wn[TankWriteNodeHandler.USE_NAME_AS_OUTPUT_KNOB_NAME].value()) new_wn.addKnob(knob) - + + # channels + knob = nuke.String_Knob("tk_channels") + knob.setValue(sg_wn["channels"].value()) + new_wn.addKnob(knob) + # templates knob = nuke.String_Knob("tk_render_template") knob.setValue(sg_wn["render_template"].value()) @@ -532,6 +537,7 @@ def convert_nuke_to_sg_write_nodes(self): write_knob = wn.knob("tk_write_type") output_knob = wn.knob("tk_output") use_name_as_output_knob = wn.knob(TankWriteNodeHandler.USE_NAME_AS_OUTPUT_KNOB_NAME) + channels_knob = wn.knob("channels") render_template_knob = wn.knob("tk_render_template") publish_template_knob = wn.knob("tk_publish_template") proxy_render_template_knob = wn.knob("tk_proxy_render_template") @@ -542,6 +548,7 @@ def convert_nuke_to_sg_write_nodes(self): or not output_knob or not use_name_as_output_knob or not write_knob + or not channels_knob or not render_template_knob or not publish_template_knob or not proxy_render_template_knob @@ -560,6 +567,7 @@ def convert_nuke_to_sg_write_nodes(self): # copy across file & proxy knobs as well as all cached templates: new_sg_wn["cached_path"].setValue(wn["file"].value()) new_sg_wn["tk_cached_proxy_path"].setValue(wn["proxy"].value()) + new_sg_wn["channels"].setValue(channels_knob.value()) new_sg_wn["render_template"].setValue(render_template_knob.value()) new_sg_wn["publish_template"].setValue(publish_template_knob.value()) new_sg_wn["proxy_render_template"].setValue(proxy_render_template_knob.value())