diff --git a/pype/nuke/__init__.py b/pype/nuke/__init__.py index 94f591b2e8..0c4cdc10ab 100644 --- a/pype/nuke/__init__.py +++ b/pype/nuke/__init__.py @@ -59,13 +59,14 @@ class NukeHandler(logging.Handler): '''Adding Nuke Logging Handler''' +log.info([handler.get_name() for handler in logging.root.handlers[:]]) nuke_handler = NukeHandler() if nuke_handler.get_name() \ not in [handler.get_name() for handler in logging.root.handlers[:]]: logging.getLogger().addHandler(nuke_handler) logging.getLogger().setLevel(logging.INFO) - +log.info([handler.get_name() for handler in logging.root.handlers[:]]) def reload_config(): """Attempt to reload pipeline at run-time. @@ -77,10 +78,7 @@ def reload_config(): import importlib for module in ( - "app", - "app.api", "{}.api".format(AVALON_CONFIG), - "{}.templates".format(AVALON_CONFIG), "{}.nuke.actions".format(AVALON_CONFIG), "{}.nuke.templates".format(AVALON_CONFIG), "{}.nuke.menu".format(AVALON_CONFIG), @@ -96,9 +94,8 @@ def reload_config(): def install(): - - # api.set_avalon_workdir() - # reload_config() + ''' Installing all requarements for Nuke host + ''' log.info("Registering Nuke plug-ins..") pyblish.register_plugin_path(PUBLISH_PATH) @@ -117,8 +114,6 @@ def install(): avalon.data["familiesStateDefault"] = False avalon.data["familiesStateToggled"] = family_states - menu.install() - # Workfiles. launch_workfiles = os.environ.get("WORKFILES_STARTUP") @@ -128,14 +123,21 @@ def install(): # Set context settings. nuke.addOnCreate(lib.set_context_settings, nodeClass="Root") + menu.install() + + def launch_workfiles_app(): + '''Function letting start workfiles after start of host + ''' if not self.workfiles_launched: self.workfiles_launched = True workfiles.show(os.environ["AVALON_WORKDIR"]) def uninstall(): + '''Uninstalling host's integration + ''' log.info("Deregistering Nuke plug-ins..") pyblish.deregister_plugin_path(PUBLISH_PATH) avalon.deregister_plugin_path(avalon.Loader, LOAD_PATH) @@ -144,8 +146,13 @@ def uninstall(): pyblish.deregister_callback("instanceToggled", on_pyblish_instance_toggled) + reload_config() + menu.uninstall() + + def on_pyblish_instance_toggled(instance, old_value, new_value): """Toggle node passthrough states on instance toggles.""" + log.info("instance toggle: {}, old_value: {}, new_value:{} ".format( instance, old_value, new_value)) diff --git a/pype/nuke/actions.py b/pype/nuke/actions.py index 640e41a7de..c0c95e9080 100644 --- a/pype/nuke/actions.py +++ b/pype/nuke/actions.py @@ -1,6 +1,3 @@ -# absolute_import is needed to counter the `module has no cmds error` in Maya -from __future__ import absolute_import - import pyblish.api from avalon.nuke.lib import ( @@ -12,7 +9,7 @@ from ..action import get_errored_instances_from_context class SelectInvalidAction(pyblish.api.Action): - """Select invalid nodes in Maya when plug-in failed. + """Select invalid nodes in Nuke when plug-in failed. To retrieve the invalid nodes this assumes a static `get_invalid()` method is available on the plugin. diff --git a/pype/nuke/lib.py b/pype/nuke/lib.py index b0842d4ab1..a528bbae11 100644 --- a/pype/nuke/lib.py +++ b/pype/nuke/lib.py @@ -20,6 +20,8 @@ self._project = None def onScriptLoad(): + ''' Callback for ffmpeg support + ''' if nuke.env['LINUX']: nuke.tcl('load ffmpegReader') nuke.tcl('load ffmpegWriter') @@ -37,6 +39,7 @@ def checkInventoryVersions(): and check if the node is having actual version. If not then it will color it to red. """ + # TODO: make it for all nodes not just Read (Loader # get all Loader nodes by avalon attribute metadata for each in nuke.allNodes(): @@ -76,13 +79,16 @@ def checkInventoryVersions(): def writes_version_sync(): + ''' Callback synchronizing version of publishable write nodes + ''' + # TODO: make it work with new write node group try: rootVersion = pype.get_version_from_path(nuke.root().name()) padding = len(rootVersion) new_version = "v" + str("{" + ":0>{}".format(padding) + "}").format( int(rootVersion) ) - log.info("new_version: {}".format(new_version)) + log.debug("new_version: {}".format(new_version)) except Exception: return @@ -92,32 +98,34 @@ def writes_version_sync(): try: if avalon_knob_data['families'] not in ["render"]: - log.info(avalon_knob_data['families']) + log.debug(avalon_knob_data['families']) continue node_file = each['file'].value() - log.info("node_file: {}".format(node_file)) node_version = "v" + pype.get_version_from_path(node_file) - log.info("node_version: {}".format(node_version)) + log.debug("node_version: {}".format(node_version)) node_new_file = node_file.replace(node_version, new_version) each['file'].setValue(node_new_file) if not os.path.isdir(os.path.dirname(node_new_file)): - log.info("path does not exist") + log.warning("Path does not exist! I am creating it.") os.makedirs(os.path.dirname(node_new_file), 0o766) except Exception as e: - log.debug( + log.warning( "Write node: `{}` has no version in path: {}".format(each.name(), e)) def version_up_script(): + ''' Raising working script's version + ''' import nukescripts nukescripts.script_and_write_nodes_version_up() def get_render_path(node): - + ''' Generate Render path from presets regarding avalon knob data + ''' data = dict() data['avalon'] = avalon.nuke.get_avalon_knob_data(node) @@ -141,12 +149,24 @@ def get_render_path(node): def format_anatomy(data): + ''' Helping function for formating of anatomy paths + + Arguments: + data (dict): dictionary with attributes used for formating + + Return: + path (str) + ''' + # TODO: perhaps should be nonPublic + from .templates import ( get_anatomy ) + # TODO: remove get_anatomy and import directly Anatomy() here anatomy = get_anatomy() - log.info("__ anatomy.templates: {}".format(anatomy.templates)) + log.debug("__ anatomy.templates: {}".format(anatomy.templates)) + # TODO: perhaps should be in try! padding = int(anatomy.templates['render']['padding']) version = data.get("version", None) @@ -167,17 +187,17 @@ def format_anatomy(data): "hierarchy": pype.get_hierarchy(), "frame": "#" * padding, }) - log.info("__ data: {}".format(data)) - log.info("__ format_anatomy: {}".format(anatomy.format(data))) return anatomy.format(data) def script_name(): + ''' Returns nuke script path + ''' return nuke.root().knob('name').value() def create_write_node(name, data, prenodes=None): - '''Creating write node which is group node + ''' Creating write node which is group node Arguments: name (str): name of node @@ -200,6 +220,8 @@ def create_write_node(name, data, prenodes=None): ) ] + Return: + node (obj): group node with avalon data as Knobs ''' nuke_dataflow_writes = get_node_dataflow_preset(**data) @@ -228,7 +250,7 @@ def create_write_node(name, data, prenodes=None): # create directory if not os.path.isdir(os.path.dirname(fpath)): - log.info("path does not exist") + log.warning("Path does not exist! I am creating it.") os.makedirs(os.path.dirname(fpath), 0o766) _data = OrderedDict({ @@ -321,11 +343,19 @@ def create_write_node(name, data, prenodes=None): lnk.makeLink(write_node.name(), "Render") lnk.setName("Render") GN.addKnob(lnk) - + return GN def add_rendering_knobs(node): + ''' Adds additional rendering knobs to given node + + Arguments: + node (obj): nuke node object to be fixed + + Return: + node (obj): with added knobs + ''' if "render" not in node.knobs(): knob = nuke.Boolean_Knob("render", "Render") knob.setFlag(0x1000) @@ -339,6 +369,12 @@ def add_rendering_knobs(node): def set_viewers_colorspace(viewer): + ''' Adds correct colorspace to viewer + + Arguments: + viewer (obj): nuke viewer node object to be fixed + + ''' assert isinstance(viewer, dict), log.error( "set_viewers_colorspace(): argument should be dictionary") @@ -382,6 +418,12 @@ def set_viewers_colorspace(viewer): def set_root_colorspace(root_dict): + ''' Adds correct colorspace to root + + Arguments: + root_dict (dict): nuke root node as dictionary + + ''' assert isinstance(root_dict, dict), log.error( "set_root_colorspace(): argument should be dictionary") @@ -398,17 +440,26 @@ def set_root_colorspace(root_dict): for knob, value in root_dict.items(): if nuke.root()[knob].value() not in value: nuke.root()[knob].setValue(str(value)) - log.info("nuke.root()['{}'] changed to: {}".format(knob, value)) + log.debug("nuke.root()['{}'] changed to: {}".format(knob, value)) def set_writes_colorspace(write_dict): + ''' Adds correct colorspace to write node dict + + Arguments: + write_dict (dict): nuke write node as dictionary + + ''' + # TODO: complete this function so any write node in scene will have fixed colorspace following presets for the project assert isinstance(write_dict, dict), log.error( "set_root_colorspace(): argument should be dictionary") - log.info("set_writes_colorspace(): {}".format(write_dict)) + + log.debug("__ set_writes_colorspace(): {}".format(write_dict)) def set_colorspace(): - + ''' Setting colorpace following presets + ''' nuke_colorspace = get_colorspace_preset().get("nuke", None) try: @@ -429,7 +480,7 @@ def set_colorspace(): try: for key in nuke_colorspace: - log.info("{}".format(key)) + log.debug("Preset's colorspace key: {}".format(key)) except TypeError: log.error("Nuke is not in templates! \n\n\n" "contact your supervisor!") @@ -475,10 +526,6 @@ def reset_frame_range_handles(): root["first_frame"].setValue(frame_start) root["last_frame"].setValue(frame_end) - log.info("__ handle_start: `{}`".format(handle_start)) - log.info("__ handle_end: `{}`".format(handle_end)) - log.info("__ fps: `{}`".format(fps)) - # setting active viewers nuke.frame(int(asset_entity["data"]["frameStart"])) @@ -489,10 +536,6 @@ def reset_frame_range_handles(): for node in nuke.allNodes(filter="Viewer"): node['frame_range'].setValue(range) node['frame_range_lock'].setValue(True) - - log.info("_frameRange: {}".format(range)) - log.info("frameRange: {}".format(node['frame_range'].value())) - node['frame_range'].setValue(range) node['frame_range_lock'].setValue(True) @@ -515,7 +558,6 @@ def reset_resolution(): height = asset.get('data', {}).get("resolutionHeight") pixel_aspect = asset.get('data', {}).get("pixelAspect") - log.info("pixel_aspect: {}".format(pixel_aspect)) if any(not x for x in [width, height, pixel_aspect]): log.error("Missing set shot attributes in DB. \nContact your supervisor!. \n\nWidth: `{0}` \nHeight: `{1}` \nPixel Asspect: `{2}`".format( width, height, pixel_aspect)) @@ -564,7 +606,6 @@ def reset_resolution(): "t": int(check_format.t()), }) crnt_fmt_str = make_format_string(**crnt_fmt_kargs) - log.info("crnt_fmt_str: {}".format(crnt_fmt_str)) new_fmt_kargs = { "width": int(width), @@ -581,7 +622,6 @@ def reset_resolution(): }) new_fmt_str = make_format_string(**new_fmt_kargs) - log.info("new_fmt_str: {}".format(new_fmt_str)) if new_fmt_str not in crnt_fmt_str: make_format(frm_str=new_fmt_str, diff --git a/pype/nuke/menu.py b/pype/nuke/menu.py index 169ac81096..4f5410f8fd 100644 --- a/pype/nuke/menu.py +++ b/pype/nuke/menu.py @@ -2,10 +2,11 @@ import nuke from avalon.api import Session from pype.nuke import lib +from pypeapp import Logger +log = Logger().get_logger(__name__, "nuke") def install(): - menubar = nuke.menu("Nuke") menu = menubar.findItem(Session["AVALON_LABEL"]) @@ -15,8 +16,11 @@ def install(): rm_item = [ (i, item) for i, item in enumerate(menu.items()) if name in item.name() ][0] + + log.debug("Changing Item: {}".format(rm_item)) + # rm_item[1].setEnabled(False) menu.removeItem(rm_item[1].name()) - menu.addCommand(new_name, lib.reset_resolution, index=rm_item[0]) + menu.addCommand(new_name, lib.reset_resolution, index=(rm_item[0])) # replace reset frame range from avalon core to pype's name = "Reset Frame Range" @@ -24,8 +28,10 @@ def install(): rm_item = [ (i, item) for i, item in enumerate(menu.items()) if name in item.name() ][0] + log.debug("Changing Item: {}".format(rm_item)) + # rm_item[1].setEnabled(False) menu.removeItem(rm_item[1].name()) - menu.addCommand(new_name, lib.reset_frame_range_handles, index=rm_item[0]) + menu.addCommand(new_name, lib.reset_frame_range_handles, index=(rm_item[0])) # add colorspace menu item name = "Set colorspace" @@ -33,9 +39,22 @@ def install(): name, lib.set_colorspace, index=(rm_item[0]+2) ) + log.debug("Adding menu item: {}".format(name)) # add item that applies all setting above name = "Apply all settings" menu.addCommand( name, lib.set_context_settings, index=(rm_item[0]+3) ) + log.debug("Adding menu item: {}".format(name)) + + + +def uninstall(): + + menubar = nuke.menu("Nuke") + menu = menubar.findItem(Session["AVALON_LABEL"]) + + for item in menu.items(): + log.info("Removing menu item: {}".format(item.name())) + menu.removeItem(item.name()) diff --git a/pype/nuke/templates.py b/pype/nuke/templates.py index 797335d982..6434d73f1d 100644 --- a/pype/nuke/templates.py +++ b/pype/nuke/templates.py @@ -20,6 +20,8 @@ def get_colorspace_preset(): def get_node_dataflow_preset(**kwarg): + ''' Get preset data for dataflow (fileType, compression, bitDepth) + ''' log.info(kwarg) host = kwarg.get("host", "nuke") cls = kwarg.get("class", None) @@ -39,6 +41,8 @@ def get_node_dataflow_preset(**kwarg): def get_node_colorspace_preset(**kwarg): + ''' Get preset data for colorspace + ''' log.info(kwarg) host = kwarg.get("host", "nuke") cls = kwarg.get("class", None)