diff --git a/pype/nuke/__init__.py b/pype/nuke/__init__.py index 455e2f8088..2554ed60af 100644 --- a/pype/nuke/__init__.py +++ b/pype/nuke/__init__.py @@ -7,6 +7,8 @@ from .. import api as pype from pype.nuke import menu +from .lib import create_write_node + import nuke # removing logger handler created in avalon_core @@ -81,6 +83,7 @@ def reload_config(): "{}.templates".format(AVALON_CONFIG), "{}.nuke".format(AVALON_CONFIG), "{}.nuke.lib".format(AVALON_CONFIG), + "{}.nuke.templates".format(AVALON_CONFIG), "{}.nuke.menu".format(AVALON_CONFIG) ): log.info("Reloading module: {}...".format(module)) @@ -105,6 +108,10 @@ def install(): # Disable all families except for the ones we explicitly want to see family_states = [ + "render", + "still" + "lifeGroup", + "backdrop", "imagesequence", "mov" "camera", diff --git a/pype/nuke/lib.py b/pype/nuke/lib.py index c68d296450..57af77ba5d 100644 --- a/pype/nuke/lib.py +++ b/pype/nuke/lib.py @@ -1,4 +1,5 @@ import sys +from collections import OrderedDict from pprint import pprint from avalon.vendor.Qt import QtGui import avalon.nuke @@ -12,6 +13,39 @@ self = sys.modules[__name__] self._project = None +def create_write_node(name, avalon_data, data_templates): + from .templates import ( + get_dataflow, + get_colorspace + ) + nuke_dataflow_writes = get_dataflow(**data_templates) + nuke_colorspace_writes = get_colorspace(**data_templates) + + data = OrderedDict({ + "file": "pathToFile/file.exr" + }) + + # adding dataflow template + {data.update({k: v}) + for k, v in nuke_dataflow_writes.items() + if k not in ["id", "previous"]} + + # adding dataflow template + {data.update({k: v}) + for k, v in nuke_colorspace_writes.items()} + + data = avalon.nuke.lib.fix_data_for_node_create(data) + + log.info(data) + + instance = avalon.nuke.lib.add_write_node( + name, + **data + ) + instance = avalon.nuke.lib.imprint(instance, avalon_data) + return instance + + def update_frame_range(start, end, root=None): """Set Nuke script start and end frame range diff --git a/pype/nuke/templates.py b/pype/nuke/templates.py new file mode 100644 index 0000000000..7a6bf9a229 --- /dev/null +++ b/pype/nuke/templates.py @@ -0,0 +1,35 @@ +from pype import api as pype + +log = pype.Logger.getLogger(__name__, "nuke") + + +def get_dataflow(**kwarg): + host = kwarg.get("host", "nuke") + cls = kwarg.get("cls", None) + family = kwarg.get("family", None) + assert any([host, cls]), log.error("nuke.templates.get_dataflow():" + "Missing mandatory kwargs `host`, `cls`") + + nuke_dataflow = getattr(pype.Dataflow, str(host), None) + nuke_dataflow_node = getattr(nuke_dataflow.nodes, str(cls), None) + if family: + nuke_dataflow_node = getattr(nuke_dataflow_node, str(family), None) + + log.info("Dataflow: {}".format(nuke_dataflow_node)) + return nuke_dataflow_node + + +def get_colorspace(**kwarg): + host = kwarg.get("host", "nuke") + cls = kwarg.get("cls", None) + family = kwarg.get("family", None) + assert any([host, cls]), log.error("nuke.templates.get_colorspace():" + "Missing mandatory kwargs `host`, `cls`") + + nuke_colorspace = getattr(pype.Colorspace, str(host), None) + nuke_colorspace_node = getattr(nuke_colorspace, str(cls), None) + if family: + nuke_colorspace_node = getattr(nuke_colorspace_node, str(family), None) + + log.info("Colorspace: {}".format(nuke_colorspace_node)) + return nuke_colorspace_node diff --git a/pype/plugins/nuke/create/create_write.py b/pype/plugins/nuke/create/create_write.py new file mode 100644 index 0000000000..b0a6f3de9b --- /dev/null +++ b/pype/plugins/nuke/create/create_write.py @@ -0,0 +1,65 @@ +import avalon.api +import avalon.nuke +from pype.nuke import ( + create_write_node +) +from pype import api as pype + +log = pype.Logger.getLogger(__name__, "nuke") + + +class CrateWriteRender(avalon.nuke.Creator): + name = "WriteRender" + label = "Create Write Render" + hosts = ["nuke"] + family = "render" + icon = "sign-out" + + def process(self): + instance = super(CrateWriteRender, self).process() + + if not instance: + data_templates = { + "cls": "write", + "family": self.family + } + create_write_node(self.name, self.data, data_templates) + return + + +class CrateWritePrerender(avalon.nuke.Creator): + name = "WritePrerender" + label = "Create Write Prerender" + hosts = ["nuke"] + family = "prerender" + icon = "sign-out" + + def process(self): + instance = super(CrateWritePrerender, self).process() + + if not instance: + data_templates = { + "cls": "write", + "family": self.family + } + create_write_node(self.name, self.data, data_templates) + return None + + +class CrateWriteStill(avalon.nuke.Creator): + name = "WriteStill" + label = "Create Write Still" + hosts = ["nuke"] + family = "still" + icon = "image" + + def process(self): + instance = super(CrateWriteStill, self).process() + + if not instance: + data_templates = { + "cls": "write", + "family": self.family + } + create_write_node(self.name, self.data, data_templates) + return diff --git a/pype/plugins/nuke/create/create_write_exr.py b/pype/plugins/nuke/create/create_write_exr.py deleted file mode 100644 index 8aa9ba5310..0000000000 --- a/pype/plugins/nuke/create/create_write_exr.py +++ /dev/null @@ -1,55 +0,0 @@ -import os -from pprint import pprint -import avalon.api -import avalon.nuke -import nuke -from app import api - - -class CrateWriteExr(avalon.api.Creator): - name = "Write_exr" - label = "Create Write: exr" - hosts = ["nuke"] - family = "write" - icon = "sign-out" - # TODO: create container of metadata into user knob - # TODO: if write node selected it will add metadata - - # def __init__(self, *args, **kwargs): - # super(CrateWriteExr, self).__init__(*args, **kwargs) - # self.data.setdefault("subset", "this") - - def process(self): - templates = api.Templates(type=["dataflow", "metadata", "colorspace"]) - templates = templates.format() - pprint(templates) - # nuke = getattr(sys.modules["__main__"], "nuke", None) - data = {} - ext = "exr" - - # todo: improve method of getting current environment - # todo: pref avalon.Session over os.environ - - workdir = os.path.normpath(os.environ["AVALON_WORKDIR"]) - - filename = "{}.####.exr".format(self.name) - filepath = os.path.join( - workdir, - "render", - ext, - filename - ).replace("\\", "/") - - with avalon.nuke.viewer_update_and_undo_stop(): - w = nuke.createNode( - "Write", - "name {}".format(self.name)) - # w.knob('colorspace').setValue() - w.knob('file').setValue(filepath) - w.knob('file_type').setValue(ext) - w.knob('datatype').setValue("16 bit half") - w.knob('compression').setValue("Zip (1 scanline)") - w.knob('create_directories').setValue(True) - w.knob('autocrop').setValue(True) - - return data