From d095f945047b27699ab58271163a7f6feae64ae7 Mon Sep 17 00:00:00 2001 From: daawaa Date: Mon, 10 Sep 2018 14:36:54 +0100 Subject: [PATCH 01/90] up to date ssvfx writenode --- app.py | 36 +- gizmos/ProjectSettings.gizmo | 41 + gizmos/WriteTank.gizmo | 254 ++++-- gizmos/tab_stats.dat | Bin 0 -> 766 bytes info.yml | 27 + python/tk_nuke_writenode/handler.py | 1151 ++++++++++++++++++++++++--- 6 files changed, 1338 insertions(+), 171 deletions(-) create mode 100644 gizmos/ProjectSettings.gizmo create mode 100644 gizmos/tab_stats.dat diff --git a/app.py b/app.py index 9d1369d..9281e64 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,20 +223,39 @@ def create_new_write_node(self, profile_name): self.__write_node_handler.create_new_node(profile_name) # Private methods - # 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" + profile_list = [] write_node_icon = os.path.join(self.disk_location, "resources", "tk2_write.png") + profile_set = set(self.__write_node_handler.profile_names) + # Remove fileset types nt associated with Project + if not self.__write_node_handler.proj_info['sg_delivery_fileset']: + nuke.tprint("No fileset specified. Loading defaults...") + profile_list = self.__write_node_handler.profile_names + else: + if any(self.__write_node_handler.proj_info['sg_delivery_fileset']['name'] in s.lower() for s in self.__write_node_handler.profile_names): + if context.step['name'] != 'Roto': + match_set = {"Jpeg", self.__write_node_handler.proj_info['sg_delivery_fileset']['name'].title()} + else: + nuke.tprint("Context is " + context.step['name'] + ".") + match_set = {"Jpeg", "Exr"} - for profile_name in self.__write_node_handler.profile_names: + profile_list = list(match_set.intersection(profile_set)) + else: + nuke.tprint("Profile name not in list!") + profile_list = self.__write_node_handler.profile_names + + nuke.tprint("- Project fileset(s): " + str(profile_list)) + + for profile_name in profile_list: # 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", @@ -242,6 +263,3 @@ def __add_write_node_commands(self, context=None): context=context, ) ) - - - diff --git a/gizmos/ProjectSettings.gizmo b/gizmos/ProjectSettings.gizmo new file mode 100644 index 0000000..2f92435 --- /dev/null +++ b/gizmos/ProjectSettings.gizmo @@ -0,0 +1,41 @@ +Gizmo { + note_font Verdana + mapsize {0.15 0.15} +} + Input { + inputs 0 + name Input1 + xpos 195 + ypos -74 + } + Reformat { + type "to format" + box_width 800 + box_height 1 + black_outside false + pbb true + name project_reformat + disable true + } + Crop { + name project_crop + preset format + reformat true + crop false + disable true + } + AddTimeCode { + name project_tc + startcode 01:00:00:01 + metafps False + fps 23.98 + useFrame True + frame 1 + } +set N11879e50 [stack 0] + Output { + name Output1 + xpos 195 + ypos 150 + } +end_group \ No newline at end of file diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 73f3eb8..cab541e 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,40 @@ 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 cleanup_render_template + l "Sgtk Cleanup Template" + 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" + t "The Sgtk test template associated with this node" + +INVISIBLE } addUserKnob { 6 tk_is_fully_constructed @@ -61,7 +78,7 @@ Gizmo { +DO_NOT_WRITE +STARTLINE +INVISIBLE - } + } addUserKnob { 1 profile_name l "Profile Name" @@ -103,32 +120,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 +174,20 @@ Gizmo { T " " t "A preview of the file location generated by the node." } - + addUserKnob { + 22 increase_version + l "+1 version" + t "Increases the version number of the given output render." + +STARTLINE + +INVISIBLE + } + addUserKnob { + 22 revert_to_version + l "revert" + t "Reverts to the previous found version number of the given output render." + -STARTLINE + +INVISIBLE + } addUserKnob { 26 path_warning l " " @@ -167,16 +196,16 @@ Gizmo { +STARTLINE } addUserKnob { - 22 reset_path - l "Reset Path" - T "import nuke\nif hasattr(nuke, \"_shotgun_write_node_handler\"):\n nuke._shotgun_write_node_handler.on_reset_render_path_gizmo_callback()" + 26 files_warning + l " " + T " " + t "" +STARTLINE } - addUserKnob { - 26 "" - l "" - T " " + 22 reset_path + l "Reset Path" + T "import nuke\nif hasattr(nuke, \"_shotgun_write_node_handler\"):\n nuke._shotgun_write_node_handler.on_reset_render_path_gizmo_callback()" +STARTLINE } addUserKnob { @@ -188,17 +217,129 @@ 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 } - 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 Cleanup Test} + } + addUserKnob { + 22 write_type_info + l "Info" + T " " + } + addUserKnob { + 1 write_type_cache + l "SG Write Type Cache" + t "The cached Write Type for this node" + +INVISIBLE + } + addUserKnob { + 1 write_name_cache + l "SG Write Name Cache" + t "The cached Write Name for this node" + +INVISIBLE + } + addUserKnob { + 1 write_version_latest + l "SG Write Version number Cache" + t "The cached Write Name for this node" + +INVISIBLE + } + 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 project_crop + l "Crop to Project delivery format" + t "Choose to crop footage to the Project format." + +STARTLINE + -INVISIBLE + } + addUserKnob { + 4 exr_datatype + l "dataype" + t "Choose EXR datatype" + M {"16 bit half" "32 bit float"} + +STARTLINE + -INVISIBLE + } + addUserKnob { + 6 auto_crop + l "autocrop" + t "Choose to crop footage to the Project format." + +STARTLINE + -INVISIBLE + } + addUserKnob { + 4 dpx_datatype + l "dataype" + t "Choose DPX datatype" + M {"8 bit" "10 bit" "12 bit" "16 bit"} + +STARTLINE + -INVISIBLE + } + addUserKnob { + 25 "" + - STARTLINE + } + 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" + t "Use the node name in place of the output name" + -STARTLINE + +INVISIBLE + } + addUserKnob { + 26 version_divider + l "" + +STARTLINE + -INVISIBLE + } + addUserKnob { + 25 "" + - STARTLINE + } addUserKnob { 41 channels T Write1.channels @@ -233,7 +374,6 @@ Gizmo { 41 views T Write1.views } - addUserKnob { 26 "" l "" @@ -253,6 +393,7 @@ Gizmo { } addUserKnob { 41 Render + l "Local Render" T Write1.Render -STARTLINE } @@ -273,7 +414,6 @@ Gizmo { T Write1.use_limit -STARTLINE } - addUserKnob { 41 reading l "read file" @@ -296,12 +436,6 @@ Gizmo { T Write1.reload -STARTLINE } - - addUserKnob { - 26 "" - l "" - +STARTLINE - } addUserKnob { 41 _promoted_0 l Promoted @@ -411,9 +545,9 @@ 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()" + onCreate "import nuke\nif hasattr(nuke, \"_shotgun_write_node_handler\"):\n func = nuke._shotgun_write_node_handler.on_node_created_gizmo_callback()\n func.next()\n func.send(func)\n" } Input { inputs 0 @@ -421,20 +555,48 @@ Gizmo { xpos 195 ypos -74 } +Reformat { + type "to format" + box_width 800 + box_height 1 + black_outside false + pbb true + name project_reformat + disable true + } + Crop { + name project_crop + preset format + reformat true + crop false + disable true + } + AddTimeCode { + startcode 01:00:00:01 + name project_tc + metafps False + fps 23.98 + useFrame True + frame 1 + } + ModifyMetaData { + name content_meta_data + } 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()]" beforeRender "import nuke\nif hasattr(nuke, \"_shotgun_write_node_handler\"):\n nuke._shotgun_write_node_handler.on_before_render_gizmo_callback()" afterRender "import nuke\nif hasattr(nuke, \"_shotgun_write_node_handler\"):\n nuke._shotgun_write_node_handler.on_after_render_gizmo_callback()" name Write1 + create_directories True xpos 195 - ypos -34 + ypos 65 } set N11879e50 [stack 0] Output { name Output1 xpos 195 - ypos 66 + ypos 150 } push $N11879e50 Reformat { diff --git a/gizmos/tab_stats.dat b/gizmos/tab_stats.dat new file mode 100644 index 0000000000000000000000000000000000000000..b340c9d23dccf97c7342bb3b2e66a2f7092ffbbb GIT binary patch literal 766 zcma))%}c{j5X7f?@#I-N<><+S2JzrU8xcW+RPiDbLYub1CMk_t{qOzlCbpDRknq0t z&CJg3i==%?$9h(-OiSG}zbjS5ur<(2C-w?skHO_Y6|hPVKy#JsjSy+Uc_{<-40sMO z(?}m0vIdHwfAU8~Kbo6Kk;HI)A(&5<(jwVt!I6i5|V1C6ScojEF?o zpRmvPlC}pO*{CCXNtaXVub|E~Z9Q&^oo)Acs2hJ6>#Y^hM`Y$gt2PD%7lh^xcyf42 zC&msdyxtvangJ`U)NNhO!*6+*(18VtR(SUBr|~RDkf)G_dShPbikwaVy1&7$*=h(W T#!3h?Cw#TVPNDwBn}UA;hlq3D literal 0 HcmV?d00001 diff --git a/info.yml b/info.yml index c4802f5..1d099b0 100644 --- a/info.yml +++ b/info.yml @@ -64,6 +64,33 @@ 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 + 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], * + 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 74949ea..9dfa62d 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 traceback +import webbrowser import nuke import nukescripts @@ -22,6 +25,8 @@ import tank from tank import TankError from tank.platform import constants +from tank.platform.qt import QtCore +from tank_vendor import shotgun_api3 as sgapi # Special exception raised when the work file cannot be resolved. class TkComputePathError(TankError): @@ -33,8 +38,12 @@ class TankWriteNodeHandler(object): """ SG_WRITE_NODE_CLASS = "WriteTank" - SG_WRITE_DEFAULT_NAME = "ShotgunWrite" + SG_WRITE_DEFAULT_NAME = "SGWrite" WRITE_NODE_NAME = "Write1" + EMBED_TIME_CODE = "project_tc" + EMBED_META_DATA = "content_meta_data" + EMBED_PROJECT_REFORMAT = "project_reformat" + EMBED_CROP = "project_crop" OUTPUT_KNOB_NAME = "tank_channel" USE_NAME_AS_OUTPUT_KNOB_NAME = "tk_use_name_as_channel" @@ -48,10 +57,14 @@ def __init__(self, app): """ self._app = app self._script_template = self._app.get_template("template_script_work") - + # Context info + self._curr_entity_type = self._app.context.entity['type'] + self._project = self._app.context.project + # cache the profiles: self._promoted_knobs = {} self._profile_names = [] + self._project_setting_groups = [] self._profiles = {} self.__currently_rendering_nodes = set() @@ -62,7 +75,35 @@ def __init__(self, app): self.__is_updating_proxy_path = False self.populate_profiles_from_settings() - + + self.sg = self._app.engine.shotgun + self.proj_info = self.sg.find_one("Project", + [['id', 'is', self._project['id']]], + ['name', + 'sg_frame_rate', + 'sg_data_type', + 'sg_format_width', + 'sg_format_height', + 'sg_delivery_format_width', + 'sg_delivery_format_height', + 'sg_delivery_reformat_filter', + 'sg_pixel_aspect_ratio', + 'sg_short_name', + 'sg_delivery_fileset', + 'sg_delivery_fileset_compression', + 'sg_color_space', + 'sg_project_color_management']) + # self.software_info = self.sg.find_one("Software", + # [['id', 'is_not', 0], + # ['code', 'is', 'RV']], + # ['code', + # 'windows_path', + # "version_names" + # ]) + + self.ctx_info = self._app.context + self.get_shot_frame_range() + ################################################################################################ # Properties @@ -98,7 +139,13 @@ def populate_script_template(self): Sources the current context's work file template from the parent app. """ self._script_template = self._app.get_template("template_script_work") - + + def get_shot_frame_range(self): + + if self._curr_entity_type == "Shot": + self.frame_range_app = self._app.engine.apps["tk-multi-setframerange"] + self.frame_range = self.frame_range_app.get_frame_range_from_shotgun() + def get_nodes(self): """ Returns a list of tank write nodes @@ -130,11 +177,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 +189,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): """ @@ -200,17 +247,20 @@ def render_path_is_locked(self, node): return self.__is_render_path_locked(node, render_path, cached_path) - def reset_render_path(self, node): + def reset_render_path(self, node, increase_version=False): """ Reset the render path of the specified node. This will force the render path to be updated based on the current script path and configuraton """ is_proxy = node.proxy() - 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)) + if not increase_version: + 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)) + else: + self.__update_render_path(node, force_reset=True, is_proxy=is_proxy, increase_version=True) - def create_new_node(self, profile_name): + def create_new_node(self, profile_name, write_type): """ Creates a new write node @@ -244,7 +294,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 +326,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) @@ -365,6 +417,44 @@ def remove_callbacks(self): nuke.removeOnScriptLoad(self.process_placeholder_nodes, nodeClass="Root") nuke.removeOnScriptSave(self.__on_script_save) nuke.removeOnUserCreate(self.__on_user_create, nodeClass=TankWriteNodeHandler.SG_WRITE_NODE_CLASS) + + def create_project_settings_group(self, node): + + # Get properties of selected node to use for new group + node = nuke.selectedNode() + nodePos = (node.xpos(), node.ypos()) + parent_node = None + if node.input(0): + parent_node = node.input(0) + node['selected'].setValue(False) + + # Primary group setup + proj_group_nodes = [] + project_reformat = nuke.createNode("Reformat") + project_reformat['name'].setValue("project_reformat") + project_crop = nuke.createNode("Crop") + project_crop['name'].setValue("project_crop") + project_tc = nuke.createNode("AddTimeCode") + project_tc['name'].setValue("project_tc") + content_metadata = nuke.createNode("ModifyMetaData") + content_metadata['name'].setValue("content_meta_data") + proj_group_nodes.append(project_reformat) + proj_group_nodes.append(project_crop) + proj_group_nodes.append(project_tc) + proj_group_nodes.append(content_metadata) + + for i in proj_group_nodes: + i.setSelected(True) + + project_group = nuke.makeGroup('showControlPanel') + project_group.setXpos(nodePos[0]) + project_group.setYpos(nodePos[1] - 30) + project_group.setSelected(False) + for i in proj_group_nodes: + nuke.delete(i) + project_group.setInput(0, parent_node) + node.setInput(0, project_group) + return project_group def convert_sg_to_nuke_write_nodes(self): """ @@ -392,8 +482,38 @@ def convert_sg_to_nuke_write_nodes(self): # create new regular Write node: new_wn = nuke.createNode("Write") + + if new_wn.input(0): + parent_node = new_wn.input(0) + new_wn['selected'].setValue(False) + parent_node['selected'].setValue(True) + + extra_node = self.create_project_settings_group(sg_wn) + self._project_setting_groups.append(extra_node) + new_wn.setSelected(False) - + + # Embed reformat + extra_node.node('project_reformat')['disable'].setValue(sg_wn.node('project_reformat')['disable'].value()) + extra_node.node('project_reformat')['filter'].setValue(sg_wn.node('project_reformat')['filter'].value()) + extra_node.node('project_reformat')['format'].setValue(sg_wn.node('project_reformat')['format'].value()) + extra_node.node('project_reformat')['pbb'].setValue(sg_wn.node('project_reformat')['pbb'].value()) + extra_node.node('project_reformat')['black_outside'].setValue(sg_wn.node('project_reformat')['black_outside'].value()) + # Embed crop + extra_node.node('project_crop')['disable'].setValue(sg_wn.node('project_crop')['disable'].value()) + extra_node.node('project_crop')['box'].setValue(sg_wn.node('project_crop')['box'].value()) + extra_node.node('project_crop')['reformat'].setValue(sg_wn.node('project_crop')['reformat'].value()) + extra_node.node('project_crop')['crop'].setValue(sg_wn.node('project_crop')['crop'].value()) + # Embed tc + extra_node.node('project_tc')['startcode'].setValue(sg_wn.node('project_tc')['startcode'].value()) + extra_node.node('project_tc')['fps'].setValue(sg_wn.node('project_tc')['fps'].value()) + extra_node.node('project_tc')['metafps'].setValue(sg_wn.node('project_tc')['metafps'].value()) + extra_node.node('project_tc')['useFrame'].setValue(sg_wn.node('project_tc')['useFrame'].value()) + extra_node.node('project_tc')['frame'].setValue(sg_wn.node('project_tc')['frame'].value()) + # Embed metadata + md = extra_node.node('content_meta_data')['metadata'] + md.fromScript(self.__get_metadata(sg_wn)) + # copy across file & proxy knobs (if we've defined a proxy template): new_wn["file"].setValue(sg_wn["cached_path"].evaluate()) if sg_wn["proxy_render_template"].value(): @@ -409,7 +529,7 @@ def convert_sg_to_nuke_write_nodes(self): 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"]: + "name", "xpos", "ypos"]: continue if knob_name in new_wn.knobs(): @@ -435,12 +555,31 @@ 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()) new_wn.addKnob(knob) - + + # channels + knob = nuke.String_Knob("tk_channels") + knob.setValue(sg_wn["channels"].value()) + new_wn.addKnob(knob) + + # datatype + knob = nuke.String_Knob("tk_exr_datatype") + knob.setValue(sg_wn["exr_datatype"].value()) + new_wn.addKnob(knob) + + knob = nuke.String_Knob("tk_dpx_datatype") + knob.setValue(sg_wn["dpx_datatype"].value()) + new_wn.addKnob(knob) + + # autocrop + knob = nuke.String_Knob("tk_autocrop") + knob.setValue(str(sg_wn["auto_crop"].value())) + new_wn.addKnob(knob) + # templates knob = nuke.String_Knob("tk_render_template") knob.setValue(sg_wn["render_template"].value()) @@ -457,14 +596,24 @@ 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) - + + # 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()) + new_wn.addKnob(knob) + # delete original node: nuke.delete(sg_wn) # rename new node: new_wn.setName(node_name) new_wn.setXpos(node_pos[0]) - new_wn.setYpos(node_pos[1]) + new_wn.setYpos(node_pos[1]) def convert_nuke_to_sg_write_nodes(self): """ @@ -485,20 +634,36 @@ def convert_nuke_to_sg_write_nodes(self): # get write nodes: write_nodes = nuke.allNodes(group=nuke.root(), filter="Write", recurseGroups = True) + + for gn in self._project_setting_groups: + nuke.delete(gn) + self._project_setting_groups = [] + for wn in write_nodes: # look for additional toolkit knobs: profile_knob = wn.knob("tk_profile_name") + write_type = wn.knob("tk_write_type") + exr_datatype = wn.knob("tk_exr_datatype") + dpx_datatype = wn.knob("tk_dpx_datatype") + auto_crop = wn.knob("tk_autocrop") 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") 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 or not use_name_as_output_knob + or not write_type + or not exr_datatype + or not dpx_datatype + or not auto_crop + or not channels_knob or not render_template_knob or not publish_template_knob or not proxy_render_template_knob @@ -510,19 +675,21 @@ def convert_nuke_to_sg_write_nodes(self): wn.setSelected(True) node_name = wn.name() node_pos = (wn.xpos(), wn.ypos()) - + wn.setName(node_name) + # 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()) + 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()) 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. @@ -542,8 +709,8 @@ def convert_nuke_to_sg_write_nodes(self): 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"]: + "name", "xpos", "ypos", "disable", "tile_color", "postage_stamp", + "label"]: continue if knob_name in int_wn.knobs(): @@ -552,15 +719,35 @@ def convert_nuke_to_sg_write_nodes(self): except TypeError: # ignore type errors: pass - + # 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()) - + # delete original node: nuke.delete(wn) - - # rename new node: + + # set SG write type + write_type_name = write_type.value() + new_sg_wn["write_type"].setValue(write_type_name) + + #Set tank channel + tank_channel_text = tk_tank_channel.value() + new_sg_wn["tank_channel"].setValue(tank_channel_text) + + # datatype + new_sg_wn["exr_datatype"].setValue(exr_datatype.value()) + new_sg_wn["dpx_datatype"].setValue(dpx_datatype.value()) + + # autocrop + if auto_crop.value() == "True": + ac_val = True + else: + ac_val = False + + new_sg_wn["auto_crop"].setValue(ac_val) + + # rename new node: new_sg_wn.setName(node_name) new_sg_wn.setXpos(node_pos[0]) new_sg_wn.setYpos(node_pos[1]) @@ -570,6 +757,45 @@ def convert_nuke_to_sg_write_nodes(self): # Public methods called from gizmo - although these are public, they should # be considered as private and not used directly! + 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 test_folder_for_renders(self, path): + """ + Tests a given folder location - mainly the writenode's file path for containing files + + :returns: True/False + """ + file_path = "" + path_items = [] + ext_match = [] + path_dir = os.path.dirname(path) + + if os.path.isdir(path_dir): + 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) + path_items.sort() + if path_items: + for file in path_items: + path_item_ext = os.path.splitext(file)[1] + if path_item_ext not in path_items_ext: + path_items_ext.append(path_item_ext) + + file_path = os.path.normpath(os.path.join(path_dir,path_items[0])) + ext_match = list(set(path_items_ext).intersection(set(file_output_ext))) + + return (path_items, file_path, ext_match) + + else: + return False + def on_knob_changed_gizmo_callback(self): """ Called when the value of a knob on a Shotgun Write Node is changed @@ -588,8 +814,27 @@ def on_node_created_gizmo_callback(self): # was farm setups for a few clients. It's best if we just leave this # alone from now on, unless we someday have a better understanding of # what's going on and the consequences of changing the on_node_created - # behavior. - self.__setup_new_node(nuke.thisNode()) + # behavior. + current_node = nuke.thisNode() + + # We're doing something different here. We have a situation where the + # logic in __setup_new_node might trigger an exception being raised in + # Nuke's framebuffer subprocess, which makes its way to the console. It + # doesn't break anything, but it's impossible to snuff it out since it + # is occurring in a different process from us here. What this is doing + # is staging the node created callback such that it's called slowly + # over a period of a couple hundred milliseconds, while giving Nuke's + # event loop the opportunity to iterate a couple times between phases + # execution. A side effect of this is that the render paths are sometimes + # not properly reset, most notably during some Snapshot restores. As + # a result, we also call the reset_render_path method to ensure everything + # is good there. + calling_function = yield + QtCore.QTimer.singleShot(100, calling_function.next) + yield + self.__setup_new_node(current_node) + self.reset_render_path(current_node) + yield def on_compute_path_gizmo_callback(self): """ @@ -657,7 +902,7 @@ def on_show_in_fs_gizmo_callback(self): # render directory doesn't exist so try using location # of rendered frames instead: try: - files = self.get_files_on_disk(node) + files, fields = self.get_files_on_disk(node) if len(files) == 0: nuke.message("There are no %srenders for this node yet!\n" "When you render, the files will be written to " @@ -697,7 +942,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. @@ -707,11 +952,61 @@ 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) + 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_open_in_player_gizmo_callback(self): + + node = nuke.thisNode() + if not node: + return + + render_dir = None + + # first, try to just use the current cached path: + is_proxy = node.proxy() + render_path = self.__get_render_path(node, is_proxy) + if render_path: + # the above method returns nuke style slashes, so ensure these + # are pointing correctly + render_path = render_path.replace("/", os.path.sep) + + dir_name = os.path.dirname(render_path) + if os.path.exists(dir_name): + render_dir = dir_name + + if os.path.exists(os.path.normpath(self.software_info['windows_path'])): + if render_dir: + system = sys.platform + # run the app + if system == "linux2": + pass + # cmd = "xdg-open \"%s\"" % render_dir + elif system == "darwin": + pass + # cmd = "open '%s'" % render_dir + elif system == "win32": + cmd = "start cmd.exe /c \"%s\" \"%s\" pause" % (self.software_info['windows_path'], render_dir) + else: + raise Exception("Platform '%s' is not supported." % system) + + self._app.log_debug("Executing command '%s'" % cmd) + exit_code = os.system(cmd) + if exit_code != 0: + nuke.message("Failed to launch '%s'!" % cmd) + + else: + nuke.message("Could not find the path to render") + else: + nuke.message("Could not find the path to %s: %s" % (self.software_info['code'], + self.software_info['windows_path'])) + def on_before_render_gizmo_callback(self): """ Callback from nuke whenever a tank write node is about to be rendered. @@ -762,6 +1057,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 @@ -819,7 +1115,7 @@ def __get_template(self, node, name): 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 @@ -831,8 +1127,32 @@ def __get_render_template(self, node, is_proxy=False, fallback_to_render=False): template = self.__get_template(node, "proxy_render_template") if template or not fallback_to_render: return template - - return self.__get_template(node, "render_template") + elif 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 == "Cleanup": + 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: + return template + else: + return self.__get_template(node, "render_template") def __get_publish_template(self, node, is_proxy=False): """ @@ -848,8 +1168,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: @@ -881,7 +1202,7 @@ def __update_output_knobs(self, node): 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.setEnabled(output_is_used and not name_as_output) output_knob.setVisible(output_is_used) name_as_output_knob.setVisible(output_is_used) @@ -889,13 +1210,17 @@ def __update_path_preview(self, node, is_proxy): """ Updates the path preview fields on the tank write node. """ + # set the write type for creation of correct output + write_type = self.get_node_write_type_name(node) + # first set up the node label # 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 + label ="%s - %s" % (write_type, pn) self.__update_knob_value(node, "label", label) + # get the render path: path = self.__get_render_path(node, is_proxy) @@ -916,12 +1241,70 @@ def __update_path_preview(self, node, is_proxy): # get the file name file_name = os.path.basename(norm_path) render_dir = os.path.dirname(norm_path) - - # now get the context path + # 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) context_path = None - for x in self._app.context.entity_locations: - if render_dir.startswith(x): - context_path = x + + if self._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 == "Precomp": + context_info = self._app.tank.templates['shot_render_global'] + elif write_type == "Element": + context_info = self._app.tank.templates['shot_render_global'] + elif write_type == "Denoise": + 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'] + + context_path = context_info.apply_fields(fields) + + elif self._curr_entity_type == 'Asset': + fields ={ + 'Asset': curr_fields['Asset'], + 'Step': curr_fields['Step'], + 'sg_asset_type': curr_fields['sg_asset_type'], + 'name': '', + 'output': '', + 'version': curr_fields['version'] + } + 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_global'] + elif write_type == "Element": + context_info = self._app.tank.templates['asset_render_global'] + elif write_type == "Denoise": + 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'] + + context_path = context_info.apply_fields(fields) + + # now get the context path + # for x in self._app.context.entity_locations: + # if render_dir.startswith(x): + # context_path = x if context_path: # found a context path! @@ -960,7 +1343,6 @@ def set_path_knob(name, value): set_path_knob("path_local", local_path) set_path_knob("path_filename", file_name) - def __apply_cached_file_format_settings(self, node): """ Apply the file_type and settings that have been cached on the node to the internal @@ -985,8 +1367,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. @@ -1005,6 +1386,7 @@ def __set_profile(self, node, profile_name, reset_all_settings=False): # get the profile details: profile = self._profiles.get(profile_name) + 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'!" @@ -1017,17 +1399,59 @@ 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() - + # 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"]) + 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"] file_settings = profile["settings"] tile_color = profile["tile_color"] promote_write_knobs = profile.get("promote_write_knobs", []) + # Sets project specific data type + exr_datayype = '16 bit half' + dpx_datatype = '10 bit' + + if profile_name == "Exr": + if self.proj_info['sg_data_type']: + if self.proj_info['sg_data_type'] == '16 bit': + exr_datayype = '16 bit half' + elif self.proj_info['sg_data_type'] == '32 bit': + exr_datayype = '32 bit float' + elif profile_name == "Dpx": + if self.proj_info['sg_data_type']: + self.__update_knob_value(node, 'dpx_datatype', self.proj_info['sg_data_type']) + else: + self.__update_knob_value(node, 'dpx_datatype', dpx_datatype) + + # Apply datatype info based on context + if file_type == "exr" and write_type == "Version": + if self.ctx_info.step['name'] == "Roto": + nuke.tprint("Task context is " + self.ctx_info.step['name']+ + ". Applying ZIP compression to "+ write_type +" output.") + self.__update_knob_value(node, 'exr_datatype', '16 bit half') + file_settings.update({'compression' : 'Zip (1 scanline)'}) + file_settings.update({'datatype' : '16 bit half'}) + else: + self.__update_knob_value(node, 'exr_datatype', exr_datayype) + file_settings.update({'compression' : 'none'}) + file_settings.update({'datatype' : exr_datayype}) + elif (file_type == "exr" and write_type == "Element" or write_type == "Precomp" + or write_type == "Cleanup" or write_type == "Denoise"): + self.__update_knob_value(node, 'exr_datatype', '16 bit half') + file_settings.update({'compression' : 'Zip (1 scanline)'}) + file_settings.update({'datatype' : '16 bit half'}) + nuke.tprint("Applying ZIP compression to %s output." % write_type) + promote_write_knobs = profile.get("promote_write_knobs", []) # 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: @@ -1035,8 +1459,12 @@ def __set_profile(self, node, profile_name, 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, "write_name_cache", str(node.name())) self.__update_knob_value(node, "tk_profile_list", profile_name) + + self.__update_knob_value(node, "write_version_latest", str(1)) # set the format self.__populate_format_settings( node, @@ -1045,12 +1473,12 @@ def __set_profile(self, node, profile_name, reset_all_settings=False): reset_all_settings, promote_write_knobs, ) - + # 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) self.__update_knob_value(node, "tk_file_type_settings", pickle.dumps(file_settings)) - + # Hide the promoted knobs that might exist from the previously # active profile. for promoted_knob in self._promoted_knobs.get(node, []): @@ -1096,12 +1524,26 @@ def __set_profile(self, node, profile_name, reset_all_settings=False): node.setTab(0) # write the template name to the node so that we know it later - self.__update_knob_value(node, "render_template", render_template.name) - self.__update_knob_value(node, "publish_template", publish_template.name) + self.__update_knob_value(node, "render_template", + render_template.name) + self.__update_knob_value(node, "publish_template", + publish_template.name) self.__update_knob_value(node, "proxy_render_template", 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, "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: if not tile_color or len(tile_color) != 3: @@ -1109,9 +1551,23 @@ def __set_profile(self, node, profile_name, reset_all_settings=False): # don't have exactly three values for RGB so log a warning: self._app.log_warning(("The tile_color setting for profile '%s' must contain 3 values (RGB) - this " "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 == "Cleanup": + default_value = 4287911423 + elif write_type == "Final": + default_value = 16711935 + 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 @@ -1121,6 +1577,124 @@ def __set_profile(self, node, profile_name, reset_all_settings=False): packed_rgb = (packed_rgb + min(max(element, 0), 255)) << 8 self.__update_knob_value(node, "tile_color", packed_rgb) + + # set the channel info based on the profile type + profile_channel = "rgba" + if profile_name == "Dpx": + node.knob('dpx_datatype').setVisible(True) + node.knob('exr_datatype').setVisible(False) + profile_channel = "rgb" + elif profile_name == "Exr": + node.knob('exr_datatype').setVisible(True) + node.knob('dpx_datatype').setVisible(False) + profile_channel = "rgb" + node.node(TankWriteNodeHandler.WRITE_NODE_NAME)['metadata'].setValue('all metadata') + node.knob('auto_crop').setVisible(False) + if (write_type == "Precomp" or + write_type == "Element"): + profile_channel = "rgba" + node.knob('auto_crop').setVisible(True) + node.knob('auto_crop').setValue(True) + if self.ctx_info.step['name'] == "Roto": + node.knob('auto_crop').setVisible(True) + profile_channel = "rgba" + elif profile_name == "Jpeg": + node.knob('dpx_datatype').setVisible(False) + node.knob('exr_datatype').setVisible(False) + profile_channel = "rgb" + else: + nuke.tprint("No profile with that name") + + self.__update_knob_value(node, "channels", profile_channel) + + # Sets project specific fileset compression + if (file_type== "exr" and + write_type == "Version"): + if self.proj_info['sg_delivery_fileset_compression']: + node.node("Write1").knob("compression").setValue(self.proj_info['sg_delivery_fileset_compression']) + nuke.tprint("Setting Version compression from SG Project values to : " + self.proj_info['sg_delivery_fileset_compression']) + + if self._curr_entity_type == 'Shot': + # Update embeded time code + proj_reformat = node.node(TankWriteNodeHandler.EMBED_PROJECT_REFORMAT) + project_crop = node.node(TankWriteNodeHandler.EMBED_CROP) + time_code = node.node(TankWriteNodeHandler.EMBED_TIME_CODE) + content_meta_data = node.node(TankWriteNodeHandler.EMBED_META_DATA) + proj_fps = self.proj_info['sg_frame_rate'] + timecode = "01:00:00:01" + + # Add sG reformat settings + if not self.proj_info['sg_delivery_reformat_filter'] == None: + proj_reformat['filter'].setValue(self.proj_info['sg_delivery_reformat_filter']) + + # Timecode settings + if not self.frame_range[0]: + print "No frame range values found on SG" + shot_frame_range_start = 1 + use_start_frame = False + use_meta_data = True + else: + shot_frame_range_start = self.frame_range[0] + use_start_frame = True + use_meta_data = False + + time_code.knobs()["startcode"].setValue(timecode) + if proj_fps: + time_code.knobs()["fps"].setValue(float(proj_fps)) + time_code.knobs()["useFrame"].setValue(use_start_frame) + time_code.knobs()["frame"].setValue(shot_frame_range_start) + time_code.knobs()["metafps"].setValue(use_meta_data) + + # Embeded Crop settings + if not (self.proj_info['sg_delivery_format_width'] and + self.proj_info['sg_delivery_format_height']): + if (self.proj_info['sg_format_width'] and + self.proj_info['sg_format_height']): + project_crop.knobs()["box"].setValue((0, + 0, + self.proj_info['sg_format_width'], + self.proj_info['sg_format_height'])) + + self._app.log_debug("Applied Project format to embeded Crop: " + + str(self.proj_info['sg_format_width']) + + str(self.proj_info['sg_format_height'])) + else: + project_crop.knobs()["box"].setValue((0, + 0, + self.proj_info['sg_delivery_format_width'], + self.proj_info['sg_delivery_format_height'])) + self._app.log_debug("Applied Project Delivery format to embeded Crop") + + # Set reformat info + if (self.proj_info['sg_delivery_format_width'] and + self.proj_info['sg_delivery_format_height'] and + self.proj_info['sg_pixel_aspect_ratio'] and + self.proj_info['sg_short_name']): + scriptFormats = nuke.formats() + main_format = None + for f in scriptFormats: + if (f.width() == int(self.proj_info['sg_delivery_format_width']) and + f.height() == int(self.proj_info['sg_delivery_format_height'])): + main_format = f + break + if not main_format: + try: + main_format = nuke.addFormat("%s %s %s %s" % (str(self.proj_info['sg_delivery_format_width']), + str(self.proj_info['sg_delivery_format_height']), + str(self.proj_info['sg_pixel_aspect_ratio']), + (self.proj_info['sg_short_name']+"_"+str(self.proj_info['sg_format_width'])))) + except: + nuke.tprint("Could not apply embeded format settings. Missing info from Projects...") + + proj_reformat.knobs()["format"].setValue(main_format) + + # Set colorspace based of SG values + if self.proj_info['sg_color_space']: + nuke.tprint("Setting colorspace of %s to: %s" % (node['name'].value(), self.proj_info['sg_color_space'])) + node['colorspace'].setValue(self.proj_info['sg_color_space']) + + md = content_meta_data['metadata'] + md.fromScript(self.__get_metadata(node)) # 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 @@ -1128,6 +1702,29 @@ def __set_profile(self, node, profile_name, reset_all_settings=False): if profile_name != old_profile_name: self.reset_render_path(node) + def __get_metadata(self, node): + + # Set meta data info + user_name = "" + step_name = "" + script_name = "" + computer_name = os.getenv('COMPUTERNAME') + + try: + user_name = self.ctx_info.user['name'].replace(' ', '_') + step_name = self.ctx_info.step['name'] + except: + self._app.log_debug("Failed to gt context info for meta data.") + if nuke.root(): + script_name = os.path.split(nuke.root().name())[1] + metadata_info = "{set artist_name %s}\n" % user_name + metadata_info += "{set computer_name %s}\n" % computer_name + metadata_info += "{set script_name %s}\n" % script_name + metadata_info += "{set write_node %s}\n" % node.name() + metadata_info += "{set pipeline_step %s}\n" % step_name + + return metadata_info + def __populate_initial_output_name(self, template, node): """ Create a suitable output name for a node based on it's profile and @@ -1155,35 +1752,35 @@ def __populate_initial_output_name(self, template, node): # Nothing to do! return - if output_default is None: - # no default name - use hard coded built in - output_default = "output" + # if output_default is None: + # # no default name - use hard coded built in + # 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()) + # # 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 = "" + # # 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 + # # 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) + # # 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 - ): + ): """ Controls the file format of the write node @@ -1289,10 +1886,10 @@ def __populate_format_settings( self._app.log_debug( "Promoted write node knob settings to be applied: %s" % filtered_settings ) - write_node.readKnobs("\n".join(filtered_settings)) + write_node.readKnobs(r"\n".join(filtered_settings)) self.reset_render_path(node) - def __set_output(self, node, output_name): + def __set_output(self, node, output_name, increase_version=False): """ Set the output on the specified node from user interaction. """ @@ -1301,8 +1898,11 @@ def __set_output(self, node, output_name): # update output knob: self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, output_name) - # reset the render path: - self.reset_render_path(node) + if not increase_version: + # reset the render path + self.reset_render_path(node) + else: + self.reset_render_path(node, increase_version=True) def __wrap_text(self, t, line_length): """ @@ -1327,7 +1927,20 @@ def __wrap_text(self, t, line_length): lines.append(this_line) return lines - def __update_render_path(self, node, force_reset=False, is_proxy=False): + def __read_node_metadata(self, read_path): + + read_path = read_path.replace('\\','/') + read_metadata = nuke.nodes.Read(file="%s" %(read_path)) + read_metadata['file'].setValue(read_path) + read_metadata_info = read_metadata.metadata() + nuke.delete(read_metadata) + + try: + return read_metadata_info + except: + return None + + def __update_render_path(self, node, force_reset=False, is_proxy=False, increase_version=False): """ Update the render path and the various feedback knobs based on the current context and other node settings. @@ -1394,9 +2007,13 @@ def __update_render_path(self, node, force_reset=False, is_proxy=False): if compute_path_error: raise TkComputePathError(compute_path_error) else: - # compute the render path: - render_path = self.__compute_render_path_from(node, render_template, width, height, output_name) - + # compute the render path + if not increase_version: + render_path = self.__compute_render_path_from(node, render_template, width, height, output_name) + else: + render_path = self.__compute_render_path_from(node, render_template, width, height, output_name, next_version = 2) + nuke.tprint("Increasing Version...") + except TkComputePathError, e: # update cache: self.__node_computed_path_settings_cache[(node, is_proxy)] = (cache_entry, str(e), "") @@ -1429,7 +2046,21 @@ def __update_render_path(self, node, force_reset=False, is_proxy=False): # to see if it is locked. A path is considered locked if the render path differs # from the cached path ignoring certain dynamic fields (e.g. width, height). path_is_locked = self.__is_render_path_locked(node, render_path, cached_path, is_proxy) - + else: + # compute the render path + if not increase_version: + render_path = self.__compute_render_path_from(node, render_template, width, height, output_name) + else: + files, fields = self.get_files_on_disk(node) + next_version_number = 2 + if files: + output_template = self._app.tank.template_from_path(files[0]) + output_fields = output_template.get_fields(files[0]) + next_version_number = output_fields['version'] + 1 + + render_path = self.__compute_render_path_from(node, render_template, width, height, output_name, next_version = next_version_number) + nuke.tprint("Increasing Version...") + if path_is_locked: # render path was not what we expected! path_warning += "
".join(self.__wrap_text( @@ -1533,8 +2164,8 @@ 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) - + 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." "The path '%s' is not recognized by Shotgun!" % (node.name(), file_name)) @@ -1544,7 +2175,7 @@ def __get_files_on_disk(self, node, is_proxy=False): # make sure we don't look for any eye - %V or SEQ - %04d stuff frames = self._app.tank.paths_from_template(template, fields, ["SEQ", "eye"]) - return frames + return (frames, fields) def __calculate_proxy_dimensions(self, node): """ @@ -1597,7 +2228,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): """ @@ -1608,7 +2238,8 @@ 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) + 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 = "" @@ -1635,7 +2266,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. @@ -1651,7 +2281,7 @@ def __compute_render_path(self, node, is_proxy=False): # compute the render path: return self.__compute_render_path_from(node, render_template, width, height, output_name) - def __compute_render_path_from(self, node, render_template, width, height, output_name): + def __compute_render_path_from(self, node, render_template, width, height, output_name, next_version= 1): """ Computes the render path for a node using the specified settings @@ -1662,6 +2292,9 @@ def __compute_render_path_from(self, node, render_template, width, height, outpu :param output_name: The toolkit output name specified by the user for this node :returns: The computed render path """ + # nuke.tprint("Computing render path!") + # Get write type + write_type = self.get_node_write_type_name(node) # make sure we have a valid template: if not render_template: @@ -1677,6 +2310,15 @@ def __compute_render_path_from(self, node, render_template, width, height, outpu fields = {} if curr_filename and self._script_template and self._script_template.validate(curr_filename): fields = self._script_template.get_fields(curr_filename) + if (write_type == "Version" or + write_type == "Final" or + write_type == "Test"): + pass + else: + fields.update({'version': next_version}) + + + if not fields: raise TkComputePathError("The current script is not a Shotgun Work File!") @@ -1723,8 +2365,58 @@ def __compute_render_path_from(self, node, render_template, width, height, outpu # make slahes uniform: path = path.replace(os.path.sep, "/") + + """ + try: + file, fields = self.get_files_on_disk(node) + nuke.tprint("Version number: %s" % str(fields['version'])) + nuke.tprint("Path: %s" % file[0]) + ext_match = file[0] + path_to_test = file + except: + nuke.tprint("nope") + """ + + # Test for existing folder contents + if self.test_folder_for_renders(path): + if (self.test_folder_for_renders(path)[0] and + self.test_folder_for_renders(path)[2]): + ext_match = self.test_folder_for_renders(path)[2] + path_to_test = self.test_folder_for_renders(path)[1] + ext_match_string = "" + files_warning = "" + read_creator = "Unknown" + + # Get extension of file + if ext_match >1: + for i in ext_match: + ext_match_string += " " + i + " " + else: + ext_match_string = ext_match[0] + # Get user that created files + if not self.__read_node_metadata(path_to_test): + pass + else: + try: + read_creator = self.__read_node_metadata(path_to_test)['exr/nuke/artist_name'] + except: + pass + + files_warning += "Careful Now!
" + files_warning += "%s files already exist in this location.
" % ext_match_string + files_warning += "Author: %s" % read_creator + self.__update_knob_value(node, "files_warning", "".join(self.__wrap_text(files_warning, 100))) + node.knob("files_warning").setVisible(True) - return path + else: + self.__update_knob_value(node, "files_warning", "") + node.knob("files_warning").setVisible(False) + + else: + self.__update_knob_value(node, "files_warning", "") + node.knob("files_warning").setVisible(False) + + return path def __is_render_path_locked(self, node, render_path, cached_path, is_proxy=False): """ @@ -1736,7 +2428,8 @@ def __is_render_path_locked(self, node, render_path, cached_path, is_proxy=False would be different to the cached path ignoring the width & height fields. """ # get the render template: - render_template = self.__get_render_template(node, is_proxy, fallback_to_render=True) + write_type = self.get_node_write_type_name(node) + render_template = self.__get_render_template(node, write_type, is_proxy, fallback_to_render=True) if not render_template: return True @@ -1788,7 +2481,7 @@ def __setup_new_node(self, node): assume that setting up of these nodes only needs to happen once - it needs to happen whenever the toolkit write node configuration changes. - + :param node: The Shotgun Write Node to set up """ # check that this node is actually a Gizmo. It might not be if @@ -1796,6 +2489,10 @@ def __setup_new_node(self, node): if not isinstance(node, nuke.Gizmo): return + if self.__is_node_fully_constructed(node): + # node has already been constructed for this session! + return + self._app.log_debug("Setting up new node...") # reset the construction flag to ensure that @@ -1824,12 +2521,14 @@ def __setup_new_node(self, node): # and as this node has never had a profile set, lets make # 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) write_node["disable"].setValue(node["disable"].value()) @@ -1845,11 +2544,47 @@ 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) + + # now that the node is constructed, we can process + # knob changes correctly. + self.__set_final_construction_flag(node, True) + if self._curr_entity_type == 'Shot': + if self.proj_info['name'] == "Breakdowns": + node.node("project_reformat")['disable'].setValue(True) + node.node("project_crop")['disable'].setValue(True) + node.knob('project_crop').setVisible(False) + else: + if (write_type == "Version" or + write_type == "Final"): + if self.ctx_info.step['name'] != "Roto": + # pass + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + # self.__version_up_visible(node, False) + node.knob("project_crop").setValue(True) + node.node("project_reformat")['disable'].setValue(False) + node.node("project_crop")['disable'].setValue(False) + else: + nuke.tprint("Step is roto. Disabling Project crop.") + node.knob("project_crop").setValue(False) + node.node("project_reformat")['disable'].setValue(True) + node.node("project_crop")['disable'].setValue(True) + if self._curr_entity_type == 'Asset': + if write_type == "Version": + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + node.node("project_reformat")['disable'].setValue(True) + node.node("project_crop")['disable'].setValue(True) + node.knob('project_crop').setVisible(False) + # now that the node is constructed, we can process # knob changes correctly. self.__set_final_construction_flag(node, True) + # now that the node is constructed, we can process knob changes + # correctly. + # node.knob("tk_is_fully_constructed").setValue(True) + # node.knob("tk_is_fully_constructed").setEnabled(False) + def __set_final_construction_flag(self, node, status): """ Controls the flag that indicates that a node has been @@ -1875,7 +2610,42 @@ def __is_node_fully_constructed(self, node): return False return node.knob("tk_is_fully_constructed").value() + + def __write_type_changed(self, node, detail_enabled):#, profile_type, channel_type): + # Profile input + # write_type_profile = profile_type + # profile_channels = channel_type + # Detail input + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(detail_enabled) + + def __test_write_message(self): + # 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") + def __version_up_visible(self, node, visible): + + node.knob('increase_version').setVisible(visible) + node.knob('revert_to_version').setVisible(visible) + + def __embedded_format_option(self, node, value): + if value == True: + node.node("project_reformat")['disable'].setValue(False) + node.node("project_crop")['disable'].setValue(False) + elif value == False: + node.node("project_reformat")['disable'].setValue(True) + node.node("project_crop")['disable'].setValue(True) + + def __set_project_crop(self, node, bool): + node["project_crop"].setValue(bool) + def __on_knob_changed(self): """ Callback that gets called whenever the value for a knob on a Shotgun Write @@ -1895,26 +2665,28 @@ def __on_knob_changed(self): # all knob changes #print "Ignoring change to %s.%s value = %s" % (node.name(), knob.name(), knob.value()) return - + write_type = self.get_node_write_type_name(node) 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) - + 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) - + if not new_output_name: + pass + else: + node['name'].setValue(write_type+"_"+str(new_output_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) 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()) - + if write_type != "Version": + if node.knob(TankWriteNodeHandler.USE_NAME_AS_OUTPUT_KNOB_NAME).value(): + # set the output to the node name + 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() @@ -1922,7 +2694,126 @@ def __on_knob_changed(self): if name_as_output: # update output to reflect the node name: self.__set_output(node, node.knob("name").value()) - + elif knob.name() == "write_type": + if self._curr_entity_type == 'Shot': + write_type_profile = "Exr" + if self.proj_info['name'] == "Breakdowns": + pass + else: + if (write_type== "Version" or + write_type== "Final"): + self.__set_project_crop(node, True) + self.__write_type_changed(node, False) + # self.__version_up_visible(node, False) + node.node("project_reformat")['disable'].setValue(False) + node.node("project_crop")['disable'].setValue(False) + elif write_type == "Test": + self.__set_project_crop(node, False) + self.__write_type_changed(node, True) + self.__test_write_message() + # self.__version_up_visible(node, False) + else: + self.__set_project_crop(node, False) + self.__write_type_changed(node, True) + # self.__version_up_visible(node, True) + node.node("project_reformat")['disable'].setValue(True) + node.node("project_crop")['disable'].setValue(True) + node.node("Write1").knob("autocrop").setValue(True) + + # Scans script for existing name clashes and renames accordingly + existing_node_names = [n.name() for n in nuke.allNodes(group=nuke.root())] + new_output_name = "" + postfix = 1 + while True: + new_name = "%s%d" % (knob.value(), postfix) + if new_name not in existing_node_names: + node.knob("name").setValue(new_name) + break + else: + postfix += 1 + self.__set_output(node, new_output_name) + # 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 self._curr_entity_type == 'Asset': + write_type_profile = "Exr" + if write_type== "Version": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + # self.__version_up_visible(node, False) + write_type_profile = "Exr" + elif write_type == "Precomp": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + # self.__version_up_visible(node, True) + write_type_profile = "Exr" + elif write_type == "Element": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + # self.__version_up_visible(node, True) + write_type_profile = "Exr" + elif write_type == "Denoise": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + # self.__version_up_visible(node, True) + write_type_profile = "Exr" + elif write_type == "Cleanup": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + # self.__version_up_visible(node, True) + write_type_profile = "Exr" + 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" + elif write_type == "Test": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + # self.__version_up_visible(node, False) + write_type_profile = "Exr" + self.__test_write_message() + # 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() == "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) + elif knob.name() == "project_crop": + self.__embedded_format_option(node, knob.value()) + elif knob.name() == "exr_datatype": + try: + node.node("Write1").knob("datatype").setValue(knob.value()) + except: + pass + elif knob.name() == "dpx_datatype": + try: + node.node("Write1").knob("datatype").setValue(knob.value()) + except: + pass + elif knob.name() == "auto_crop": + try: + node.node("Write1").knob("autocrop").setValue(knob.value()) + except: + pass + elif knob.name() == "increase_version": + nuke.tprint("Increasing version.") + """ + new_output_name = node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).value() + if not new_output_name: + nuke.tprint("Get base ouptput for write type!") + self.__set_output(node, new_output_name, increase_version=True) + else: + node['name'].setValue(write_type+"_"+str(new_output_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, increase_version=True) + """ + elif knob.name() == "revert_to_version": + nuke.tprint("Reverting to last version.") + else: # Propogate changes to certain knobs from the gizmo/group to the # encapsulated Write node. @@ -1978,7 +2869,6 @@ def __get_current_script_path(self): return script_path - def __on_script_save(self): """ Called when the script is saved. @@ -2046,14 +2936,43 @@ def __on_user_create(self): self.__setup_new_node(node) # populate the initial output name based on the render template: - render_template = self.get_render_template(node) + write_type = self.get_node_write_type_name(node) + render_template = self.get_render_template(node, write_type) self.__populate_initial_output_name(render_template, node) + 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): + if not values_list: + return None + else: + k = node.knob(name) + if k.values != values_list: + k.setValues(values_list) - - \ No newline at end of file + 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 \ No newline at end of file From 801060739f76711cfeefa3c29c49cfe6d85e2d69 Mon Sep 17 00:00:00 2001 From: daawaa Date: Mon, 10 Sep 2018 14:39:50 +0100 Subject: [PATCH 02/90] test --- 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 9dfa62d..7e40b17 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -36,7 +36,7 @@ class TankWriteNodeHandler(object): """ Handles requests and processing from a tank write node. """ - + # Version up branch SG_WRITE_NODE_CLASS = "WriteTank" SG_WRITE_DEFAULT_NAME = "SGWrite" WRITE_NODE_NAME = "Write1" From 8901cf9028b623438a9772a573ffb52ec6da2fa4 Mon Sep 17 00:00:00 2001 From: daawaa Date: Wed, 12 Sep 2018 13:07:38 +0100 Subject: [PATCH 03/90] Reverted Precomp/Element versioning --- python/tk_nuke_writenode/handler.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 7e40b17..7a737b7 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -2315,7 +2315,9 @@ def __compute_render_path_from(self, node, render_template, width, height, outpu write_type == "Test"): pass else: - fields.update({'version': next_version}) + # TODO: Setup version numbers that start at v001 for precomps + # fields.update({'version': next_version}) + pass From a6cbca95d4a5c217c90eb1fbd56defb8ba4ff75d Mon Sep 17 00:00:00 2001 From: daawaa Date: Thu, 13 Sep 2018 11:41:48 +0100 Subject: [PATCH 04/90] try function to catch the autocrop - DPX non option --- python/tk_nuke_writenode/handler.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 7a737b7..7c06069 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -2719,8 +2719,11 @@ def __on_knob_changed(self): self.__write_type_changed(node, True) # self.__version_up_visible(node, True) node.node("project_reformat")['disable'].setValue(True) - node.node("project_crop")['disable'].setValue(True) - node.node("Write1").knob("autocrop").setValue(True) + node.node("project_crop")['disable'].setValue(True) + try: + node.node("Write1").knob("autocrop").setValue(True) + except: + pass # Scans script for existing name clashes and renames accordingly existing_node_names = [n.name() for n in nuke.allNodes(group=nuke.root())] From 304858016ce3c933517d9cbe13b2d5864e178808 Mon Sep 17 00:00:00 2001 From: daawaa Date: Thu, 20 Sep 2018 16:03:32 +0100 Subject: [PATCH 05/90] WIP shot OCIO --- gizmos/WriteTank.gizmo | 4 ++++ gizmos/tab_stats.dat | Bin 766 -> 819 bytes python/tk_nuke_writenode/handler.py | 29 +++++++++++++++++++++++----- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index cab541e..17faddf 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -579,6 +579,10 @@ Reformat { useFrame True frame 1 } + OCIOColorSpace { + name shot_ocio + disable true + } ModifyMetaData { name content_meta_data } diff --git a/gizmos/tab_stats.dat b/gizmos/tab_stats.dat index b340c9d23dccf97c7342bb3b2e66a2f7092ffbbb..420631da29da7c8e046afdf89dff1789be759a9a 100644 GIT binary patch delta 84 zcmeyzx|vOYfq{V^i1ir47%~}B8OkRYGHEh$PPFPb)M4;vaAxoXk_tdNpCJc`ix`3# Z3K$X@l7UJU7^2}SVu405Z9Hnp1OS=Q4}Smv delta 21 ccmdnY_K%f?fq{W_$3(0CjsHxU06PT*;s5{u diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 7c06069..825c923 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -42,6 +42,7 @@ class TankWriteNodeHandler(object): WRITE_NODE_NAME = "Write1" EMBED_TIME_CODE = "project_tc" EMBED_META_DATA = "content_meta_data" + EMBED_SHOT_OCIO_DATA = "shot_ocio" EMBED_PROJECT_REFORMAT = "project_reformat" EMBED_CROP = "project_crop" @@ -60,6 +61,7 @@ def __init__(self, app): # Context info self._curr_entity_type = self._app.context.entity['type'] self._project = self._app.context.project + self._entity = self._app.context.entity # cache the profiles: self._promoted_knobs = {} @@ -93,6 +95,10 @@ def __init__(self, app): 'sg_delivery_fileset_compression', 'sg_color_space', 'sg_project_color_management']) + self.shot_info = self.sg.find_one("Shot", + [['id', 'is', self._entity['id']]], + ['name', + 'sg_main_plate']) # self.software_info = self.sg.find_one("Software", # [['id', 'is_not', 0], # ['code', 'is', 'RV']], @@ -437,7 +443,9 @@ def create_project_settings_group(self, node): project_tc = nuke.createNode("AddTimeCode") project_tc['name'].setValue("project_tc") content_metadata = nuke.createNode("ModifyMetaData") - content_metadata['name'].setValue("content_meta_data") + content_metadata['name'].setValue("content_meta_data") + shot_ocio = nuke.createNode("OCIOColorSpace") + shot_ocio['name'].setValue("shot_ocio") proj_group_nodes.append(project_reformat) proj_group_nodes.append(project_crop) proj_group_nodes.append(project_tc) @@ -513,6 +521,10 @@ def convert_sg_to_nuke_write_nodes(self): # Embed metadata md = extra_node.node('content_meta_data')['metadata'] md.fromScript(self.__get_metadata(sg_wn)) + # Embed OCIO + extra_node.node('shot_ocio')['channels'].setValue(sg_wn.node('shot_ocio')['channels'].value()) + extra_node.node('in_colorspace')['channels'].setValue(sg_wn.node('in_colorspace')['channels'].value()) + extra_node.node('out_colorspace')['channels'].setValue(sg_wn.node('out_colorspace')['channels'].value()) # copy across file & proxy knobs (if we've defined a proxy template): new_wn["file"].setValue(sg_wn["cached_path"].evaluate()) @@ -1619,7 +1631,8 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False proj_reformat = node.node(TankWriteNodeHandler.EMBED_PROJECT_REFORMAT) project_crop = node.node(TankWriteNodeHandler.EMBED_CROP) time_code = node.node(TankWriteNodeHandler.EMBED_TIME_CODE) - content_meta_data = node.node(TankWriteNodeHandler.EMBED_META_DATA) + content_meta_data = node.node(TankWriteNodeHandler.EMBED_META_DATA) + shot_ocio = node.node(TankWriteNodeHandler.EMBED_SHOT_OCIO_DATA) proj_fps = self.proj_info['sg_frame_rate'] timecode = "01:00:00:01" @@ -1687,11 +1700,17 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False nuke.tprint("Could not apply embeded format settings. Missing info from Projects...") proj_reformat.knobs()["format"].setValue(main_format) - + + nuke.tprint(self.shot_info['sg_main_plate']) # Set colorspace based of SG values if self.proj_info['sg_color_space']: - nuke.tprint("Setting colorspace of %s to: %s" % (node['name'].value(), self.proj_info['sg_color_space'])) - node['colorspace'].setValue(self.proj_info['sg_color_space']) + if self.proj_info['sg_project_color_management'] == "OCIO": + color_space = "acescg" + else: + color_space = self.proj_info['sg_color_space'] + + node['colorspace'].setValue(color_space) + nuke.tprint("Setting colorspace of %s to: %s" % (node['name'].value(), color_space)) md = content_meta_data['metadata'] md.fromScript(self.__get_metadata(node)) From 5313023546eb25c323668874871a03d85f26352e Mon Sep 17 00:00:00 2001 From: daawaa Date: Thu, 20 Sep 2018 17:19:47 +0100 Subject: [PATCH 06/90] updated for roto/cleanup linear EXRs --- python/tk_nuke_writenode/handler.py | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 7c06069..e784539 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1690,8 +1690,13 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False # Set colorspace based of SG values if self.proj_info['sg_color_space']: + if (self.ctx_info.step['name'] == "Roto" and + self.proj_info['sg_project_color_management'] != "OCIO"): + node['colorspace'].setValue("linear") + else: + node['colorspace'].setValue(self.proj_info['sg_color_space']) + nuke.tprint("Setting colorspace of %s to: %s" % (node['name'].value(), self.proj_info['sg_color_space'])) - node['colorspace'].setValue(self.proj_info['sg_color_space']) md = content_meta_data['metadata'] md.fromScript(self.__get_metadata(node)) @@ -2559,18 +2564,21 @@ def __setup_new_node(self, node): else: if (write_type == "Version" or write_type == "Final"): - if self.ctx_info.step['name'] != "Roto": - # pass - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - # self.__version_up_visible(node, False) - node.knob("project_crop").setValue(True) - node.node("project_reformat")['disable'].setValue(False) - node.node("project_crop")['disable'].setValue(False) - else: - nuke.tprint("Step is roto. Disabling Project crop.") + if self.ctx_info.step['name'] == "Roto": + nuke.tprint("Creating Roto SG Write node") + node.knob('write_type').setValues(['Version', 'Denoise']) + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) node.knob("project_crop").setValue(False) node.node("project_reformat")['disable'].setValue(True) node.node("project_crop")['disable'].setValue(True) + elif self.ctx_info.step['name'] == "Cleanup": + node.knob("project_crop").setValue(False) + node.node("project_reformat")['disable'].setValue(True) + else: + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + node.knob("project_crop").setValue(True) + node.node("project_reformat")['disable'].setValue(False) + node.node("project_crop")['disable'].setValue(False) if self._curr_entity_type == 'Asset': if write_type == "Version": node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) From bf1638e7202ef3419efd22c96dd88a752b5733d8 Mon Sep 17 00:00:00 2001 From: daawaa Date: Thu, 20 Sep 2018 18:59:14 +0100 Subject: [PATCH 07/90] cleanup of fileset and colorspace --- .gitignore | 1 + python/tk_nuke_writenode/handler.py | 33 +++++++++++++++++------------ 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index d2d6f36..c916a16 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,4 @@ nosetests.xml .mr.developer.cfg .project .pydevproject +gizmos/tab_stats.dat diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index e784539..6472fc8 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1692,9 +1692,17 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False if self.proj_info['sg_color_space']: if (self.ctx_info.step['name'] == "Roto" and self.proj_info['sg_project_color_management'] != "OCIO"): - node['colorspace'].setValue("linear") - else: + node['colorspace'].setValue("linear") + elif (self.ctx_info.step['name'] == "Roto" and + self.proj_info['sg_project_color_management'] == "OCIO"): + node['colorspace'].setValue("acescg") + elif (self.ctx_info.step['name'] != "Roto" and + write_type == "Version"): node['colorspace'].setValue(self.proj_info['sg_color_space']) + nuke.tprint("Setting color space from SG") + else: + default_match = next((color for color in node.knob('colorspace').values() if 'default' in color), None) + node.knob('colorspace').setValue(default_match) nuke.tprint("Setting colorspace of %s to: %s" % (node['name'].value(), self.proj_info['sg_color_space'])) @@ -2675,7 +2683,12 @@ def __on_knob_changed(self): # all knob changes #print "Ignoring change to %s.%s value = %s" % (node.name(), knob.name(), knob.value()) return - write_type = self.get_node_write_type_name(node) + write_type = self.get_node_write_type_name(node) + write_type_profile = "Exr" + if self.proj_info['sg_delivery_fileset'] != None: + if write_type == "Version": + write_type_profile = self.proj_info['sg_delivery_fileset']['name'].capitalize() + # Main handler area for knob changed if knob.name() == "tk_profile_list": # change the profile for the specified node: new_profile_name = knob.value() @@ -2706,12 +2719,11 @@ def __on_knob_changed(self): self.__set_output(node, node.knob("name").value()) elif knob.name() == "write_type": if self._curr_entity_type == 'Shot': - write_type_profile = "Exr" if self.proj_info['name'] == "Breakdowns": pass else: - if (write_type== "Version" or - write_type== "Final"): + if (write_type == "Version" or + write_type == "Final"): self.__set_project_crop(node, True) self.__write_type_changed(node, False) # self.__version_up_visible(node, False) @@ -2725,6 +2737,7 @@ def __on_knob_changed(self): else: self.__set_project_crop(node, False) self.__write_type_changed(node, True) + write_type_profile = "Exr" # self.__version_up_visible(node, True) node.node("project_reformat")['disable'].setValue(True) node.node("project_crop")['disable'].setValue(True) @@ -2750,12 +2763,11 @@ def __on_knob_changed(self): # reset profile self.__set_profile(node, write_type_profile, write_type, reset_all_settings=True) elif self._curr_entity_type == 'Asset': - write_type_profile = "Exr" if write_type== "Version": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) # self.__version_up_visible(node, False) - write_type_profile = "Exr" + elif write_type == "Precomp": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) @@ -2770,21 +2782,17 @@ def __on_knob_changed(self): self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) # self.__version_up_visible(node, True) - write_type_profile = "Exr" elif write_type == "Cleanup": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) # self.__version_up_visible(node, True) - write_type_profile = "Exr" 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" elif write_type == "Test": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) # self.__version_up_visible(node, False) - write_type_profile = "Exr" self.__test_write_message() # Updates the predefined profile based on the write type self.__update_knob_value(node, "tk_profile_list", write_type_profile) @@ -2826,7 +2834,6 @@ def __on_knob_changed(self): """ elif knob.name() == "revert_to_version": nuke.tprint("Reverting to last version.") - else: # Propogate changes to certain knobs from the gizmo/group to the # encapsulated Write node. From 73ff5c11be339f42ec7cec1e6f2ea8eba59878c0 Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 21 Sep 2018 15:19:01 +0100 Subject: [PATCH 08/90] Cleanup of new Roto Version --- python/tk_nuke_writenode/handler.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 6472fc8..0797617 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -2696,14 +2696,15 @@ def __on_knob_changed(self): elif knob.name() == TankWriteNodeHandler.OUTPUT_KNOB_NAME: # internal cached output has been changed! new_output_name = knob.value() - if not new_output_name: + if (not new_output_name or + write_type == 'Version'): pass else: node['name'].setValue(write_type+"_"+str(new_output_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) + self.__set_output(node, new_output_name) elif knob.name() == "name": # node name has changed: if write_type != "Version": From 9f02a92851ee27fcc35771ae556981443202fdb1 Mon Sep 17 00:00:00 2001 From: daawaa Date: Wed, 26 Sep 2018 11:40:56 +0100 Subject: [PATCH 09/90] wip --- .gitignore | 1 + gizmos/tab_stats.dat | Bin 819 -> 57 bytes python/tk_nuke_writenode/handler.py | 49 +++++++++++++++++++++------- 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index d2d6f36..c916a16 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,4 @@ nosetests.xml .mr.developer.cfg .project .pydevproject +gizmos/tab_stats.dat diff --git a/gizmos/tab_stats.dat b/gizmos/tab_stats.dat index 420631da29da7c8e046afdf89dff1789be759a9a..dbd6aeb775a9f7e4214eb708c596bc4cd32f68cc 100644 GIT binary patch delta 11 ScmdnYX34_9z`!{1m?;1akphGO literal 819 zcma))%}>Hm5X1*PdGcyJar9t3Xk$EhQEH5df&t@&7}7w2MrcV<(f{7x?n96i6VtrD zubJ7M-6v^Z(utmxDb+#`{NI!)X4qU;w{rFZV~@dQTLrK}k3ci!tc?(>WWSIBYX-ak zm};PR^_lBxLdi7u^@k!SHQ8Cry5}-rSF8mNTp&Th^zSqUIs&qaaIBUZT(kf*U``mN zI+_6tF}o{-k#;PtQ>+zeW*X|NV)HNSHKShY9-BR#@xNhi5HZ2g9I-z8a2w=P?o2FT zqjl2F4Uq_18xhMVfzl&=YeCLQf|&s)F`h@PQ@-A^a246OB722MLeZ=yGmV!yZi=06 z&+$;VkSr@}T=!RTSGBi_muSx%@Z|8EN(?>T)ctzBLu>3R_zJIOOE)7AGxhG7+5f&u pk8%Wg45_bI{-v%-Bh;_@c6P0ofnbHsAxxa`ximY5`g0x(e*?(sdqn^M diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 825c923..b67d1d4 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -95,10 +95,10 @@ def __init__(self, app): 'sg_delivery_fileset_compression', 'sg_color_space', 'sg_project_color_management']) - self.shot_info = self.sg.find_one("Shot", - [['id', 'is', self._entity['id']]], - ['name', - 'sg_main_plate']) + # self.shot_info = self.sg.find_one("Shot", + # [['id', 'is', self._entity['id']]], + # ['name', + # 'sg_main_plate']) # self.software_info = self.sg.find_one("Software", # [['id', 'is_not', 0], # ['code', 'is', 'RV']], @@ -162,7 +162,17 @@ def get_nodes(self): recurseGroups = True) else: return [] - + + def get_nodes_by_class(self, class_name): + """ + Returns a list of tank write nodes + """ + if nuke.exists("root"): + return nuke.allNodes(group=nuke.root(), + filter=class_name, + recurseGroups = True) + else: + return [] def get_node_name(self, node): """ Return the name for the specified node @@ -450,7 +460,8 @@ def create_project_settings_group(self, node): proj_group_nodes.append(project_crop) proj_group_nodes.append(project_tc) proj_group_nodes.append(content_metadata) - + proj_group_nodes.append(shot_ocio) + for i in proj_group_nodes: i.setSelected(True) @@ -522,10 +533,9 @@ def convert_sg_to_nuke_write_nodes(self): md = extra_node.node('content_meta_data')['metadata'] md.fromScript(self.__get_metadata(sg_wn)) # Embed OCIO - extra_node.node('shot_ocio')['channels'].setValue(sg_wn.node('shot_ocio')['channels'].value()) - extra_node.node('in_colorspace')['channels'].setValue(sg_wn.node('in_colorspace')['channels'].value()) - extra_node.node('out_colorspace')['channels'].setValue(sg_wn.node('out_colorspace')['channels'].value()) - + extra_node.node('shot_ocio')['in_colorspace'].setValue(sg_wn.node('shot_ocio')['in_colorspace'].value()) + extra_node.node('shot_ocio')['out_colorspace'].setValue(sg_wn.node('shot_ocio')['out_colorspace'].value()) + # copy across file & proxy knobs (if we've defined a proxy template): new_wn["file"].setValue(sg_wn["cached_path"].evaluate()) if sg_wn["proxy_render_template"].value(): @@ -1700,12 +1710,27 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False nuke.tprint("Could not apply embeded format settings. Missing info from Projects...") proj_reformat.knobs()["format"].setValue(main_format) - - nuke.tprint(self.shot_info['sg_main_plate']) + # Set colorspace based of SG values if self.proj_info['sg_color_space']: if self.proj_info['sg_project_color_management'] == "OCIO": color_space = "acescg" + if not nuke.root()['customOCIOConfigPath']: + pass + else: + sg_info_nodes = [n for n in self.get_nodes_by_class('SGInfoNode')] + if not sg_info_nodes: + pass + else: + if len(sg_info_nodes)==1: + main_plate_name = sg_info_nodes[0]['main_plate_name'].value() + if not main_plate_name: + pass + else: + shot_ocio['in_colorspace'].setValue(main_plate_name) + else: + nuke.tprint("!!! Could not find SG Info node that is required for OCIO color setup.") + else: color_space = self.proj_info['sg_color_space'] From 8d044e4bbfb8d603f0768697f4ad05e15702b3f2 Mon Sep 17 00:00:00 2001 From: daawaa Date: Wed, 26 Sep 2018 18:11:26 +0100 Subject: [PATCH 10/90] latest ocio setup - ready for testing on projects --- gizmos/WriteTank.gizmo | 9 +++++- gizmos/tab_stats.dat | Bin 57 -> 0 bytes python/tk_nuke_writenode/handler.py | 47 ++++++++++++++++++++++------ 3 files changed, 45 insertions(+), 11 deletions(-) delete mode 100644 gizmos/tab_stats.dat diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 17faddf..33aa7c9 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -283,12 +283,19 @@ Gizmo { -INVISIBLE } addUserKnob { - 6 project_crop + 6 project_crop_bool l "Crop to Project delivery format" t "Choose to crop footage to the Project format." +STARTLINE -INVISIBLE } + addUserKnob { + 6 shot_ocio_bool + l "Apply shot OCIO" + t "Choose to apply the embeded shot OCIO." + +STARTLINE + -INVISIBLE + } addUserKnob { 4 exr_datatype l "dataype" diff --git a/gizmos/tab_stats.dat b/gizmos/tab_stats.dat deleted file mode 100644 index dbd6aeb775a9f7e4214eb708c596bc4cd32f68cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57 ycmZQzU|?imV9;UkXK-fl1d<9sI-em2h>IA4844H@8Il=NfuhlH6|q3|Obh_ZVFzab diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 3d15e33..4963ad2 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1486,7 +1486,6 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False self.__update_knob_value(node, "tk_profile_list", profile_name) - self.__update_knob_value(node, "write_version_latest", str(1)) # set the format self.__populate_format_settings( node, @@ -1728,9 +1727,25 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False if not main_plate_name: pass else: - shot_ocio['in_colorspace'].setValue(main_plate_name) + if write_type != "Version": + node['shot_ocio_bool'].setVisible(False) + node['shot_ocio_bool'].setValue(False) + shot_ocio['disable'].setValue(True) + else: + in_color_space = next((color for color in shot_ocio['in_colorspace'].values() if main_plate_name in color), None) + if in_color_space: + nuke.tprint("Setting internal OCIO in_colorspace to: %s" % main_plate_name) + shot_ocio['in_colorspace'].setValue(main_plate_name) + shot_ocio['disable'].setValue(False) + node['shot_ocio_bool'].setVisible(True) + node['shot_ocio_bool'].setValue(True) + else: + node['shot_ocio_bool'].setVisible(False) + node['shot_ocio_bool'].setValue(False) + shot_ocio['disable'].setValue(True) + nuke.tprint("No in_colorspace value called: %s. Skipping..." % main_plate_name) else: - nuke.tprint("!!! Could not find SG Info node that is required for OCIO color setup.") + nuke.message("Could not find SG Info node that is required for OCIO color setup.") else: color_space = self.proj_info['sg_color_space'] @@ -1744,6 +1759,9 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False elif (self.ctx_info.step['name'] != "Roto" and write_type == "Version"): color_space = self.proj_info['sg_color_space'] + if color_space not in node.knob('colorspace').values(): + color_space = next((color for color in node.knob('colorspace').values() if 'default' in color), None) + else: color_space = next((color for color in node.knob('colorspace').values() if 'default' in color), None) @@ -2612,7 +2630,8 @@ def __setup_new_node(self, node): if self.proj_info['name'] == "Breakdowns": node.node("project_reformat")['disable'].setValue(True) node.node("project_crop")['disable'].setValue(True) - node.knob('project_crop').setVisible(False) + node.knob('project_crop_bool').setVisible(False) + node.knob('shot_ocio_bool').setVisible(False) else: if (write_type == "Version" or write_type == "Final"): @@ -2620,7 +2639,7 @@ def __setup_new_node(self, node): nuke.tprint("Creating Roto SG Write node") node.knob('write_type').setValues(['Version', 'Denoise']) node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) - node.knob("project_crop").setValue(False) + node.knob("project_crop_bool").setValue(False) node.node("project_reformat")['disable'].setValue(True) node.node("project_crop")['disable'].setValue(True) elif self.ctx_info.step['name'] == "Cleanup": @@ -2628,7 +2647,7 @@ def __setup_new_node(self, node): node.node("project_reformat")['disable'].setValue(True) else: node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - node.knob("project_crop").setValue(True) + node.knob("project_crop_bool").setValue(True) node.node("project_reformat")['disable'].setValue(False) node.node("project_crop")['disable'].setValue(False) if self._curr_entity_type == 'Asset': @@ -2636,7 +2655,7 @@ def __setup_new_node(self, node): node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) node.node("project_reformat")['disable'].setValue(True) node.node("project_crop")['disable'].setValue(True) - node.knob('project_crop').setVisible(False) + node.knob('project_crop_bool').setVisible(False) # now that the node is constructed, we can process # knob changes correctly. @@ -2703,10 +2722,16 @@ def __embedded_format_option(self, node, value): node.node("project_crop")['disable'].setValue(False) elif value == False: node.node("project_reformat")['disable'].setValue(True) - node.node("project_crop")['disable'].setValue(True) + node.node("project_crop")['disable'].setValue(True) + + def __embedded_ocio_option(self, node, value): + if value == True: + node.node("shot_ocio")['disable'].setValue(False) + elif value == False: + node.node("shot_ocio")['disable'].setValue(True) def __set_project_crop(self, node, bool): - node["project_crop"].setValue(bool) + node["project_crop_bool"].setValue(bool) def __on_knob_changed(self): """ @@ -2846,8 +2871,10 @@ def __on_knob_changed(self): 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) - elif knob.name() == "project_crop": + elif knob.name() == "project_crop_bool": self.__embedded_format_option(node, knob.value()) + elif knob.name() == "shot_ocio_bool": + self.__embedded_ocio_option(node, knob.value()) elif knob.name() == "exr_datatype": try: node.node("Write1").knob("datatype").setValue(knob.value()) From c21e1ce233ecfb655463fbee78c7e6791d5832c5 Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 28 Sep 2018 15:04:16 +0100 Subject: [PATCH 11/90] hide all ocio for non-ocio proj --- gizmos/WriteTank.gizmo | 4 ++++ python/tk_nuke_writenode/handler.py | 9 +++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 33aa7c9..6851ce0 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -296,6 +296,10 @@ Gizmo { +STARTLINE -INVISIBLE } + addUserKnob { + 25 "" + - STARTLINE + } addUserKnob { 4 exr_datatype l "dataype" diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 4963ad2..46be33c 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1603,7 +1603,9 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False profile_channel = "rgba" if profile_name == "Dpx": node.knob('dpx_datatype').setVisible(True) - node.knob('exr_datatype').setVisible(False) + node.knob('exr_datatype').setVisible(False) + node.knob('auto_crop').setVisible(False) + node.knob('auto_crop').setValue(False) profile_channel = "rgb" elif profile_name == "Exr": node.knob('exr_datatype').setVisible(True) @@ -1729,7 +1731,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False else: if write_type != "Version": node['shot_ocio_bool'].setVisible(False) - node['shot_ocio_bool'].setValue(False) + node['shot_ocio_bool'].setValue(False) shot_ocio['disable'].setValue(True) else: in_color_space = next((color for color in shot_ocio['in_colorspace'].values() if main_plate_name in color), None) @@ -1749,6 +1751,9 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False else: color_space = self.proj_info['sg_color_space'] + node['shot_ocio_bool'].setVisible(False) + node['shot_ocio_bool'].setValue(False) + shot_ocio['disable'].setValue(False) if (self.ctx_info.step['name'] == "Roto" and self.proj_info['sg_project_color_management'] != "OCIO"): From fca0f250df23472df0428ac342c6855acef349e0 Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 28 Sep 2018 15:08:26 +0100 Subject: [PATCH 12/90] hiding autocrop for jpeg --- python/tk_nuke_writenode/handler.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 46be33c..6e96358 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1623,7 +1623,8 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False profile_channel = "rgba" elif profile_name == "Jpeg": node.knob('dpx_datatype').setVisible(False) - node.knob('exr_datatype').setVisible(False) + node.knob('exr_datatype').setVisible(False) + node.knob('auto_crop').setVisible(False) profile_channel = "rgb" else: nuke.tprint("No profile with that name") From 910eff594d0c37e6cb209fff03f957604ce8f990 Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 28 Sep 2018 17:31:04 +0100 Subject: [PATCH 13/90] color space fix - test for global color settings --- python/tk_nuke_writenode/handler.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 6e96358..2d4f4e4 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1759,17 +1759,21 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False if (self.ctx_info.step['name'] == "Roto" and self.proj_info['sg_project_color_management'] != "OCIO"): color_space = "linear" + nuke.tprint("Roto/Non OCIO") elif (self.ctx_info.step['name'] == "Roto" and self.proj_info['sg_project_color_management'] == "OCIO"): color_space = "acescg" + nuke.tprint("Roto/OCIO") elif (self.ctx_info.step['name'] != "Roto" and - write_type == "Version"): + write_type == "Version" and + self.proj_info['sg_project_color_management'] == "OCIO"): + nuke.tprint("NonRoto/Version/OCIO") color_space = self.proj_info['sg_color_space'] if color_space not in node.knob('colorspace').values(): color_space = next((color for color in node.knob('colorspace').values() if 'default' in color), None) - else: color_space = next((color for color in node.knob('colorspace').values() if 'default' in color), None) + nuke.tprint("--- Could not get color space info. Setting default.") node['colorspace'].setValue(color_space) nuke.tprint("Setting colorspace of %s to: %s" % (node['name'].value(), self.proj_info['sg_color_space'])) From 02685ad18cdcb92057f1eeacf4d50ce4d28764ad Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 28 Sep 2018 18:18:34 +0100 Subject: [PATCH 14/90] cleanup of color space settings --- python/tk_nuke_writenode/handler.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 2d4f4e4..ed53e37 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1758,25 +1758,22 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False if (self.ctx_info.step['name'] == "Roto" and self.proj_info['sg_project_color_management'] != "OCIO"): - color_space = "linear" - nuke.tprint("Roto/Non OCIO") + color_space = "linear" elif (self.ctx_info.step['name'] == "Roto" and self.proj_info['sg_project_color_management'] == "OCIO"): - color_space = "acescg" - nuke.tprint("Roto/OCIO") + color_space = "acescg" elif (self.ctx_info.step['name'] != "Roto" and - write_type == "Version" and - self.proj_info['sg_project_color_management'] == "OCIO"): - nuke.tprint("NonRoto/Version/OCIO") + write_type == "Version"): color_space = self.proj_info['sg_color_space'] if color_space not in node.knob('colorspace').values(): color_space = next((color for color in node.knob('colorspace').values() if 'default' in color), None) + nuke.tprint("--- Could not get color space info. Setting default.") + else: + nuke.tprint("--- Setting color space to %s from Projects page." % color_space) else: color_space = next((color for color in node.knob('colorspace').values() if 'default' in color), None) - nuke.tprint("--- Could not get color space info. Setting default.") node['colorspace'].setValue(color_space) - nuke.tprint("Setting colorspace of %s to: %s" % (node['name'].value(), self.proj_info['sg_color_space'])) md = content_meta_data['metadata'] md.fromScript(self.__get_metadata(node)) From 12f1c7a83f704c8c73c5199ae0a6d07d651dcf9e Mon Sep 17 00:00:00 2001 From: daawaa Date: Mon, 1 Oct 2018 16:52:21 +0100 Subject: [PATCH 15/90] fixed project crop issue --- 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 ed53e37..db2230c 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1759,9 +1759,11 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False if (self.ctx_info.step['name'] == "Roto" and self.proj_info['sg_project_color_management'] != "OCIO"): color_space = "linear" + nuke.tprint("--- Setting color space to %s for non-OCIO Roto" % color_space) elif (self.ctx_info.step['name'] == "Roto" and self.proj_info['sg_project_color_management'] == "OCIO"): - color_space = "acescg" + color_space = "acescg" + nuke.tprint("--- Setting color space to %s for OCIO Roto" % color_space) elif (self.ctx_info.step['name'] != "Roto" and write_type == "Version"): color_space = self.proj_info['sg_color_space'] @@ -2636,7 +2638,7 @@ def __setup_new_node(self, node): if self._curr_entity_type == 'Shot': if self.proj_info['name'] == "Breakdowns": node.node("project_reformat")['disable'].setValue(True) - node.node("project_crop")['disable'].setValue(True) + # node.node("project_crop")['disable'].setValue(True) node.knob('project_crop_bool').setVisible(False) node.knob('shot_ocio_bool').setVisible(False) else: @@ -2648,21 +2650,21 @@ def __setup_new_node(self, node): node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) node.knob("project_crop_bool").setValue(False) node.node("project_reformat")['disable'].setValue(True) - node.node("project_crop")['disable'].setValue(True) + # node.node("project_crop")['disable'].setValue(True) elif self.ctx_info.step['name'] == "Cleanup": - node.knob("project_crop").setValue(False) node.node("project_reformat")['disable'].setValue(True) + # node.knob("project_crop").setValue(False) else: node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) node.knob("project_crop_bool").setValue(True) node.node("project_reformat")['disable'].setValue(False) - node.node("project_crop")['disable'].setValue(False) + # node.node("project_crop")['disable'].setValue(False) if self._curr_entity_type == 'Asset': if write_type == "Version": node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) node.node("project_reformat")['disable'].setValue(True) - node.node("project_crop")['disable'].setValue(True) node.knob('project_crop_bool').setVisible(False) + # node.node("project_crop")['disable'].setValue(True) # now that the node is constructed, we can process # knob changes correctly. @@ -2803,9 +2805,8 @@ def __on_knob_changed(self): write_type == "Final"): self.__set_project_crop(node, True) self.__write_type_changed(node, False) - # self.__version_up_visible(node, False) - node.node("project_reformat")['disable'].setValue(False) - node.node("project_crop")['disable'].setValue(False) + # self.__version_up_visible(node, False) + self.__embedded_format_option(node, True) elif write_type == "Test": self.__set_project_crop(node, False) self.__write_type_changed(node, True) @@ -2815,11 +2816,11 @@ def __on_knob_changed(self): self.__set_project_crop(node, False) self.__write_type_changed(node, True) write_type_profile = "Exr" - # self.__version_up_visible(node, True) - node.node("project_reformat")['disable'].setValue(True) - node.node("project_crop")['disable'].setValue(True) + # self.__version_up_visible(node, True) + self.__embedded_format_option(node, True) try: node.node("Write1").knob("autocrop").setValue(True) + node.node("Write1").knob("autocrop").setValue(True) except: pass From 885dc6ef91ca34c455c35b56e3e4635c32f14fdf Mon Sep 17 00:00:00 2001 From: daawaa Date: Mon, 1 Oct 2018 18:10:53 +0100 Subject: [PATCH 16/90] fixed non-Version proj_reformat --- 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 db2230c..83817c6 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -2817,7 +2817,7 @@ def __on_knob_changed(self): self.__write_type_changed(node, True) write_type_profile = "Exr" # self.__version_up_visible(node, True) - self.__embedded_format_option(node, True) + self.__embedded_format_option(node, False) try: node.node("Write1").knob("autocrop").setValue(True) node.node("Write1").knob("autocrop").setValue(True) From 37f74c8c60bc6d3279edba171a21c06ffebcba0c Mon Sep 17 00:00:00 2001 From: daawaa Date: Mon, 1 Oct 2018 18:25:08 +0100 Subject: [PATCH 17/90] setting default colorspace for Roto --- python/tk_nuke_writenode/handler.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 83817c6..01e4b0c 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1757,13 +1757,10 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False shot_ocio['disable'].setValue(False) if (self.ctx_info.step['name'] == "Roto" and - self.proj_info['sg_project_color_management'] != "OCIO"): - color_space = "linear" - nuke.tprint("--- Setting color space to %s for non-OCIO Roto" % color_space) - elif (self.ctx_info.step['name'] == "Roto" and + self.proj_info['sg_project_color_management'] != "OCIO" or self.proj_info['sg_project_color_management'] == "OCIO"): - color_space = "acescg" - nuke.tprint("--- Setting color space to %s for OCIO Roto" % color_space) + color_space = "linear" + nuke.tprint("--- Setting colorspace to %s for Roto" % color_space) elif (self.ctx_info.step['name'] != "Roto" and write_type == "Version"): color_space = self.proj_info['sg_color_space'] @@ -1771,7 +1768,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False color_space = next((color for color in node.knob('colorspace').values() if 'default' in color), None) nuke.tprint("--- Could not get color space info. Setting default.") else: - nuke.tprint("--- Setting color space to %s from Projects page." % color_space) + nuke.tprint("--- Setting colorspace to %s from Projects page." % color_space) else: color_space = next((color for color in node.knob('colorspace').values() if 'default' in color), None) From 3ebf9938b44b1eabcf0718cc00428dc3aac2e7a1 Mon Sep 17 00:00:00 2001 From: daawaa Date: Tue, 2 Oct 2018 18:09:25 +0100 Subject: [PATCH 18/90] fixed roto file reopen issue --- python/tk_nuke_writenode/handler.py | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 01e4b0c..7231312 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -173,6 +173,7 @@ def get_nodes_by_class(self, class_name): recurseGroups = True) else: return [] + def get_node_name(self, node): """ Return the name for the specified node @@ -1610,7 +1611,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False elif profile_name == "Exr": node.knob('exr_datatype').setVisible(True) node.knob('dpx_datatype').setVisible(False) - profile_channel = "rgb" + profile_channel = "rgba" node.node(TankWriteNodeHandler.WRITE_NODE_NAME)['metadata'].setValue('all metadata') node.knob('auto_crop').setVisible(False) if (write_type == "Precomp" or @@ -2605,16 +2606,7 @@ 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, 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) - write_node["disable"].setValue(node["disable"].value()) + # Ensure that the output name matches the node name if # that option is enabled on the node. This is primarily @@ -2632,6 +2624,8 @@ def __setup_new_node(self, node): # knob changes correctly. self.__set_final_construction_flag(node, True) + # set the write type for creation of correct output + write_type = self.get_node_write_type_name(node) if self._curr_entity_type == 'Shot': if self.proj_info['name'] == "Breakdowns": node.node("project_reformat")['disable'].setValue(True) @@ -2643,6 +2637,7 @@ def __setup_new_node(self, node): write_type == "Final"): if self.ctx_info.step['name'] == "Roto": nuke.tprint("Creating Roto SG Write node") + self.__update_knob_value(node, "tk_profile_list", "Exr") node.knob('write_type').setValues(['Version', 'Denoise']) node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) node.knob("project_crop_bool").setValue(False) @@ -2661,7 +2656,16 @@ def __setup_new_node(self, node): node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) node.node("project_reformat")['disable'].setValue(True) node.knob('project_crop_bool').setVisible(False) - # node.node("project_crop")['disable'].setValue(True) + # node.node("project_crop")['disable'].setValue(True) + # + # 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, 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) + write_node["disable"].setValue(node["disable"].value()) # now that the node is constructed, we can process # knob changes correctly. From 35e77f5fc6c355ca619d556cc71baed48f957f5f Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 5 Oct 2018 14:03:47 +0100 Subject: [PATCH 19/90] cleanup of roto. Rearranged OCIO set profile --- python/tk_nuke_writenode/handler.py | 42 +++++++++++++---------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 7231312..5003046 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -42,7 +42,7 @@ class TankWriteNodeHandler(object): WRITE_NODE_NAME = "Write1" EMBED_TIME_CODE = "project_tc" EMBED_META_DATA = "content_meta_data" - EMBED_SHOT_OCIO_DATA = "shot_ocio" + EMBED_SHOT_OCIO = "shot_ocio" EMBED_PROJECT_REFORMAT = "project_reformat" EMBED_CROP = "project_crop" @@ -1645,7 +1645,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False project_crop = node.node(TankWriteNodeHandler.EMBED_CROP) time_code = node.node(TankWriteNodeHandler.EMBED_TIME_CODE) content_meta_data = node.node(TankWriteNodeHandler.EMBED_META_DATA) - shot_ocio = node.node(TankWriteNodeHandler.EMBED_SHOT_OCIO_DATA) + shot_ocio = node.node(TankWriteNodeHandler.EMBED_SHOT_OCIO) proj_fps = self.proj_info['sg_frame_rate'] timecode = "01:00:00:01" @@ -1731,45 +1731,41 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False if not main_plate_name: pass else: + in_color_space = next((color for color in shot_ocio['in_colorspace'].values() if main_plate_name in color), None) + if in_color_space: + nuke.tprint("Setting internal OCIO in_colorspace to: %s" % main_plate_name) + shot_ocio['in_colorspace'].setValue(main_plate_name) + shot_ocio['disable'].setValue(False) + else: + shot_ocio['disable'].setValue(True) + nuke.tprint("No in_colorspace value called: %s. Skipping..." % main_plate_name) if write_type != "Version": - node['shot_ocio_bool'].setVisible(False) node['shot_ocio_bool'].setValue(False) shot_ocio['disable'].setValue(True) else: - in_color_space = next((color for color in shot_ocio['in_colorspace'].values() if main_plate_name in color), None) - if in_color_space: - nuke.tprint("Setting internal OCIO in_colorspace to: %s" % main_plate_name) - shot_ocio['in_colorspace'].setValue(main_plate_name) - shot_ocio['disable'].setValue(False) - node['shot_ocio_bool'].setVisible(True) - node['shot_ocio_bool'].setValue(True) - else: - node['shot_ocio_bool'].setVisible(False) - node['shot_ocio_bool'].setValue(False) - shot_ocio['disable'].setValue(True) - nuke.tprint("No in_colorspace value called: %s. Skipping..." % main_plate_name) + node['shot_ocio_bool'].setValue(True) + shot_ocio['disable'].setValue(False) else: nuke.message("Could not find SG Info node that is required for OCIO color setup.") - else: color_space = self.proj_info['sg_color_space'] node['shot_ocio_bool'].setVisible(False) node['shot_ocio_bool'].setValue(False) shot_ocio['disable'].setValue(False) - if (self.ctx_info.step['name'] == "Roto" and - self.proj_info['sg_project_color_management'] != "OCIO" or - self.proj_info['sg_project_color_management'] == "OCIO"): - color_space = "linear" - nuke.tprint("--- Setting colorspace to %s for Roto" % color_space) - elif (self.ctx_info.step['name'] != "Roto" and + if (self.ctx_info.step['name'] != "Roto" and write_type == "Version"): color_space = self.proj_info['sg_color_space'] if color_space not in node.knob('colorspace').values(): color_space = next((color for color in node.knob('colorspace').values() if 'default' in color), None) - nuke.tprint("--- Could not get color space info. Setting default.") + nuke.tprint("--- Could not get color space info. Setting default value of %s." % color_space) else: nuke.tprint("--- Setting colorspace to %s from Projects page." % color_space) + elif (self.ctx_info.step['name'] == "Roto"):#and + # self.proj_info['sg_project_color_management'] != "OCIO" or + # self.proj_info['sg_project_color_management'] == "OCIO"): + color_space = "linear" + nuke.tprint("--- Setting colorspace to %s for Roto" % color_space) else: color_space = next((color for color in node.knob('colorspace').values() if 'default' in color), None) From d2419d990842588aecd81427deaec8754569c97d Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 5 Oct 2018 17:50:24 +0100 Subject: [PATCH 20/90] need to copy the disbled OCIO to converted node --- python/tk_nuke_writenode/handler.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 5003046..7568957 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -535,7 +535,8 @@ def convert_sg_to_nuke_write_nodes(self): md.fromScript(self.__get_metadata(sg_wn)) # Embed OCIO extra_node.node('shot_ocio')['in_colorspace'].setValue(sg_wn.node('shot_ocio')['in_colorspace'].value()) - extra_node.node('shot_ocio')['out_colorspace'].setValue(sg_wn.node('shot_ocio')['out_colorspace'].value()) + extra_node.node('shot_ocio')['in_colorspace'].setValue(sg_wn.node('shot_ocio')['in_colorspace'].value()) + extra_node.node('shot_ocio')['disable'].setValue(sg_wn.node('shot_ocio')['disable'].value()) # copy across file & proxy knobs (if we've defined a proxy template): new_wn["file"].setValue(sg_wn["cached_path"].evaluate()) From c316aa250441bf26657a8434e37935516e7ea313 Mon Sep 17 00:00:00 2001 From: daawaa Date: Tue, 16 Oct 2018 12:18:24 +0100 Subject: [PATCH 21/90] roto channel set to all --- 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 7568957..ad8aba4 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1622,7 +1622,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False node.knob('auto_crop').setValue(True) if self.ctx_info.step['name'] == "Roto": node.knob('auto_crop').setVisible(True) - profile_channel = "rgba" + profile_channel = "all" elif profile_name == "Jpeg": node.knob('dpx_datatype').setVisible(False) node.knob('exr_datatype').setVisible(False) From 3d8031f10128315a23b6fa9f87e6323c1cdc72e9 Mon Sep 17 00:00:00 2001 From: daawaa Date: Wed, 17 Oct 2018 14:07:06 +0100 Subject: [PATCH 22/90] updated embed crop to reformat --- gizmos/WriteTank.gizmo | 19 +++-- python/tk_nuke_writenode/handler.py | 120 ++++++++++++++-------------- 2 files changed, 73 insertions(+), 66 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 6851ce0..aab6699 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -284,7 +284,7 @@ Gizmo { } addUserKnob { 6 project_crop_bool - l "Crop to Project delivery format" + l "Project delivery format" t "Choose to crop footage to the Project format." +STARTLINE -INVISIBLE @@ -567,20 +567,23 @@ Gizmo { ypos -74 } Reformat { + name project_reformat type "to format" box_width 800 box_height 1 black_outside false pbb true - name project_reformat disable true } - Crop { - name project_crop - preset format - reformat true - crop false - disable true + Reformat { + name delivery_reformat + type "to format" + box_width 800 + box_height 1 + black_outside false + resize width + pbb false + disable true } AddTimeCode { startcode 01:00:00:01 diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index ad8aba4..092a376 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -44,7 +44,7 @@ class TankWriteNodeHandler(object): EMBED_META_DATA = "content_meta_data" EMBED_SHOT_OCIO = "shot_ocio" EMBED_PROJECT_REFORMAT = "project_reformat" - EMBED_CROP = "project_crop" + EMBED_DELIVERY_REFORMAT = "delivery_reformat" OUTPUT_KNOB_NAME = "tank_channel" USE_NAME_AS_OUTPUT_KNOB_NAME = "tk_use_name_as_channel" @@ -449,8 +449,8 @@ def create_project_settings_group(self, node): proj_group_nodes = [] project_reformat = nuke.createNode("Reformat") project_reformat['name'].setValue("project_reformat") - project_crop = nuke.createNode("Crop") - project_crop['name'].setValue("project_crop") + delivery_reformat = nuke.createNode("Crop") + delivery_reformat['name'].setValue("delivery_reformat") project_tc = nuke.createNode("AddTimeCode") project_tc['name'].setValue("project_tc") content_metadata = nuke.createNode("ModifyMetaData") @@ -458,7 +458,7 @@ def create_project_settings_group(self, node): shot_ocio = nuke.createNode("OCIOColorSpace") shot_ocio['name'].setValue("shot_ocio") proj_group_nodes.append(project_reformat) - proj_group_nodes.append(project_crop) + proj_group_nodes.append(delivery_reformat) proj_group_nodes.append(project_tc) proj_group_nodes.append(content_metadata) proj_group_nodes.append(shot_ocio) @@ -520,10 +520,10 @@ def convert_sg_to_nuke_write_nodes(self): extra_node.node('project_reformat')['pbb'].setValue(sg_wn.node('project_reformat')['pbb'].value()) extra_node.node('project_reformat')['black_outside'].setValue(sg_wn.node('project_reformat')['black_outside'].value()) # Embed crop - extra_node.node('project_crop')['disable'].setValue(sg_wn.node('project_crop')['disable'].value()) - extra_node.node('project_crop')['box'].setValue(sg_wn.node('project_crop')['box'].value()) - extra_node.node('project_crop')['reformat'].setValue(sg_wn.node('project_crop')['reformat'].value()) - extra_node.node('project_crop')['crop'].setValue(sg_wn.node('project_crop')['crop'].value()) + extra_node.node('delivery_reformat')['disable'].setValue(sg_wn.node('delivery_reformat')['disable'].value()) + extra_node.node('delivery_reformat')['box'].setValue(sg_wn.node('delivery_reformat')['box'].value()) + extra_node.node('delivery_reformat')['reformat'].setValue(sg_wn.node('delivery_reformat')['reformat'].value()) + extra_node.node('delivery_reformat')['crop'].setValue(sg_wn.node('delivery_reformat')['crop'].value()) # Embed tc extra_node.node('project_tc')['startcode'].setValue(sg_wn.node('project_tc')['startcode'].value()) extra_node.node('project_tc')['fps'].setValue(sg_wn.node('project_tc')['fps'].value()) @@ -1642,8 +1642,8 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False if self._curr_entity_type == 'Shot': # Update embeded time code - proj_reformat = node.node(TankWriteNodeHandler.EMBED_PROJECT_REFORMAT) - project_crop = node.node(TankWriteNodeHandler.EMBED_CROP) + project_reformat = node.node(TankWriteNodeHandler.EMBED_PROJECT_REFORMAT) + delivery_reformat = node.node(TankWriteNodeHandler.EMBED_DELIVERY_REFORMAT) time_code = node.node(TankWriteNodeHandler.EMBED_TIME_CODE) content_meta_data = node.node(TankWriteNodeHandler.EMBED_META_DATA) shot_ocio = node.node(TankWriteNodeHandler.EMBED_SHOT_OCIO) @@ -1652,7 +1652,8 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False # Add sG reformat settings if not self.proj_info['sg_delivery_reformat_filter'] == None: - proj_reformat['filter'].setValue(self.proj_info['sg_delivery_reformat_filter']) + project_reformat['filter'].setValue(self.proj_info['sg_delivery_reformat_filter']) + delivery_reformat['filter'].setValue(self.proj_info['sg_delivery_reformat_filter']) # Timecode settings if not self.frame_range[0]: @@ -1673,47 +1674,56 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False time_code.knobs()["metafps"].setValue(use_meta_data) # Embeded Crop settings + # Set the project reformat first + scriptFormats = nuke.formats() + main_format = None + for f in scriptFormats: + if (f.width() == int(self.proj_info['sg_format_width']) and + f.height() == int(self.proj_info['sg_format_height'])): + main_format = f + break + if not main_format: + try: + main_format = nuke.addFormat("%s %s %s %s" % (str(self.proj_info['sg_delivery_format_width']), + str(self.proj_info['sg_delivery_format_height']), + str(self.proj_info['sg_pixel_aspect_ratio']), + (self.proj_info['sg_short_name']+"_"+str(self.proj_info['sg_format_width'])))) + except: + nuke.tprint("Could not apply embeded format settings. Missing info from Projects...") + + project_reformat.knobs()["format"].setValue(main_format) + + # Set the embeded delivery reformat next if not (self.proj_info['sg_delivery_format_width'] and - self.proj_info['sg_delivery_format_height']): - if (self.proj_info['sg_format_width'] and - self.proj_info['sg_format_height']): - project_crop.knobs()["box"].setValue((0, - 0, - self.proj_info['sg_format_width'], - self.proj_info['sg_format_height'])) - - self._app.log_debug("Applied Project format to embeded Crop: " + - str(self.proj_info['sg_format_width']) + - str(self.proj_info['sg_format_height'])) + self.proj_info['sg_delivery_format_height']): + node.node("delivery_reformat")['disable'].setValue(True) else: - project_crop.knobs()["box"].setValue((0, - 0, - self.proj_info['sg_delivery_format_width'], - self.proj_info['sg_delivery_format_height'])) - self._app.log_debug("Applied Project Delivery format to embeded Crop") - - # Set reformat info - if (self.proj_info['sg_delivery_format_width'] and - self.proj_info['sg_delivery_format_height'] and - self.proj_info['sg_pixel_aspect_ratio'] and - self.proj_info['sg_short_name']): - scriptFormats = nuke.formats() - main_format = None - for f in scriptFormats: - if (f.width() == int(self.proj_info['sg_delivery_format_width']) and - f.height() == int(self.proj_info['sg_delivery_format_height'])): - main_format = f - break - if not main_format: - try: - main_format = nuke.addFormat("%s %s %s %s" % (str(self.proj_info['sg_delivery_format_width']), - str(self.proj_info['sg_delivery_format_height']), - str(self.proj_info['sg_pixel_aspect_ratio']), - (self.proj_info['sg_short_name']+"_"+str(self.proj_info['sg_format_width'])))) - except: - nuke.tprint("Could not apply embeded format settings. Missing info from Projects...") - - proj_reformat.knobs()["format"].setValue(main_format) + # If delivery format matches project format disable + if (self.proj_info['sg_format_width'] == self.proj_info['sg_delivery_format_width'] and + self.proj_info['sg_format_height']==self.proj_info['sg_delivery_format_height']): + node.node("delivery_reformat")['disable'].setValue(True) + else: + # Set the delivery_reformat node + if (self.proj_info['sg_delivery_format_width'] and + self.proj_info['sg_delivery_format_height'] and + self.proj_info['sg_pixel_aspect_ratio'] and + self.proj_info['sg_short_name']): + main_format = None + for f in scriptFormats: + if (f.width() == int(self.proj_info['sg_delivery_format_width']) and + f.height() == int(self.proj_info['sg_delivery_format_height'])): + main_format = f + break + if not main_format: + try: + main_format = nuke.addFormat("%s %s %s %s" % (str(self.proj_info['sg_delivery_format_width']), + str(self.proj_info['sg_delivery_format_height']), + str(self.proj_info['sg_pixel_aspect_ratio']), + (self.proj_info['sg_short_name']+"_"+str(self.proj_info['sg_format_width'])))) + except: + nuke.tprint("Could not apply embeded format settings. Missing info from Projects...") + + delivery_reformat.knobs()["format"].setValue(main_format) # Set colorspace based of SG values color_space = None @@ -2626,7 +2636,6 @@ def __setup_new_node(self, node): if self._curr_entity_type == 'Shot': if self.proj_info['name'] == "Breakdowns": node.node("project_reformat")['disable'].setValue(True) - # node.node("project_crop")['disable'].setValue(True) node.knob('project_crop_bool').setVisible(False) node.knob('shot_ocio_bool').setVisible(False) else: @@ -2639,22 +2648,17 @@ def __setup_new_node(self, node): node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) node.knob("project_crop_bool").setValue(False) node.node("project_reformat")['disable'].setValue(True) - # node.node("project_crop")['disable'].setValue(True) elif self.ctx_info.step['name'] == "Cleanup": node.node("project_reformat")['disable'].setValue(True) - # node.knob("project_crop").setValue(False) else: node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) node.knob("project_crop_bool").setValue(True) node.node("project_reformat")['disable'].setValue(False) - # node.node("project_crop")['disable'].setValue(False) if self._curr_entity_type == 'Asset': if write_type == "Version": node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) node.node("project_reformat")['disable'].setValue(True) node.knob('project_crop_bool').setVisible(False) - # node.node("project_crop")['disable'].setValue(True) - # # 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: @@ -2726,10 +2730,10 @@ def __version_up_visible(self, node, visible): def __embedded_format_option(self, node, value): if value == True: node.node("project_reformat")['disable'].setValue(False) - node.node("project_crop")['disable'].setValue(False) + node.node("delivery_reformat")['disable'].setValue(False) elif value == False: node.node("project_reformat")['disable'].setValue(True) - node.node("project_crop")['disable'].setValue(True) + node.node("delivery_reformat")['disable'].setValue(True) def __embedded_ocio_option(self, node, value): if value == True: From a2de57a15a0dcd928b8ea0aa9316907723b1c04e Mon Sep 17 00:00:00 2001 From: daawaa Date: Thu, 18 Oct 2018 16:14:25 +0100 Subject: [PATCH 23/90] update to convert SG node --- python/tk_nuke_writenode/handler.py | 33 +++++++++++++++++++---------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 092a376..8525950 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -447,9 +447,13 @@ def create_project_settings_group(self, node): # Primary group setup proj_group_nodes = [] + project_group = nuke.createNode("Group") + project_group_process = nuke.toNode('Group1') + project_group_process.begin() + input_node = nuke.createNode("Input") project_reformat = nuke.createNode("Reformat") project_reformat['name'].setValue("project_reformat") - delivery_reformat = nuke.createNode("Crop") + delivery_reformat = nuke.createNode("Reformat") delivery_reformat['name'].setValue("delivery_reformat") project_tc = nuke.createNode("AddTimeCode") project_tc['name'].setValue("project_tc") @@ -457,21 +461,22 @@ def create_project_settings_group(self, node): content_metadata['name'].setValue("content_meta_data") shot_ocio = nuke.createNode("OCIOColorSpace") shot_ocio['name'].setValue("shot_ocio") + input_node = nuke.createNode("Output") proj_group_nodes.append(project_reformat) proj_group_nodes.append(delivery_reformat) proj_group_nodes.append(project_tc) proj_group_nodes.append(content_metadata) proj_group_nodes.append(shot_ocio) + project_group_process.end() - for i in proj_group_nodes: - i.setSelected(True) - - project_group = nuke.makeGroup('showControlPanel') + # for i in proj_group_nodes: + # i.setSelected(True) project_group.setXpos(nodePos[0]) project_group.setYpos(nodePos[1] - 30) project_group.setSelected(False) - for i in proj_group_nodes: - nuke.delete(i) + + # for i in proj_group_nodes: + # nuke.delete(i) project_group.setInput(0, parent_node) node.setInput(0, project_group) return project_group @@ -519,11 +524,17 @@ def convert_sg_to_nuke_write_nodes(self): extra_node.node('project_reformat')['format'].setValue(sg_wn.node('project_reformat')['format'].value()) extra_node.node('project_reformat')['pbb'].setValue(sg_wn.node('project_reformat')['pbb'].value()) extra_node.node('project_reformat')['black_outside'].setValue(sg_wn.node('project_reformat')['black_outside'].value()) - # Embed crop + # Embed crop extra_node.node('delivery_reformat')['disable'].setValue(sg_wn.node('delivery_reformat')['disable'].value()) - extra_node.node('delivery_reformat')['box'].setValue(sg_wn.node('delivery_reformat')['box'].value()) - extra_node.node('delivery_reformat')['reformat'].setValue(sg_wn.node('delivery_reformat')['reformat'].value()) - extra_node.node('delivery_reformat')['crop'].setValue(sg_wn.node('delivery_reformat')['crop'].value()) + extra_node.node('delivery_reformat')['filter'].setValue(sg_wn.node('delivery_reformat')['filter'].value()) + extra_node.node('delivery_reformat')['format'].setValue(sg_wn.node('delivery_reformat')['format'].value()) + extra_node.node('delivery_reformat')['pbb'].setValue(sg_wn.node('delivery_reformat')['pbb'].value()) + extra_node.node('delivery_reformat')['black_outside'].setValue(sg_wn.node('delivery_reformat')['black_outside'].value()) + + # extra_node.node('delivery_reformat')['disable'].setValue(sg_wn.node('delivery_reformat')['disable'].value()) + # extra_node.node('delivery_reformat')['box'].setValue(sg_wn.node('delivery_reformat')['box'].value()) + # extra_node.node('delivery_reformat')['reformat'].setValue(sg_wn.node('delivery_reformat')['reformat'].value()) + # extra_node.node('delivery_reformat')['crop'].setValue(sg_wn.node('delivery_reformat')['crop'].value()) # Embed tc extra_node.node('project_tc')['startcode'].setValue(sg_wn.node('project_tc')['startcode'].value()) extra_node.node('project_tc')['fps'].setValue(sg_wn.node('project_tc')['fps'].value()) From ac562bd4b787026e9fc70635957d52d97e45e696 Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 19 Oct 2018 09:17:17 +0100 Subject: [PATCH 24/90] cleanup of sg convert --- python/tk_nuke_writenode/handler.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 8525950..7f19679 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -440,9 +440,7 @@ def create_project_settings_group(self, node): # Get properties of selected node to use for new group node = nuke.selectedNode() nodePos = (node.xpos(), node.ypos()) - parent_node = None - if node.input(0): - parent_node = node.input(0) + node['selected'].setValue(False) # Primary group setup @@ -477,8 +475,7 @@ def create_project_settings_group(self, node): # for i in proj_group_nodes: # nuke.delete(i) - project_group.setInput(0, parent_node) - node.setInput(0, project_group) + return project_group def convert_sg_to_nuke_write_nodes(self): @@ -514,10 +511,16 @@ def convert_sg_to_nuke_write_nodes(self): parent_node['selected'].setValue(True) extra_node = self.create_project_settings_group(sg_wn) + + parent_node = None + if sg_wn.input(0): + parent_node = sg_wn.input(0) + extra_node.setInput(0, parent_node) + new_wn.setInput(0, extra_node) + self._project_setting_groups.append(extra_node) new_wn.setSelected(False) - # Embed reformat extra_node.node('project_reformat')['disable'].setValue(sg_wn.node('project_reformat')['disable'].value()) extra_node.node('project_reformat')['filter'].setValue(sg_wn.node('project_reformat')['filter'].value()) @@ -1771,9 +1774,9 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False nuke.message("Could not find SG Info node that is required for OCIO color setup.") else: color_space = self.proj_info['sg_color_space'] - node['shot_ocio_bool'].setVisible(False) node['shot_ocio_bool'].setValue(False) - shot_ocio['disable'].setValue(False) + node['shot_ocio_bool'].setVisible(False) + shot_ocio['disable'].setValue(True) if (self.ctx_info.step['name'] != "Roto" and write_type == "Version"): From 63a57bce94e3cd10d50a527d4a0430ff808ca96b Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 19 Oct 2018 13:42:24 +0100 Subject: [PATCH 25/90] fix break with multiple groups when converting SG writes --- python/tk_nuke_writenode/handler.py | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 7f19679..f2a4237 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -438,15 +438,13 @@ def remove_callbacks(self): def create_project_settings_group(self, node): # Get properties of selected node to use for new group - node = nuke.selectedNode() + # node = nuke.selectedNode() nodePos = (node.xpos(), node.ypos()) - node['selected'].setValue(False) - # Primary group setup proj_group_nodes = [] project_group = nuke.createNode("Group") - project_group_process = nuke.toNode('Group1') + project_group_process = nuke.toNode(project_group['name'].value()) project_group_process.begin() input_node = nuke.createNode("Input") project_reformat = nuke.createNode("Reformat") @@ -472,6 +470,7 @@ def create_project_settings_group(self, node): project_group.setXpos(nodePos[0]) project_group.setYpos(nodePos[1] - 30) project_group.setSelected(False) + # node['selected'].setValue(False) # for i in proj_group_nodes: # nuke.delete(i) @@ -496,20 +495,17 @@ def convert_sg_to_nuke_write_nodes(self): # get write nodes: sg_write_nodes = self.get_nodes() for sg_wn in sg_write_nodes: - - # set as selected: + extra_node = None sg_wn.setSelected(True) node_name = sg_wn.name() node_pos = (sg_wn.xpos(), sg_wn.ypos()) - # create new regular Write node: new_wn = nuke.createNode("Write") if new_wn.input(0): parent_node = new_wn.input(0) - new_wn['selected'].setValue(False) - parent_node['selected'].setValue(True) - + # new_wn['selected'].setValue(False) + # parent_node['selected'].setValue(True) extra_node = self.create_project_settings_group(sg_wn) parent_node = None @@ -520,7 +516,6 @@ def convert_sg_to_nuke_write_nodes(self): self._project_setting_groups.append(extra_node) - new_wn.setSelected(False) # Embed reformat extra_node.node('project_reformat')['disable'].setValue(sg_wn.node('project_reformat')['disable'].value()) extra_node.node('project_reformat')['filter'].setValue(sg_wn.node('project_reformat')['filter'].value()) From 66b549a31ba9e9b877a01efc861098aad9655f47 Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 19 Oct 2018 13:48:20 +0100 Subject: [PATCH 26/90] cleanup --- python/tk_nuke_writenode/handler.py | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index f2a4237..fd3b5f3 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -438,7 +438,6 @@ def remove_callbacks(self): def create_project_settings_group(self, node): # Get properties of selected node to use for new group - # node = nuke.selectedNode() nodePos = (node.xpos(), node.ypos()) # Primary group setup @@ -465,15 +464,9 @@ def create_project_settings_group(self, node): proj_group_nodes.append(shot_ocio) project_group_process.end() - # for i in proj_group_nodes: - # i.setSelected(True) project_group.setXpos(nodePos[0]) project_group.setYpos(nodePos[1] - 30) project_group.setSelected(False) - # node['selected'].setValue(False) - - # for i in proj_group_nodes: - # nuke.delete(i) return project_group @@ -504,8 +497,6 @@ def convert_sg_to_nuke_write_nodes(self): if new_wn.input(0): parent_node = new_wn.input(0) - # new_wn['selected'].setValue(False) - # parent_node['selected'].setValue(True) extra_node = self.create_project_settings_group(sg_wn) parent_node = None @@ -527,12 +518,7 @@ def convert_sg_to_nuke_write_nodes(self): extra_node.node('delivery_reformat')['filter'].setValue(sg_wn.node('delivery_reformat')['filter'].value()) extra_node.node('delivery_reformat')['format'].setValue(sg_wn.node('delivery_reformat')['format'].value()) extra_node.node('delivery_reformat')['pbb'].setValue(sg_wn.node('delivery_reformat')['pbb'].value()) - extra_node.node('delivery_reformat')['black_outside'].setValue(sg_wn.node('delivery_reformat')['black_outside'].value()) - - # extra_node.node('delivery_reformat')['disable'].setValue(sg_wn.node('delivery_reformat')['disable'].value()) - # extra_node.node('delivery_reformat')['box'].setValue(sg_wn.node('delivery_reformat')['box'].value()) - # extra_node.node('delivery_reformat')['reformat'].setValue(sg_wn.node('delivery_reformat')['reformat'].value()) - # extra_node.node('delivery_reformat')['crop'].setValue(sg_wn.node('delivery_reformat')['crop'].value()) + extra_node.node('delivery_reformat')['black_outside'].setValue(sg_wn.node('delivery_reformat')['black_outside'].value()) # Embed tc extra_node.node('project_tc')['startcode'].setValue(sg_wn.node('project_tc')['startcode'].value()) extra_node.node('project_tc')['fps'].setValue(sg_wn.node('project_tc')['fps'].value()) From ccdfcd22d459fa30cb98a2a779b3b2cf78795792 Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 19 Oct 2018 14:21:24 +0100 Subject: [PATCH 27/90] disabled ocio embed node if no OCIO criteria met --- 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 fd3b5f3..f6d1c4c 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1397,6 +1397,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False be reset. For example, if colorspace has been set in the profile and force is False then the knob won't get reset to the value from the profile. """ + nuke.tprint("Setting profile for %s" %profile_name) # can't change the profile if this isn't a valid profile: if profile_name not in self._profiles: # at the very least, try to restore the file format settings from the cached values: @@ -1725,8 +1726,9 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False if self.proj_info['sg_color_space']: if self.proj_info['sg_project_color_management'] == "OCIO": color_space = "acescg" - if not nuke.root()['customOCIOConfigPath']: - pass + if (not nuke.root()['customOCIOConfigPath'].value() + and not nuke.root()['colorManagement'].value() == "OCIO"): + shot_ocio['disable'].setValue(True) else: sg_info_nodes = [n for n in self.get_nodes_by_class('SGInfoNode')] if not sg_info_nodes: From ea6de3d12d4391daa4d6594128c05fa782b3340d Mon Sep 17 00:00:00 2001 From: daawaa Date: Tue, 23 Oct 2018 17:35:27 +0100 Subject: [PATCH 28/90] black outside true on SG reformats --- gizmos/WriteTank.gizmo | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index aab6699..ff2495c 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -571,7 +571,7 @@ Reformat { type "to format" box_width 800 box_height 1 - black_outside false + black_outside true pbb true disable true } @@ -580,7 +580,7 @@ Reformat { type "to format" box_width 800 box_height 1 - black_outside false + black_outside true resize width pbb false disable true From 624a9d0a4ac39cf93757e940616a01e2209acb22 Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 2 Nov 2018 11:57:11 +0000 Subject: [PATCH 29/90] Major update - added copy folder - slected node conversion --- app.py | 4 +- gizmos/WriteTank.gizmo | 30 +-- python/tk_nuke_writenode/handler.py | 392 ++++++++++++++++------------ 3 files changed, 241 insertions(+), 185 deletions(-) diff --git a/app.py b/app.py index 9281e64..cdfb611 100644 --- a/app.py +++ b/app.py @@ -201,13 +201,13 @@ def reset_node_render_path(self, node): """ self.__write_node_handler.reset_render_path(node) - def convert_to_write_nodes(self): + def convert_to_write_nodes(self, selected_node=None): """ Convert all Shotgun write nodes found in the current Script to regular Nuke Write nodes. Additional toolkit information will be stored on additional user knobs named 'tk_*' """ - self.__write_node_handler.convert_sg_to_nuke_write_nodes() + self.__write_node_handler.convert_sg_to_nuke_write_nodes(selected_node=None) def convert_from_write_nodes(self): """ diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index ff2495c..0325c81 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -218,17 +218,24 @@ Gizmo { addUserKnob { 22 tk_copy_path 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 "import nuke\nif hasattr(nuke, \"_shotgun_write_node_handler\"):\n nuke._shotgun_write_node_handler.on_copy_path_to_clipboard_gizmo_callback(False, 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 "import nuke\nif hasattr(nuke, \"_shotgun_write_node_handler\"):\n nuke._shotgun_write_node_handler.on_copy_path_to_clipboard_gizmo_callback(True, False)" t "Copies the current render/proxy path to the clipboard" -STARTLINE } + addUserKnob { + 22 tk_copy_folder_win + l "Copy Folder - 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, True)" + t "Copies the current render/proxy path folder to the clipboard" + -STARTLINE + } addUserKnob { 26 "" l "" @@ -245,24 +252,17 @@ Gizmo { l "Info" T " " } + addUserKnob { + 22 convert_to_write + l "Convert Node" + T " " + } addUserKnob { 1 write_type_cache l "SG Write Type Cache" t "The cached Write Type for this node" +INVISIBLE } - addUserKnob { - 1 write_name_cache - l "SG Write Name Cache" - t "The cached Write Name for this node" - +INVISIBLE - } - addUserKnob { - 1 write_version_latest - l "SG Write Version number Cache" - t "The cached Write Name for this node" - +INVISIBLE - } addUserKnob { 25 "" - STARTLINE @@ -572,7 +572,7 @@ Reformat { box_width 800 box_height 1 black_outside true - pbb true + pbb false disable true } Reformat { diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index f6d1c4c..152ade2 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -42,10 +42,9 @@ class TankWriteNodeHandler(object): WRITE_NODE_NAME = "Write1" EMBED_TIME_CODE = "project_tc" EMBED_META_DATA = "content_meta_data" - EMBED_SHOT_OCIO = "shot_ocio" + EMBED_SHOT_OCIO = "shot_ocio" EMBED_PROJECT_REFORMAT = "project_reformat" EMBED_DELIVERY_REFORMAT = "delivery_reformat" - OUTPUT_KNOB_NAME = "tank_channel" USE_NAME_AS_OUTPUT_KNOB_NAME = "tk_use_name_as_channel" @@ -442,21 +441,21 @@ def create_project_settings_group(self, node): # Primary group setup proj_group_nodes = [] - project_group = nuke.createNode("Group") + project_group = nuke.createNode("Group", inpanel = False) project_group_process = nuke.toNode(project_group['name'].value()) project_group_process.begin() - input_node = nuke.createNode("Input") - project_reformat = nuke.createNode("Reformat") + input_node = nuke.createNode("Input", inpanel = False) + project_reformat = nuke.createNode("Reformat", inpanel = False) project_reformat['name'].setValue("project_reformat") - delivery_reformat = nuke.createNode("Reformat") + delivery_reformat = nuke.createNode("Reformat", inpanel = False) delivery_reformat['name'].setValue("delivery_reformat") - project_tc = nuke.createNode("AddTimeCode") + project_tc = nuke.createNode("AddTimeCode", inpanel = False) project_tc['name'].setValue("project_tc") - content_metadata = nuke.createNode("ModifyMetaData") + content_metadata = nuke.createNode("ModifyMetaData", inpanel = False) content_metadata['name'].setValue("content_meta_data") - shot_ocio = nuke.createNode("OCIOColorSpace") + shot_ocio = nuke.createNode("OCIOColorSpace", inpanel = False) shot_ocio['name'].setValue("shot_ocio") - input_node = nuke.createNode("Output") + input_node = nuke.createNode("Output", inpanel = False) proj_group_nodes.append(project_reformat) proj_group_nodes.append(delivery_reformat) proj_group_nodes.append(project_tc) @@ -470,7 +469,7 @@ def create_project_settings_group(self, node): return project_group - def convert_sg_to_nuke_write_nodes(self): + def convert_sg_to_nuke_write_nodes(self, selected_node=None): """ Utility function to convert all Shotgun Write nodes to regular Nuke Write nodes. @@ -484,16 +483,25 @@ def convert_sg_to_nuke_write_nodes(self): """ # clear current selection: nukescripts.clear_selection_recursive() - + + sg_write_nodes =[] # get write nodes: - sg_write_nodes = self.get_nodes() + if not selected_node: + nuke.tprint("Converting all SG write nodes to Nuke write nodes.") + sg_write_nodes = self.get_nodes() + else: + nuke.tprint("Converting selected SG write nodes to Nuke write nodes.") + sg_write_nodes.append(selected_node) + for sg_wn in sg_write_nodes: + extra_node = None sg_wn.setSelected(True) - node_name = sg_wn.name() node_pos = (sg_wn.xpos(), sg_wn.ypos()) + # create new regular Write node: - new_wn = nuke.createNode("Write") + with nuke.root(): + new_wn = nuke.createNode("Write", inpanel = False ) if new_wn.input(0): parent_node = new_wn.input(0) @@ -504,8 +512,13 @@ def convert_sg_to_nuke_write_nodes(self): parent_node = sg_wn.input(0) extra_node.setInput(0, parent_node) new_wn.setInput(0, extra_node) + if not selected_node: + self._project_setting_groups.append(extra_node) - self._project_setting_groups.append(extra_node) + if not selected_node: + node_name = sg_wn.name() + else: + node_name = sg_wn.name()+"_converted" # Embed reformat extra_node.node('project_reformat')['disable'].setValue(sg_wn.node('project_reformat')['disable'].value()) @@ -533,12 +546,21 @@ def convert_sg_to_nuke_write_nodes(self): extra_node.node('shot_ocio')['in_colorspace'].setValue(sg_wn.node('shot_ocio')['in_colorspace'].value()) extra_node.node('shot_ocio')['disable'].setValue(sg_wn.node('shot_ocio')['disable'].value()) + # copy across file & proxy knobs (if we've defined a proxy template): new_wn["file"].setValue(sg_wn["cached_path"].evaluate()) if sg_wn["proxy_render_template"].value(): new_wn["proxy"].setValue(sg_wn["tk_cached_proxy_path"].evaluate()) else: new_wn["proxy"].setValue("") + + # Copy across colorspace + colorspace_name = r'default \((\w{1,9})\)' + if re.match(colorspace_name, sg_wn['colorspace'].value()): + new_wn['colorspace'].setValue(re.match(colorspace_name, + sg_wn['colorspace'].value()).group(1)) + else: + new_wn['colorspace'].setValue(sg_wn['colorspace'].value()) # make sure file_type is set properly: int_wn = sg_wn.node(TankWriteNodeHandler.WRITE_NODE_NAME) @@ -632,7 +654,7 @@ def convert_sg_to_nuke_write_nodes(self): # rename new node: new_wn.setName(node_name) new_wn.setXpos(node_pos[0]) - new_wn.setYpos(node_pos[1]) + new_wn.setYpos(node_pos[1]) def convert_nuke_to_sg_write_nodes(self): """ @@ -655,122 +677,125 @@ def convert_nuke_to_sg_write_nodes(self): write_nodes = nuke.allNodes(group=nuke.root(), filter="Write", recurseGroups = True) for gn in self._project_setting_groups: + nuke.tprint(gn) nuke.delete(gn) + self._project_setting_groups = [] for wn in write_nodes: - - # look for additional toolkit knobs: - profile_knob = wn.knob("tk_profile_name") - write_type = wn.knob("tk_write_type") - exr_datatype = wn.knob("tk_exr_datatype") - dpx_datatype = wn.knob("tk_dpx_datatype") - auto_crop = wn.knob("tk_autocrop") - 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") - 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 - or not use_name_as_output_knob - or not write_type - or not exr_datatype - or not dpx_datatype - or not auto_crop - or not channels_knob - or not render_template_knob - or not publish_template_knob - or not proxy_render_template_knob - or not proxy_publish_template_knob): - # can't convert to a Shotgun Write Node as we have missing parameters! - continue - - # set as selected: - wn.setSelected(True) - node_name = wn.name() - node_pos = (wn.xpos(), wn.ypos()) - wn.setName(node_name) - - # 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()) - 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()) - 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. - # Instead we want this node to be rebuilt as close as possible to the - # original before it was converted to a regular Nuke write node. - profile_name = profile_knob.value() - new_sg_wn["profile_name"].setValue(profile_name) - new_sg_wn["tk_profile_list"].setValue(profile_name) - new_sg_wn[TankWriteNodeHandler.OUTPUT_KNOB_NAME].setValue(output_knob.value()) - new_sg_wn[TankWriteNodeHandler.USE_NAME_AS_OUTPUT_KNOB_NAME].setValue(use_name_as_output_knob.value()) - - # make sure file_type is set properly: - int_wn = new_sg_wn.node(TankWriteNodeHandler.WRITE_NODE_NAME) - int_wn["file_type"].setValue(wn["file_type"].value()) - - # 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 "_converted" in wn.name(): + pass + else: + # look for additional toolkit knobs: + profile_knob = wn.knob("tk_profile_name") + write_type = wn.knob("tk_write_type") + exr_datatype = wn.knob("tk_exr_datatype") + dpx_datatype = wn.knob("tk_dpx_datatype") + auto_crop = wn.knob("tk_autocrop") + 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") + 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 + or not use_name_as_output_knob + or not write_type + or not exr_datatype + or not dpx_datatype + or not auto_crop + or not channels_knob + or not render_template_knob + or not publish_template_knob + or not proxy_render_template_knob + or not proxy_publish_template_knob): + # can't convert to a Shotgun Write Node as we have missing parameters! continue - - if knob_name in int_wn.knobs(): - try: - int_wn[knob_name].setValue(knob.value()) - except TypeError: - # ignore type errors: - pass - # 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()) - - # delete original node: - nuke.delete(wn) + # set as selected: + wn.setSelected(True) + node_name = wn.name() + node_pos = (wn.xpos(), wn.ypos()) + wn.setName(node_name) + + # 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()) + 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()) + 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. + # Instead we want this node to be rebuilt as close as possible to the + # original before it was converted to a regular Nuke write node. + profile_name = profile_knob.value() + new_sg_wn["profile_name"].setValue(profile_name) + new_sg_wn["tk_profile_list"].setValue(profile_name) + new_sg_wn[TankWriteNodeHandler.OUTPUT_KNOB_NAME].setValue(output_knob.value()) + new_sg_wn[TankWriteNodeHandler.USE_NAME_AS_OUTPUT_KNOB_NAME].setValue(use_name_as_output_knob.value()) + + # make sure file_type is set properly: + int_wn = new_sg_wn.node(TankWriteNodeHandler.WRITE_NODE_NAME) + int_wn["file_type"].setValue(wn["file_type"].value()) + + # 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"]: + continue + + if knob_name in int_wn.knobs(): + try: + int_wn[knob_name].setValue(knob.value()) + except TypeError: + # ignore type errors: + pass - # set SG write type - write_type_name = write_type.value() - new_sg_wn["write_type"].setValue(write_type_name) - - #Set tank channel - tank_channel_text = tk_tank_channel.value() - new_sg_wn["tank_channel"].setValue(tank_channel_text) - - # datatype - new_sg_wn["exr_datatype"].setValue(exr_datatype.value()) - new_sg_wn["dpx_datatype"].setValue(dpx_datatype.value()) + # 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()) + + # delete original node: + nuke.delete(wn) - # autocrop - if auto_crop.value() == "True": - ac_val = True - else: - ac_val = False + # set SG write type + write_type_name = write_type.value() + new_sg_wn["write_type"].setValue(write_type_name) + + #Set tank channel + tank_channel_text = tk_tank_channel.value() + new_sg_wn["tank_channel"].setValue(tank_channel_text) + + # datatype + new_sg_wn["exr_datatype"].setValue(exr_datatype.value()) + new_sg_wn["dpx_datatype"].setValue(dpx_datatype.value()) - new_sg_wn["auto_crop"].setValue(ac_val) + # autocrop + if auto_crop.value() == "True": + ac_val = True + else: + ac_val = False - # rename new node: - new_sg_wn.setName(node_name) - new_sg_wn.setXpos(node_pos[0]) - new_sg_wn.setYpos(node_pos[1]) + new_sg_wn["auto_crop"].setValue(ac_val) + # rename new node: + new_sg_wn.setName(node_name) + new_sg_wn.setXpos(node_pos[0]) + new_sg_wn.setYpos(node_pos[1]) ################################################################################################ # Public methods called from gizmo - although these are public, they should @@ -961,7 +986,7 @@ def on_reset_render_path_gizmo_callback(self): self.reset_render_path(node) - def on_copy_path_to_clipboard_gizmo_callback(self, win_safe): + def on_copy_path_to_clipboard_gizmo_callback(self, win_safe, folder): """ Callback from the gizmo whenever the 'Copy path to clipboard' button is pressed. @@ -974,8 +999,13 @@ def on_copy_path_to_clipboard_gizmo_callback(self, win_safe): if win_safe: system = sys.platform if system == "win32": - render_path = os.path.normpath(render_path) - + render_path = os.path.normpath(render_path) + if folder: + try: + render_path = os.path.split(render_path)[0] + except: + self._app.log_debug("Could not get folder from path") + # use Qt to copy the path to the clipboard: from sgtk.platform.qt import QtGui QtGui.QApplication.clipboard().setText(render_path) @@ -1479,8 +1509,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, "write_name_cache", str(node.name())) + self.__update_knob_value(node, "write_type_cache", write_type) self.__update_knob_value(node, "tk_profile_list", profile_name) @@ -1599,34 +1628,39 @@ 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": - node.knob('dpx_datatype').setVisible(True) - node.knob('exr_datatype').setVisible(False) - node.knob('auto_crop').setVisible(False) - node.knob('auto_crop').setValue(False) - profile_channel = "rgb" - elif profile_name == "Exr": - node.knob('exr_datatype').setVisible(True) - node.knob('dpx_datatype').setVisible(False) - profile_channel = "rgba" - node.node(TankWriteNodeHandler.WRITE_NODE_NAME)['metadata'].setValue('all metadata') - node.knob('auto_crop').setVisible(False) - if (write_type == "Precomp" or - write_type == "Element"): - profile_channel = "rgba" - node.knob('auto_crop').setVisible(True) - node.knob('auto_crop').setValue(True) - if self.ctx_info.step['name'] == "Roto": - node.knob('auto_crop').setVisible(True) - profile_channel = "all" - elif profile_name == "Jpeg": - node.knob('dpx_datatype').setVisible(False) - node.knob('exr_datatype').setVisible(False) - node.knob('auto_crop').setVisible(False) - profile_channel = "rgb" + if node.knob('tank_channel_cache').value() == "": + nuke.tprint("No cached channel info") + if profile_name == "Dpx": + node.knob('dpx_datatype').setVisible(True) + node.knob('exr_datatype').setVisible(False) + node.knob('auto_crop').setVisible(False) + node.knob('auto_crop').setValue(False) + profile_channel = "rgb" + elif profile_name == "Exr": + node.knob('exr_datatype').setVisible(True) + node.knob('dpx_datatype').setVisible(False) + profile_channel = "rgba" + node.node(TankWriteNodeHandler.WRITE_NODE_NAME)['metadata'].setValue('all metadata') + node.knob('auto_crop').setVisible(False) + if (write_type == "Precomp" or + write_type == "Element"): + profile_channel = "rgba" + node.knob('auto_crop').setVisible(True) + node.knob('auto_crop').setValue(True) + if self.ctx_info.step['name'] == "Roto": + node.knob('auto_crop').setVisible(True) + profile_channel = "all" + elif profile_name == "Jpeg": + node.knob('dpx_datatype').setVisible(False) + node.knob('exr_datatype').setVisible(False) + node.knob('auto_crop').setVisible(False) + profile_channel = "rgb" + else: + nuke.tprint("No profile with that name") else: - nuke.tprint("No profile with that name") - + profile_channel = node.knob('tank_channel_cache').value() + nuke.tprint("Cached channel info: %s" % profile_channel) + self.__update_knob_value(node, "channels", profile_channel) # Sets project specific fileset compression @@ -1669,7 +1703,6 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False time_code.knobs()["frame"].setValue(shot_frame_range_start) time_code.knobs()["metafps"].setValue(use_meta_data) - # Embeded Crop settings # Set the project reformat first scriptFormats = nuke.formats() main_format = None @@ -1693,33 +1726,40 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False if not (self.proj_info['sg_delivery_format_width'] and self.proj_info['sg_delivery_format_height']): node.node("delivery_reformat")['disable'].setValue(True) + nuke.tprint("No delivery reformat info given on Projects.") else: # If delivery format matches project format disable if (self.proj_info['sg_format_width'] == self.proj_info['sg_delivery_format_width'] and self.proj_info['sg_format_height']==self.proj_info['sg_delivery_format_height']): node.node("delivery_reformat")['disable'].setValue(True) + nuke.tprint("Deliver format and Project format are the same. Disabling delivery reformat.") + elif write_type != "Version": + node.node("delivery_reformat")['disable'].setValue(True) else: # Set the delivery_reformat node if (self.proj_info['sg_delivery_format_width'] and self.proj_info['sg_delivery_format_height'] and self.proj_info['sg_pixel_aspect_ratio'] and self.proj_info['sg_short_name']): - main_format = None + deliv_format = None for f in scriptFormats: if (f.width() == int(self.proj_info['sg_delivery_format_width']) and f.height() == int(self.proj_info['sg_delivery_format_height'])): - main_format = f + deliv_format = f break - if not main_format: + if not deliv_format: try: - main_format = nuke.addFormat("%s %s %s %s" % (str(self.proj_info['sg_delivery_format_width']), + deliv_format = nuke.addFormat("%s %s %s %s" % (str(self.proj_info['sg_delivery_format_width']), str(self.proj_info['sg_delivery_format_height']), str(self.proj_info['sg_pixel_aspect_ratio']), (self.proj_info['sg_short_name']+"_"+str(self.proj_info['sg_format_width'])))) except: nuke.tprint("Could not apply embeded format settings. Missing info from Projects...") - delivery_reformat.knobs()["format"].setValue(main_format) + delivery_reformat.knobs()["format"].setValue(deliv_format) + node.node("delivery_reformat")['disable'].setValue(False) + else: + nuke.tprint("Missing info from SG Projects") # Set colorspace based of SG values color_space = None @@ -1751,8 +1791,13 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False node['shot_ocio_bool'].setValue(False) shot_ocio['disable'].setValue(True) else: - node['shot_ocio_bool'].setValue(True) - shot_ocio['disable'].setValue(False) + if (self.ctx_info.step['name'] == 'Comp_Texture' or + self.ctx_info.step['name'] == 'Comp_Warp'): + node['shot_ocio_bool'].setValue(False) + shot_ocio['disable'].setValue(True) + else: + node['shot_ocio_bool'].setValue(True) + shot_ocio['disable'].setValue(False) else: nuke.message("Could not find SG Info node that is required for OCIO color setup.") else: @@ -2463,7 +2508,6 @@ def __compute_render_path_from(self, node, render_template, width, height, outpu path_to_test = file except: nuke.tprint("nope") - """ # Test for existing folder contents if self.test_folder_for_renders(path): @@ -2503,6 +2547,7 @@ def __compute_render_path_from(self, node, render_template, width, height, outpu else: self.__update_knob_value(node, "files_warning", "") node.knob("files_warning").setVisible(False) + """ return path @@ -2695,8 +2740,14 @@ def __is_node_fully_constructed(self, node): mechanism allows the code to ignore other callbacks that may fail because things aren't set up correctly (e.g. knobChanged calls for default values when loading a script). """ - if not node.knob("tk_is_fully_constructed"): + try: + if not node.knob("tk_is_fully_constructed"): + return False + else: + self._app.log_debug("Fully constructed: %s" % node.knob("tk_is_fully_constructed").value()) + except: return False + return node.knob("tk_is_fully_constructed").value() @@ -2752,7 +2803,6 @@ def __on_knob_changed(self): node = nuke.thisNode() knob = nuke.thisKnob() grp = nuke.thisGroup() - if not self.__is_node_fully_constructed(node): # knobChanged will be called during script load for all knobs with non-default # values. We want to ignore these implicit changes so we make use of a knob to @@ -2760,11 +2810,14 @@ def __on_knob_changed(self): # all knob changes #print "Ignoring change to %s.%s value = %s" % (node.name(), knob.name(), knob.value()) return - write_type = self.get_node_write_type_name(node) + + write_type = self.get_node_write_type_name(node) write_type_profile = "Exr" if self.proj_info['sg_delivery_fileset'] != None: if write_type == "Version": - write_type_profile = self.proj_info['sg_delivery_fileset']['name'].capitalize() + write_type_profile = self.proj_info['sg_delivery_fileset']['name'].capitalize() + + # Main handler area for knob changed if knob.name() == "tk_profile_list": # change the profile for the specified node: @@ -2783,6 +2836,7 @@ def __on_knob_changed(self): new_output_name = node.knob("name").value() self.__set_output(node, new_output_name) elif knob.name() == "name": + nuke.tprint(knob.name()) # node name has changed: if write_type != "Version": if node.knob(TankWriteNodeHandler.USE_NAME_AS_OUTPUT_KNOB_NAME).value(): @@ -2810,7 +2864,7 @@ def __on_knob_changed(self): self.__set_project_crop(node, False) self.__write_type_changed(node, True) self.__test_write_message() - # self.__version_up_visible(node, False) + self.__embedded_format_option(node, False) else: self.__set_project_crop(node, False) self.__write_type_changed(node, True) @@ -2892,6 +2946,8 @@ def __on_knob_changed(self): node.node("Write1").knob("datatype").setValue(knob.value()) except: pass + elif knob.name() == "convert_to_write": + self.convert_sg_to_nuke_write_nodes(selected_node=node) elif knob.name() == "auto_crop": try: node.node("Write1").knob("autocrop").setValue(knob.value()) From 7e6115e8d5c81a83b5bc1c23de998c0377d1ef58 Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 2 Nov 2018 14:11:25 +0000 Subject: [PATCH 30/90] cleanup --- gizmos/WriteTank.gizmo | 14 +++++++------- python/tk_nuke_writenode/handler.py | 19 ++++++++++--------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 0325c81..3ed5c45 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -121,6 +121,13 @@ Gizmo { t "The path for this write node when rendering in proxy mode" +INVISIBLE } + addUserKnob { + 1 tk_channel_cache + l "" + t "Cache location for user entered text to change the output naming for write nodes" + +STARTLINE + +INVISIBLE + } addUserKnob { 1 tk_last_known_script l "Last Known Script" @@ -327,13 +334,6 @@ Gizmo { 25 "" - STARTLINE } - 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 152ade2..4611aef 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -553,13 +553,14 @@ def convert_sg_to_nuke_write_nodes(self, selected_node=None): new_wn["proxy"].setValue(sg_wn["tk_cached_proxy_path"].evaluate()) else: new_wn["proxy"].setValue("") - # Copy across colorspace colorspace_name = r'default \((\w{1,9})\)' - if re.match(colorspace_name, sg_wn['colorspace'].value()): - new_wn['colorspace'].setValue(re.match(colorspace_name, - sg_wn['colorspace'].value()).group(1)) + colorspace_match = re.match(colorspace_name, sg_wn['colorspace'].value()) + if colorspace_match: + new_wn['colorspace'].setValue(colorspace_match.group(1)) + nuke.tprint("Setting colorspace to %s" % colorspace_match.group(1)) else: + nuke.tprint("Setting colorspace to default") new_wn['colorspace'].setValue(sg_wn['colorspace'].value()) # make sure file_type is set properly: @@ -603,7 +604,7 @@ def convert_sg_to_nuke_write_nodes(self, selected_node=None): new_wn.addKnob(knob) # channels - knob = nuke.String_Knob("tk_channels") + knob = nuke.String_Knob("tk_channel_cache") knob.setValue(sg_wn["channels"].value()) new_wn.addKnob(knob) @@ -733,7 +734,7 @@ 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()) + new_sg_wn["tk_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 @@ -1628,7 +1629,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 node.knob('tank_channel_cache').value() == "": + if node.knob('tk_channel_cache').value() == "": nuke.tprint("No cached channel info") if profile_name == "Dpx": node.knob('dpx_datatype').setVisible(True) @@ -1658,7 +1659,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False else: nuke.tprint("No profile with that name") else: - profile_channel = node.knob('tank_channel_cache').value() + profile_channel = node.knob('tk_channel_cache').value() nuke.tprint("Cached channel info: %s" % profile_channel) self.__update_knob_value(node, "channels", profile_channel) @@ -2803,6 +2804,7 @@ def __on_knob_changed(self): node = nuke.thisNode() knob = nuke.thisKnob() grp = nuke.thisGroup() + if not self.__is_node_fully_constructed(node): # knobChanged will be called during script load for all knobs with non-default # values. We want to ignore these implicit changes so we make use of a knob to @@ -2990,7 +2992,6 @@ def __on_knob_changed(self): % (grp.name(), knob_name, grp.name(), write_node.name(), knob_name)) write_node.knob(knob_name).setValue(nuke.thisKnob().value()) - def __get_current_script_path(self): """ Get the current script path (if the current script has been saved). This will From 467692398cafc116d196ed5f43d82b7029e47a54 Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 2 Nov 2018 14:27:02 +0000 Subject: [PATCH 31/90] moved pos of colorspace application --- python/tk_nuke_writenode/handler.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 4611aef..3d34ba5 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -553,15 +553,6 @@ def convert_sg_to_nuke_write_nodes(self, selected_node=None): new_wn["proxy"].setValue(sg_wn["tk_cached_proxy_path"].evaluate()) else: new_wn["proxy"].setValue("") - # Copy across colorspace - colorspace_name = r'default \((\w{1,9})\)' - colorspace_match = re.match(colorspace_name, sg_wn['colorspace'].value()) - if colorspace_match: - new_wn['colorspace'].setValue(colorspace_match.group(1)) - nuke.tprint("Setting colorspace to %s" % colorspace_match.group(1)) - else: - nuke.tprint("Setting colorspace to default") - new_wn['colorspace'].setValue(sg_wn['colorspace'].value()) # make sure file_type is set properly: int_wn = sg_wn.node(TankWriteNodeHandler.WRITE_NODE_NAME) @@ -649,6 +640,16 @@ def convert_sg_to_nuke_write_nodes(self, selected_node=None): knob.setValue(sg_wn["write_type_cache"].value()) new_wn.addKnob(knob) + # Copy across colorspace + colorspace_name = r'default \((\w{1,9})\)' + colorspace_match = re.match(colorspace_name, sg_wn['colorspace'].value()) + if colorspace_match: + new_wn['colorspace'].setValue(str(colorspace_match.group(1))) + nuke.tprint("Setting colorspace to %s" % colorspace_match.group(1)) + else: + nuke.tprint("Setting colorspace to default") + new_wn['colorspace'].setValue(sg_wn['colorspace'].value()) + # delete original node: nuke.delete(sg_wn) From ee9ca17eef9a79a36c4509fbdb1f1ff370844f86 Mon Sep 17 00:00:00 2001 From: daawaa Date: Mon, 5 Nov 2018 12:39:47 +0000 Subject: [PATCH 32/90] removed Final, fixed channels post-convert, hide convert on Versions --- python/tk_nuke_writenode/handler.py | 27 +++++++-------------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 3d34ba5..cacf18f 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -696,7 +696,7 @@ def convert_nuke_to_sg_write_nodes(self): auto_crop = wn.knob("tk_autocrop") 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") + # 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") @@ -730,7 +730,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["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()) @@ -1194,10 +1194,6 @@ 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: @@ -1319,8 +1315,6 @@ 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'] @@ -1345,8 +1339,6 @@ 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'] @@ -1611,8 +1603,6 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False default_value = 309868287 elif write_type == "Cleanup": default_value = 4287911423 - elif write_type == "Final": - default_value = 16711935 elif write_type == "Test": default_value = 4278190081 else: @@ -2444,7 +2434,6 @@ def __compute_render_path_from(self, node, render_template, width, height, outpu if curr_filename and self._script_template and self._script_template.validate(curr_filename): fields = self._script_template.get_fields(curr_filename) if (write_type == "Version" or - write_type == "Final" or write_type == "Test"): pass else: @@ -2683,8 +2672,8 @@ def __setup_new_node(self, node): node.knob('project_crop_bool').setVisible(False) node.knob('shot_ocio_bool').setVisible(False) else: - if (write_type == "Version" or - write_type == "Final"): + if write_type == "Version": + node.knob('convert_to_write').setVisible(False) if self.ctx_info.step['name'] == "Roto": nuke.tprint("Creating Roto SG Write node") self.__update_knob_value(node, "tk_profile_list", "Exr") @@ -2857,8 +2846,8 @@ def __on_knob_changed(self): if self.proj_info['name'] == "Breakdowns": pass else: - if (write_type == "Version" or - write_type == "Final"): + if write_type == "Version": + node.knob('convert_to_write').setVisible(False) self.__set_project_crop(node, True) self.__write_type_changed(node, False) # self.__version_up_visible(node, False) @@ -2869,6 +2858,7 @@ def __on_knob_changed(self): self.__test_write_message() self.__embedded_format_option(node, False) else: + node.knob('convert_to_write').setVisible(True) self.__set_project_crop(node, False) self.__write_type_changed(node, True) write_type_profile = "Exr" @@ -2920,9 +2910,6 @@ def __on_knob_changed(self): self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) # self.__version_up_visible(node, True) - elif write_type == "Final": - 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, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) From 2b4fbdaae16e01918b8dd846d0c84eceeeec8653 Mon Sep 17 00:00:00 2001 From: daawaa Date: Mon, 5 Nov 2018 14:37:46 +0000 Subject: [PATCH 33/90] commented out channels knob --- 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 cacf18f..8ddc79b 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -710,7 +710,7 @@ def convert_nuke_to_sg_write_nodes(self): or not exr_datatype or not dpx_datatype or not auto_crop - or not channels_knob + # or not channels_knob or not render_template_knob or not publish_template_knob or not proxy_render_template_knob From 361ef3cc136a9a187ff182d915463d3115ce0626 Mon Sep 17 00:00:00 2001 From: daawaa Date: Tue, 6 Nov 2018 12:01:09 +0000 Subject: [PATCH 34/90] inpanel = false on all create nodes --- 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 8ddc79b..5e9c3b1 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -294,7 +294,7 @@ def create_new_node(self, profile_name, write_type): return # new node please! - node = nuke.createNode(TankWriteNodeHandler.SG_WRITE_NODE_CLASS) + node = nuke.createNode(TankWriteNodeHandler.SG_WRITE_NODE_CLASS, inpanel = False) # rename to our new default name: existing_node_names = [n.name() for n in nuke.allNodes()] @@ -725,7 +725,7 @@ def convert_nuke_to_sg_write_nodes(self): wn.setName(node_name) # create new Shotgun Write node: - new_sg_wn = nuke.createNode(TankWriteNodeHandler.SG_WRITE_NODE_CLASS) + new_sg_wn = nuke.createNode(TankWriteNodeHandler.SG_WRITE_NODE_CLASS, inpanel = False) 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()) From 61365868f0e350c1898cc36a4b4964ef9919d7e4 Mon Sep 17 00:00:00 2001 From: daawaa Date: Tue, 6 Nov 2018 18:15:08 +0000 Subject: [PATCH 35/90] cleanup of tk_channel_cache issue --- python/tk_nuke_writenode/handler.py | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 5e9c3b1..9427521 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -798,7 +798,6 @@ def convert_nuke_to_sg_write_nodes(self): new_sg_wn.setName(node_name) new_sg_wn.setXpos(node_pos[0]) new_sg_wn.setYpos(node_pos[1]) - ################################################################################################ # Public methods called from gizmo - although these are public, they should # be considered as private and not used directly! @@ -1620,19 +1619,6 @@ 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 node.knob('tk_channel_cache').value() == "": - nuke.tprint("No cached channel info") - if profile_name == "Dpx": - node.knob('dpx_datatype').setVisible(True) - node.knob('exr_datatype').setVisible(False) - node.knob('auto_crop').setVisible(False) - node.knob('auto_crop').setValue(False) - profile_channel = "rgb" - elif profile_name == "Exr": - node.knob('exr_datatype').setVisible(True) - node.knob('dpx_datatype').setVisible(False) - profile_channel = "rgba" - node.node(TankWriteNodeHandler.WRITE_NODE_NAME)['metadata'].setValue('all metadata') node.knob('auto_crop').setVisible(False) if (write_type == "Precomp" or write_type == "Element"): @@ -2735,7 +2721,8 @@ def __is_node_fully_constructed(self, node): if not node.knob("tk_is_fully_constructed"): return False else: - self._app.log_debug("Fully constructed: %s" % node.knob("tk_is_fully_constructed").value()) + pass + # self._app.log_debug("Fully constructed: %s" % node.knob("tk_is_fully_constructed").value()) except: return False From f20e2e426adeb96df41e5716ece9f7f45d7bb538 Mon Sep 17 00:00:00 2001 From: daawaa Date: Tue, 6 Nov 2018 18:21:54 +0000 Subject: [PATCH 36/90] clean and push again --- python/tk_nuke_writenode/handler.py | 44 +++++++++++++++++------------ 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 9427521..e65b4a9 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1619,25 +1619,33 @@ 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" - node.knob('auto_crop').setVisible(False) - if (write_type == "Precomp" or - write_type == "Element"): - profile_channel = "rgba" - node.knob('auto_crop').setVisible(True) - node.knob('auto_crop').setValue(True) - if self.ctx_info.step['name'] == "Roto": - node.knob('auto_crop').setVisible(True) - profile_channel = "all" - elif profile_name == "Jpeg": - node.knob('dpx_datatype').setVisible(False) - node.knob('exr_datatype').setVisible(False) - node.knob('auto_crop').setVisible(False) - profile_channel = "rgb" - else: - nuke.tprint("No profile with that name") + if profile_name == "Dpx": + node.knob('dpx_datatype').setVisible(True) + node.knob('exr_datatype').setVisible(False) + node.knob('auto_crop').setVisible(False) + node.knob('auto_crop').setValue(False) + profile_channel = "rgb" + elif profile_name == "Exr": + node.knob('exr_datatype').setVisible(True) + node.knob('dpx_datatype').setVisible(False) + profile_channel = "rgba" + node.node(TankWriteNodeHandler.WRITE_NODE_NAME)['metadata'].setValue('all metadata') + node.knob('auto_crop').setVisible(False) + if (write_type == "Precomp" or + write_type == "Element"): + profile_channel = "rgba" + node.knob('auto_crop').setVisible(True) + node.knob('auto_crop').setValue(True) + if self.ctx_info.step['name'] == "Roto": + node.knob('auto_crop').setVisible(True) + profile_channel = "all" + elif profile_name == "Jpeg": + node.knob('dpx_datatype').setVisible(False) + node.knob('exr_datatype').setVisible(False) + node.knob('auto_crop').setVisible(False) + profile_channel = "rgb" else: - profile_channel = node.knob('tk_channel_cache').value() - nuke.tprint("Cached channel info: %s" % profile_channel) + nuke.tprint("No profile with that name") self.__update_knob_value(node, "channels", profile_channel) From 06f395206d775727d7cc0da32e8f60fc4cc30c09 Mon Sep 17 00:00:00 2001 From: daawaa Date: Tue, 6 Nov 2018 18:46:31 +0000 Subject: [PATCH 37/90] fixed roto HD issue --- 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 e65b4a9..3d1ad1c 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1803,7 +1803,9 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False elif (self.ctx_info.step['name'] == "Roto"):#and # self.proj_info['sg_project_color_management'] != "OCIO" or # self.proj_info['sg_project_color_management'] == "OCIO"): - color_space = "linear" + color_space = "linear" + node.knob("project_crop_bool").setValue(False) + self.__embedded_format_option(node, False) nuke.tprint("--- Setting colorspace to %s for Roto" % color_space) else: color_space = next((color for color in node.knob('colorspace').values() if 'default' in color), None) @@ -2847,6 +2849,8 @@ def __on_knob_changed(self): self.__write_type_changed(node, False) # self.__version_up_visible(node, False) self.__embedded_format_option(node, True) + if self.ctx_info.step['name'] == "Roto": + self.__set_project_crop(node, False) elif write_type == "Test": self.__set_project_crop(node, False) self.__write_type_changed(node, True) From 760a6b62924a87d42745d15fbea01045e00992d0 Mon Sep 17 00:00:00 2001 From: daawaa Date: Wed, 7 Nov 2018 17:17:29 +0000 Subject: [PATCH 38/90] autocrop on for Roto Version --- 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 3d1ad1c..5abe3b6 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1638,6 +1638,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False node.knob('auto_crop').setValue(True) if self.ctx_info.step['name'] == "Roto": node.knob('auto_crop').setVisible(True) + node.knob('auto_crop').setValue(True) profile_channel = "all" elif profile_name == "Jpeg": node.knob('dpx_datatype').setVisible(False) From 204edafe6cb3b182bf44cb2abe5a065571232309 Mon Sep 17 00:00:00 2001 From: daawaa Date: Wed, 7 Nov 2018 17:36:14 +0000 Subject: [PATCH 39/90] autocrop on embed Write on for certain profile types --- python/tk_nuke_writenode/handler.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 5abe3b6..9ad00cc 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1636,10 +1636,12 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False profile_channel = "rgba" node.knob('auto_crop').setVisible(True) node.knob('auto_crop').setValue(True) + node.node("Write1").knob("autocrop").setValue(True) if self.ctx_info.step['name'] == "Roto": - node.knob('auto_crop').setVisible(True) - node.knob('auto_crop').setValue(True) profile_channel = "all" + node.knob('auto_crop').setVisible(True) + node.knob('auto_crop').setValue(True) + node.node("Write1").knob("autocrop").setValue(True) elif profile_name == "Jpeg": node.knob('dpx_datatype').setVisible(False) node.knob('exr_datatype').setVisible(False) @@ -2866,7 +2868,6 @@ def __on_knob_changed(self): self.__embedded_format_option(node, False) try: node.node("Write1").knob("autocrop").setValue(True) - node.node("Write1").knob("autocrop").setValue(True) except: pass From fa2e3e2457bc8a449a3070041c25a68d5e56f16d Mon Sep 17 00:00:00 2001 From: daawaa Date: Thu, 8 Nov 2018 13:28:48 +0000 Subject: [PATCH 40/90] caching project reformat bool for reopen/convert --- gizmos/WriteTank.gizmo | 6 +++++ python/tk_nuke_writenode/handler.py | 35 ++++++++++++++++++++++++----- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 3ed5c45..5206f1b 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -270,6 +270,12 @@ Gizmo { t "The cached Write Type for this node" +INVISIBLE } + addUserKnob { + 1 tk_project_format_cache + l "Project Format Cache" + t "The cached option to apply the Project format" + +INVISIBLE + } addUserKnob { 25 "" - STARTLINE diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 9ad00cc..4fbb586 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -640,6 +640,14 @@ def convert_sg_to_nuke_write_nodes(self, selected_node=None): knob.setValue(sg_wn["write_type_cache"].value()) new_wn.addKnob(knob) + # project bool + knob = nuke.String_Knob("tk_project_format_cache") + if sg_wn["project_crop_bool"].value(): + knob.setValue("True") + else: + knob.setValue("False") + new_wn.addKnob(knob) + # Copy across colorspace colorspace_name = r'default \((\w{1,9})\)' colorspace_match = re.match(colorspace_name, sg_wn['colorspace'].value()) @@ -702,6 +710,7 @@ def convert_nuke_to_sg_write_nodes(self): 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") + project_format_knob = wn.knob("tk_project_format_cache") if (not profile_knob or not output_knob @@ -710,7 +719,8 @@ def convert_nuke_to_sg_write_nodes(self): or not exr_datatype or not dpx_datatype or not auto_crop - # or not channels_knob + # or not channels_knob + or not project_format_knob or not render_template_knob or not publish_template_knob or not proxy_render_template_knob @@ -791,8 +801,14 @@ def convert_nuke_to_sg_write_nodes(self): ac_val = True else: ac_val = False + new_sg_wn["auto_crop"].setValue(ac_val) - new_sg_wn["auto_crop"].setValue(ac_val) + # project format + if project_format_knob.value() == "True": + project_format_val = True + elif project_format_knob.value() == "False": + project_format_val = False + new_sg_wn["project_crop_bool"].setValue(project_format_val) # rename new node: new_sg_wn.setName(node_name) @@ -2684,8 +2700,10 @@ def __setup_new_node(self, node): node.node("project_reformat")['disable'].setValue(True) else: node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - node.knob("project_crop_bool").setValue(True) node.node("project_reformat")['disable'].setValue(False) + node.knob("project_crop_bool").setValue(True) + if node['tk_project_format_cache'].value() == "False": + node.knob("project_crop_bool").setValue(False) if self._curr_entity_type == 'Asset': if write_type == "Version": node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) @@ -2780,8 +2798,13 @@ def __embedded_ocio_option(self, node, value): elif value == False: node.node("shot_ocio")['disable'].setValue(True) - def __set_project_crop(self, node, bool): - node["project_crop_bool"].setValue(bool) + def __set_project_crop(self, node, bool_value): + node["project_crop_bool"].setValue(bool_value) + + def __set_project_crop_cache(self, node, bool_value): + if not bool_value: + node['tk_project_format_cache'].setValue("False") + nuke.tprint("Disabling project reformat and caching.") def __on_knob_changed(self): """ @@ -2925,6 +2948,7 @@ def __on_knob_changed(self): webbrowser.open_new_tab(write_type_url) elif knob.name() == "project_crop_bool": self.__embedded_format_option(node, knob.value()) + self.__set_project_crop_cache(node, knob.value()) elif knob.name() == "shot_ocio_bool": self.__embedded_ocio_option(node, knob.value()) elif knob.name() == "exr_datatype": @@ -2981,6 +3005,7 @@ def __on_knob_changed(self): % (grp.name(), knob_name, grp.name(), write_node.name(), knob_name)) write_node.knob(knob_name).setValue(nuke.thisKnob().value()) + def __get_current_script_path(self): """ Get the current script path (if the current script has been saved). This will From d27d4f7fc6f69a3bf978a2bf95b4581096d09c4d Mon Sep 17 00:00:00 2001 From: daawaa Date: Tue, 13 Nov 2018 14:25:01 +0000 Subject: [PATCH 41/90] fixed cached proj bool issue --- python/tk_nuke_writenode/handler.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 4fbb586..e1b1c6a 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -2701,9 +2701,13 @@ def __setup_new_node(self, node): else: node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) node.node("project_reformat")['disable'].setValue(False) - node.knob("project_crop_bool").setValue(True) + # node.knob("project_crop_bool").setValue(True) if node['tk_project_format_cache'].value() == "False": node.knob("project_crop_bool").setValue(False) + elif node['tk_project_format_cache'].value() == "True": + node.knob("project_crop_bool").setValue(True) + else: + node.knob("project_crop_bool").setValue(True) if self._curr_entity_type == 'Asset': if write_type == "Version": node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) @@ -2802,7 +2806,11 @@ def __set_project_crop(self, node, bool_value): node["project_crop_bool"].setValue(bool_value) def __set_project_crop_cache(self, node, bool_value): - if not bool_value: + + if bool_value == True: + nuke.tprint("Enabling project reformat and caching.") + node['tk_project_format_cache'].setValue("True") + elif bool_value == False: node['tk_project_format_cache'].setValue("False") nuke.tprint("Disabling project reformat and caching.") From 7a91d2614f412a146eb59067deb01dbbe7f6bb8b Mon Sep 17 00:00:00 2001 From: daawaa Date: Tue, 13 Nov 2018 14:56:03 +0000 Subject: [PATCH 42/90] added format dsiable when proj_bool selected --- 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 e1b1c6a..5efa6bb 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -2695,19 +2695,22 @@ def __setup_new_node(self, node): node.knob('write_type').setValues(['Version', 'Denoise']) node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) node.knob("project_crop_bool").setValue(False) + self.__embedded_format_option(node, False) node.node("project_reformat")['disable'].setValue(True) elif self.ctx_info.step['name'] == "Cleanup": node.node("project_reformat")['disable'].setValue(True) else: node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) node.node("project_reformat")['disable'].setValue(False) - # node.knob("project_crop_bool").setValue(True) if node['tk_project_format_cache'].value() == "False": node.knob("project_crop_bool").setValue(False) + self.__embedded_format_option(node, False) elif node['tk_project_format_cache'].value() == "True": - node.knob("project_crop_bool").setValue(True) + node.knob("project_crop_bool").setValue(True) + self.__embedded_format_option(node, True) else: - node.knob("project_crop_bool").setValue(True) + node.knob("project_crop_bool").setValue(True) + self.__embedded_format_option(node, True) if self._curr_entity_type == 'Asset': if write_type == "Version": node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) From 9f01b3bf115779eb65da3e7569560f70d54d8aa8 Mon Sep 17 00:00:00 2001 From: daawaa Date: Thu, 15 Nov 2018 11:29:00 +0000 Subject: [PATCH 43/90] wip --- python/tk_nuke_writenode/handler.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 4fbb586..2389a6c 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1782,6 +1782,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False if len(sg_info_nodes)==1: main_plate_name = sg_info_nodes[0]['main_plate_name'].value() if not main_plate_name: + nuke.message("WARNING:\nOCIO is a requirement for this shot but required info cannot be found.") pass else: in_color_space = next((color for color in shot_ocio['in_colorspace'].values() if main_plate_name in color), None) @@ -1796,6 +1797,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False node['shot_ocio_bool'].setValue(False) shot_ocio['disable'].setValue(True) else: + nuke.tprint("Step is", self.ctx_info.step['name']) if (self.ctx_info.step['name'] == 'Comp_Texture' or self.ctx_info.step['name'] == 'Comp_Warp'): node['shot_ocio_bool'].setValue(False) From b4ea29bca7118e3649aed4c754f17472dfa123e1 Mon Sep 17 00:00:00 2001 From: daawaa Date: Thu, 15 Nov 2018 14:25:55 +0000 Subject: [PATCH 44/90] working currently - artist to test --- gizmos/WriteTank.gizmo | 12 ++++- info.yml | 7 ++- python/tk_nuke_writenode/handler.py | 68 ++++++++++++++++++++--------- 3 files changed, 65 insertions(+), 22 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 5206f1b..45bcebf 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -71,6 +71,12 @@ Gizmo { t "The Sgtk test template associated with this node" +INVISIBLE } + addUserKnob { + 1 matte_render_template + l "Sgtk Matte Template" + t "The Sgtk matte template associated with this node" + +INVISIBLE + } addUserKnob { 6 tk_is_fully_constructed l "Is Fully Constructed" @@ -252,7 +258,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 Test Matte} } addUserKnob { 22 write_type_info @@ -591,6 +597,10 @@ Reformat { pbb false disable true } + Clamp { + name matte_clamp + disable true + } AddTimeCode { startcode 01:00:00:01 name project_tc diff --git a/info.yml b/info.yml index 1d099b0..ec86fdd 100644 --- a/info.yml +++ b/info.yml @@ -90,7 +90,12 @@ configuration: type: template fields: context, version, SEQ, [channel], [output], [name], [width], [height], [eye], * allows_empty: True - default_value: null + default_value: null + matte_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 4fbb586..319b8fb 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -45,6 +45,7 @@ class TankWriteNodeHandler(object): EMBED_SHOT_OCIO = "shot_ocio" EMBED_PROJECT_REFORMAT = "project_reformat" EMBED_DELIVERY_REFORMAT = "delivery_reformat" + EMBED_MATTE_CLAMP = "matte_clamp" OUTPUT_KNOB_NAME = "tank_channel" USE_NAME_AS_OUTPUT_KNOB_NAME = "tk_use_name_as_channel" @@ -455,12 +456,16 @@ def create_project_settings_group(self, node): content_metadata['name'].setValue("content_meta_data") shot_ocio = nuke.createNode("OCIOColorSpace", inpanel = False) shot_ocio['name'].setValue("shot_ocio") - input_node = nuke.createNode("Output", inpanel = False) + matte_clamp = nuke.createNode("Clamp", inpanel = False) + matte_clamp['name'].setValue("matte_clamp") + # matte_clamp['disable'].setValue(True) + output_node = nuke.createNode("Output", inpanel = False) proj_group_nodes.append(project_reformat) proj_group_nodes.append(delivery_reformat) proj_group_nodes.append(project_tc) proj_group_nodes.append(content_metadata) - proj_group_nodes.append(shot_ocio) + proj_group_nodes.append(shot_ocio) + proj_group_nodes.append(matte_clamp) project_group_process.end() project_group.setXpos(nodePos[0]) @@ -545,8 +550,9 @@ def convert_sg_to_nuke_write_nodes(self, selected_node=None): extra_node.node('shot_ocio')['in_colorspace'].setValue(sg_wn.node('shot_ocio')['in_colorspace'].value()) extra_node.node('shot_ocio')['in_colorspace'].setValue(sg_wn.node('shot_ocio')['in_colorspace'].value()) extra_node.node('shot_ocio')['disable'].setValue(sg_wn.node('shot_ocio')['disable'].value()) - - + # Embed matte + extra_node.node('matte_clamp')['disable'].setValue(sg_wn.node('matte_clamp')['disable'].value()) + # copy across file & proxy knobs (if we've defined a proxy template): new_wn["file"].setValue(sg_wn["cached_path"].evaluate()) if sg_wn["proxy_render_template"].value(): @@ -1213,6 +1219,10 @@ def __get_render_template(self, node, write_type, is_proxy=False, fallback_to_re template = self.__get_template(node, "test_render_template") if template or not fallback_to_render: return template + elif write_type == "Matte": + template = self.__get_template(node, "matte_render_template") + if template or not fallback_to_render: + return template else: return self.__get_template(node, "render_template") @@ -1330,6 +1340,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 == "Matte": + context_info = self._app.tank.templates['shot_render_global'] else: context_info = self._app.tank.templates['shot_render_global'] @@ -1354,6 +1366,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 == "Matte": + context_info = self._app.tank.templates['asset_render_global'] else: context_info = self._app.tank.templates['asset_render_global'] @@ -1470,6 +1484,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False 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"]) + matte_render_template = self._app.get_template_by_name(profile["matte_render_template"]) file_type = profile["file_type"] file_settings = profile["settings"] @@ -1509,6 +1524,8 @@ 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'}) nuke.tprint("Applying ZIP compression to %s output." % write_type) + elif (file_type == "dpx" and write_type == "Matte"): + self.__update_knob_value(node, 'exr_datatype', '16 bit half') promote_write_knobs = profile.get("promote_write_knobs", []) # Make sure any invalid entries are removed from the profile list: @@ -1601,6 +1618,8 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False final_render_template.name) self.__update_knob_value(node, "test_render_template", test_render_template.name) + self.__update_knob_value(node, "matte_render_template", + matte_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: @@ -1620,6 +1639,8 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False default_value = 4287911423 elif write_type == "Test": default_value = 4278190081 + elif write_type == "Matte": + default_value = 572662527 else: default_value = int(node["tile_color"].defaultValue()) @@ -1681,7 +1702,8 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False delivery_reformat = node.node(TankWriteNodeHandler.EMBED_DELIVERY_REFORMAT) time_code = node.node(TankWriteNodeHandler.EMBED_TIME_CODE) content_meta_data = node.node(TankWriteNodeHandler.EMBED_META_DATA) - shot_ocio = node.node(TankWriteNodeHandler.EMBED_SHOT_OCIO) + shot_ocio = node.node(TankWriteNodeHandler.EMBED_SHOT_OCIO) + matte_clamp = node.node(TankWriteNodeHandler.EMBED_MATTE_CLAMP) proj_fps = self.proj_info['sg_frame_rate'] timecode = "01:00:00:01" @@ -1727,6 +1749,13 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False project_reformat.knobs()["format"].setValue(main_format) + + # Embed clamp + if write_type == "Matte": + matte_clamp['disable'].setValue(False) + else: + matte_clamp['disable'].setValue(True) + # Set the embeded delivery reformat next if not (self.proj_info['sg_delivery_format_width'] and self.proj_info['sg_delivery_format_height']): @@ -1819,6 +1848,9 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False nuke.tprint("--- Could not get color space info. Setting default value of %s." % color_space) else: nuke.tprint("--- Setting colorspace to %s from Projects page." % color_space) + elif (self.ctx_info.step['name'] != "Roto" and + write_type == "Matte"): + color_space = "linear" elif (self.ctx_info.step['name'] == "Roto"):#and # self.proj_info['sg_project_color_management'] != "OCIO" or # self.proj_info['sg_project_color_management'] == "OCIO"): @@ -2678,7 +2710,7 @@ def __setup_new_node(self, node): # now that the node is constructed, we can process # knob changes correctly. self.__set_final_construction_flag(node, True) - + # set the write type for creation of correct output write_type = self.get_node_write_type_name(node) if self._curr_entity_type == 'Shot': @@ -2873,7 +2905,6 @@ def __on_knob_changed(self): node.knob('convert_to_write').setVisible(False) self.__set_project_crop(node, True) self.__write_type_changed(node, False) - # self.__version_up_visible(node, False) self.__embedded_format_option(node, True) if self.ctx_info.step['name'] == "Roto": self.__set_project_crop(node, False) @@ -2882,12 +2913,16 @@ def __on_knob_changed(self): self.__write_type_changed(node, True) self.__test_write_message() self.__embedded_format_option(node, False) + elif write_type == "Matte": + self.__set_project_crop(node, True) + self.__write_type_changed(node, True) + self.__embedded_format_option(node, True) + write_type_profile = "Dpx" else: node.knob('convert_to_write').setVisible(True) self.__set_project_crop(node, False) self.__write_type_changed(node, True) - write_type_profile = "Exr" - # self.__version_up_visible(node, True) + write_type_profile = "Exr" self.__embedded_format_option(node, False) try: node.node("Write1").knob("autocrop").setValue(True) @@ -2914,30 +2949,23 @@ 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.__version_up_visible(node, False) - elif write_type == "Precomp": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) - # self.__version_up_visible(node, True) + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) write_type_profile = "Exr" elif write_type == "Element": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) - # self.__version_up_visible(node, True) write_type_profile = "Exr" elif write_type == "Denoise": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - # self.__version_up_visible(node, True) + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) elif write_type == "Cleanup": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - # self.__version_up_visible(node, True) + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) elif write_type == "Test": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) - # self.__version_up_visible(node, False) + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) self.__test_write_message() # Updates the predefined profile based on the write type self.__update_knob_value(node, "tk_profile_list", write_type_profile) From 499185292acd61327be26452a1cc126e0d9e5139 Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 16 Nov 2018 17:53:41 +0000 Subject: [PATCH 45/90] sanity test for ocio --- gizmos/WriteTank.gizmo | 10 +++++++++- python/tk_nuke_writenode/handler.py | 23 ++++++++++++++++------- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 5206f1b..4e48af5 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -308,7 +308,15 @@ Gizmo { t "Choose to apply the embeded shot OCIO." +STARTLINE -INVISIBLE - } + } + addUserKnob { + 26 ocio_warning + l "Ocio Warning" + T "" + t "Flag with the artist if the OCIO is not being applied." + +STARTLINE + +INVISIBLE + } addUserKnob { 25 "" - STARTLINE diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 2389a6c..61bd913 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -94,10 +94,11 @@ def __init__(self, app): 'sg_delivery_fileset_compression', 'sg_color_space', 'sg_project_color_management']) - # self.shot_info = self.sg.find_one("Shot", - # [['id', 'is', self._entity['id']]], - # ['name', - # 'sg_main_plate']) + self.shot_info = self.sg.find_one("Shot", + [['id', 'is', self._entity['id']]], + ['name', + 'sg_main_plate', + 'sg_without_ocio']) # self.software_info = self.sg.find_one("Software", # [['id', 'is_not', 0], # ['code', 'is', 'RV']], @@ -1767,6 +1768,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False nuke.tprint("Missing info from SG Projects") # Set colorspace based of SG values + nuke.tprint(self.shot_info) color_space = None if self.proj_info['sg_color_space']: if self.proj_info['sg_project_color_management'] == "OCIO": @@ -1786,13 +1788,21 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False pass else: in_color_space = next((color for color in shot_ocio['in_colorspace'].values() if main_plate_name in color), None) + # Check of the colorspace exists within the embed shot ocio node if in_color_space: nuke.tprint("Setting internal OCIO in_colorspace to: %s" % main_plate_name) shot_ocio['in_colorspace'].setValue(main_plate_name) shot_ocio['disable'].setValue(False) + self.__update_knob_value(node, "ocio_warning", "") + node.knob("ocio_warning").setVisible(False) else: - shot_ocio['disable'].setValue(True) + shot_ocio['disable'].setValue(True) + ocio_warning += "OCIO not applied!
" + self.__update_knob_value(node, "ocio_warning", "".join(self.__wrap_text(ocio_warning, 100))) + node.knob("ocio_warning").setVisible(True) nuke.tprint("No in_colorspace value called: %s. Skipping..." % main_plate_name) + + # Set OCIO based on task type if write_type != "Version": node['shot_ocio_bool'].setValue(False) shot_ocio['disable'].setValue(True) @@ -1808,6 +1818,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False else: nuke.message("Could not find SG Info node that is required for OCIO color setup.") else: + # Nuke default - disabling OCIO color_space = self.proj_info['sg_color_space'] node['shot_ocio_bool'].setValue(False) node['shot_ocio_bool'].setVisible(False) @@ -1822,8 +1833,6 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False else: nuke.tprint("--- Setting colorspace to %s from Projects page." % color_space) elif (self.ctx_info.step['name'] == "Roto"):#and - # self.proj_info['sg_project_color_management'] != "OCIO" or - # self.proj_info['sg_project_color_management'] == "OCIO"): color_space = "linear" node.knob("project_crop_bool").setValue(False) self.__embedded_format_option(node, False) From eef87e3fce613326b4751be6333308bac4cf3bc2 Mon Sep 17 00:00:00 2001 From: daawaa Date: Sun, 18 Nov 2018 11:14:39 +0000 Subject: [PATCH 46/90] wip --- python/tk_nuke_writenode/handler.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 319b8fb..0ff43ee 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -2719,7 +2719,8 @@ def __setup_new_node(self, node): node.knob('project_crop_bool').setVisible(False) node.knob('shot_ocio_bool').setVisible(False) else: - if write_type == "Version": + if (write_type == "Version" or + write_type == "Matte"): node.knob('convert_to_write').setVisible(False) if self.ctx_info.step['name'] == "Roto": nuke.tprint("Creating Roto SG Write node") @@ -2740,7 +2741,7 @@ def __setup_new_node(self, node): if write_type == "Version": node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) node.node("project_reformat")['disable'].setValue(True) - node.knob('project_crop_bool').setVisible(False) + node.knob('project_crop_bool').setVisible(False) # 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: @@ -2901,23 +2902,24 @@ def __on_knob_changed(self): if self.proj_info['name'] == "Breakdowns": pass else: - if write_type == "Version": + if (write_type == "Version" or + write_type == "Matte"): node.knob('convert_to_write').setVisible(False) self.__set_project_crop(node, True) self.__write_type_changed(node, False) self.__embedded_format_option(node, True) if self.ctx_info.step['name'] == "Roto": self.__set_project_crop(node, False) + # elif write_type == "Matte": + # self.__set_project_crop(node, True) + # self.__write_type_changed(node, False) + # self.__embedded_format_option(node, True) + # write_type_profile = "Dpx" elif write_type == "Test": self.__set_project_crop(node, False) self.__write_type_changed(node, True) self.__test_write_message() self.__embedded_format_option(node, False) - elif write_type == "Matte": - self.__set_project_crop(node, True) - self.__write_type_changed(node, True) - self.__embedded_format_option(node, True) - write_type_profile = "Dpx" else: node.knob('convert_to_write').setVisible(True) self.__set_project_crop(node, False) From 809dbbbbd7343308a2ba7473c29f8c105182bac8 Mon Sep 17 00:00:00 2001 From: daawaa Date: Sun, 18 Nov 2018 12:47:00 +0000 Subject: [PATCH 47/90] added ocio warning and conversion now keeps ocio bool --- gizmos/WriteTank.gizmo | 9 ++- python/tk_nuke_writenode/handler.py | 94 +++++++++++++++++------------ 2 files changed, 61 insertions(+), 42 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 4e48af5..5dbfef2 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -276,6 +276,12 @@ Gizmo { t "The cached option to apply the Project format" +INVISIBLE } + addUserKnob { + 1 tk_apply_ocio_cache + l "Apply OCIO apply Cache" + t "The cached option to apply the Project format" + +INVISIBLE + } addUserKnob { 25 "" - STARTLINE @@ -314,8 +320,7 @@ Gizmo { l "Ocio Warning" T "" t "Flag with the artist if the OCIO is not being applied." - +STARTLINE - +INVISIBLE + +STARTLINE } addUserKnob { 25 "" diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 61bd913..0bb25f5 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -648,7 +648,15 @@ def convert_sg_to_nuke_write_nodes(self, selected_node=None): else: knob.setValue("False") new_wn.addKnob(knob) - + + # ocio bool + knob = nuke.String_Knob("tk_apply_ocio_cache") + if sg_wn["shot_ocio_bool"].value(): + knob.setValue("True") + else: + knob.setValue("False") + new_wn.addKnob(knob) + # Copy across colorspace colorspace_name = r'default \((\w{1,9})\)' colorspace_match = re.match(colorspace_name, sg_wn['colorspace'].value()) @@ -712,7 +720,8 @@ def convert_nuke_to_sg_write_nodes(self): proxy_publish_template_knob = wn.knob("tk_proxy_publish_template") tk_tank_channel = wn.knob("tk_tank_channel") project_format_knob = wn.knob("tk_project_format_cache") - + shot_ocio_knob = wn.knob("tk_apply_ocio_cache") + if (not profile_knob or not output_knob or not use_name_as_output_knob @@ -722,6 +731,7 @@ def convert_nuke_to_sg_write_nodes(self): or not auto_crop # or not channels_knob or not project_format_knob + or not shot_ocio_knob or not render_template_knob or not publish_template_knob or not proxy_render_template_knob @@ -811,6 +821,13 @@ def convert_nuke_to_sg_write_nodes(self): project_format_val = False new_sg_wn["project_crop_bool"].setValue(project_format_val) + # shot ocio + if shot_ocio_knob.value() == "True": + shot_ocio_val = True + elif shot_ocio_knob.value() == "False": + shot_ocio_val = False + new_sg_wn["shot_ocio_bool"].setValue(shot_ocio_val) + # rename new node: new_sg_wn.setName(node_name) new_sg_wn.setXpos(node_pos[0]) @@ -1766,42 +1783,33 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False node.node("delivery_reformat")['disable'].setValue(False) else: nuke.tprint("Missing info from SG Projects") - - # Set colorspace based of SG values - nuke.tprint(self.shot_info) + + # Set internal ocio if required color_space = None if self.proj_info['sg_color_space']: - if self.proj_info['sg_project_color_management'] == "OCIO": + if (self.proj_info['sg_project_color_management'] == "OCIO" and not + self.shot_info['sg_without_ocio']): color_space = "acescg" - if (not nuke.root()['customOCIOConfigPath'].value() - and not nuke.root()['colorManagement'].value() == "OCIO"): - shot_ocio['disable'].setValue(True) + ocio_warning = "" + sg_info_nodes = [n for n in self.get_nodes_by_class('SGInfoNode')] + if not sg_info_nodes: + nuke.message("Could not find SG Info node that is required for OCIO color setup.") + shot_ocio['disable'].setValue(True) else: - sg_info_nodes = [n for n in self.get_nodes_by_class('SGInfoNode')] - if not sg_info_nodes: - pass - else: - if len(sg_info_nodes)==1: - main_plate_name = sg_info_nodes[0]['main_plate_name'].value() - if not main_plate_name: - nuke.message("WARNING:\nOCIO is a requirement for this shot but required info cannot be found.") - pass - else: - in_color_space = next((color for color in shot_ocio['in_colorspace'].values() if main_plate_name in color), None) - # Check of the colorspace exists within the embed shot ocio node - if in_color_space: - nuke.tprint("Setting internal OCIO in_colorspace to: %s" % main_plate_name) - shot_ocio['in_colorspace'].setValue(main_plate_name) - shot_ocio['disable'].setValue(False) - self.__update_knob_value(node, "ocio_warning", "") - node.knob("ocio_warning").setVisible(False) - else: - shot_ocio['disable'].setValue(True) - ocio_warning += "OCIO not applied!
" - self.__update_knob_value(node, "ocio_warning", "".join(self.__wrap_text(ocio_warning, 100))) - node.knob("ocio_warning").setVisible(True) - nuke.tprint("No in_colorspace value called: %s. Skipping..." % main_plate_name) - + if len(sg_info_nodes)==1: + main_plate_name = sg_info_nodes[0]['main_plate_name'].value() + if not main_plate_name: + nuke.message("WARNING:\nOCIO is a requirement for this shot but required info cannot be found.") + pass + else: + in_color_space = next((color for color in shot_ocio['in_colorspace'].values() if main_plate_name in color), None) + # Check of the colorspace exists within the embed shot ocio node + if in_color_space: + nuke.tprint("Setting internal OCIO in_colorspace to: %s" % main_plate_name) + shot_ocio['in_colorspace'].setValue(main_plate_name) + shot_ocio['disable'].setValue(False) + ocio_warning += "OCIO Found and set.
" + self.__update_knob_value(node, "ocio_warning", "".join(self.__wrap_text(ocio_warning, 100))) # Set OCIO based on task type if write_type != "Version": node['shot_ocio_bool'].setValue(False) @@ -1815,18 +1823,25 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False else: node['shot_ocio_bool'].setValue(True) shot_ocio['disable'].setValue(False) - else: - nuke.message("Could not find SG Info node that is required for OCIO color setup.") + else: + nuke.tprint("!!! Could not set internal OCIO in color value to %s" % main_plate_name) + shot_ocio['disable'].setValue(True) + node['shot_ocio_bool'].setValue(False) + ocio_warning += "Warning. OCIO could not set!
" + self.__update_knob_value(node, "ocio_warning", "".join(self.__wrap_text(ocio_warning, 100))) + else: # Nuke default - disabling OCIO + nuke.tprint("Disabling OCIO related settings.") color_space = self.proj_info['sg_color_space'] node['shot_ocio_bool'].setValue(False) node['shot_ocio_bool'].setVisible(False) - shot_ocio['disable'].setValue(True) + shot_ocio['disable'].setValue(True) + node.knob("ocio_warning").setVisible(True) + # Set colorspace based of SG values if (self.ctx_info.step['name'] != "Roto" and write_type == "Version"): - color_space = self.proj_info['sg_color_space'] if color_space not in node.knob('colorspace').values(): color_space = next((color for color in node.knob('colorspace').values() if 'default' in color), None) nuke.tprint("--- Could not get color space info. Setting default value of %s." % color_space) @@ -2861,8 +2876,7 @@ def __on_knob_changed(self): # force output name to be the node name: new_output_name = node.knob("name").value() self.__set_output(node, new_output_name) - elif knob.name() == "name": - nuke.tprint(knob.name()) + elif knob.name() == "name": # node name has changed: if write_type != "Version": if node.knob(TankWriteNodeHandler.USE_NAME_AS_OUTPUT_KNOB_NAME).value(): From 808652e2c272d6d30b2643d1234a9e48be2bb087 Mon Sep 17 00:00:00 2001 From: daawaa Date: Sun, 18 Nov 2018 15:14:59 +0000 Subject: [PATCH 48/90] wipto get HD and detail --- python/tk_nuke_writenode/handler.py | 30 +++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 0ff43ee..4ab5714 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1524,8 +1524,6 @@ 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'}) nuke.tprint("Applying ZIP compression to %s output." % write_type) - elif (file_type == "dpx" and write_type == "Matte"): - self.__update_knob_value(node, 'exr_datatype', '16 bit half') promote_write_knobs = profile.get("promote_write_knobs", []) # Make sure any invalid entries are removed from the profile list: @@ -1851,7 +1849,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False elif (self.ctx_info.step['name'] != "Roto" and write_type == "Matte"): color_space = "linear" - elif (self.ctx_info.step['name'] == "Roto"):#and + elif self.ctx_info.step['name'] == "Roto": # self.proj_info['sg_project_color_management'] != "OCIO" or # self.proj_info['sg_project_color_management'] == "OCIO"): color_space = "linear" @@ -2719,8 +2717,7 @@ def __setup_new_node(self, node): node.knob('project_crop_bool').setVisible(False) node.knob('shot_ocio_bool').setVisible(False) else: - if (write_type == "Version" or - write_type == "Matte"): + if write_type == "Version": node.knob('convert_to_write').setVisible(False) if self.ctx_info.step['name'] == "Roto": nuke.tprint("Creating Roto SG Write node") @@ -2737,6 +2734,13 @@ def __setup_new_node(self, node): node.knob("project_crop_bool").setValue(True) if node['tk_project_format_cache'].value() == "False": node.knob("project_crop_bool").setValue(False) + elif write_type == "Matte": + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + node.node("project_reformat")['disable'].setValue(False) + node.knob("project_crop_bool").setValue(True) + if node['tk_project_format_cache'].value() == "False": + node.knob("project_crop_bool").setValue(False) + if self._curr_entity_type == 'Asset': if write_type == "Version": node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) @@ -2902,19 +2906,18 @@ def __on_knob_changed(self): if self.proj_info['name'] == "Breakdowns": pass else: - if (write_type == "Version" or - write_type == "Matte"): + if write_type == "Version": node.knob('convert_to_write').setVisible(False) self.__set_project_crop(node, True) self.__write_type_changed(node, False) self.__embedded_format_option(node, True) if self.ctx_info.step['name'] == "Roto": self.__set_project_crop(node, False) - # elif write_type == "Matte": - # self.__set_project_crop(node, True) - # self.__write_type_changed(node, False) - # self.__embedded_format_option(node, True) - # write_type_profile = "Dpx" + if write_type == "Matte": + node.knob('convert_to_write').setVisible(False) + self.__set_project_crop(node, True) + self.__write_type_changed(node, False) + self.__embedded_format_option(node, True) elif write_type == "Test": self.__set_project_crop(node, False) self.__write_type_changed(node, True) @@ -2969,6 +2972,9 @@ def __on_knob_changed(self): self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) self.__test_write_message() + elif write_type == "Matte": + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) # Updates the predefined profile based on the write type self.__update_knob_value(node, "tk_profile_list", write_type_profile) # reset profile From 18dc56f03a2d03688299f60f102dd13924b35563 Mon Sep 17 00:00:00 2001 From: daawaa Date: Mon, 19 Nov 2018 09:23:09 +0000 Subject: [PATCH 49/90] fixed and working in foa --- python/tk_nuke_writenode/handler.py | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 484b3f2..89c3628 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -36,7 +36,6 @@ class TankWriteNodeHandler(object): """ Handles requests and processing from a tank write node. """ - # Version up branch SG_WRITE_NODE_CLASS = "WriteTank" SG_WRITE_DEFAULT_NAME = "SGWrite" WRITE_NODE_NAME = "Write1" @@ -1772,7 +1771,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False else: matte_clamp['disable'].setValue(True) - # Set the embeded delivery reformat next + # Set the embeded delivery reformat if not (self.proj_info['sg_delivery_format_width'] and self.proj_info['sg_delivery_format_height']): node.node("delivery_reformat")['disable'].setValue(True) @@ -1783,7 +1782,8 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False self.proj_info['sg_format_height']==self.proj_info['sg_delivery_format_height']): node.node("delivery_reformat")['disable'].setValue(True) nuke.tprint("Deliver format and Project format are the same. Disabling delivery reformat.") - elif write_type != "Version": + elif (write_type != "Version" and + write_type != "Matte"): node.node("delivery_reformat")['disable'].setValue(True) else: # Set the delivery_reformat node @@ -1864,7 +1864,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False node['shot_ocio_bool'].setValue(False) node['shot_ocio_bool'].setVisible(False) shot_ocio['disable'].setValue(True) - node.knob("ocio_warning").setVisible(True) + node.knob("ocio_warning").setVisible(False) # Set colorspace based of SG values if (self.ctx_info.step['name'] != "Roto" and @@ -2760,12 +2760,6 @@ def __setup_new_node(self, node): node.knob("project_crop_bool").setValue(True) if node['tk_project_format_cache'].value() == "False": node.knob("project_crop_bool").setValue(False) - elif write_type == "Matte": - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) - node.node("project_reformat")['disable'].setValue(False) - node.knob("project_crop_bool").setValue(True) - if node['tk_project_format_cache'].value() == "False": - node.knob("project_crop_bool").setValue(False) if self._curr_entity_type == 'Asset': if write_type == "Version": @@ -2888,11 +2882,13 @@ def __on_knob_changed(self): # all knob changes #print "Ignoring change to %s.%s value = %s" % (node.name(), knob.name(), knob.value()) return - + + # Set project fileset based on SG info write_type = self.get_node_write_type_name(node) write_type_profile = "Exr" if self.proj_info['sg_delivery_fileset'] != None: - if write_type == "Version": + if (write_type == "Version" or + write_type == "Matte"): write_type_profile = self.proj_info['sg_delivery_fileset']['name'].capitalize() @@ -2938,10 +2934,10 @@ def __on_knob_changed(self): self.__embedded_format_option(node, True) if self.ctx_info.step['name'] == "Roto": self.__set_project_crop(node, False) - if write_type == "Matte": + elif write_type == "Matte": node.knob('convert_to_write').setVisible(False) self.__set_project_crop(node, True) - self.__write_type_changed(node, False) + self.__write_type_changed(node, True) self.__embedded_format_option(node, True) elif write_type == "Test": self.__set_project_crop(node, False) From 0ceb3a4692c97511b1d048f8814db6bdcd5f085b Mon Sep 17 00:00:00 2001 From: daawaa Date: Mon, 19 Nov 2018 16:38:23 +0000 Subject: [PATCH 50/90] wip - needs to remove Matte as an option from the WT list --- python/tk_nuke_writenode/handler.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 89c3628..087e51f 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -2743,6 +2743,10 @@ def __setup_new_node(self, node): node.knob('project_crop_bool').setVisible(False) node.knob('shot_ocio_bool').setVisible(False) else: + if self.proj_info['sg_delivery_fileset'] == "Dpx": + pass + else: + print "Removing Matte from",list_profiles if write_type == "Version": node.knob('convert_to_write').setVisible(False) if self.ctx_info.step['name'] == "Roto": From 4373d5e57fa6fe2bb9c492fa99ba48d1fdec6610 Mon Sep 17 00:00:00 2001 From: daawaa Date: Tue, 20 Nov 2018 11:11:13 +0000 Subject: [PATCH 51/90] Added logto lin conversion around proj reformat --- gizmos/WriteTank.gizmo | 11 ++++++++++- python/tk_nuke_writenode/handler.py | 24 ++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 83b9e0f..a76fc93 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -600,6 +600,11 @@ Reformat { pbb false disable true } + Log2Lin { + name lin_to_log_got + operation lin2log + disable true + } Reformat { name delivery_reformat type "to format" @@ -609,11 +614,15 @@ Reformat { resize width pbb false disable true + } + Log2Lin { + name log_to_lin_got + disable true } Clamp { name matte_clamp disable true - } + } AddTimeCode { startcode 01:00:00:01 name project_tc diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 087e51f..b2be1fd 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -448,8 +448,12 @@ def create_project_settings_group(self, node): input_node = nuke.createNode("Input", inpanel = False) project_reformat = nuke.createNode("Reformat", inpanel = False) project_reformat['name'].setValue("project_reformat") + lin_to_log = nuke.createNode("Log2Lin", inpanel = False) + lin_to_log['name'].setValue("lin_to_log_got") delivery_reformat = nuke.createNode("Reformat", inpanel = False) delivery_reformat['name'].setValue("delivery_reformat") + log_to_lin = nuke.createNode("Log2Lin", inpanel = False) + log_to_lin['name'].setValue("log_to_lin_got") project_tc = nuke.createNode("AddTimeCode", inpanel = False) project_tc['name'].setValue("project_tc") content_metadata = nuke.createNode("ModifyMetaData", inpanel = False) @@ -461,9 +465,11 @@ def create_project_settings_group(self, node): # matte_clamp['disable'].setValue(True) output_node = nuke.createNode("Output", inpanel = False) proj_group_nodes.append(project_reformat) + proj_group_nodes.append(lin_to_log) proj_group_nodes.append(delivery_reformat) + proj_group_nodes.append(log_to_lin) proj_group_nodes.append(project_tc) - proj_group_nodes.append(content_metadata) + proj_group_nodes.append(content_metadata) proj_group_nodes.append(shot_ocio) proj_group_nodes.append(matte_clamp) project_group_process.end() @@ -531,12 +537,18 @@ def convert_sg_to_nuke_write_nodes(self, selected_node=None): extra_node.node('project_reformat')['format'].setValue(sg_wn.node('project_reformat')['format'].value()) extra_node.node('project_reformat')['pbb'].setValue(sg_wn.node('project_reformat')['pbb'].value()) extra_node.node('project_reformat')['black_outside'].setValue(sg_wn.node('project_reformat')['black_outside'].value()) + # Lin2Log + extra_node.node('lin_to_log_got')['disable'].setValue(sg_wn.node('lin_to_log_got')['disable'].value()) + extra_node.node('lin_to_log_got')['operation'].setValue(sg_wn.node('lin_to_log_got')['operation'].value()) # Embed crop extra_node.node('delivery_reformat')['disable'].setValue(sg_wn.node('delivery_reformat')['disable'].value()) extra_node.node('delivery_reformat')['filter'].setValue(sg_wn.node('delivery_reformat')['filter'].value()) extra_node.node('delivery_reformat')['format'].setValue(sg_wn.node('delivery_reformat')['format'].value()) extra_node.node('delivery_reformat')['pbb'].setValue(sg_wn.node('delivery_reformat')['pbb'].value()) extra_node.node('delivery_reformat')['black_outside'].setValue(sg_wn.node('delivery_reformat')['black_outside'].value()) + # Log2Lin + extra_node.node('log_to_lin_got')['disable'].setValue(sg_wn.node('log_to_lin_got')['disable'].value()) + extra_node.node('log_to_lin_got')['operation'].setValue(sg_wn.node('log_to_lin_got')['operation'].value()) # Embed tc extra_node.node('project_tc')['startcode'].setValue(sg_wn.node('project_tc')['startcode'].value()) extra_node.node('project_tc')['fps'].setValue(sg_wn.node('project_tc')['fps'].value()) @@ -1888,7 +1900,15 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False node['colorspace'].setValue(color_space) md = content_meta_data['metadata'] - md.fromScript(self.__get_metadata(node)) + md.fromScript(self.__get_metadata(node)) + + if (self.proj_info['name'] == "GOT8" and + write_type == "Version"): + node.node('lin_to_log_got')['disable'].setValue(False) + node.node('log_to_lin_got')['disable'].setValue(False) + else: + node.node('lin_to_log_got')['disable'].setValue(True) + node.node('log_to_lin_got')['disable'].setValue(True) # 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 From fd7f6e9f8e9b6990ffd8ff210218684f1f061296 Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 23 Nov 2018 09:08:49 +0000 Subject: [PATCH 52/90] removing project reformat --- python/tk_nuke_writenode/handler.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 7b8c057..5ea6ff7 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1736,7 +1736,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False # Add sG reformat settings if not self.proj_info['sg_delivery_reformat_filter'] == None: - project_reformat['filter'].setValue(self.proj_info['sg_delivery_reformat_filter']) + # project_reformat['filter'].setValue(self.proj_info['sg_delivery_reformat_filter']) delivery_reformat['filter'].setValue(self.proj_info['sg_delivery_reformat_filter']) # Timecode settings @@ -2781,7 +2781,7 @@ def __setup_new_node(self, node): node.node("project_reformat")['disable'].setValue(True) else: node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - node.node("project_reformat")['disable'].setValue(False) + # node.node("project_reformat")['disable'].setValue(False) if node['tk_project_format_cache'].value() == "False": node.knob("project_crop_bool").setValue(False) self.__embedded_format_option(node, False) @@ -2873,10 +2873,10 @@ def __version_up_visible(self, node, visible): def __embedded_format_option(self, node, value): if value == True: - node.node("project_reformat")['disable'].setValue(False) + # node.node("project_reformat")['disable'].setValue(False) node.node("delivery_reformat")['disable'].setValue(False) elif value == False: - node.node("project_reformat")['disable'].setValue(True) + # node.node("project_reformat")['disable'].setValue(True) node.node("delivery_reformat")['disable'].setValue(True) def __embedded_ocio_option(self, node, value): From afa4a01ae2c9ce88a75fc0ee05b5ea1b57d5d316 Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 23 Nov 2018 09:10:06 +0000 Subject: [PATCH 53/90] Update handler.py --- 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 5ea6ff7..a682dab 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -48,6 +48,7 @@ class TankWriteNodeHandler(object): OUTPUT_KNOB_NAME = "tank_channel" USE_NAME_AS_OUTPUT_KNOB_NAME = "tk_use_name_as_channel" + ################################################################################################ # Construction From d6f9adb8f87bc96db0696cd80bb542db4e88ab0a Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 23 Nov 2018 09:22:09 +0000 Subject: [PATCH 54/90] reinstate project reformat - removed filter type --- python/tk_nuke_writenode/handler.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index a682dab..7b8c057 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -48,7 +48,6 @@ class TankWriteNodeHandler(object): OUTPUT_KNOB_NAME = "tank_channel" USE_NAME_AS_OUTPUT_KNOB_NAME = "tk_use_name_as_channel" - ################################################################################################ # Construction @@ -1737,7 +1736,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False # Add sG reformat settings if not self.proj_info['sg_delivery_reformat_filter'] == None: - # project_reformat['filter'].setValue(self.proj_info['sg_delivery_reformat_filter']) + project_reformat['filter'].setValue(self.proj_info['sg_delivery_reformat_filter']) delivery_reformat['filter'].setValue(self.proj_info['sg_delivery_reformat_filter']) # Timecode settings @@ -2782,7 +2781,7 @@ def __setup_new_node(self, node): node.node("project_reformat")['disable'].setValue(True) else: node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - # node.node("project_reformat")['disable'].setValue(False) + node.node("project_reformat")['disable'].setValue(False) if node['tk_project_format_cache'].value() == "False": node.knob("project_crop_bool").setValue(False) self.__embedded_format_option(node, False) @@ -2874,10 +2873,10 @@ def __version_up_visible(self, node, visible): def __embedded_format_option(self, node, value): if value == True: - # node.node("project_reformat")['disable'].setValue(False) + node.node("project_reformat")['disable'].setValue(False) node.node("delivery_reformat")['disable'].setValue(False) elif value == False: - # node.node("project_reformat")['disable'].setValue(True) + node.node("project_reformat")['disable'].setValue(True) node.node("delivery_reformat")['disable'].setValue(True) def __embedded_ocio_option(self, node, value): From e7e59304a04de04b25518d917b2ecb873b05d099 Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 23 Nov 2018 09:26:54 +0000 Subject: [PATCH 55/90] removing proj reformat filtering --- 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 7b8c057..b9fe445 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1736,7 +1736,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False # Add sG reformat settings if not self.proj_info['sg_delivery_reformat_filter'] == None: - project_reformat['filter'].setValue(self.proj_info['sg_delivery_reformat_filter']) + # project_reformat['filter'].setValue(self.proj_info['sg_delivery_reformat_filter']) delivery_reformat['filter'].setValue(self.proj_info['sg_delivery_reformat_filter']) # Timecode settings From d698ff19c1b0092ad0959bbd0377b450cfc3ba43 Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 23 Nov 2018 16:43:33 +0000 Subject: [PATCH 56/90] disabled proj_reformat --- gizmos/WriteTank.gizmo | 12 +++++++----- python/tk_nuke_writenode/handler.py | 25 ++++++++++++------------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index a76fc93..1d8105c 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -591,20 +591,22 @@ Gizmo { xpos 195 ypos -74 } + Log2Lin { + name lin_to_log_got + operation lin2log + disable true + } Reformat { name project_reformat type "to format" + resize none + filter "Impulse" box_width 800 box_height 1 black_outside true pbb false disable true } - Log2Lin { - name lin_to_log_got - operation lin2log - disable true - } Reformat { name delivery_reformat type "to format" diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index b9fe445..487875a 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -446,10 +446,10 @@ def create_project_settings_group(self, node): project_group_process = nuke.toNode(project_group['name'].value()) project_group_process.begin() input_node = nuke.createNode("Input", inpanel = False) - project_reformat = nuke.createNode("Reformat", inpanel = False) - project_reformat['name'].setValue("project_reformat") lin_to_log = nuke.createNode("Log2Lin", inpanel = False) lin_to_log['name'].setValue("lin_to_log_got") + project_reformat = nuke.createNode("Reformat", inpanel = False) + project_reformat['name'].setValue("project_reformat") delivery_reformat = nuke.createNode("Reformat", inpanel = False) delivery_reformat['name'].setValue("delivery_reformat") log_to_lin = nuke.createNode("Log2Lin", inpanel = False) @@ -531,15 +531,16 @@ def convert_sg_to_nuke_write_nodes(self, selected_node=None): else: node_name = sg_wn.name()+"_converted" + # Lin2Log + extra_node.node('lin_to_log_got')['disable'].setValue(sg_wn.node('lin_to_log_got')['disable'].value()) + extra_node.node('lin_to_log_got')['operation'].setValue(sg_wn.node('lin_to_log_got')['operation'].value()) # Embed reformat extra_node.node('project_reformat')['disable'].setValue(sg_wn.node('project_reformat')['disable'].value()) + extra_node.node('project_reformat')['resize'].setValue(sg_wn.node('project_reformat')['resize'].value()) extra_node.node('project_reformat')['filter'].setValue(sg_wn.node('project_reformat')['filter'].value()) extra_node.node('project_reformat')['format'].setValue(sg_wn.node('project_reformat')['format'].value()) extra_node.node('project_reformat')['pbb'].setValue(sg_wn.node('project_reformat')['pbb'].value()) extra_node.node('project_reformat')['black_outside'].setValue(sg_wn.node('project_reformat')['black_outside'].value()) - # Lin2Log - extra_node.node('lin_to_log_got')['disable'].setValue(sg_wn.node('lin_to_log_got')['disable'].value()) - extra_node.node('lin_to_log_got')['operation'].setValue(sg_wn.node('lin_to_log_got')['operation'].value()) # Embed crop extra_node.node('delivery_reformat')['disable'].setValue(sg_wn.node('delivery_reformat')['disable'].value()) extra_node.node('delivery_reformat')['filter'].setValue(sg_wn.node('delivery_reformat')['filter'].value()) @@ -2759,7 +2760,7 @@ def __setup_new_node(self, node): write_type = self.get_node_write_type_name(node) if self._curr_entity_type == 'Shot': if self.proj_info['name'] == "Breakdowns": - node.node("project_reformat")['disable'].setValue(True) + # node.node("project_reformat")['disable'].setValue(True) node.knob('project_crop_bool').setVisible(False) node.knob('shot_ocio_bool').setVisible(False) else: @@ -2776,12 +2777,10 @@ def __setup_new_node(self, node): node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) node.knob("project_crop_bool").setValue(False) self.__embedded_format_option(node, False) - node.node("project_reformat")['disable'].setValue(True) - elif self.ctx_info.step['name'] == "Cleanup": - node.node("project_reformat")['disable'].setValue(True) + # node.node("project_reformat")['disable'].setValue(True) else: node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - node.node("project_reformat")['disable'].setValue(False) + # node.node("project_reformat")['disable'].setValue(False) if node['tk_project_format_cache'].value() == "False": node.knob("project_crop_bool").setValue(False) self.__embedded_format_option(node, False) @@ -2794,7 +2793,7 @@ def __setup_new_node(self, node): if self._curr_entity_type == 'Asset': if write_type == "Version": node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - node.node("project_reformat")['disable'].setValue(True) + # node.node("project_reformat")['disable'].setValue(True) node.knob('project_crop_bool').setVisible(False) # ensure that the correct entry is selected from the list: self.__update_knob_value(node, "tk_profile_list", current_profile_name) @@ -2873,10 +2872,10 @@ def __version_up_visible(self, node, visible): def __embedded_format_option(self, node, value): if value == True: - node.node("project_reformat")['disable'].setValue(False) + # node.node("project_reformat")['disable'].setValue(False) node.node("delivery_reformat")['disable'].setValue(False) elif value == False: - node.node("project_reformat")['disable'].setValue(True) + # node.node("project_reformat")['disable'].setValue(True) node.node("delivery_reformat")['disable'].setValue(True) def __embedded_ocio_option(self, node, value): From 9721a703a66529b65a8c7d7d677c9fd6629187ec Mon Sep 17 00:00:00 2001 From: daawaa Date: Wed, 28 Nov 2018 12:34:25 +0000 Subject: [PATCH 57/90] apply lanczos6 to comp task only --- gizmos/WriteTank.gizmo | 1 + python/tk_nuke_writenode/handler.py | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 1d8105c..baa609b 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -610,6 +610,7 @@ Reformat { Reformat { name delivery_reformat type "to format" + filter "Impulse" box_width 800 box_height 1 black_outside true diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 487875a..8c6dee3 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1737,8 +1737,10 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False # Add sG reformat settings if not self.proj_info['sg_delivery_reformat_filter'] == None: - # project_reformat['filter'].setValue(self.proj_info['sg_delivery_reformat_filter']) - delivery_reformat['filter'].setValue(self.proj_info['sg_delivery_reformat_filter']) + if "Comp" in self.ctx_info.step['name']: + nuke.tprint("Task is comp. Applying reformat filter") + # project_reformat['filter'].setValue(self.proj_info['sg_delivery_reformat_filter']) + delivery_reformat['filter'].setValue(self.proj_info['sg_delivery_reformat_filter']) # Timecode settings if not self.frame_range[0]: From fbed06ec3c01386f6c5e815b9b95a68d22c5e9c9 Mon Sep 17 00:00:00 2001 From: daawaa Date: Fri, 30 Nov 2018 12:48:59 +0000 Subject: [PATCH 58/90] linear transfer for matte dpx --- 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 8c6dee3..5760ed0 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -2966,14 +2966,18 @@ def __on_knob_changed(self): node.knob('convert_to_write').setVisible(False) self.__set_project_crop(node, True) self.__write_type_changed(node, False) - self.__embedded_format_option(node, True) + self.__embedded_format_option(node, True) if self.ctx_info.step['name'] == "Roto": self.__set_project_crop(node, False) + if write_type_profile == "Dpx": + node.node("Write1").knob("transfer").setValue('(auto detect)') elif write_type == "Matte": node.knob('convert_to_write').setVisible(False) self.__set_project_crop(node, True) self.__write_type_changed(node, True) self.__embedded_format_option(node, True) + if write_type_profile == "Dpx": + node.node("Write1").knob("transfer").setValue('linear') elif write_type == "Test": self.__set_project_crop(node, False) self.__write_type_changed(node, True) From 859ab060a7ec98a9e0d40160c71856ed35de27bc Mon Sep 17 00:00:00 2001 From: daawaa Date: Tue, 5 Feb 2019 17:10:02 +0000 Subject: [PATCH 59/90] removed ocio SG info node section --- python/tk_nuke_writenode/handler.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 5760ed0..1a25081 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1829,6 +1829,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False # Set internal ocio if required color_space = None if self.proj_info['sg_color_space']: + """ if (self.proj_info['sg_project_color_management'] == "OCIO" and not self.shot_info['sg_without_ocio']): color_space = "acescg" @@ -1880,7 +1881,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False node['shot_ocio_bool'].setVisible(False) shot_ocio['disable'].setValue(True) node.knob("ocio_warning").setVisible(False) - + """ # Set colorspace based of SG values if (self.ctx_info.step['name'] != "Roto" and write_type == "Version"): From 565d9364e201b9add13dee5aacf844ef192928d9 Mon Sep 17 00:00:00 2001 From: dduffy Date: Mon, 8 Jul 2019 11:04:06 +0100 Subject: [PATCH 60/90] updated for channels_cache for node channel info store --- gizmos/ProjectSettings.gizmo | 41 ----------------------------- gizmos/WriteTank.gizmo | 4 ++- python/tk_nuke_writenode/handler.py | 14 ++++++++-- 3 files changed, 15 insertions(+), 44 deletions(-) delete mode 100644 gizmos/ProjectSettings.gizmo diff --git a/gizmos/ProjectSettings.gizmo b/gizmos/ProjectSettings.gizmo deleted file mode 100644 index 2f92435..0000000 --- a/gizmos/ProjectSettings.gizmo +++ /dev/null @@ -1,41 +0,0 @@ -Gizmo { - note_font Verdana - mapsize {0.15 0.15} -} - Input { - inputs 0 - name Input1 - xpos 195 - ypos -74 - } - Reformat { - type "to format" - box_width 800 - box_height 1 - black_outside false - pbb true - name project_reformat - disable true - } - Crop { - name project_crop - preset format - reformat true - crop false - disable true - } - AddTimeCode { - name project_tc - startcode 01:00:00:01 - metafps False - fps 23.98 - useFrame True - frame 1 - } -set N11879e50 [stack 0] - Output { - name Output1 - xpos 195 - ypos 150 - } -end_group \ No newline at end of file diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index baa609b..d312b67 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -127,6 +127,7 @@ Gizmo { t "The path for this write node when rendering in proxy mode" +INVISIBLE } + addUserKnob { 1 tk_channel_cache l "" @@ -319,7 +320,7 @@ Gizmo { l "Apply shot OCIO" t "Choose to apply the embeded shot OCIO." +STARTLINE - -INVISIBLE + +INVISIBLE } addUserKnob { 26 ocio_warning @@ -327,6 +328,7 @@ Gizmo { T "" t "Flag with the artist if the OCIO is not being applied." +STARTLINE + +INVISIBLE } addUserKnob { 25 "" diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 1a25081..1053b71 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1694,6 +1694,11 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False node.knob('exr_datatype').setVisible(True) node.knob('dpx_datatype').setVisible(False) profile_channel = "rgba" + try: + if node['channels_cache'].value() != "": + profile_channel = node['channels_cache'].value() + except: + pass node.node(TankWriteNodeHandler.WRITE_NODE_NAME)['metadata'].setValue('all metadata') node.knob('auto_crop').setVisible(False) if (write_type == "Precomp" or @@ -1711,7 +1716,6 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False node.knob('dpx_datatype').setVisible(False) node.knob('exr_datatype').setVisible(False) node.knob('auto_crop').setVisible(False) - profile_channel = "rgb" else: nuke.tprint("No profile with that name") @@ -3102,7 +3106,13 @@ def __on_knob_changed(self): % (grp.name(), knob_name, grp.name(), write_node.name(), knob_name)) write_node.knob(knob_name).setValue(nuke.thisKnob().value()) - + node_channel = node['channels'].value() + + # Add channels info to cahce for reopen reference + try: + node['channels_cache'].setValue(node_channel) + except: + pass def __get_current_script_path(self): """ Get the current script path (if the current script has been saved). This will From ad3938af56e502e3209d520dce341ae1b9d8c980 Mon Sep 17 00:00:00 2001 From: dduffy Date: Mon, 8 Jul 2019 11:16:29 +0100 Subject: [PATCH 61/90] added channels_cache --- gizmos/WriteTank.gizmo | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index d312b67..6d93a31 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -127,7 +127,13 @@ Gizmo { t "The path for this write node when rendering in proxy mode" +INVISIBLE } - + addUserKnob { + 1 channels_cache + l "" + t "Cache location for channels setting" + +STARTLINE + +INVISIBLE + } addUserKnob { 1 tk_channel_cache l "" From 7df8a1de4dca59d4e5d33daeb5f48c29dbaed214 Mon Sep 17 00:00:00 2001 From: dduffy Date: Mon, 26 Aug 2019 17:49:44 +0100 Subject: [PATCH 62/90] major edits cleaned up write types removed proj format (deliv only) --- gizmos/WriteTank.gizmo | 30 +-- info.yml | 18 +- python/tk_nuke_writenode/handler.py | 404 +++++++++------------------- 3 files changed, 139 insertions(+), 313 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 6d93a31..7981c0a 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -35,12 +35,6 @@ Gizmo { 20 tank_tab l "Shotgun Write" } - addUserKnob { - 1 precomp_render_template - l "Sgtk Precomp Template" - t "The Sgtk precomp template associated with this node" - +INVISIBLE - } addUserKnob { 1 element_render_template l "Sgtk Elements Template" @@ -54,8 +48,8 @@ Gizmo { +INVISIBLE } addUserKnob { - 1 cleanup_render_template - l "Sgtk Cleanup Template" + 1 smartvector_render_template + l "Sgtk SmartVector Template" t "The Sgtk cleanup template associated with this node" +INVISIBLE } @@ -193,20 +187,6 @@ Gizmo { l "File Name" T " " t "A preview of the file location generated by the node." - } - addUserKnob { - 22 increase_version - l "+1 version" - t "Increases the version number of the given output render." - +STARTLINE - +INVISIBLE - } - addUserKnob { - 22 revert_to_version - l "revert" - t "Reverts to the previous found version number of the given output render." - -STARTLINE - +INVISIBLE } addUserKnob { 26 path_warning @@ -265,7 +245,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 Matte} + M {Version Element Denoise SmartVector Test} } addUserKnob { 22 write_type_info @@ -274,8 +254,10 @@ Gizmo { } addUserKnob { 22 convert_to_write - l "Convert Node" + l "Convert to Write Node" T " " + t "This write type should be conerted after the Detail name is input!" + +STARTLINE } addUserKnob { 1 write_type_cache diff --git a/info.yml b/info.yml index ec86fdd..dc2751f 100644 --- a/info.yml +++ b/info.yml @@ -64,11 +64,6 @@ 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], * @@ -78,11 +73,7 @@ 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: + smartvector_render_template: type: template fields: context, version, SEQ, [channel], [output], [name], [width], [height], [eye], * allows_empty: True @@ -90,12 +81,7 @@ configuration: type: template fields: context, version, SEQ, [channel], [output], [name], [width], [height], [eye], * allows_empty: True - default_value: null - matte_render_template: - type: template - fields: context, version, SEQ, [channel], [output], [name], [width], [height], [eye], * - allows_empty: True - default_value: null + 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 1053b71..68133f6 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -37,12 +37,11 @@ class TankWriteNodeHandler(object): Handles requests and processing from a tank write node. """ SG_WRITE_NODE_CLASS = "WriteTank" - SG_WRITE_DEFAULT_NAME = "SGWrite" + SG_WRITE_DEFAULT_NAME = "Version" WRITE_NODE_NAME = "Write1" EMBED_TIME_CODE = "project_tc" EMBED_META_DATA = "content_meta_data" EMBED_SHOT_OCIO = "shot_ocio" - EMBED_PROJECT_REFORMAT = "project_reformat" EMBED_DELIVERY_REFORMAT = "delivery_reformat" EMBED_MATTE_CLAMP = "matte_clamp" OUTPUT_KNOB_NAME = "tank_channel" @@ -88,12 +87,14 @@ def __init__(self, app): 'sg_delivery_format_width', 'sg_delivery_format_height', 'sg_delivery_reformat_filter', + 'sg_delivery_reformat_type', 'sg_pixel_aspect_ratio', 'sg_short_name', 'sg_delivery_fileset', 'sg_delivery_fileset_compression', 'sg_color_space', 'sg_project_color_management']) + self.shot_info = self.sg.find_one("Shot", [['id', 'is', self._entity['id']]], ['name', @@ -264,18 +265,15 @@ def render_path_is_locked(self, node): return self.__is_render_path_locked(node, render_path, cached_path) - def reset_render_path(self, node, increase_version=False): + def reset_render_path(self, node): """ Reset the render path of the specified node. This will force the render path to be updated based on the current script path and configuraton """ is_proxy = node.proxy() - if not increase_version: - 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)) - else: - self.__update_render_path(node, force_reset=True, is_proxy=is_proxy, increase_version=True) + 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, write_type): """ @@ -298,15 +296,12 @@ def create_new_node(self, profile_name, write_type): node = nuke.createNode(TankWriteNodeHandler.SG_WRITE_NODE_CLASS, inpanel = False) # rename to our new default name: - existing_node_names = [n.name() for n in nuke.allNodes()] - postfix = 1 - while True: - new_name = "%s%d" % (TankWriteNodeHandler.SG_WRITE_DEFAULT_NAME, postfix) - if new_name not in existing_node_names: - node.knob("name").setValue(new_name) - break - else: - postfix += 1 + existing_node_names = [n.name() for n in nuke.allNodes(TankWriteNodeHandler.SG_WRITE_NODE_CLASS)] + + new_name = self.__ensure_unique_name(TankWriteNodeHandler.SG_WRITE_DEFAULT_NAME, + existing_node_names) + + node.knob("name").setValue(new_name) self._app.log_debug("Created Shotgun Write Node %s" % node.name()) @@ -439,17 +434,18 @@ def create_project_settings_group(self, node): # Get properties of selected node to use for new group nodePos = (node.xpos(), node.ypos()) - + existing_node_names = [n.name() for n in nuke.allNodes("Group")] + node_name = self.__ensure_unique_name("%s_Group" %(node['name'].value()), + existing_node_names) # Primary group setup proj_group_nodes = [] project_group = nuke.createNode("Group", inpanel = False) + project_group['name'].setValue(node_name) project_group_process = nuke.toNode(project_group['name'].value()) project_group_process.begin() input_node = nuke.createNode("Input", inpanel = False) lin_to_log = nuke.createNode("Log2Lin", inpanel = False) lin_to_log['name'].setValue("lin_to_log_got") - project_reformat = nuke.createNode("Reformat", inpanel = False) - project_reformat['name'].setValue("project_reformat") delivery_reformat = nuke.createNode("Reformat", inpanel = False) delivery_reformat['name'].setValue("delivery_reformat") log_to_lin = nuke.createNode("Log2Lin", inpanel = False) @@ -464,7 +460,6 @@ def create_project_settings_group(self, node): matte_clamp['name'].setValue("matte_clamp") # matte_clamp['disable'].setValue(True) output_node = nuke.createNode("Output", inpanel = False) - proj_group_nodes.append(project_reformat) proj_group_nodes.append(lin_to_log) proj_group_nodes.append(delivery_reformat) proj_group_nodes.append(log_to_lin) @@ -534,16 +529,10 @@ def convert_sg_to_nuke_write_nodes(self, selected_node=None): # Lin2Log extra_node.node('lin_to_log_got')['disable'].setValue(sg_wn.node('lin_to_log_got')['disable'].value()) extra_node.node('lin_to_log_got')['operation'].setValue(sg_wn.node('lin_to_log_got')['operation'].value()) - # Embed reformat - extra_node.node('project_reformat')['disable'].setValue(sg_wn.node('project_reformat')['disable'].value()) - extra_node.node('project_reformat')['resize'].setValue(sg_wn.node('project_reformat')['resize'].value()) - extra_node.node('project_reformat')['filter'].setValue(sg_wn.node('project_reformat')['filter'].value()) - extra_node.node('project_reformat')['format'].setValue(sg_wn.node('project_reformat')['format'].value()) - extra_node.node('project_reformat')['pbb'].setValue(sg_wn.node('project_reformat')['pbb'].value()) - extra_node.node('project_reformat')['black_outside'].setValue(sg_wn.node('project_reformat')['black_outside'].value()) # Embed crop extra_node.node('delivery_reformat')['disable'].setValue(sg_wn.node('delivery_reformat')['disable'].value()) extra_node.node('delivery_reformat')['filter'].setValue(sg_wn.node('delivery_reformat')['filter'].value()) + extra_node.node('delivery_reformat')['resize'].setValue(sg_wn.node('delivery_reformat')['resize'].value()) extra_node.node('delivery_reformat')['format'].setValue(sg_wn.node('delivery_reformat')['format'].value()) extra_node.node('delivery_reformat')['pbb'].setValue(sg_wn.node('delivery_reformat')['pbb'].value()) extra_node.node('delivery_reformat')['black_outside'].setValue(sg_wn.node('delivery_reformat')['black_outside'].value()) @@ -850,6 +839,29 @@ def convert_nuke_to_sg_write_nodes(self): new_sg_wn.setName(node_name) new_sg_wn.setXpos(node_pos[0]) new_sg_wn.setYpos(node_pos[1]) + + def add_format(self, project_shortcode, format_type, format_width, format_height, pixel_aspect_ratio): + """ + Test Nuke script for given format + Return if exact format is found + Create a new one and return if not found + """ + format_name = "%s_%s_%d" % (project_shortcode,format_type,format_width) + format_match = next((format for format in nuke.formats() if format.name() == format_name),None) + + if format_match: + if (format_match.width()== format_width and + format_match.height()== format_height and + format_match.pixelAspect() == pixel_aspect_ratio): + print("Format already exists!") + else: + print("Adding format") + format_match = nuke.addFormat("%d %d %d %s" %(format_width, format_height, pixel_aspect_ratio, format_name)) + else: + format_match = nuke.addFormat("%d %d %d %s" %(format_width, format_height, pixel_aspect_ratio,format_name)) + + return format_match + ################################################################################################ # Public methods called from gizmo - although these are public, they should # be considered as private and not used directly! @@ -1229,10 +1241,6 @@ def __get_render_template(self, node, write_type, is_proxy=False, fallback_to_re template = self.__get_template(node, "proxy_render_template") if template or not fallback_to_render: return template - elif 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: @@ -1241,18 +1249,15 @@ 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") + elif write_type == "SmartVector": + template = self.__get_template(node, "smartvector_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 - elif write_type == "Matte": - template = self.__get_template(node, "matte_render_template") - if template or not fallback_to_render: - return template + else: return self.__get_template(node, "render_template") @@ -1362,16 +1367,12 @@ 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_global'] elif write_type == "Element": context_info = self._app.tank.templates['shot_render_global'] elif write_type == "Denoise": 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 == "Matte": - context_info = self._app.tank.templates['shot_render_global'] + elif write_type == "SmartVector": + context_info = self._app.tank.templates['shot_render_global'] else: context_info = self._app.tank.templates['shot_render_global'] @@ -1388,16 +1389,12 @@ 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_global'] elif write_type == "Element": context_info = self._app.tank.templates['asset_render_global'] elif write_type == "Denoise": 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 == "Matte": - context_info = self._app.tank.templates['asset_render_global'] + elif write_type == "SmartVector": + context_info = self._app.tank.templates['asset_render_global'] else: context_info = self._app.tank.templates['asset_render_global'] @@ -1508,13 +1505,10 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False 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"]) - 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"]) + smartvector_render_template = self._app.get_template_by_name(profile["smartvector_render_template"]) test_render_template = self._app.get_template_by_name(profile["test_render_template"]) - matte_render_template = self._app.get_template_by_name(profile["matte_render_template"]) file_type = profile["file_type"] file_settings = profile["settings"] @@ -1548,12 +1542,15 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False self.__update_knob_value(node, 'exr_datatype', exr_datayype) file_settings.update({'compression' : 'none'}) file_settings.update({'datatype' : exr_datayype}) - elif (file_type == "exr" and write_type == "Element" or write_type == "Precomp" - or write_type == "Cleanup" or write_type == "Denoise"): + elif (file_type == "exr" and write_type == "Element" or + write_type == "Denoise"): self.__update_knob_value(node, 'exr_datatype', '16 bit half') file_settings.update({'compression' : 'Zip (1 scanline)'}) file_settings.update({'datatype' : '16 bit half'}) nuke.tprint("Applying ZIP compression to %s output." % write_type) + elif write_type == "SmartVector": + self.__update_knob_value(node, 'exr_datatype', '32 bit half') + file_settings.update({'datatype' : '32 bit half'}) promote_write_knobs = profile.get("promote_write_knobs", []) # Make sure any invalid entries are removed from the profile list: @@ -1634,20 +1631,15 @@ def __set_profile(self, node, profile_name, write_type, 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, "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, "smartvector_render_template", + smartvector_render_template.name) self.__update_knob_value(node, "test_render_template", test_render_template.name) - self.__update_knob_value(node, "matte_render_template", - matte_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: @@ -1657,18 +1649,14 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False "setting will be ignored!") % profile_name) # reset tile_color knob value back to default: - if write_type == "Precomp": - default_value = 4121611007 - elif write_type == "Element": + if write_type == "Element": default_value = 1095751564801 elif write_type == "Denoise": - default_value = 309868287 - elif write_type == "Cleanup": - default_value = 4287911423 + default_value = 2231304447 + elif write_type == "SmartVector": + default_value = 4278254335 elif write_type == "Test": - default_value = 4278190081 - elif write_type == "Matte": - default_value = 572662527 + default_value = 4278190081 else: default_value = int(node["tile_color"].defaultValue()) @@ -1701,13 +1689,17 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False pass node.node(TankWriteNodeHandler.WRITE_NODE_NAME)['metadata'].setValue('all metadata') node.knob('auto_crop').setVisible(False) - if (write_type == "Precomp" or - write_type == "Element"): + if write_type == "Element": profile_channel = "rgba" node.knob('auto_crop').setVisible(True) node.knob('auto_crop').setValue(True) - node.node("Write1").knob("autocrop").setValue(True) - if self.ctx_info.step['name'] == "Roto": + node.node("Write1").knob("autocrop").setValue(True) + if write_type == "SmartVector": + profile_channel = "all" + node.knob('auto_crop').setVisible(True) + node.knob('auto_crop').setValue(True) + node.node("Write1").knob("autocrop").setValue(True) + if self.ctx_info.step['name'] == "Roto": profile_channel = "all" node.knob('auto_crop').setVisible(True) node.knob('auto_crop').setValue(True) @@ -1730,7 +1722,6 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False if self._curr_entity_type == 'Shot': # Update embeded time code - project_reformat = node.node(TankWriteNodeHandler.EMBED_PROJECT_REFORMAT) delivery_reformat = node.node(TankWriteNodeHandler.EMBED_DELIVERY_REFORMAT) time_code = node.node(TankWriteNodeHandler.EMBED_TIME_CODE) content_meta_data = node.node(TankWriteNodeHandler.EMBED_META_DATA) @@ -1739,13 +1730,8 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False proj_fps = self.proj_info['sg_frame_rate'] timecode = "01:00:00:01" - # Add sG reformat settings - if not self.proj_info['sg_delivery_reformat_filter'] == None: - if "Comp" in self.ctx_info.step['name']: - nuke.tprint("Task is comp. Applying reformat filter") - # project_reformat['filter'].setValue(self.proj_info['sg_delivery_reformat_filter']) - delivery_reformat['filter'].setValue(self.proj_info['sg_delivery_reformat_filter']) + # Timecode settings if not self.frame_range[0]: print "No frame range values found on SG" @@ -1764,71 +1750,34 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False time_code.knobs()["frame"].setValue(shot_frame_range_start) time_code.knobs()["metafps"].setValue(use_meta_data) - # Set the project reformat first - scriptFormats = nuke.formats() - main_format = None - for f in scriptFormats: - if (f.width() == int(self.proj_info['sg_format_width']) and - f.height() == int(self.proj_info['sg_format_height'])): - main_format = f - break - if not main_format: - try: - main_format = nuke.addFormat("%s %s %s %s" % (str(self.proj_info['sg_delivery_format_width']), - str(self.proj_info['sg_delivery_format_height']), - str(self.proj_info['sg_pixel_aspect_ratio']), - (self.proj_info['sg_short_name']+"_"+str(self.proj_info['sg_format_width'])))) - except: - nuke.tprint("Could not apply embeded format settings. Missing info from Projects...") - - project_reformat.knobs()["format"].setValue(main_format) - - - # Embed clamp - if write_type == "Matte": - matte_clamp['disable'].setValue(False) - else: - matte_clamp['disable'].setValue(True) # Set the embeded delivery reformat if not (self.proj_info['sg_delivery_format_width'] and self.proj_info['sg_delivery_format_height']): node.node("delivery_reformat")['disable'].setValue(True) nuke.tprint("No delivery reformat info given on Projects.") - else: - # If delivery format matches project format disable - if (self.proj_info['sg_format_width'] == self.proj_info['sg_delivery_format_width'] and - self.proj_info['sg_format_height']==self.proj_info['sg_delivery_format_height']): - node.node("delivery_reformat")['disable'].setValue(True) - nuke.tprint("Deliver format and Project format are the same. Disabling delivery reformat.") - elif (write_type != "Version" and - write_type != "Matte"): + else: + # Set the project reformat first + delivery_format = self.add_format(self.proj_info['sg_short_name'], + "delivery", + int(self.proj_info['sg_delivery_format_width']), + int(self.proj_info['sg_delivery_format_height']), + int(self.proj_info['sg_pixel_aspect_ratio'])) + + if write_type != "Version": node.node("delivery_reformat")['disable'].setValue(True) else: + # Add sG reformat settings + filter_match = next((f for f in delivery_reformat['filter'].values() if f == self.proj_info['sg_delivery_reformat_filter']), None) + if filter_match: + delivery_reformat['filter'].setValue(filter_match) + resize_match = next((r for r in delivery_reformat['resize'].values() if r == self.proj_info['sg_delivery_reformat_type']), None) + if resize_match: + delivery_reformat['resize'].setValue(resize_match) + # Set the delivery_reformat node - if (self.proj_info['sg_delivery_format_width'] and - self.proj_info['sg_delivery_format_height'] and - self.proj_info['sg_pixel_aspect_ratio'] and - self.proj_info['sg_short_name']): - deliv_format = None - for f in scriptFormats: - if (f.width() == int(self.proj_info['sg_delivery_format_width']) and - f.height() == int(self.proj_info['sg_delivery_format_height'])): - deliv_format = f - break - if not deliv_format: - try: - deliv_format = nuke.addFormat("%s %s %s %s" % (str(self.proj_info['sg_delivery_format_width']), - str(self.proj_info['sg_delivery_format_height']), - str(self.proj_info['sg_pixel_aspect_ratio']), - (self.proj_info['sg_short_name']+"_"+str(self.proj_info['sg_format_width'])))) - except: - nuke.tprint("Could not apply embeded format settings. Missing info from Projects...") - - delivery_reformat.knobs()["format"].setValue(deliv_format) - node.node("delivery_reformat")['disable'].setValue(False) - else: - nuke.tprint("Missing info from SG Projects") + delivery_reformat.knobs()["format"].setValue(delivery_format) + node.node("delivery_reformat")['disable'].setValue(False) # Set internal ocio if required color_space = None @@ -1894,8 +1843,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False nuke.tprint("--- Could not get color space info. Setting default value of %s." % color_space) else: nuke.tprint("--- Setting colorspace to %s from Projects page." % color_space) - elif (self.ctx_info.step['name'] != "Roto" and - write_type == "Matte"): + elif self.ctx_info.step['name'] != "Roto": color_space = "linear" elif (self.ctx_info.step['name'] == "Roto"):#and color_space = "linear" @@ -2111,7 +2059,7 @@ def __populate_format_settings( write_node.readKnobs(r"\n".join(filtered_settings)) self.reset_render_path(node) - def __set_output(self, node, output_name, increase_version=False): + def __set_output(self, node, output_name): """ Set the output on the specified node from user interaction. """ @@ -2120,11 +2068,16 @@ def __set_output(self, node, output_name, increase_version=False): # update output knob: self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, output_name) - if not increase_version: - # reset the render path - self.reset_render_path(node) - else: - self.reset_render_path(node, increase_version=True) + # reset the render path + self.reset_render_path(node) + + + try: + dir_name = os.path.dirname(node['cached_path'].value()) + os.makedirs(dir_name) + nuke.tprint("Created output folder %s" %(dir_name)) + except: + pass def __wrap_text(self, t, line_length): """ @@ -2162,7 +2115,7 @@ def __read_node_metadata(self, read_path): except: return None - def __update_render_path(self, node, force_reset=False, is_proxy=False, increase_version=False): + def __update_render_path(self, node, force_reset=False, is_proxy=False): """ Update the render path and the various feedback knobs based on the current context and other node settings. @@ -2230,11 +2183,8 @@ def __update_render_path(self, node, force_reset=False, is_proxy=False, increase raise TkComputePathError(compute_path_error) else: # compute the render path - if not increase_version: - render_path = self.__compute_render_path_from(node, render_template, width, height, output_name) - else: - render_path = self.__compute_render_path_from(node, render_template, width, height, output_name, next_version = 2) - nuke.tprint("Increasing Version...") + render_path = self.__compute_render_path_from(node, render_template, width, height, output_name) + except TkComputePathError, e: # update cache: @@ -2270,18 +2220,8 @@ def __update_render_path(self, node, force_reset=False, is_proxy=False, increase path_is_locked = self.__is_render_path_locked(node, render_path, cached_path, is_proxy) else: # compute the render path - if not increase_version: - render_path = self.__compute_render_path_from(node, render_template, width, height, output_name) - else: - files, fields = self.get_files_on_disk(node) - next_version_number = 2 - if files: - output_template = self._app.tank.template_from_path(files[0]) - output_fields = output_template.get_fields(files[0]) - next_version_number = output_fields['version'] + 1 - - render_path = self.__compute_render_path_from(node, render_template, width, height, output_name, next_version = next_version_number) - nuke.tprint("Increasing Version...") + render_path = self.__compute_render_path_from(node, render_template, width, height, output_name) + if path_is_locked: # render path was not what we expected! @@ -2347,7 +2287,8 @@ def __update_render_path(self, node, force_reset=False, is_proxy=False, increase # finally, update preview: self.__update_path_preview(node, is_proxy) - + + return render_path finally: @@ -2535,12 +2476,8 @@ def __compute_render_path_from(self, node, render_template, width, height, outpu if (write_type == "Version" or write_type == "Test"): pass - else: - # TODO: Setup version numbers that start at v001 for precomps - # fields.update({'version': next_version}) - pass - - + + if not fields: raise TkComputePathError("The current script is not a Shotgun Work File!") @@ -2589,56 +2526,6 @@ def __compute_render_path_from(self, node, render_template, width, height, outpu # make slahes uniform: path = path.replace(os.path.sep, "/") - """ - try: - file, fields = self.get_files_on_disk(node) - nuke.tprint("Version number: %s" % str(fields['version'])) - nuke.tprint("Path: %s" % file[0]) - ext_match = file[0] - path_to_test = file - except: - nuke.tprint("nope") - - # Test for existing folder contents - if self.test_folder_for_renders(path): - if (self.test_folder_for_renders(path)[0] and - self.test_folder_for_renders(path)[2]): - ext_match = self.test_folder_for_renders(path)[2] - path_to_test = self.test_folder_for_renders(path)[1] - ext_match_string = "" - files_warning = "" - read_creator = "Unknown" - - # Get extension of file - if ext_match >1: - for i in ext_match: - ext_match_string += " " + i + " " - else: - ext_match_string = ext_match[0] - # Get user that created files - if not self.__read_node_metadata(path_to_test): - pass - else: - try: - read_creator = self.__read_node_metadata(path_to_test)['exr/nuke/artist_name'] - except: - pass - - files_warning += "Careful Now!
" - files_warning += "%s files already exist in this location.
" % ext_match_string - files_warning += "Author: %s" % read_creator - self.__update_knob_value(node, "files_warning", "".join(self.__wrap_text(files_warning, 100))) - node.knob("files_warning").setVisible(True) - - else: - self.__update_knob_value(node, "files_warning", "") - node.knob("files_warning").setVisible(False) - - else: - self.__update_knob_value(node, "files_warning", "") - node.knob("files_warning").setVisible(False) - """ - return path def __is_render_path_locked(self, node, render_path, cached_path, is_proxy=False): @@ -2767,14 +2654,9 @@ def __setup_new_node(self, node): write_type = self.get_node_write_type_name(node) if self._curr_entity_type == 'Shot': if self.proj_info['name'] == "Breakdowns": - # node.node("project_reformat")['disable'].setValue(True) node.knob('project_crop_bool').setVisible(False) node.knob('shot_ocio_bool').setVisible(False) else: - if self.proj_info['sg_delivery_fileset'] == "Dpx": - pass - else: - print "Removing Matte from",list_profiles if write_type == "Version": node.knob('convert_to_write').setVisible(False) if self.ctx_info.step['name'] == "Roto": @@ -2784,10 +2666,8 @@ def __setup_new_node(self, node): node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) node.knob("project_crop_bool").setValue(False) self.__embedded_format_option(node, False) - # node.node("project_reformat")['disable'].setValue(True) else: node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - # node.node("project_reformat")['disable'].setValue(False) if node['tk_project_format_cache'].value() == "False": node.knob("project_crop_bool").setValue(False) self.__embedded_format_option(node, False) @@ -2800,7 +2680,6 @@ def __setup_new_node(self, node): if self._curr_entity_type == 'Asset': if write_type == "Version": node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - # node.node("project_reformat")['disable'].setValue(True) node.knob('project_crop_bool').setVisible(False) # ensure that the correct entry is selected from the list: self.__update_knob_value(node, "tk_profile_list", current_profile_name) @@ -2872,17 +2751,10 @@ def __test_write_message(self): "Please be aware that this is a temporary location.\n" "Renders saved here will be removed at the end of the week.\n") - def __version_up_visible(self, node, visible): - - node.knob('increase_version').setVisible(visible) - node.knob('revert_to_version').setVisible(visible) - def __embedded_format_option(self, node, value): if value == True: - # node.node("project_reformat")['disable'].setValue(False) node.node("delivery_reformat")['disable'].setValue(False) elif value == False: - # node.node("project_reformat")['disable'].setValue(True) node.node("delivery_reformat")['disable'].setValue(True) def __embedded_ocio_option(self, node, value): @@ -2927,8 +2799,7 @@ def __on_knob_changed(self): write_type = self.get_node_write_type_name(node) write_type_profile = "Exr" if self.proj_info['sg_delivery_fileset'] != None: - if (write_type == "Version" or - write_type == "Matte"): + if write_type == "Version": write_type_profile = self.proj_info['sg_delivery_fileset']['name'].capitalize() @@ -2976,13 +2847,6 @@ def __on_knob_changed(self): self.__set_project_crop(node, False) if write_type_profile == "Dpx": node.node("Write1").knob("transfer").setValue('(auto detect)') - elif write_type == "Matte": - node.knob('convert_to_write').setVisible(False) - self.__set_project_crop(node, True) - self.__write_type_changed(node, True) - self.__embedded_format_option(node, True) - if write_type_profile == "Dpx": - node.node("Write1").knob("transfer").setValue('linear') elif write_type == "Test": self.__set_project_crop(node, False) self.__write_type_changed(node, True) @@ -2998,7 +2862,7 @@ def __on_knob_changed(self): node.node("Write1").knob("autocrop").setValue(True) except: pass - + # Scans script for existing name clashes and renames accordingly existing_node_names = [n.name() for n in nuke.allNodes(group=nuke.root())] new_output_name = "" @@ -3010,7 +2874,8 @@ def __on_knob_changed(self): break else: postfix += 1 - self.__set_output(node, new_output_name) + + self.__set_output(node, new_output_name) # Updates the predefined profile based on the write type self.__update_knob_value(node, "tk_profile_list", write_type_profile) # reset profile @@ -3019,10 +2884,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) - 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" elif write_type == "Element": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) @@ -3030,22 +2891,19 @@ def __on_knob_changed(self): elif write_type == "Denoise": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) - elif write_type == "Cleanup": + elif write_type == "SmartVector": 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, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) - self.__test_write_message() - elif write_type == "Matte": - self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") - node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) + self.__test_write_message() # 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() == "write_type_info": - write_type_url = "http://10.80.10.239/mediawiki-1.25.2/index.php?title=VFX_Wiki#SG_Write_Nodes" + write_type_url = "http://10.80.8.252/ssvfx-wiki-sphinx/workflow/nuke/nuke.html#sg-write-node" webbrowser.open_new_tab(write_type_url) elif knob.name() == "project_crop_bool": self.__embedded_format_option(node, knob.value()) @@ -3069,20 +2927,6 @@ def __on_knob_changed(self): node.node("Write1").knob("autocrop").setValue(knob.value()) except: pass - elif knob.name() == "increase_version": - nuke.tprint("Increasing version.") - """ - new_output_name = node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).value() - if not new_output_name: - nuke.tprint("Get base ouptput for write type!") - self.__set_output(node, new_output_name, increase_version=True) - else: - node['name'].setValue(write_type+"_"+str(new_output_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, increase_version=True) - """ elif knob.name() == "revert_to_version": nuke.tprint("Reverting to last version.") else: @@ -3113,6 +2957,7 @@ def __on_knob_changed(self): node['channels_cache'].setValue(node_channel) except: pass + def __get_current_script_path(self): """ Get the current script path (if the current script has been saved). This will @@ -3245,8 +3090,21 @@ def __update_knob_values(self, node, name, values_list): if k.values != values_list: k.setValues(values_list) + def __ensure_unique_name(self, name, existing_node_names): + + # rename to our new default name: + postfix = 1 + while True: + new_name = "%s%d" % (name, postfix) + if new_name not in existing_node_names: + return new_name + break + else: + postfix += 1 + def __get_list_index(self, the_list, item_name): + if the_list: if item_name in the_list: return the_list.index(item_name) From be87300acbaa502246047c3acbba079bb3edd33f Mon Sep 17 00:00:00 2001 From: dduffy Date: Mon, 26 Aug 2019 18:46:52 +0100 Subject: [PATCH 63/90] removed older templates --- gizmos/WriteTank.gizmo | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 7981c0a..0787368 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -53,24 +53,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" t "The Sgtk test template associated with this node" +INVISIBLE } - addUserKnob { - 1 matte_render_template - l "Sgtk Matte Template" - t "The Sgtk matte template associated with this node" - +INVISIBLE - } addUserKnob { 6 tk_is_fully_constructed l "Is Fully Constructed" From 614722515a4fe0f0857342e3410b6d1b0dd481cf Mon Sep 17 00:00:00 2001 From: dduffy Date: Thu, 29 Aug 2019 12:27:54 +0100 Subject: [PATCH 64/90] reomoving folder creation --- python/tk_nuke_writenode/handler.py | 59 ++++++++++++----------------- 1 file changed, 24 insertions(+), 35 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 68133f6..db7d546 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -2071,14 +2071,6 @@ def __set_output(self, node, output_name): # reset the render path self.reset_render_path(node) - - try: - dir_name = os.path.dirname(node['cached_path'].value()) - os.makedirs(dir_name) - nuke.tprint("Created output folder %s" %(dir_name)) - except: - pass - def __wrap_text(self, t, line_length): """ Wrap text to the line_length number of characters where possible @@ -2746,7 +2738,7 @@ def __test_write_message(self): user_name = self._app.context.user['name'].split() nuke.message( - "Hi %s" % str(user_name[0]) + "\n" + "%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") @@ -2835,33 +2827,30 @@ def __on_knob_changed(self): self.__set_output(node, node.knob("name").value()) elif knob.name() == "write_type": if self._curr_entity_type == 'Shot': - if self.proj_info['name'] == "Breakdowns": - pass - else: - if write_type == "Version": - node.knob('convert_to_write').setVisible(False) - self.__set_project_crop(node, True) - self.__write_type_changed(node, False) - self.__embedded_format_option(node, True) - if self.ctx_info.step['name'] == "Roto": - self.__set_project_crop(node, False) - if write_type_profile == "Dpx": - node.node("Write1").knob("transfer").setValue('(auto detect)') - elif write_type == "Test": - self.__set_project_crop(node, False) - self.__write_type_changed(node, True) - self.__test_write_message() - self.__embedded_format_option(node, False) - else: - node.knob('convert_to_write').setVisible(True) + if write_type == "Version": + node.knob('convert_to_write').setVisible(False) + self.__set_project_crop(node, True) + self.__write_type_changed(node, False) + self.__embedded_format_option(node, True) + if self.ctx_info.step['name'] == "Roto": self.__set_project_crop(node, False) - self.__write_type_changed(node, True) - write_type_profile = "Exr" - self.__embedded_format_option(node, False) - try: - node.node("Write1").knob("autocrop").setValue(True) - except: - pass + if write_type_profile == "Dpx": + node.node("Write1").knob("transfer").setValue('(auto detect)') + elif write_type == "Test": + self.__set_project_crop(node, False) + self.__write_type_changed(node, True) + self.__test_write_message() + self.__embedded_format_option(node, False) + else: + node.knob('convert_to_write').setVisible(True) + self.__set_project_crop(node, False) + self.__write_type_changed(node, True) + write_type_profile = "Exr" + self.__embedded_format_option(node, False) + try: + node.node("Write1").knob("autocrop").setValue(True) + except: + pass # Scans script for existing name clashes and renames accordingly existing_node_names = [n.name() for n in nuke.allNodes(group=nuke.root())] From 826c433c4b85710a2e082e9bec04408155e3390d Mon Sep 17 00:00:00 2001 From: dduffy Date: Tue, 3 Sep 2019 11:45:51 +0100 Subject: [PATCH 65/90] revert SV to 16bit - no diff in Sams check --- python/tk_nuke_writenode/handler.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index db7d546..e061cf3 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1548,9 +1548,9 @@ 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'}) nuke.tprint("Applying ZIP compression to %s output." % write_type) - elif write_type == "SmartVector": - self.__update_knob_value(node, 'exr_datatype', '32 bit half') - file_settings.update({'datatype' : '32 bit half'}) + # elif write_type == "SmartVector": + # self.__update_knob_value(node, 'exr_datatype', '32 bit half') + # file_settings.update({'datatype' : '32 bit half'}) promote_write_knobs = profile.get("promote_write_knobs", []) # Make sure any invalid entries are removed from the profile list: From b5914bbf513818e5182640c2a7b7685107fbfe62 Mon Sep 17 00:00:00 2001 From: dduffy Date: Tue, 3 Sep 2019 12:34:46 +0100 Subject: [PATCH 66/90] removed GOT legacy and set color space --- gizmos/WriteTank.gizmo | 9 --------- python/tk_nuke_writenode/handler.py | 24 ++++++++---------------- 2 files changed, 8 insertions(+), 25 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 0787368..06cb4e6 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -569,11 +569,6 @@ Gizmo { xpos 195 ypos -74 } - Log2Lin { - name lin_to_log_got - operation lin2log - disable true - } Reformat { name project_reformat type "to format" @@ -596,10 +591,6 @@ Reformat { pbb false disable true } - Log2Lin { - name log_to_lin_got - disable true - } Clamp { name matte_clamp disable true diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index e061cf3..8726899 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1840,12 +1840,12 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False write_type == "Version"): if color_space not in node.knob('colorspace').values(): color_space = next((color for color in node.knob('colorspace').values() if 'default' in color), None) - nuke.tprint("--- Could not get color space info. Setting default value of %s." % color_space) - else: - nuke.tprint("--- Setting colorspace to %s from Projects page." % color_space) - elif self.ctx_info.step['name'] != "Roto": - color_space = "linear" - elif (self.ctx_info.step['name'] == "Roto"):#and + # nuke.tprint("--- Could not get color space info. Setting default value of %s." % color_space) + # else: + # nuke.tprint("--- Setting colorspace to %s from Projects page." % color_space) + elif self.ctx_info.step['name'] != "Roto": + color_space = self.proj_info['sg_color_space'] + elif (self.ctx_info.step['name'] == "Roto"): color_space = "linear" node.knob("project_crop_bool").setValue(False) self.__embedded_format_option(node, False) @@ -1856,16 +1856,8 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False node['colorspace'].setValue(color_space) md = content_meta_data['metadata'] - md.fromScript(self.__get_metadata(node)) - - if (self.proj_info['name'] == "GOT8" and - write_type == "Version"): - node.node('lin_to_log_got')['disable'].setValue(False) - node.node('log_to_lin_got')['disable'].setValue(False) - else: - node.node('lin_to_log_got')['disable'].setValue(True) - node.node('log_to_lin_got')['disable'].setValue(True) - + md.fromScript(self.__get_metadata(node)) + # 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. From a5b312d1eeb74c3da2942a22a76da4f49d421a57 Mon Sep 17 00:00:00 2001 From: dduffy Date: Tue, 3 Sep 2019 12:39:59 +0100 Subject: [PATCH 67/90] removed legacy nodes --- python/tk_nuke_writenode/handler.py | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 8726899..1c30746 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -443,13 +443,9 @@ def create_project_settings_group(self, node): project_group['name'].setValue(node_name) project_group_process = nuke.toNode(project_group['name'].value()) project_group_process.begin() - input_node = nuke.createNode("Input", inpanel = False) - lin_to_log = nuke.createNode("Log2Lin", inpanel = False) - lin_to_log['name'].setValue("lin_to_log_got") + input_node = nuke.createNode("Input", inpanel = False) delivery_reformat = nuke.createNode("Reformat", inpanel = False) delivery_reformat['name'].setValue("delivery_reformat") - log_to_lin = nuke.createNode("Log2Lin", inpanel = False) - log_to_lin['name'].setValue("log_to_lin_got") project_tc = nuke.createNode("AddTimeCode", inpanel = False) project_tc['name'].setValue("project_tc") content_metadata = nuke.createNode("ModifyMetaData", inpanel = False) @@ -460,9 +456,7 @@ def create_project_settings_group(self, node): matte_clamp['name'].setValue("matte_clamp") # matte_clamp['disable'].setValue(True) output_node = nuke.createNode("Output", inpanel = False) - proj_group_nodes.append(lin_to_log) proj_group_nodes.append(delivery_reformat) - proj_group_nodes.append(log_to_lin) proj_group_nodes.append(project_tc) proj_group_nodes.append(content_metadata) proj_group_nodes.append(shot_ocio) @@ -526,9 +520,6 @@ def convert_sg_to_nuke_write_nodes(self, selected_node=None): else: node_name = sg_wn.name()+"_converted" - # Lin2Log - extra_node.node('lin_to_log_got')['disable'].setValue(sg_wn.node('lin_to_log_got')['disable'].value()) - extra_node.node('lin_to_log_got')['operation'].setValue(sg_wn.node('lin_to_log_got')['operation'].value()) # Embed crop extra_node.node('delivery_reformat')['disable'].setValue(sg_wn.node('delivery_reformat')['disable'].value()) extra_node.node('delivery_reformat')['filter'].setValue(sg_wn.node('delivery_reformat')['filter'].value()) @@ -536,9 +527,6 @@ def convert_sg_to_nuke_write_nodes(self, selected_node=None): extra_node.node('delivery_reformat')['format'].setValue(sg_wn.node('delivery_reformat')['format'].value()) extra_node.node('delivery_reformat')['pbb'].setValue(sg_wn.node('delivery_reformat')['pbb'].value()) extra_node.node('delivery_reformat')['black_outside'].setValue(sg_wn.node('delivery_reformat')['black_outside'].value()) - # Log2Lin - extra_node.node('log_to_lin_got')['disable'].setValue(sg_wn.node('log_to_lin_got')['disable'].value()) - extra_node.node('log_to_lin_got')['operation'].setValue(sg_wn.node('log_to_lin_got')['operation'].value()) # Embed tc extra_node.node('project_tc')['startcode'].setValue(sg_wn.node('project_tc')['startcode'].value()) extra_node.node('project_tc')['fps'].setValue(sg_wn.node('project_tc')['fps'].value()) From 5a45b25bff42a9ff2abf1e4d7dce89fe7c914ffe Mon Sep 17 00:00:00 2001 From: dduffy Date: Thu, 5 Sep 2019 14:16:56 +0100 Subject: [PATCH 68/90] adding internal format_crop to loose bb and pixel edge --- gizmos/WriteTank.gizmo | 7 ++++++- python/tk_nuke_writenode/handler.py | 30 +++++++++++++++++++++++------ 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 06cb4e6..95fd114 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -323,7 +323,7 @@ Gizmo { l "autocrop" t "Choose to crop footage to the Project format." +STARTLINE - -INVISIBLE + -INVISIBLE } addUserKnob { 4 dpx_datatype @@ -591,6 +591,11 @@ Reformat { pbb false disable true } + Crop { + name format_crop + reformat true + crop false + } Clamp { name matte_clamp disable true diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 1c30746..e0a82fd 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -43,6 +43,7 @@ class TankWriteNodeHandler(object): EMBED_META_DATA = "content_meta_data" EMBED_SHOT_OCIO = "shot_ocio" EMBED_DELIVERY_REFORMAT = "delivery_reformat" + EMBED_FORMAT_CROP = "format_crop" EMBED_MATTE_CLAMP = "matte_clamp" OUTPUT_KNOB_NAME = "tank_channel" USE_NAME_AS_OUTPUT_KNOB_NAME = "tk_use_name_as_channel" @@ -446,6 +447,8 @@ def create_project_settings_group(self, node): input_node = nuke.createNode("Input", inpanel = False) delivery_reformat = nuke.createNode("Reformat", inpanel = False) delivery_reformat['name'].setValue("delivery_reformat") + format_crop = nuke.createNode("Crop", inpanel = False) + format_crop['name'].setValue("format_crop") project_tc = nuke.createNode("AddTimeCode", inpanel = False) project_tc['name'].setValue("project_tc") content_metadata = nuke.createNode("ModifyMetaData", inpanel = False) @@ -454,9 +457,9 @@ def create_project_settings_group(self, node): shot_ocio['name'].setValue("shot_ocio") matte_clamp = nuke.createNode("Clamp", inpanel = False) matte_clamp['name'].setValue("matte_clamp") - # matte_clamp['disable'].setValue(True) output_node = nuke.createNode("Output", inpanel = False) proj_group_nodes.append(delivery_reformat) + proj_group_nodes.append(format_crop) proj_group_nodes.append(project_tc) proj_group_nodes.append(content_metadata) proj_group_nodes.append(shot_ocio) @@ -520,13 +523,18 @@ def convert_sg_to_nuke_write_nodes(self, selected_node=None): else: node_name = sg_wn.name()+"_converted" - # Embed crop + # Embed reformat extra_node.node('delivery_reformat')['disable'].setValue(sg_wn.node('delivery_reformat')['disable'].value()) extra_node.node('delivery_reformat')['filter'].setValue(sg_wn.node('delivery_reformat')['filter'].value()) extra_node.node('delivery_reformat')['resize'].setValue(sg_wn.node('delivery_reformat')['resize'].value()) extra_node.node('delivery_reformat')['format'].setValue(sg_wn.node('delivery_reformat')['format'].value()) extra_node.node('delivery_reformat')['pbb'].setValue(sg_wn.node('delivery_reformat')['pbb'].value()) extra_node.node('delivery_reformat')['black_outside'].setValue(sg_wn.node('delivery_reformat')['black_outside'].value()) + # Embed crop + extra_node.node('format_crop')['disable'].setValue(sg_wn.node('format_crop')['disable'].value()) + extra_node.node('format_crop')['box'].setValue(sg_wn.node('format_crop')['box'].value()) + extra_node.node('format_crop')['reformat'].setValue(sg_wn.node('format_crop')['reformat'].value()) + extra_node.node('format_crop')['crop'].setValue(sg_wn.node('format_crop')['crop'].value()) # Embed tc extra_node.node('project_tc')['startcode'].setValue(sg_wn.node('project_tc')['startcode'].value()) extra_node.node('project_tc')['fps'].setValue(sg_wn.node('project_tc')['fps'].value()) @@ -1711,6 +1719,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False if self._curr_entity_type == 'Shot': # Update embeded time code delivery_reformat = node.node(TankWriteNodeHandler.EMBED_DELIVERY_REFORMAT) + format_crop = node.node(TankWriteNodeHandler.EMBED_FORMAT_CROP) time_code = node.node(TankWriteNodeHandler.EMBED_TIME_CODE) content_meta_data = node.node(TankWriteNodeHandler.EMBED_META_DATA) shot_ocio = node.node(TankWriteNodeHandler.EMBED_SHOT_OCIO) @@ -1742,7 +1751,9 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False # Set the embeded delivery reformat if not (self.proj_info['sg_delivery_format_width'] and self.proj_info['sg_delivery_format_height']): - node.node("delivery_reformat")['disable'].setValue(True) + delivery_reformat['disable'].setValue(True) + node.node("format_crop")['disable'].setValue(True) + nuke.tprint("No delivery reformat info given on Projects.") else: # Set the project reformat first @@ -1753,9 +1764,10 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False int(self.proj_info['sg_pixel_aspect_ratio'])) if write_type != "Version": - node.node("delivery_reformat")['disable'].setValue(True) + delivery_reformat['disable'].setValue(True) + node.node("format_crop")['disable'].setValue(True) else: - # Add sG reformat settings + # Add SG reformat settings filter_match = next((f for f in delivery_reformat['filter'].values() if f == self.proj_info['sg_delivery_reformat_filter']), None) if filter_match: delivery_reformat['filter'].setValue(filter_match) @@ -1765,7 +1777,10 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False # Set the delivery_reformat node delivery_reformat.knobs()["format"].setValue(delivery_format) - node.node("delivery_reformat")['disable'].setValue(False) + crop_box_value = (0,0, delivery_format.width(), delivery_format.height()) + format_crop['box'].setValue(crop_box_value) + delivery_reformat['disable'].setValue(False) + format_crop['disable'].setValue(False) # Set internal ocio if required color_space = None @@ -2726,8 +2741,11 @@ def __test_write_message(self): def __embedded_format_option(self, node, value): if value == True: node.node("delivery_reformat")['disable'].setValue(False) + node.node("format_crop")['disable'].setValue(False) + elif value == False: node.node("delivery_reformat")['disable'].setValue(True) + node.node("format_crop")['disable'].setValue(True) def __embedded_ocio_option(self, node, value): if value == True: From d40064720b683b162cd619c89b3ad7978aa5aea6 Mon Sep 17 00:00:00 2001 From: dduffy Date: Thu, 12 Sep 2019 16:49:28 +0100 Subject: [PATCH 69/90] adding task_name for template resolution --- gizmos/WriteTank.gizmo | 11 -------- python/tk_nuke_writenode/handler.py | 40 +++++++++++++++++++---------- 2 files changed, 26 insertions(+), 25 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 95fd114..194c2b4 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -569,17 +569,6 @@ Gizmo { xpos 195 ypos -74 } -Reformat { - name project_reformat - type "to format" - resize none - filter "Impulse" - box_width 800 - box_height 1 - black_outside true - pbb false - disable true - } Reformat { name delivery_reformat type "to format" diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index e0a82fd..d29495f 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -97,17 +97,11 @@ def __init__(self, app): 'sg_project_color_management']) self.shot_info = self.sg.find_one("Shot", - [['id', 'is', self._entity['id']]], + [['id', 'is', self._entity['id']]], ['name', 'sg_main_plate', - 'sg_without_ocio']) - # self.software_info = self.sg.find_one("Software", - # [['id', 'is_not', 0], - # ['code', 'is', 'RV']], - # ['code', - # 'windows_path', - # "version_names" - # ]) + 'sg_without_ocio', + 'sg_shot_mattes']) self.ctx_info = self._app.context self.get_shot_frame_range() @@ -849,9 +843,8 @@ def add_format(self, project_shortcode, format_type, format_width, format_height if (format_match.width()== format_width and format_match.height()== format_height and format_match.pixelAspect() == pixel_aspect_ratio): - print("Format already exists!") + pass else: - print("Adding format") format_match = nuke.addFormat("%d %d %d %s" %(format_width, format_height, pixel_aspect_ratio, format_name)) else: format_match = nuke.addFormat("%d %d %d %s" %(format_width, format_height, pixel_aspect_ratio,format_name)) @@ -1196,6 +1189,24 @@ def on_after_render_gizmo_callback(self): ################################################################################################ # Private methods + def __test_mattes(self, node, step, steps_to_check_mattes): + + """ + Checks SG write input for all embedded channels. + Flag if additional mattes found. + """ + + if not self.shot_info["sg_shot_mattes"]: + nuke.tprint("No mattes assigned on SG. Skipping") + else: + nuke.tprint("Found the following mattes assigned on SG.") + write_type = self.get_node_write_type_name(node) + if write_type == "Version": + for matte in self.shot_info["sg_shot_mattes"]: + nuke.tprint(" - %s" %(matte['name'])) + + + def __get_node_profile_settings(self, node): """ @@ -1356,7 +1367,7 @@ def __update_path_preview(self, node, is_proxy): if self._curr_entity_type == 'Shot': fields ={ 'Shot': curr_fields['Shot'], - 'Step': curr_fields['Step'], + 'task_name': curr_fields['task_name'], 'name': '', 'output': '', 'version': curr_fields['version'] @@ -1377,7 +1388,7 @@ def __update_path_preview(self, node, is_proxy): elif self._curr_entity_type == 'Asset': fields ={ 'Asset': curr_fields['Asset'], - 'Step': curr_fields['Step'], + 'task_name': curr_fields['task_name'], 'sg_asset_type': curr_fields['sg_asset_type'], 'name': '', 'output': '', @@ -1814,7 +1825,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False node['shot_ocio_bool'].setValue(False) shot_ocio['disable'].setValue(True) else: - nuke.tprint("Step is", self.ctx_info.step['name']) + nuke.tprint("task_name is", self.ctx_info.step['name']) if (self.ctx_info.step['name'] == 'Comp_Texture' or self.ctx_info.step['name'] == 'Comp_Warp'): node['shot_ocio_bool'].setValue(False) @@ -1861,6 +1872,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False md = content_meta_data['metadata'] md.fromScript(self.__get_metadata(node)) + self.__test_mattes(node, "", "") # 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. From 6528bdc66dcb2878244f1548735a0ede7bf5e5dc Mon Sep 17 00:00:00 2001 From: dduffy Date: Fri, 13 Sep 2019 15:43:25 +0100 Subject: [PATCH 70/90] added disabled internal shuffle --- gizmos/WriteTank.gizmo | 4 ++++ python/tk_nuke_writenode/handler.py | 33 +++++++++-------------------- 2 files changed, 14 insertions(+), 23 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 194c2b4..1357b01 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -569,6 +569,10 @@ Gizmo { xpos 195 ypos -74 } + Shuffle { + name internal_shuffle + disable true + } Reformat { name delivery_reformat type "to format" diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index d29495f..1038056 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -43,6 +43,7 @@ class TankWriteNodeHandler(object): EMBED_META_DATA = "content_meta_data" EMBED_SHOT_OCIO = "shot_ocio" EMBED_DELIVERY_REFORMAT = "delivery_reformat" + EMBED_SHUFFLE = "internal_shuffle" EMBED_FORMAT_CROP = "format_crop" EMBED_MATTE_CLAMP = "matte_clamp" OUTPUT_KNOB_NAME = "tank_channel" @@ -439,6 +440,8 @@ def create_project_settings_group(self, node): project_group_process = nuke.toNode(project_group['name'].value()) project_group_process.begin() input_node = nuke.createNode("Input", inpanel = False) + internal_shuffle = nuke.createNode("Shuffle", inpanel = False) + internal_shuffle['name'].setValue("internal_shuffle") delivery_reformat = nuke.createNode("Reformat", inpanel = False) delivery_reformat['name'].setValue("delivery_reformat") format_crop = nuke.createNode("Crop", inpanel = False) @@ -452,6 +455,7 @@ def create_project_settings_group(self, node): matte_clamp = nuke.createNode("Clamp", inpanel = False) matte_clamp['name'].setValue("matte_clamp") output_node = nuke.createNode("Output", inpanel = False) + proj_group_nodes.append(internal_shuffle) proj_group_nodes.append(delivery_reformat) proj_group_nodes.append(format_crop) proj_group_nodes.append(project_tc) @@ -517,7 +521,9 @@ def convert_sg_to_nuke_write_nodes(self, selected_node=None): else: node_name = sg_wn.name()+"_converted" - # Embed reformat + # Embed shuffle + extra_node.node('internal_shuffle')['disable'].setValue(sg_wn.node('internal_shuffle')['disable'].value()) + # Embed reformat extra_node.node('delivery_reformat')['disable'].setValue(sg_wn.node('delivery_reformat')['disable'].value()) extra_node.node('delivery_reformat')['filter'].setValue(sg_wn.node('delivery_reformat')['filter'].value()) extra_node.node('delivery_reformat')['resize'].setValue(sg_wn.node('delivery_reformat')['resize'].value()) @@ -1188,26 +1194,7 @@ def on_after_render_gizmo_callback(self): raise ################################################################################################ - # Private methods - def __test_mattes(self, node, step, steps_to_check_mattes): - - """ - Checks SG write input for all embedded channels. - Flag if additional mattes found. - """ - - if not self.shot_info["sg_shot_mattes"]: - nuke.tprint("No mattes assigned on SG. Skipping") - else: - nuke.tprint("Found the following mattes assigned on SG.") - write_type = self.get_node_write_type_name(node) - if write_type == "Version": - for matte in self.shot_info["sg_shot_mattes"]: - nuke.tprint(" - %s" %(matte['name'])) - - - - + # Private methods def __get_node_profile_settings(self, node): """ Find the profile settings for the specified node @@ -1730,6 +1717,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False if self._curr_entity_type == 'Shot': # Update embeded time code delivery_reformat = node.node(TankWriteNodeHandler.EMBED_DELIVERY_REFORMAT) + internal_shuffle = node.node(TankWriteNodeHandler.EMBED_SHUFFLE) format_crop = node.node(TankWriteNodeHandler.EMBED_FORMAT_CROP) time_code = node.node(TankWriteNodeHandler.EMBED_TIME_CODE) content_meta_data = node.node(TankWriteNodeHandler.EMBED_META_DATA) @@ -1871,8 +1859,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False md = content_meta_data['metadata'] md.fromScript(self.__get_metadata(node)) - - self.__test_mattes(node, "", "") + # 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. From bafb3bcb1b873e72ca8263a821acb2d3b9d95606 Mon Sep 17 00:00:00 2001 From: dduffy Date: Mon, 16 Sep 2019 16:25:44 +0100 Subject: [PATCH 71/90] checking for assigned mattes. moved shot_info into method --- gizmos/WriteTank.gizmo | 5 ++++ python/tk_nuke_writenode/handler.py | 39 +++++++++++++++++++---------- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 1357b01..443d758 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -235,6 +235,11 @@ Gizmo { t "Select the type of node you require this to be." M {Version Element Denoise SmartVector Test} } + addUserKnob { + 22 check_mattes + l "Check mattes" + T " " + } addUserKnob { 22 write_type_info l "Info" diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 1038056..0aa64a4 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -24,9 +24,15 @@ import tank from tank import TankError -from tank.platform import constants +# from tank.platform import constants from tank.platform.qt import QtCore -from tank_vendor import shotgun_api3 as sgapi + +try: + from software.nuke.nuke_python import nuke_tools as nt + reload(nt) + ntools = nt.NukeTools() +except: + nuke.tprint("Could not load studio tools") # Special exception raised when the work file cannot be resolved. class TkComputePathError(TankError): @@ -96,13 +102,6 @@ def __init__(self, app): 'sg_delivery_fileset_compression', 'sg_color_space', 'sg_project_color_management']) - - self.shot_info = self.sg.find_one("Shot", - [['id', 'is', self._entity['id']]], - ['name', - 'sg_main_plate', - 'sg_without_ocio', - 'sg_shot_mattes']) self.ctx_info = self._app.context self.get_shot_frame_range() @@ -1194,7 +1193,7 @@ def on_after_render_gizmo_callback(self): raise ################################################################################################ - # Private methods + # Private methods def __get_node_profile_settings(self, node): """ Find the profile settings for the specified node @@ -1471,7 +1470,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False be reset. For example, if colorspace has been set in the profile and force is False then the knob won't get reset to the value from the profile. """ - nuke.tprint("Setting profile for %s" %profile_name) + # nuke.tprint("Setting profile for %s" %profile_name) # can't change the profile if this isn't a valid profile: if profile_name not in self._profiles: # at the very least, try to restore the file format settings from the cached values: @@ -2775,7 +2774,6 @@ def __on_knob_changed(self): node = nuke.thisNode() knob = nuke.thisKnob() grp = nuke.thisGroup() - if not self.__is_node_fully_constructed(node): # knobChanged will be called during script load for all knobs with non-default # values. We want to ignore these implicit changes so we make use of a knob to @@ -2791,7 +2789,6 @@ def __on_knob_changed(self): if write_type == "Version": write_type_profile = self.proj_info['sg_delivery_fileset']['name'].capitalize() - # Main handler area for knob changed if knob.name() == "tk_profile_list": # change the profile for the specified node: @@ -2891,6 +2888,22 @@ def __on_knob_changed(self): elif knob.name() == "write_type_info": write_type_url = "http://10.80.8.252/ssvfx-wiki-sphinx/workflow/nuke/nuke.html#sg-write-node" webbrowser.open_new_tab(write_type_url) + elif knob.name() == "check_mattes": + if not ntools: + nuke.tprint("Could not find NukeTools") + else: + self.shot_info = self.sg.find_one("Shot", + [['id', 'is', self._entity['id']]], + ['name', + 'id', + 'sg_main_plate', + 'sg_without_ocio', + 'sg_shot_mattes']) + try: + ntools.test_channels(node, self.shot_info, ['rgb', 'rgba']) + except: + pass + elif knob.name() == "project_crop_bool": self.__embedded_format_option(node, knob.value()) self.__set_project_crop_cache(node, knob.value()) From 54b0e0a5f2165923a0c535f5063a717cfd241dc2 Mon Sep 17 00:00:00 2001 From: dduffy Date: Mon, 16 Sep 2019 17:25:01 +0100 Subject: [PATCH 72/90] removed old ocio section --- python/tk_nuke_writenode/handler.py | 61 +---------------------------- 1 file changed, 1 insertion(+), 60 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 0aa64a4..2b939d5 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -15,8 +15,6 @@ import datetime import base64 import re -import subprocess -import traceback import webbrowser import nuke @@ -24,7 +22,6 @@ import tank from tank import TankError -# from tank.platform import constants from tank.platform.qt import QtCore try: @@ -264,7 +261,7 @@ def reset_render_path(self, node): """ Reset the render path of the specified node. This will force the render path to be updated based on - the current script path and configuraton + the current script path and configuration. """ is_proxy = node.proxy() self.__update_render_path(node, force_reset=True, is_proxy=is_proxy) @@ -1780,62 +1777,6 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False delivery_reformat['disable'].setValue(False) format_crop['disable'].setValue(False) - # Set internal ocio if required - color_space = None - if self.proj_info['sg_color_space']: - """ - if (self.proj_info['sg_project_color_management'] == "OCIO" and not - self.shot_info['sg_without_ocio']): - color_space = "acescg" - ocio_warning = "" - sg_info_nodes = [n for n in self.get_nodes_by_class('SGInfoNode')] - if not sg_info_nodes: - nuke.message("Could not find SG Info node that is required for OCIO color setup.") - shot_ocio['disable'].setValue(True) - else: - if len(sg_info_nodes)==1: - main_plate_name = sg_info_nodes[0]['main_plate_name'].value() - if not main_plate_name: - nuke.message("WARNING:\nOCIO is a requirement for this shot but required info cannot be found.") - pass - else: - in_color_space = next((color for color in shot_ocio['in_colorspace'].values() if main_plate_name in color), None) - # Check of the colorspace exists within the embed shot ocio node - if in_color_space: - nuke.tprint("Setting internal OCIO in_colorspace to: %s" % main_plate_name) - shot_ocio['in_colorspace'].setValue(main_plate_name) - shot_ocio['disable'].setValue(False) - ocio_warning += "OCIO Found and set.
" - self.__update_knob_value(node, "ocio_warning", "".join(self.__wrap_text(ocio_warning, 100))) - # Set OCIO based on task type - if write_type != "Version": - node['shot_ocio_bool'].setValue(False) - shot_ocio['disable'].setValue(True) - else: - nuke.tprint("task_name is", self.ctx_info.step['name']) - if (self.ctx_info.step['name'] == 'Comp_Texture' or - self.ctx_info.step['name'] == 'Comp_Warp'): - node['shot_ocio_bool'].setValue(False) - shot_ocio['disable'].setValue(True) - else: - node['shot_ocio_bool'].setValue(True) - shot_ocio['disable'].setValue(False) - else: - nuke.tprint("!!! Could not set internal OCIO in color value to %s" % main_plate_name) - shot_ocio['disable'].setValue(True) - node['shot_ocio_bool'].setValue(False) - ocio_warning += "Warning. OCIO could not set!
" - self.__update_knob_value(node, "ocio_warning", "".join(self.__wrap_text(ocio_warning, 100))) - - else: - # Nuke default - disabling OCIO - nuke.tprint("Disabling OCIO related settings.") - color_space = self.proj_info['sg_color_space'] - node['shot_ocio_bool'].setValue(False) - node['shot_ocio_bool'].setVisible(False) - shot_ocio['disable'].setValue(True) - node.knob("ocio_warning").setVisible(False) - """ # Set colorspace based of SG values if (self.ctx_info.step['name'] != "Roto" and write_type == "Version"): From 1caee512629cc38ff88f8c669e4f4ead9407a107 Mon Sep 17 00:00:00 2001 From: dduffy Date: Tue, 17 Sep 2019 10:48:38 +0100 Subject: [PATCH 73/90] latest - fixed outdated gizmo --- app.py | 3 ++- gizmos/WriteTank.gizmo | 2 +- python/tk_nuke_writenode/handler.py | 10 +++------- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/app.py b/app.py index c7bd834..e9bb61d 100644 --- a/app.py +++ b/app.py @@ -325,7 +325,8 @@ def __add_write_node_commands(self, context=None): # as these aren't supported when converting back # todo: We should check the settings and then scan the scene to see if any SG write nodes use promoted knobs write_nodes = self.get_setting("write_nodes") - promoted_knob_write_nodes = next((a_node for a_node in write_nodes if a_node['promote_write_knobs']), None) + if write_nodes: + promoted_knob_write_nodes = next((a_node for a_node in write_nodes if a_node['promote_write_knobs']), None) if not promoted_knob_write_nodes: # no presets use promoted knobs so we are OK to register the menus. diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 443d758..7b45dbf 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -566,7 +566,7 @@ Gizmo { 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 func = nuke._shotgun_write_node_handler.on_node_created_gizmo_callback()\n func.next()\n func.send(func)\n" + onCreate "import nuke\nif hasattr(nuke, \"_shotgun_write_node_handler\"):\n nuke._shotgun_write_node_handler.on_node_created_gizmo_callback()" } Input { inputs 0 diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 249f073..4aee9e4 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -26,7 +26,6 @@ try: from software.nuke.nuke_python import nuke_tools as nt - reload(nt) ntools = nt.NukeTools() except: nuke.tprint("Could not load studio tools") @@ -846,8 +845,7 @@ def add_format(self, project_shortcode, format_type, format_width, format_height Create a new one and return if not found """ format_name = "%s_%s_%d" % (project_shortcode,format_type,format_width) - format_match = next((format for format in nuke.formats() if format.name() == format_name),None) - + format_match = next((format_ for format_ in nuke.formats() if format_.name() == format_name),None) if format_match: if (format_match.width()== format_width and format_match.height()== format_height and @@ -923,10 +921,8 @@ def on_node_created_gizmo_callback(self): # what's going on and the consequences of changing the on_node_created # behavior. - # self.__setup_new_node(current_node) - # self.reset_render_path(current_node) - self.setup_new_node(nuke.thisNode()) + # self.reset_render_path(nuke.thisNode()) def on_compute_path_gizmo_callback(self): """ @@ -1774,7 +1770,6 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False write_type == "Version"): if color_space not in node.knob('colorspace').values(): color_space = next((color for color in node.knob('colorspace').values() if 'default' in color), None) - # nuke.tprint("--- Could not get color space info. Setting default value of %s." % color_space) # else: # nuke.tprint("--- Setting colorspace to %s from Projects page." % color_space) elif self.ctx_info.step['name'] != "Roto": @@ -1787,6 +1782,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False else: color_space = next((color for color in node.knob('colorspace').values() if 'default' in color), None) + nuke.tprint("--- Setting default colorspace value of %s." % color_space) node['colorspace'].setValue(color_space) md = content_meta_data['metadata'] From 8fac07330bc16c9f13e1f1172d1820cfdbda66c8 Mon Sep 17 00:00:00 2001 From: dduffy Date: Tue, 17 Sep 2019 11:44:30 +0100 Subject: [PATCH 74/90] cleanup --- python/tk_nuke_writenode/handler.py | 39 ++++++++++++++--------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 4aee9e4..c0fdb75 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -60,10 +60,6 @@ def __init__(self, app): """ self._app = app self._script_template = self._app.get_template("template_script_work") - # Context info - self._curr_entity_type = self._app.context.entity['type'] - self._project = self._app.context.project - self._entity = self._app.context.entity # cache the profiles: self._promoted_knobs = {} @@ -82,7 +78,7 @@ def __init__(self, app): self.sg = self._app.engine.shotgun self.proj_info = self.sg.find_one("Project", - [['id', 'is', self._project['id']]], + [['id', 'is', self._app.context.project['id']]], ['name', 'sg_frame_rate', 'sg_data_type', @@ -140,7 +136,7 @@ def populate_script_template(self): def get_shot_frame_range(self): - if self._curr_entity_type == "Shot": + if self._app.context.entity['type'] == "Shot": self.frame_range_app = self._app.engine.apps["tk-multi-setframerange"] self.frame_range = self.frame_range_app.get_frame_range_from_shotgun() @@ -1335,7 +1331,7 @@ def __update_path_preview(self, node, is_proxy): curr_fields = work_template.get_fields(script_path) context_path = None - if self._curr_entity_type == 'Shot': + if self._app.context.entity['type'] == 'Shot': fields ={ 'Shot': curr_fields['Shot'], 'task_name': curr_fields['task_name'], @@ -1356,7 +1352,7 @@ def __update_path_preview(self, node, is_proxy): context_path = context_info.apply_fields(fields) - elif self._curr_entity_type == 'Asset': + elif self._app.context.entity['type'] == 'Asset': fields ={ 'Asset': curr_fields['Asset'], 'task_name': curr_fields['task_name'], @@ -1696,9 +1692,9 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False write_type == "Version"): if self.proj_info['sg_delivery_fileset_compression']: node.node("Write1").knob("compression").setValue(self.proj_info['sg_delivery_fileset_compression']) - nuke.tprint("Setting Version compression from SG Project values to : " + self.proj_info['sg_delivery_fileset_compression']) + # nuke.tprint("Setting Version compression from SG Project values to : " + self.proj_info['sg_delivery_fileset_compression']) - if self._curr_entity_type == 'Shot': + if self._app.context.entity['type'] == 'Shot': # Update embeded time code delivery_reformat = node.node(TankWriteNodeHandler.EMBED_DELIVERY_REFORMAT) internal_shuffle = node.node(TankWriteNodeHandler.EMBED_SHUFFLE) @@ -1782,7 +1778,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False else: color_space = next((color for color in node.knob('colorspace').values() if 'default' in color), None) - nuke.tprint("--- Setting default colorspace value of %s." % color_space) + # nuke.tprint("--- Setting default colorspace value of %s." % color_space) node['colorspace'].setValue(color_space) md = content_meta_data['metadata'] @@ -2565,7 +2561,7 @@ def setup_new_node(self, node): # set the write type for creation of correct output write_type = self.get_node_write_type_name(node) - if self._curr_entity_type == 'Shot': + if self._app.context.entity['type'] == 'Shot': if self.proj_info['name'] == "Breakdowns": node.knob('project_crop_bool').setVisible(False) node.knob('shot_ocio_bool').setVisible(False) @@ -2590,7 +2586,7 @@ def setup_new_node(self, node): else: node.knob("project_crop_bool").setValue(True) self.__embedded_format_option(node, True) - if self._curr_entity_type == 'Asset': + if self._app.context.entity['type'] == 'Asset': if write_type == "Version": node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) node.knob('project_crop_bool').setVisible(False) @@ -2684,12 +2680,10 @@ def __set_project_crop(self, node, bool_value): def __set_project_crop_cache(self, node, bool_value): - if bool_value == True: - nuke.tprint("Enabling project reformat and caching.") + if bool_value == True: node['tk_project_format_cache'].setValue("True") elif bool_value == False: node['tk_project_format_cache'].setValue("False") - nuke.tprint("Disabling project reformat and caching.") def __on_knob_changed(self): """ @@ -2748,7 +2742,7 @@ def __on_knob_changed(self): # update output to reflect the node name: self.__set_output(node, node.knob("name").value()) elif knob.name() == "write_type": - if self._curr_entity_type == 'Shot': + if self._app.context.entity['type'] == 'Shot': if write_type == "Version": node.knob('convert_to_write').setVisible(False) self.__set_project_crop(node, True) @@ -2791,7 +2785,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._app.context.entity['type'] == 'Asset': if write_type== "Version": self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) @@ -2817,16 +2811,21 @@ def __on_knob_changed(self): write_type_url = "http://10.80.8.252/ssvfx-wiki-sphinx/workflow/nuke/nuke.html#sg-write-node" webbrowser.open_new_tab(write_type_url) elif knob.name() == "check_mattes": + self.shot_info = None + if not ntools: nuke.tprint("Could not find NukeTools") else: + self.shot_info = self.sg.find_one("Shot", - [['id', 'is', self._entity['id']]], + [['id', 'is', self._app.context.entity['id']]], ['name', 'id', 'sg_main_plate', 'sg_without_ocio', - 'sg_shot_mattes']) + 'sg_shot_mattes']) + + nuke.tprint("Got info from entity: %d" %(self._app.context.entity['id'])) try: ntools.test_channels(node, self.shot_info, ['rgb', 'rgba']) except: From b8bdc506169b24a63fe6cc7dbbefd87e64bfe1f4 Mon Sep 17 00:00:00 2001 From: rthompson Date: Fri, 4 Oct 2019 17:24:25 +0100 Subject: [PATCH 75/90] Added conversion button to Test --- 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 c0fdb75..636b29b 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -2753,6 +2753,7 @@ def __on_knob_changed(self): if write_type_profile == "Dpx": node.node("Write1").knob("transfer").setValue('(auto detect)') elif write_type == "Test": + node.knob('convert_to_write').setVisible(True) self.__set_project_crop(node, False) self.__write_type_changed(node, True) self.__test_write_message() From 40cd76fc7bbd199af01e25c33c6346a840d0b44a Mon Sep 17 00:00:00 2001 From: rthompson Date: Fri, 11 Oct 2019 15:12:05 +0100 Subject: [PATCH 76/90] removed convert_to_write button from Test/Version --- python/tk_nuke_writenode/handler.py | 1 - 1 file changed, 1 deletion(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 636b29b..c0fdb75 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -2753,7 +2753,6 @@ def __on_knob_changed(self): if write_type_profile == "Dpx": node.node("Write1").knob("transfer").setValue('(auto detect)') elif write_type == "Test": - node.knob('convert_to_write').setVisible(True) self.__set_project_crop(node, False) self.__write_type_changed(node, True) self.__test_write_message() From 91b3bf6c71f467d0bee2190e15ed2b43bc9f341b Mon Sep 17 00:00:00 2001 From: dduffy Date: Wed, 16 Oct 2019 11:01:57 +0100 Subject: [PATCH 77/90] updated profile setup for mattes --- python/tk_nuke_writenode/handler.py | 32 ++++++++++++++++------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index c0fdb75..014af82 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -94,7 +94,8 @@ def __init__(self, app): 'sg_delivery_fileset_compression', 'sg_color_space', 'sg_project_color_management']) - + self.shot_info = None + self.ctx_info = self._app.context self.get_shot_frame_range() @@ -1453,6 +1454,14 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False """ # nuke.tprint("Setting profile for %s" %profile_name) # can't change the profile if this isn't a valid profile: + self.shot_info = self.sg.find_one("Shot", + [['id', 'is', self._app.context.entity['id']]], + ['name', + 'id', + 'sg_main_plate', + 'sg_without_ocio', + 'sg_shot_mattes']) + 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) @@ -1646,6 +1655,11 @@ 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 not self.shot_info['sg_shot_mattes']: + pass + else: + nuke.tprint("Found assigned mattes on SG. Setting channels to all") + profile_channel = "all" if profile_name == "Dpx": node.knob('dpx_datatype').setVisible(True) node.knob('exr_datatype').setVisible(False) @@ -1655,7 +1669,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False elif profile_name == "Exr": node.knob('exr_datatype').setVisible(True) node.knob('dpx_datatype').setVisible(False) - profile_channel = "rgba" + try: if node['channels_cache'].value() != "": profile_channel = node['channels_cache'].value() @@ -1664,7 +1678,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False node.node(TankWriteNodeHandler.WRITE_NODE_NAME)['metadata'].setValue('all metadata') node.knob('auto_crop').setVisible(False) if write_type == "Element": - profile_channel = "rgba" + profile_channel = "all" node.knob('auto_crop').setVisible(True) node.knob('auto_crop').setValue(True) node.node("Write1").knob("autocrop").setValue(True) @@ -2811,21 +2825,11 @@ def __on_knob_changed(self): write_type_url = "http://10.80.8.252/ssvfx-wiki-sphinx/workflow/nuke/nuke.html#sg-write-node" webbrowser.open_new_tab(write_type_url) elif knob.name() == "check_mattes": - self.shot_info = None if not ntools: nuke.tprint("Could not find NukeTools") else: - - self.shot_info = self.sg.find_one("Shot", - [['id', 'is', self._app.context.entity['id']]], - ['name', - 'id', - 'sg_main_plate', - 'sg_without_ocio', - 'sg_shot_mattes']) - - nuke.tprint("Got info from entity: %d" %(self._app.context.entity['id'])) + try: ntools.test_channels(node, self.shot_info, ['rgb', 'rgba']) except: From 5dee698620d68e9aff384a1ae1ad567af23cf7ec Mon Sep 17 00:00:00 2001 From: rthompson Date: Fri, 1 Nov 2019 10:00:32 +0000 Subject: [PATCH 78/90] Added functionality in asset context #BUG Can't swap between asset/shot contexts --- .gitignore | 1 + python/tk_nuke_writenode/handler.py | 170 ++++++++++++++++++++++++++-- 2 files changed, 163 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index c916a16..c2d5fbe 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,4 @@ nosetests.xml .project .pydevproject gizmos/tab_stats.dat +python/tk_nuke_writenode/handler.py.functional diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 014af82..ed395d3 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1655,11 +1655,17 @@ 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 not self.shot_info['sg_shot_mattes']: - pass + + context = self._app.context.entity['type'] + if context != 'Asset': + if not self.shot_info['sg_shot_mattes']: + pass + else: + nuke.tprint("Found assigned mattes on SG. Setting channels to all") + profile_channel = "all" else: - nuke.tprint("Found assigned mattes on SG. Setting channels to all") - profile_channel = "all" + pass + if profile_name == "Dpx": node.knob('dpx_datatype').setVisible(True) node.knob('exr_datatype').setVisible(False) @@ -1798,6 +1804,84 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False md = content_meta_data['metadata'] md.fromScript(self.__get_metadata(node)) + elif self._app.context.entity['type'] == 'Asset': + # Update embeded time code + delivery_reformat = node.node(TankWriteNodeHandler.EMBED_DELIVERY_REFORMAT) + internal_shuffle = node.node(TankWriteNodeHandler.EMBED_SHUFFLE) + format_crop = node.node(TankWriteNodeHandler.EMBED_FORMAT_CROP) + content_meta_data = node.node(TankWriteNodeHandler.EMBED_META_DATA) + shot_ocio = node.node(TankWriteNodeHandler.EMBED_SHOT_OCIO) + matte_clamp = node.node(TankWriteNodeHandler.EMBED_MATTE_CLAMP) + proj_fps = self.proj_info['sg_frame_rate'] + timecode = "01:00:00:01" + + # Checks for time/frame information, just in case + try: + time_code = node.node(TankWriteNodeHandler.EMBED_TIME_CODE) + # Timecode settings + if not self.frame_range[0]: + print "No frame range values found on SG" + shot_frame_range_start = 1 + use_start_frame = False + use_meta_data = True + else: + shot_frame_range_start = self.frame_range[0] + use_start_frame = True + use_meta_data = False + + time_code.knobs()["startcode"].setValue(timecode) + if proj_fps: + time_code.knobs()["fps"].setValue(float(proj_fps)) + time_code.knobs()["useFrame"].setValue(use_start_frame) + time_code.knobs()["frame"].setValue(shot_frame_range_start) + time_code.knobs()["metafps"].setValue(use_meta_data) + except: + pass + + # Set the embeded delivery reformat + if not (self.proj_info['sg_delivery_format_width'] and + self.proj_info['sg_delivery_format_height']): + delivery_reformat['disable'].setValue(True) + node.node("format_crop")['disable'].setValue(True) + + nuke.tprint("No delivery reformat info given on Projects.") + else: + # Set the project reformat first + delivery_format = self.add_format(self.proj_info['sg_short_name'], + "delivery", + int(self.proj_info['sg_delivery_format_width']), + int(self.proj_info['sg_delivery_format_height']), + int(self.proj_info['sg_pixel_aspect_ratio'])) + + if write_type != "Version": + delivery_reformat['disable'].setValue(True) + node.node("format_crop")['disable'].setValue(True) + else: + # Add SG reformat settings + filter_match = next((f for f in delivery_reformat['filter'].values() if f == self.proj_info['sg_delivery_reformat_filter']), None) + if filter_match: + delivery_reformat['filter'].setValue(filter_match) + resize_match = next((r for r in delivery_reformat['resize'].values() if r == self.proj_info['sg_delivery_reformat_type']), None) + if resize_match: + delivery_reformat['resize'].setValue(resize_match) + + # Set the delivery_reformat node + delivery_reformat.knobs()["format"].setValue(delivery_format) + crop_box_value = (0,0, delivery_format.width(), delivery_format.height()) + format_crop['box'].setValue(crop_box_value) + delivery_reformat['disable'].setValue(False) + format_crop['disable'].setValue(False) + color_space = None + # Set colorspace based of SG values + color_space = "linear" + node.knob("project_crop_bool").setValue(False) + self.__embedded_format_option(node, False) + + node['colorspace'].setValue(color_space) + + md = content_meta_data['metadata'] + md.fromScript(self.__get_metadata(node)) + # 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. @@ -2600,8 +2684,22 @@ def setup_new_node(self, node): else: node.knob("project_crop_bool").setValue(True) self.__embedded_format_option(node, True) - if self._app.context.entity['type'] == 'Asset': + elif self._app.context.entity['type'] == 'Asset': if write_type == "Version": + node.knob('convert_to_write').setVisible(False) + + if node['tk_project_format_cache'].value() == "False": + node.knob("project_crop_bool").setValue(False) + self.__embedded_format_option(node, False) + + elif node['tk_project_format_cache'].value() == "True": + node.knob("project_crop_bool").setValue(True) + self.__embedded_format_option(node, True) + + else: + node.knob("project_crop_bool").setValue(True) + self.__embedded_format_option(node, True) + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) node.knob('project_crop_bool').setVisible(False) # ensure that the correct entry is selected from the list: @@ -2799,28 +2897,84 @@ 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) + + # Asset Context is (basically) a clone of Shot Context + # but with some added knob adjustments elif self._app.context.entity['type'] == 'Asset': if write_type== "Version": + node.knob('convert_to_write').setVisible(False) + self.__set_project_crop(node, True) + self.__write_type_changed(node, False) + self.__embedded_format_option(node, True) + if self.ctx_info.step['name'] == "Roto": + self.__set_project_crop(node, False) + if write_type_profile == "Dpx": + node.node("Write1").knob("transfer").setValue('(auto detect)') self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) elif write_type == "Element": + node.knob('convert_to_write').setVisible(True) + self.__set_project_crop(node, False) + self.__write_type_changed(node, True) + write_type_profile = "Exr" + self.__embedded_format_option(node, False) + try: + node.node("Write1").knob("autocrop").setValue(True) + except: + pass self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) write_type_profile = "Exr" elif write_type == "Denoise": + node.knob('convert_to_write').setVisible(True) + self.__set_project_crop(node, False) + self.__write_type_changed(node, True) + write_type_profile = "Exr" + self.__embedded_format_option(node, False) + try: + node.node("Write1").knob("autocrop").setValue(True) + except: + pass self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) elif write_type == "SmartVector": + node.knob('convert_to_write').setVisible(True) + self.__set_project_crop(node, False) + self.__write_type_changed(node, True) + write_type_profile = "Exr" + self.__embedded_format_option(node, False) + try: + node.node("Write1").knob("autocrop").setValue(True) + except: + pass self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) elif write_type == "Test": + self.__set_project_crop(node, False) + self.__write_type_changed(node, True) + self.__embedded_format_option(node, False) self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) - self.__test_write_message() + self.__test_write_message() + + # Scans script for existing name clashes and renames accordingly + existing_node_names = [n.name() for n in nuke.allNodes(group=nuke.root())] + new_output_name = "" + postfix = 1 + while True: + new_name = "%s%d" % (knob.value(), postfix) + if new_name not in existing_node_names: + node.knob("name").setValue(new_name) + break + else: + postfix += 1 + + self.__set_output(node, new_output_name) # 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) + self.__set_profile(node, write_type_profile, write_type, reset_all_settings=True) + elif knob.name() == "write_type_info": write_type_url = "http://10.80.8.252/ssvfx-wiki-sphinx/workflow/nuke/nuke.html#sg-write-node" webbrowser.open_new_tab(write_type_url) From 656dc7802a165e78321501a290771c85350e4543 Mon Sep 17 00:00:00 2001 From: rthompson Date: Tue, 5 Nov 2019 17:22:58 +0000 Subject: [PATCH 79/90] version patch --- app.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app.py b/app.py index e9bb61d..b9b2d52 100644 --- a/app.py +++ b/app.py @@ -269,11 +269,13 @@ def convert_from_write_nodes(self, show_warning=False): if continue_with_convert: self.__write_node_handler.convert_nuke_to_sg_write_nodes() - def create_new_write_node(self, profile_name): + def create_new_write_node(self, profile_name, write_type): """ Creates a Shotgun write node using the provided profile_name. """ - self.__write_node_handler.create_new_node(profile_name) + new_node = self.__write_node_handler.create_new_node(profile_name, write_type) + + return new_node # Private methods def __add_write_node_commands(self, context=None): From a749fb1c5ae1734e19a380bd3cd1ef902fc6446f Mon Sep 17 00:00:00 2001 From: dduffy Date: Wed, 13 Nov 2019 16:33:31 +0000 Subject: [PATCH 80/90] added STMap --- app.py | 7 +++-- gizmos/WriteTank.gizmo | 10 +++++-- info.yml | 4 +++ python/tk_nuke_writenode/handler.py | 42 ++++++++++++++++++++++++----- 4 files changed, 51 insertions(+), 12 deletions(-) diff --git a/app.py b/app.py index b9b2d52..0ce0841 100644 --- a/app.py +++ b/app.py @@ -286,8 +286,9 @@ def __add_write_node_commands(self, context=None): context = context or self.context write_type = "Version" profile_list = [] - write_node_icon = os.path.join(self.disk_location, "resources", "tk2_write.png") + write_node_icon = os.path.join(self.disk_location, "resources", "tk2_write.png").replace("\\","/") profile_set = set(self.__write_node_handler.profile_names) + # Remove fileset types nt associated with Project if not self.__write_node_handler.proj_info['sg_delivery_fileset']: nuke.tprint("No fileset specified. Loading defaults...") @@ -305,8 +306,6 @@ def __add_write_node_commands(self, context=None): nuke.tprint("Profile name not in list!") profile_list = self.__write_node_handler.profile_names - nuke.tprint("- Project fileset(s): " + str(profile_list)) - for profile_name in profile_list: # add to toolbar menu cb_fn = lambda pn=profile_name,wt=write_type: self.__write_node_handler.create_new_node(pn,wt) @@ -315,8 +314,8 @@ def __add_write_node_commands(self, context=None): cb_fn, dict( type="node", - icon=write_node_icon, context=context, + icon=write_node_icon ) ) diff --git a/gizmos/WriteTank.gizmo b/gizmos/WriteTank.gizmo index 7b45dbf..19a3bb0 100644 --- a/gizmos/WriteTank.gizmo +++ b/gizmos/WriteTank.gizmo @@ -50,9 +50,15 @@ Gizmo { addUserKnob { 1 smartvector_render_template l "Sgtk SmartVector Template" - t "The Sgtk cleanup template associated with this node" + t "The SmartVector template associated with this node" +INVISIBLE } + addUserKnob { + 1 stmap_render_template + l "Sgtk STMap Template" + t "The STMap template associated with this node" + +INVISIBLE + } addUserKnob { 1 test_render_template l "Sgtk Test Template" @@ -233,7 +239,7 @@ Gizmo { 4 write_type l "SG Write Type" t "Select the type of node you require this to be." - M {Version Element Denoise SmartVector Test} + M {Version Element Denoise SmartVector STMap Test} } addUserKnob { 22 check_mattes diff --git a/info.yml b/info.yml index 4cb50ef..1011e56 100644 --- a/info.yml +++ b/info.yml @@ -77,6 +77,10 @@ configuration: type: template fields: context, version, SEQ, [channel], [output], [name], [width], [height], [eye], * allows_empty: True + stmap_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 ed395d3..4aed183 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1228,6 +1228,10 @@ def __get_render_template(self, node, write_type, is_proxy=False, fallback_to_re template = self.__get_template(node, "smartvector_render_template") if template or not fallback_to_render: return template + elif write_type == "STMap": + template = self.__get_template(node, "stmap_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: @@ -1347,7 +1351,9 @@ def __update_path_preview(self, node, is_proxy): elif write_type == "Denoise": context_info = self._app.tank.templates['shot_render_global'] elif write_type == "SmartVector": - context_info = self._app.tank.templates['shot_render_global'] + context_info = self._app.tank.templates['shot_render_global'] + elif write_type == "STMap": + context_info = self._app.tank.templates['shot_render_global'] else: context_info = self._app.tank.templates['shot_render_global'] @@ -1369,7 +1375,9 @@ def __update_path_preview(self, node, is_proxy): elif write_type == "Denoise": context_info = self._app.tank.templates['asset_render_global'] elif write_type == "SmartVector": - context_info = self._app.tank.templates['asset_render_global'] + context_info = self._app.tank.templates['asset_render_global'] + elif write_type == "STMap": + context_info = self._app.tank.templates['asset_render_global'] else: context_info = self._app.tank.templates['asset_render_global'] @@ -1531,9 +1539,12 @@ 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'}) nuke.tprint("Applying ZIP compression to %s output." % write_type) - # elif write_type == "SmartVector": - # self.__update_knob_value(node, 'exr_datatype', '32 bit half') - # file_settings.update({'datatype' : '32 bit half'}) + elif write_type == "SmartVector": + self.__update_knob_value(node, 'exr_datatype', '16 bit half') + file_settings.update({'datatype' : '16 bit half'}) + elif write_type == "STMap": + self.__update_knob_value(node, 'exr_datatype', '32 bit float') + file_settings.update({'datatype' : '32 bit float'}) promote_write_knobs = profile.get("promote_write_knobs", []) # Make sure any invalid entries are removed from the profile list: @@ -1638,6 +1649,8 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False default_value = 2231304447 elif write_type == "SmartVector": default_value = 4278254335 + elif write_type == "STMap": + default_value = 2857762815L elif write_type == "Test": default_value = 4278190081 else: @@ -1692,7 +1705,12 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False profile_channel = "all" node.knob('auto_crop').setVisible(True) node.knob('auto_crop').setValue(True) - node.node("Write1").knob("autocrop").setValue(True) + node.node("Write1").knob("autocrop").setValue(True) + if write_type == "STMap": + profile_channel = "all" + node.knob('auto_crop').setVisible(True) + node.knob('auto_crop').setValue(True) + node.node("Write1").knob("autocrop").setValue(True) if self.ctx_info.step['name'] == "Roto": profile_channel = "all" node.knob('auto_crop').setVisible(True) @@ -2949,6 +2967,18 @@ def __on_knob_changed(self): pass self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) + elif write_type == "STMap": + node.knob('convert_to_write').setVisible(True) + self.__set_project_crop(node, False) + self.__write_type_changed(node, True) + write_type_profile = "Exr" + self.__embedded_format_option(node, False) + try: + node.node("Write1").knob("autocrop").setValue(True) + except: + pass + self.__update_knob_value(node, TankWriteNodeHandler.OUTPUT_KNOB_NAME, "") + node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(False) elif write_type == "Test": self.__set_project_crop(node, False) self.__write_type_changed(node, True) From a70803da104ae9c7b41718c83ba3b6e941322645 Mon Sep 17 00:00:00 2001 From: dduffy Date: Wed, 18 Dec 2019 18:02:08 +0000 Subject: [PATCH 81/90] updated to pick up from the Project page --- python/tk_nuke_writenode/handler.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 4aed183..deb2122 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1801,11 +1801,11 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False color_space = None # Set colorspace based of SG values if (self.ctx_info.step['name'] != "Roto" and - write_type == "Version"): - if color_space not in node.knob('colorspace').values(): + write_type == "Version"): + if self.proj_info['sg_color_space']: + color_space = self.proj_info['sg_color_space'] + else: color_space = next((color for color in node.knob('colorspace').values() if 'default' in color), None) - # else: - # nuke.tprint("--- Setting colorspace to %s from Projects page." % color_space) elif self.ctx_info.step['name'] != "Roto": color_space = self.proj_info['sg_color_space'] elif (self.ctx_info.step['name'] == "Roto"): From 3fbc1e32d227d3ef5182f382f7ad6fa27d82616d Mon Sep 17 00:00:00 2001 From: dduffy Date: Wed, 18 Dec 2019 18:25:26 +0000 Subject: [PATCH 82/90] update for colorspace --- python/tk_nuke_writenode/handler.py | 43 +++++++++++++++++------------ 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index deb2122..bcaa1a6 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1770,7 +1770,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False self.proj_info['sg_delivery_format_height']): delivery_reformat['disable'].setValue(True) node.node("format_crop")['disable'].setValue(True) - + node.knob("project_crop_bool").setValue(False) nuke.tprint("No delivery reformat info given on Projects.") else: # Set the project reformat first @@ -1791,32 +1791,41 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False resize_match = next((r for r in delivery_reformat['resize'].values() if r == self.proj_info['sg_delivery_reformat_type']), None) if resize_match: delivery_reformat['resize'].setValue(resize_match) - # Set the delivery_reformat node delivery_reformat.knobs()["format"].setValue(delivery_format) crop_box_value = (0,0, delivery_format.width(), delivery_format.height()) format_crop['box'].setValue(crop_box_value) delivery_reformat['disable'].setValue(False) format_crop['disable'].setValue(False) - color_space = None - # Set colorspace based of SG values - if (self.ctx_info.step['name'] != "Roto" and - write_type == "Version"): - if self.proj_info['sg_color_space']: + + color_space = None + # Set colorspace based of SG values + if (self.ctx_info.step['name'] != "Roto" and + write_type == "Version"): + if self.proj_info['sg_color_space']: + if self.proj_info['sg_color_space'] == "raw": + node['raw'].setValue(True) + else: color_space = self.proj_info['sg_color_space'] + else: + color_space = next((color for color in node.knob('colorspace').values() if 'default' in color), None) + elif self.ctx_info.step['name'] != "Roto": + if self.proj_info['sg_color_space']: + if self.proj_info['sg_color_space'] == "raw": + node['raw'].setValue(True) else: - color_space = next((color for color in node.knob('colorspace').values() if 'default' in color), None) - elif self.ctx_info.step['name'] != "Roto": - color_space = self.proj_info['sg_color_space'] - elif (self.ctx_info.step['name'] == "Roto"): - color_space = "linear" - node.knob("project_crop_bool").setValue(False) - self.__embedded_format_option(node, False) - nuke.tprint("--- Setting colorspace to %s for Roto" % color_space) + color_space = self.proj_info['sg_color_space'] else: color_space = next((color for color in node.knob('colorspace').values() if 'default' in color), None) - - # nuke.tprint("--- Setting default colorspace value of %s." % color_space) + elif self.ctx_info.step['name'] == "Roto": + color_space = "linear" + node.knob("project_crop_bool").setValue(False) + self.__embedded_format_option(node, False) + nuke.tprint("--- Setting colorspace to %s for Roto" % color_space) + else: + color_space = next((color for color in node.knob('colorspace').values() if 'default' in color), None) + + if color_space: node['colorspace'].setValue(color_space) md = content_meta_data['metadata'] From daf89549f4f948a0283cfe007d55a597627deda4 Mon Sep 17 00:00:00 2001 From: dduffy Date: Wed, 18 Dec 2019 18:45:18 +0000 Subject: [PATCH 83/90] hard-code --- 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 bcaa1a6..8fe0c4f 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1772,6 +1772,9 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False node.node("format_crop")['disable'].setValue(True) node.knob("project_crop_bool").setValue(False) nuke.tprint("No delivery reformat info given on Projects.") + elif self.proj_info['name'] == "Blue Bayou": + node.knob("project_crop_bool").setValue(False) + node.node("format_crop")['disable'].setValue(True) else: # Set the project reformat first delivery_format = self.add_format(self.proj_info['sg_short_name'], From 4892fbca3b434997c6b7ecba171784df9d5f47bd Mon Sep 17 00:00:00 2001 From: dduffy Date: Thu, 16 Jan 2020 14:26:27 +0000 Subject: [PATCH 84/90] fixed roto issue --- 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 8fe0c4f..79fc69b 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1523,7 +1523,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False # Apply datatype info based on context if file_type == "exr" and write_type == "Version": - if self.ctx_info.step['name'] == "Roto": + if self.ctx_info.step['name'] == "roto": nuke.tprint("Task context is " + self.ctx_info.step['name']+ ". Applying ZIP compression to "+ write_type +" output.") self.__update_knob_value(node, 'exr_datatype', '16 bit half') @@ -1711,7 +1711,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False node.knob('auto_crop').setVisible(True) node.knob('auto_crop').setValue(True) node.node("Write1").knob("autocrop").setValue(True) - if self.ctx_info.step['name'] == "Roto": + if self.ctx_info.step['name'] == "roto": profile_channel = "all" node.knob('auto_crop').setVisible(True) node.knob('auto_crop').setValue(True) @@ -1727,7 +1727,8 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False # Sets project specific fileset compression if (file_type== "exr" and - write_type == "Version"): + write_type == "Version" and + self.ctx_info.step['name'] != "roto"): if self.proj_info['sg_delivery_fileset_compression']: node.node("Write1").knob("compression").setValue(self.proj_info['sg_delivery_fileset_compression']) # nuke.tprint("Setting Version compression from SG Project values to : " + self.proj_info['sg_delivery_fileset_compression']) @@ -1803,7 +1804,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False color_space = None # Set colorspace based of SG values - if (self.ctx_info.step['name'] != "Roto" and + if (self.ctx_info.step['name'] != "roto" and write_type == "Version"): if self.proj_info['sg_color_space']: if self.proj_info['sg_color_space'] == "raw": @@ -1812,7 +1813,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False color_space = self.proj_info['sg_color_space'] else: color_space = next((color for color in node.knob('colorspace').values() if 'default' in color), None) - elif self.ctx_info.step['name'] != "Roto": + elif self.ctx_info.step['name'] != "roto": if self.proj_info['sg_color_space']: if self.proj_info['sg_color_space'] == "raw": node['raw'].setValue(True) @@ -1820,11 +1821,11 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False color_space = self.proj_info['sg_color_space'] else: color_space = next((color for color in node.knob('colorspace').values() if 'default' in color), None) - elif self.ctx_info.step['name'] == "Roto": - color_space = "linear" + elif self.ctx_info.step['name'] == "roto": + # color_space = "linear" node.knob("project_crop_bool").setValue(False) self.__embedded_format_option(node, False) - nuke.tprint("--- Setting colorspace to %s for Roto" % color_space) + nuke.tprint("--- Setting colorspace to %s for roto" % color_space) else: color_space = next((color for color in node.knob('colorspace').values() if 'default' in color), None) @@ -2696,8 +2697,8 @@ def setup_new_node(self, node): else: if write_type == "Version": node.knob('convert_to_write').setVisible(False) - if self.ctx_info.step['name'] == "Roto": - nuke.tprint("Creating Roto SG Write node") + if self.ctx_info.step['name'] == "roto": + nuke.tprint("Creating roto SG Write node") self.__update_knob_value(node, "tk_profile_list", "Exr") node.knob('write_type').setValues(['Version', 'Denoise']) node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) @@ -2890,7 +2891,7 @@ def __on_knob_changed(self): self.__set_project_crop(node, True) self.__write_type_changed(node, False) self.__embedded_format_option(node, True) - if self.ctx_info.step['name'] == "Roto": + if self.ctx_info.step['name'] == "roto": self.__set_project_crop(node, False) if write_type_profile == "Dpx": node.node("Write1").knob("transfer").setValue('(auto detect)') @@ -2936,7 +2937,7 @@ def __on_knob_changed(self): self.__set_project_crop(node, True) self.__write_type_changed(node, False) self.__embedded_format_option(node, True) - if self.ctx_info.step['name'] == "Roto": + if self.ctx_info.step['name'] == "roto": self.__set_project_crop(node, False) if write_type_profile == "Dpx": node.node("Write1").knob("transfer").setValue('(auto detect)') From 5539b098330c998526751e4ef5a22998f8c540f0 Mon Sep 17 00:00:00 2001 From: dduffy Date: Wed, 29 Jan 2020 14:28:45 +0000 Subject: [PATCH 85/90] cleanup - delivery off by default --- python/tk_nuke_writenode/handler.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 79fc69b..5a055f4 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1796,11 +1796,19 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False if resize_match: delivery_reformat['resize'].setValue(resize_match) # Set the delivery_reformat node - delivery_reformat.knobs()["format"].setValue(delivery_format) - crop_box_value = (0,0, delivery_format.width(), delivery_format.height()) - format_crop['box'].setValue(crop_box_value) - delivery_reformat['disable'].setValue(False) - format_crop['disable'].setValue(False) + if self.ctx_info.step['name'] == "cleanup": + node.knob("project_crop_bool").setValue(False) + delivery_reformat.knobs()["format"].setValue(delivery_format) + crop_box_value = (0,0, delivery_format.width(), delivery_format.height()) + format_crop['box'].setValue(crop_box_value) + delivery_reformat['disable'].setValue(True) + format_crop['disable'].setValue(True) + else: + delivery_reformat.knobs()["format"].setValue(delivery_format) + crop_box_value = (0,0, delivery_format.width(), delivery_format.height()) + format_crop['box'].setValue(crop_box_value) + delivery_reformat['disable'].setValue(False) + format_crop['disable'].setValue(False) color_space = None # Set colorspace based of SG values From 3a2932da4e4a596c0fb2f5d749b1e6d3fdd69d8e Mon Sep 17 00:00:00 2001 From: dduffy Date: Mon, 3 Feb 2020 10:18:36 +0000 Subject: [PATCH 86/90] setting rgb and taking out BB specs --- python/tk_nuke_writenode/handler.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 5a055f4..8587b55 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1672,7 +1672,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False context = self._app.context.entity['type'] if context != 'Asset': if not self.shot_info['sg_shot_mattes']: - pass + profile_channel = "rgb" else: nuke.tprint("Found assigned mattes on SG. Setting channels to all") profile_channel = "all" @@ -1773,9 +1773,9 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False node.node("format_crop")['disable'].setValue(True) node.knob("project_crop_bool").setValue(False) nuke.tprint("No delivery reformat info given on Projects.") - elif self.proj_info['name'] == "Blue Bayou": - node.knob("project_crop_bool").setValue(False) - node.node("format_crop")['disable'].setValue(True) + # elif self.proj_info['name'] == "Blue Bayou": + # node.knob("project_crop_bool").setValue(False) + # node.node("format_crop")['disable'].setValue(True) else: # Set the project reformat first delivery_format = self.add_format(self.proj_info['sg_short_name'], From 4be1a584e2ead8d38c910824cced15942d8c87bc Mon Sep 17 00:00:00 2001 From: dduffy Date: Tue, 3 Mar 2020 09:37:17 +0000 Subject: [PATCH 87/90] fix for dpx --- python/tk_nuke_writenode/handler.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 8587b55..09dba09 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1518,6 +1518,8 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False elif profile_name == "Dpx": if self.proj_info['sg_data_type']: self.__update_knob_value(node, 'dpx_datatype', self.proj_info['sg_data_type']) + file_settings.update({'datatype' : self.proj_info['sg_data_type']}) + nuke.tprint("Set datatype to %s" % self.proj_info['sg_data_type']) else: self.__update_knob_value(node, 'dpx_datatype', dpx_datatype) From b60912f1768ec4a6a97c4c00a45dc386b19b3d35 Mon Sep 17 00:00:00 2001 From: dduffy Date: Tue, 21 Apr 2020 09:42:43 +0100 Subject: [PATCH 88/90] update to project formats --- python/tk_nuke_writenode/handler.py | 74 +++++++++++++++-------------- 1 file changed, 39 insertions(+), 35 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 09dba09..79f7e05 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -1235,8 +1235,7 @@ def __get_render_template(self, node, write_type, is_proxy=False, fallback_to_re elif write_type == "Test": template = self.__get_template(node, "test_render_template") if template or not fallback_to_render: - return template - + return template else: return self.__get_template(node, "render_template") @@ -1775,42 +1774,47 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False node.node("format_crop")['disable'].setValue(True) node.knob("project_crop_bool").setValue(False) nuke.tprint("No delivery reformat info given on Projects.") - # elif self.proj_info['name'] == "Blue Bayou": - # node.knob("project_crop_bool").setValue(False) - # node.node("format_crop")['disable'].setValue(True) else: - # Set the project reformat first - delivery_format = self.add_format(self.proj_info['sg_short_name'], - "delivery", - int(self.proj_info['sg_delivery_format_width']), - int(self.proj_info['sg_delivery_format_height']), - int(self.proj_info['sg_pixel_aspect_ratio'])) - - if write_type != "Version": - delivery_reformat['disable'].setValue(True) - node.node("format_crop")['disable'].setValue(True) + if (self.proj_info['sg_delivery_format_width'] == self.proj_info['sg_format_width'] + and self.proj_info['sg_delivery_format_height'] == self.proj_info['sg_format_height']): + nuke.tprint("Delvery Format is the same as Project Format - disabling!") + delivery_reformat['disable'].setValue(True) + node.node("format_crop")['disable'].setValue(True) + node.knob("project_crop_bool").setValue(False) + node.knob('project_crop_bool').setVisible(False) else: - # Add SG reformat settings - filter_match = next((f for f in delivery_reformat['filter'].values() if f == self.proj_info['sg_delivery_reformat_filter']), None) - if filter_match: - delivery_reformat['filter'].setValue(filter_match) - resize_match = next((r for r in delivery_reformat['resize'].values() if r == self.proj_info['sg_delivery_reformat_type']), None) - if resize_match: - delivery_reformat['resize'].setValue(resize_match) - # Set the delivery_reformat node - if self.ctx_info.step['name'] == "cleanup": - node.knob("project_crop_bool").setValue(False) - delivery_reformat.knobs()["format"].setValue(delivery_format) - crop_box_value = (0,0, delivery_format.width(), delivery_format.height()) - format_crop['box'].setValue(crop_box_value) - delivery_reformat['disable'].setValue(True) - format_crop['disable'].setValue(True) + # Set the project reformat first + delivery_format = self.add_format(self.proj_info['sg_short_name'], + "delivery", + int(self.proj_info['sg_delivery_format_width']), + int(self.proj_info['sg_delivery_format_height']), + int(self.proj_info['sg_pixel_aspect_ratio'])) + + if write_type != "Version": + delivery_reformat['disable'].setValue(True) + node.node("format_crop")['disable'].setValue(True) else: - delivery_reformat.knobs()["format"].setValue(delivery_format) - crop_box_value = (0,0, delivery_format.width(), delivery_format.height()) - format_crop['box'].setValue(crop_box_value) - delivery_reformat['disable'].setValue(False) - format_crop['disable'].setValue(False) + # Add SG reformat settings + filter_match = next((f for f in delivery_reformat['filter'].values() if f == self.proj_info['sg_delivery_reformat_filter']), None) + if filter_match: + delivery_reformat['filter'].setValue(filter_match) + resize_match = next((r for r in delivery_reformat['resize'].values() if r == self.proj_info['sg_delivery_reformat_type']), None) + if resize_match: + delivery_reformat['resize'].setValue(resize_match) + # Set the delivery_reformat node + if self.ctx_info.step['name'] == "cleanup": + node.knob("project_crop_bool").setValue(False) + delivery_reformat.knobs()["format"].setValue(delivery_format) + crop_box_value = (0,0, delivery_format.width(), delivery_format.height()) + format_crop['box'].setValue(crop_box_value) + delivery_reformat['disable'].setValue(True) + format_crop['disable'].setValue(True) + else: + delivery_reformat.knobs()["format"].setValue(delivery_format) + crop_box_value = (0,0, delivery_format.width(), delivery_format.height()) + format_crop['box'].setValue(crop_box_value) + delivery_reformat['disable'].setValue(False) + format_crop['disable'].setValue(False) color_space = None # Set colorspace based of SG values From 9cb017dcceb918b02f53ff592440e15b6ffe7900 Mon Sep 17 00:00:00 2001 From: rthompson Date: Wed, 30 Sep 2020 17:39:07 +0100 Subject: [PATCH 89/90] patch to add elements to roto write options --- 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 79f7e05..31d4e5a 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -2714,7 +2714,7 @@ def setup_new_node(self, node): if self.ctx_info.step['name'] == "roto": nuke.tprint("Creating roto SG Write node") self.__update_knob_value(node, "tk_profile_list", "Exr") - node.knob('write_type').setValues(['Version', 'Denoise']) + node.knob('write_type').setValues(['Version', 'Denoise', 'Element']) node.knob(TankWriteNodeHandler.OUTPUT_KNOB_NAME).setEnabled(True) node.knob("project_crop_bool").setValue(False) self.__embedded_format_option(node, False) From 571730c0e5616faac66cd78e8b98c9dafa51aef2 Mon Sep 17 00:00:00 2001 From: dduffy Date: Tue, 6 Oct 2020 09:44:20 +0100 Subject: [PATCH 90/90] taking out TC --- python/tk_nuke_writenode/handler.py | 62 +---------------------------- 1 file changed, 2 insertions(+), 60 deletions(-) diff --git a/python/tk_nuke_writenode/handler.py b/python/tk_nuke_writenode/handler.py index 31d4e5a..bab6c60 100644 --- a/python/tk_nuke_writenode/handler.py +++ b/python/tk_nuke_writenode/handler.py @@ -41,7 +41,6 @@ class TankWriteNodeHandler(object): SG_WRITE_NODE_CLASS = "WriteTank" SG_WRITE_DEFAULT_NAME = "Version" WRITE_NODE_NAME = "Write1" - EMBED_TIME_CODE = "project_tc" EMBED_META_DATA = "content_meta_data" EMBED_SHOT_OCIO = "shot_ocio" EMBED_DELIVERY_REFORMAT = "delivery_reformat" @@ -438,8 +437,6 @@ def create_project_settings_group(self, node): delivery_reformat['name'].setValue("delivery_reformat") format_crop = nuke.createNode("Crop", inpanel = False) format_crop['name'].setValue("format_crop") - project_tc = nuke.createNode("AddTimeCode", inpanel = False) - project_tc['name'].setValue("project_tc") content_metadata = nuke.createNode("ModifyMetaData", inpanel = False) content_metadata['name'].setValue("content_meta_data") shot_ocio = nuke.createNode("OCIOColorSpace", inpanel = False) @@ -450,7 +447,6 @@ def create_project_settings_group(self, node): proj_group_nodes.append(internal_shuffle) proj_group_nodes.append(delivery_reformat) proj_group_nodes.append(format_crop) - proj_group_nodes.append(project_tc) proj_group_nodes.append(content_metadata) proj_group_nodes.append(shot_ocio) proj_group_nodes.append(matte_clamp) @@ -530,12 +526,6 @@ def convert_sg_to_nuke_write_nodes(self, selected_node=None): extra_node.node('format_crop')['box'].setValue(sg_wn.node('format_crop')['box'].value()) extra_node.node('format_crop')['reformat'].setValue(sg_wn.node('format_crop')['reformat'].value()) extra_node.node('format_crop')['crop'].setValue(sg_wn.node('format_crop')['crop'].value()) - # Embed tc - extra_node.node('project_tc')['startcode'].setValue(sg_wn.node('project_tc')['startcode'].value()) - extra_node.node('project_tc')['fps'].setValue(sg_wn.node('project_tc')['fps'].value()) - extra_node.node('project_tc')['metafps'].setValue(sg_wn.node('project_tc')['metafps'].value()) - extra_node.node('project_tc')['useFrame'].setValue(sg_wn.node('project_tc')['useFrame'].value()) - extra_node.node('project_tc')['frame'].setValue(sg_wn.node('project_tc')['frame'].value()) # Embed metadata md = extra_node.node('content_meta_data')['metadata'] md.fromScript(self.__get_metadata(sg_wn)) @@ -1735,38 +1725,14 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False # nuke.tprint("Setting Version compression from SG Project values to : " + self.proj_info['sg_delivery_fileset_compression']) if self._app.context.entity['type'] == 'Shot': - # Update embeded time code delivery_reformat = node.node(TankWriteNodeHandler.EMBED_DELIVERY_REFORMAT) internal_shuffle = node.node(TankWriteNodeHandler.EMBED_SHUFFLE) format_crop = node.node(TankWriteNodeHandler.EMBED_FORMAT_CROP) - time_code = node.node(TankWriteNodeHandler.EMBED_TIME_CODE) content_meta_data = node.node(TankWriteNodeHandler.EMBED_META_DATA) shot_ocio = node.node(TankWriteNodeHandler.EMBED_SHOT_OCIO) matte_clamp = node.node(TankWriteNodeHandler.EMBED_MATTE_CLAMP) proj_fps = self.proj_info['sg_frame_rate'] - timecode = "01:00:00:01" - - - - # Timecode settings - if not self.frame_range[0]: - print "No frame range values found on SG" - shot_frame_range_start = 1 - use_start_frame = False - use_meta_data = True - else: - shot_frame_range_start = self.frame_range[0] - use_start_frame = True - use_meta_data = False - - time_code.knobs()["startcode"].setValue(timecode) - if proj_fps: - time_code.knobs()["fps"].setValue(float(proj_fps)) - time_code.knobs()["useFrame"].setValue(use_start_frame) - time_code.knobs()["frame"].setValue(shot_frame_range_start) - time_code.knobs()["metafps"].setValue(use_meta_data) - - + # Set the embeded delivery reformat if not (self.proj_info['sg_delivery_format_width'] and self.proj_info['sg_delivery_format_height']): @@ -1850,7 +1816,7 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False md.fromScript(self.__get_metadata(node)) elif self._app.context.entity['type'] == 'Asset': - # Update embeded time code + delivery_reformat = node.node(TankWriteNodeHandler.EMBED_DELIVERY_REFORMAT) internal_shuffle = node.node(TankWriteNodeHandler.EMBED_SHUFFLE) format_crop = node.node(TankWriteNodeHandler.EMBED_FORMAT_CROP) @@ -1858,30 +1824,6 @@ def __set_profile(self, node, profile_name, write_type, reset_all_settings=False shot_ocio = node.node(TankWriteNodeHandler.EMBED_SHOT_OCIO) matte_clamp = node.node(TankWriteNodeHandler.EMBED_MATTE_CLAMP) proj_fps = self.proj_info['sg_frame_rate'] - timecode = "01:00:00:01" - - # Checks for time/frame information, just in case - try: - time_code = node.node(TankWriteNodeHandler.EMBED_TIME_CODE) - # Timecode settings - if not self.frame_range[0]: - print "No frame range values found on SG" - shot_frame_range_start = 1 - use_start_frame = False - use_meta_data = True - else: - shot_frame_range_start = self.frame_range[0] - use_start_frame = True - use_meta_data = False - - time_code.knobs()["startcode"].setValue(timecode) - if proj_fps: - time_code.knobs()["fps"].setValue(float(proj_fps)) - time_code.knobs()["useFrame"].setValue(use_start_frame) - time_code.knobs()["frame"].setValue(shot_frame_range_start) - time_code.knobs()["metafps"].setValue(use_meta_data) - except: - pass # Set the embeded delivery reformat if not (self.proj_info['sg_delivery_format_width'] and