From 528c98c5e3ddbfa8e4f6f9782531f39486e06491 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Sat, 15 Sep 2018 17:52:29 +0200 Subject: [PATCH 1/3] rebase to initialisation branch --- LICENSE | 1 + 1 file changed, 1 insertion(+) diff --git a/LICENSE b/LICENSE index ff92932e59..da09a0890f 100644 --- a/LICENSE +++ b/LICENSE @@ -2,6 +2,7 @@ MIT License Copyright (c) 2018 pype club + Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights From fe1372fef62d1e54ff1aea51122b16715306d9a3 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Thu, 20 Sep 2018 10:37:03 +0200 Subject: [PATCH 2/3] convert "colorbleed" to either "studio" or "config" --- config/apps/fusion/__init__.py | 6 +- config/apps/maya/__init__.py | 2 +- config/apps/maya/lib.py | 10 +- config/apps/maya/menu.py | 4 +- config/apps/nuke/__init__.py | 67 +++++ config/apps/nuke/lib.py | 61 +++++ config/lib.py | 2 +- .../fusion/create/create_tiff_saver.py | 2 +- config/plugins/fusion/load/actions.py | 20 +- config/plugins/fusion/load/load_sequence.py | 2 +- .../fusion/publish/collect_instances.py | 4 +- .../fusion/publish/collect_render_target.py | 8 +- .../increment_current_file_deadline.py | 6 +- .../fusion/publish/publish_image_sequences.py | 8 +- config/plugins/fusion/publish/render_local.py | 2 +- config/plugins/fusion/publish/save_scene.py | 2 +- .../plugins/fusion/publish/submit_deadline.py | 2 +- .../publish/validate_background_depth.py | 4 +- .../fusion/publish/validate_comp_saved.py | 2 +- .../publish/validate_create_folder_checked.py | 4 +- .../validate_filename_has_extension.py | 2 +- .../publish/validate_saver_has_input.py | 2 +- .../publish/validate_saver_passthrough.py | 2 +- .../fusion/publish/validate_unique_subsets.py | 2 +- .../plugins/global/load/open_imagesequence.py | 2 +- .../global/publish/collect_deadline_user.py | 2 +- .../global/publish/collect_filesequences.py | 2 +- config/plugins/global/publish/integrate.py | 22 +- .../global/publish/submit_publish_job.py | 8 +- .../publish/validate_sequence_frames.py | 2 +- .../maya/create/colorbleed_animation.py | 2 +- .../plugins/maya/create/colorbleed_camera.py | 2 +- config/plugins/maya/create/colorbleed_look.py | 2 +- .../plugins/maya/create/colorbleed_model.py | 2 +- .../maya/create/colorbleed_pointcache.py | 2 +- .../maya/create/colorbleed_renderglobals.py | 2 +- config/plugins/maya/create/colorbleed_rig.py | 2 +- .../maya/create/colorbleed_setdress.py | 2 +- .../maya/create/colorbleed_vrayproxy.py | 2 +- .../maya/create/colorbleed_yeti_cache.py | 2 +- .../maya/create/colorbleed_yeti_rig.py | 2 +- config/plugins/maya/load/_load_animation.py | 8 +- config/plugins/maya/load/actions.py | 12 +- config/plugins/maya/load/load_alembic.py | 4 +- config/plugins/maya/load/load_camera.py | 2 +- config/plugins/maya/load/load_look.py | 2 +- config/plugins/maya/load/load_model.py | 4 +- config/plugins/maya/load/load_rig.py | 4 +- config/plugins/maya/load/load_setdress.py | 8 +- config/plugins/maya/load/load_vrayproxy.py | 2 +- config/plugins/maya/load/load_yeti_cache.py | 2 +- config/plugins/maya/load/load_yeti_rig.py | 2 +- .../plugins/maya/publish/collect_animation.py | 2 +- .../plugins/maya/publish/collect_history.py | 2 +- config/plugins/maya/publish/collect_look.py | 2 +- config/plugins/maya/publish/collect_model.py | 4 +- .../maya/publish/collect_render_layer_aovs.py | 2 +- .../maya/publish/collect_renderlayers.py | 2 +- .../plugins/maya/publish/collect_setdress.py | 2 +- .../maya/publish/collect_yeti_cache.py | 2 +- .../plugins/maya/publish/collect_yeti_rig.py | 2 +- .../plugins/maya/publish/extract_animation.py | 6 +- .../maya/publish/extract_camera_alembic.py | 6 +- .../maya/publish/extract_camera_mayaAscii.py | 6 +- config/plugins/maya/publish/extract_look.py | 6 +- .../maya/publish/extract_maya_ascii_raw.py | 4 +- config/plugins/maya/publish/extract_model.py | 6 +- .../maya/publish/extract_pointcache.py | 8 +- config/plugins/maya/publish/extract_rig.py | 6 +- .../plugins/maya/publish/extract_setdress.py | 6 +- .../plugins/maya/publish/extract_vrayproxy.py | 6 +- .../maya/publish/extract_yeti_cache.py | 6 +- .../plugins/maya/publish/extract_yeti_rig.py | 6 +- .../increment_current_file_deadline.py | 6 +- config/plugins/maya/publish/save_scene.py | 2 +- .../plugins/maya/publish/submit_deadline.py | 2 +- .../publish/validate_animation_content.py | 8 +- ...date_animation_out_set_related_node_ids.py | 8 +- .../publish/validate_camera_attributes.py | 8 +- .../maya/publish/validate_camera_contents.py | 8 +- .../publish/validate_deadline_connection.py | 2 +- .../maya/publish/validate_frame_range.py | 12 +- .../publish/validate_instance_has_members.py | 6 +- .../maya/publish/validate_instance_subset.py | 4 +- .../publish/validate_instancer_content.py | 2 +- .../validate_instancer_frame_ranges.py | 2 +- .../maya/publish/validate_joints_hidden.py | 10 +- .../maya/publish/validate_look_contents.py | 8 +- ...lidate_look_default_shaders_connections.py | 6 +- .../publish/validate_look_members_unique.py | 10 +- .../validate_look_no_default_shaders.py | 8 +- .../maya/publish/validate_look_sets.py | 8 +- .../publish/validate_look_single_shader.py | 8 +- .../maya/publish/validate_maya_units.py | 8 +- .../maya/publish/validate_mesh_has_uv.py | 8 +- .../publish/validate_mesh_lamina_faces.py | 8 +- .../validate_mesh_no_negative_scale.py | 8 +- .../publish/validate_mesh_non_manifold.py | 8 +- .../publish/validate_mesh_non_zero_edge.py | 8 +- .../publish/validate_mesh_normals_unlocked.py | 10 +- .../validate_mesh_shader_connections.py | 10 +- .../publish/validate_mesh_single_uv_set.py | 10 +- .../validate_mesh_vertices_have_edges.py | 10 +- .../maya/publish/validate_model_content.py | 8 +- .../maya/publish/validate_no_animation.py | 8 +- .../publish/validate_no_default_camera.py | 8 +- .../maya/publish/validate_no_namespace.py | 10 +- .../publish/validate_no_null_transforms.py | 8 +- .../maya/publish/validate_no_unknown_nodes.py | 8 +- .../maya/publish/validate_no_vraymesh.py | 2 +- .../plugins/maya/publish/validate_node_ids.py | 20 +- .../validate_node_ids_deformed_shapes.py | 9 +- .../publish/validate_node_ids_in_database.py | 6 +- .../maya/publish/validate_node_ids_related.py | 14 +- .../maya/publish/validate_node_ids_unique.py | 14 +- .../maya/publish/validate_node_no_ghosting.py | 8 +- .../publish/validate_render_image_rule.py | 6 +- .../maya/publish/validate_renderlayer_aovs.py | 6 +- .../maya/publish/validate_rendersettings.py | 8 +- .../maya/publish/validate_resources.py | 4 +- .../maya/publish/validate_rig_contents.py | 6 +- .../maya/publish/validate_rig_controllers.py | 10 +- ...idate_rig_controllers_arnold_attributes.py | 10 +- .../publish/validate_rig_out_set_node_ids.py | 8 +- .../publish/validate_scene_set_workspace.py | 6 +- .../publish/validate_setdress_namespaces.py | 6 +- .../publish/validate_setdress_transforms.py | 8 +- .../publish/validate_shape_default_names.py | 10 +- .../publish/validate_shape_render_stats.py | 10 +- .../maya/publish/validate_single_assembly.py | 6 +- .../maya/publish/validate_step_size.py | 12 +- .../maya/publish/validate_transfers.py | 4 +- .../validate_transform_naming_suffix.py | 8 +- .../maya/publish/validate_transform_zero.py | 8 +- .../maya/publish/validate_vrayproxy.py | 2 +- .../validate_yeti_rig_input_in_instance.py | 8 +- .../publish/validate_yetirig_cache_state.py | 9 +- .../plugins/nuke/create/create_tiff_saver.py | 45 +++ .../nuke/inventory/select_containers.py | 25 ++ .../plugins/nuke/inventory/set_tool_color.py | 68 +++++ config/plugins/nuke/load/actions.py | 76 +++++ config/plugins/nuke/load/load_sequence.py | 259 ++++++++++++++++++ config/plugins/nuke/publish/collect_comp.py | 24 ++ .../nuke/publish/collect_fusion_version.py | 22 ++ .../plugins/nuke/publish/collect_instances.py | 96 +++++++ .../nuke/publish/collect_render_target.py | 44 +++ .../increment_current_file_deadline.py | 34 +++ .../nuke/publish/publish_image_sequences.py | 98 +++++++ config/plugins/nuke/publish/render_local.py | 42 +++ config/plugins/nuke/publish/save_scene.py | 21 ++ .../plugins/nuke/publish/submit_deadline.py | 149 ++++++++++ .../nuke/publish/validate_background_depth.py | 40 +++ .../nuke/publish/validate_comp_saved.py | 29 ++ .../publish/validate_create_folder_checked.py | 41 +++ .../validate_filename_has_extension.py | 36 +++ .../nuke/publish/validate_saver_has_input.py | 29 ++ .../publish/validate_saver_passthrough.py | 44 +++ .../nuke/publish/validate_unique_subsets.py | 29 ++ config/scripts/fusion_switch_shot.py | 10 +- config/setdress_api.py | 2 +- .../scripts/Comp/colorbleed/set_rendermode.py | 4 +- .../scripts/Comp/colorbleed/switch_ui.py | 2 +- 162 files changed, 1784 insertions(+), 407 deletions(-) create mode 100644 config/apps/nuke/__init__.py create mode 100644 config/apps/nuke/lib.py create mode 100644 config/plugins/nuke/create/create_tiff_saver.py create mode 100644 config/plugins/nuke/inventory/select_containers.py create mode 100644 config/plugins/nuke/inventory/set_tool_color.py create mode 100644 config/plugins/nuke/load/actions.py create mode 100644 config/plugins/nuke/load/load_sequence.py create mode 100644 config/plugins/nuke/publish/collect_comp.py create mode 100644 config/plugins/nuke/publish/collect_fusion_version.py create mode 100644 config/plugins/nuke/publish/collect_instances.py create mode 100644 config/plugins/nuke/publish/collect_render_target.py create mode 100644 config/plugins/nuke/publish/increment_current_file_deadline.py create mode 100644 config/plugins/nuke/publish/publish_image_sequences.py create mode 100644 config/plugins/nuke/publish/render_local.py create mode 100644 config/plugins/nuke/publish/save_scene.py create mode 100644 config/plugins/nuke/publish/submit_deadline.py create mode 100644 config/plugins/nuke/publish/validate_background_depth.py create mode 100644 config/plugins/nuke/publish/validate_comp_saved.py create mode 100644 config/plugins/nuke/publish/validate_create_folder_checked.py create mode 100644 config/plugins/nuke/publish/validate_filename_has_extension.py create mode 100644 config/plugins/nuke/publish/validate_saver_has_input.py create mode 100644 config/plugins/nuke/publish/validate_saver_passthrough.py create mode 100644 config/plugins/nuke/publish/validate_unique_subsets.py diff --git a/config/apps/fusion/__init__.py b/config/apps/fusion/__init__.py index 8ae042c934..b7b4b2d507 100644 --- a/config/apps/fusion/__init__.py +++ b/config/apps/fusion/__init__.py @@ -24,9 +24,9 @@ def install(): pyblish.register_callback("instanceToggled", on_pyblish_instance_toggled) # Disable all families except for the ones we explicitly want to see - family_states = ["colorbleed.imagesequence", - "colorbleed.camera", - "colorbleed.pointcache"] + family_states = ["studio.imagesequence", + "studio.camera", + "studio.pointcache"] avalon.data["familiesStateDefault"] = False avalon.data["familiesStateToggled"] = family_states diff --git a/config/apps/maya/__init__.py b/config/apps/maya/__init__.py index 6a5f541f4f..f4eec3cde1 100644 --- a/config/apps/maya/__init__.py +++ b/config/apps/maya/__init__.py @@ -43,7 +43,7 @@ def install(): override_event("taskChanged", on_task_changed) log.info("Setting default family states for loader..") - avalon.data["familiesStateToggled"] = ["colorbleed.imagesequence"] + avalon.data["familiesStateToggled"] = ["studio.imagesequence"] def uninstall(): diff --git a/config/apps/maya/lib.py b/config/apps/maya/lib.py index bb2690e3f8..0ae1852f4a 100644 --- a/config/apps/maya/lib.py +++ b/config/apps/maya/lib.py @@ -16,7 +16,7 @@ from avalon import api, maya, io, pipeline from avalon.vendor.six import string_types import avalon.maya.lib -from colorbleed import lib +from config import lib log = logging.getLogger(__name__) @@ -1012,11 +1012,11 @@ def assign_look(nodes, subset="lookDefault"): # Group all nodes per asset id grouped = defaultdict(list) for node in nodes: - colorbleed_id = get_id(node) - if not colorbleed_id: + studio_id = get_id(node) + if not studio_id: continue - parts = colorbleed_id.split(":", 1) + parts = studio_id.split(":", 1) grouped[parts[0]].append(node) for asset_id, asset_nodes in grouped.items(): @@ -1039,7 +1039,7 @@ def assign_look(nodes, subset="lookDefault"): version = io.find_one({"parent": subset_data['_id'], "type": "version", "data.families": - {"$in": ["colorbleed.look"]} + {"$in": ["studio.look"]} }, sort=[("name", -1)], projection={"_id": True, "name": True}) diff --git a/config/apps/maya/menu.py b/config/apps/maya/menu.py index 1e411e1c78..7c658d58c7 100644 --- a/config/apps/maya/menu.py +++ b/config/apps/maya/menu.py @@ -7,7 +7,7 @@ from avalon.vendor.Qt import QtWidgets, QtCore, QtGui import maya.cmds as cmds self = sys.modules[__name__] -self._menu = "colorbleed" +self._menu = "pype_setup" log = logging.getLogger(__name__) @@ -56,7 +56,7 @@ def uninstall(): def install(): if cmds.about(batch=True): - print("Skipping colorbleed.menu initialization in batch mode..") + print("Skipping studio.menu initialization in batch mode..") return uninstall() diff --git a/config/apps/nuke/__init__.py b/config/apps/nuke/__init__.py new file mode 100644 index 0000000000..b7b4b2d507 --- /dev/null +++ b/config/apps/nuke/__init__.py @@ -0,0 +1,67 @@ +import os + +from avalon import api as avalon +from pyblish import api as pyblish + + +PARENT_DIR = os.path.dirname(__file__) +PACKAGE_DIR = os.path.dirname(PARENT_DIR) +PLUGINS_DIR = os.path.join(PACKAGE_DIR, "plugins") + +PUBLISH_PATH = os.path.join(PLUGINS_DIR, "fusion", "publish") +LOAD_PATH = os.path.join(PLUGINS_DIR, "fusion", "load") +CREATE_PATH = os.path.join(PLUGINS_DIR, "fusion", "create") +INVENTORY_PATH = os.path.join(PLUGINS_DIR, "fusion", "inventory") + + +def install(): + print("Registering Fusion plug-ins..") + pyblish.register_plugin_path(PUBLISH_PATH) + avalon.register_plugin_path(avalon.Loader, LOAD_PATH) + avalon.register_plugin_path(avalon.Creator, CREATE_PATH) + avalon.register_plugin_path(avalon.InventoryAction, INVENTORY_PATH) + + pyblish.register_callback("instanceToggled", on_pyblish_instance_toggled) + + # Disable all families except for the ones we explicitly want to see + family_states = ["studio.imagesequence", + "studio.camera", + "studio.pointcache"] + + avalon.data["familiesStateDefault"] = False + avalon.data["familiesStateToggled"] = family_states + + +def uninstall(): + print("Deregistering Fusion plug-ins..") + pyblish.deregister_plugin_path(PUBLISH_PATH) + avalon.deregister_plugin_path(avalon.Loader, LOAD_PATH) + avalon.deregister_plugin_path(avalon.Creator, CREATE_PATH) + + pyblish.deregister_callback("instanceToggled", on_pyblish_instance_toggled) + + +def on_pyblish_instance_toggled(instance, new_value, old_value): + """Toggle saver tool passthrough states on instance toggles.""" + + from avalon.fusion import comp_lock_and_undo_chunk + + comp = instance.context.data.get("currentComp") + if not comp: + return + + savers = [tool for tool in instance if + getattr(tool, "ID", None) == "Saver"] + if not savers: + return + + # Whether instances should be passthrough based on new value + passthrough = not new_value + with comp_lock_and_undo_chunk(comp, + undo_queue_name="Change instance " + "active state"): + for tool in savers: + attrs = tool.GetAttrs() + current = attrs["TOOLB_PassThrough"] + if current != passthrough: + tool.SetAttrs({"TOOLB_PassThrough": passthrough}) diff --git a/config/apps/nuke/lib.py b/config/apps/nuke/lib.py new file mode 100644 index 0000000000..f2846c966a --- /dev/null +++ b/config/apps/nuke/lib.py @@ -0,0 +1,61 @@ +import sys + +from avalon.vendor.Qt import QtGui +import avalon.fusion + + +self = sys.modules[__name__] +self._project = None + + +def update_frame_range(start, end, comp=None, set_render_range=True): + """Set Fusion comp's start and end frame range + + Args: + start (float, int): start frame + end (float, int): end frame + comp (object, Optional): comp object from fusion + set_render_range (bool, Optional): When True this will also set the + composition's render start and end frame. + + Returns: + None + + """ + + if not comp: + comp = avalon.fusion.get_current_comp() + + attrs = { + "COMPN_GlobalStart": start, + "COMPN_GlobalEnd": end + } + + if set_render_range: + attrs.update({ + "COMPN_RenderStart": start, + "COMPN_RenderEnd": end + }) + + with avalon.fusion.comp_lock_and_undo_chunk(comp): + comp.SetAttrs(attrs) + + +def get_additional_data(container): + """Get Fusion related data for the container + + Args: + container(dict): the container found by the ls() function + + Returns: + dict + """ + + tool = container["_tool"] + tile_color = tool.TileColor + if tile_color is None: + return {} + + return {"color": QtGui.QColor.fromRgbF(tile_color["R"], + tile_color["G"], + tile_color["B"])} diff --git a/config/lib.py b/config/lib.py index 1297aba606..084251b1e7 100644 --- a/config/lib.py +++ b/config/lib.py @@ -243,7 +243,7 @@ def collect_container_metadata(container): """ # TODO: Improve method of getting the host lib module host_name = _get_host_name() - package_name = "colorbleed.{}.lib".format(host_name) + package_name = "studio.{}.lib".format(host_name) hostlib = importlib.import_module(package_name) if not hasattr(hostlib, "get_additional_data"): diff --git a/config/plugins/fusion/create/create_tiff_saver.py b/config/plugins/fusion/create/create_tiff_saver.py index b313ca994f..4baddfc36e 100644 --- a/config/plugins/fusion/create/create_tiff_saver.py +++ b/config/plugins/fusion/create/create_tiff_saver.py @@ -9,7 +9,7 @@ class CreateTiffSaver(avalon.api.Creator): name = "tiffDefault" label = "Create Tiff Saver" hosts = ["fusion"] - family = "colorbleed.saver" + family = "studio.saver" def process(self): diff --git a/config/plugins/fusion/load/actions.py b/config/plugins/fusion/load/actions.py index 19474076c2..fa0e506ee2 100644 --- a/config/plugins/fusion/load/actions.py +++ b/config/plugins/fusion/load/actions.py @@ -8,11 +8,11 @@ from avalon import api class FusionSetFrameRangeLoader(api.Loader): """Specific loader of Alembic for the avalon.animation family""" - families = ["colorbleed.animation", - "colorbleed.camera", - "colorbleed.imagesequence", - "colorbleed.yeticache", - "colorbleed.pointcache"] + families = ["studio.animation", + "studio.camera", + "studio.imagesequence", + "studio.yeticache", + "studio.pointcache"] representations = ["*"] label = "Set frame range" @@ -41,11 +41,11 @@ class FusionSetFrameRangeLoader(api.Loader): class FusionSetFrameRangeWithHandlesLoader(api.Loader): """Specific loader of Alembic for the avalon.animation family""" - families = ["colorbleed.animation", - "colorbleed.camera", - "colorbleed.imagesequence", - "colorbleed.yeticache", - "colorbleed.pointcache"] + families = ["studio.animation", + "studio.camera", + "studio.imagesequence", + "studio.yeticache", + "studio.pointcache"] representations = ["*"] label = "Set frame range (with handles)" diff --git a/config/plugins/fusion/load/load_sequence.py b/config/plugins/fusion/load/load_sequence.py index 81313992ed..2150bd1eb0 100644 --- a/config/plugins/fusion/load/load_sequence.py +++ b/config/plugins/fusion/load/load_sequence.py @@ -113,7 +113,7 @@ def loader_shift(loader, frame, relative=True): class FusionLoadSequence(api.Loader): """Load image sequence into Fusion""" - families = ["colorbleed.imagesequence"] + families = ["studio.imagesequence"] representations = ["*"] label = "Load sequence" diff --git a/config/plugins/fusion/publish/collect_instances.py b/config/plugins/fusion/publish/collect_instances.py index 322197fc87..9177f603c3 100644 --- a/config/plugins/fusion/publish/collect_instances.py +++ b/config/plugins/fusion/publish/collect_instances.py @@ -76,8 +76,8 @@ class CollectInstances(pyblish.api.ContextPlugin): "outputDir": os.path.dirname(path), "ext": ext, # todo: should be redundant "label": label, - "families": ["colorbleed.saver"], - "family": "colorbleed.saver", + "families": ["studio.saver"], + "family": "studio.saver", "active": active, "publish": active # backwards compatibility }) diff --git a/config/plugins/fusion/publish/collect_render_target.py b/config/plugins/fusion/publish/collect_render_target.py index a9193eaee5..0abdd7113f 100644 --- a/config/plugins/fusion/publish/collect_render_target.py +++ b/config/plugins/fusion/publish/collect_render_target.py @@ -13,7 +13,7 @@ class CollectFusionRenderMode(pyblish.api.InstancePlugin): available tool does not visualize which render mode is set for the current comp, please run the following line in the console (Py2) - comp.GetData("colorbleed.rendermode") + comp.GetData("studio.rendermode") This will return the name of the current render mode as seen above under Options. @@ -23,7 +23,7 @@ class CollectFusionRenderMode(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder + 0.4 label = "Collect Render Mode" hosts = ["fusion"] - families = ["colorbleed.saver"] + families = ["studio.saver"] def process(self, instance): """Collect all image sequence tools""" @@ -34,11 +34,11 @@ class CollectFusionRenderMode(pyblish.api.InstancePlugin): raise RuntimeError("No comp previously collected, unable to " "retrieve Fusion version.") - rendermode = comp.GetData("colorbleed.rendermode") or "renderlocal" + rendermode = comp.GetData("studio.rendermode") or "renderlocal" assert rendermode in options, "Must be supported render mode" self.log.info("Render mode: {0}".format(rendermode)) # Append family - family = "colorbleed.saver.{0}".format(rendermode) + family = "studio.saver.{0}".format(rendermode) instance.data["families"].append(family) diff --git a/config/plugins/fusion/publish/increment_current_file_deadline.py b/config/plugins/fusion/publish/increment_current_file_deadline.py index 9d766c426c..5a723a320b 100644 --- a/config/plugins/fusion/publish/increment_current_file_deadline.py +++ b/config/plugins/fusion/publish/increment_current_file_deadline.py @@ -11,13 +11,13 @@ class FusionIncrementCurrentFile(pyblish.api.ContextPlugin): label = "Increment current file" order = pyblish.api.IntegratorOrder + 9.0 hosts = ["fusion"] - families = ["colorbleed.saver.deadline"] + families = ["studio.saver.deadline"] optional = True def process(self, context): - from colorbleed.lib import version_up - from colorbleed.action import get_errored_plugins_from_data + from config.lib import version_up + from config.action import get_errored_plugins_from_data errored_plugins = get_errored_plugins_from_data(context) if any(plugin.__name__ == "FusionSubmitDeadline" diff --git a/config/plugins/fusion/publish/publish_image_sequences.py b/config/plugins/fusion/publish/publish_image_sequences.py index 33d6d2773d..bdb77be458 100644 --- a/config/plugins/fusion/publish/publish_image_sequences.py +++ b/config/plugins/fusion/publish/publish_image_sequences.py @@ -5,7 +5,7 @@ import subprocess import pyblish.api -from colorbleed.action import get_errored_plugins_from_data +from config.action import get_errored_plugins_from_data def _get_script(): @@ -14,7 +14,7 @@ def _get_script(): # todo: use a more elegant way to get the python script try: - from colorbleed.scripts import publish_filesequence + from config.scripts import publish_filesequence except Exception: raise RuntimeError("Expected module 'publish_imagesequence'" "to be available") @@ -32,7 +32,7 @@ class PublishImageSequence(pyblish.api.InstancePlugin): order = pyblish.api.IntegratorOrder label = "Publish Rendered Image Sequence(s)" hosts = ["fusion"] - families = ["colorbleed.saver.renderlocal"] + families = ["studio.saver.renderlocal"] def process(self, instance): @@ -55,7 +55,7 @@ class PublishImageSequence(pyblish.api.InstancePlugin): "regex": regex, "startFrame": instance.context.data["startFrame"], "endFrame": instance.context.data["endFrame"], - "families": ["colorbleed.imagesequence"], + "families": ["studio.imagesequence"], } # Write metadata and store the path in the instance diff --git a/config/plugins/fusion/publish/render_local.py b/config/plugins/fusion/publish/render_local.py index 39ce0d45dc..d34f7d56ee 100644 --- a/config/plugins/fusion/publish/render_local.py +++ b/config/plugins/fusion/publish/render_local.py @@ -14,7 +14,7 @@ class FusionRenderLocal(pyblish.api.InstancePlugin): order = pyblish.api.ExtractorOrder label = "Render Local" hosts = ["fusion"] - families = ["colorbleed.saver.renderlocal"] + families = ["studio.saver.renderlocal"] def process(self, instance): diff --git a/config/plugins/fusion/publish/save_scene.py b/config/plugins/fusion/publish/save_scene.py index e88b8ba769..ffc44b98d5 100644 --- a/config/plugins/fusion/publish/save_scene.py +++ b/config/plugins/fusion/publish/save_scene.py @@ -7,7 +7,7 @@ class FusionSaveComp(pyblish.api.ContextPlugin): label = "Save current file" order = pyblish.api.ExtractorOrder - 0.49 hosts = ["fusion"] - families = ["colorbleed.saver"] + families = ["studio.saver"] def process(self, context): diff --git a/config/plugins/fusion/publish/submit_deadline.py b/config/plugins/fusion/publish/submit_deadline.py index 9fbf9b4003..cce9b1292c 100644 --- a/config/plugins/fusion/publish/submit_deadline.py +++ b/config/plugins/fusion/publish/submit_deadline.py @@ -19,7 +19,7 @@ class FusionSubmitDeadline(pyblish.api.InstancePlugin): label = "Submit to Deadline" order = pyblish.api.IntegratorOrder hosts = ["fusion"] - families = ["colorbleed.saver.deadline"] + families = ["studio.saver.deadline"] def process(self, instance): diff --git a/config/plugins/fusion/publish/validate_background_depth.py b/config/plugins/fusion/publish/validate_background_depth.py index abf5dd248e..cdb5305c6c 100644 --- a/config/plugins/fusion/publish/validate_background_depth.py +++ b/config/plugins/fusion/publish/validate_background_depth.py @@ -1,6 +1,6 @@ import pyblish.api -from colorbleed import action +from config import action class ValidateBackgroundDepth(pyblish.api.InstancePlugin): @@ -10,7 +10,7 @@ class ValidateBackgroundDepth(pyblish.api.InstancePlugin): label = "Validate Background Depth 32 bit" actions = [action.RepairAction] hosts = ["fusion"] - families = ["colorbleed.saver"] + families = ["studio.saver"] optional = True @classmethod diff --git a/config/plugins/fusion/publish/validate_comp_saved.py b/config/plugins/fusion/publish/validate_comp_saved.py index 18621ceb4f..6c94d730ce 100644 --- a/config/plugins/fusion/publish/validate_comp_saved.py +++ b/config/plugins/fusion/publish/validate_comp_saved.py @@ -8,7 +8,7 @@ class ValidateFusionCompSaved(pyblish.api.ContextPlugin): order = pyblish.api.ValidatorOrder label = "Validate Comp Saved" - families = ["colorbleed.saver"] + families = ["studio.saver"] hosts = ["fusion"] def process(self, context): diff --git a/config/plugins/fusion/publish/validate_create_folder_checked.py b/config/plugins/fusion/publish/validate_create_folder_checked.py index 7a10b1e538..78ce441745 100644 --- a/config/plugins/fusion/publish/validate_create_folder_checked.py +++ b/config/plugins/fusion/publish/validate_create_folder_checked.py @@ -1,6 +1,6 @@ import pyblish.api -from colorbleed import action +from config import action class ValidateCreateFolderChecked(pyblish.api.InstancePlugin): @@ -13,7 +13,7 @@ class ValidateCreateFolderChecked(pyblish.api.InstancePlugin): order = pyblish.api.ValidatorOrder actions = [action.RepairAction] label = "Validate Create Folder Checked" - families = ["colorbleed.saver"] + families = ["studio.saver"] hosts = ["fusion"] @classmethod diff --git a/config/plugins/fusion/publish/validate_filename_has_extension.py b/config/plugins/fusion/publish/validate_filename_has_extension.py index b7fe1f4c31..40f167765d 100644 --- a/config/plugins/fusion/publish/validate_filename_has_extension.py +++ b/config/plugins/fusion/publish/validate_filename_has_extension.py @@ -14,7 +14,7 @@ class ValidateFilenameHasExtension(pyblish.api.InstancePlugin): order = pyblish.api.ValidatorOrder label = "Validate Filename Has Extension" - families = ["colorbleed.saver"] + families = ["studio.saver"] hosts = ["fusion"] def process(self, instance): diff --git a/config/plugins/fusion/publish/validate_saver_has_input.py b/config/plugins/fusion/publish/validate_saver_has_input.py index 27ed77d9d9..9e94f101a0 100644 --- a/config/plugins/fusion/publish/validate_saver_has_input.py +++ b/config/plugins/fusion/publish/validate_saver_has_input.py @@ -10,7 +10,7 @@ class ValidateSaverHasInput(pyblish.api.InstancePlugin): order = pyblish.api.ValidatorOrder label = "Validate Saver Has Input" - families = ["colorbleed.saver"] + families = ["studio.saver"] hosts = ["fusion"] @classmethod diff --git a/config/plugins/fusion/publish/validate_saver_passthrough.py b/config/plugins/fusion/publish/validate_saver_passthrough.py index ca58eba5bd..c69873c04d 100644 --- a/config/plugins/fusion/publish/validate_saver_passthrough.py +++ b/config/plugins/fusion/publish/validate_saver_passthrough.py @@ -6,7 +6,7 @@ class ValidateSaverPassthrough(pyblish.api.ContextPlugin): order = pyblish.api.ValidatorOrder label = "Validate Saver Passthrough" - families = ["colorbleed.saver"] + families = ["studio.saver"] hosts = ["fusion"] def process(self, context): diff --git a/config/plugins/fusion/publish/validate_unique_subsets.py b/config/plugins/fusion/publish/validate_unique_subsets.py index 527b4acc69..4fef26c9e9 100644 --- a/config/plugins/fusion/publish/validate_unique_subsets.py +++ b/config/plugins/fusion/publish/validate_unique_subsets.py @@ -6,7 +6,7 @@ class ValidateUniqueSubsets(pyblish.api.InstancePlugin): order = pyblish.api.ValidatorOrder label = "Validate Unique Subsets" - families = ["colorbleed.saver"] + families = ["studio.saver"] hosts = ["fusion"] @classmethod diff --git a/config/plugins/global/load/open_imagesequence.py b/config/plugins/global/load/open_imagesequence.py index 12fb9a0226..350ae2a6b1 100644 --- a/config/plugins/global/load/open_imagesequence.py +++ b/config/plugins/global/load/open_imagesequence.py @@ -18,7 +18,7 @@ def open(filepath): class PlayImageSequence(api.Loader): """Open Image Sequence with system default""" - families = ["colorbleed.imagesequence"] + families = ["studio.imagesequence"] representations = ["*"] label = "Play sequence" diff --git a/config/plugins/global/publish/collect_deadline_user.py b/config/plugins/global/publish/collect_deadline_user.py index 4f7af94419..f90487e6e9 100644 --- a/config/plugins/global/publish/collect_deadline_user.py +++ b/config/plugins/global/publish/collect_deadline_user.py @@ -35,7 +35,7 @@ class CollectDeadlineUser(pyblish.api.ContextPlugin): order = pyblish.api.CollectorOrder + 0.499 label = "Deadline User" hosts = ['maya', 'fusion'] - families = ["colorbleed.renderlayer", "colorbleed.saver.deadline"] + families = ["studio.renderlayer", "studio.saver.deadline"] def process(self, context): """Inject the current working file""" diff --git a/config/plugins/global/publish/collect_filesequences.py b/config/plugins/global/publish/collect_filesequences.py index 9c2390d3dc..e2564a9918 100644 --- a/config/plugins/global/publish/collect_filesequences.py +++ b/config/plugins/global/publish/collect_filesequences.py @@ -148,7 +148,7 @@ class CollectFileSequences(pyblish.api.ContextPlugin): raise RuntimeError("Invalid sequence") # Get family from the data - families = data.get("families", ["colorbleed.imagesequence"]) + families = data.get("families", ["studio.imagesequence"]) assert isinstance(families, (list, tuple)), "Must be iterable" assert families, "Must have at least a single family" diff --git a/config/plugins/global/publish/integrate.py b/config/plugins/global/publish/integrate.py index be9c46fbfe..dbabc73fa4 100644 --- a/config/plugins/global/publish/integrate.py +++ b/config/plugins/global/publish/integrate.py @@ -23,18 +23,18 @@ class IntegrateAsset(pyblish.api.InstancePlugin): label = "Integrate Asset" order = pyblish.api.IntegratorOrder - families = ["colorbleed.animation", - "colorbleed.camera", - "colorbleed.imagesequence", - "colorbleed.look", + families = ["studio.animation", + "studio.camera", + "studio.imagesequence", + "studio.look", "config.apps.mayaAscii", - "colorbleed.model", - "colorbleed.pointcache", - "colorbleed.setdress", - "colorbleed.rig", - "colorbleed.vrayproxy", - "colorbleed.yetiRig", - "colorbleed.yeticache"] + "studio.model", + "studio.pointcache", + "studio.setdress", + "studio.rig", + "studio.vrayproxy", + "studio.yetiRig", + "studio.yeticache"] def process(self, instance): diff --git a/config/plugins/global/publish/submit_publish_job.py b/config/plugins/global/publish/submit_publish_job.py index 34a09c9b81..694e72abc7 100644 --- a/config/plugins/global/publish/submit_publish_job.py +++ b/config/plugins/global/publish/submit_publish_job.py @@ -12,7 +12,7 @@ import pyblish.api def _get_script(): """Get path to the image sequence script""" try: - from colorbleed.scripts import publish_filesequence + from config.scripts import publish_filesequence except Exception as e: raise RuntimeError("Expected module 'publish_imagesequence'" "to be available") @@ -123,7 +123,7 @@ class SubmitDependentImageSequenceJobDeadline(pyblish.api.InstancePlugin): label = "Submit image sequence jobs to Deadline" order = pyblish.api.IntegratorOrder + 0.1 hosts = ["fusion", "maya"] - families = ["colorbleed.saver.deadline", "colorbleed.renderlayer"] + families = ["studio.saver.deadline", "studio.renderlayer"] def process(self, instance): @@ -168,7 +168,7 @@ class SubmitDependentImageSequenceJobDeadline(pyblish.api.InstancePlugin): "regex": regex, "startFrame": start, "endFrame": end, - "families": ["colorbleed.imagesequence"], + "families": ["studio.imagesequence"], # Optional metadata (for debugging) "metadata": { @@ -185,7 +185,7 @@ class SubmitDependentImageSequenceJobDeadline(pyblish.api.InstancePlugin): if data.get("extendFrames", False): - family = "colorbleed.imagesequence" + family = "studio.imagesequence" override = data["overrideExistingFrame"] # override = data.get("overrideExistingFrame", False) diff --git a/config/plugins/global/publish/validate_sequence_frames.py b/config/plugins/global/publish/validate_sequence_frames.py index bd14b4c0c3..1258050394 100644 --- a/config/plugins/global/publish/validate_sequence_frames.py +++ b/config/plugins/global/publish/validate_sequence_frames.py @@ -11,7 +11,7 @@ class ValidateSequenceFrames(pyblish.api.InstancePlugin): order = pyblish.api.ValidatorOrder label = "Validate Sequence Frames" - families = ["colorbleed.imagesequence"] + families = ["studio.imagesequence"] hosts = ["shell"] def process(self, instance): diff --git a/config/plugins/maya/create/colorbleed_animation.py b/config/plugins/maya/create/colorbleed_animation.py index 1759343858..67d8583056 100644 --- a/config/plugins/maya/create/colorbleed_animation.py +++ b/config/plugins/maya/create/colorbleed_animation.py @@ -9,7 +9,7 @@ class CreateAnimation(avalon.maya.Creator): name = "animationDefault" label = "Animation" - family = "colorbleed.animation" + family = "studio.animation" icon = "male" def __init__(self, *args, **kwargs): diff --git a/config/plugins/maya/create/colorbleed_camera.py b/config/plugins/maya/create/colorbleed_camera.py index 31f14cf272..d4c9c4c795 100644 --- a/config/plugins/maya/create/colorbleed_camera.py +++ b/config/plugins/maya/create/colorbleed_camera.py @@ -8,7 +8,7 @@ class CreateCamera(avalon.maya.Creator): name = "cameraDefault" label = "Camera" - family = "colorbleed.camera" + family = "studio.camera" icon = "video-camera" def __init__(self, *args, **kwargs): diff --git a/config/plugins/maya/create/colorbleed_look.py b/config/plugins/maya/create/colorbleed_look.py index 7a14694fc5..34c71d40d9 100644 --- a/config/plugins/maya/create/colorbleed_look.py +++ b/config/plugins/maya/create/colorbleed_look.py @@ -8,7 +8,7 @@ class CreateLook(avalon.maya.Creator): name = "look" label = "Look" - family = "colorbleed.look" + family = "studio.look" icon = "paint-brush" def __init__(self, *args, **kwargs): diff --git a/config/plugins/maya/create/colorbleed_model.py b/config/plugins/maya/create/colorbleed_model.py index b55b3dc3dd..4d321a444e 100644 --- a/config/plugins/maya/create/colorbleed_model.py +++ b/config/plugins/maya/create/colorbleed_model.py @@ -6,5 +6,5 @@ class CreateModel(avalon.maya.Creator): name = "modelDefault" label = "Model" - family = "colorbleed.model" + family = "studio.model" icon = "cube" diff --git a/config/plugins/maya/create/colorbleed_pointcache.py b/config/plugins/maya/create/colorbleed_pointcache.py index 87e5abb214..590e97cbe7 100644 --- a/config/plugins/maya/create/colorbleed_pointcache.py +++ b/config/plugins/maya/create/colorbleed_pointcache.py @@ -9,7 +9,7 @@ class CreatePointCache(avalon.maya.Creator): name = "pointcache" label = "Point Cache" - family = "colorbleed.pointcache" + family = "studio.pointcache" icon = "gears" def __init__(self, *args, **kwargs): diff --git a/config/plugins/maya/create/colorbleed_renderglobals.py b/config/plugins/maya/create/colorbleed_renderglobals.py index 1d12d9fe9d..938ec9edea 100644 --- a/config/plugins/maya/create/colorbleed_renderglobals.py +++ b/config/plugins/maya/create/colorbleed_renderglobals.py @@ -10,7 +10,7 @@ from avalon import api class CreateRenderGlobals(avalon.maya.Creator): label = "Render Globals" - family = "colorbleed.renderglobals" + family = "studio.renderglobals" icon = "gears" def __init__(self, *args, **kwargs): diff --git a/config/plugins/maya/create/colorbleed_rig.py b/config/plugins/maya/create/colorbleed_rig.py index 6947aaac31..471219c6ef 100644 --- a/config/plugins/maya/create/colorbleed_rig.py +++ b/config/plugins/maya/create/colorbleed_rig.py @@ -8,7 +8,7 @@ class CreateRig(avalon.maya.Creator): name = "rigDefault" label = "Rig" - family = "colorbleed.rig" + family = "studio.rig" icon = "wheelchair" def process(self): diff --git a/config/plugins/maya/create/colorbleed_setdress.py b/config/plugins/maya/create/colorbleed_setdress.py index 47089bea21..56c1129a82 100644 --- a/config/plugins/maya/create/colorbleed_setdress.py +++ b/config/plugins/maya/create/colorbleed_setdress.py @@ -6,5 +6,5 @@ class CreateSetDress(avalon.maya.Creator): name = "setdress" label = "Set Dress" - family = "colorbleed.setdress" + family = "studio.setdress" icon = "cubes" \ No newline at end of file diff --git a/config/plugins/maya/create/colorbleed_vrayproxy.py b/config/plugins/maya/create/colorbleed_vrayproxy.py index e100c31bd0..8153a29c0c 100644 --- a/config/plugins/maya/create/colorbleed_vrayproxy.py +++ b/config/plugins/maya/create/colorbleed_vrayproxy.py @@ -8,7 +8,7 @@ class CreateVrayProxy(avalon.maya.Creator): name = "vrayproxy" label = "VRay Proxy" - family = "colorbleed.vrayproxy" + family = "studio.vrayproxy" icon = "gears" def __init__(self, *args, **kwargs): diff --git a/config/plugins/maya/create/colorbleed_yeti_cache.py b/config/plugins/maya/create/colorbleed_yeti_cache.py index 3bafb7a5c7..c73895605b 100644 --- a/config/plugins/maya/create/colorbleed_yeti_cache.py +++ b/config/plugins/maya/create/colorbleed_yeti_cache.py @@ -9,7 +9,7 @@ class CreateYetiCache(avalon.maya.Creator): name = "yetiDefault" label = "Yeti Cache" - family = "colorbleed.yeticache" + family = "studio.yeticache" icon = "pagelines" def __init__(self, *args, **kwargs): diff --git a/config/plugins/maya/create/colorbleed_yeti_rig.py b/config/plugins/maya/create/colorbleed_yeti_rig.py index 3b21c586a7..b0c9e1cece 100644 --- a/config/plugins/maya/create/colorbleed_yeti_rig.py +++ b/config/plugins/maya/create/colorbleed_yeti_rig.py @@ -7,7 +7,7 @@ class CreateYetiRig(avalon.maya.Creator): """Output for procedural plugin nodes ( Yeti / XGen / etc)""" label = "Yeti Rig" - family = "colorbleed.yetiRig" + family = "studio.yetiRig" icon = "usb" def process(self): diff --git a/config/plugins/maya/load/_load_animation.py b/config/plugins/maya/load/_load_animation.py index 35fd2e647a..dfd1a5335c 100644 --- a/config/plugins/maya/load/_load_animation.py +++ b/config/plugins/maya/load/_load_animation.py @@ -4,9 +4,9 @@ import config.apps.maya.plugin class AbcLoader(config.apps.maya.plugin.ReferenceLoader): """Specific loader of Alembic for the avalon.animation family""" - families = ["colorbleed.animation", - "colorbleed.camera", - "colorbleed.pointcache"] + families = ["studio.animation", + "studio.camera", + "studio.pointcache"] representations = ["abc"] label = "Reference animation" @@ -42,7 +42,7 @@ class AbcLoader(config.apps.maya.plugin.ReferenceLoader): reference=True, returnNewNodes=True) - # load colorbleed ID attribute + # load studio ID attribute self[:] = nodes return nodes diff --git a/config/plugins/maya/load/actions.py b/config/plugins/maya/load/actions.py index 440fabf124..2bdca8506a 100644 --- a/config/plugins/maya/load/actions.py +++ b/config/plugins/maya/load/actions.py @@ -8,9 +8,9 @@ from avalon import api class SetFrameRangeLoader(api.Loader): """Specific loader of Alembic for the avalon.animation family""" - families = ["colorbleed.animation", - "colorbleed.camera", - "colorbleed.pointcache"] + families = ["studio.animation", + "studio.camera", + "studio.pointcache"] representations = ["abc"] label = "Set frame range" @@ -42,9 +42,9 @@ class SetFrameRangeLoader(api.Loader): class SetFrameRangeWithHandlesLoader(api.Loader): """Specific loader of Alembic for the avalon.animation family""" - families = ["colorbleed.animation", - "colorbleed.camera", - "colorbleed.pointcache"] + families = ["studio.animation", + "studio.camera", + "studio.pointcache"] representations = ["abc"] label = "Set frame range (with handles)" diff --git a/config/plugins/maya/load/load_alembic.py b/config/plugins/maya/load/load_alembic.py index 4daa1fada6..f9d75225a7 100644 --- a/config/plugins/maya/load/load_alembic.py +++ b/config/plugins/maya/load/load_alembic.py @@ -4,8 +4,8 @@ import config.apps.maya.plugin class AbcLoader(config.apps.maya.plugin.ReferenceLoader): """Specific loader of Alembic for the avalon.animation family""" - families = ["colorbleed.animation", - "colorbleed.pointcache"] + families = ["studio.animation", + "studio.pointcache"] label = "Reference animation" representations = ["abc"] order = -10 diff --git a/config/plugins/maya/load/load_camera.py b/config/plugins/maya/load/load_camera.py index 5aca36a934..9871a1b676 100644 --- a/config/plugins/maya/load/load_camera.py +++ b/config/plugins/maya/load/load_camera.py @@ -4,7 +4,7 @@ import config.apps.maya.plugin class CameraLoader(config.apps.maya.plugin.ReferenceLoader): """Specific loader of Alembic for the avalon.animation family""" - families = ["colorbleed.camera"] + families = ["studio.camera"] label = "Reference camera" representations = ["abc", "ma"] order = -10 diff --git a/config/plugins/maya/load/load_look.py b/config/plugins/maya/load/load_look.py index bcac5a7499..721d7cf5f6 100644 --- a/config/plugins/maya/load/load_look.py +++ b/config/plugins/maya/load/load_look.py @@ -4,7 +4,7 @@ import config.apps.maya.plugin class LookLoader(config.apps.maya.plugin.ReferenceLoader): """Specific loader for lookdev""" - families = ["colorbleed.look"] + families = ["studio.look"] representations = ["ma"] label = "Reference look" diff --git a/config/plugins/maya/load/load_model.py b/config/plugins/maya/load/load_model.py index 3eb2e53d33..bf2d57641f 100644 --- a/config/plugins/maya/load/load_model.py +++ b/config/plugins/maya/load/load_model.py @@ -5,7 +5,7 @@ import config.apps.maya.plugin class ModelLoader(config.apps.maya.plugin.ReferenceLoader): """Load the model""" - families = ["colorbleed.model"] + families = ["studio.model"] representations = ["ma"] label = "Reference Model" @@ -37,7 +37,7 @@ class ModelLoader(config.apps.maya.plugin.ReferenceLoader): class GpuCacheLoader(api.Loader): """Load model Alembic as gpuCache""" - families = ["colorbleed.model"] + families = ["studio.model"] representations = ["abc"] label = "Import Gpu Cache" diff --git a/config/plugins/maya/load/load_rig.py b/config/plugins/maya/load/load_rig.py index 8b7dbe1532..e4333362fd 100644 --- a/config/plugins/maya/load/load_rig.py +++ b/config/plugins/maya/load/load_rig.py @@ -11,7 +11,7 @@ class RigLoader(config.apps.maya.plugin.ReferenceLoader): """ - families = ["colorbleed.rig"] + families = ["studio.rig"] representations = ["ma"] label = "Reference rig" @@ -62,7 +62,7 @@ class RigLoader(config.apps.maya.plugin.ReferenceLoader): cmds.select([output, controls] + roots, noExpand=True) api.create(name=namespace, asset=asset, - family="colorbleed.animation", + family="studio.animation", options={"useSelection": True}, data={"dependencies": dependency}) diff --git a/config/plugins/maya/load/load_setdress.py b/config/plugins/maya/load/load_setdress.py index 8cc857fc3f..3820345ad0 100644 --- a/config/plugins/maya/load/load_setdress.py +++ b/config/plugins/maya/load/load_setdress.py @@ -3,7 +3,7 @@ from avalon import api class SetDressLoader(api.Loader): - families = ["colorbleed.setdress"] + families = ["studio.setdress"] representations = ["json"] label = "Load Set Dress" @@ -23,7 +23,7 @@ class SetDressLoader(api.Loader): suffix="_", ) - from colorbleed import setdress_api + from config import setdress_api containers = setdress_api.load_package(filepath=self.fname, name=name, @@ -45,7 +45,7 @@ class SetDressLoader(api.Loader): def update(self, container, representation): - from colorbleed import setdress_api + from config import setdress_api return setdress_api.update_package(container, representation) @@ -53,7 +53,7 @@ class SetDressLoader(api.Loader): """Remove all sub containers""" from avalon import api - from colorbleed import setdress_api + from config import setdress_api import maya.cmds as cmds # Remove all members diff --git a/config/plugins/maya/load/load_vrayproxy.py b/config/plugins/maya/load/load_vrayproxy.py index cbfe45cb46..d2dafdc538 100644 --- a/config/plugins/maya/load/load_vrayproxy.py +++ b/config/plugins/maya/load/load_vrayproxy.py @@ -7,7 +7,7 @@ import maya.cmds as cmds class VRayProxyLoader(api.Loader): """Load VRayMesh proxy""" - families = ["colorbleed.vrayproxy"] + families = ["studio.vrayproxy"] representations = ["vrmesh"] label = "Import VRay Proxy" diff --git a/config/plugins/maya/load/load_yeti_cache.py b/config/plugins/maya/load/load_yeti_cache.py index e3c4a149d0..1ff2db4228 100644 --- a/config/plugins/maya/load/load_yeti_cache.py +++ b/config/plugins/maya/load/load_yeti_cache.py @@ -13,7 +13,7 @@ from config.apps.maya import lib class YetiCacheLoader(api.Loader): - families = ["colorbleed.yeticache", "colorbleed.yetiRig"] + families = ["studio.yeticache", "studio.yetiRig"] representations = ["fur"] label = "Load Yeti Cache" diff --git a/config/plugins/maya/load/load_yeti_rig.py b/config/plugins/maya/load/load_yeti_rig.py index 6e5c1d0014..139dbdb26b 100644 --- a/config/plugins/maya/load/load_yeti_rig.py +++ b/config/plugins/maya/load/load_yeti_rig.py @@ -3,7 +3,7 @@ import config.apps.maya.plugin class YetiRigLoader(config.apps.maya.plugin.ReferenceLoader): - families = ["colorbleed.yetiRig"] + families = ["studio.yetiRig"] representations = ["ma"] label = "Load Yeti Rig" diff --git a/config/plugins/maya/publish/collect_animation.py b/config/plugins/maya/publish/collect_animation.py index 53251cadc3..4974175b13 100644 --- a/config/plugins/maya/publish/collect_animation.py +++ b/config/plugins/maya/publish/collect_animation.py @@ -16,7 +16,7 @@ class CollectAnimationOutputGeometry(pyblish.api.InstancePlugin): """ order = pyblish.api.CollectorOrder + 0.4 - families = ["colorbleed.animation"] + families = ["studio.animation"] label = "Collect Animation Output Geometry" hosts = ["maya"] diff --git a/config/plugins/maya/publish/collect_history.py b/config/plugins/maya/publish/collect_history.py index 840e916133..57af4eaf80 100644 --- a/config/plugins/maya/publish/collect_history.py +++ b/config/plugins/maya/publish/collect_history.py @@ -17,7 +17,7 @@ class CollectMayaHistory(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder + 0.1 hosts = ["maya"] label = "Maya History" - families = ["colorbleed.rig"] + families = ["studio.rig"] verbose = False def process(self, instance): diff --git a/config/plugins/maya/publish/collect_look.py b/config/plugins/maya/publish/collect_look.py index 5241040e95..d8bb9f6e87 100644 --- a/config/plugins/maya/publish/collect_look.py +++ b/config/plugins/maya/publish/collect_look.py @@ -67,7 +67,7 @@ class CollectLook(pyblish.api.InstancePlugin): """ order = pyblish.api.CollectorOrder + 0.4 - families = ["colorbleed.look"] + families = ["studio.look"] label = "Collect Look" hosts = ["maya"] diff --git a/config/plugins/maya/publish/collect_model.py b/config/plugins/maya/publish/collect_model.py index cd780acc7f..c43595b97c 100644 --- a/config/plugins/maya/publish/collect_model.py +++ b/config/plugins/maya/publish/collect_model.py @@ -9,7 +9,7 @@ class CollectModelData(pyblish.api.InstancePlugin): Ensures always only a single frame is extracted (current frame). Note: - This is a workaround so that the `colorbleed.model` family can use the + This is a workaround so that the `studio.model` family can use the same pointcache extractor implementation as animation and pointcaches. This always enforces the "current" frame to be published. @@ -17,7 +17,7 @@ class CollectModelData(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder + 0.499 label = 'Collect Model Data' - families = ["colorbleed.model"] + families = ["studio.model"] def process(self, instance): # Extract only current frame (override) diff --git a/config/plugins/maya/publish/collect_render_layer_aovs.py b/config/plugins/maya/publish/collect_render_layer_aovs.py index 51e9adbd57..64ec8e9812 100644 --- a/config/plugins/maya/publish/collect_render_layer_aovs.py +++ b/config/plugins/maya/publish/collect_render_layer_aovs.py @@ -28,7 +28,7 @@ class CollectRenderLayerAOVS(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder + 0.01 label = "Render Elements / AOVs" hosts = ["maya"] - families = ["colorbleed.renderlayer"] + families = ["studio.renderlayer"] def process(self, instance): diff --git a/config/plugins/maya/publish/collect_renderlayers.py b/config/plugins/maya/publish/collect_renderlayers.py index fa4ae51593..f0ea0204db 100644 --- a/config/plugins/maya/publish/collect_renderlayers.py +++ b/config/plugins/maya/publish/collect_renderlayers.py @@ -74,7 +74,7 @@ class CollectMayaRenderlayers(pyblish.api.ContextPlugin): # instance subset "family": "Render Layers", - "families": ["colorbleed.renderlayer"], + "families": ["studio.renderlayer"], "asset": asset, "time": api.time(), "author": context.data["user"], diff --git a/config/plugins/maya/publish/collect_setdress.py b/config/plugins/maya/publish/collect_setdress.py index 0d17f70020..86e3bd570c 100644 --- a/config/plugins/maya/publish/collect_setdress.py +++ b/config/plugins/maya/publish/collect_setdress.py @@ -25,7 +25,7 @@ class CollectSetDress(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder + 0.49 label = "Set Dress" - families = ["colorbleed.setdress"] + families = ["studio.setdress"] def process(self, instance): diff --git a/config/plugins/maya/publish/collect_yeti_cache.py b/config/plugins/maya/publish/collect_yeti_cache.py index 266c2c48da..2212fa594f 100644 --- a/config/plugins/maya/publish/collect_yeti_cache.py +++ b/config/plugins/maya/publish/collect_yeti_cache.py @@ -28,7 +28,7 @@ class CollectYetiCache(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder + 0.45 label = "Collect Yeti Cache" - families = ["colorbleed.yetiRig", "colorbleed.yeticache"] + families = ["studio.yetiRig", "studio.yeticache"] hosts = ["maya"] tasks = ["animation", "fx"] diff --git a/config/plugins/maya/publish/collect_yeti_rig.py b/config/plugins/maya/publish/collect_yeti_rig.py index ec9fffe693..cf1a0182ef 100644 --- a/config/plugins/maya/publish/collect_yeti_rig.py +++ b/config/plugins/maya/publish/collect_yeti_rig.py @@ -21,7 +21,7 @@ class CollectYetiRig(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder + 0.4 label = "Collect Yeti Rig" - families = ["colorbleed.yetiRig"] + families = ["studio.yetiRig"] hosts = ["maya"] def process(self, instance): diff --git a/config/plugins/maya/publish/extract_animation.py b/config/plugins/maya/publish/extract_animation.py index df1e2bbf97..127ec3654b 100644 --- a/config/plugins/maya/publish/extract_animation.py +++ b/config/plugins/maya/publish/extract_animation.py @@ -3,11 +3,11 @@ import os from maya import cmds import avalon.maya -import colorbleed.api +import config.api from config.apps.maya.lib import extract_alembic -class ExtractColorbleedAnimation(colorbleed.api.Extractor): +class ExtractColorbleedAnimation(config.api.Extractor): """Produce an alembic of just point positions and normals. Positions and normals, uvs, creases are preserved, but nothing more, @@ -17,7 +17,7 @@ class ExtractColorbleedAnimation(colorbleed.api.Extractor): label = "Extract Animation" hosts = ["maya"] - families = ["colorbleed.animation"] + families = ["studio.animation"] def process(self, instance): diff --git a/config/plugins/maya/publish/extract_camera_alembic.py b/config/plugins/maya/publish/extract_camera_alembic.py index 2b18ced96f..26bcc48a9b 100644 --- a/config/plugins/maya/publish/extract_camera_alembic.py +++ b/config/plugins/maya/publish/extract_camera_alembic.py @@ -3,12 +3,12 @@ import os from maya import cmds import avalon.maya -import colorbleed.api +import config.api import cb.utils.maya.context as context -class ExtractCameraAlembic(colorbleed.api.Extractor): +class ExtractCameraAlembic(config.api.Extractor): """Extract a Camera as Alembic. The cameras gets baked to world space by default. Only when the instance's @@ -18,7 +18,7 @@ class ExtractCameraAlembic(colorbleed.api.Extractor): label = "Camera (Alembic)" hosts = ["maya"] - families = ["colorbleed.camera"] + families = ["studio.camera"] def process(self, instance): diff --git a/config/plugins/maya/publish/extract_camera_mayaAscii.py b/config/plugins/maya/publish/extract_camera_mayaAscii.py index c2c1f32b01..ad428bd88e 100644 --- a/config/plugins/maya/publish/extract_camera_mayaAscii.py +++ b/config/plugins/maya/publish/extract_camera_mayaAscii.py @@ -3,7 +3,7 @@ import os from maya import cmds import avalon.maya -import colorbleed.api +import config.api import cb.utils.maya.context as context from cb.utils.maya.animation import bakeToWorldSpace @@ -35,7 +35,7 @@ def massage_ma_file(path): f.close() -class ExtractCameraMayaAscii(colorbleed.api.Extractor): +class ExtractCameraMayaAscii(config.api.Extractor): """Extract a Camera as Maya Ascii. This will create a duplicate of the camera that will be baked *with* @@ -53,7 +53,7 @@ class ExtractCameraMayaAscii(colorbleed.api.Extractor): label = "Camera (Maya Ascii)" hosts = ["maya"] - families = ["colorbleed.camera"] + families = ["studio.camera"] def process(self, instance): diff --git a/config/plugins/maya/publish/extract_look.py b/config/plugins/maya/publish/extract_look.py index 6308ca1fec..83bce5bf60 100644 --- a/config/plugins/maya/publish/extract_look.py +++ b/config/plugins/maya/publish/extract_look.py @@ -6,13 +6,13 @@ from maya import cmds import pyblish.api import avalon.maya -import colorbleed.api +import config.api import config.apps.maya.lib as maya from cb.utils.maya import context -class ExtractLook(colorbleed.api.Extractor): +class ExtractLook(config.api.Extractor): """Extract Look (Maya Ascii + JSON) Only extracts the sets (shadingEngines and alike) alongside a .json file @@ -23,7 +23,7 @@ class ExtractLook(colorbleed.api.Extractor): label = "Extract Look (Maya ASCII + JSON)" hosts = ["maya"] - families = ["colorbleed.look"] + families = ["studio.look"] order = pyblish.api.ExtractorOrder + 0.2 def process(self, instance): diff --git a/config/plugins/maya/publish/extract_maya_ascii_raw.py b/config/plugins/maya/publish/extract_maya_ascii_raw.py index f447f25851..b0a5e854de 100644 --- a/config/plugins/maya/publish/extract_maya_ascii_raw.py +++ b/config/plugins/maya/publish/extract_maya_ascii_raw.py @@ -3,10 +3,10 @@ import os from maya import cmds import avalon.maya -import colorbleed.api +import config.api -class ExtractMayaAsciiRaw(colorbleed.api.Extractor): +class ExtractMayaAsciiRaw(config.api.Extractor): """Extract as Maya Ascii (raw) This will preserve all references, construction history, etc. diff --git a/config/plugins/maya/publish/extract_model.py b/config/plugins/maya/publish/extract_model.py index e1be53d59a..b9f4a57674 100644 --- a/config/plugins/maya/publish/extract_model.py +++ b/config/plugins/maya/publish/extract_model.py @@ -3,12 +3,12 @@ import os from maya import cmds import avalon.maya -import colorbleed.api +import config.api from cb.utils.maya import context -class ExtractModel(colorbleed.api.Extractor): +class ExtractModel(config.api.Extractor): """Extract as Model (Maya Ascii) Only extracts contents based on the original "setMembers" data to ensure @@ -25,7 +25,7 @@ class ExtractModel(colorbleed.api.Extractor): label = "Model (Maya ASCII)" hosts = ["maya"] - families = ["colorbleed.model"] + families = ["studio.model"] def process(self, instance): diff --git a/config/plugins/maya/publish/extract_pointcache.py b/config/plugins/maya/publish/extract_pointcache.py index d9dee9e0e7..bd3447fc3e 100644 --- a/config/plugins/maya/publish/extract_pointcache.py +++ b/config/plugins/maya/publish/extract_pointcache.py @@ -3,11 +3,11 @@ import os from maya import cmds import avalon.maya -import colorbleed.api +import config.api from config.apps.maya.lib import extract_alembic -class ExtractColorbleedAlembic(colorbleed.api.Extractor): +class ExtractColorbleedAlembic(config.api.Extractor): """Produce an alembic of just point positions and normals. Positions and normals, uvs, creases are preserved, but nothing more, @@ -17,8 +17,8 @@ class ExtractColorbleedAlembic(colorbleed.api.Extractor): label = "Extract Pointcache (Alembic)" hosts = ["maya"] - families = ["colorbleed.pointcache", - "colorbleed.model"] + families = ["studio.pointcache", + "studio.model"] def process(self, instance): diff --git a/config/plugins/maya/publish/extract_rig.py b/config/plugins/maya/publish/extract_rig.py index 7db6adfe43..0cfb0f4dc4 100644 --- a/config/plugins/maya/publish/extract_rig.py +++ b/config/plugins/maya/publish/extract_rig.py @@ -3,15 +3,15 @@ import os from maya import cmds import avalon.maya -import colorbleed.api +import config.api -class ExtractColorbleedRig(colorbleed.api.Extractor): +class ExtractColorbleedRig(config.api.Extractor): """Extract rig as Maya Ascii""" label = "Extract Rig (Maya ASCII)" hosts = ["maya"] - families = ["colorbleed.rig"] + families = ["studio.rig"] def process(self, instance): diff --git a/config/plugins/maya/publish/extract_setdress.py b/config/plugins/maya/publish/extract_setdress.py index 4d791c8055..1291514e56 100644 --- a/config/plugins/maya/publish/extract_setdress.py +++ b/config/plugins/maya/publish/extract_setdress.py @@ -2,13 +2,13 @@ import json import os -import colorbleed.api +import config.api from config.apps.maya.lib import extract_alembic from maya import cmds -class ExtractSetDress(colorbleed.api.Extractor): +class ExtractSetDress(config.api.Extractor): """Produce an alembic of just point positions and normals. Positions and normals are preserved, but nothing more, @@ -18,7 +18,7 @@ class ExtractSetDress(colorbleed.api.Extractor): label = "Extract Set Dress" hosts = ["maya"] - families = ["colorbleed.setdress"] + families = ["studio.setdress"] def process(self, instance): diff --git a/config/plugins/maya/publish/extract_vrayproxy.py b/config/plugins/maya/publish/extract_vrayproxy.py index f1190d52ab..dbd4713120 100644 --- a/config/plugins/maya/publish/extract_vrayproxy.py +++ b/config/plugins/maya/publish/extract_vrayproxy.py @@ -1,12 +1,12 @@ import os import avalon.maya -import colorbleed.api +import config.api from maya import cmds -class ExtractVRayProxy(colorbleed.api.Extractor): +class ExtractVRayProxy(config.api.Extractor): """Extract the content of the instance to a vrmesh file Things to pay attention to: @@ -16,7 +16,7 @@ class ExtractVRayProxy(colorbleed.api.Extractor): label = "VRay Proxy (.vrmesh)" hosts = ["maya"] - families = ["colorbleed.vrayproxy"] + families = ["studio.vrayproxy"] def process(self, instance): diff --git a/config/plugins/maya/publish/extract_yeti_cache.py b/config/plugins/maya/publish/extract_yeti_cache.py index 479bf52813..ab581aa5da 100644 --- a/config/plugins/maya/publish/extract_yeti_cache.py +++ b/config/plugins/maya/publish/extract_yeti_cache.py @@ -3,10 +3,10 @@ import json from maya import cmds -import colorbleed.api +import config.api -class ExtractYetiCache(colorbleed.api.Extractor): +class ExtractYetiCache(config.api.Extractor): """Produce an alembic of just point positions and normals. Positions and normals are preserved, but nothing more, @@ -16,7 +16,7 @@ class ExtractYetiCache(colorbleed.api.Extractor): label = "Extract Yeti Cache" hosts = ["maya"] - families = ["colorbleed.yetiRig", "colorbleed.yeticache"] + families = ["studio.yetiRig", "studio.yeticache"] def process(self, instance): diff --git a/config/plugins/maya/publish/extract_yeti_rig.py b/config/plugins/maya/publish/extract_yeti_rig.py index ad53fb7962..f0df3ec3c9 100644 --- a/config/plugins/maya/publish/extract_yeti_rig.py +++ b/config/plugins/maya/publish/extract_yeti_rig.py @@ -5,7 +5,7 @@ import contextlib from maya import cmds import avalon.maya.lib as lib -import colorbleed.api +import config.api import config.apps.maya.lib as maya @@ -56,7 +56,7 @@ def disconnected_attributes(settings, members): continue -class ExtractYetiRig(colorbleed.api.Extractor): +class ExtractYetiRig(config.api.Extractor): """Produce an alembic of just point positions and normals. Positions and normals are preserved, but nothing more, @@ -66,7 +66,7 @@ class ExtractYetiRig(colorbleed.api.Extractor): label = "Extract Yeti Rig" hosts = ["maya"] - families = ["colorbleed.yetiRig"] + families = ["studio.yetiRig"] def process(self, instance): diff --git a/config/plugins/maya/publish/increment_current_file_deadline.py b/config/plugins/maya/publish/increment_current_file_deadline.py index cb8374a7e1..7e680933b7 100644 --- a/config/plugins/maya/publish/increment_current_file_deadline.py +++ b/config/plugins/maya/publish/increment_current_file_deadline.py @@ -11,15 +11,15 @@ class IncrementCurrentFileDeadline(pyblish.api.ContextPlugin): label = "Increment current file" order = pyblish.api.IntegratorOrder + 9.0 hosts = ["maya"] - families = ["colorbleed.renderlayer"] + families = ["studio.renderlayer"] optional = True def process(self, context): import os from maya import cmds - from colorbleed.lib import version_up - from colorbleed.action import get_errored_plugins_from_data + from config.lib import version_up + from config.action import get_errored_plugins_from_data errored_plugins = get_errored_plugins_from_data(context) if any(plugin.__name__ == "MayaSubmitDeadline" diff --git a/config/plugins/maya/publish/save_scene.py b/config/plugins/maya/publish/save_scene.py index bf80bc9699..ac84c6ac66 100644 --- a/config/plugins/maya/publish/save_scene.py +++ b/config/plugins/maya/publish/save_scene.py @@ -9,7 +9,7 @@ class SaveCurrentScene(pyblish.api.ContextPlugin): label = "Save current file" order = pyblish.api.IntegratorOrder - 0.49 hosts = ["maya"] - families = ["colorbleed.renderlayer"] + families = ["studio.renderlayer"] def process(self, context): import maya.cmds as cmds diff --git a/config/plugins/maya/publish/submit_deadline.py b/config/plugins/maya/publish/submit_deadline.py index 43cdc22c4d..ae5d05ce81 100644 --- a/config/plugins/maya/publish/submit_deadline.py +++ b/config/plugins/maya/publish/submit_deadline.py @@ -99,7 +99,7 @@ class MayaSubmitDeadline(pyblish.api.InstancePlugin): label = "Submit to Deadline" order = pyblish.api.IntegratorOrder hosts = ["maya"] - families = ["colorbleed.renderlayer"] + families = ["studio.renderlayer"] def process(self, instance): diff --git a/config/plugins/maya/publish/validate_animation_content.py b/config/plugins/maya/publish/validate_animation_content.py index 0725281705..46d201ea71 100644 --- a/config/plugins/maya/publish/validate_animation_content.py +++ b/config/plugins/maya/publish/validate_animation_content.py @@ -1,5 +1,5 @@ import pyblish.api -import colorbleed.api +import config.api class ValidateAnimationContent(pyblish.api.InstancePlugin): @@ -10,11 +10,11 @@ class ValidateAnimationContent(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder + order = config.api.ValidateContentsOrder hosts = ["maya"] - families = ["colorbleed.animation"] + families = ["studio.animation"] label = "Animation Content" - actions = [colorbleed.api.SelectInvalidAction] + actions = [config.api.SelectInvalidAction] @classmethod def get_invalid(cls, instance): diff --git a/config/plugins/maya/publish/validate_animation_out_set_related_node_ids.py b/config/plugins/maya/publish/validate_animation_out_set_related_node_ids.py index b67dcbf3f8..c38158861f 100644 --- a/config/plugins/maya/publish/validate_animation_out_set_related_node_ids.py +++ b/config/plugins/maya/publish/validate_animation_out_set_related_node_ids.py @@ -1,7 +1,7 @@ import maya.cmds as cmds import pyblish.api -import colorbleed.api +import config.api import config.apps.maya.lib as lib @@ -15,11 +15,11 @@ class ValidateOutRelatedNodeIds(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder - families = ['colorbleed.animation', "colorbleed.pointcache"] + order = config.api.ValidateContentsOrder + families = ['studio.animation', "studio.pointcache"] hosts = ['maya'] label = 'Animation Out Set Related Node Ids' - actions = [colorbleed.api.SelectInvalidAction, colorbleed.api.RepairAction] + actions = [config.api.SelectInvalidAction, config.api.RepairAction] def process(self, instance): """Process all meshes""" diff --git a/config/plugins/maya/publish/validate_camera_attributes.py b/config/plugins/maya/publish/validate_camera_attributes.py index 46b9de7ecd..04611b04a7 100644 --- a/config/plugins/maya/publish/validate_camera_attributes.py +++ b/config/plugins/maya/publish/validate_camera_attributes.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api class ValidateCameraAttributes(pyblish.api.InstancePlugin): @@ -13,11 +13,11 @@ class ValidateCameraAttributes(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder - families = ['colorbleed.camera'] + order = config.api.ValidateContentsOrder + families = ['studio.camera'] hosts = ['maya'] label = 'Camera Attributes' - actions = [colorbleed.api.SelectInvalidAction] + actions = [config.api.SelectInvalidAction] DEFAULTS = [ ("filmFitOffset", 0.0), diff --git a/config/plugins/maya/publish/validate_camera_contents.py b/config/plugins/maya/publish/validate_camera_contents.py index 09f5d5392b..22ce223a45 100644 --- a/config/plugins/maya/publish/validate_camera_contents.py +++ b/config/plugins/maya/publish/validate_camera_contents.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api class ValidateCameraContents(pyblish.api.InstancePlugin): @@ -14,11 +14,11 @@ class ValidateCameraContents(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder - families = ['colorbleed.camera'] + order = config.api.ValidateContentsOrder + families = ['studio.camera'] hosts = ['maya'] label = 'Camera Contents' - actions = [colorbleed.api.SelectInvalidAction] + actions = [config.api.SelectInvalidAction] @classmethod def get_invalid(cls, instance): diff --git a/config/plugins/maya/publish/validate_deadline_connection.py b/config/plugins/maya/publish/validate_deadline_connection.py index 7f57e5b96a..7d5ae8dd6d 100644 --- a/config/plugins/maya/publish/validate_deadline_connection.py +++ b/config/plugins/maya/publish/validate_deadline_connection.py @@ -10,7 +10,7 @@ class ValidateDeadlineConnection(pyblish.api.ContextPlugin): label = "Validate Deadline Web Service" order = pyblish.api.ValidatorOrder hosts = ["maya"] - families = ["colorbleed.renderlayer"] + families = ["studio.renderlayer"] def process(self, instance): diff --git a/config/plugins/maya/publish/validate_frame_range.py b/config/plugins/maya/publish/validate_frame_range.py index 010422df38..08fc3347fe 100644 --- a/config/plugins/maya/publish/validate_frame_range.py +++ b/config/plugins/maya/publish/validate_frame_range.py @@ -1,5 +1,5 @@ import pyblish.api -import colorbleed.api +import config.api class ValidateFrameRange(pyblish.api.InstancePlugin): @@ -16,11 +16,11 @@ class ValidateFrameRange(pyblish.api.InstancePlugin): """ label = "Validate Frame Range" - order = colorbleed.api.ValidateContentsOrder - families = ["colorbleed.animation", - "colorbleed.pointcache", - "colorbleed.camera", - "colorbleed.renderlayer"] + order = config.api.ValidateContentsOrder + families = ["studio.animation", + "studio.pointcache", + "studio.camera", + "studio.renderlayer"] def process(self, instance): diff --git a/config/plugins/maya/publish/validate_instance_has_members.py b/config/plugins/maya/publish/validate_instance_has_members.py index d209505378..1783eabf46 100644 --- a/config/plugins/maya/publish/validate_instance_has_members.py +++ b/config/plugins/maya/publish/validate_instance_has_members.py @@ -1,14 +1,14 @@ import pyblish.api -import colorbleed.api +import config.api class ValidateInstanceHasMembers(pyblish.api.InstancePlugin): """Validates instance objectSet has *any* members.""" - order = colorbleed.api.ValidateContentsOrder + order = config.api.ValidateContentsOrder hosts = ["maya"] label = 'Instance has members' - actions = [colorbleed.api.SelectInvalidAction] + actions = [config.api.SelectInvalidAction] @classmethod def get_invalid(cls, instance): diff --git a/config/plugins/maya/publish/validate_instance_subset.py b/config/plugins/maya/publish/validate_instance_subset.py index 6a26d09594..520fb6e266 100644 --- a/config/plugins/maya/publish/validate_instance_subset.py +++ b/config/plugins/maya/publish/validate_instance_subset.py @@ -1,5 +1,5 @@ import pyblish.api -import colorbleed.api +import config.api import string # Allow only characters, numbers and underscore @@ -16,7 +16,7 @@ def validate_name(subset): class ValidateSubsetName(pyblish.api.InstancePlugin): """Validates subset name has only valid characters""" - order = colorbleed.api.ValidateContentsOrder + order = config.api.ValidateContentsOrder families = ["*"] label = "Subset Name" diff --git a/config/plugins/maya/publish/validate_instancer_content.py b/config/plugins/maya/publish/validate_instancer_content.py index ed97410fc6..5ed1aaa886 100644 --- a/config/plugins/maya/publish/validate_instancer_content.py +++ b/config/plugins/maya/publish/validate_instancer_content.py @@ -12,7 +12,7 @@ class ValidateInstancerContent(pyblish.api.InstancePlugin): """ order = pyblish.api.ValidatorOrder label = 'Instancer Content' - families = ['colorbleed.instancer'] + families = ['studio.instancer'] def process(self, instance): diff --git a/config/plugins/maya/publish/validate_instancer_frame_ranges.py b/config/plugins/maya/publish/validate_instancer_frame_ranges.py index c7307c5a2a..ae4cd83f88 100644 --- a/config/plugins/maya/publish/validate_instancer_frame_ranges.py +++ b/config/plugins/maya/publish/validate_instancer_frame_ranges.py @@ -44,7 +44,7 @@ class ValidateInstancerFrameRanges(pyblish.api.InstancePlugin): """ order = pyblish.api.ValidatorOrder label = 'Instancer Cache Frame Ranges' - families = ['colorbleed.instancer'] + families = ['studio.instancer'] @classmethod def get_invalid(cls, instance): diff --git a/config/plugins/maya/publish/validate_joints_hidden.py b/config/plugins/maya/publish/validate_joints_hidden.py index 70c6a81690..6eb4ecb25c 100644 --- a/config/plugins/maya/publish/validate_joints_hidden.py +++ b/config/plugins/maya/publish/validate_joints_hidden.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api import config.apps.maya.lib as lib @@ -16,14 +16,14 @@ class ValidateJointsHidden(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder + order = config.api.ValidateContentsOrder hosts = ['maya'] - families = ['colorbleed.rig'] + families = ['studio.rig'] category = 'rig' version = (0, 1, 0) label = "Joints Hidden" - actions = [colorbleed.api.SelectInvalidAction, - colorbleed.api.RepairAction] + actions = [config.api.SelectInvalidAction, + config.api.RepairAction] @staticmethod def get_invalid(instance): diff --git a/config/plugins/maya/publish/validate_look_contents.py b/config/plugins/maya/publish/validate_look_contents.py index 5f47ea39cc..6b7637d396 100644 --- a/config/plugins/maya/publish/validate_look_contents.py +++ b/config/plugins/maya/publish/validate_look_contents.py @@ -1,5 +1,5 @@ import pyblish.api -import colorbleed.api +import config.api class ValidateLookContents(pyblish.api.InstancePlugin): @@ -16,11 +16,11 @@ class ValidateLookContents(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder - families = ['colorbleed.look'] + order = config.api.ValidateContentsOrder + families = ['studio.look'] hosts = ['maya'] label = 'Look Data Contents' - actions = [colorbleed.api.SelectInvalidAction] + actions = [config.api.SelectInvalidAction] def process(self, instance): """Process all the nodes in the instance""" diff --git a/config/plugins/maya/publish/validate_look_default_shaders_connections.py b/config/plugins/maya/publish/validate_look_default_shaders_connections.py index dc8e7446c9..ab56e22cc2 100644 --- a/config/plugins/maya/publish/validate_look_default_shaders_connections.py +++ b/config/plugins/maya/publish/validate_look_default_shaders_connections.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api class ValidateLookDefaultShadersConnections(pyblish.api.InstancePlugin): @@ -16,8 +16,8 @@ class ValidateLookDefaultShadersConnections(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder - families = ['colorbleed.look'] + order = config.api.ValidateContentsOrder + families = ['studio.look'] hosts = ['maya'] label = 'Look Default Shader Connections' diff --git a/config/plugins/maya/publish/validate_look_members_unique.py b/config/plugins/maya/publish/validate_look_members_unique.py index a42410c123..692d5ad7a9 100644 --- a/config/plugins/maya/publish/validate_look_members_unique.py +++ b/config/plugins/maya/publish/validate_look_members_unique.py @@ -1,7 +1,7 @@ from collections import defaultdict import pyblish.api -import colorbleed.api +import config.api class ValidateUniqueRelationshipMembers(pyblish.api.InstancePlugin): @@ -19,13 +19,13 @@ class ValidateUniqueRelationshipMembers(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidatePipelineOrder + order = config.api.ValidatePipelineOrder label = 'Look members unique' hosts = ['maya'] - families = ['colorbleed.look'] + families = ['studio.look'] - actions = [colorbleed.api.SelectInvalidAction, - colorbleed.api.GenerateUUIDsOnInvalidAction] + actions = [config.api.SelectInvalidAction, + config.api.GenerateUUIDsOnInvalidAction] def process(self, instance): """Process all meshes""" diff --git a/config/plugins/maya/publish/validate_look_no_default_shaders.py b/config/plugins/maya/publish/validate_look_no_default_shaders.py index 9315359184..18537e0d01 100644 --- a/config/plugins/maya/publish/validate_look_no_default_shaders.py +++ b/config/plugins/maya/publish/validate_look_no_default_shaders.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api class ValidateLookNoDefaultShaders(pyblish.api.InstancePlugin): @@ -22,11 +22,11 @@ class ValidateLookNoDefaultShaders(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder + 0.01 - families = ['colorbleed.look'] + order = config.api.ValidateContentsOrder + 0.01 + families = ['studio.look'] hosts = ['maya'] label = 'Look No Default Shaders' - actions = [colorbleed.api.SelectInvalidAction] + actions = [config.api.SelectInvalidAction] DEFAULT_SHADERS = {"lambert1", "initialShadingGroup", "initialParticleSE", "particleCloud1"} diff --git a/config/plugins/maya/publish/validate_look_sets.py b/config/plugins/maya/publish/validate_look_sets.py index c7a54c4cd8..d23e080b25 100644 --- a/config/plugins/maya/publish/validate_look_sets.py +++ b/config/plugins/maya/publish/validate_look_sets.py @@ -1,7 +1,7 @@ from config.apps.maya import lib import pyblish.api -import colorbleed.api +import config.api from cb.utils.maya import context @@ -31,11 +31,11 @@ class ValidateLookSets(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder - families = ['colorbleed.look'] + order = config.api.ValidateContentsOrder + families = ['studio.look'] hosts = ['maya'] label = 'Look Sets' - actions = [colorbleed.api.SelectInvalidAction] + actions = [config.api.SelectInvalidAction] def process(self, instance): """Process all the nodes in the instance""" diff --git a/config/plugins/maya/publish/validate_look_single_shader.py b/config/plugins/maya/publish/validate_look_single_shader.py index f56f8eb64e..1befb63e74 100644 --- a/config/plugins/maya/publish/validate_look_single_shader.py +++ b/config/plugins/maya/publish/validate_look_single_shader.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api class ValidateSingleShader(pyblish.api.InstancePlugin): @@ -11,11 +11,11 @@ class ValidateSingleShader(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder - families = ['colorbleed.look'] + order = config.api.ValidateContentsOrder + families = ['studio.look'] hosts = ['maya'] label = 'Look Single Shader Per Shape' - actions = [colorbleed.api.SelectInvalidAction] + actions = [config.api.SelectInvalidAction] # The default connections to check def process(self, instance): diff --git a/config/plugins/maya/publish/validate_maya_units.py b/config/plugins/maya/publish/validate_maya_units.py index 9904936f6b..7fa60b7681 100644 --- a/config/plugins/maya/publish/validate_maya_units.py +++ b/config/plugins/maya/publish/validate_maya_units.py @@ -1,18 +1,18 @@ import maya.cmds as cmds import pyblish.api -import colorbleed.api -from colorbleed import lib +import config.api +from config import lib import config.apps.maya.lib as mayalib class ValidateMayaUnits(pyblish.api.ContextPlugin): """Check if the Maya units are set correct""" - order = colorbleed.api.ValidateSceneOrder + order = config.api.ValidateSceneOrder label = "Maya Units" hosts = ['maya'] - actions = [colorbleed.api.RepairContextAction] + actions = [config.api.RepairContextAction] def process(self, context): diff --git a/config/plugins/maya/publish/validate_mesh_has_uv.py b/config/plugins/maya/publish/validate_mesh_has_uv.py index bc7c19e5ad..215e2eafcc 100644 --- a/config/plugins/maya/publish/validate_mesh_has_uv.py +++ b/config/plugins/maya/publish/validate_mesh_has_uv.py @@ -3,7 +3,7 @@ import re from maya import cmds import pyblish.api -import colorbleed.api +import config.api def len_flattened(components): @@ -44,12 +44,12 @@ class ValidateMeshHasUVs(pyblish.api.InstancePlugin): UVs for every face. """ - order = colorbleed.api.ValidateMeshOrder + order = config.api.ValidateMeshOrder hosts = ['maya'] - families = ['colorbleed.model'] + families = ['studio.model'] category = 'geometry' label = 'Mesh Has UVs' - actions = [colorbleed.api.SelectInvalidAction] + actions = [config.api.SelectInvalidAction] optional = True @classmethod diff --git a/config/plugins/maya/publish/validate_mesh_lamina_faces.py b/config/plugins/maya/publish/validate_mesh_lamina_faces.py index 80a6968e55..2bb899e095 100644 --- a/config/plugins/maya/publish/validate_mesh_lamina_faces.py +++ b/config/plugins/maya/publish/validate_mesh_lamina_faces.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api class ValidateMeshLaminaFaces(pyblish.api.InstancePlugin): @@ -11,13 +11,13 @@ class ValidateMeshLaminaFaces(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateMeshOrder + order = config.api.ValidateMeshOrder hosts = ['maya'] - families = ['colorbleed.model'] + families = ['studio.model'] category = 'geometry' version = (0, 1, 0) label = 'Mesh Lamina Faces' - actions = [colorbleed.api.SelectInvalidAction] + actions = [config.api.SelectInvalidAction] @staticmethod def get_invalid(instance): diff --git a/config/plugins/maya/publish/validate_mesh_no_negative_scale.py b/config/plugins/maya/publish/validate_mesh_no_negative_scale.py index 91fc720cbe..0581636455 100644 --- a/config/plugins/maya/publish/validate_mesh_no_negative_scale.py +++ b/config/plugins/maya/publish/validate_mesh_no_negative_scale.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api class ValidateMeshNoNegativeScale(pyblish.api.Validator): @@ -16,11 +16,11 @@ class ValidateMeshNoNegativeScale(pyblish.api.Validator): """ - order = colorbleed.api.ValidateMeshOrder + order = config.api.ValidateMeshOrder hosts = ['maya'] - families = ['colorbleed.model'] + families = ['studio.model'] label = 'Mesh No Negative Scale' - actions = [colorbleed.api.SelectInvalidAction] + actions = [config.api.SelectInvalidAction] @staticmethod def get_invalid(instance): diff --git a/config/plugins/maya/publish/validate_mesh_non_manifold.py b/config/plugins/maya/publish/validate_mesh_non_manifold.py index c1185cf587..56e23d5638 100644 --- a/config/plugins/maya/publish/validate_mesh_non_manifold.py +++ b/config/plugins/maya/publish/validate_mesh_non_manifold.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api class ValidateMeshNonManifold(pyblish.api.Validator): @@ -12,11 +12,11 @@ class ValidateMeshNonManifold(pyblish.api.Validator): """ - order = colorbleed.api.ValidateMeshOrder + order = config.api.ValidateMeshOrder hosts = ['maya'] - families = ['colorbleed.model'] + families = ['studio.model'] label = 'Mesh Non-Manifold Vertices/Edges' - actions = [colorbleed.api.SelectInvalidAction] + actions = [config.api.SelectInvalidAction] @staticmethod def get_invalid(instance): diff --git a/config/plugins/maya/publish/validate_mesh_non_zero_edge.py b/config/plugins/maya/publish/validate_mesh_non_zero_edge.py index bf7ab0ce21..bed9b7fa32 100644 --- a/config/plugins/maya/publish/validate_mesh_non_zero_edge.py +++ b/config/plugins/maya/publish/validate_mesh_non_zero_edge.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api import config.apps.maya.lib as lib @@ -15,13 +15,13 @@ class ValidateMeshNonZeroEdgeLength(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateMeshOrder - families = ['colorbleed.model'] + order = config.api.ValidateMeshOrder + families = ['studio.model'] hosts = ['maya'] category = 'geometry' version = (0, 1, 0) label = 'Mesh Edge Length Non Zero' - actions = [colorbleed.api.SelectInvalidAction] + actions = [config.api.SelectInvalidAction] __tolerance = 1e-5 diff --git a/config/plugins/maya/publish/validate_mesh_normals_unlocked.py b/config/plugins/maya/publish/validate_mesh_normals_unlocked.py index 68049fd60a..7bfec74538 100644 --- a/config/plugins/maya/publish/validate_mesh_normals_unlocked.py +++ b/config/plugins/maya/publish/validate_mesh_normals_unlocked.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api class ValidateMeshNormalsUnlocked(pyblish.api.Validator): @@ -12,14 +12,14 @@ class ValidateMeshNormalsUnlocked(pyblish.api.Validator): """ - order = colorbleed.api.ValidateMeshOrder + order = config.api.ValidateMeshOrder hosts = ['maya'] - families = ['colorbleed.model'] + families = ['studio.model'] category = 'geometry' version = (0, 1, 0) label = 'Mesh Normals Unlocked' - actions = [colorbleed.api.SelectInvalidAction, - colorbleed.api.RepairAction] + actions = [config.api.SelectInvalidAction, + config.api.RepairAction] optional = True @staticmethod diff --git a/config/plugins/maya/publish/validate_mesh_shader_connections.py b/config/plugins/maya/publish/validate_mesh_shader_connections.py index 5f44bf1f9f..3a1b50402e 100644 --- a/config/plugins/maya/publish/validate_mesh_shader_connections.py +++ b/config/plugins/maya/publish/validate_mesh_shader_connections.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api def pairs(iterable): @@ -72,12 +72,12 @@ class ValidateMeshShaderConnections(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateMeshOrder + order = config.api.ValidateMeshOrder hosts = ['maya'] - families = ['colorbleed.model'] + families = ['studio.model'] label = "Mesh Shader Connections" - actions = [colorbleed.api.SelectInvalidAction, - colorbleed.api.RepairAction] + actions = [config.api.SelectInvalidAction, + config.api.RepairAction] def process(self, instance): """Process all the nodes in the instance 'objectSet'""" diff --git a/config/plugins/maya/publish/validate_mesh_single_uv_set.py b/config/plugins/maya/publish/validate_mesh_single_uv_set.py index db964d932f..333e76dee1 100644 --- a/config/plugins/maya/publish/validate_mesh_single_uv_set.py +++ b/config/plugins/maya/publish/validate_mesh_single_uv_set.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api import config.apps.maya.lib as lib @@ -14,15 +14,15 @@ class ValidateMeshSingleUVSet(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateMeshOrder + order = config.api.ValidateMeshOrder hosts = ['maya'] - families = ['colorbleed.model', 'colorbleed.pointcache'] + families = ['studio.model', 'studio.pointcache'] category = 'uv' optional = True version = (0, 1, 0) label = "Mesh Single UV Set" - actions = [colorbleed.api.SelectInvalidAction, - colorbleed.api.RepairAction] + actions = [config.api.SelectInvalidAction, + config.api.RepairAction] @staticmethod def get_invalid(instance): diff --git a/config/plugins/maya/publish/validate_mesh_vertices_have_edges.py b/config/plugins/maya/publish/validate_mesh_vertices_have_edges.py index 90eca6e6f4..f15c917619 100644 --- a/config/plugins/maya/publish/validate_mesh_vertices_have_edges.py +++ b/config/plugins/maya/publish/validate_mesh_vertices_have_edges.py @@ -3,7 +3,7 @@ import re from maya import cmds import pyblish.api -import colorbleed.api +import config.api def len_flattened(components): @@ -56,13 +56,13 @@ class ValidateMeshVerticesHaveEdges(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateMeshOrder + order = config.api.ValidateMeshOrder hosts = ['maya'] - families = ['colorbleed.model'] + families = ['studio.model'] category = 'geometry' label = 'Mesh Vertices Have Edges' - actions = [colorbleed.api.SelectInvalidAction, - colorbleed.api.RepairAction] + actions = [config.api.SelectInvalidAction, + config.api.RepairAction] @classmethod def repair(cls, instance): diff --git a/config/plugins/maya/publish/validate_model_content.py b/config/plugins/maya/publish/validate_model_content.py index eb56804fa1..8f95ec72c4 100644 --- a/config/plugins/maya/publish/validate_model_content.py +++ b/config/plugins/maya/publish/validate_model_content.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api import config.apps.maya.lib as lib @@ -13,11 +13,11 @@ class ValidateModelContent(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder + order = config.api.ValidateContentsOrder hosts = ["maya"] - families = ["colorbleed.model"] + families = ["studio.model"] label = "Model Content" - actions = [colorbleed.api.SelectInvalidAction] + actions = [config.api.SelectInvalidAction] @classmethod def get_invalid(cls, instance): diff --git a/config/plugins/maya/publish/validate_no_animation.py b/config/plugins/maya/publish/validate_no_animation.py index 8b0da47d89..f1c4d34fdf 100644 --- a/config/plugins/maya/publish/validate_no_animation.py +++ b/config/plugins/maya/publish/validate_no_animation.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api class ValidateNoAnimation(pyblish.api.Validator): @@ -13,12 +13,12 @@ class ValidateNoAnimation(pyblish.api.Validator): """ - order = colorbleed.api.ValidateContentsOrder + order = config.api.ValidateContentsOrder label = "No Animation" hosts = ["maya"] - families = ["colorbleed.model"] + families = ["studio.model"] optional = True - actions = [colorbleed.api.SelectInvalidAction] + actions = [config.api.SelectInvalidAction] def process(self, instance): diff --git a/config/plugins/maya/publish/validate_no_default_camera.py b/config/plugins/maya/publish/validate_no_default_camera.py index 6bdb830f0b..3a6d5b8dd9 100644 --- a/config/plugins/maya/publish/validate_no_default_camera.py +++ b/config/plugins/maya/publish/validate_no_default_camera.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api class ValidateNoDefaultCameras(pyblish.api.InstancePlugin): @@ -12,12 +12,12 @@ class ValidateNoDefaultCameras(pyblish.api.InstancePlugin): settings when being loaded and sometimes being skipped. """ - order = colorbleed.api.ValidateContentsOrder + order = config.api.ValidateContentsOrder hosts = ['maya'] - families = ['colorbleed.camera'] + families = ['studio.camera'] version = (0, 1, 0) label = "No Default Cameras" - actions = [colorbleed.api.SelectInvalidAction] + actions = [config.api.SelectInvalidAction] @staticmethod def get_invalid(instance): diff --git a/config/plugins/maya/publish/validate_no_namespace.py b/config/plugins/maya/publish/validate_no_namespace.py index 0f0bbad1c1..74218151b9 100644 --- a/config/plugins/maya/publish/validate_no_namespace.py +++ b/config/plugins/maya/publish/validate_no_namespace.py @@ -2,7 +2,7 @@ import pymel.core as pm import maya.cmds as cmds import pyblish.api -import colorbleed.api +import config.api def get_namespace(node_name): @@ -15,14 +15,14 @@ def get_namespace(node_name): class ValidateNoNamespace(pyblish.api.InstancePlugin): """Ensure the nodes don't have a namespace""" - order = colorbleed.api.ValidateContentsOrder + order = config.api.ValidateContentsOrder hosts = ['maya'] - families = ['colorbleed.model'] + families = ['studio.model'] category = 'cleanup' version = (0, 1, 0) label = 'No Namespaces' - actions = [colorbleed.api.SelectInvalidAction, - colorbleed.api.RepairAction] + actions = [config.api.SelectInvalidAction, + config.api.RepairAction] @staticmethod def get_invalid(instance): diff --git a/config/plugins/maya/publish/validate_no_null_transforms.py b/config/plugins/maya/publish/validate_no_null_transforms.py index d94938493b..1d2353e11a 100644 --- a/config/plugins/maya/publish/validate_no_null_transforms.py +++ b/config/plugins/maya/publish/validate_no_null_transforms.py @@ -1,7 +1,7 @@ import maya.cmds as cmds import pyblish.api -import colorbleed.api +import config.api def has_shape_children(node): @@ -36,13 +36,13 @@ class ValidateNoNullTransforms(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder + order = config.api.ValidateContentsOrder hosts = ['maya'] - families = ['colorbleed.model'] + families = ['studio.model'] category = 'cleanup' version = (0, 1, 0) label = 'No Empty/Null Transforms' - actions = [colorbleed.api.RepairAction, colorbleed.api.SelectInvalidAction] + actions = [config.api.RepairAction, config.api.SelectInvalidAction] @staticmethod def get_invalid(instance): diff --git a/config/plugins/maya/publish/validate_no_unknown_nodes.py b/config/plugins/maya/publish/validate_no_unknown_nodes.py index 221e8f8b61..f6a9442ae2 100644 --- a/config/plugins/maya/publish/validate_no_unknown_nodes.py +++ b/config/plugins/maya/publish/validate_no_unknown_nodes.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api class ValidateNoUnknownNodes(pyblish.api.InstancePlugin): @@ -15,12 +15,12 @@ class ValidateNoUnknownNodes(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder + order = config.api.ValidateContentsOrder hosts = ['maya'] - families = ['colorbleed.model', 'colorbleed.rig'] + families = ['studio.model', 'studio.rig'] optional = True label = "Unknown Nodes" - actions = [colorbleed.api.SelectInvalidAction] + actions = [config.api.SelectInvalidAction] @staticmethod def get_invalid(instance): diff --git a/config/plugins/maya/publish/validate_no_vraymesh.py b/config/plugins/maya/publish/validate_no_vraymesh.py index 575ad7e549..a172191015 100644 --- a/config/plugins/maya/publish/validate_no_vraymesh.py +++ b/config/plugins/maya/publish/validate_no_vraymesh.py @@ -7,7 +7,7 @@ class ValidateNoVRayMesh(pyblish.api.InstancePlugin): order = pyblish.api.ValidatorOrder label = 'No V-Ray Proxies (VRayMesh)' - families = ["colorbleed.pointcache"] + families = ["studio.pointcache"] def process(self, instance): diff --git a/config/plugins/maya/publish/validate_node_ids.py b/config/plugins/maya/publish/validate_node_ids.py index ea0ec18f85..79349fe017 100644 --- a/config/plugins/maya/publish/validate_node_ids.py +++ b/config/plugins/maya/publish/validate_node_ids.py @@ -1,5 +1,5 @@ import pyblish.api -import colorbleed.api +import config.api from config.apps.maya import lib @@ -13,18 +13,18 @@ class ValidateNodeIDs(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidatePipelineOrder + order = config.api.ValidatePipelineOrder label = 'Instance Nodes Have ID' hosts = ['maya'] - families = ["colorbleed.model", - "colorbleed.look", - "colorbleed.rig", - "colorbleed.pointcache", - "colorbleed.animation", - "colorbleed.setdress"] + families = ["studio.model", + "studio.look", + "studio.rig", + "studio.pointcache", + "studio.animation", + "studio.setdress"] - actions = [colorbleed.api.SelectInvalidAction, - colorbleed.api.GenerateUUIDsOnInvalidAction] + actions = [config.api.SelectInvalidAction, + config.api.GenerateUUIDsOnInvalidAction] def process(self, instance): """Process all meshes""" diff --git a/config/plugins/maya/publish/validate_node_ids_deformed_shapes.py b/config/plugins/maya/publish/validate_node_ids_deformed_shapes.py index 2a4b6ce8c5..290c89b15f 100644 --- a/config/plugins/maya/publish/validate_node_ids_deformed_shapes.py +++ b/config/plugins/maya/publish/validate_node_ids_deformed_shapes.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api import config.apps.maya.lib as lib @@ -15,11 +15,11 @@ class ValidateNodeIdsDeformedShape(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder - families = ['colorbleed.look'] + order = config.api.ValidateContentsOrder + families = ['studio.look'] hosts = ['maya'] label = 'Deformed shape ids' - actions = [colorbleed.api.SelectInvalidAction, colorbleed.api.RepairAction] + actions = [config.api.SelectInvalidAction, config.api.RepairAction] def process(self, instance): """Process all the nodes in the instance""" @@ -63,4 +63,3 @@ class ValidateNodeIdsDeformedShape(pyblish.api.InstancePlugin): continue lib.set_id(node, history_id, overwrite=True) - diff --git a/config/plugins/maya/publish/validate_node_ids_in_database.py b/config/plugins/maya/publish/validate_node_ids_in_database.py index 788baf994d..b7a7d75e35 100644 --- a/config/plugins/maya/publish/validate_node_ids_in_database.py +++ b/config/plugins/maya/publish/validate_node_ids_in_database.py @@ -2,7 +2,7 @@ import pyblish.api import avalon.io as io -import colorbleed.api +import config.api from config.apps.maya import lib @@ -17,12 +17,12 @@ class ValidateNodeIdsInDatabase(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidatePipelineOrder + order = config.api.ValidatePipelineOrder label = 'Node Ids in Database' hosts = ['maya'] families = ["*"] - actions = [colorbleed.api.SelectInvalidAction] + actions = [config.api.SelectInvalidAction] def process(self, instance): invalid = self.get_invalid(instance) diff --git a/config/plugins/maya/publish/validate_node_ids_related.py b/config/plugins/maya/publish/validate_node_ids_related.py index 67d10d3059..3d9363dd72 100644 --- a/config/plugins/maya/publish/validate_node_ids_related.py +++ b/config/plugins/maya/publish/validate_node_ids_related.py @@ -1,5 +1,5 @@ import pyblish.api -import colorbleed.api +import config.api import avalon.io as io @@ -11,16 +11,16 @@ class ValidateNodeIDsRelated(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidatePipelineOrder + order = config.api.ValidatePipelineOrder label = 'Node Ids Related (ID)' hosts = ['maya'] - families = ["colorbleed.model", - "colorbleed.look", - "colorbleed.rig"] + families = ["studio.model", + "studio.look", + "studio.rig"] optional = True - actions = [colorbleed.api.SelectInvalidAction, - colorbleed.api.GenerateUUIDsOnInvalidAction] + actions = [config.api.SelectInvalidAction, + config.api.GenerateUUIDsOnInvalidAction] def process(self, instance): """Process all nodes in instance (including hierarchy)""" diff --git a/config/plugins/maya/publish/validate_node_ids_unique.py b/config/plugins/maya/publish/validate_node_ids_unique.py index 0de2defdf3..89a355e817 100644 --- a/config/plugins/maya/publish/validate_node_ids_unique.py +++ b/config/plugins/maya/publish/validate_node_ids_unique.py @@ -1,7 +1,7 @@ from collections import defaultdict import pyblish.api -import colorbleed.api +import config.api import config.apps.maya.lib as lib @@ -11,15 +11,15 @@ class ValidateNodeIdsUnique(pyblish.api.InstancePlugin): Here we ensure that what has been added to the instance is unique """ - order = colorbleed.api.ValidatePipelineOrder + order = config.api.ValidatePipelineOrder label = 'Non Duplicate Instance Members (ID)' hosts = ['maya'] - families = ["colorbleed.model", - "colorbleed.look", - "colorbleed.rig"] + families = ["studio.model", + "studio.look", + "studio.rig"] - actions = [colorbleed.api.SelectInvalidAction, - colorbleed.api.GenerateUUIDsOnInvalidAction] + actions = [config.api.SelectInvalidAction, + config.api.GenerateUUIDsOnInvalidAction] def process(self, instance): """Process all meshes""" diff --git a/config/plugins/maya/publish/validate_node_no_ghosting.py b/config/plugins/maya/publish/validate_node_no_ghosting.py index ca5c4a1edc..d26cf62176 100644 --- a/config/plugins/maya/publish/validate_node_no_ghosting.py +++ b/config/plugins/maya/publish/validate_node_no_ghosting.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api class ValidateNodeNoGhosting(pyblish.api.InstancePlugin): @@ -16,11 +16,11 @@ class ValidateNodeNoGhosting(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder + order = config.api.ValidateContentsOrder hosts = ['maya'] - families = ['colorbleed.model', 'colorbleed.rig'] + families = ['studio.model', 'studio.rig'] label = "No Ghosting" - actions = [colorbleed.api.SelectInvalidAction] + actions = [config.api.SelectInvalidAction] _attributes = {'ghosting': 0} diff --git a/config/plugins/maya/publish/validate_render_image_rule.py b/config/plugins/maya/publish/validate_render_image_rule.py index c16b5ecc3a..9050c764b7 100644 --- a/config/plugins/maya/publish/validate_render_image_rule.py +++ b/config/plugins/maya/publish/validate_render_image_rule.py @@ -1,7 +1,7 @@ import maya.mel as mel import pyblish.api -import colorbleed.api +import config.api def get_file_rule(rule): @@ -14,10 +14,10 @@ class ValidateRenderImageRule(pyblish.api.ContextPlugin): """ - order = colorbleed.api.ValidateContentsOrder + order = config.api.ValidateContentsOrder label = "Images File Rule (Workspace)" hosts = ["maya"] - families = ["colorbleed.renderlayer"] + families = ["studio.renderlayer"] def process(self, context): diff --git a/config/plugins/maya/publish/validate_renderlayer_aovs.py b/config/plugins/maya/publish/validate_renderlayer_aovs.py index 387f4b4881..1314a73b9a 100644 --- a/config/plugins/maya/publish/validate_renderlayer_aovs.py +++ b/config/plugins/maya/publish/validate_renderlayer_aovs.py @@ -1,7 +1,7 @@ import pyblish.api from avalon import io -import colorbleed.api +import config.api class ValidateRenderLayerAOVs(pyblish.api.InstancePlugin): @@ -23,8 +23,8 @@ class ValidateRenderLayerAOVs(pyblish.api.InstancePlugin): order = pyblish.api.ValidatorOrder + 0.1 label = "Render Passes / AOVs Are Registered" hosts = ["maya"] - families = ["colorbleed.renderlayer"] - actions = [colorbleed.api.SelectInvalidAction] + families = ["studio.renderlayer"] + actions = [config.api.SelectInvalidAction] def process(self, instance): invalid = self.get_invalid(instance) diff --git a/config/plugins/maya/publish/validate_rendersettings.py b/config/plugins/maya/publish/validate_rendersettings.py index 5782a327f8..65be0b0cd2 100644 --- a/config/plugins/maya/publish/validate_rendersettings.py +++ b/config/plugins/maya/publish/validate_rendersettings.py @@ -1,7 +1,7 @@ import maya.cmds as cmds import pyblish.api -import colorbleed.api +import config.api import config.apps.maya.lib as lib @@ -27,11 +27,11 @@ class ValidateRenderSettings(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder + order = config.api.ValidateContentsOrder label = "Render Settings" hosts = ["maya"] - families = ["colorbleed.renderlayer"] - actions = [colorbleed.api.RepairAction] + families = ["studio.renderlayer"] + actions = [config.api.RepairAction] DEFAULT_PADDING = 4 RENDERER_PREFIX = {"vray": "/_/"} diff --git a/config/plugins/maya/publish/validate_resources.py b/config/plugins/maya/publish/validate_resources.py index 2dc6f8c313..e20cec387b 100644 --- a/config/plugins/maya/publish/validate_resources.py +++ b/config/plugins/maya/publish/validate_resources.py @@ -1,5 +1,5 @@ import pyblish.api -import colorbleed.api +import config.api import os @@ -17,7 +17,7 @@ class ValidateResources(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder + order = config.api.ValidateContentsOrder label = "Resources" def process(self, instance): diff --git a/config/plugins/maya/publish/validate_rig_contents.py b/config/plugins/maya/publish/validate_rig_contents.py index 7530936a66..c8ab497737 100644 --- a/config/plugins/maya/publish/validate_rig_contents.py +++ b/config/plugins/maya/publish/validate_rig_contents.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api class ValidateRigContents(pyblish.api.InstancePlugin): @@ -13,10 +13,10 @@ class ValidateRigContents(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder + order = config.api.ValidateContentsOrder label = "Rig Contents" hosts = ["maya"] - families = ["colorbleed.rig"] + families = ["studio.rig"] accepted_output = ["mesh", "transform"] accepted_controllers = ["transform"] diff --git a/config/plugins/maya/publish/validate_rig_controllers.py b/config/plugins/maya/publish/validate_rig_controllers.py index 2ae799fa71..9638b074fc 100644 --- a/config/plugins/maya/publish/validate_rig_controllers.py +++ b/config/plugins/maya/publish/validate_rig_controllers.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api from cb.utils.maya.context import undo_chunk @@ -23,12 +23,12 @@ class ValidateRigControllers(pyblish.api.InstancePlugin): - Break all incoming connections to keyable attributes """ - order = colorbleed.api.ValidateContentsOrder + 0.05 + order = config.api.ValidateContentsOrder + 0.05 label = "Rig Controllers" hosts = ["maya"] - families = ["colorbleed.rig"] - actions = [colorbleed.api.RepairAction, - colorbleed.api.SelectInvalidAction] + families = ["studio.rig"] + actions = [config.api.RepairAction, + config.api.SelectInvalidAction] # Default controller values CONTROLLER_DEFAULTS = { diff --git a/config/plugins/maya/publish/validate_rig_controllers_arnold_attributes.py b/config/plugins/maya/publish/validate_rig_controllers_arnold_attributes.py index b6a1191006..1ca01f7704 100644 --- a/config/plugins/maya/publish/validate_rig_controllers_arnold_attributes.py +++ b/config/plugins/maya/publish/validate_rig_controllers_arnold_attributes.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api from cb.utils.maya.context import undo_chunk @@ -24,12 +24,12 @@ class ValidateRigControllersArnoldAttributes(pyblish.api.InstancePlugin): This validator will ensure they are hidden or unkeyable attributes. """ - order = colorbleed.api.ValidateContentsOrder + 0.05 + order = config.api.ValidateContentsOrder + 0.05 label = "Rig Controllers (Arnold Attributes)" hosts = ["maya"] - families = ["colorbleed.rig"] - actions = [colorbleed.api.RepairAction, - colorbleed.api.SelectInvalidAction] + families = ["studio.rig"] + actions = [config.api.RepairAction, + config.api.SelectInvalidAction] attributes = [ "rcurve", diff --git a/config/plugins/maya/publish/validate_rig_out_set_node_ids.py b/config/plugins/maya/publish/validate_rig_out_set_node_ids.py index 2d8c06ab4a..1d841d0e96 100644 --- a/config/plugins/maya/publish/validate_rig_out_set_node_ids.py +++ b/config/plugins/maya/publish/validate_rig_out_set_node_ids.py @@ -1,7 +1,7 @@ import maya.cmds as cmds import pyblish.api -import colorbleed.api +import config.api import config.apps.maya.lib as lib @@ -15,11 +15,11 @@ class ValidateRigOutSetNodeIds(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder - families = ["colorbleed.rig"] + order = config.api.ValidateContentsOrder + families = ["studio.rig"] hosts = ['maya'] label = 'Rig Out Set Node Ids' - actions = [colorbleed.api.SelectInvalidAction, colorbleed.api.RepairAction] + actions = [config.api.SelectInvalidAction, config.api.RepairAction] def process(self, instance): """Process all meshes""" diff --git a/config/plugins/maya/publish/validate_scene_set_workspace.py b/config/plugins/maya/publish/validate_scene_set_workspace.py index 3f4f631897..8f77c25763 100644 --- a/config/plugins/maya/publish/validate_scene_set_workspace.py +++ b/config/plugins/maya/publish/validate_scene_set_workspace.py @@ -3,7 +3,7 @@ import os import maya.cmds as cmds import pyblish.api -import colorbleed.api +import config.api def is_subdir(path, root_dir): @@ -28,9 +28,9 @@ def is_subdir(path, root_dir): class ValidateSceneSetWorkspace(pyblish.api.ContextPlugin): """Validate the scene is inside the currently set Maya workspace""" - order = colorbleed.api.ValidatePipelineOrder + order = config.api.ValidatePipelineOrder hosts = ['maya'] - families = ['colorbleed.model'] + families = ['studio.model'] category = 'scene' version = (0, 1, 0) label = 'Maya Workspace Set' diff --git a/config/plugins/maya/publish/validate_setdress_namespaces.py b/config/plugins/maya/publish/validate_setdress_namespaces.py index 1eda02cf74..2c2db3065e 100644 --- a/config/plugins/maya/publish/validate_setdress_namespaces.py +++ b/config/plugins/maya/publish/validate_setdress_namespaces.py @@ -1,5 +1,5 @@ import pyblish.api -import colorbleed.api +import config.api class ValidateSetdressNamespaces(pyblish.api.InstancePlugin): @@ -16,8 +16,8 @@ class ValidateSetdressNamespaces(pyblish.api.InstancePlugin): label = "Validate Setdress Namespaces" order = pyblish.api.ValidatorOrder - families = ["colorbleed.setdress"] - actions = [colorbleed.api.SelectInvalidAction] + families = ["studio.setdress"] + actions = [config.api.SelectInvalidAction] def process(self, instance): diff --git a/config/plugins/maya/publish/validate_setdress_transforms.py b/config/plugins/maya/publish/validate_setdress_transforms.py index d2caa03ca2..73ee6bfcb0 100644 --- a/config/plugins/maya/publish/validate_setdress_transforms.py +++ b/config/plugins/maya/publish/validate_setdress_transforms.py @@ -1,5 +1,5 @@ import pyblish.api -import colorbleed.api +import config.api from maya import cmds @@ -25,9 +25,9 @@ class ValidateSetDressModelTransforms(pyblish.api.InstancePlugin): order = pyblish.api.ValidatorOrder + 0.49 label = "Setdress Model Transforms" - families = ["colorbleed.setdress"] - actions = [colorbleed.api.SelectInvalidAction, - colorbleed.api.RepairAction] + families = ["studio.setdress"] + actions = [config.api.SelectInvalidAction, + config.api.RepairAction] prompt_message = ("You are about to reset the matrix to the default values." " This can alter the look of your scene. " diff --git a/config/plugins/maya/publish/validate_shape_default_names.py b/config/plugins/maya/publish/validate_shape_default_names.py index 75fd8f3f1e..7e534211ea 100644 --- a/config/plugins/maya/publish/validate_shape_default_names.py +++ b/config/plugins/maya/publish/validate_shape_default_names.py @@ -3,7 +3,7 @@ import re from maya import cmds import pyblish.api -import colorbleed.api +import config.api def short_name(node): @@ -30,15 +30,15 @@ class ValidateShapeDefaultNames(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder + order = config.api.ValidateContentsOrder hosts = ['maya'] - families = ['colorbleed.model'] + families = ['studio.model'] category = 'cleanup' optional = True version = (0, 1, 0) label = "Shape Default Naming" - actions = [colorbleed.api.SelectInvalidAction, - colorbleed.api.RepairAction] + actions = [config.api.SelectInvalidAction, + config.api.RepairAction] @staticmethod def _define_default_name(shape): diff --git a/config/plugins/maya/publish/validate_shape_render_stats.py b/config/plugins/maya/publish/validate_shape_render_stats.py index 9a3067badb..ddb18ccebb 100644 --- a/config/plugins/maya/publish/validate_shape_render_stats.py +++ b/config/plugins/maya/publish/validate_shape_render_stats.py @@ -1,5 +1,5 @@ import pyblish.api -import colorbleed.api +import config.api from maya import cmds @@ -7,12 +7,12 @@ from maya import cmds class ValidateShapeRenderStats(pyblish.api.Validator): """Ensure all render stats are set to the default values.""" - order = colorbleed.api.ValidateMeshOrder + order = config.api.ValidateMeshOrder hosts = ['maya'] - families = ['colorbleed.model'] + families = ['studio.model'] label = 'Shape Default Render Stats' - actions = [colorbleed.api.SelectInvalidAction, - colorbleed.api.RepairAction] + actions = [config.api.SelectInvalidAction, + config.api.RepairAction] defaults = {'castsShadows': 1, 'receiveShadows': 1, diff --git a/config/plugins/maya/publish/validate_single_assembly.py b/config/plugins/maya/publish/validate_single_assembly.py index 886e88ada3..d24c95b3f5 100644 --- a/config/plugins/maya/publish/validate_single_assembly.py +++ b/config/plugins/maya/publish/validate_single_assembly.py @@ -1,5 +1,5 @@ import pyblish.api -import colorbleed.api +import config.api class ValidateSingleAssembly(pyblish.api.InstancePlugin): @@ -17,9 +17,9 @@ class ValidateSingleAssembly(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder + order = config.api.ValidateContentsOrder hosts = ['maya'] - families = ['colorbleed.rig', 'colorbleed.animation'] + families = ['studio.rig', 'studio.animation'] label = 'Single Assembly' def process(self, instance): diff --git a/config/plugins/maya/publish/validate_step_size.py b/config/plugins/maya/publish/validate_step_size.py index 7267d99a35..d29bccaff7 100644 --- a/config/plugins/maya/publish/validate_step_size.py +++ b/config/plugins/maya/publish/validate_step_size.py @@ -1,5 +1,5 @@ import pyblish.api -import colorbleed.api +import config.api class ValidateStepSize(pyblish.api.InstancePlugin): @@ -9,12 +9,12 @@ class ValidateStepSize(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder + order = config.api.ValidateContentsOrder label = 'Step size' - families = ['colorbleed.camera', - 'colorbleed.pointcache', - 'colorbleed.animation'] - actions = [colorbleed.api.SelectInvalidAction] + families = ['studio.camera', + 'studio.pointcache', + 'studio.animation'] + actions = [config.api.SelectInvalidAction] MIN = 0.01 MAX = 1.0 diff --git a/config/plugins/maya/publish/validate_transfers.py b/config/plugins/maya/publish/validate_transfers.py index 41544b63cf..54d1ba6be4 100644 --- a/config/plugins/maya/publish/validate_transfers.py +++ b/config/plugins/maya/publish/validate_transfers.py @@ -1,5 +1,5 @@ import pyblish.api -import colorbleed.api +import config.api import os from collections import defaultdict @@ -13,7 +13,7 @@ class ValidateTransfers(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder + order = config.api.ValidateContentsOrder label = "Transfers" def process(self, instance): diff --git a/config/plugins/maya/publish/validate_transform_naming_suffix.py b/config/plugins/maya/publish/validate_transform_naming_suffix.py index 51d63ad505..58e01cfc74 100644 --- a/config/plugins/maya/publish/validate_transform_naming_suffix.py +++ b/config/plugins/maya/publish/validate_transform_naming_suffix.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api SUFFIX_NAMING_TABLE = {'mesh': ["_GEO", "_GES", "_GEP", "_OSD"], @@ -31,14 +31,14 @@ class ValidateTransformNamingSuffix(pyblish.api.InstancePlugin): """ - order = colorbleed.api.ValidateContentsOrder + order = config.api.ValidateContentsOrder hosts = ['maya'] - families = ['colorbleed.model'] + families = ['studio.model'] category = 'cleanup' optional = True version = (0, 1, 0) label = 'Suffix Naming Conventions' - actions = [colorbleed.api.SelectInvalidAction] + actions = [config.api.SelectInvalidAction] @staticmethod def is_valid_name(node_name, shape_type): diff --git a/config/plugins/maya/publish/validate_transform_zero.py b/config/plugins/maya/publish/validate_transform_zero.py index fa87539d96..6b385e276c 100644 --- a/config/plugins/maya/publish/validate_transform_zero.py +++ b/config/plugins/maya/publish/validate_transform_zero.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api class ValidateTransformZero(pyblish.api.Validator): @@ -13,13 +13,13 @@ class ValidateTransformZero(pyblish.api.Validator): """ - order = colorbleed.api.ValidateContentsOrder + order = config.api.ValidateContentsOrder hosts = ["maya"] - families = ["colorbleed.model"] + families = ["studio.model"] category = "geometry" version = (0, 1, 0) label = "Transform Zero (Freeze)" - actions = [colorbleed.api.SelectInvalidAction] + actions = [config.api.SelectInvalidAction] _identity = [1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, diff --git a/config/plugins/maya/publish/validate_vrayproxy.py b/config/plugins/maya/publish/validate_vrayproxy.py index 40c45094db..c5303c8ec3 100644 --- a/config/plugins/maya/publish/validate_vrayproxy.py +++ b/config/plugins/maya/publish/validate_vrayproxy.py @@ -6,7 +6,7 @@ class ValidateVrayProxy(pyblish.api.InstancePlugin): order = pyblish.api.ValidatorOrder label = 'VRay Proxy Settings' hosts = ['maya'] - families = ['colorbleed.vrayproxy'] + families = ['studio.vrayproxy'] def process(self, instance): diff --git a/config/plugins/maya/publish/validate_yeti_rig_input_in_instance.py b/config/plugins/maya/publish/validate_yeti_rig_input_in_instance.py index 58d9834617..c2034889c3 100644 --- a/config/plugins/maya/publish/validate_yeti_rig_input_in_instance.py +++ b/config/plugins/maya/publish/validate_yeti_rig_input_in_instance.py @@ -1,17 +1,17 @@ from maya import cmds import pyblish.api -import colorbleed.api +import config.api class ValidateYetiRigInputShapesInInstance(pyblish.api.Validator): """Validate if all input nodes are part of the instance's hierarchy""" - order = colorbleed.api.ValidateContentsOrder + order = config.api.ValidateContentsOrder hosts = ["maya"] - families = ["colorbleed.yetiRig"] + families = ["studio.yetiRig"] label = "Yeti Rig Input Shapes In Instance" - actions = [colorbleed.api.SelectInvalidAction] + actions = [config.api.SelectInvalidAction] def process(self, instance): diff --git a/config/plugins/maya/publish/validate_yetirig_cache_state.py b/config/plugins/maya/publish/validate_yetirig_cache_state.py index 2c4d4dbc72..a070f6785b 100644 --- a/config/plugins/maya/publish/validate_yetirig_cache_state.py +++ b/config/plugins/maya/publish/validate_yetirig_cache_state.py @@ -1,6 +1,6 @@ import pyblish.api -import colorbleed.action +import config.action import maya.cmds as cmds @@ -17,9 +17,9 @@ class ValidateYetiRigCacheState(pyblish.api.InstancePlugin): order = pyblish.api.ValidatorOrder label = "Yeti Rig Cache State" hosts = ["maya"] - families = ["colorbleed.yetiRig"] - actions = [colorbleed.action.RepairAction, - colorbleed.action.SelectInvalidAction] + families = ["studio.yetiRig"] + actions = [config.action.RepairAction, + config.action.SelectInvalidAction] def process(self, instance): invalid = self.get_invalid(instance) @@ -58,4 +58,3 @@ class ValidateYetiRigCacheState(pyblish.api.InstancePlugin): for node in invalid: cmds.setAttr("%s.fileMode" % node, 0) cmds.setAttr("%s.cacheFileName" % node, "", type="string") - diff --git a/config/plugins/nuke/create/create_tiff_saver.py b/config/plugins/nuke/create/create_tiff_saver.py new file mode 100644 index 0000000000..d8b5288429 --- /dev/null +++ b/config/plugins/nuke/create/create_tiff_saver.py @@ -0,0 +1,45 @@ +import os + +import avalon.api +from avalon import fusion + + +class CreateTiffSaver(avalon.api.Creator): + + name = "tiffDefault" + label = "Create Tiff Saver" + hosts = ["fusion"] + family = "studio.saver" + + def process(self): + + file_format = "TiffFormat" + + comp = fusion.get_current_comp() + + # todo: improve method of getting current environment + # todo: pref avalon.Session over os.environ + + workdir = os.path.normpath(os.environ["AVALON_WORKDIR"]) + + filename = "{}..tiff".format(self.name) + filepath = os.path.join(workdir, "render", "preview", filename) + + with fusion.comp_lock_and_undo_chunk(comp): + args = (-32768, -32768) # Magical position numbers + saver = comp.AddTool("Saver", *args) + saver.SetAttrs({"TOOLS_Name": self.name}) + + # Setting input attributes is different from basic attributes + # Not confused with "MainInputAttributes" which + saver["Clip"] = filepath + saver["OutputFormat"] = file_format + + # # # Set standard TIFF settings + if saver[file_format] is None: + raise RuntimeError("File format is not set to TiffFormat, " + "this is a bug") + + # Set file format attributes + saver[file_format]["Depth"] = 1 # int8 | int16 | float32 | other + saver[file_format]["SaveAlpha"] = 0 diff --git a/config/plugins/nuke/inventory/select_containers.py b/config/plugins/nuke/inventory/select_containers.py new file mode 100644 index 0000000000..2f7b3e5809 --- /dev/null +++ b/config/plugins/nuke/inventory/select_containers.py @@ -0,0 +1,25 @@ +from avalon import api + + +class FusionSelectContainers(api.InventoryAction): + + label = "Select Containers" + icon = "mouse-pointer" + color = "#d8d8d8" + + def process(self, containers): + + import avalon.fusion + + tools = [i["_tool"] for i in containers] + + comp = avalon.fusion.get_current_comp() + flow = comp.CurrentFrame.FlowView + + with avalon.fusion.comp_lock_and_undo_chunk(comp, self.label): + # Clear selection + flow.Select() + + # Select tool + for tool in tools: + flow.Select(tool) diff --git a/config/plugins/nuke/inventory/set_tool_color.py b/config/plugins/nuke/inventory/set_tool_color.py new file mode 100644 index 0000000000..940a0e9941 --- /dev/null +++ b/config/plugins/nuke/inventory/set_tool_color.py @@ -0,0 +1,68 @@ +from avalon import api, style +from avalon.vendor.Qt import QtGui, QtWidgets + +import avalon.fusion + + +class FusionSetToolColor(api.InventoryAction): + """Update the color of the selected tools""" + + label = "Set Tool Color" + icon = "plus" + color = "#d8d8d8" + _fallback_color = QtGui.QColor(1.0, 1.0, 1.0) + + def process(self, containers): + """Color all selected tools the selected colors""" + + result = [] + comp = avalon.fusion.get_current_comp() + + # Get tool color + first = containers[0] + tool = first["_tool"] + color = tool.TileColor + + if color is not None: + qcolor = QtGui.QColor().fromRgbF(color["R"], color["G"], color["B"]) + else: + qcolor = self._fallback_color + + # Launch pick color + picked_color = self.get_color_picker(qcolor) + if not picked_color: + return + + with avalon.fusion.comp_lock_and_undo_chunk(comp): + for container in containers: + # Convert color to RGB 0-1 floats + rgb_f = picked_color.getRgbF() + rgb_f_table = {"R": rgb_f[0], "G": rgb_f[1], "B": rgb_f[2]} + + # Update tool + tool = container["_tool"] + tool.TileColor = rgb_f_table + + result.append(container) + + return result + + def get_color_picker(self, color): + """Launch color picker and return chosen color + + Args: + color(QtGui.QColor): Start color to display + + Returns: + QtGui.QColor + + """ + + color_dialog = QtWidgets.QColorDialog(color) + color_dialog.setStyleSheet(style.load_stylesheet()) + + accepted = color_dialog.exec_() + if not accepted: + return + + return color_dialog.selectedColor() diff --git a/config/plugins/nuke/load/actions.py b/config/plugins/nuke/load/actions.py new file mode 100644 index 0000000000..fa0e506ee2 --- /dev/null +++ b/config/plugins/nuke/load/actions.py @@ -0,0 +1,76 @@ +"""A module containing generic loader actions that will display in the Loader. + +""" + +from avalon import api + + +class FusionSetFrameRangeLoader(api.Loader): + """Specific loader of Alembic for the avalon.animation family""" + + families = ["studio.animation", + "studio.camera", + "studio.imagesequence", + "studio.yeticache", + "studio.pointcache"] + representations = ["*"] + + label = "Set frame range" + order = 11 + icon = "clock-o" + color = "white" + + def load(self, context, name, namespace, data): + + from config.apps.fusion import lib + + version = context['version'] + version_data = version.get("data", {}) + + start = version_data.get("startFrame", None) + end = version_data.get("endFrame", None) + + if start is None or end is None: + print("Skipping setting frame range because start or " + "end frame data is missing..") + return + + lib.update_frame_range(start, end) + + +class FusionSetFrameRangeWithHandlesLoader(api.Loader): + """Specific loader of Alembic for the avalon.animation family""" + + families = ["studio.animation", + "studio.camera", + "studio.imagesequence", + "studio.yeticache", + "studio.pointcache"] + representations = ["*"] + + label = "Set frame range (with handles)" + order = 12 + icon = "clock-o" + color = "white" + + def load(self, context, name, namespace, data): + + from config.apps.fusion import lib + + version = context['version'] + version_data = version.get("data", {}) + + start = version_data.get("startFrame", None) + end = version_data.get("endFrame", None) + + if start is None or end is None: + print("Skipping setting frame range because start or " + "end frame data is missing..") + return + + # Include handles + handles = version_data.get("handles", 0) + start -= handles + end += handles + + lib.update_frame_range(start, end) diff --git a/config/plugins/nuke/load/load_sequence.py b/config/plugins/nuke/load/load_sequence.py new file mode 100644 index 0000000000..2150bd1eb0 --- /dev/null +++ b/config/plugins/nuke/load/load_sequence.py @@ -0,0 +1,259 @@ +import os +import contextlib + +from avalon import api +import avalon.io as io + + +@contextlib.contextmanager +def preserve_inputs(tool, inputs): + """Preserve the tool's inputs after context""" + + comp = tool.Comp() + + values = {} + for name in inputs: + tool_input = getattr(tool, name) + value = tool_input[comp.TIME_UNDEFINED] + values[name] = value + + try: + yield + finally: + for name, value in values.items(): + tool_input = getattr(tool, name) + tool_input[comp.TIME_UNDEFINED] = value + + +@contextlib.contextmanager +def preserve_trim(loader, log=None): + """Preserve the relative trim of the Loader tool. + + This tries to preserve the loader's trim (trim in and trim out) after + the context by reapplying the "amount" it trims on the clip's length at + start and end. + + """ + + # Get original trim as amount of "trimming" from length + time = loader.Comp().TIME_UNDEFINED + length = loader.GetAttrs()["TOOLIT_Clip_Length"][1] - 1 + trim_from_start = loader["ClipTimeStart"][time] + trim_from_end = length - loader["ClipTimeEnd"][time] + + try: + yield + finally: + + length = loader.GetAttrs()["TOOLIT_Clip_Length"][1] - 1 + if trim_from_start > length: + trim_from_start = length + if log: + log.warning("Reducing trim in to %d " + "(because of less frames)" % trim_from_start) + + remainder = length - trim_from_start + if trim_from_end > remainder: + trim_from_end = remainder + if log: + log.warning("Reducing trim in to %d " + "(because of less frames)" % trim_from_end) + + loader["ClipTimeStart"][time] = trim_from_start + loader["ClipTimeEnd"][time] = length - trim_from_end + + +def loader_shift(loader, frame, relative=True): + """Shift global in time by i preserving duration + + This moves the loader by i frames preserving global duration. When relative + is False it will shift the global in to the start frame. + + Args: + loader (tool): The fusion loader tool. + frame (int): The amount of frames to move. + relative (bool): When True the shift is relative, else the shift will + change the global in to frame. + + Returns: + int: The resulting relative frame change (how much it moved) + + """ + comp = loader.Comp() + time = comp.TIME_UNDEFINED + + old_in = loader["GlobalIn"][time] + old_out = loader["GlobalOut"][time] + + if relative: + shift = frame + else: + shift = frame - old_in + + # Shifting global in will try to automatically compensate for the change + # in the "ClipTimeStart" and "HoldFirstFrame" inputs, so we preserve those + # input values to "just shift" the clip + with preserve_inputs(loader, inputs=["ClipTimeStart", + "ClipTimeEnd", + "HoldFirstFrame", + "HoldLastFrame"]): + + # GlobalIn cannot be set past GlobalOut or vice versa + # so we must apply them in the order of the shift. + if shift > 0: + loader["GlobalOut"][time] = old_out + shift + loader["GlobalIn"][time] = old_in + shift + else: + loader["GlobalIn"][time] = old_in + shift + loader["GlobalOut"][time] = old_out + shift + + return int(shift) + + +class FusionLoadSequence(api.Loader): + """Load image sequence into Fusion""" + + families = ["studio.imagesequence"] + representations = ["*"] + + label = "Load sequence" + order = -10 + icon = "code-fork" + color = "orange" + + def load(self, context, name, namespace, data): + + from avalon.fusion import ( + imprint_container, + get_current_comp, + comp_lock_and_undo_chunk + ) + + # Fallback to asset name when namespace is None + if namespace is None: + namespace = context['asset']['name'] + + # Use the first file for now + path = self._get_first_image(self.fname) + + # Create the Loader with the filename path set + comp = get_current_comp() + with comp_lock_and_undo_chunk(comp, "Create Loader"): + + args = (-32768, -32768) + tool = comp.AddTool("Loader", *args) + tool["Clip"] = path + + # Set global in point to start frame (if in version.data) + start = context["version"]["data"].get("startFrame", None) + if start is not None: + loader_shift(tool, start, relative=False) + + imprint_container(tool, + name=name, + namespace=namespace, + context=context, + loader=self.__class__.__name__) + + def switch(self, container, representation): + self.update(container, representation) + + def update(self, container, representation): + """Update the Loader's path + + Fusion automatically tries to reset some variables when changing + the loader's path to a new file. These automatic changes are to its + inputs: + - ClipTimeStart: Fusion reset to 0 if duration changes + - We keep the trim in as close as possible to the previous value. + When there are less frames then the amount of trim we reduce + it accordingly. + + - ClipTimeEnd: Fusion reset to 0 if duration changes + - We keep the trim out as close as possible to the previous value + within new amount of frames after trim in (ClipTimeStart) has + been set. + + - GlobalIn: Fusion reset to comp's global in if duration changes + - We change it to the "startFrame" + + - GlobalEnd: Fusion resets to globalIn + length if duration changes + - We do the same like Fusion - allow fusion to take control. + + - HoldFirstFrame: Fusion resets this to 0 + - We preverse the value. + + - HoldLastFrame: Fusion resets this to 0 + - We preverse the value. + + - Reverse: Fusion resets to disabled if "Loop" is not enabled. + - We preserve the value. + + - Depth: Fusion resets to "Format" + - We preverse the value. + + - KeyCode: Fusion resets to "" + - We preverse the value. + + - TimeCodeOffset: Fusion resets to 0 + - We preverse the value. + + """ + + from avalon.fusion import comp_lock_and_undo_chunk + + tool = container["_tool"] + assert tool.ID == "Loader", "Must be Loader" + comp = tool.Comp() + + root = api.get_representation_path(representation) + path = self._get_first_image(root) + + # Get start frame from version data + version = io.find_one({"type": "version", + "_id": representation["parent"]}) + start = version["data"].get("startFrame") + if start is None: + self.log.warning("Missing start frame for updated version" + "assuming starts at frame 0 for: " + "{} ({})".format(tool.Name, representation)) + start = 0 + + with comp_lock_and_undo_chunk(comp, "Update Loader"): + + # Update the loader's path whilst preserving some values + with preserve_trim(tool, log=self.log): + with preserve_inputs(tool, + inputs=("HoldFirstFrame", + "HoldLastFrame", + "Reverse", + "Depth", + "KeyCode", + "TimeCodeOffset")): + tool["Clip"] = path + + # Set the global in to the start frame of the sequence + global_in_changed = loader_shift(tool, start, relative=False) + if global_in_changed: + # Log this change to the user + self.log.debug("Changed '%s' global in: %d" % (tool.Name, + start)) + + # Update the imprinted representation + tool.SetData("avalon.representation", str(representation["_id"])) + + def remove(self, container): + + from avalon.fusion import comp_lock_and_undo_chunk + + tool = container["_tool"] + assert tool.ID == "Loader", "Must be Loader" + comp = tool.Comp() + + with comp_lock_and_undo_chunk(comp, "Remove Loader"): + tool.Delete() + + def _get_first_image(self, root): + """Get first file in representation root""" + files = sorted(os.listdir(root)) + return os.path.join(root, files[0]) diff --git a/config/plugins/nuke/publish/collect_comp.py b/config/plugins/nuke/publish/collect_comp.py new file mode 100644 index 0000000000..1cf182c8ca --- /dev/null +++ b/config/plugins/nuke/publish/collect_comp.py @@ -0,0 +1,24 @@ +import os + +import pyblish.api + +from avalon import fusion + + +class CollectCurrentCompFusion(pyblish.api.ContextPlugin): + """Collect current comp""" + + order = pyblish.api.CollectorOrder - 0.4 + label = "Collect Current Comp" + hosts = ["fusion"] + + def process(self, context): + """Collect all image sequence tools""" + + current_comp = fusion.get_current_comp() + assert current_comp, "Must have active Fusion composition" + context.data["currentComp"] = current_comp + + # Store path to current file + filepath = current_comp.GetAttrs().get("COMPS_FileName", "") + context.data['currentFile'] = filepath diff --git a/config/plugins/nuke/publish/collect_fusion_version.py b/config/plugins/nuke/publish/collect_fusion_version.py new file mode 100644 index 0000000000..65d8386f33 --- /dev/null +++ b/config/plugins/nuke/publish/collect_fusion_version.py @@ -0,0 +1,22 @@ +import pyblish.api + + +class CollectFusionVersion(pyblish.api.ContextPlugin): + """Collect current comp""" + + order = pyblish.api.CollectorOrder + label = "Collect Fusion Version" + hosts = ["fusion"] + + def process(self, context): + """Collect all image sequence tools""" + + comp = context.data.get("currentComp") + if not comp: + raise RuntimeError("No comp previously collected, unable to " + "retrieve Fusion version.") + + version = comp.GetApp().Version + context.data["fusionVersion"] = version + + self.log.info("Fusion version: %s" % version) diff --git a/config/plugins/nuke/publish/collect_instances.py b/config/plugins/nuke/publish/collect_instances.py new file mode 100644 index 0000000000..9177f603c3 --- /dev/null +++ b/config/plugins/nuke/publish/collect_instances.py @@ -0,0 +1,96 @@ +import os + +import pyblish.api + + +def get_comp_render_range(comp): + """Return comp's start and end render range.""" + comp_attrs = comp.GetAttrs() + start = comp_attrs["COMPN_RenderStart"] + end = comp_attrs["COMPN_RenderEnd"] + + # Whenever render ranges are undefined fall back + # to the comp's global start and end + if start == -1000000000: + start = comp_attrs["COMPN_GlobalEnd"] + if end == -1000000000: + end = comp_attrs["COMPN_GlobalStart"] + + return start, end + + +class CollectInstances(pyblish.api.ContextPlugin): + """Collect Fusion saver instances + + This additionally stores the Comp start and end render range in the + current context's data as "startFrame" and "endFrame". + + """ + + order = pyblish.api.CollectorOrder + label = "Collect Instances" + hosts = ["fusion"] + + def process(self, context): + """Collect all image sequence tools""" + + from avalon.fusion.lib import get_frame_path + + comp = context.data["currentComp"] + + # Get all savers in the comp + tools = comp.GetToolList(False).values() + savers = [tool for tool in tools if tool.ID == "Saver"] + + start, end = get_comp_render_range(comp) + context.data["startFrame"] = start + context.data["endFrame"] = end + + for tool in savers: + path = tool["Clip"][comp.TIME_UNDEFINED] + + tool_attrs = tool.GetAttrs() + active = not tool_attrs["TOOLB_PassThrough"] + + if not path: + self.log.warning("Skipping saver because it " + "has no path set: {}".format(tool.Name)) + continue + + filename = os.path.basename(path) + head, padding, tail = get_frame_path(filename) + ext = os.path.splitext(path)[1] + assert tail == ext, ("Tail does not match %s" % ext) + subset = head.rstrip("_. ") # subset is head of the filename + + # Include start and end render frame in label + label = "{subset} ({start}-{end})".format(subset=subset, + start=int(start), + end=int(end)) + + instance = context.create_instance(subset) + instance.data.update({ + "asset": os.environ["AVALON_ASSET"], # todo: not a constant + "subset": subset, + "path": path, + "outputDir": os.path.dirname(path), + "ext": ext, # todo: should be redundant + "label": label, + "families": ["studio.saver"], + "family": "studio.saver", + "active": active, + "publish": active # backwards compatibility + }) + + instance.append(tool) + + self.log.info("Found: \"%s\" " % path) + + # Sort/grouped by family (preserving local index) + context[:] = sorted(context, key=self.sort_by_family) + + return context + + def sort_by_family(self, instance): + """Sort by family""" + return instance.data.get("families", instance.data.get("family")) diff --git a/config/plugins/nuke/publish/collect_render_target.py b/config/plugins/nuke/publish/collect_render_target.py new file mode 100644 index 0000000000..0abdd7113f --- /dev/null +++ b/config/plugins/nuke/publish/collect_render_target.py @@ -0,0 +1,44 @@ +import pyblish.api + + +class CollectFusionRenderMode(pyblish.api.InstancePlugin): + """Collect current comp's render Mode + + Options: + renderlocal + deadline + + Note that this value is set for each comp separately. When you save the + comp this information will be stored in that file. If for some reason the + available tool does not visualize which render mode is set for the + current comp, please run the following line in the console (Py2) + + comp.GetData("studio.rendermode") + + This will return the name of the current render mode as seen above under + Options. + + """ + + order = pyblish.api.CollectorOrder + 0.4 + label = "Collect Render Mode" + hosts = ["fusion"] + families = ["studio.saver"] + + def process(self, instance): + """Collect all image sequence tools""" + options = ["renderlocal", "deadline"] + + comp = instance.context.data.get("currentComp") + if not comp: + raise RuntimeError("No comp previously collected, unable to " + "retrieve Fusion version.") + + rendermode = comp.GetData("studio.rendermode") or "renderlocal" + assert rendermode in options, "Must be supported render mode" + + self.log.info("Render mode: {0}".format(rendermode)) + + # Append family + family = "studio.saver.{0}".format(rendermode) + instance.data["families"].append(family) diff --git a/config/plugins/nuke/publish/increment_current_file_deadline.py b/config/plugins/nuke/publish/increment_current_file_deadline.py new file mode 100644 index 0000000000..5a723a320b --- /dev/null +++ b/config/plugins/nuke/publish/increment_current_file_deadline.py @@ -0,0 +1,34 @@ +import pyblish.api + + +class FusionIncrementCurrentFile(pyblish.api.ContextPlugin): + """Increment the current file. + + Saves the current file with an increased version number. + + """ + + label = "Increment current file" + order = pyblish.api.IntegratorOrder + 9.0 + hosts = ["fusion"] + families = ["studio.saver.deadline"] + optional = True + + def process(self, context): + + from config.lib import version_up + from config.action import get_errored_plugins_from_data + + errored_plugins = get_errored_plugins_from_data(context) + if any(plugin.__name__ == "FusionSubmitDeadline" + for plugin in errored_plugins): + raise RuntimeError("Skipping incrementing current file because " + "submission to deadline failed.") + + comp = context.data.get("currentComp") + assert comp, "Must have comp" + + current_filepath = context.data["currentFile"] + new_filepath = version_up(current_filepath) + + comp.Save(new_filepath) diff --git a/config/plugins/nuke/publish/publish_image_sequences.py b/config/plugins/nuke/publish/publish_image_sequences.py new file mode 100644 index 0000000000..bdb77be458 --- /dev/null +++ b/config/plugins/nuke/publish/publish_image_sequences.py @@ -0,0 +1,98 @@ +import re +import os +import json +import subprocess + +import pyblish.api + +from config.action import get_errored_plugins_from_data + + +def _get_script(): + """Get path to the image sequence script""" + + # todo: use a more elegant way to get the python script + + try: + from config.scripts import publish_filesequence + except Exception: + raise RuntimeError("Expected module 'publish_imagesequence'" + "to be available") + + module_path = publish_filesequence.__file__ + if module_path.endswith(".pyc"): + module_path = module_path[:-len(".pyc")] + ".py" + + return module_path + + +class PublishImageSequence(pyblish.api.InstancePlugin): + """Publish the generated local image sequences.""" + + order = pyblish.api.IntegratorOrder + label = "Publish Rendered Image Sequence(s)" + hosts = ["fusion"] + families = ["studio.saver.renderlocal"] + + def process(self, instance): + + # Skip this plug-in if the ExtractImageSequence failed + errored_plugins = get_errored_plugins_from_data(instance.context) + if any(plugin.__name__ == "FusionRenderLocal" for plugin in + errored_plugins): + raise RuntimeError("Fusion local render failed, " + "publishing images skipped.") + + subset = instance.data["subset"] + ext = instance.data["ext"] + + # Regex to match resulting renders + regex = "^{subset}.*[0-9]+{ext}+$".format(subset=re.escape(subset), + ext=re.escape(ext)) + + # The instance has most of the information already stored + metadata = { + "regex": regex, + "startFrame": instance.context.data["startFrame"], + "endFrame": instance.context.data["endFrame"], + "families": ["studio.imagesequence"], + } + + # Write metadata and store the path in the instance + output_directory = instance.data["outputDir"] + path = os.path.join(output_directory, + "{}_metadata.json".format(subset)) + with open(path, "w") as f: + json.dump(metadata, f) + + assert os.path.isfile(path), ("Stored path is not a file for %s" + % instance.data["name"]) + + # Suppress any subprocess console + startupinfo = subprocess.STARTUPINFO() + startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW + startupinfo.wShowWindow = subprocess.SW_HIDE + + process = subprocess.Popen(["python", _get_script(), + "--paths", path], + bufsize=1, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, + startupinfo=startupinfo) + + while True: + output = process.stdout.readline() + # Break when there is no output or a return code has been given + if output == '' and process.poll() is not None: + process.stdout.close() + break + if output: + line = output.strip() + if line.startswith("ERROR"): + self.log.error(line) + else: + self.log.info(line) + + if process.returncode != 0: + raise RuntimeError("Process quit with non-zero " + "return code: {}".format(process.returncode)) diff --git a/config/plugins/nuke/publish/render_local.py b/config/plugins/nuke/publish/render_local.py new file mode 100644 index 0000000000..d34f7d56ee --- /dev/null +++ b/config/plugins/nuke/publish/render_local.py @@ -0,0 +1,42 @@ +import pyblish.api + +import avalon.fusion as fusion + + +class FusionRenderLocal(pyblish.api.InstancePlugin): + """Render the current Fusion composition locally. + + Extract the result of savers by starting a comp render + This will run the local render of Fusion. + + """ + + order = pyblish.api.ExtractorOrder + label = "Render Local" + hosts = ["fusion"] + families = ["studio.saver.renderlocal"] + + def process(self, instance): + + # This should be a ContextPlugin, but this is a workaround + # for a bug in pyblish to run once for a family: issue #250 + context = instance.context + key = "__hasRun{}".format(self.__class__.__name__) + if context.data.get(key, False): + return + else: + context.data[key] = True + + current_comp = context.data["currentComp"] + start_frame = current_comp.GetAttrs("COMPN_RenderStart") + end_frame = current_comp.GetAttrs("COMPN_RenderEnd") + + self.log.info("Starting render") + self.log.info("Start frame: {}".format(start_frame)) + self.log.info("End frame: {}".format(end_frame)) + + with fusion.comp_lock_and_undo_chunk(current_comp): + result = current_comp.Render() + + if not result: + raise RuntimeError("Comp render failed") diff --git a/config/plugins/nuke/publish/save_scene.py b/config/plugins/nuke/publish/save_scene.py new file mode 100644 index 0000000000..ffc44b98d5 --- /dev/null +++ b/config/plugins/nuke/publish/save_scene.py @@ -0,0 +1,21 @@ +import pyblish.api + + +class FusionSaveComp(pyblish.api.ContextPlugin): + """Save current comp""" + + label = "Save current file" + order = pyblish.api.ExtractorOrder - 0.49 + hosts = ["fusion"] + families = ["studio.saver"] + + def process(self, context): + + comp = context.data.get("currentComp") + assert comp, "Must have comp" + + current = comp.GetAttrs().get("COMPS_FileName", "") + assert context.data['currentFile'] == current + + self.log.info("Saving current file..") + comp.Save() diff --git a/config/plugins/nuke/publish/submit_deadline.py b/config/plugins/nuke/publish/submit_deadline.py new file mode 100644 index 0000000000..cce9b1292c --- /dev/null +++ b/config/plugins/nuke/publish/submit_deadline.py @@ -0,0 +1,149 @@ +import os +import json +import getpass + +from avalon import api +from avalon.vendor import requests + +import pyblish.api + + +class FusionSubmitDeadline(pyblish.api.InstancePlugin): + """Submit current Comp to Deadline + + Renders are submitted to a Deadline Web Service as + supplied via the environment variable AVALON_DEADLINE + + """ + + label = "Submit to Deadline" + order = pyblish.api.IntegratorOrder + hosts = ["fusion"] + families = ["studio.saver.deadline"] + + def process(self, instance): + + context = instance.context + + key = "__hasRun{}".format(self.__class__.__name__) + if context.data.get(key, False): + return + else: + context.data[key] = True + + from avalon.fusion.lib import get_frame_path + + AVALON_DEADLINE = api.Session.get("AVALON_DEADLINE", + "http://localhost:8082") + assert AVALON_DEADLINE, "Requires AVALON_DEADLINE" + + # Collect all saver instances in context that are to be rendered + saver_instances = [] + for instance in context[:]: + if not self.families[0] in instance.data.get("families"): + # Allow only saver family instances + continue + + if not instance.data.get("publish", True): + # Skip inactive instances + continue + self.log.debug(instance.data["name"]) + saver_instances.append(instance) + + if not saver_instances: + raise RuntimeError("No instances found for Deadline submittion") + + fusion_version = int(context.data["fusionVersion"]) + filepath = context.data["currentFile"] + filename = os.path.basename(filepath) + comment = context.data.get("comment", "") + deadline_user = context.data.get("deadlineUser", getpass.getuser()) + + # Documentation for keys available at: + # https://docs.thinkboxsoftware.com + # /products/deadline/8.0/1_User%20Manual/manual + # /manual-submission.html#job-info-file-options + payload = { + "JobInfo": { + # Top-level group name + "BatchName": filename, + + # Job name, as seen in Monitor + "Name": filename, + + # User, as seen in Monitor + "UserName": deadline_user, + + # Use a default submission pool for Fusion + "Pool": "fusion", + + "Plugin": "Fusion", + "Frames": "{start}-{end}".format( + start=int(context.data["startFrame"]), + end=int(context.data["endFrame"]) + ), + + "Comment": comment, + }, + "PluginInfo": { + # Input + "FlowFile": filepath, + + # Mandatory for Deadline + "Version": str(fusion_version), + + # Render in high quality + "HighQuality": True, + + # Whether saver output should be checked after rendering + # is complete + "CheckOutput": True, + + # Proxy: higher numbers smaller images for faster test renders + # 1 = no proxy quality + "Proxy": 1, + }, + + # Mandatory for Deadline, may be empty + "AuxFiles": [] + } + + # Enable going to rendered frames from Deadline Monitor + for index, instance in enumerate(saver_instances): + head, padding, tail = get_frame_path(instance.data["path"]) + path = "{}{}{}".format(head, "#" * padding, tail) + folder, filename = os.path.split(path) + payload["JobInfo"]["OutputDirectory%d" % index] = folder + payload["JobInfo"]["OutputFilename%d" % index] = filename + + # Include critical variables with submission + keys = [ + # TODO: This won't work if the slaves don't have accesss to + # these paths, such as if slaves are running Linux and the + # submitter is on Windows. + "PYTHONPATH", + "OFX_PLUGIN_PATH", + "FUSION9_MasterPrefs" + ] + environment = dict({key: os.environ[key] for key in keys + if key in os.environ}, **api.Session) + + payload["JobInfo"].update({ + "EnvironmentKeyValue%d" % index: "{key}={value}".format( + key=key, + value=environment[key] + ) for index, key in enumerate(environment) + }) + + self.log.info("Submitting..") + self.log.info(json.dumps(payload, indent=4, sort_keys=True)) + + # E.g. http://192.168.0.1:8082/api/jobs + url = "{}/api/jobs".format(AVALON_DEADLINE) + response = requests.post(url, json=payload) + if not response.ok: + raise Exception(response.text) + + # Store the response for dependent job submission plug-ins + for instance in saver_instances: + instance.data["deadlineSubmissionJob"] = response.json() diff --git a/config/plugins/nuke/publish/validate_background_depth.py b/config/plugins/nuke/publish/validate_background_depth.py new file mode 100644 index 0000000000..cdb5305c6c --- /dev/null +++ b/config/plugins/nuke/publish/validate_background_depth.py @@ -0,0 +1,40 @@ +import pyblish.api + +from config import action + + +class ValidateBackgroundDepth(pyblish.api.InstancePlugin): + """Validate if all Background tool are set to float32 bit""" + + order = pyblish.api.ValidatorOrder + label = "Validate Background Depth 32 bit" + actions = [action.RepairAction] + hosts = ["fusion"] + families = ["studio.saver"] + optional = True + + @classmethod + def get_invalid(cls, instance): + + context = instance.context + comp = context.data.get("currentComp") + assert comp, "Must have Comp object" + + backgrounds = comp.GetToolList(False, "Background").values() + if not backgrounds: + return [] + + return [i for i in backgrounds if i.GetInput("Depth") != 4.0] + + def process(self, instance): + invalid = self.get_invalid(instance) + if invalid: + raise RuntimeError("Found %i nodes which are not set to float32" + % len(invalid)) + + @classmethod + def repair(cls, instance): + comp = instance.context.data.get("currentComp") + invalid = cls.get_invalid(instance) + for i in invalid: + i.SetInput("Depth", 4.0, comp.TIME_UNDEFINED) diff --git a/config/plugins/nuke/publish/validate_comp_saved.py b/config/plugins/nuke/publish/validate_comp_saved.py new file mode 100644 index 0000000000..6c94d730ce --- /dev/null +++ b/config/plugins/nuke/publish/validate_comp_saved.py @@ -0,0 +1,29 @@ +import os + +import pyblish.api + + +class ValidateFusionCompSaved(pyblish.api.ContextPlugin): + """Ensure current comp is saved""" + + order = pyblish.api.ValidatorOrder + label = "Validate Comp Saved" + families = ["studio.saver"] + hosts = ["fusion"] + + def process(self, context): + + comp = context.data.get("currentComp") + assert comp, "Must have Comp object" + attrs = comp.GetAttrs() + + filename = attrs["COMPS_FileName"] + if not filename: + raise RuntimeError("Comp is not saved.") + + if not os.path.exists(filename): + raise RuntimeError("Comp file does not exist: %s" % filename) + + if attrs["COMPB_Modified"]: + self.log.warning("Comp is modified. Save your comp to ensure your " + "changes propagate correctly.") diff --git a/config/plugins/nuke/publish/validate_create_folder_checked.py b/config/plugins/nuke/publish/validate_create_folder_checked.py new file mode 100644 index 0000000000..78ce441745 --- /dev/null +++ b/config/plugins/nuke/publish/validate_create_folder_checked.py @@ -0,0 +1,41 @@ +import pyblish.api + +from config import action + + +class ValidateCreateFolderChecked(pyblish.api.InstancePlugin): + """Valid if all savers have the input attribute CreateDir checked on + + This attribute ensures that the folders to which the saver will write + will be created. + """ + + order = pyblish.api.ValidatorOrder + actions = [action.RepairAction] + label = "Validate Create Folder Checked" + families = ["studio.saver"] + hosts = ["fusion"] + + @classmethod + def get_invalid(cls, instance): + active = instance.data.get("active", instance.data.get("publish")) + if not active: + return [] + + tool = instance[0] + create_dir = tool.GetInput("CreateDir") + if create_dir == 0.0: + cls.log.error("%s has Create Folder turned off" % instance[0].Name) + return [tool] + + def process(self, instance): + invalid = self.get_invalid(instance) + if invalid: + raise RuntimeError("Found Saver with Create Folder During " + "Render checked off") + + @classmethod + def repair(cls, instance): + invalid = cls.get_invalid(instance) + for tool in invalid: + tool.SetInput("CreateDir", 1.0) diff --git a/config/plugins/nuke/publish/validate_filename_has_extension.py b/config/plugins/nuke/publish/validate_filename_has_extension.py new file mode 100644 index 0000000000..40f167765d --- /dev/null +++ b/config/plugins/nuke/publish/validate_filename_has_extension.py @@ -0,0 +1,36 @@ +import os + +import pyblish.api + + +class ValidateFilenameHasExtension(pyblish.api.InstancePlugin): + """Ensure the Saver has an extension in the filename path + + This disallows files written as `filename` instead of `filename.frame.ext`. + Fusion does not always set an extension for your filename when + changing the file format of the saver. + + """ + + order = pyblish.api.ValidatorOrder + label = "Validate Filename Has Extension" + families = ["studio.saver"] + hosts = ["fusion"] + + def process(self, instance): + invalid = self.get_invalid(instance) + if invalid: + raise RuntimeError("Found Saver without an extension") + + @classmethod + def get_invalid(cls, instance): + + path = instance.data["path"] + fname, ext = os.path.splitext(path) + + if not ext: + tool = instance[0] + cls.log.error("%s has no extension specified" % tool.Name) + return [tool] + + return [] diff --git a/config/plugins/nuke/publish/validate_saver_has_input.py b/config/plugins/nuke/publish/validate_saver_has_input.py new file mode 100644 index 0000000000..9e94f101a0 --- /dev/null +++ b/config/plugins/nuke/publish/validate_saver_has_input.py @@ -0,0 +1,29 @@ +import pyblish.api + + +class ValidateSaverHasInput(pyblish.api.InstancePlugin): + """Validate saver has incoming connection + + This ensures a Saver has at least an input connection. + + """ + + order = pyblish.api.ValidatorOrder + label = "Validate Saver Has Input" + families = ["studio.saver"] + hosts = ["fusion"] + + @classmethod + def get_invalid(cls, instance): + + saver = instance[0] + if not saver.Input.GetConnectedOutput(): + return [saver] + + return [] + + def process(self, instance): + invalid = self.get_invalid(instance) + if invalid: + raise RuntimeError("Saver has no incoming connection: " + "{} ({})".format(instance, invalid[0].Name)) diff --git a/config/plugins/nuke/publish/validate_saver_passthrough.py b/config/plugins/nuke/publish/validate_saver_passthrough.py new file mode 100644 index 0000000000..c69873c04d --- /dev/null +++ b/config/plugins/nuke/publish/validate_saver_passthrough.py @@ -0,0 +1,44 @@ +import pyblish.api + + +class ValidateSaverPassthrough(pyblish.api.ContextPlugin): + """Validate saver passthrough is similar to Pyblish publish state""" + + order = pyblish.api.ValidatorOrder + label = "Validate Saver Passthrough" + families = ["studio.saver"] + hosts = ["fusion"] + + def process(self, context): + + # Workaround for ContextPlugin always running, even if no instance + # is present with the family + instances = pyblish.api.instances_by_plugin(instances=list(context), + plugin=self) + if not instances: + self.log.debug("Ignoring plugin.. (bugfix)") + + invalid_instances = [] + for instance in instances: + invalid = self.is_invalid(instance) + if invalid: + invalid_instances.append(instance) + + if invalid_instances: + self.log.info("Reset pyblish to collect your current scene state, " + "that should fix error.") + raise RuntimeError("Invalid instances: " + "{0}".format(invalid_instances)) + + def is_invalid(self, instance): + + saver = instance[0] + attr = saver.GetAttrs() + active = not attr["TOOLB_PassThrough"] + + if active != instance.data["publish"]: + self.log.info("Saver has different passthrough state than " + "Pyblish: {} ({})".format(instance, saver.Name)) + return [saver] + + return [] diff --git a/config/plugins/nuke/publish/validate_unique_subsets.py b/config/plugins/nuke/publish/validate_unique_subsets.py new file mode 100644 index 0000000000..4fef26c9e9 --- /dev/null +++ b/config/plugins/nuke/publish/validate_unique_subsets.py @@ -0,0 +1,29 @@ +import pyblish.api + + +class ValidateUniqueSubsets(pyblish.api.InstancePlugin): + """Ensure all instances have a unique subset name""" + + order = pyblish.api.ValidatorOrder + label = "Validate Unique Subsets" + families = ["studio.saver"] + hosts = ["fusion"] + + @classmethod + def get_invalid(cls, instance): + + context = instance.context + subset = instance.data["subset"] + for other_instance in context[:]: + if other_instance == instance: + continue + + if other_instance.data["subset"] == subset: + return [instance] # current instance is invalid + + return [] + + def process(self, instance): + invalid = self.get_invalid(instance) + if invalid: + raise RuntimeError("Animation content is invalid. See log.") diff --git a/config/scripts/fusion_switch_shot.py b/config/scripts/fusion_switch_shot.py index 656b5a9d85..25eb28ad0e 100644 --- a/config/scripts/fusion_switch_shot.py +++ b/config/scripts/fusion_switch_shot.py @@ -8,7 +8,7 @@ from avalon import api, io, pipeline import avalon.fusion # Config imports -import colorbleed.lib as colorbleed +import config.lib as lib import config.apps.fusion.lib as fusion_lib log = logging.getLogger("Update Slap Comp") @@ -87,7 +87,7 @@ def _format_filepath(session): # Create new unqiue filepath if os.path.exists(new_filepath): - new_filepath = colorbleed.version_up(new_filepath) + new_filepath = lib.version_up(new_filepath) return new_filepath @@ -189,8 +189,8 @@ def switch(asset_name, filepath=None, new=True): representations = [] for container in containers: try: - representation = colorbleed.switch_item(container, - asset_name=asset_name) + representation = lib.switch_item(container, + asset_name=asset_name) representations.append(representation) except Exception as e: current_comp.Print("Error in switching! %s\n" % e.message) @@ -209,7 +209,7 @@ def switch(asset_name, filepath=None, new=True): # Update savers output based on new session _update_savers(current_comp, switch_to_session) else: - comp_path = colorbleed.version_up(filepath) + comp_path = lib.version_up(filepath) current_comp.Print(comp_path) diff --git a/config/setdress_api.py b/config/setdress_api.py index 70d8054357..f8985990ea 100644 --- a/config/setdress_api.py +++ b/config/setdress_api.py @@ -137,7 +137,7 @@ def load_package(filepath, name, namespace=None): # manager # for container in containers: # cmds.setAttr("%s.id" % container, - # "colorbleed.setdress.container", + # "studio.setdress.container", # type="string") # TODO: Lock all loaded nodes diff --git a/setup/fusion/scripts/Comp/colorbleed/set_rendermode.py b/setup/fusion/scripts/Comp/colorbleed/set_rendermode.py index 0fbcf1bf86..567dfc2aa7 100644 --- a/setup/fusion/scripts/Comp/colorbleed/set_rendermode.py +++ b/setup/fusion/scripts/Comp/colorbleed/set_rendermode.py @@ -97,11 +97,11 @@ class SetRenderMode(QtWidgets.QWidget): return self._comp.GetAttrs("COMPS_Name") def _get_comp_rendermode(self): - return self._comp.GetData("colorbleed.rendermode") or "renderlocal" + return self._comp.GetData("studio.rendermode") or "renderlocal" def _set_comp_rendermode(self): rendermode = self.mode_options.currentText() - self._comp.SetData("colorbleed.rendermode", rendermode) + self._comp.SetData("studio.rendermode", rendermode) self._comp.Print("Updated render mode to '%s'\n" % rendermode) diff --git a/setup/fusion/scripts/Comp/colorbleed/switch_ui.py b/setup/fusion/scripts/Comp/colorbleed/switch_ui.py index 8f1466abe0..92685a1ef6 100644 --- a/setup/fusion/scripts/Comp/colorbleed/switch_ui.py +++ b/setup/fusion/scripts/Comp/colorbleed/switch_ui.py @@ -154,7 +154,7 @@ class App(QtWidgets.QWidget): asset = self._assets.currentText() - import colorbleed.scripts.fusion_switch_shot as switch_shot + import config.scripts.fusion_switch_shot as switch_shot switch_shot.switch(asset_name=asset, filepath=file_name, new=True) def _get_context_directory(self): From bb17ef72216b5b7ac31cb4dec2022ee5a60b6843 Mon Sep 17 00:00:00 2001 From: Jakub Jezek Date: Thu, 27 Sep 2018 21:28:16 +0200 Subject: [PATCH 3/3] nuke integration wip --- config/__init__.py | 3 + config/action.py | 2 +- config/apps/__init__.py | 0 config/{apps => }/fusion/__init__.py | 0 config/{apps => }/fusion/lib.py | 0 config/{apps => }/maya/__init__.py | 2 +- config/{apps => }/maya/customize.py | 0 config/{apps => }/maya/lib.py | 0 config/{apps => }/maya/menu.json | 0 config/{apps => }/maya/menu.py | 0 config/{apps => }/maya/plugin.py | 0 config/{apps => }/nuke/__init__.py | 42 +- config/{apps => }/nuke/lib.py | 14 +- config/plugins/fusion/load/actions.py | 4 +- config/plugins/global/publish/integrate.py | 2 +- .../maya/create/colorbleed_animation.py | 2 +- .../plugins/maya/create/colorbleed_camera.py | 2 +- config/plugins/maya/create/colorbleed_look.py | 2 +- .../maya/create/colorbleed_mayaascii.py | 2 +- .../maya/create/colorbleed_pointcache.py | 2 +- .../maya/create/colorbleed_yeti_cache.py | 2 +- config/plugins/maya/load/_load_animation.py | 4 +- config/plugins/maya/load/load_alembic.py | 4 +- config/plugins/maya/load/load_camera.py | 4 +- config/plugins/maya/load/load_look.py | 4 +- config/plugins/maya/load/load_mayaascii.py | 6 +- config/plugins/maya/load/load_model.py | 4 +- config/plugins/maya/load/load_rig.py | 4 +- config/plugins/maya/load/load_vrayproxy.py | 2 +- config/plugins/maya/load/load_yeti_cache.py | 2 +- config/plugins/maya/load/load_yeti_rig.py | 4 +- config/plugins/maya/publish/collect_look.py | 2 +- .../maya/publish/collect_render_layer_aovs.py | 2 +- .../maya/publish/collect_renderlayers.py | 2 +- .../plugins/maya/publish/collect_setdress.py | 2 +- .../maya/publish/collect_yeti_cache.py | 2 +- .../plugins/maya/publish/collect_yeti_rig.py | 2 +- .../plugins/maya/publish/extract_animation.py | 2 +- config/plugins/maya/publish/extract_look.py | 2 +- .../maya/publish/extract_maya_ascii_raw.py | 2 +- .../maya/publish/extract_pointcache.py | 2 +- .../plugins/maya/publish/extract_setdress.py | 2 +- .../plugins/maya/publish/extract_yeti_rig.py | 2 +- .../plugins/maya/publish/submit_deadline.py | 2 +- ...date_animation_out_set_related_node_ids.py | 2 +- .../publish/validate_instancer_content.py | 2 +- .../maya/publish/validate_joints_hidden.py | 2 +- .../maya/publish/validate_look_sets.py | 2 +- .../maya/publish/validate_maya_units.py | 2 +- .../publish/validate_mesh_non_zero_edge.py | 2 +- .../publish/validate_mesh_single_uv_set.py | 2 +- .../maya/publish/validate_model_content.py | 2 +- .../plugins/maya/publish/validate_node_ids.py | 2 +- .../validate_node_ids_deformed_shapes.py | 2 +- .../publish/validate_node_ids_in_database.py | 2 +- .../maya/publish/validate_node_ids_related.py | 2 +- .../maya/publish/validate_node_ids_unique.py | 2 +- .../maya/publish/validate_rendersettings.py | 2 +- .../publish/validate_rig_out_set_node_ids.py | 2 +- .../publish/validate_setdress_transforms.py | 4 +- config/plugins/nuke/create/CrateWriteExr.py | 49 ++ .../plugins/nuke/create/create_tiff_saver.py | 45 -- .../nuke/inventory/select_containers.py | 50 +- .../plugins/nuke/inventory/set_tool_color.py | 136 ++--- config/plugins/nuke/load/actions.py | 152 ++--- config/plugins/nuke/load/load_sequence.py | 518 +++++++++--------- config/plugins/nuke/publish/collect_comp.py | 24 - .../nuke/publish/collect_fusion_version.py | 22 - .../plugins/nuke/publish/collect_instances.py | 96 ---- .../nuke/publish/collect_render_target.py | 44 -- .../increment_current_file_deadline.py | 34 -- .../nuke/publish/publish_image_sequences.py | 98 ---- config/plugins/nuke/publish/render_local.py | 42 -- config/plugins/nuke/publish/save_scene.py | 21 - .../plugins/nuke/publish/submit_deadline.py | 149 ----- .../nuke/publish/validate_background_depth.py | 40 -- .../nuke/publish/validate_comp_saved.py | 29 - .../publish/validate_create_folder_checked.py | 41 -- .../validate_filename_has_extension.py | 36 -- .../nuke/publish/validate_saver_has_input.py | 29 - .../publish/validate_saver_passthrough.py | 44 -- .../nuke/publish/validate_unique_subsets.py | 29 - config/scripts/fusion_switch_shot.py | 2 +- config/setdress_api.py | 6 +- 84 files changed, 571 insertions(+), 1344 deletions(-) delete mode 100644 config/apps/__init__.py rename config/{apps => }/fusion/__init__.py (100%) rename config/{apps => }/fusion/lib.py (100%) rename config/{apps => }/maya/__init__.py (99%) rename config/{apps => }/maya/customize.py (100%) rename config/{apps => }/maya/lib.py (100%) rename config/{apps => }/maya/menu.json (100%) rename config/{apps => }/maya/menu.py (100%) rename config/{apps => }/maya/plugin.py (100%) rename config/{apps => }/nuke/__init__.py (60%) rename config/{apps => }/nuke/lib.py (82%) create mode 100644 config/plugins/nuke/create/CrateWriteExr.py delete mode 100644 config/plugins/nuke/create/create_tiff_saver.py delete mode 100644 config/plugins/nuke/publish/collect_comp.py delete mode 100644 config/plugins/nuke/publish/collect_fusion_version.py delete mode 100644 config/plugins/nuke/publish/collect_instances.py delete mode 100644 config/plugins/nuke/publish/collect_render_target.py delete mode 100644 config/plugins/nuke/publish/increment_current_file_deadline.py delete mode 100644 config/plugins/nuke/publish/publish_image_sequences.py delete mode 100644 config/plugins/nuke/publish/render_local.py delete mode 100644 config/plugins/nuke/publish/save_scene.py delete mode 100644 config/plugins/nuke/publish/submit_deadline.py delete mode 100644 config/plugins/nuke/publish/validate_background_depth.py delete mode 100644 config/plugins/nuke/publish/validate_comp_saved.py delete mode 100644 config/plugins/nuke/publish/validate_create_folder_checked.py delete mode 100644 config/plugins/nuke/publish/validate_filename_has_extension.py delete mode 100644 config/plugins/nuke/publish/validate_saver_has_input.py delete mode 100644 config/plugins/nuke/publish/validate_saver_passthrough.py delete mode 100644 config/plugins/nuke/publish/validate_unique_subsets.py diff --git a/config/__init__.py b/config/__init__.py index e5d1aee374..14af2ee736 100644 --- a/config/__init__.py +++ b/config/__init__.py @@ -1,4 +1,7 @@ import os +import sys + +import imp from pyblish import api as pyblish from avalon import api as avalon diff --git a/config/action.py b/config/action.py index 1b9dfbf07e..8dc41900cd 100644 --- a/config/action.py +++ b/config/action.py @@ -192,7 +192,7 @@ class GenerateUUIDsOnInvalidAction(pyblish.api.Action): nodes (list): all nodes to regenerate ids on """ - import config.apps.maya.lib as lib + import config.maya.lib as lib import avalon.io as io asset = instance.data['asset'] diff --git a/config/apps/__init__.py b/config/apps/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/config/apps/fusion/__init__.py b/config/fusion/__init__.py similarity index 100% rename from config/apps/fusion/__init__.py rename to config/fusion/__init__.py diff --git a/config/apps/fusion/lib.py b/config/fusion/lib.py similarity index 100% rename from config/apps/fusion/lib.py rename to config/fusion/lib.py diff --git a/config/apps/maya/__init__.py b/config/maya/__init__.py similarity index 99% rename from config/apps/maya/__init__.py rename to config/maya/__init__.py index f4eec3cde1..b603f3edc1 100644 --- a/config/apps/maya/__init__.py +++ b/config/maya/__init__.py @@ -14,7 +14,7 @@ from ..lib import ( from . import menu from . import lib -log = logging.getLogger("config.apps.maya") +log = logging.getLogger("config.maya") PARENT_DIR = os.path.dirname(__file__) PACKAGE_DIR = os.path.dirname(PARENT_DIR) diff --git a/config/apps/maya/customize.py b/config/maya/customize.py similarity index 100% rename from config/apps/maya/customize.py rename to config/maya/customize.py diff --git a/config/apps/maya/lib.py b/config/maya/lib.py similarity index 100% rename from config/apps/maya/lib.py rename to config/maya/lib.py diff --git a/config/apps/maya/menu.json b/config/maya/menu.json similarity index 100% rename from config/apps/maya/menu.json rename to config/maya/menu.json diff --git a/config/apps/maya/menu.py b/config/maya/menu.py similarity index 100% rename from config/apps/maya/menu.py rename to config/maya/menu.py diff --git a/config/apps/maya/plugin.py b/config/maya/plugin.py similarity index 100% rename from config/apps/maya/plugin.py rename to config/maya/plugin.py diff --git a/config/apps/nuke/__init__.py b/config/nuke/__init__.py similarity index 60% rename from config/apps/nuke/__init__.py rename to config/nuke/__init__.py index b7b4b2d507..9e6721cb15 100644 --- a/config/apps/nuke/__init__.py +++ b/config/nuke/__init__.py @@ -3,19 +3,18 @@ import os from avalon import api as avalon from pyblish import api as pyblish - PARENT_DIR = os.path.dirname(__file__) PACKAGE_DIR = os.path.dirname(PARENT_DIR) PLUGINS_DIR = os.path.join(PACKAGE_DIR, "plugins") -PUBLISH_PATH = os.path.join(PLUGINS_DIR, "fusion", "publish") -LOAD_PATH = os.path.join(PLUGINS_DIR, "fusion", "load") -CREATE_PATH = os.path.join(PLUGINS_DIR, "fusion", "create") -INVENTORY_PATH = os.path.join(PLUGINS_DIR, "fusion", "inventory") +PUBLISH_PATH = os.path.join(PLUGINS_DIR, "nuke", "publish") +LOAD_PATH = os.path.join(PLUGINS_DIR, "nuke", "load") +CREATE_PATH = os.path.join(PLUGINS_DIR, "nuke", "create") +INVENTORY_PATH = os.path.join(PLUGINS_DIR, "nuke", "inventory") def install(): - print("Registering Fusion plug-ins..") + print("Registering Nuke plug-ins..") pyblish.register_plugin_path(PUBLISH_PATH) avalon.register_plugin_path(avalon.Loader, LOAD_PATH) avalon.register_plugin_path(avalon.Creator, CREATE_PATH) @@ -33,7 +32,7 @@ def install(): def uninstall(): - print("Deregistering Fusion plug-ins..") + print("Deregistering Nuke plug-ins..") pyblish.deregister_plugin_path(PUBLISH_PATH) avalon.deregister_plugin_path(avalon.Loader, LOAD_PATH) avalon.deregister_plugin_path(avalon.Creator, CREATE_PATH) @@ -44,24 +43,23 @@ def uninstall(): def on_pyblish_instance_toggled(instance, new_value, old_value): """Toggle saver tool passthrough states on instance toggles.""" - from avalon.fusion import comp_lock_and_undo_chunk + from avalon.nuke import viewer_update_and_undo_stop, add_publish_knob, log - comp = instance.context.data.get("currentComp") - if not comp: - return - - savers = [tool for tool in instance if - getattr(tool, "ID", None) == "Saver"] - if not savers: + writes = [n for n in instance if + n.Class() == "Write"] + if not writes: return # Whether instances should be passthrough based on new value passthrough = not new_value - with comp_lock_and_undo_chunk(comp, - undo_queue_name="Change instance " - "active state"): - for tool in savers: - attrs = tool.GetAttrs() - current = attrs["TOOLB_PassThrough"] + with viewer_update_and_undo_stop(): + for n in writes: + try: + n["publish"].value() + except ValueError: + n = add_publish_knob(n) + log.info(" `Publish` knob was added to write node..") + + current = n["publish"].value() if current != passthrough: - tool.SetAttrs({"TOOLB_PassThrough": passthrough}) + n["publish"].setValue(passthrough) diff --git a/config/apps/nuke/lib.py b/config/nuke/lib.py similarity index 82% rename from config/apps/nuke/lib.py rename to config/nuke/lib.py index f2846c966a..07c540ed41 100644 --- a/config/apps/nuke/lib.py +++ b/config/nuke/lib.py @@ -1,14 +1,14 @@ import sys from avalon.vendor.Qt import QtGui -import avalon.fusion +import avalon.nuke self = sys.modules[__name__] self._project = None -def update_frame_range(start, end, comp=None, set_render_range=True): +def update_frame_range(start, end, root=None, set_render_range=True): """Set Fusion comp's start and end frame range Args: @@ -23,21 +23,21 @@ def update_frame_range(start, end, comp=None, set_render_range=True): """ - if not comp: - comp = avalon.fusion.get_current_comp() + if not root: + root, nodes = avalon.nuke.get_current_comp() - attrs = { + knobs = { "COMPN_GlobalStart": start, "COMPN_GlobalEnd": end } if set_render_range: - attrs.update({ + knobs.update({ "COMPN_RenderStart": start, "COMPN_RenderEnd": end }) - with avalon.fusion.comp_lock_and_undo_chunk(comp): + with avalon.nuke.comp_lock_and_undo_chunk(): comp.SetAttrs(attrs) diff --git a/config/plugins/fusion/load/actions.py b/config/plugins/fusion/load/actions.py index fa0e506ee2..5f30cde963 100644 --- a/config/plugins/fusion/load/actions.py +++ b/config/plugins/fusion/load/actions.py @@ -22,7 +22,7 @@ class FusionSetFrameRangeLoader(api.Loader): def load(self, context, name, namespace, data): - from config.apps.fusion import lib + from config.fusion import lib version = context['version'] version_data = version.get("data", {}) @@ -55,7 +55,7 @@ class FusionSetFrameRangeWithHandlesLoader(api.Loader): def load(self, context, name, namespace, data): - from config.apps.fusion import lib + from config.fusion import lib version = context['version'] version_data = version.get("data", {}) diff --git a/config/plugins/global/publish/integrate.py b/config/plugins/global/publish/integrate.py index dbabc73fa4..18015e2090 100644 --- a/config/plugins/global/publish/integrate.py +++ b/config/plugins/global/publish/integrate.py @@ -27,7 +27,7 @@ class IntegrateAsset(pyblish.api.InstancePlugin): "studio.camera", "studio.imagesequence", "studio.look", - "config.apps.mayaAscii", + "config.mayaAscii", "studio.model", "studio.pointcache", "studio.setdress", diff --git a/config/plugins/maya/create/colorbleed_animation.py b/config/plugins/maya/create/colorbleed_animation.py index 67d8583056..4ce24f6e89 100644 --- a/config/plugins/maya/create/colorbleed_animation.py +++ b/config/plugins/maya/create/colorbleed_animation.py @@ -1,7 +1,7 @@ from collections import OrderedDict import avalon.maya -from config.apps.maya import lib +from config.maya import lib class CreateAnimation(avalon.maya.Creator): diff --git a/config/plugins/maya/create/colorbleed_camera.py b/config/plugins/maya/create/colorbleed_camera.py index d4c9c4c795..d06128200f 100644 --- a/config/plugins/maya/create/colorbleed_camera.py +++ b/config/plugins/maya/create/colorbleed_camera.py @@ -1,6 +1,6 @@ from collections import OrderedDict import avalon.maya -from config.apps.maya import lib +from config.maya import lib class CreateCamera(avalon.maya.Creator): diff --git a/config/plugins/maya/create/colorbleed_look.py b/config/plugins/maya/create/colorbleed_look.py index 34c71d40d9..0ca2dcdc1b 100644 --- a/config/plugins/maya/create/colorbleed_look.py +++ b/config/plugins/maya/create/colorbleed_look.py @@ -1,6 +1,6 @@ from collections import OrderedDict import avalon.maya -from config.apps.maya import lib +from config.maya import lib class CreateLook(avalon.maya.Creator): diff --git a/config/plugins/maya/create/colorbleed_mayaascii.py b/config/plugins/maya/create/colorbleed_mayaascii.py index 57738af769..1822b7bdd5 100644 --- a/config/plugins/maya/create/colorbleed_mayaascii.py +++ b/config/plugins/maya/create/colorbleed_mayaascii.py @@ -6,5 +6,5 @@ class CreateMayaAscii(avalon.maya.Creator): name = "mayaAscii" label = "Maya Ascii" - family = "config.apps.mayaAscii" + family = "config.mayaAscii" icon = "file-archive-o" diff --git a/config/plugins/maya/create/colorbleed_pointcache.py b/config/plugins/maya/create/colorbleed_pointcache.py index 590e97cbe7..b1fe062530 100644 --- a/config/plugins/maya/create/colorbleed_pointcache.py +++ b/config/plugins/maya/create/colorbleed_pointcache.py @@ -1,7 +1,7 @@ from collections import OrderedDict import avalon.maya -from config.apps.maya import lib +from config.maya import lib class CreatePointCache(avalon.maya.Creator): diff --git a/config/plugins/maya/create/colorbleed_yeti_cache.py b/config/plugins/maya/create/colorbleed_yeti_cache.py index c73895605b..1eefa07a54 100644 --- a/config/plugins/maya/create/colorbleed_yeti_cache.py +++ b/config/plugins/maya/create/colorbleed_yeti_cache.py @@ -1,7 +1,7 @@ from collections import OrderedDict import avalon.maya -from config.apps.maya import lib +from config.maya import lib class CreateYetiCache(avalon.maya.Creator): diff --git a/config/plugins/maya/load/_load_animation.py b/config/plugins/maya/load/_load_animation.py index dfd1a5335c..0eaf47d667 100644 --- a/config/plugins/maya/load/_load_animation.py +++ b/config/plugins/maya/load/_load_animation.py @@ -1,7 +1,7 @@ -import config.apps.maya.plugin +import config.maya.plugin -class AbcLoader(config.apps.maya.plugin.ReferenceLoader): +class AbcLoader(config.maya.plugin.ReferenceLoader): """Specific loader of Alembic for the avalon.animation family""" families = ["studio.animation", diff --git a/config/plugins/maya/load/load_alembic.py b/config/plugins/maya/load/load_alembic.py index f9d75225a7..ee06e067a0 100644 --- a/config/plugins/maya/load/load_alembic.py +++ b/config/plugins/maya/load/load_alembic.py @@ -1,7 +1,7 @@ -import config.apps.maya.plugin +import config.maya.plugin -class AbcLoader(config.apps.maya.plugin.ReferenceLoader): +class AbcLoader(config.maya.plugin.ReferenceLoader): """Specific loader of Alembic for the avalon.animation family""" families = ["studio.animation", diff --git a/config/plugins/maya/load/load_camera.py b/config/plugins/maya/load/load_camera.py index 9871a1b676..05b08b446b 100644 --- a/config/plugins/maya/load/load_camera.py +++ b/config/plugins/maya/load/load_camera.py @@ -1,7 +1,7 @@ -import config.apps.maya.plugin +import config.maya.plugin -class CameraLoader(config.apps.maya.plugin.ReferenceLoader): +class CameraLoader(config.maya.plugin.ReferenceLoader): """Specific loader of Alembic for the avalon.animation family""" families = ["studio.camera"] diff --git a/config/plugins/maya/load/load_look.py b/config/plugins/maya/load/load_look.py index 721d7cf5f6..c34a67e7b8 100644 --- a/config/plugins/maya/load/load_look.py +++ b/config/plugins/maya/load/load_look.py @@ -1,7 +1,7 @@ -import config.apps.maya.plugin +import config.maya.plugin -class LookLoader(config.apps.maya.plugin.ReferenceLoader): +class LookLoader(config.maya.plugin.ReferenceLoader): """Specific loader for lookdev""" families = ["studio.look"] diff --git a/config/plugins/maya/load/load_mayaascii.py b/config/plugins/maya/load/load_mayaascii.py index c48d3370b5..4af035b55d 100644 --- a/config/plugins/maya/load/load_mayaascii.py +++ b/config/plugins/maya/load/load_mayaascii.py @@ -1,10 +1,10 @@ -import config.apps.maya.plugin +import config.maya.plugin -class MayaAsciiLoader(config.apps.maya.plugin.ReferenceLoader): +class MayaAsciiLoader(config.maya.plugin.ReferenceLoader): """Load the model""" - families = ["config.apps.mayaAscii"] + families = ["config.mayaAscii"] representations = ["ma"] label = "Reference Maya Ascii" diff --git a/config/plugins/maya/load/load_model.py b/config/plugins/maya/load/load_model.py index bf2d57641f..58b888057d 100644 --- a/config/plugins/maya/load/load_model.py +++ b/config/plugins/maya/load/load_model.py @@ -1,8 +1,8 @@ from avalon import api -import config.apps.maya.plugin +import config.maya.plugin -class ModelLoader(config.apps.maya.plugin.ReferenceLoader): +class ModelLoader(config.maya.plugin.ReferenceLoader): """Load the model""" families = ["studio.model"] diff --git a/config/plugins/maya/load/load_rig.py b/config/plugins/maya/load/load_rig.py index e4333362fd..3f472a05da 100644 --- a/config/plugins/maya/load/load_rig.py +++ b/config/plugins/maya/load/load_rig.py @@ -1,10 +1,10 @@ from maya import cmds -import config.apps.maya.plugin +import config.maya.plugin from avalon import api, maya -class RigLoader(config.apps.maya.plugin.ReferenceLoader): +class RigLoader(config.maya.plugin.ReferenceLoader): """Specific loader for rigs This automatically creates an instance for animators upon load. diff --git a/config/plugins/maya/load/load_vrayproxy.py b/config/plugins/maya/load/load_vrayproxy.py index d2dafdc538..5a7722df47 100644 --- a/config/plugins/maya/load/load_vrayproxy.py +++ b/config/plugins/maya/load/load_vrayproxy.py @@ -18,7 +18,7 @@ class VRayProxyLoader(api.Loader): def load(self, context, name, namespace, data): from avalon.maya.pipeline import containerise - from config.apps.maya.lib import namespaced + from config.maya.lib import namespaced asset_name = context['asset']["name"] namespace = namespace or lib.unique_namespace( diff --git a/config/plugins/maya/load/load_yeti_cache.py b/config/plugins/maya/load/load_yeti_cache.py index 1ff2db4228..a79315b039 100644 --- a/config/plugins/maya/load/load_yeti_cache.py +++ b/config/plugins/maya/load/load_yeti_cache.py @@ -8,7 +8,7 @@ from maya import cmds from avalon import api from avalon.maya import lib as avalon_lib, pipeline -from config.apps.maya import lib +from config.maya import lib class YetiCacheLoader(api.Loader): diff --git a/config/plugins/maya/load/load_yeti_rig.py b/config/plugins/maya/load/load_yeti_rig.py index 139dbdb26b..78f203d0bc 100644 --- a/config/plugins/maya/load/load_yeti_rig.py +++ b/config/plugins/maya/load/load_yeti_rig.py @@ -1,7 +1,7 @@ -import config.apps.maya.plugin +import config.maya.plugin -class YetiRigLoader(config.apps.maya.plugin.ReferenceLoader): +class YetiRigLoader(config.maya.plugin.ReferenceLoader): families = ["studio.yetiRig"] representations = ["ma"] diff --git a/config/plugins/maya/publish/collect_look.py b/config/plugins/maya/publish/collect_look.py index d8bb9f6e87..d132e25b01 100644 --- a/config/plugins/maya/publish/collect_look.py +++ b/config/plugins/maya/publish/collect_look.py @@ -1,6 +1,6 @@ from maya import cmds import pyblish.api -import config.apps.maya.lib as lib +import config.maya.lib as lib from cb.utils.maya import context, shaders SHAPE_ATTRS = ["castsShadows", diff --git a/config/plugins/maya/publish/collect_render_layer_aovs.py b/config/plugins/maya/publish/collect_render_layer_aovs.py index 64ec8e9812..69edde6d19 100644 --- a/config/plugins/maya/publish/collect_render_layer_aovs.py +++ b/config/plugins/maya/publish/collect_render_layer_aovs.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api -import config.apps.maya.lib as lib +import config.maya.lib as lib class CollectRenderLayerAOVS(pyblish.api.InstancePlugin): diff --git a/config/plugins/maya/publish/collect_renderlayers.py b/config/plugins/maya/publish/collect_renderlayers.py index f0ea0204db..6577eaf136 100644 --- a/config/plugins/maya/publish/collect_renderlayers.py +++ b/config/plugins/maya/publish/collect_renderlayers.py @@ -3,7 +3,7 @@ from maya import cmds import pyblish.api from avalon import maya, api -import config.apps.maya.lib as lib +import config.maya.lib as lib class CollectMayaRenderlayers(pyblish.api.ContextPlugin): diff --git a/config/plugins/maya/publish/collect_setdress.py b/config/plugins/maya/publish/collect_setdress.py index 86e3bd570c..e5137b76f6 100644 --- a/config/plugins/maya/publish/collect_setdress.py +++ b/config/plugins/maya/publish/collect_setdress.py @@ -3,7 +3,7 @@ import pyblish.api from maya import cmds, mel from avalon import maya as avalon -from config.apps.maya import lib +from config.maya import lib # TODO : Publish of setdress: -unique namespace for all assets, VALIDATOR! diff --git a/config/plugins/maya/publish/collect_yeti_cache.py b/config/plugins/maya/publish/collect_yeti_cache.py index 2212fa594f..6037724eb2 100644 --- a/config/plugins/maya/publish/collect_yeti_cache.py +++ b/config/plugins/maya/publish/collect_yeti_cache.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api -from config.apps.maya import lib +from config.maya import lib SETTINGS = {"renderDensity", "renderWidth", diff --git a/config/plugins/maya/publish/collect_yeti_rig.py b/config/plugins/maya/publish/collect_yeti_rig.py index cf1a0182ef..b439584146 100644 --- a/config/plugins/maya/publish/collect_yeti_rig.py +++ b/config/plugins/maya/publish/collect_yeti_rig.py @@ -5,7 +5,7 @@ from maya import cmds import pyblish.api -from config.apps.maya import lib +from config.maya import lib SETTINGS = {"renderDensity", diff --git a/config/plugins/maya/publish/extract_animation.py b/config/plugins/maya/publish/extract_animation.py index 127ec3654b..5964156b4c 100644 --- a/config/plugins/maya/publish/extract_animation.py +++ b/config/plugins/maya/publish/extract_animation.py @@ -4,7 +4,7 @@ from maya import cmds import avalon.maya import config.api -from config.apps.maya.lib import extract_alembic +from config.maya.lib import extract_alembic class ExtractColorbleedAnimation(config.api.Extractor): diff --git a/config/plugins/maya/publish/extract_look.py b/config/plugins/maya/publish/extract_look.py index 83bce5bf60..d4bbafc4eb 100644 --- a/config/plugins/maya/publish/extract_look.py +++ b/config/plugins/maya/publish/extract_look.py @@ -7,7 +7,7 @@ from maya import cmds import pyblish.api import avalon.maya import config.api -import config.apps.maya.lib as maya +import config.maya.lib as maya from cb.utils.maya import context diff --git a/config/plugins/maya/publish/extract_maya_ascii_raw.py b/config/plugins/maya/publish/extract_maya_ascii_raw.py index b0a5e854de..17926b6fad 100644 --- a/config/plugins/maya/publish/extract_maya_ascii_raw.py +++ b/config/plugins/maya/publish/extract_maya_ascii_raw.py @@ -15,7 +15,7 @@ class ExtractMayaAsciiRaw(config.api.Extractor): label = "Maya ASCII (Raw)" hosts = ["maya"] - families = ["config.apps.mayaAscii"] + families = ["config.mayaAscii"] def process(self, instance): diff --git a/config/plugins/maya/publish/extract_pointcache.py b/config/plugins/maya/publish/extract_pointcache.py index bd3447fc3e..95f9fc6818 100644 --- a/config/plugins/maya/publish/extract_pointcache.py +++ b/config/plugins/maya/publish/extract_pointcache.py @@ -4,7 +4,7 @@ from maya import cmds import avalon.maya import config.api -from config.apps.maya.lib import extract_alembic +from config.maya.lib import extract_alembic class ExtractColorbleedAlembic(config.api.Extractor): diff --git a/config/plugins/maya/publish/extract_setdress.py b/config/plugins/maya/publish/extract_setdress.py index 1291514e56..85daf89dd3 100644 --- a/config/plugins/maya/publish/extract_setdress.py +++ b/config/plugins/maya/publish/extract_setdress.py @@ -3,7 +3,7 @@ import json import os import config.api -from config.apps.maya.lib import extract_alembic +from config.maya.lib import extract_alembic from maya import cmds diff --git a/config/plugins/maya/publish/extract_yeti_rig.py b/config/plugins/maya/publish/extract_yeti_rig.py index f0df3ec3c9..78f3c2ce97 100644 --- a/config/plugins/maya/publish/extract_yeti_rig.py +++ b/config/plugins/maya/publish/extract_yeti_rig.py @@ -6,7 +6,7 @@ from maya import cmds import avalon.maya.lib as lib import config.api -import config.apps.maya.lib as maya +import config.maya.lib as maya @contextlib.contextmanager diff --git a/config/plugins/maya/publish/submit_deadline.py b/config/plugins/maya/publish/submit_deadline.py index ae5d05ce81..2d0fb8bc2b 100644 --- a/config/plugins/maya/publish/submit_deadline.py +++ b/config/plugins/maya/publish/submit_deadline.py @@ -9,7 +9,7 @@ from avalon.vendor import requests import pyblish.api -import config.apps.maya.lib as lib +import config.maya.lib as lib def get_renderer_variables(renderlayer=None): diff --git a/config/plugins/maya/publish/validate_animation_out_set_related_node_ids.py b/config/plugins/maya/publish/validate_animation_out_set_related_node_ids.py index c38158861f..e74e42d5cf 100644 --- a/config/plugins/maya/publish/validate_animation_out_set_related_node_ids.py +++ b/config/plugins/maya/publish/validate_animation_out_set_related_node_ids.py @@ -2,7 +2,7 @@ import maya.cmds as cmds import pyblish.api import config.api -import config.apps.maya.lib as lib +import config.maya.lib as lib class ValidateOutRelatedNodeIds(pyblish.api.InstancePlugin): diff --git a/config/plugins/maya/publish/validate_instancer_content.py b/config/plugins/maya/publish/validate_instancer_content.py index 5ed1aaa886..a27e4e42a0 100644 --- a/config/plugins/maya/publish/validate_instancer_content.py +++ b/config/plugins/maya/publish/validate_instancer_content.py @@ -1,7 +1,7 @@ import maya.cmds as cmds import pyblish.api -import config.apps.maya.lib as lib +import config.maya.lib as lib class ValidateInstancerContent(pyblish.api.InstancePlugin): diff --git a/config/plugins/maya/publish/validate_joints_hidden.py b/config/plugins/maya/publish/validate_joints_hidden.py index 6eb4ecb25c..3f18833c4a 100644 --- a/config/plugins/maya/publish/validate_joints_hidden.py +++ b/config/plugins/maya/publish/validate_joints_hidden.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import config.api -import config.apps.maya.lib as lib +import config.maya.lib as lib class ValidateJointsHidden(pyblish.api.InstancePlugin): diff --git a/config/plugins/maya/publish/validate_look_sets.py b/config/plugins/maya/publish/validate_look_sets.py index d23e080b25..3f55ceb147 100644 --- a/config/plugins/maya/publish/validate_look_sets.py +++ b/config/plugins/maya/publish/validate_look_sets.py @@ -1,4 +1,4 @@ -from config.apps.maya import lib +from config.maya import lib import pyblish.api import config.api diff --git a/config/plugins/maya/publish/validate_maya_units.py b/config/plugins/maya/publish/validate_maya_units.py index 7fa60b7681..6496416e0c 100644 --- a/config/plugins/maya/publish/validate_maya_units.py +++ b/config/plugins/maya/publish/validate_maya_units.py @@ -3,7 +3,7 @@ import maya.cmds as cmds import pyblish.api import config.api from config import lib -import config.apps.maya.lib as mayalib +import config.maya.lib as mayalib class ValidateMayaUnits(pyblish.api.ContextPlugin): diff --git a/config/plugins/maya/publish/validate_mesh_non_zero_edge.py b/config/plugins/maya/publish/validate_mesh_non_zero_edge.py index bed9b7fa32..4f192d48d0 100644 --- a/config/plugins/maya/publish/validate_mesh_non_zero_edge.py +++ b/config/plugins/maya/publish/validate_mesh_non_zero_edge.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import config.api -import config.apps.maya.lib as lib +import config.maya.lib as lib class ValidateMeshNonZeroEdgeLength(pyblish.api.InstancePlugin): diff --git a/config/plugins/maya/publish/validate_mesh_single_uv_set.py b/config/plugins/maya/publish/validate_mesh_single_uv_set.py index 333e76dee1..e69924b0d4 100644 --- a/config/plugins/maya/publish/validate_mesh_single_uv_set.py +++ b/config/plugins/maya/publish/validate_mesh_single_uv_set.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import config.api -import config.apps.maya.lib as lib +import config.maya.lib as lib class ValidateMeshSingleUVSet(pyblish.api.InstancePlugin): diff --git a/config/plugins/maya/publish/validate_model_content.py b/config/plugins/maya/publish/validate_model_content.py index 8f95ec72c4..361bcd052d 100644 --- a/config/plugins/maya/publish/validate_model_content.py +++ b/config/plugins/maya/publish/validate_model_content.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import config.api -import config.apps.maya.lib as lib +import config.maya.lib as lib class ValidateModelContent(pyblish.api.InstancePlugin): diff --git a/config/plugins/maya/publish/validate_node_ids.py b/config/plugins/maya/publish/validate_node_ids.py index 79349fe017..0ddebe7462 100644 --- a/config/plugins/maya/publish/validate_node_ids.py +++ b/config/plugins/maya/publish/validate_node_ids.py @@ -1,7 +1,7 @@ import pyblish.api import config.api -from config.apps.maya import lib +from config.maya import lib class ValidateNodeIDs(pyblish.api.InstancePlugin): diff --git a/config/plugins/maya/publish/validate_node_ids_deformed_shapes.py b/config/plugins/maya/publish/validate_node_ids_deformed_shapes.py index 290c89b15f..6c9e928f17 100644 --- a/config/plugins/maya/publish/validate_node_ids_deformed_shapes.py +++ b/config/plugins/maya/publish/validate_node_ids_deformed_shapes.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api import config.api -import config.apps.maya.lib as lib +import config.maya.lib as lib class ValidateNodeIdsDeformedShape(pyblish.api.InstancePlugin): diff --git a/config/plugins/maya/publish/validate_node_ids_in_database.py b/config/plugins/maya/publish/validate_node_ids_in_database.py index b7a7d75e35..8607e06486 100644 --- a/config/plugins/maya/publish/validate_node_ids_in_database.py +++ b/config/plugins/maya/publish/validate_node_ids_in_database.py @@ -3,7 +3,7 @@ import pyblish.api import avalon.io as io import config.api -from config.apps.maya import lib +from config.maya import lib class ValidateNodeIdsInDatabase(pyblish.api.InstancePlugin): diff --git a/config/plugins/maya/publish/validate_node_ids_related.py b/config/plugins/maya/publish/validate_node_ids_related.py index 3d9363dd72..a0720e084d 100644 --- a/config/plugins/maya/publish/validate_node_ids_related.py +++ b/config/plugins/maya/publish/validate_node_ids_related.py @@ -3,7 +3,7 @@ import config.api import avalon.io as io -from config.apps.maya import lib +from config.maya import lib class ValidateNodeIDsRelated(pyblish.api.InstancePlugin): diff --git a/config/plugins/maya/publish/validate_node_ids_unique.py b/config/plugins/maya/publish/validate_node_ids_unique.py index 89a355e817..1cda2dae54 100644 --- a/config/plugins/maya/publish/validate_node_ids_unique.py +++ b/config/plugins/maya/publish/validate_node_ids_unique.py @@ -2,7 +2,7 @@ from collections import defaultdict import pyblish.api import config.api -import config.apps.maya.lib as lib +import config.maya.lib as lib class ValidateNodeIdsUnique(pyblish.api.InstancePlugin): diff --git a/config/plugins/maya/publish/validate_rendersettings.py b/config/plugins/maya/publish/validate_rendersettings.py index 65be0b0cd2..861cd2edc4 100644 --- a/config/plugins/maya/publish/validate_rendersettings.py +++ b/config/plugins/maya/publish/validate_rendersettings.py @@ -2,7 +2,7 @@ import maya.cmds as cmds import pyblish.api import config.api -import config.apps.maya.lib as lib +import config.maya.lib as lib class ValidateRenderSettings(pyblish.api.InstancePlugin): diff --git a/config/plugins/maya/publish/validate_rig_out_set_node_ids.py b/config/plugins/maya/publish/validate_rig_out_set_node_ids.py index 1d841d0e96..c4d2abf7ab 100644 --- a/config/plugins/maya/publish/validate_rig_out_set_node_ids.py +++ b/config/plugins/maya/publish/validate_rig_out_set_node_ids.py @@ -2,7 +2,7 @@ import maya.cmds as cmds import pyblish.api import config.api -import config.apps.maya.lib as lib +import config.maya.lib as lib class ValidateRigOutSetNodeIds(pyblish.api.InstancePlugin): diff --git a/config/plugins/maya/publish/validate_setdress_transforms.py b/config/plugins/maya/publish/validate_setdress_transforms.py index 73ee6bfcb0..6a20fbd28b 100644 --- a/config/plugins/maya/publish/validate_setdress_transforms.py +++ b/config/plugins/maya/publish/validate_setdress_transforms.py @@ -42,7 +42,7 @@ class ValidateSetDressModelTransforms(pyblish.api.InstancePlugin): @classmethod def get_invalid(cls, instance): - import config.apps.maya.lib as lib + import config.maya.lib as lib # Get all transforms in the loaded containers container_roots = cmds.listRelatives(instance.data["hierarchy"], @@ -87,7 +87,7 @@ class ValidateSetDressModelTransforms(pyblish.api.InstancePlugin): """ - import config.apps.maya.lib as lib + import config.maya.lib as lib from avalon.vendor.Qt import QtWidgets # Store namespace in variable, cosmetics thingy diff --git a/config/plugins/nuke/create/CrateWriteExr.py b/config/plugins/nuke/create/CrateWriteExr.py new file mode 100644 index 0000000000..b9b7224101 --- /dev/null +++ b/config/plugins/nuke/create/CrateWriteExr.py @@ -0,0 +1,49 @@ +import os +import sys +import avalon.api +import avalon.nuke + + +class CrateWriteExr(avalon.api.Creator): + name = "Write_exr" + label = "Create Write: exr" + hosts = ["nuke"] + family = "studio.write" + icon = "sign-out" + + # def __init__(self, *args, **kwargs): + # super(CrateWriteExr, self).__init__(*args, **kwargs) + # self.data.setdefault("subset", "this") + + def process(self): + nuke = getattr(sys.modules["__main__"], "nuke", None) + data = {} + ext = "exr" + root, nodes = avalon.nuke.get_current_script(nuke=nuke) + + # 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(nuke): + 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 diff --git a/config/plugins/nuke/create/create_tiff_saver.py b/config/plugins/nuke/create/create_tiff_saver.py deleted file mode 100644 index d8b5288429..0000000000 --- a/config/plugins/nuke/create/create_tiff_saver.py +++ /dev/null @@ -1,45 +0,0 @@ -import os - -import avalon.api -from avalon import fusion - - -class CreateTiffSaver(avalon.api.Creator): - - name = "tiffDefault" - label = "Create Tiff Saver" - hosts = ["fusion"] - family = "studio.saver" - - def process(self): - - file_format = "TiffFormat" - - comp = fusion.get_current_comp() - - # todo: improve method of getting current environment - # todo: pref avalon.Session over os.environ - - workdir = os.path.normpath(os.environ["AVALON_WORKDIR"]) - - filename = "{}..tiff".format(self.name) - filepath = os.path.join(workdir, "render", "preview", filename) - - with fusion.comp_lock_and_undo_chunk(comp): - args = (-32768, -32768) # Magical position numbers - saver = comp.AddTool("Saver", *args) - saver.SetAttrs({"TOOLS_Name": self.name}) - - # Setting input attributes is different from basic attributes - # Not confused with "MainInputAttributes" which - saver["Clip"] = filepath - saver["OutputFormat"] = file_format - - # # # Set standard TIFF settings - if saver[file_format] is None: - raise RuntimeError("File format is not set to TiffFormat, " - "this is a bug") - - # Set file format attributes - saver[file_format]["Depth"] = 1 # int8 | int16 | float32 | other - saver[file_format]["SaveAlpha"] = 0 diff --git a/config/plugins/nuke/inventory/select_containers.py b/config/plugins/nuke/inventory/select_containers.py index 2f7b3e5809..1f00dc7d2e 100644 --- a/config/plugins/nuke/inventory/select_containers.py +++ b/config/plugins/nuke/inventory/select_containers.py @@ -1,25 +1,25 @@ -from avalon import api - - -class FusionSelectContainers(api.InventoryAction): - - label = "Select Containers" - icon = "mouse-pointer" - color = "#d8d8d8" - - def process(self, containers): - - import avalon.fusion - - tools = [i["_tool"] for i in containers] - - comp = avalon.fusion.get_current_comp() - flow = comp.CurrentFrame.FlowView - - with avalon.fusion.comp_lock_and_undo_chunk(comp, self.label): - # Clear selection - flow.Select() - - # Select tool - for tool in tools: - flow.Select(tool) +# from avalon import api +# +# +# class FusionSelectContainers(api.InventoryAction): +# +# label = "Select Containers" +# icon = "mouse-pointer" +# color = "#d8d8d8" +# +# def process(self, containers): +# +# import avalon.fusion +# +# tools = [i["_tool"] for i in containers] +# +# comp = avalon.fusion.get_current_comp() +# flow = comp.CurrentFrame.FlowView +# +# with avalon.fusion.comp_lock_and_undo_chunk(comp, self.label): +# # Clear selection +# flow.Select() +# +# # Select tool +# for tool in tools: +# flow.Select(tool) diff --git a/config/plugins/nuke/inventory/set_tool_color.py b/config/plugins/nuke/inventory/set_tool_color.py index 940a0e9941..725a3f3e74 100644 --- a/config/plugins/nuke/inventory/set_tool_color.py +++ b/config/plugins/nuke/inventory/set_tool_color.py @@ -1,68 +1,68 @@ -from avalon import api, style -from avalon.vendor.Qt import QtGui, QtWidgets - -import avalon.fusion - - -class FusionSetToolColor(api.InventoryAction): - """Update the color of the selected tools""" - - label = "Set Tool Color" - icon = "plus" - color = "#d8d8d8" - _fallback_color = QtGui.QColor(1.0, 1.0, 1.0) - - def process(self, containers): - """Color all selected tools the selected colors""" - - result = [] - comp = avalon.fusion.get_current_comp() - - # Get tool color - first = containers[0] - tool = first["_tool"] - color = tool.TileColor - - if color is not None: - qcolor = QtGui.QColor().fromRgbF(color["R"], color["G"], color["B"]) - else: - qcolor = self._fallback_color - - # Launch pick color - picked_color = self.get_color_picker(qcolor) - if not picked_color: - return - - with avalon.fusion.comp_lock_and_undo_chunk(comp): - for container in containers: - # Convert color to RGB 0-1 floats - rgb_f = picked_color.getRgbF() - rgb_f_table = {"R": rgb_f[0], "G": rgb_f[1], "B": rgb_f[2]} - - # Update tool - tool = container["_tool"] - tool.TileColor = rgb_f_table - - result.append(container) - - return result - - def get_color_picker(self, color): - """Launch color picker and return chosen color - - Args: - color(QtGui.QColor): Start color to display - - Returns: - QtGui.QColor - - """ - - color_dialog = QtWidgets.QColorDialog(color) - color_dialog.setStyleSheet(style.load_stylesheet()) - - accepted = color_dialog.exec_() - if not accepted: - return - - return color_dialog.selectedColor() +# from avalon import api, style +# from avalon.vendor.Qt import QtGui, QtWidgets +# +# import avalon.fusion +# +# +# class FusionSetToolColor(api.InventoryAction): +# """Update the color of the selected tools""" +# +# label = "Set Tool Color" +# icon = "plus" +# color = "#d8d8d8" +# _fallback_color = QtGui.QColor(1.0, 1.0, 1.0) +# +# def process(self, containers): +# """Color all selected tools the selected colors""" +# +# result = [] +# comp = avalon.fusion.get_current_comp() +# +# # Get tool color +# first = containers[0] +# tool = first["_tool"] +# color = tool.TileColor +# +# if color is not None: +# qcolor = QtGui.QColor().fromRgbF(color["R"], color["G"], color["B"]) +# else: +# qcolor = self._fallback_color +# +# # Launch pick color +# picked_color = self.get_color_picker(qcolor) +# if not picked_color: +# return +# +# with avalon.fusion.comp_lock_and_undo_chunk(comp): +# for container in containers: +# # Convert color to RGB 0-1 floats +# rgb_f = picked_color.getRgbF() +# rgb_f_table = {"R": rgb_f[0], "G": rgb_f[1], "B": rgb_f[2]} +# +# # Update tool +# tool = container["_tool"] +# tool.TileColor = rgb_f_table +# +# result.append(container) +# +# return result +# +# def get_color_picker(self, color): +# """Launch color picker and return chosen color +# +# Args: +# color(QtGui.QColor): Start color to display +# +# Returns: +# QtGui.QColor +# +# """ +# +# color_dialog = QtWidgets.QColorDialog(color) +# color_dialog.setStyleSheet(style.load_stylesheet()) +# +# accepted = color_dialog.exec_() +# if not accepted: +# return +# +# return color_dialog.selectedColor() diff --git a/config/plugins/nuke/load/actions.py b/config/plugins/nuke/load/actions.py index fa0e506ee2..c66d20daac 100644 --- a/config/plugins/nuke/load/actions.py +++ b/config/plugins/nuke/load/actions.py @@ -1,76 +1,76 @@ -"""A module containing generic loader actions that will display in the Loader. - -""" - -from avalon import api - - -class FusionSetFrameRangeLoader(api.Loader): - """Specific loader of Alembic for the avalon.animation family""" - - families = ["studio.animation", - "studio.camera", - "studio.imagesequence", - "studio.yeticache", - "studio.pointcache"] - representations = ["*"] - - label = "Set frame range" - order = 11 - icon = "clock-o" - color = "white" - - def load(self, context, name, namespace, data): - - from config.apps.fusion import lib - - version = context['version'] - version_data = version.get("data", {}) - - start = version_data.get("startFrame", None) - end = version_data.get("endFrame", None) - - if start is None or end is None: - print("Skipping setting frame range because start or " - "end frame data is missing..") - return - - lib.update_frame_range(start, end) - - -class FusionSetFrameRangeWithHandlesLoader(api.Loader): - """Specific loader of Alembic for the avalon.animation family""" - - families = ["studio.animation", - "studio.camera", - "studio.imagesequence", - "studio.yeticache", - "studio.pointcache"] - representations = ["*"] - - label = "Set frame range (with handles)" - order = 12 - icon = "clock-o" - color = "white" - - def load(self, context, name, namespace, data): - - from config.apps.fusion import lib - - version = context['version'] - version_data = version.get("data", {}) - - start = version_data.get("startFrame", None) - end = version_data.get("endFrame", None) - - if start is None or end is None: - print("Skipping setting frame range because start or " - "end frame data is missing..") - return - - # Include handles - handles = version_data.get("handles", 0) - start -= handles - end += handles - - lib.update_frame_range(start, end) +# """A module containing generic loader actions that will display in the Loader. +# +# """ +# +# from avalon import api +# +# +# class FusionSetFrameRangeLoader(api.Loader): +# """Specific loader of Alembic for the avalon.animation family""" +# +# families = ["studio.animation", +# "studio.camera", +# "studio.imagesequence", +# "studio.yeticache", +# "studio.pointcache"] +# representations = ["*"] +# +# label = "Set frame range" +# order = 11 +# icon = "clock-o" +# color = "white" +# +# def load(self, context, name, namespace, data): +# +# from config.fusion import lib +# +# version = context['version'] +# version_data = version.get("data", {}) +# +# start = version_data.get("startFrame", None) +# end = version_data.get("endFrame", None) +# +# if start is None or end is None: +# print("Skipping setting frame range because start or " +# "end frame data is missing..") +# return +# +# lib.update_frame_range(start, end) +# +# +# class FusionSetFrameRangeWithHandlesLoader(api.Loader): +# """Specific loader of Alembic for the avalon.animation family""" +# +# families = ["studio.animation", +# "studio.camera", +# "studio.imagesequence", +# "studio.yeticache", +# "studio.pointcache"] +# representations = ["*"] +# +# label = "Set frame range (with handles)" +# order = 12 +# icon = "clock-o" +# color = "white" +# +# def load(self, context, name, namespace, data): +# +# from config.fusion import lib +# +# version = context['version'] +# version_data = version.get("data", {}) +# +# start = version_data.get("startFrame", None) +# end = version_data.get("endFrame", None) +# +# if start is None or end is None: +# print("Skipping setting frame range because start or " +# "end frame data is missing..") +# return +# +# # Include handles +# handles = version_data.get("handles", 0) +# start -= handles +# end += handles +# +# lib.update_frame_range(start, end) diff --git a/config/plugins/nuke/load/load_sequence.py b/config/plugins/nuke/load/load_sequence.py index 2150bd1eb0..756c64a30e 100644 --- a/config/plugins/nuke/load/load_sequence.py +++ b/config/plugins/nuke/load/load_sequence.py @@ -1,259 +1,259 @@ -import os -import contextlib - -from avalon import api -import avalon.io as io - - -@contextlib.contextmanager -def preserve_inputs(tool, inputs): - """Preserve the tool's inputs after context""" - - comp = tool.Comp() - - values = {} - for name in inputs: - tool_input = getattr(tool, name) - value = tool_input[comp.TIME_UNDEFINED] - values[name] = value - - try: - yield - finally: - for name, value in values.items(): - tool_input = getattr(tool, name) - tool_input[comp.TIME_UNDEFINED] = value - - -@contextlib.contextmanager -def preserve_trim(loader, log=None): - """Preserve the relative trim of the Loader tool. - - This tries to preserve the loader's trim (trim in and trim out) after - the context by reapplying the "amount" it trims on the clip's length at - start and end. - - """ - - # Get original trim as amount of "trimming" from length - time = loader.Comp().TIME_UNDEFINED - length = loader.GetAttrs()["TOOLIT_Clip_Length"][1] - 1 - trim_from_start = loader["ClipTimeStart"][time] - trim_from_end = length - loader["ClipTimeEnd"][time] - - try: - yield - finally: - - length = loader.GetAttrs()["TOOLIT_Clip_Length"][1] - 1 - if trim_from_start > length: - trim_from_start = length - if log: - log.warning("Reducing trim in to %d " - "(because of less frames)" % trim_from_start) - - remainder = length - trim_from_start - if trim_from_end > remainder: - trim_from_end = remainder - if log: - log.warning("Reducing trim in to %d " - "(because of less frames)" % trim_from_end) - - loader["ClipTimeStart"][time] = trim_from_start - loader["ClipTimeEnd"][time] = length - trim_from_end - - -def loader_shift(loader, frame, relative=True): - """Shift global in time by i preserving duration - - This moves the loader by i frames preserving global duration. When relative - is False it will shift the global in to the start frame. - - Args: - loader (tool): The fusion loader tool. - frame (int): The amount of frames to move. - relative (bool): When True the shift is relative, else the shift will - change the global in to frame. - - Returns: - int: The resulting relative frame change (how much it moved) - - """ - comp = loader.Comp() - time = comp.TIME_UNDEFINED - - old_in = loader["GlobalIn"][time] - old_out = loader["GlobalOut"][time] - - if relative: - shift = frame - else: - shift = frame - old_in - - # Shifting global in will try to automatically compensate for the change - # in the "ClipTimeStart" and "HoldFirstFrame" inputs, so we preserve those - # input values to "just shift" the clip - with preserve_inputs(loader, inputs=["ClipTimeStart", - "ClipTimeEnd", - "HoldFirstFrame", - "HoldLastFrame"]): - - # GlobalIn cannot be set past GlobalOut or vice versa - # so we must apply them in the order of the shift. - if shift > 0: - loader["GlobalOut"][time] = old_out + shift - loader["GlobalIn"][time] = old_in + shift - else: - loader["GlobalIn"][time] = old_in + shift - loader["GlobalOut"][time] = old_out + shift - - return int(shift) - - -class FusionLoadSequence(api.Loader): - """Load image sequence into Fusion""" - - families = ["studio.imagesequence"] - representations = ["*"] - - label = "Load sequence" - order = -10 - icon = "code-fork" - color = "orange" - - def load(self, context, name, namespace, data): - - from avalon.fusion import ( - imprint_container, - get_current_comp, - comp_lock_and_undo_chunk - ) - - # Fallback to asset name when namespace is None - if namespace is None: - namespace = context['asset']['name'] - - # Use the first file for now - path = self._get_first_image(self.fname) - - # Create the Loader with the filename path set - comp = get_current_comp() - with comp_lock_and_undo_chunk(comp, "Create Loader"): - - args = (-32768, -32768) - tool = comp.AddTool("Loader", *args) - tool["Clip"] = path - - # Set global in point to start frame (if in version.data) - start = context["version"]["data"].get("startFrame", None) - if start is not None: - loader_shift(tool, start, relative=False) - - imprint_container(tool, - name=name, - namespace=namespace, - context=context, - loader=self.__class__.__name__) - - def switch(self, container, representation): - self.update(container, representation) - - def update(self, container, representation): - """Update the Loader's path - - Fusion automatically tries to reset some variables when changing - the loader's path to a new file. These automatic changes are to its - inputs: - - ClipTimeStart: Fusion reset to 0 if duration changes - - We keep the trim in as close as possible to the previous value. - When there are less frames then the amount of trim we reduce - it accordingly. - - - ClipTimeEnd: Fusion reset to 0 if duration changes - - We keep the trim out as close as possible to the previous value - within new amount of frames after trim in (ClipTimeStart) has - been set. - - - GlobalIn: Fusion reset to comp's global in if duration changes - - We change it to the "startFrame" - - - GlobalEnd: Fusion resets to globalIn + length if duration changes - - We do the same like Fusion - allow fusion to take control. - - - HoldFirstFrame: Fusion resets this to 0 - - We preverse the value. - - - HoldLastFrame: Fusion resets this to 0 - - We preverse the value. - - - Reverse: Fusion resets to disabled if "Loop" is not enabled. - - We preserve the value. - - - Depth: Fusion resets to "Format" - - We preverse the value. - - - KeyCode: Fusion resets to "" - - We preverse the value. - - - TimeCodeOffset: Fusion resets to 0 - - We preverse the value. - - """ - - from avalon.fusion import comp_lock_and_undo_chunk - - tool = container["_tool"] - assert tool.ID == "Loader", "Must be Loader" - comp = tool.Comp() - - root = api.get_representation_path(representation) - path = self._get_first_image(root) - - # Get start frame from version data - version = io.find_one({"type": "version", - "_id": representation["parent"]}) - start = version["data"].get("startFrame") - if start is None: - self.log.warning("Missing start frame for updated version" - "assuming starts at frame 0 for: " - "{} ({})".format(tool.Name, representation)) - start = 0 - - with comp_lock_and_undo_chunk(comp, "Update Loader"): - - # Update the loader's path whilst preserving some values - with preserve_trim(tool, log=self.log): - with preserve_inputs(tool, - inputs=("HoldFirstFrame", - "HoldLastFrame", - "Reverse", - "Depth", - "KeyCode", - "TimeCodeOffset")): - tool["Clip"] = path - - # Set the global in to the start frame of the sequence - global_in_changed = loader_shift(tool, start, relative=False) - if global_in_changed: - # Log this change to the user - self.log.debug("Changed '%s' global in: %d" % (tool.Name, - start)) - - # Update the imprinted representation - tool.SetData("avalon.representation", str(representation["_id"])) - - def remove(self, container): - - from avalon.fusion import comp_lock_and_undo_chunk - - tool = container["_tool"] - assert tool.ID == "Loader", "Must be Loader" - comp = tool.Comp() - - with comp_lock_and_undo_chunk(comp, "Remove Loader"): - tool.Delete() - - def _get_first_image(self, root): - """Get first file in representation root""" - files = sorted(os.listdir(root)) - return os.path.join(root, files[0]) +# import os +# import contextlib +# +# from avalon import api +# import avalon.io as io +# +# +# @contextlib.contextmanager +# def preserve_inputs(tool, inputs): +# """Preserve the tool's inputs after context""" +# +# comp = tool.Comp() +# +# values = {} +# for name in inputs: +# tool_input = getattr(tool, name) +# value = tool_input[comp.TIME_UNDEFINED] +# values[name] = value +# +# try: +# yield +# finally: +# for name, value in values.items(): +# tool_input = getattr(tool, name) +# tool_input[comp.TIME_UNDEFINED] = value +# +# +# @contextlib.contextmanager +# def preserve_trim(loader, log=None): +# """Preserve the relative trim of the Loader tool. +# +# This tries to preserve the loader's trim (trim in and trim out) after +# the context by reapplying the "amount" it trims on the clip's length at +# start and end. +# +# """ +# +# # Get original trim as amount of "trimming" from length +# time = loader.Comp().TIME_UNDEFINED +# length = loader.GetAttrs()["TOOLIT_Clip_Length"][1] - 1 +# trim_from_start = loader["ClipTimeStart"][time] +# trim_from_end = length - loader["ClipTimeEnd"][time] +# +# try: +# yield +# finally: +# +# length = loader.GetAttrs()["TOOLIT_Clip_Length"][1] - 1 +# if trim_from_start > length: +# trim_from_start = length +# if log: +# log.warning("Reducing trim in to %d " +# "(because of less frames)" % trim_from_start) +# +# remainder = length - trim_from_start +# if trim_from_end > remainder: +# trim_from_end = remainder +# if log: +# log.warning("Reducing trim in to %d " +# "(because of less frames)" % trim_from_end) +# +# loader["ClipTimeStart"][time] = trim_from_start +# loader["ClipTimeEnd"][time] = length - trim_from_end +# +# +# def loader_shift(loader, frame, relative=True): +# """Shift global in time by i preserving duration +# +# This moves the loader by i frames preserving global duration. When relative +# is False it will shift the global in to the start frame. +# +# Args: +# loader (tool): The fusion loader tool. +# frame (int): The amount of frames to move. +# relative (bool): When True the shift is relative, else the shift will +# change the global in to frame. +# +# Returns: +# int: The resulting relative frame change (how much it moved) +# +# """ +# comp = loader.Comp() +# time = comp.TIME_UNDEFINED +# +# old_in = loader["GlobalIn"][time] +# old_out = loader["GlobalOut"][time] +# +# if relative: +# shift = frame +# else: +# shift = frame - old_in +# +# # Shifting global in will try to automatically compensate for the change +# # in the "ClipTimeStart" and "HoldFirstFrame" inputs, so we preserve those +# # input values to "just shift" the clip +# with preserve_inputs(loader, inputs=["ClipTimeStart", +# "ClipTimeEnd", +# "HoldFirstFrame", +# "HoldLastFrame"]): +# +# # GlobalIn cannot be set past GlobalOut or vice versa +# # so we must apply them in the order of the shift. +# if shift > 0: +# loader["GlobalOut"][time] = old_out + shift +# loader["GlobalIn"][time] = old_in + shift +# else: +# loader["GlobalIn"][time] = old_in + shift +# loader["GlobalOut"][time] = old_out + shift +# +# return int(shift) +# +# +# class FusionLoadSequence(api.Loader): +# """Load image sequence into Fusion""" +# +# families = ["studio.imagesequence"] +# representations = ["*"] +# +# label = "Load sequence" +# order = -10 +# icon = "code-fork" +# color = "orange" +# +# def load(self, context, name, namespace, data): +# +# from avalon.fusion import ( +# imprint_container, +# get_current_comp, +# comp_lock_and_undo_chunk +# ) +# +# # Fallback to asset name when namespace is None +# if namespace is None: +# namespace = context['asset']['name'] +# +# # Use the first file for now +# path = self._get_first_image(self.fname) +# +# # Create the Loader with the filename path set +# comp = get_current_comp() +# with comp_lock_and_undo_chunk(comp, "Create Loader"): +# +# args = (-32768, -32768) +# tool = comp.AddTool("Loader", *args) +# tool["Clip"] = path +# +# # Set global in point to start frame (if in version.data) +# start = context["version"]["data"].get("startFrame", None) +# if start is not None: +# loader_shift(tool, start, relative=False) +# +# imprint_container(tool, +# name=name, +# namespace=namespace, +# context=context, +# loader=self.__class__.__name__) +# +# def switch(self, container, representation): +# self.update(container, representation) +# +# def update(self, container, representation): +# """Update the Loader's path +# +# Fusion automatically tries to reset some variables when changing +# the loader's path to a new file. These automatic changes are to its +# inputs: +# - ClipTimeStart: Fusion reset to 0 if duration changes +# - We keep the trim in as close as possible to the previous value. +# When there are less frames then the amount of trim we reduce +# it accordingly. +# +# - ClipTimeEnd: Fusion reset to 0 if duration changes +# - We keep the trim out as close as possible to the previous value +# within new amount of frames after trim in (ClipTimeStart) has +# been set. +# +# - GlobalIn: Fusion reset to comp's global in if duration changes +# - We change it to the "startFrame" +# +# - GlobalEnd: Fusion resets to globalIn + length if duration changes +# - We do the same like Fusion - allow fusion to take control. +# +# - HoldFirstFrame: Fusion resets this to 0 +# - We preverse the value. +# +# - HoldLastFrame: Fusion resets this to 0 +# - We preverse the value. +# +# - Reverse: Fusion resets to disabled if "Loop" is not enabled. +# - We preserve the value. +# +# - Depth: Fusion resets to "Format" +# - We preverse the value. +# +# - KeyCode: Fusion resets to "" +# - We preverse the value. +# +# - TimeCodeOffset: Fusion resets to 0 +# - We preverse the value. +# +# """ +# +# from avalon.fusion import comp_lock_and_undo_chunk +# +# tool = container["_tool"] +# assert tool.ID == "Loader", "Must be Loader" +# comp = tool.Comp() +# +# root = api.get_representation_path(representation) +# path = self._get_first_image(root) +# +# # Get start frame from version data +# version = io.find_one({"type": "version", +# "_id": representation["parent"]}) +# start = version["data"].get("startFrame") +# if start is None: +# self.log.warning("Missing start frame for updated version" +# "assuming starts at frame 0 for: " +# "{} ({})".format(tool.Name, representation)) +# start = 0 +# +# with comp_lock_and_undo_chunk(comp, "Update Loader"): +# +# # Update the loader's path whilst preserving some values +# with preserve_trim(tool, log=self.log): +# with preserve_inputs(tool, +# inputs=("HoldFirstFrame", +# "HoldLastFrame", +# "Reverse", +# "Depth", +# "KeyCode", +# "TimeCodeOffset")): +# tool["Clip"] = path +# +# # Set the global in to the start frame of the sequence +# global_in_changed = loader_shift(tool, start, relative=False) +# if global_in_changed: +# # Log this change to the user +# self.log.debug("Changed '%s' global in: %d" % (tool.Name, +# start)) +# +# # Update the imprinted representation +# tool.SetData("avalon.representation", str(representation["_id"])) +# +# def remove(self, container): +# +# from avalon.fusion import comp_lock_and_undo_chunk +# +# tool = container["_tool"] +# assert tool.ID == "Loader", "Must be Loader" +# comp = tool.Comp() +# +# with comp_lock_and_undo_chunk(comp, "Remove Loader"): +# tool.Delete() +# +# def _get_first_image(self, root): +# """Get first file in representation root""" +# files = sorted(os.listdir(root)) +# return os.path.join(root, files[0]) diff --git a/config/plugins/nuke/publish/collect_comp.py b/config/plugins/nuke/publish/collect_comp.py deleted file mode 100644 index 1cf182c8ca..0000000000 --- a/config/plugins/nuke/publish/collect_comp.py +++ /dev/null @@ -1,24 +0,0 @@ -import os - -import pyblish.api - -from avalon import fusion - - -class CollectCurrentCompFusion(pyblish.api.ContextPlugin): - """Collect current comp""" - - order = pyblish.api.CollectorOrder - 0.4 - label = "Collect Current Comp" - hosts = ["fusion"] - - def process(self, context): - """Collect all image sequence tools""" - - current_comp = fusion.get_current_comp() - assert current_comp, "Must have active Fusion composition" - context.data["currentComp"] = current_comp - - # Store path to current file - filepath = current_comp.GetAttrs().get("COMPS_FileName", "") - context.data['currentFile'] = filepath diff --git a/config/plugins/nuke/publish/collect_fusion_version.py b/config/plugins/nuke/publish/collect_fusion_version.py deleted file mode 100644 index 65d8386f33..0000000000 --- a/config/plugins/nuke/publish/collect_fusion_version.py +++ /dev/null @@ -1,22 +0,0 @@ -import pyblish.api - - -class CollectFusionVersion(pyblish.api.ContextPlugin): - """Collect current comp""" - - order = pyblish.api.CollectorOrder - label = "Collect Fusion Version" - hosts = ["fusion"] - - def process(self, context): - """Collect all image sequence tools""" - - comp = context.data.get("currentComp") - if not comp: - raise RuntimeError("No comp previously collected, unable to " - "retrieve Fusion version.") - - version = comp.GetApp().Version - context.data["fusionVersion"] = version - - self.log.info("Fusion version: %s" % version) diff --git a/config/plugins/nuke/publish/collect_instances.py b/config/plugins/nuke/publish/collect_instances.py deleted file mode 100644 index 9177f603c3..0000000000 --- a/config/plugins/nuke/publish/collect_instances.py +++ /dev/null @@ -1,96 +0,0 @@ -import os - -import pyblish.api - - -def get_comp_render_range(comp): - """Return comp's start and end render range.""" - comp_attrs = comp.GetAttrs() - start = comp_attrs["COMPN_RenderStart"] - end = comp_attrs["COMPN_RenderEnd"] - - # Whenever render ranges are undefined fall back - # to the comp's global start and end - if start == -1000000000: - start = comp_attrs["COMPN_GlobalEnd"] - if end == -1000000000: - end = comp_attrs["COMPN_GlobalStart"] - - return start, end - - -class CollectInstances(pyblish.api.ContextPlugin): - """Collect Fusion saver instances - - This additionally stores the Comp start and end render range in the - current context's data as "startFrame" and "endFrame". - - """ - - order = pyblish.api.CollectorOrder - label = "Collect Instances" - hosts = ["fusion"] - - def process(self, context): - """Collect all image sequence tools""" - - from avalon.fusion.lib import get_frame_path - - comp = context.data["currentComp"] - - # Get all savers in the comp - tools = comp.GetToolList(False).values() - savers = [tool for tool in tools if tool.ID == "Saver"] - - start, end = get_comp_render_range(comp) - context.data["startFrame"] = start - context.data["endFrame"] = end - - for tool in savers: - path = tool["Clip"][comp.TIME_UNDEFINED] - - tool_attrs = tool.GetAttrs() - active = not tool_attrs["TOOLB_PassThrough"] - - if not path: - self.log.warning("Skipping saver because it " - "has no path set: {}".format(tool.Name)) - continue - - filename = os.path.basename(path) - head, padding, tail = get_frame_path(filename) - ext = os.path.splitext(path)[1] - assert tail == ext, ("Tail does not match %s" % ext) - subset = head.rstrip("_. ") # subset is head of the filename - - # Include start and end render frame in label - label = "{subset} ({start}-{end})".format(subset=subset, - start=int(start), - end=int(end)) - - instance = context.create_instance(subset) - instance.data.update({ - "asset": os.environ["AVALON_ASSET"], # todo: not a constant - "subset": subset, - "path": path, - "outputDir": os.path.dirname(path), - "ext": ext, # todo: should be redundant - "label": label, - "families": ["studio.saver"], - "family": "studio.saver", - "active": active, - "publish": active # backwards compatibility - }) - - instance.append(tool) - - self.log.info("Found: \"%s\" " % path) - - # Sort/grouped by family (preserving local index) - context[:] = sorted(context, key=self.sort_by_family) - - return context - - def sort_by_family(self, instance): - """Sort by family""" - return instance.data.get("families", instance.data.get("family")) diff --git a/config/plugins/nuke/publish/collect_render_target.py b/config/plugins/nuke/publish/collect_render_target.py deleted file mode 100644 index 0abdd7113f..0000000000 --- a/config/plugins/nuke/publish/collect_render_target.py +++ /dev/null @@ -1,44 +0,0 @@ -import pyblish.api - - -class CollectFusionRenderMode(pyblish.api.InstancePlugin): - """Collect current comp's render Mode - - Options: - renderlocal - deadline - - Note that this value is set for each comp separately. When you save the - comp this information will be stored in that file. If for some reason the - available tool does not visualize which render mode is set for the - current comp, please run the following line in the console (Py2) - - comp.GetData("studio.rendermode") - - This will return the name of the current render mode as seen above under - Options. - - """ - - order = pyblish.api.CollectorOrder + 0.4 - label = "Collect Render Mode" - hosts = ["fusion"] - families = ["studio.saver"] - - def process(self, instance): - """Collect all image sequence tools""" - options = ["renderlocal", "deadline"] - - comp = instance.context.data.get("currentComp") - if not comp: - raise RuntimeError("No comp previously collected, unable to " - "retrieve Fusion version.") - - rendermode = comp.GetData("studio.rendermode") or "renderlocal" - assert rendermode in options, "Must be supported render mode" - - self.log.info("Render mode: {0}".format(rendermode)) - - # Append family - family = "studio.saver.{0}".format(rendermode) - instance.data["families"].append(family) diff --git a/config/plugins/nuke/publish/increment_current_file_deadline.py b/config/plugins/nuke/publish/increment_current_file_deadline.py deleted file mode 100644 index 5a723a320b..0000000000 --- a/config/plugins/nuke/publish/increment_current_file_deadline.py +++ /dev/null @@ -1,34 +0,0 @@ -import pyblish.api - - -class FusionIncrementCurrentFile(pyblish.api.ContextPlugin): - """Increment the current file. - - Saves the current file with an increased version number. - - """ - - label = "Increment current file" - order = pyblish.api.IntegratorOrder + 9.0 - hosts = ["fusion"] - families = ["studio.saver.deadline"] - optional = True - - def process(self, context): - - from config.lib import version_up - from config.action import get_errored_plugins_from_data - - errored_plugins = get_errored_plugins_from_data(context) - if any(plugin.__name__ == "FusionSubmitDeadline" - for plugin in errored_plugins): - raise RuntimeError("Skipping incrementing current file because " - "submission to deadline failed.") - - comp = context.data.get("currentComp") - assert comp, "Must have comp" - - current_filepath = context.data["currentFile"] - new_filepath = version_up(current_filepath) - - comp.Save(new_filepath) diff --git a/config/plugins/nuke/publish/publish_image_sequences.py b/config/plugins/nuke/publish/publish_image_sequences.py deleted file mode 100644 index bdb77be458..0000000000 --- a/config/plugins/nuke/publish/publish_image_sequences.py +++ /dev/null @@ -1,98 +0,0 @@ -import re -import os -import json -import subprocess - -import pyblish.api - -from config.action import get_errored_plugins_from_data - - -def _get_script(): - """Get path to the image sequence script""" - - # todo: use a more elegant way to get the python script - - try: - from config.scripts import publish_filesequence - except Exception: - raise RuntimeError("Expected module 'publish_imagesequence'" - "to be available") - - module_path = publish_filesequence.__file__ - if module_path.endswith(".pyc"): - module_path = module_path[:-len(".pyc")] + ".py" - - return module_path - - -class PublishImageSequence(pyblish.api.InstancePlugin): - """Publish the generated local image sequences.""" - - order = pyblish.api.IntegratorOrder - label = "Publish Rendered Image Sequence(s)" - hosts = ["fusion"] - families = ["studio.saver.renderlocal"] - - def process(self, instance): - - # Skip this plug-in if the ExtractImageSequence failed - errored_plugins = get_errored_plugins_from_data(instance.context) - if any(plugin.__name__ == "FusionRenderLocal" for plugin in - errored_plugins): - raise RuntimeError("Fusion local render failed, " - "publishing images skipped.") - - subset = instance.data["subset"] - ext = instance.data["ext"] - - # Regex to match resulting renders - regex = "^{subset}.*[0-9]+{ext}+$".format(subset=re.escape(subset), - ext=re.escape(ext)) - - # The instance has most of the information already stored - metadata = { - "regex": regex, - "startFrame": instance.context.data["startFrame"], - "endFrame": instance.context.data["endFrame"], - "families": ["studio.imagesequence"], - } - - # Write metadata and store the path in the instance - output_directory = instance.data["outputDir"] - path = os.path.join(output_directory, - "{}_metadata.json".format(subset)) - with open(path, "w") as f: - json.dump(metadata, f) - - assert os.path.isfile(path), ("Stored path is not a file for %s" - % instance.data["name"]) - - # Suppress any subprocess console - startupinfo = subprocess.STARTUPINFO() - startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW - startupinfo.wShowWindow = subprocess.SW_HIDE - - process = subprocess.Popen(["python", _get_script(), - "--paths", path], - bufsize=1, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - startupinfo=startupinfo) - - while True: - output = process.stdout.readline() - # Break when there is no output or a return code has been given - if output == '' and process.poll() is not None: - process.stdout.close() - break - if output: - line = output.strip() - if line.startswith("ERROR"): - self.log.error(line) - else: - self.log.info(line) - - if process.returncode != 0: - raise RuntimeError("Process quit with non-zero " - "return code: {}".format(process.returncode)) diff --git a/config/plugins/nuke/publish/render_local.py b/config/plugins/nuke/publish/render_local.py deleted file mode 100644 index d34f7d56ee..0000000000 --- a/config/plugins/nuke/publish/render_local.py +++ /dev/null @@ -1,42 +0,0 @@ -import pyblish.api - -import avalon.fusion as fusion - - -class FusionRenderLocal(pyblish.api.InstancePlugin): - """Render the current Fusion composition locally. - - Extract the result of savers by starting a comp render - This will run the local render of Fusion. - - """ - - order = pyblish.api.ExtractorOrder - label = "Render Local" - hosts = ["fusion"] - families = ["studio.saver.renderlocal"] - - def process(self, instance): - - # This should be a ContextPlugin, but this is a workaround - # for a bug in pyblish to run once for a family: issue #250 - context = instance.context - key = "__hasRun{}".format(self.__class__.__name__) - if context.data.get(key, False): - return - else: - context.data[key] = True - - current_comp = context.data["currentComp"] - start_frame = current_comp.GetAttrs("COMPN_RenderStart") - end_frame = current_comp.GetAttrs("COMPN_RenderEnd") - - self.log.info("Starting render") - self.log.info("Start frame: {}".format(start_frame)) - self.log.info("End frame: {}".format(end_frame)) - - with fusion.comp_lock_and_undo_chunk(current_comp): - result = current_comp.Render() - - if not result: - raise RuntimeError("Comp render failed") diff --git a/config/plugins/nuke/publish/save_scene.py b/config/plugins/nuke/publish/save_scene.py deleted file mode 100644 index ffc44b98d5..0000000000 --- a/config/plugins/nuke/publish/save_scene.py +++ /dev/null @@ -1,21 +0,0 @@ -import pyblish.api - - -class FusionSaveComp(pyblish.api.ContextPlugin): - """Save current comp""" - - label = "Save current file" - order = pyblish.api.ExtractorOrder - 0.49 - hosts = ["fusion"] - families = ["studio.saver"] - - def process(self, context): - - comp = context.data.get("currentComp") - assert comp, "Must have comp" - - current = comp.GetAttrs().get("COMPS_FileName", "") - assert context.data['currentFile'] == current - - self.log.info("Saving current file..") - comp.Save() diff --git a/config/plugins/nuke/publish/submit_deadline.py b/config/plugins/nuke/publish/submit_deadline.py deleted file mode 100644 index cce9b1292c..0000000000 --- a/config/plugins/nuke/publish/submit_deadline.py +++ /dev/null @@ -1,149 +0,0 @@ -import os -import json -import getpass - -from avalon import api -from avalon.vendor import requests - -import pyblish.api - - -class FusionSubmitDeadline(pyblish.api.InstancePlugin): - """Submit current Comp to Deadline - - Renders are submitted to a Deadline Web Service as - supplied via the environment variable AVALON_DEADLINE - - """ - - label = "Submit to Deadline" - order = pyblish.api.IntegratorOrder - hosts = ["fusion"] - families = ["studio.saver.deadline"] - - def process(self, instance): - - context = instance.context - - key = "__hasRun{}".format(self.__class__.__name__) - if context.data.get(key, False): - return - else: - context.data[key] = True - - from avalon.fusion.lib import get_frame_path - - AVALON_DEADLINE = api.Session.get("AVALON_DEADLINE", - "http://localhost:8082") - assert AVALON_DEADLINE, "Requires AVALON_DEADLINE" - - # Collect all saver instances in context that are to be rendered - saver_instances = [] - for instance in context[:]: - if not self.families[0] in instance.data.get("families"): - # Allow only saver family instances - continue - - if not instance.data.get("publish", True): - # Skip inactive instances - continue - self.log.debug(instance.data["name"]) - saver_instances.append(instance) - - if not saver_instances: - raise RuntimeError("No instances found for Deadline submittion") - - fusion_version = int(context.data["fusionVersion"]) - filepath = context.data["currentFile"] - filename = os.path.basename(filepath) - comment = context.data.get("comment", "") - deadline_user = context.data.get("deadlineUser", getpass.getuser()) - - # Documentation for keys available at: - # https://docs.thinkboxsoftware.com - # /products/deadline/8.0/1_User%20Manual/manual - # /manual-submission.html#job-info-file-options - payload = { - "JobInfo": { - # Top-level group name - "BatchName": filename, - - # Job name, as seen in Monitor - "Name": filename, - - # User, as seen in Monitor - "UserName": deadline_user, - - # Use a default submission pool for Fusion - "Pool": "fusion", - - "Plugin": "Fusion", - "Frames": "{start}-{end}".format( - start=int(context.data["startFrame"]), - end=int(context.data["endFrame"]) - ), - - "Comment": comment, - }, - "PluginInfo": { - # Input - "FlowFile": filepath, - - # Mandatory for Deadline - "Version": str(fusion_version), - - # Render in high quality - "HighQuality": True, - - # Whether saver output should be checked after rendering - # is complete - "CheckOutput": True, - - # Proxy: higher numbers smaller images for faster test renders - # 1 = no proxy quality - "Proxy": 1, - }, - - # Mandatory for Deadline, may be empty - "AuxFiles": [] - } - - # Enable going to rendered frames from Deadline Monitor - for index, instance in enumerate(saver_instances): - head, padding, tail = get_frame_path(instance.data["path"]) - path = "{}{}{}".format(head, "#" * padding, tail) - folder, filename = os.path.split(path) - payload["JobInfo"]["OutputDirectory%d" % index] = folder - payload["JobInfo"]["OutputFilename%d" % index] = filename - - # Include critical variables with submission - keys = [ - # TODO: This won't work if the slaves don't have accesss to - # these paths, such as if slaves are running Linux and the - # submitter is on Windows. - "PYTHONPATH", - "OFX_PLUGIN_PATH", - "FUSION9_MasterPrefs" - ] - environment = dict({key: os.environ[key] for key in keys - if key in os.environ}, **api.Session) - - payload["JobInfo"].update({ - "EnvironmentKeyValue%d" % index: "{key}={value}".format( - key=key, - value=environment[key] - ) for index, key in enumerate(environment) - }) - - self.log.info("Submitting..") - self.log.info(json.dumps(payload, indent=4, sort_keys=True)) - - # E.g. http://192.168.0.1:8082/api/jobs - url = "{}/api/jobs".format(AVALON_DEADLINE) - response = requests.post(url, json=payload) - if not response.ok: - raise Exception(response.text) - - # Store the response for dependent job submission plug-ins - for instance in saver_instances: - instance.data["deadlineSubmissionJob"] = response.json() diff --git a/config/plugins/nuke/publish/validate_background_depth.py b/config/plugins/nuke/publish/validate_background_depth.py deleted file mode 100644 index cdb5305c6c..0000000000 --- a/config/plugins/nuke/publish/validate_background_depth.py +++ /dev/null @@ -1,40 +0,0 @@ -import pyblish.api - -from config import action - - -class ValidateBackgroundDepth(pyblish.api.InstancePlugin): - """Validate if all Background tool are set to float32 bit""" - - order = pyblish.api.ValidatorOrder - label = "Validate Background Depth 32 bit" - actions = [action.RepairAction] - hosts = ["fusion"] - families = ["studio.saver"] - optional = True - - @classmethod - def get_invalid(cls, instance): - - context = instance.context - comp = context.data.get("currentComp") - assert comp, "Must have Comp object" - - backgrounds = comp.GetToolList(False, "Background").values() - if not backgrounds: - return [] - - return [i for i in backgrounds if i.GetInput("Depth") != 4.0] - - def process(self, instance): - invalid = self.get_invalid(instance) - if invalid: - raise RuntimeError("Found %i nodes which are not set to float32" - % len(invalid)) - - @classmethod - def repair(cls, instance): - comp = instance.context.data.get("currentComp") - invalid = cls.get_invalid(instance) - for i in invalid: - i.SetInput("Depth", 4.0, comp.TIME_UNDEFINED) diff --git a/config/plugins/nuke/publish/validate_comp_saved.py b/config/plugins/nuke/publish/validate_comp_saved.py deleted file mode 100644 index 6c94d730ce..0000000000 --- a/config/plugins/nuke/publish/validate_comp_saved.py +++ /dev/null @@ -1,29 +0,0 @@ -import os - -import pyblish.api - - -class ValidateFusionCompSaved(pyblish.api.ContextPlugin): - """Ensure current comp is saved""" - - order = pyblish.api.ValidatorOrder - label = "Validate Comp Saved" - families = ["studio.saver"] - hosts = ["fusion"] - - def process(self, context): - - comp = context.data.get("currentComp") - assert comp, "Must have Comp object" - attrs = comp.GetAttrs() - - filename = attrs["COMPS_FileName"] - if not filename: - raise RuntimeError("Comp is not saved.") - - if not os.path.exists(filename): - raise RuntimeError("Comp file does not exist: %s" % filename) - - if attrs["COMPB_Modified"]: - self.log.warning("Comp is modified. Save your comp to ensure your " - "changes propagate correctly.") diff --git a/config/plugins/nuke/publish/validate_create_folder_checked.py b/config/plugins/nuke/publish/validate_create_folder_checked.py deleted file mode 100644 index 78ce441745..0000000000 --- a/config/plugins/nuke/publish/validate_create_folder_checked.py +++ /dev/null @@ -1,41 +0,0 @@ -import pyblish.api - -from config import action - - -class ValidateCreateFolderChecked(pyblish.api.InstancePlugin): - """Valid if all savers have the input attribute CreateDir checked on - - This attribute ensures that the folders to which the saver will write - will be created. - """ - - order = pyblish.api.ValidatorOrder - actions = [action.RepairAction] - label = "Validate Create Folder Checked" - families = ["studio.saver"] - hosts = ["fusion"] - - @classmethod - def get_invalid(cls, instance): - active = instance.data.get("active", instance.data.get("publish")) - if not active: - return [] - - tool = instance[0] - create_dir = tool.GetInput("CreateDir") - if create_dir == 0.0: - cls.log.error("%s has Create Folder turned off" % instance[0].Name) - return [tool] - - def process(self, instance): - invalid = self.get_invalid(instance) - if invalid: - raise RuntimeError("Found Saver with Create Folder During " - "Render checked off") - - @classmethod - def repair(cls, instance): - invalid = cls.get_invalid(instance) - for tool in invalid: - tool.SetInput("CreateDir", 1.0) diff --git a/config/plugins/nuke/publish/validate_filename_has_extension.py b/config/plugins/nuke/publish/validate_filename_has_extension.py deleted file mode 100644 index 40f167765d..0000000000 --- a/config/plugins/nuke/publish/validate_filename_has_extension.py +++ /dev/null @@ -1,36 +0,0 @@ -import os - -import pyblish.api - - -class ValidateFilenameHasExtension(pyblish.api.InstancePlugin): - """Ensure the Saver has an extension in the filename path - - This disallows files written as `filename` instead of `filename.frame.ext`. - Fusion does not always set an extension for your filename when - changing the file format of the saver. - - """ - - order = pyblish.api.ValidatorOrder - label = "Validate Filename Has Extension" - families = ["studio.saver"] - hosts = ["fusion"] - - def process(self, instance): - invalid = self.get_invalid(instance) - if invalid: - raise RuntimeError("Found Saver without an extension") - - @classmethod - def get_invalid(cls, instance): - - path = instance.data["path"] - fname, ext = os.path.splitext(path) - - if not ext: - tool = instance[0] - cls.log.error("%s has no extension specified" % tool.Name) - return [tool] - - return [] diff --git a/config/plugins/nuke/publish/validate_saver_has_input.py b/config/plugins/nuke/publish/validate_saver_has_input.py deleted file mode 100644 index 9e94f101a0..0000000000 --- a/config/plugins/nuke/publish/validate_saver_has_input.py +++ /dev/null @@ -1,29 +0,0 @@ -import pyblish.api - - -class ValidateSaverHasInput(pyblish.api.InstancePlugin): - """Validate saver has incoming connection - - This ensures a Saver has at least an input connection. - - """ - - order = pyblish.api.ValidatorOrder - label = "Validate Saver Has Input" - families = ["studio.saver"] - hosts = ["fusion"] - - @classmethod - def get_invalid(cls, instance): - - saver = instance[0] - if not saver.Input.GetConnectedOutput(): - return [saver] - - return [] - - def process(self, instance): - invalid = self.get_invalid(instance) - if invalid: - raise RuntimeError("Saver has no incoming connection: " - "{} ({})".format(instance, invalid[0].Name)) diff --git a/config/plugins/nuke/publish/validate_saver_passthrough.py b/config/plugins/nuke/publish/validate_saver_passthrough.py deleted file mode 100644 index c69873c04d..0000000000 --- a/config/plugins/nuke/publish/validate_saver_passthrough.py +++ /dev/null @@ -1,44 +0,0 @@ -import pyblish.api - - -class ValidateSaverPassthrough(pyblish.api.ContextPlugin): - """Validate saver passthrough is similar to Pyblish publish state""" - - order = pyblish.api.ValidatorOrder - label = "Validate Saver Passthrough" - families = ["studio.saver"] - hosts = ["fusion"] - - def process(self, context): - - # Workaround for ContextPlugin always running, even if no instance - # is present with the family - instances = pyblish.api.instances_by_plugin(instances=list(context), - plugin=self) - if not instances: - self.log.debug("Ignoring plugin.. (bugfix)") - - invalid_instances = [] - for instance in instances: - invalid = self.is_invalid(instance) - if invalid: - invalid_instances.append(instance) - - if invalid_instances: - self.log.info("Reset pyblish to collect your current scene state, " - "that should fix error.") - raise RuntimeError("Invalid instances: " - "{0}".format(invalid_instances)) - - def is_invalid(self, instance): - - saver = instance[0] - attr = saver.GetAttrs() - active = not attr["TOOLB_PassThrough"] - - if active != instance.data["publish"]: - self.log.info("Saver has different passthrough state than " - "Pyblish: {} ({})".format(instance, saver.Name)) - return [saver] - - return [] diff --git a/config/plugins/nuke/publish/validate_unique_subsets.py b/config/plugins/nuke/publish/validate_unique_subsets.py deleted file mode 100644 index 4fef26c9e9..0000000000 --- a/config/plugins/nuke/publish/validate_unique_subsets.py +++ /dev/null @@ -1,29 +0,0 @@ -import pyblish.api - - -class ValidateUniqueSubsets(pyblish.api.InstancePlugin): - """Ensure all instances have a unique subset name""" - - order = pyblish.api.ValidatorOrder - label = "Validate Unique Subsets" - families = ["studio.saver"] - hosts = ["fusion"] - - @classmethod - def get_invalid(cls, instance): - - context = instance.context - subset = instance.data["subset"] - for other_instance in context[:]: - if other_instance == instance: - continue - - if other_instance.data["subset"] == subset: - return [instance] # current instance is invalid - - return [] - - def process(self, instance): - invalid = self.get_invalid(instance) - if invalid: - raise RuntimeError("Animation content is invalid. See log.") diff --git a/config/scripts/fusion_switch_shot.py b/config/scripts/fusion_switch_shot.py index 25eb28ad0e..7df7dd55ba 100644 --- a/config/scripts/fusion_switch_shot.py +++ b/config/scripts/fusion_switch_shot.py @@ -9,7 +9,7 @@ import avalon.fusion # Config imports import config.lib as lib -import config.apps.fusion.lib as fusion_lib +import config.fusion.lib as fusion_lib log = logging.getLogger("Update Slap Comp") diff --git a/config/setdress_api.py b/config/setdress_api.py index f8985990ea..ccb7b06af7 100644 --- a/config/setdress_api.py +++ b/config/setdress_api.py @@ -10,7 +10,7 @@ from maya import cmds from avalon import api import avalon.io as io from avalon.maya.lib import unique_namespace -from config.apps.maya.lib import matrix_equals +from config.maya.lib import matrix_equals log = logging.getLogger("PackageLoader") @@ -162,7 +162,7 @@ def _add(instance, representation_id, loaders, namespace, root="|"): """ - from config.apps.maya.lib import get_container_transforms + from config.maya.lib import get_container_transforms # Process within the namespace with namespaced(namespace, new=False) as namespace: @@ -359,7 +359,7 @@ def update_scene(set_container, containers, current_data, new_data, new_file): """ - from config.apps.maya.lib import DEFAULT_MATRIX, get_container_transforms + from config.maya.lib import DEFAULT_MATRIX, get_container_transforms set_namespace = set_container['namespace']