From 2082e4bb6ed626067665678bda25bb93a5a32774 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Mon, 5 Oct 2020 15:46:36 +0200 Subject: [PATCH 1/5] feat(nuke): improving render knobs --- pype/hosts/nuke/lib.py | 8 ++--- .../plugins/nuke/publish/collect_instances.py | 30 +++++++++++-------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/pype/hosts/nuke/lib.py b/pype/hosts/nuke/lib.py index 19a0784327..d896bfe1ef 100644 --- a/pype/hosts/nuke/lib.py +++ b/pype/hosts/nuke/lib.py @@ -431,13 +431,9 @@ def add_rendering_knobs(node): node (obj): with added knobs ''' if "render" not in node.knobs(): - knob = nuke.Boolean_Knob("render", "Render") + knob = nuke.Enumeration_Knob("render", "Render", [ + "Do Not Render", "Locally", "On Farm"]) knob.setFlag(0x1000) - knob.setValue(False) - node.addKnob(knob) - if "render_farm" not in node.knobs(): - knob = nuke.Boolean_Knob("render_farm", "Render on Farm") - knob.setValue(False) node.addKnob(knob) return node diff --git a/pype/plugins/nuke/publish/collect_instances.py b/pype/plugins/nuke/publish/collect_instances.py index 9085e12bd8..f1e7f2bdde 100644 --- a/pype/plugins/nuke/publish/collect_instances.py +++ b/pype/plugins/nuke/publish/collect_instances.py @@ -76,19 +76,23 @@ class CollectNukeInstances(pyblish.api.ContextPlugin): if node.Class() == "Group": # only alter families for render family if "write" in families_ak: - - if node["render"].value(): - self.log.info("flagged for render") - add_family = "{}.local".format("render") - # dealing with local/farm rendering - if node["render_farm"].value(): - self.log.info("adding render farm family") - add_family = "{}.farm".format("render") - instance.data["transfer"] = False - families.append(add_family) - if "render" in families: - families.remove("render") - family = "write" + target = node["render"].value() + if target == "Do Not Render": + # Local rendering + self.log.info("flagged for no render") + families.append("render") + elif target == "Locally": + # Local rendering + self.log.info("flagged for local render") + families.append("{}.local".format("render")) + elif target == "On Farm": + # Farm rendering + self.log.info("flagged for farm render") + instance.data["transfer"] = False + families.append("{}.farm".format("render")) + if "render" in families: + families.remove("render") + family = "write" node.begin() for i in nuke.allNodes(): From 3932b19ea94637d2023acde3a039b59db5c4e5a7 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Wed, 7 Oct 2020 17:52:36 +0200 Subject: [PATCH 2/5] fix(nuke): improving names of render targets --- pype/hosts/nuke/lib.py | 14 +++++++++----- pype/plugins/nuke/publish/collect_instances.py | 6 +++--- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/pype/hosts/nuke/lib.py b/pype/hosts/nuke/lib.py index d896bfe1ef..8fd84b8555 100644 --- a/pype/hosts/nuke/lib.py +++ b/pype/hosts/nuke/lib.py @@ -389,24 +389,28 @@ def create_write_node(name, data, input=None, prenodes=None, review=True): # imprinting group node avalon.nuke.imprint(GN, data["avalon"]) - divider = nuke.Text_Knob('') - GN.addKnob(divider) + # add divider + GN.addKnob(nuke.Text_Knob('')) add_rendering_knobs(GN) if review: add_review_knob(GN) + # add divider + GN.addKnob(nuke.Text_Knob('')) + # Add linked knobs. linked_knob_names = ["Render", "use_limit", "first", "last"] for name in linked_knob_names: link = nuke.Link_Knob(name) link.makeLink(write_node.name(), name) link.setName(name) + link.setFlag(0x1000) GN.addKnob(link) - divider = nuke.Text_Knob('') - GN.addKnob(divider) + # add divider + GN.addKnob(nuke.Text_Knob('')) # adding write to read button add_button_write_to_read(GN) @@ -432,7 +436,7 @@ def add_rendering_knobs(node): ''' if "render" not in node.knobs(): knob = nuke.Enumeration_Knob("render", "Render", [ - "Do Not Render", "Locally", "On Farm"]) + "Use existing frames", "Local", "On farm"]) knob.setFlag(0x1000) node.addKnob(knob) return node diff --git a/pype/plugins/nuke/publish/collect_instances.py b/pype/plugins/nuke/publish/collect_instances.py index f1e7f2bdde..069c8d6c22 100644 --- a/pype/plugins/nuke/publish/collect_instances.py +++ b/pype/plugins/nuke/publish/collect_instances.py @@ -77,15 +77,15 @@ class CollectNukeInstances(pyblish.api.ContextPlugin): # only alter families for render family if "write" in families_ak: target = node["render"].value() - if target == "Do Not Render": + if target == "Use existing frames": # Local rendering self.log.info("flagged for no render") families.append("render") - elif target == "Locally": + elif target == "Local": # Local rendering self.log.info("flagged for local render") families.append("{}.local".format("render")) - elif target == "On Farm": + elif target == "On farm": # Farm rendering self.log.info("flagged for farm render") instance.data["transfer"] = False From 1b82342906969714cb6de4e2f1ac41e8950e00a1 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Thu, 8 Oct 2020 19:40:14 +0200 Subject: [PATCH 3/5] feat(nuke): validate legacy writes --- .../nuke/publish/collect_legacy_write.py | 31 ---- .../nuke/publish/validate_write_legacy.py | 154 ++++++++++-------- 2 files changed, 88 insertions(+), 97 deletions(-) delete mode 100644 pype/plugins/nuke/publish/collect_legacy_write.py diff --git a/pype/plugins/nuke/publish/collect_legacy_write.py b/pype/plugins/nuke/publish/collect_legacy_write.py deleted file mode 100644 index cfb0798434..0000000000 --- a/pype/plugins/nuke/publish/collect_legacy_write.py +++ /dev/null @@ -1,31 +0,0 @@ -import pyblish.api - - -class CollectWriteLegacy(pyblish.api.InstancePlugin): - """Collect legacy write nodes.""" - - order = pyblish.api.CollectorOrder + 0.0101 - label = "Collect Write node Legacy" - hosts = ["nuke", "nukeassist"] - - def process(self, instance): - self.log.info(instance[:]) - node = instance[0] - - if node.Class() not in ["Group", "Write"]: - return - - family_knobs = ["ak:family", "avalon:family"] - test = [k for k in node.knobs().keys() if k in family_knobs] - self.log.info(test) - - if len(test) == 1: - if "render" in node[test[0]].value(): - self.log.info("render") - return - - if "render" in node.knobs(): - instance.data.update( - {"family": "write.legacy", - "families": []} - ) diff --git a/pype/plugins/nuke/publish/validate_write_legacy.py b/pype/plugins/nuke/publish/validate_write_legacy.py index 58beb56eba..72e5265d3f 100644 --- a/pype/plugins/nuke/publish/validate_write_legacy.py +++ b/pype/plugins/nuke/publish/validate_write_legacy.py @@ -6,81 +6,103 @@ import nuke from avalon import api import re import pyblish.api +import pype.api from avalon.nuke import get_avalon_knob_data -class RepairWriteLegacyAction(pyblish.api.Action): - - label = "Repair" - icon = "wrench" - on = "failed" - - def process(self, context, plugin): - - # Get the errored instances - failed = [] - for result in context.data["results"]: - if (result["error"] is not None and result["instance"] is not None - and result["instance"] not in failed): - failed.append(result["instance"]) - - # Apply pyblish.logic to get the instances for the plug-in - instances = pyblish.api.instances_by_plugin(failed, plugin) - - for instance in instances: - if "Write" in instance[0].Class(): - data = toml.loads(instance[0]["avalon"].value()) - else: - data = get_avalon_knob_data(instance[0]) - - self.log.info(data) - - data["xpos"] = instance[0].xpos() - data["ypos"] = instance[0].ypos() - data["input"] = instance[0].input(0) - data["publish"] = instance[0]["publish"].value() - data["render"] = instance[0]["render"].value() - data["render_farm"] = instance[0]["render_farm"].value() - data["review"] = instance[0]["review"].value() - - # nuke.delete(instance[0]) - - task = os.environ["AVALON_TASK"] - sanitized_task = re.sub('[^0-9a-zA-Z]+', '', task) - subset_name = "render{}Main".format( - sanitized_task.capitalize()) - - Create_name = "CreateWriteRender" - - creator_plugin = None - for Creator in api.discover(api.Creator): - if Creator.__name__ != Create_name: - continue - - creator_plugin = Creator - - # return api.create() - creator_plugin(data["subset"], data["asset"]).process() - - node = nuke.toNode(data["subset"]) - node.setXYpos(data["xpos"], data["ypos"]) - node.setInput(0, data["input"]) - node["publish"].setValue(data["publish"]) - node["render"].setValue(data["render"]) - node["render_farm"].setValue(data["render_farm"]) - node["review"].setValue(data["review"]) - class ValidateWriteLegacy(pyblish.api.InstancePlugin): """Validate legacy write nodes.""" order = pyblish.api.ValidatorOrder optional = True - families = ["write.legacy"] - label = "Write Legacy" + families = ["write"] + label = "Validate Write Legacy" hosts = ["nuke"] - actions = [RepairWriteLegacyAction] + actions = [pype.api.RepairAction] def process(self, instance): - + node = instance[0] msg = "Clean up legacy write node \"{}\"".format(instance) - assert False, msg + + if node.Class() not in ["Group", "Write"]: + return + + # test avalon knobs + family_knobs = ["ak:family", "avalon:family"] + family_test = [k for k in node.knobs().keys() if k in family_knobs] + self.log.debug("_ family_test: {}".format(family_test)) + + # test if render in family test knob + # and only one item should be available + if len(family_test) == 1: + assert "render" in node[family_test[0]].value(), msg + else: + assert False, msg + + # test if `file` knob in node, this way old + # non-group-node write could be detected + if "file" in node.knobs(): + assert False, msg + + # check if write node is having old render targeting + if "render_farm" in node.knobs(): + assert False, msg + + @classmethod + def repair(cls, instance): + node = instance[0] + + if "Write" in node.Class(): + data = toml.loads(node["avalon"].value()) + else: + data = get_avalon_knob_data(node) + + # collect reusable data + data["XYpos"] = (node.xpos(), node.ypos()) + data["input"] = node.input(0) + data["publish"] = node["publish"].value() + data["render"] = node["render"].value() + data["render_farm"] = node["render_farm"].value() + data["review"] = node["review"].value() + data["use_limit"] = node["use_limit"].value() + data["first"] = node["first"].value() + data["last"] = node["last"].value() + + family = data["family"] + cls.log.debug("_ orig node family: {}".format(family)) + + # define what family of write node should be recreated + if family == "render": + Create_name = "CreateWriteRender" + elif family == "prerender": + Create_name = "CreateWritePrerender" + + # get appropriate plugin class + creator_plugin = None + for Creator in api.discover(api.Creator): + if Creator.__name__ != Create_name: + continue + + creator_plugin = Creator + + # delete the legaci write node + # nuke.delete(node) + + # create write node with creator + new_node_name = data["subset"] + "_1" + creator_plugin(new_node_name, data["asset"]).process() + + node = nuke.toNode(new_node_name) + node.setXYpos(*data["XYpos"]) + node.setInput(0, data["input"]) + node["publish"].setValue(data["publish"]) + node["review"].setValue(data["review"]) + node["use_limit"].setValue(data["use_limit"]) + node["first"].setValue(data["first"]) + node["last"].setValue(data["last"]) + + # recreate render targets + if data["render"]: + node["render"].setValue("Local") + if data["render_farm"]: + node["render"].setValue("On farm") From a78cb55ae6f2ea1a8e71e7080db1f4a5dc3b727b Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Thu, 8 Oct 2020 19:44:58 +0200 Subject: [PATCH 4/5] hound(nuke) --- pype/plugins/nuke/publish/validate_write_legacy.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/pype/plugins/nuke/publish/validate_write_legacy.py b/pype/plugins/nuke/publish/validate_write_legacy.py index 72e5265d3f..d7739b448b 100644 --- a/pype/plugins/nuke/publish/validate_write_legacy.py +++ b/pype/plugins/nuke/publish/validate_write_legacy.py @@ -34,19 +34,15 @@ class ValidateWriteLegacy(pyblish.api.InstancePlugin): # test if render in family test knob # and only one item should be available - if len(family_test) == 1: - assert "render" in node[family_test[0]].value(), msg - else: - assert False, msg + assert len(family_test) != 1, msg + assert "render" in node[family_test[0]].value(), msg # test if `file` knob in node, this way old # non-group-node write could be detected - if "file" in node.knobs(): - assert False, msg + assert "file" in node.knobs(), msg # check if write node is having old render targeting - if "render_farm" in node.knobs(): - assert False, msg + assert "render_farm" in node.knobs(), msg @classmethod def repair(cls, instance): From aa35168771a6823a98d174600c424a9cc2b15f52 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Fri, 9 Oct 2020 11:31:45 +0200 Subject: [PATCH 5/5] make sure we replace original node --- pype/plugins/nuke/publish/validate_write_legacy.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pype/plugins/nuke/publish/validate_write_legacy.py b/pype/plugins/nuke/publish/validate_write_legacy.py index d7739b448b..46f55e896d 100644 --- a/pype/plugins/nuke/publish/validate_write_legacy.py +++ b/pype/plugins/nuke/publish/validate_write_legacy.py @@ -82,10 +82,10 @@ class ValidateWriteLegacy(pyblish.api.InstancePlugin): creator_plugin = Creator # delete the legaci write node - # nuke.delete(node) + nuke.delete(node) # create write node with creator - new_node_name = data["subset"] + "_1" + new_node_name = data["subset"] creator_plugin(new_node_name, data["asset"]).process() node = nuke.toNode(new_node_name)