From 484d674b423490264681fd01ab060f98f38b653b Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 27 Nov 2018 08:27:49 +0100 Subject: [PATCH] adding menu.py and colorspace setting --- pype/nuke/__init__.py | 74 +++++++++++++------- pype/nuke/lib.py | 61 +++++++++++++++- pype/nuke/menu.py | 12 ++++ pype/plugins/nuke/create/create_write_exr.py | 7 +- 4 files changed, 128 insertions(+), 26 deletions(-) create mode 100644 pype/nuke/menu.py diff --git a/pype/nuke/__init__.py b/pype/nuke/__init__.py index 8e3c33f9c3..97c9d714fc 100644 --- a/pype/nuke/__init__.py +++ b/pype/nuke/__init__.py @@ -2,20 +2,22 @@ import os import sys from avalon import api as avalon from pyblish import api as pyblish -from pype.api import Logger -# import logging +from ..api import Logger +from pype.nuke import menu + import nuke # removing logger handler created in avalon_core -loggers = [handler - for handler in Logger.logging.root.handlers[:]] - -if len(loggers) > 2: - Logger.logging.root.removeHandler(loggers[0]) +for name, handler in [(handler.get_name(), handler) + for handler in Logger.logging.root.handlers[:]]: + if "pype" not in str(name).lower(): + Logger.logging.root.removeHandler(handler) log = Logger.getLogger(__name__, "nuke") +AVALON_CONFIG = os.getenv("AVALON_CONFIG", "pype") + PARENT_DIR = os.path.dirname(__file__) PACKAGE_DIR = os.path.dirname(PARENT_DIR) PLUGINS_DIR = os.path.join(PACKAGE_DIR, "plugins") @@ -38,35 +40,57 @@ class NukeHandler(Logger.logging.Handler): def __init__(self): Logger.logging.Handler.__init__(self) + self.set_name("Pype_Nuke_Handler") def emit(self, record): # Formated message: msg = self.format(record) - # if record.levelname.lower() is "warning": - # nuke.warning(msg) - - elif record.levelname.lower() in ["critical", "fatal", "error"]: - nuke.message(record.message) - - # elif record.levelname.lower() is "info": - # log.info(msg) - # - # elif record.levelname.lower() is "debug": - # log.debug(msg) - - # else: - # sys.stdout.write(msg) + if record.levelname.lower() in [ + "warning", + "critical", + "fatal", + "error" + ]: + nuke.message(msg) +'''Adding Nuke Logging Handler''' nuke_handler = NukeHandler() -log.addHandler(nuke_handler) +if nuke_handler.get_name() \ + not in [handler.get_name() + for handler in Logger.logging.root.handlers[:]]: + Logger.logging.getLogger().addHandler(nuke_handler) + if not self.nLogger: - self.nLogger = log + self.nLogger = Logger + + +def reload_config(): + """Attempt to reload pipeline at run-time. + + CAUTION: This is primarily for development and debugging purposes. + + """ + + import importlib + + for module in ( + "{}".format(AVALON_CONFIG), + "{}.nuke".format(AVALON_CONFIG), + "{}.nuke.lib".format(AVALON_CONFIG), + "{}.nuke.menu".format(AVALON_CONFIG) + ): + log.info("Reloading module: {}...".format(module)) + module = importlib.import_module(module) + try: + reload(module) + except Exception: + importlib.reload(module) def install(): - + reload_config() log.info("Registering Nuke plug-ins..") pyblish.register_plugin_path(PUBLISH_PATH) avalon.register_plugin_path(avalon.Loader, LOAD_PATH) @@ -86,6 +110,8 @@ def install(): avalon.data["familiesStateDefault"] = False avalon.data["familiesStateToggled"] = family_states + menu.install() + def uninstall(): log.info("Deregistering Nuke plug-ins..") diff --git a/pype/nuke/lib.py b/pype/nuke/lib.py index 3971b7c977..7a30abad94 100644 --- a/pype/nuke/lib.py +++ b/pype/nuke/lib.py @@ -1,10 +1,13 @@ import sys - +from pprint import pprint from avalon.vendor.Qt import QtGui import avalon.nuke +from app.api import Logger + import nuke +log = Logger.getLogger(__name__, "nuke") self = sys.modules[__name__] self._project = None @@ -58,3 +61,59 @@ def get_additional_data(container): ] return {"color": QtGui.QColor().fromRgbF(rgba[0], rgba[1], rgba[2])} + + +def check_viewers(viewer): + filter_knobs = [ + "viewerProcess", + "wipe_position" + ] + viewers = [n for n in nuke.allNodes() if n.Class() == 'Viewer'] + erased_viewers = [] + + for v in viewers: + v['viewerProcess'].setValue(str(viewer.viewerProcess)) + if str(viewer.viewerProcess) not in v['viewerProcess'].value(): + copy_inputs = v.dependencies() + copy_knobs = {k: v[k].value() for k in v.knobs() + if k not in filter_knobs} + pprint(copy_knobs) + # delete viewer with wrong settings + erased_viewers.append(v['name'].value()) + nuke.delete(v) + + # create new viewer + nv = nuke.createNode("Viewer") + + # connect to original inputs + for i, n in enumerate(copy_inputs): + nv.setInput(i, n) + + # set coppied knobs + for k, v in copy_knobs.items(): + print(k, v) + nv[k].setValue(v) + + # set viewerProcess + nv['viewerProcess'].setValue(str(viewer.viewerProcess)) + + if erased_viewers: + log.warning( + "Attention! Viewer nodes {} were erased." + "It had wrong color profile".format(erased_viewers)) + + +def set_colorspace(): + from app.api import Templates + + t = Templates(type=["colorspace"]) + colorspace = t.colorspace + + nuke_colorspace = getattr(colorspace, "nuke", None) + check_viewers(nuke_colorspace.viewer) + try: + for key in nuke_colorspace: + log.info("{}".format(key)) + except TypeError: + log.error("Nuke is not in templates! \n\n\n" + "contact your supervisor!") diff --git a/pype/nuke/menu.py b/pype/nuke/menu.py new file mode 100644 index 0000000000..97e2432e16 --- /dev/null +++ b/pype/nuke/menu.py @@ -0,0 +1,12 @@ +import nuke +from avalon.api import Session + +from pype.nuke import lib + + +def install(): + menubar = nuke.menu("Nuke") + menu = menubar.findItem(Session["AVALON_LABEL"]) + + menu.addSeparator() + menu.addCommand("Set colorspace...", lib.set_colorspace) diff --git a/pype/plugins/nuke/create/create_write_exr.py b/pype/plugins/nuke/create/create_write_exr.py index b77b5735e8..8aa9ba5310 100644 --- a/pype/plugins/nuke/create/create_write_exr.py +++ b/pype/plugins/nuke/create/create_write_exr.py @@ -1,7 +1,9 @@ import os +from pprint import pprint import avalon.api import avalon.nuke import nuke +from app import api class CrateWriteExr(avalon.api.Creator): @@ -12,12 +14,15 @@ class CrateWriteExr(avalon.api.Creator): 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"