From 04484d1cd775b10916a914ffff8bdfd2bce4496c Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Mon, 5 Aug 2019 18:41:17 +0200 Subject: [PATCH 1/9] starting changelog --- changelog.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 changelog.md diff --git a/changelog.md b/changelog.md new file mode 100644 index 0000000000..648ce6c57d --- /dev/null +++ b/changelog.md @@ -0,0 +1,37 @@ +# Pype changelog # +Welcome to pype changelog + +## 2.1 ## + +A large cleanup release. Most of the change are under the hood. + +**new**: +- _(pype)_ add customisable workflow for creating quicktimes from renders or playblasts +- _(pype)_ Added configurable option to add burnins to any generated quicktimes +- _(ftrack)_ Action that identifies what machines pype is running on. +- _(system)_ unify subprocess calls +- _(maya)_ add audio to review quicktimes +- _(nuke)_ add crop before write node to prevent overscan problems in ffmpeg +- Nuke Studio publishing and workfiles support +- Muster render manager support +- _(nuke)_ Framerange, FPS and Resolution are set automatically at startup +- _(maya)_ Ability to load published sequences as image planes +- _(system)_ Ftrack event that sets asset folder permissions based on task assignees in ftrack. +- _(maya)_ Pyblish plugin that allow validation of maya attributes + +**changed**: +- change multiple key attributes to unify their behaviour across the pipeline +- (nuke) write nodes are now created inside group with only some attributes editable by the artist +- rendered frames are now deleted from temporary location after their publishing is finished. +- (ftrack) RV action can now be launched from any entity + +**fix**: +- faster hierarchy retrieval from db +- (nuke) A lot of stability enhancements +- (nuke studio) A lot of stability enhancements +- (nuke) now only renders a single write node on farm +- (ftrack) pype would crash when launcher project level task + +**deprecated**: +- following attributes are considered deprecated as of 2.1 release + - From d9b39b2e8c77e08c624eb41ecde49440de25b968 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Mon, 5 Aug 2019 18:59:43 +0200 Subject: [PATCH 2/9] updare changelog --- changelog.md | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/changelog.md b/changelog.md index 648ce6c57d..aef639fd1d 100644 --- a/changelog.md +++ b/changelog.md @@ -18,20 +18,38 @@ A large cleanup release. Most of the change are under the hood. - _(maya)_ Ability to load published sequences as image planes - _(system)_ Ftrack event that sets asset folder permissions based on task assignees in ftrack. - _(maya)_ Pyblish plugin that allow validation of maya attributes +- _(system)_ added better startup logging to tray debug, including basic connection information +- _(avalon)_ option to group published subsets to groups in the loader +- _(avalon)_ loader family filters are working now **changed**: - change multiple key attributes to unify their behaviour across the pipeline -- (nuke) write nodes are now created inside group with only some attributes editable by the artist +- _(nuke)_ write nodes are now created inside group with only some attributes editable by the artist - rendered frames are now deleted from temporary location after their publishing is finished. -- (ftrack) RV action can now be launched from any entity +- _(ftrack)_ RV action can now be launched from any entity +- after publishing only refresh button is now available in pyblish UI +- added context instance pyblish-lite so that artist knows if context plugin fails +- _(avalon)_ allow opening selected files using enter key **fix**: - faster hierarchy retrieval from db -- (nuke) A lot of stability enhancements -- (nuke studio) A lot of stability enhancements -- (nuke) now only renders a single write node on farm -- (ftrack) pype would crash when launcher project level task +- _(nuke)_ A lot of stability enhancements +- _(nuke studio)_ A lot of stability enhancements +- _(nuke)_ now only renders a single write node on farm +- _(ftrack)_ pype would crash when launcher project level task +- work directory was sometimes not being created correctly +- major pype.lib cleanup. Removing of unused functions, merging those that were doing the same and general house cleaning. +- _(avalon)_ subsets in maya 2019 weren't behaving correctly in the outliner **deprecated**: -- following attributes are considered deprecated as of 2.1 release - - +- following attributes are considered deprecated because they have been remapped to a different name as of 2.1 release + - `frameRate` to `fps` + - `startFrame` to `frameStart` + - `endFrame` to `frameEnd` + - `fstart` to `frameStart` + - `fend` to `frameEnd` + - `handle_start` to `handleStart` + - `handle_end` to `handleEnd` + - `resolution_width` to `resolutionWidth` + - `resolution_height` to `resolutionHeight` + - `pixel_aspect` to `pixelAspect` From 0b742e5bb5d1d5426ad06a8ce5d3fe10993a15ab Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Mon, 5 Aug 2019 19:11:49 +0200 Subject: [PATCH 3/9] fix(nuke): doctstrings and printing cleanup --- pype/nuke/__init__.py | 25 +++++++---- pype/nuke/actions.py | 5 +-- pype/nuke/lib.py | 96 ++++++++++++++++++++++++++++++------------ pype/nuke/menu.py | 25 +++++++++-- pype/nuke/templates.py | 4 ++ 5 files changed, 111 insertions(+), 44 deletions(-) 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) From cfdc076324ce442ef9850dc75687d1a67a025338 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Mon, 5 Aug 2019 19:12:50 +0200 Subject: [PATCH 4/9] highlighs key additions --- changelog.md | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/changelog.md b/changelog.md index aef639fd1d..7a8fd07530 100644 --- a/changelog.md +++ b/changelog.md @@ -12,8 +12,8 @@ A large cleanup release. Most of the change are under the hood. - _(system)_ unify subprocess calls - _(maya)_ add audio to review quicktimes - _(nuke)_ add crop before write node to prevent overscan problems in ffmpeg -- Nuke Studio publishing and workfiles support -- Muster render manager support +- **Nuke Studio** publishing and workfiles support +- **Muster** render manager support - _(nuke)_ Framerange, FPS and Resolution are set automatically at startup - _(maya)_ Ability to load published sequences as image planes - _(system)_ Ftrack event that sets asset folder permissions based on task assignees in ftrack. @@ -24,6 +24,17 @@ A large cleanup release. Most of the change are under the hood. **changed**: - change multiple key attributes to unify their behaviour across the pipeline + - `frameRate` to `fps` + - `startFrame` to `frameStart` + - `endFrame` to `frameEnd` + - `fstart` to `frameStart` + - `fend` to `frameEnd` + - `handle_start` to `handleStart` + - `handle_end` to `handleEnd` + - `resolution_width` to `resolutionWidth` + - `resolution_height` to `resolutionHeight` + - `pixel_aspect` to `pixelAspect` + - _(nuke)_ write nodes are now created inside group with only some attributes editable by the artist - rendered frames are now deleted from temporary location after their publishing is finished. - _(ftrack)_ RV action can now be launched from any entity @@ -40,16 +51,3 @@ A large cleanup release. Most of the change are under the hood. - work directory was sometimes not being created correctly - major pype.lib cleanup. Removing of unused functions, merging those that were doing the same and general house cleaning. - _(avalon)_ subsets in maya 2019 weren't behaving correctly in the outliner - -**deprecated**: -- following attributes are considered deprecated because they have been remapped to a different name as of 2.1 release - - `frameRate` to `fps` - - `startFrame` to `frameStart` - - `endFrame` to `frameEnd` - - `fstart` to `frameStart` - - `fend` to `frameEnd` - - `handle_start` to `handleStart` - - `handle_end` to `handleEnd` - - `resolution_width` to `resolutionWidth` - - `resolution_height` to `resolutionHeight` - - `pixel_aspect` to `pixelAspect` From 5b7304d868032af9f86040f2b921eba38896cceb Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Mon, 5 Aug 2019 19:14:31 +0200 Subject: [PATCH 5/9] added avalon core version --- changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/changelog.md b/changelog.md index 7a8fd07530..159ff0baeb 100644 --- a/changelog.md +++ b/changelog.md @@ -41,6 +41,7 @@ A large cleanup release. Most of the change are under the hood. - after publishing only refresh button is now available in pyblish UI - added context instance pyblish-lite so that artist knows if context plugin fails - _(avalon)_ allow opening selected files using enter key +- _(avalon)_ core updated to v5.2.9 with our forked changes on top **fix**: - faster hierarchy retrieval from db From 9894cc93d392df90369e5c58e7caa31c1b0951a5 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Mon, 5 Aug 2019 23:24:03 +0200 Subject: [PATCH 6/9] mark old loaders as deprecated --- pype/plugins/maya/load/load_reference.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pype/plugins/maya/load/load_reference.py b/pype/plugins/maya/load/load_reference.py index 199d79c941..fb4b90a1cd 100644 --- a/pype/plugins/maya/load/load_reference.py +++ b/pype/plugins/maya/load/load_reference.py @@ -74,12 +74,14 @@ class ReferenceLoader(pype.maya.plugin.ReferenceLoader): # for backwards compatibility class AbcLoader(ReferenceLoader): + label = "Deprecated loader (don't use)" families = ["pointcache", "animation"] representations = ["abc"] tool_names = [] # for backwards compatibility class ModelLoader(ReferenceLoader): + label = "Deprecated loader (don't use)" families = ["model", "pointcache"] representations = ["abc"] tool_names = [] From 9594c8ab1c7ee33d644954f85673d488fdfea0ab Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Mon, 5 Aug 2019 23:24:27 +0200 Subject: [PATCH 7/9] fix attributes for renderdata retrieval --- pype/plugins/maya/publish/collect_renderlayers.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pype/plugins/maya/publish/collect_renderlayers.py b/pype/plugins/maya/publish/collect_renderlayers.py index 593ab2e74d..ce80039362 100644 --- a/pype/plugins/maya/publish/collect_renderlayers.py +++ b/pype/plugins/maya/publish/collect_renderlayers.py @@ -64,9 +64,9 @@ class CollectMayaRenderlayers(pyblish.api.ContextPlugin): "subset": layername, "setMembers": layer, "publish": True, - "frameStart": self.get_render_attribute("frameStart", + "frameStart": self.get_render_attribute("startFrame", layer=layer), - "frameEnd": self.get_render_attribute("frameEnd", + "frameEnd": self.get_render_attribute("endFrame", layer=layer), "byFrameStep": self.get_render_attribute("byFrameStep", layer=layer), From 977e061ba09e4b3e1db9304e27f5b1f5ea1024f0 Mon Sep 17 00:00:00 2001 From: Milan Kolar Date: Mon, 5 Aug 2019 23:40:00 +0200 Subject: [PATCH 8/9] adding version string in the __init__.py --- pype/__init__.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pype/__init__.py b/pype/__init__.py index 35511eb6c1..a5858f49e7 100644 --- a/pype/__init__.py +++ b/pype/__init__.py @@ -7,6 +7,8 @@ from .lib import filter_pyblish_plugins import logging log = logging.getLogger(__name__) +__version__ = "2.1.0" + PACKAGE_DIR = os.path.dirname(__file__) PLUGINS_DIR = os.path.join(PACKAGE_DIR, "plugins") From 2470622bd7e4a3a64f4fb869b97adca2847e2297 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Tue, 6 Aug 2019 19:12:49 +0200 Subject: [PATCH 9/9] fix(nukestudio): docstrings and module import sorting --- pype/nukestudio/__init__.py | 56 +++++++++++++++++++++++++++++-------- pype/nukestudio/lib.py | 34 ++++++++++++---------- pype/nukestudio/menu.py | 16 ++++++----- pype/nukestudio/tags.py | 3 +- 4 files changed, 73 insertions(+), 36 deletions(-) diff --git a/pype/nukestudio/__init__.py b/pype/nukestudio/__init__.py index 2e7ccdd675..c900848a93 100644 --- a/pype/nukestudio/__init__.py +++ b/pype/nukestudio/__init__.py @@ -1,5 +1,6 @@ import os - +from pypeapp import Logger +import hiero from avalon.tools import workfiles from avalon import api as avalon from pyblish import api as pyblish @@ -13,20 +14,12 @@ from .workio import ( work_root ) -from .. import api - from .menu import ( install as menu_install, _update_menu_task_label ) from .tags import add_tags_from_presets -from pypeapp import Logger - -import hiero - -log = Logger().get_logger(__name__, "nukestudio") - __all__ = [ # Workfiles API "open", @@ -35,11 +28,16 @@ __all__ = [ "has_unsaved_changes", "file_extensions", "work_root", - ] +] + +# get logger +log = Logger().get_logger(__name__, "nukestudio") +''' Creating all important host related variables ''' AVALON_CONFIG = os.getenv("AVALON_CONFIG", "pype") +# plugin root path PARENT_DIR = os.path.dirname(__file__) PACKAGE_DIR = os.path.dirname(PARENT_DIR) PLUGINS_DIR = os.path.join(PACKAGE_DIR, "plugins") @@ -49,13 +47,21 @@ LOAD_PATH = os.path.join(PLUGINS_DIR, "nukestudio", "load") CREATE_PATH = os.path.join(PLUGINS_DIR, "nukestudio", "create") INVENTORY_PATH = os.path.join(PLUGINS_DIR, "nukestudio", "inventory") - +# registering particular pyblish gui but `lite` is recomended!! if os.getenv("PYBLISH_GUI", None): pyblish.register_gui(os.getenv("PYBLISH_GUI", None)) def install(config): + """ + Installing Nukestudio integration for avalon + Args: + config (obj): avalon config module `pype` in our case, it is not used but required by avalon.api.install() + + """ + + # adding all events _register_events() log.info("Registering NukeStudio plug-ins..") @@ -74,6 +80,7 @@ def install(config): avalon.data["familiesStateDefault"] = False avalon.data["familiesStateToggled"] = family_states + # install menu menu_install() # Workfiles. @@ -91,11 +98,26 @@ def install(config): def add_tags(event): + """ + Event for automatic tag creation after nukestudio start + + Args: + event (obj): required but unused + """ + add_tags_from_presets() def launch_workfiles_app(event): - workfiles.show(os.environ["AVALON_WORKDIR"]) + """ + Event for launching workfiles after nukestudio start + + Args: + event (obj): required but unused + """ + from .lib import set_workfiles + + set_workfiles() # Closing the new project. event.sender.close() @@ -107,6 +129,10 @@ def launch_workfiles_app(event): def uninstall(): + """ + Uninstalling Nukestudio integration for avalon + + """ log.info("Deregistering NukeStudio plug-ins..") pyblish.deregister_host("nukestudio") pyblish.deregister_plugin_path(PUBLISH_PATH) @@ -115,6 +141,11 @@ def uninstall(): def _register_events(): + """ + Adding all callbacks. + """ + + # if task changed then change notext of nukestudio avalon.on("taskChanged", _update_menu_task_label) log.info("Installed event callback for 'taskChanged'..") @@ -129,4 +160,5 @@ def ls(): See the `container.json` schema for details on how it should look, and the Maya equivalent, which is in `avalon.maya.pipeline` """ + # TODO: listing all availabe containers form sequence return diff --git a/pype/nukestudio/lib.py b/pype/nukestudio/lib.py index 9136fb359a..6674e8a3aa 100644 --- a/pype/nukestudio/lib.py +++ b/pype/nukestudio/lib.py @@ -1,19 +1,13 @@ -# Standard library import os import sys - -# Pyblish libraries -import pyblish.api - -import avalon.api as avalon -import pype.api as pype - -from avalon.vendor.Qt import (QtWidgets, QtGui) - -# Host libraries import hiero - +import pyblish.api +import avalon.api as avalon +from avalon.vendor.Qt import (QtWidgets, QtGui) +import pype.api as pype from pypeapp import Logger + + log = Logger().get_logger(__name__, "nukestudio") cached_process = None @@ -30,12 +24,18 @@ AVALON_CONFIG = os.getenv("AVALON_CONFIG", "pype") def set_workfiles(): ''' Wrapping function for workfiles launcher ''' from avalon.tools import workfiles + + # import session to get project dir S = avalon.Session active_project_root = os.path.normpath( os.path.join(S['AVALON_PROJECTS'], S['AVALON_PROJECT']) ) workdir = os.environ["AVALON_WORKDIR"] + + # show workfile gui workfiles.show(workdir) + + # getting project project = hiero.core.projects()[-1] # set project root with backward compatibility @@ -64,11 +64,10 @@ def set_workfiles(): # set fps to hiero project project.setFramerate(fps) + # TODO: add auto colorspace set from project drop log.info("Project property has been synchronised with Avalon db") - - def reload_config(): """Attempt to reload pipeline at run-time. @@ -189,6 +188,10 @@ def add_submission(): class PublishAction(QtWidgets.QAction): + """ + Action with is showing as menu item + """ + def __init__(self): QtWidgets.QAction.__init__(self, "Publish", None) self.triggered.connect(self.publish) @@ -213,7 +216,8 @@ class PublishAction(QtWidgets.QAction): def _show_no_gui(): - """Popup with information about how to register a new GUI + """ + Popup with information about how to register a new GUI In the event of no GUI being registered or available, this information dialog will appear to guide the user through how to get set up with one. diff --git a/pype/nukestudio/menu.py b/pype/nukestudio/menu.py index 6babceff41..a996389524 100644 --- a/pype/nukestudio/menu.py +++ b/pype/nukestudio/menu.py @@ -1,24 +1,23 @@ import os import sys import hiero.core +from pypeapp import Logger +from avalon.api import Session +from hiero.ui import findMenuAction +# this way we secure compatibility between nuke 10 and 11 try: from PySide.QtGui import * except Exception: from PySide2.QtGui import * from PySide2.QtWidgets import * -from hiero.ui import findMenuAction - -from avalon.api import Session - from .tags import add_tags_from_presets from .lib import ( reload_config, set_workfiles ) -from pypeapp import Logger log = Logger().get_logger(__name__, "nukestudio") @@ -45,6 +44,11 @@ def _update_menu_task_label(*args): def install(): + """ + Installing menu into Nukestudio + + """ + # here is the best place to add menu from avalon.tools import ( creator, @@ -127,8 +131,6 @@ def install(): 'icon': QIcon('icons:ColorAdd.png') }] - - # Create menu items for a in actions: add_to_menu = menu diff --git a/pype/nukestudio/tags.py b/pype/nukestudio/tags.py index d9574bdf2b..8ae88d731c 100644 --- a/pype/nukestudio/tags.py +++ b/pype/nukestudio/tags.py @@ -1,5 +1,6 @@ import re import os +import hiero from pypeapp import ( config, @@ -7,8 +8,6 @@ from pypeapp import ( ) from avalon import io -import hiero - log = Logger().get_logger(__name__, "nukestudio")