From 700967a28b86690cff6b95b8d8b771cbb8d552ac Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 15 May 2024 16:06:10 +0800 Subject: [PATCH 01/67] move substance painter integration to server-addon and rename the folder as ayon_substancepainter --- .../client/ayon_substancepainter}/__init__.py | 0 .../client/ayon_substancepainter}/addon.py | 0 .../ayon_substancepainter}/api/__init__.py | 0 .../ayon_substancepainter}/api/colorspace.py | 0 .../client/ayon_substancepainter}/api/lib.py | 0 .../ayon_substancepainter/api/pipeline.py | 425 ++++++++++++ .../deploy/plugins/openpype_plugin.py | 0 .../startup/openpype_load_on_first_run.py | 0 .../plugins/create/create_textures.py | 0 .../plugins/create/create_workfile.py | 0 .../plugins/load/load_mesh.py | 0 .../plugins/publish/collect_current_file.py | 0 .../publish/collect_textureset_images.py | 0 .../collect_workfile_representation.py | 0 .../plugins/publish/extract_textures.py | 0 .../plugins/publish/increment_workfile.py | 0 .../plugins/publish/save_workfile.py | 0 .../plugins/publish/validate_ouput_maps.py | 0 .../client/substancepainter/__init__.py | 10 + .../client/substancepainter/addon.py | 31 + .../client/substancepainter/api/__init__.py | 8 + .../client/substancepainter/api/colorspace.py | 157 +++++ .../client/substancepainter/api/lib.py | 642 ++++++++++++++++++ .../client}/substancepainter/api/pipeline.py | 0 .../deploy/plugins/openpype_plugin.py | 36 + .../startup/openpype_load_on_first_run.py | 43 ++ .../plugins/create/create_textures.py | 175 +++++ .../plugins/create/create_workfile.py | 124 ++++ .../plugins/load/load_mesh.py | 246 +++++++ .../plugins/publish/collect_current_file.py | 17 + .../publish/collect_textureset_images.py | 211 ++++++ .../collect_workfile_representation.py | 26 + .../plugins/publish/extract_textures.py | 62 ++ .../plugins/publish/increment_workfile.py | 23 + .../plugins/publish/save_workfile.py | 28 + .../plugins/publish/validate_ouput_maps.py | 110 +++ 36 files changed, 2374 insertions(+) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/__init__.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/addon.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/api/__init__.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/api/colorspace.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/api/lib.py (100%) create mode 100644 server_addon/substancepainter/client/ayon_substancepainter/api/pipeline.py rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/deploy/plugins/openpype_plugin.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/deploy/startup/openpype_load_on_first_run.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/plugins/create/create_textures.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/plugins/create/create_workfile.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/plugins/load/load_mesh.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/plugins/publish/collect_current_file.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/plugins/publish/collect_textureset_images.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/plugins/publish/collect_workfile_representation.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/plugins/publish/extract_textures.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/plugins/publish/increment_workfile.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/plugins/publish/save_workfile.py (100%) rename {client/ayon_core/hosts/substancepainter => server_addon/substancepainter/client/ayon_substancepainter}/plugins/publish/validate_ouput_maps.py (100%) create mode 100644 server_addon/substancepainter/client/substancepainter/__init__.py create mode 100644 server_addon/substancepainter/client/substancepainter/addon.py create mode 100644 server_addon/substancepainter/client/substancepainter/api/__init__.py create mode 100644 server_addon/substancepainter/client/substancepainter/api/colorspace.py create mode 100644 server_addon/substancepainter/client/substancepainter/api/lib.py rename {client/ayon_core/hosts => server_addon/substancepainter/client}/substancepainter/api/pipeline.py (100%) create mode 100644 server_addon/substancepainter/client/substancepainter/deploy/plugins/openpype_plugin.py create mode 100644 server_addon/substancepainter/client/substancepainter/deploy/startup/openpype_load_on_first_run.py create mode 100644 server_addon/substancepainter/client/substancepainter/plugins/create/create_textures.py create mode 100644 server_addon/substancepainter/client/substancepainter/plugins/create/create_workfile.py create mode 100644 server_addon/substancepainter/client/substancepainter/plugins/load/load_mesh.py create mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/collect_current_file.py create mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/collect_textureset_images.py create mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/collect_workfile_representation.py create mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/extract_textures.py create mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/increment_workfile.py create mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/save_workfile.py create mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/validate_ouput_maps.py diff --git a/client/ayon_core/hosts/substancepainter/__init__.py b/server_addon/substancepainter/client/ayon_substancepainter/__init__.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/__init__.py rename to server_addon/substancepainter/client/ayon_substancepainter/__init__.py diff --git a/client/ayon_core/hosts/substancepainter/addon.py b/server_addon/substancepainter/client/ayon_substancepainter/addon.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/addon.py rename to server_addon/substancepainter/client/ayon_substancepainter/addon.py diff --git a/client/ayon_core/hosts/substancepainter/api/__init__.py b/server_addon/substancepainter/client/ayon_substancepainter/api/__init__.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/api/__init__.py rename to server_addon/substancepainter/client/ayon_substancepainter/api/__init__.py diff --git a/client/ayon_core/hosts/substancepainter/api/colorspace.py b/server_addon/substancepainter/client/ayon_substancepainter/api/colorspace.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/api/colorspace.py rename to server_addon/substancepainter/client/ayon_substancepainter/api/colorspace.py diff --git a/client/ayon_core/hosts/substancepainter/api/lib.py b/server_addon/substancepainter/client/ayon_substancepainter/api/lib.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/api/lib.py rename to server_addon/substancepainter/client/ayon_substancepainter/api/lib.py diff --git a/server_addon/substancepainter/client/ayon_substancepainter/api/pipeline.py b/server_addon/substancepainter/client/ayon_substancepainter/api/pipeline.py new file mode 100644 index 0000000000..6e0ca0145b --- /dev/null +++ b/server_addon/substancepainter/client/ayon_substancepainter/api/pipeline.py @@ -0,0 +1,425 @@ +# -*- coding: utf-8 -*- +"""Pipeline tools for OpenPype Substance Painter integration.""" +import os +import logging +from functools import partial + +# Substance 3D Painter modules +import substance_painter.ui +import substance_painter.event +import substance_painter.project + +import pyblish.api + +from ayon_core.host import HostBase, IWorkfileHost, ILoadHost, IPublishHost +from ayon_core.settings import get_current_project_settings + +from ayon_core.pipeline.template_data import get_template_data_with_names +from ayon_core.pipeline import ( + register_creator_plugin_path, + register_loader_plugin_path, + AVALON_CONTAINER_ID, + Anatomy, +) +from ayon_core.lib import ( + StringTemplate, + register_event_callback, + emit_event, +) +from ayon_core.pipeline.load import any_outdated_containers +from ayon_substancepainter import SUBSTANCE_HOST_DIR + +from . import lib + +log = logging.getLogger("ayon_core.hosts.substance") + +PLUGINS_DIR = os.path.join(SUBSTANCE_HOST_DIR, "plugins") +PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") +LOAD_PATH = os.path.join(PLUGINS_DIR, "load") +CREATE_PATH = os.path.join(PLUGINS_DIR, "create") +INVENTORY_PATH = os.path.join(PLUGINS_DIR, "inventory") + +OPENPYPE_METADATA_KEY = "OpenPype" +OPENPYPE_METADATA_CONTAINERS_KEY = "containers" # child key +OPENPYPE_METADATA_CONTEXT_KEY = "context" # child key +OPENPYPE_METADATA_INSTANCES_KEY = "instances" # child key + + +class SubstanceHost(HostBase, IWorkfileHost, ILoadHost, IPublishHost): + name = "substancepainter" + + def __init__(self): + super(SubstanceHost, self).__init__() + self._has_been_setup = False + self.menu = None + self.callbacks = [] + self.shelves = [] + + def install(self): + pyblish.api.register_host("substancepainter") + + pyblish.api.register_plugin_path(PUBLISH_PATH) + register_loader_plugin_path(LOAD_PATH) + register_creator_plugin_path(CREATE_PATH) + + log.info("Installing callbacks ... ") + # register_event_callback("init", on_init) + self._register_callbacks() + # register_event_callback("before.save", before_save) + # register_event_callback("save", on_save) + register_event_callback("open", on_open) + # register_event_callback("new", on_new) + + log.info("Installing menu ... ") + self._install_menu() + + project_settings = get_current_project_settings() + self._install_shelves(project_settings) + + self._has_been_setup = True + + def uninstall(self): + self._uninstall_shelves() + self._uninstall_menu() + self._deregister_callbacks() + + def workfile_has_unsaved_changes(self): + + if not substance_painter.project.is_open(): + return False + + return substance_painter.project.needs_saving() + + def get_workfile_extensions(self): + return [".spp", ".toc"] + + def save_workfile(self, dst_path=None): + + if not substance_painter.project.is_open(): + return False + + if not dst_path: + dst_path = self.get_current_workfile() + + full_save_mode = substance_painter.project.ProjectSaveMode.Full + substance_painter.project.save_as(dst_path, full_save_mode) + + return dst_path + + def open_workfile(self, filepath): + + if not os.path.exists(filepath): + raise RuntimeError("File does not exist: {}".format(filepath)) + + # We must first explicitly close current project before opening another + if substance_painter.project.is_open(): + substance_painter.project.close() + + substance_painter.project.open(filepath) + return filepath + + def get_current_workfile(self): + if not substance_painter.project.is_open(): + return None + + filepath = substance_painter.project.file_path() + if filepath and filepath.endswith(".spt"): + # When currently in a Substance Painter template assume our + # scene isn't saved. This can be the case directly after doing + # "New project", the path will then be the template used. This + # avoids Workfiles tool trying to save as .spt extension if the + # file hasn't been saved before. + return + + return filepath + + def get_containers(self): + + if not substance_painter.project.is_open(): + return + + metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) + containers = metadata.get(OPENPYPE_METADATA_CONTAINERS_KEY) + if containers: + for key, container in containers.items(): + container["objectName"] = key + yield container + + def update_context_data(self, data, changes): + + if not substance_painter.project.is_open(): + return + + metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) + metadata.set(OPENPYPE_METADATA_CONTEXT_KEY, data) + + def get_context_data(self): + + if not substance_painter.project.is_open(): + return + + metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) + return metadata.get(OPENPYPE_METADATA_CONTEXT_KEY) or {} + + def _install_menu(self): + from PySide2 import QtWidgets + from ayon_core.tools.utils import host_tools + + parent = substance_painter.ui.get_main_window() + + tab_menu_label = os.environ.get("AYON_MENU_LABEL") or "AYON" + menu = QtWidgets.QMenu(tab_menu_label) + + action = menu.addAction("Create...") + action.triggered.connect( + lambda: host_tools.show_publisher(parent=parent, + tab="create") + ) + + action = menu.addAction("Load...") + action.triggered.connect( + lambda: host_tools.show_loader(parent=parent, use_context=True) + ) + + action = menu.addAction("Publish...") + action.triggered.connect( + lambda: host_tools.show_publisher(parent=parent, + tab="publish") + ) + + action = menu.addAction("Manage...") + action.triggered.connect( + lambda: host_tools.show_scene_inventory(parent=parent) + ) + + action = menu.addAction("Library...") + action.triggered.connect( + lambda: host_tools.show_library_loader(parent=parent) + ) + + menu.addSeparator() + action = menu.addAction("Work Files...") + action.triggered.connect( + lambda: host_tools.show_workfiles(parent=parent) + ) + + substance_painter.ui.add_menu(menu) + + def on_menu_destroyed(): + self.menu = None + + menu.destroyed.connect(on_menu_destroyed) + + self.menu = menu + + def _uninstall_menu(self): + if self.menu: + self.menu.destroy() + self.menu = None + + def _register_callbacks(self): + # Prepare emit event callbacks + open_callback = partial(emit_event, "open") + + # Connect to the Substance Painter events + dispatcher = substance_painter.event.DISPATCHER + for event, callback in [ + (substance_painter.event.ProjectOpened, open_callback) + ]: + dispatcher.connect(event, callback) + # Keep a reference so we can deregister if needed + self.callbacks.append((event, callback)) + + def _deregister_callbacks(self): + for event, callback in self.callbacks: + substance_painter.event.DISPATCHER.disconnect(event, callback) + self.callbacks.clear() + + def _install_shelves(self, project_settings): + + shelves = project_settings["substancepainter"].get("shelves", []) + if not shelves: + return + + # Prepare formatting data if we detect any path which might have + # template tokens like {folder[name]} in there. + formatting_data = {} + has_formatting_entries = any("{" in item["value"] for item in shelves) + if has_formatting_entries: + project_name = self.get_current_project_name() + folder_path = self.get_current_folder_path() + task_name = self.get_current_task_name() + formatting_data = get_template_data_with_names( + project_name, folder_path, task_name, project_settings + ) + anatomy = Anatomy(project_name) + formatting_data["root"] = anatomy.roots + + for shelve_item in shelves: + + # Allow formatting with anatomy for the paths + path = shelve_item["value"] + if "{" in path: + path = StringTemplate.format_template(path, formatting_data) + + name = shelve_item["name"] + shelf_name = None + try: + shelf_name = lib.load_shelf(path, name=name) + except ValueError as exc: + print(f"Failed to load shelf -> {exc}") + + if shelf_name: + self.shelves.append(shelf_name) + + def _uninstall_shelves(self): + for shelf_name in self.shelves: + substance_painter.resource.Shelves.remove(shelf_name) + self.shelves.clear() + + +def on_open(): + log.info("Running callback on open..") + + if any_outdated_containers(): + from ayon_core.tools.utils import SimplePopup + + log.warning("Scene has outdated content.") + + # Get main window + parent = substance_painter.ui.get_main_window() + if parent is None: + log.info("Skipping outdated content pop-up " + "because Substance window can't be found.") + else: + + # Show outdated pop-up + def _on_show_inventory(): + from ayon_core.tools.utils import host_tools + host_tools.show_scene_inventory(parent=parent) + + dialog = SimplePopup(parent=parent) + dialog.setWindowTitle("Substance scene has outdated content") + dialog.set_message("There are outdated containers in " + "your Substance scene.") + dialog.on_clicked.connect(_on_show_inventory) + dialog.show() + + +def imprint_container(container, + name, + namespace, + context, + loader): + """Imprint a loaded container with metadata. + + Containerisation enables a tracking of version, author and origin + for loaded assets. + + Arguments: + container (dict): The (substance metadata) dictionary to imprint into. + name (str): Name of resulting assembly + namespace (str): Namespace under which to host container + context (dict): Asset information + loader (load.LoaderPlugin): loader instance used to produce container. + + Returns: + None + + """ + + data = [ + ("schema", "openpype:container-2.0"), + ("id", AVALON_CONTAINER_ID), + ("name", str(name)), + ("namespace", str(namespace) if namespace else None), + ("loader", str(loader.__class__.__name__)), + ("representation", context["representation"]["id"]), + ] + for key, value in data: + container[key] = value + + +def set_container_metadata(object_name, container_data, update=False): + """Helper method to directly set the data for a specific container + + Args: + object_name (str): The unique object name identifier for the container + container_data (dict): The data for the container. + Note 'objectName' data is derived from `object_name` and key in + `container_data` will be ignored. + update (bool): Whether to only update the dict data. + + """ + # The objectName is derived from the key in the metadata so won't be stored + # in the metadata in the container's data. + container_data.pop("objectName", None) + + metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) + containers = metadata.get(OPENPYPE_METADATA_CONTAINERS_KEY) or {} + if update: + existing_data = containers.setdefault(object_name, {}) + existing_data.update(container_data) # mutable dict, in-place update + else: + containers[object_name] = container_data + metadata.set("containers", containers) + + +def remove_container_metadata(object_name): + """Helper method to remove the data for a specific container""" + metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) + containers = metadata.get(OPENPYPE_METADATA_CONTAINERS_KEY) + if containers: + containers.pop(object_name, None) + metadata.set("containers", containers) + + +def set_instance(instance_id, instance_data, update=False): + """Helper method to directly set the data for a specific container + + Args: + instance_id (str): Unique identifier for the instance + instance_data (dict): The instance data to store in the metaadata. + """ + set_instances({instance_id: instance_data}, update=update) + + +def set_instances(instance_data_by_id, update=False): + """Store data for multiple instances at the same time. + + This is more optimal than querying and setting them in the metadata one + by one. + """ + metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) + instances = metadata.get(OPENPYPE_METADATA_INSTANCES_KEY) or {} + + for instance_id, instance_data in instance_data_by_id.items(): + if update: + existing_data = instances.get(instance_id, {}) + existing_data.update(instance_data) + else: + instances[instance_id] = instance_data + + metadata.set("instances", instances) + + +def remove_instance(instance_id): + """Helper method to remove the data for a specific container""" + metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) + instances = metadata.get(OPENPYPE_METADATA_INSTANCES_KEY) or {} + instances.pop(instance_id, None) + metadata.set("instances", instances) + + +def get_instances_by_id(): + """Return all instances stored in the project instances metadata""" + if not substance_painter.project.is_open(): + return {} + + metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) + return metadata.get(OPENPYPE_METADATA_INSTANCES_KEY) or {} + + +def get_instances(): + """Return all instances stored in the project instances as a list""" + return list(get_instances_by_id().values()) diff --git a/client/ayon_core/hosts/substancepainter/deploy/plugins/openpype_plugin.py b/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/openpype_plugin.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/deploy/plugins/openpype_plugin.py rename to server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/openpype_plugin.py diff --git a/client/ayon_core/hosts/substancepainter/deploy/startup/openpype_load_on_first_run.py b/server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/openpype_load_on_first_run.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/deploy/startup/openpype_load_on_first_run.py rename to server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/openpype_load_on_first_run.py diff --git a/client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_textures.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/plugins/create/create_textures.py rename to server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_textures.py diff --git a/client/ayon_core/hosts/substancepainter/plugins/create/create_workfile.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/plugins/create/create_workfile.py rename to server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py diff --git a/client/ayon_core/hosts/substancepainter/plugins/load/load_mesh.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/load/load_mesh.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/plugins/load/load_mesh.py rename to server_addon/substancepainter/client/ayon_substancepainter/plugins/load/load_mesh.py diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/collect_current_file.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/collect_current_file.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/plugins/publish/collect_current_file.py rename to server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/collect_current_file.py diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/collect_textureset_images.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/collect_textureset_images.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/plugins/publish/collect_textureset_images.py rename to server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/collect_textureset_images.py diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/collect_workfile_representation.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/collect_workfile_representation.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/plugins/publish/collect_workfile_representation.py rename to server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/collect_workfile_representation.py diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/extract_textures.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/extract_textures.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/plugins/publish/extract_textures.py rename to server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/extract_textures.py diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/increment_workfile.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/increment_workfile.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/plugins/publish/increment_workfile.py rename to server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/increment_workfile.py diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/save_workfile.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/save_workfile.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/plugins/publish/save_workfile.py rename to server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/save_workfile.py diff --git a/client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/validate_ouput_maps.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/plugins/publish/validate_ouput_maps.py rename to server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/validate_ouput_maps.py diff --git a/server_addon/substancepainter/client/substancepainter/__init__.py b/server_addon/substancepainter/client/substancepainter/__init__.py new file mode 100644 index 0000000000..4c33b9f507 --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/__init__.py @@ -0,0 +1,10 @@ +from .addon import ( + SubstanceAddon, + SUBSTANCE_HOST_DIR, +) + + +__all__ = ( + "SubstanceAddon", + "SUBSTANCE_HOST_DIR" +) diff --git a/server_addon/substancepainter/client/substancepainter/addon.py b/server_addon/substancepainter/client/substancepainter/addon.py new file mode 100644 index 0000000000..26829d3153 --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/addon.py @@ -0,0 +1,31 @@ +import os +from ayon_core.addon import AYONAddon, IHostAddon + +SUBSTANCE_HOST_DIR = os.path.dirname(os.path.abspath(__file__)) + + +class SubstanceAddon(AYONAddon, IHostAddon): + name = "substancepainter" + host_name = "substancepainter" + + def add_implementation_envs(self, env, _app): + # Add requirements to SUBSTANCE_PAINTER_PLUGINS_PATH + plugin_path = os.path.join(SUBSTANCE_HOST_DIR, "deploy") + plugin_path = plugin_path.replace("\\", "/") + if env.get("SUBSTANCE_PAINTER_PLUGINS_PATH"): + plugin_path += os.pathsep + env["SUBSTANCE_PAINTER_PLUGINS_PATH"] + + env["SUBSTANCE_PAINTER_PLUGINS_PATH"] = plugin_path + + # Log in Substance Painter doesn't support custom terminal colors + env["AYON_LOG_NO_COLORS"] = "1" + + def get_launch_hook_paths(self, app): + if app.host_name != self.host_name: + return [] + return [ + os.path.join(SUBSTANCE_HOST_DIR, "hooks") + ] + + def get_workfile_extensions(self): + return [".spp", ".toc"] diff --git a/server_addon/substancepainter/client/substancepainter/api/__init__.py b/server_addon/substancepainter/client/substancepainter/api/__init__.py new file mode 100644 index 0000000000..937d0c429e --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/api/__init__.py @@ -0,0 +1,8 @@ +from .pipeline import ( + SubstanceHost, + +) + +__all__ = [ + "SubstanceHost", +] diff --git a/server_addon/substancepainter/client/substancepainter/api/colorspace.py b/server_addon/substancepainter/client/substancepainter/api/colorspace.py new file mode 100644 index 0000000000..375b61b39b --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/api/colorspace.py @@ -0,0 +1,157 @@ +"""Substance Painter OCIO management + +Adobe Substance 3D Painter supports OCIO color management using a per project +configuration. Output color spaces are defined at the project level + +More information see: + - https://substance3d.adobe.com/documentation/spdoc/color-management-223053233.html # noqa + - https://substance3d.adobe.com/documentation/spdoc/color-management-with-opencolorio-225969419.html # noqa + +""" +import substance_painter.export +import substance_painter.js +import json + +from .lib import ( + get_document_structure, + get_channel_format +) + + +def _iter_document_stack_channels(): + """Yield all stack paths and channels project""" + + for material in get_document_structure()["materials"]: + material_name = material["name"] + for stack in material["stacks"]: + stack_name = stack["name"] + if stack_name: + stack_path = [material_name, stack_name] + else: + stack_path = material_name + for channel in stack["channels"]: + yield stack_path, channel + + +def _get_first_color_and_data_stack_and_channel(): + """Return first found color channel and data channel.""" + color_channel = None + data_channel = None + for stack_path, channel in _iter_document_stack_channels(): + channel_format = get_channel_format(stack_path, channel) + if channel_format["color"]: + color_channel = (stack_path, channel) + else: + data_channel = (stack_path, channel) + + if color_channel and data_channel: + return color_channel, data_channel + + return color_channel, data_channel + + +def get_project_channel_data(): + """Return colorSpace settings for the current substance painter project. + + In Substance Painter only color channels have Color Management enabled + whereas data channels have no color management applied. This can't be + changed. The artist can only customize the export color space for color + channels per bit-depth for 8 bpc, 16 bpc and 32 bpc. + + As such this returns the color space for 'data' and for per bit-depth + for color channels. + + Example output: + { + "data": {'colorSpace': 'Utility - Raw'}, + "8": {"colorSpace": "ACES - AcesCG"}, + "16": {"colorSpace": "ACES - AcesCG"}, + "16f": {"colorSpace": "ACES - AcesCG"}, + "32f": {"colorSpace": "ACES - AcesCG"} + } + + """ + + keys = ["colorSpace"] + query = {key: f"${key}" for key in keys} + + config = { + "exportPath": "/", + "exportShaderParams": False, + "defaultExportPreset": "query_preset", + + "exportPresets": [{ + "name": "query_preset", + + # List of maps making up this export preset. + "maps": [{ + "fileName": json.dumps(query), + # List of source/destination defining which channels will + # make up the texture file. + "channels": [], + "parameters": { + "fileFormat": "exr", + "bitDepth": "32f", + "dithering": False, + "sizeLog2": 4, + "paddingAlgorithm": "passthrough", + "dilationDistance": 16 + } + }] + }], + } + + def _get_query_output(config): + # Return the basename of the single output path we defined + result = substance_painter.export.list_project_textures(config) + path = next(iter(result.values()))[0] + # strip extension and slash since we know relevant json data starts + # and ends with { and } characters + path = path.strip("/\\.exr") + return json.loads(path) + + # Query for each type of channel (color and data) + color_channel, data_channel = _get_first_color_and_data_stack_and_channel() + colorspaces = {} + for key, channel_data in { + "data": data_channel, + "color": color_channel + }.items(): + if channel_data is None: + # No channel of that datatype anywhere in the Stack. We're + # unable to identify the output color space of the project + colorspaces[key] = None + continue + + stack, channel = channel_data + + # Stack must be a string + if not isinstance(stack, str): + # Assume iterable + stack = "/".join(stack) + + # Define the temp output config + config["exportList"] = [{"rootPath": stack}] + config_map = config["exportPresets"][0]["maps"][0] + config_map["channels"] = [ + { + "destChannel": x, + "srcChannel": x, + "srcMapType": "documentMap", + "srcMapName": channel + } for x in "RGB" + ] + + if key == "color": + # Query for each bit depth + # Color space definition can have a different OCIO config set + # for 8-bit, 16-bit and 32-bit outputs so we need to check each + # bit depth + for depth in ["8", "16", "16f", "32f"]: + config_map["parameters"]["bitDepth"] = depth # noqa + colorspaces[key + depth] = _get_query_output(config) + else: + # Data channel (not color managed) + colorspaces[key] = _get_query_output(config) + + return colorspaces diff --git a/server_addon/substancepainter/client/substancepainter/api/lib.py b/server_addon/substancepainter/client/substancepainter/api/lib.py new file mode 100644 index 0000000000..64c39943ce --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/api/lib.py @@ -0,0 +1,642 @@ +import os +import re +import json +from collections import defaultdict + +import substance_painter.project +import substance_painter.resource +import substance_painter.js +import substance_painter.export + +from qtpy import QtGui, QtWidgets, QtCore + + +def get_export_presets(): + """Return Export Preset resource URLs for all available Export Presets. + + Returns: + dict: {Resource url: GUI Label} + + """ + # TODO: Find more optimal way to find all export templates + + preset_resources = {} + for shelf in substance_painter.resource.Shelves.all(): + shelf_path = os.path.normpath(shelf.path()) + + presets_path = os.path.join(shelf_path, "export-presets") + if not os.path.exists(presets_path): + continue + + for filename in os.listdir(presets_path): + if filename.endswith(".spexp"): + template_name = os.path.splitext(filename)[0] + + resource = substance_painter.resource.ResourceID( + context=shelf.name(), + name=template_name + ) + resource_url = resource.url() + + preset_resources[resource_url] = template_name + + # Sort by template name + export_templates = dict(sorted(preset_resources.items(), + key=lambda x: x[1])) + + # Add default built-ins at the start + # TODO: find the built-ins automatically; scraped with https://gist.github.com/BigRoy/97150c7c6f0a0c916418207b9a2bc8f1 # noqa + result = { + "export-preset-generator://viewport2d": "2D View", # noqa + "export-preset-generator://doc-channel-normal-no-alpha": "Document channels + Normal + AO (No Alpha)", # noqa + "export-preset-generator://doc-channel-normal-with-alpha": "Document channels + Normal + AO (With Alpha)", # noqa + "export-preset-generator://sketchfab": "Sketchfab", # noqa + "export-preset-generator://adobe-standard-material": "Substance 3D Stager", # noqa + "export-preset-generator://usd": "USD PBR Metal Roughness", # noqa + "export-preset-generator://gltf": "glTF PBR Metal Roughness", # noqa + "export-preset-generator://gltf-displacement": "glTF PBR Metal Roughness + Displacement texture (experimental)" # noqa + } + result.update(export_templates) + return result + + +def _convert_stack_path_to_cmd_str(stack_path): + """Convert stack path `str` or `[str, str]` for javascript query + + Example usage: + >>> stack_path = _convert_stack_path_to_cmd_str(stack_path) + >>> cmd = f"alg.mapexport.channelIdentifiers({stack_path})" + >>> substance_painter.js.evaluate(cmd) + + Args: + stack_path (list or str): Path to the stack, could be + "Texture set name" or ["Texture set name", "Stack name"] + + Returns: + str: Stack path usable as argument in javascript query. + + """ + return json.dumps(stack_path) + + +def get_channel_identifiers(stack_path=None): + """Return the list of channel identifiers. + + If a context is passed (texture set/stack), + return only used channels with resolved user channels. + + Channel identifiers are: + basecolor, height, specular, opacity, emissive, displacement, + glossiness, roughness, anisotropylevel, anisotropyangle, transmissive, + scattering, reflection, ior, metallic, normal, ambientOcclusion, + diffuse, specularlevel, blendingmask, [custom user names]. + + Args: + stack_path (list or str, Optional): Path to the stack, could be + "Texture set name" or ["Texture set name", "Stack name"] + + Returns: + list: List of channel identifiers. + + """ + if stack_path is None: + stack_path = "" + else: + stack_path = _convert_stack_path_to_cmd_str(stack_path) + cmd = f"alg.mapexport.channelIdentifiers({stack_path})" + return substance_painter.js.evaluate(cmd) + + +def get_channel_format(stack_path, channel): + """Retrieve the channel format of a specific stack channel. + + See `alg.mapexport.channelFormat` (javascript API) for more details. + + The channel format data is: + "label" (str): The channel format label: could be one of + [sRGB8, L8, RGB8, L16, RGB16, L16F, RGB16F, L32F, RGB32F] + "color" (bool): True if the format is in color, False is grayscale + "floating" (bool): True if the format uses floating point + representation, false otherwise + "bitDepth" (int): Bit per color channel (could be 8, 16 or 32 bpc) + + Arguments: + stack_path (list or str): Path to the stack, could be + "Texture set name" or ["Texture set name", "Stack name"] + channel (str): Identifier of the channel to export + (see `get_channel_identifiers`) + + Returns: + dict: The channel format data. + + """ + stack_path = _convert_stack_path_to_cmd_str(stack_path) + cmd = f"alg.mapexport.channelFormat({stack_path}, '{channel}')" + return substance_painter.js.evaluate(cmd) + + +def get_document_structure(): + """Dump the document structure. + + See `alg.mapexport.documentStructure` (javascript API) for more details. + + Returns: + dict: Document structure or None when no project is open + + """ + return substance_painter.js.evaluate("alg.mapexport.documentStructure()") + + +def get_export_templates(config, format="png", strip_folder=True): + """Return export config outputs. + + This use the Javascript API `alg.mapexport.getPathsExportDocumentMaps` + which returns a different output than using the Python equivalent + `substance_painter.export.list_project_textures(config)`. + + The nice thing about the Javascript API version is that it returns the + output textures grouped by filename template. + + A downside is that it doesn't return all the UDIM tiles but per template + always returns a single file. + + Note: + The file format needs to be explicitly passed to the Javascript API + but upon exporting through the Python API the file format can be based + on the output preset. So it's likely the file extension will mismatch + + Warning: + Even though the function appears to solely get the expected outputs + the Javascript API will actually create the config's texture output + folder if it does not exist yet. As such, a valid path must be set. + + Example output: + { + "DefaultMaterial": { + "$textureSet_BaseColor(_$colorSpace)(.$udim)": "DefaultMaterial_BaseColor_ACES - ACEScg.1002.png", # noqa + "$textureSet_Emissive(_$colorSpace)(.$udim)": "DefaultMaterial_Emissive_ACES - ACEScg.1002.png", # noqa + "$textureSet_Height(_$colorSpace)(.$udim)": "DefaultMaterial_Height_Utility - Raw.1002.png", # noqa + "$textureSet_Metallic(_$colorSpace)(.$udim)": "DefaultMaterial_Metallic_Utility - Raw.1002.png", # noqa + "$textureSet_Normal(_$colorSpace)(.$udim)": "DefaultMaterial_Normal_Utility - Raw.1002.png", # noqa + "$textureSet_Roughness(_$colorSpace)(.$udim)": "DefaultMaterial_Roughness_Utility - Raw.1002.png" # noqa + } + } + + Arguments: + config (dict) Export config + format (str, Optional): Output format to write to, defaults to 'png' + strip_folder (bool, Optional): Whether to strip the output folder + from the output filenames. + + Returns: + dict: The expected output maps. + + """ + folder = config["exportPath"].replace("\\", "/") + preset = config["defaultExportPreset"] + cmd = f'alg.mapexport.getPathsExportDocumentMaps("{preset}", "{folder}", "{format}")' # noqa + result = substance_painter.js.evaluate(cmd) + + if strip_folder: + for _stack, maps in result.items(): + for map_template, map_filepath in maps.items(): + map_filepath = map_filepath.replace("\\", "/") + assert map_filepath.startswith(folder) + map_filename = map_filepath[len(folder):].lstrip("/") + maps[map_template] = map_filename + + return result + + +def _templates_to_regex(templates, + texture_set, + colorspaces, + project, + mesh): + """Return regex based on a Substance Painter expot filename template. + + This converts Substance Painter export filename templates like + `$mesh_$textureSet_BaseColor(_$colorSpace)(.$udim)` into a regex + which can be used to query an output filename to help retrieve: + + - Which template filename the file belongs to. + - Which color space the file is written with. + - Which udim tile it is exactly. + + This is used by `get_parsed_export_maps` which tries to as explicitly + as possible match the filename pattern against the known possible outputs. + That's why Texture Set name, Color spaces, Project path and mesh path must + be provided. By doing so we get the best shot at correctly matching the + right template because otherwise $texture_set could basically be any string + and thus match even that of a color space or mesh. + + Arguments: + templates (list): List of templates to convert to regex. + texture_set (str): The texture set to match against. + colorspaces (list): The colorspaces defined in the current project. + project (str): Filepath of current substance project. + mesh (str): Path to mesh file used in current project. + + Returns: + dict: Template: Template regex pattern + + """ + def _filename_no_ext(path): + return os.path.splitext(os.path.basename(path))[0] + + if colorspaces and any(colorspaces): + colorspace_match = "|".join(re.escape(c) for c in set(colorspaces)) + colorspace_match = f"({colorspace_match})" + else: + # No colorspace support enabled + colorspace_match = "" + + # Key to regex valid search values + key_matches = { + "$project": re.escape(_filename_no_ext(project)), + "$mesh": re.escape(_filename_no_ext(mesh)), + "$textureSet": re.escape(texture_set), + "$colorSpace": colorspace_match, + "$udim": "([0-9]{4})" + } + + # Turn the templates into regexes + regexes = {} + for template in templates: + + # We need to tweak a temp + search_regex = re.escape(template) + + # Let's assume that any ( and ) character in the file template was + # intended as an optional template key and do a simple `str.replace` + # Note: we are matching against re.escape(template) so will need to + # search for the escaped brackets. + search_regex = search_regex.replace(re.escape("("), "(") + search_regex = search_regex.replace(re.escape(")"), ")?") + + # Substitute each key into a named group + for key, key_expected_regex in key_matches.items(): + + # We want to use the template as a regex basis in the end so will + # escape the whole thing first. Note that thus we'll need to + # search for the escaped versions of the keys too. + escaped_key = re.escape(key) + key_label = key[1:] # key without $ prefix + + key_expected_grp_regex = f"(?P<{key_label}>{key_expected_regex})" + search_regex = search_regex.replace(escaped_key, + key_expected_grp_regex) + + # The filename templates don't include the extension so we add it + # to be able to match the out filename beginning to end + ext_regex = r"(?P\.[A-Za-z][A-Za-z0-9-]*)" + search_regex = rf"^{search_regex}{ext_regex}$" + + regexes[template] = search_regex + + return regexes + + +def strip_template(template, strip="._ "): + """Return static characters in a substance painter filename template. + + >>> strip_template("$textureSet_HELLO(.$udim)") + # HELLO + >>> strip_template("$mesh_$textureSet_HELLO_WORLD_$colorSpace(.$udim)") + # HELLO_WORLD + >>> strip_template("$textureSet_HELLO(.$udim)", strip=None) + # _HELLO + >>> strip_template("$mesh_$textureSet_$colorSpace(.$udim)", strip=None) + # _HELLO_ + >>> strip_template("$textureSet_HELLO(.$udim)") + # _HELLO + + Arguments: + template (str): Filename template to strip. + strip (str, optional): Characters to strip from beginning and end + of the static string in template. Defaults to: `._ `. + + Returns: + str: The static string in filename template. + + """ + # Return only characters that were part of the template that were static. + # Remove all keys + keys = ["$project", "$mesh", "$textureSet", "$udim", "$colorSpace"] + stripped_template = template + for key in keys: + stripped_template = stripped_template.replace(key, "") + + # Everything inside an optional bracket space is excluded since it's not + # static. We keep a counter to track whether we are currently iterating + # over parts of the template that are inside an 'optional' group or not. + counter = 0 + result = "" + for char in stripped_template: + if char == "(": + counter += 1 + elif char == ")": + counter -= 1 + if counter < 0: + counter = 0 + else: + if counter == 0: + result += char + + if strip: + # Strip of any trailing start/end characters. Technically these are + # static but usually start and end separators like space or underscore + # aren't wanted. + result = result.strip(strip) + + return result + + +def get_parsed_export_maps(config): + """Return Export Config's expected output textures with parsed data. + + This tries to parse the texture outputs using a Python API export config. + + Parses template keys: $project, $mesh, $textureSet, $colorSpace, $udim + + Example: + {("DefaultMaterial", ""): { + "$mesh_$textureSet_BaseColor(_$colorSpace)(.$udim)": [ + { + // OUTPUT DATA FOR FILE #1 OF THE TEMPLATE + }, + { + // OUTPUT DATA FOR FILE #2 OF THE TEMPLATE + }, + ] + }, + }} + + File output data (all outputs are `str`). + 1) Parsed tokens: These are parsed tokens from the template, they will + only exist if found in the filename template and output filename. + + project: Workfile filename without extension + mesh: Filename of the loaded mesh without extension + textureSet: The texture set, e.g. "DefaultMaterial", + colorSpace: The color space, e.g. "ACES - ACEScg", + udim: The udim tile, e.g. "1001" + + 2) Template output and filepath + + filepath: Full path to the resulting texture map, e.g. + "/path/to/mesh_DefaultMaterial_BaseColor_ACES - ACEScg.1002.png", + output: "mesh_DefaultMaterial_BaseColor_ACES - ACEScg.1002.png" + Note: if template had slashes (folders) then `output` will too. + So `output` might include a folder. + + Returns: + dict: [texture_set, stack]: {template: [file1_data, file2_data]} + + """ + # Import is here to avoid recursive lib <-> colorspace imports + from .colorspace import get_project_channel_data + + outputs = substance_painter.export.list_project_textures(config) + templates = get_export_templates(config, strip_folder=False) + + # Get all color spaces set for the current project + project_colorspaces = set( + data["colorSpace"] for data in get_project_channel_data().values() + ) + + # Get current project mesh path and project path to explicitly match + # the $mesh and $project tokens + project_mesh_path = substance_painter.project.last_imported_mesh_path() + project_path = substance_painter.project.file_path() + + # Get the current export path to strip this of the beginning of filepath + # results, since filename templates don't have these we'll match without + # that part of the filename. + export_path = config["exportPath"] + export_path = export_path.replace("\\", "/") + if not export_path.endswith("/"): + export_path += "/" + + # Parse the outputs + result = {} + for key, filepaths in outputs.items(): + texture_set, stack = key + + if stack: + stack_path = f"{texture_set}/{stack}" + else: + stack_path = texture_set + + stack_templates = list(templates[stack_path].keys()) + + template_regex = _templates_to_regex(stack_templates, + texture_set=texture_set, + colorspaces=project_colorspaces, + mesh=project_mesh_path, + project=project_path) + + # Let's precompile the regexes + for template, regex in template_regex.items(): + template_regex[template] = re.compile(regex) + + stack_results = defaultdict(list) + for filepath in sorted(filepaths): + # We strip explicitly using the full parent export path instead of + # using `os.path.basename` because export template is allowed to + # have subfolders in its template which we want to match against + filepath = filepath.replace("\\", "/") + assert filepath.startswith(export_path), ( + f"Filepath {filepath} must start with folder {export_path}" + ) + filename = filepath[len(export_path):] + + for template, regex in template_regex.items(): + match = regex.match(filename) + if match: + parsed = match.groupdict(default={}) + + # Include some special outputs for convenience + parsed["filepath"] = filepath + parsed["output"] = filename + + stack_results[template].append(parsed) + break + else: + raise ValueError(f"Unable to match {filename} against any " + f"template in: {list(template_regex.keys())}") + + result[key] = dict(stack_results) + + return result + + +def load_shelf(path, name=None): + """Add shelf to substance painter (for current application session) + + This will dynamically add a Shelf for the current session. It's good + to note however that these will *not* persist on restart of the host. + + Note: + Consider the loaded shelf a static library of resources. + + The shelf will *not* be visible in application preferences in + Edit > Settings > Libraries. + + The shelf will *not* show in the Assets browser if it has no existing + assets + + The shelf will *not* be a selectable option for selecting it as a + destination to import resources too. + + """ + + # Ensure expanded path with forward slashes + path = os.path.expandvars(path) + path = os.path.abspath(path) + path = path.replace("\\", "/") + + # Path must exist + if not os.path.isdir(path): + raise ValueError(f"Path is not an existing folder: {path}") + + # This name must be unique and must only contain lowercase letters, + # numbers, underscores or hyphens. + if name is None: + name = os.path.basename(path) + + name = name.lower() + name = re.sub(r"[^a-z0-9_\-]", "_", name) # sanitize to underscores + + if substance_painter.resource.Shelves.exists(name): + shelf = next( + shelf for shelf in substance_painter.resource.Shelves.all() + if shelf.name() == name + ) + if os.path.normpath(shelf.path()) != os.path.normpath(path): + raise ValueError(f"Shelf with name '{name}' already exists " + f"for a different path: '{shelf.path()}") + + return + + print(f"Adding Shelf '{name}' to path: {path}") + substance_painter.resource.Shelves.add(name, path) + + return name + + +def _get_new_project_action(): + """Return QAction which triggers Substance Painter's new project dialog""" + + main_window = substance_painter.ui.get_main_window() + + # Find the file menu's New file action + menubar = main_window.menuBar() + new_action = None + for action in menubar.actions(): + menu = action.menu() + if not menu: + continue + + if menu.objectName() != "file": + continue + + # Find the action with the CTRL+N key sequence + new_action = next(action for action in menu.actions() + if action.shortcut() == QtGui.QKeySequence.New) + break + + return new_action + + +def prompt_new_file_with_mesh(mesh_filepath): + """Prompts the user for a new file using Substance Painter's own dialog. + + This will set the mesh path to load to the given mesh and disables the + dialog box to disallow the user to change the path. This way we can allow + user configuration of a project but set the mesh path ourselves. + + Warning: + This is very hacky and experimental. + + Note: + If a project is currently open using the same mesh filepath it can't + accurately detect whether the user had actually accepted the new project + dialog or whether the project afterwards is still the original project, + for example when the user might have cancelled the operation. + + """ + + app = QtWidgets.QApplication.instance() + assert os.path.isfile(mesh_filepath), \ + f"Mesh filepath does not exist: {mesh_filepath}" + + def _setup_file_dialog(): + """Set filepath in QFileDialog and trigger accept result""" + file_dialog = app.activeModalWidget() + assert isinstance(file_dialog, QtWidgets.QFileDialog) + + # Quickly hide the dialog + file_dialog.hide() + app.processEvents(QtCore.QEventLoop.ExcludeUserInputEvents, 1000) + + file_dialog.setDirectory(os.path.dirname(mesh_filepath)) + url = QtCore.QUrl.fromLocalFile(os.path.basename(mesh_filepath)) + file_dialog.selectUrl(url) + # TODO: find a way to improve the process event to + # load more complicated mesh + app.processEvents(QtCore.QEventLoop.ExcludeUserInputEvents, 3000) + file_dialog.done(file_dialog.Accepted) + app.processEvents(QtCore.QEventLoop.AllEvents) + + def _setup_prompt(): + app.processEvents(QtCore.QEventLoop.ExcludeUserInputEvents) + dialog = app.activeModalWidget() + assert dialog.objectName() == "NewProjectDialog" + + # Set the window title + mesh = os.path.basename(mesh_filepath) + dialog.setWindowTitle(f"New Project with mesh: {mesh}") + + # Get the select mesh file button + mesh_select = dialog.findChild(QtWidgets.QPushButton, "meshSelect") + + # Hide the select mesh button to the user to block changing of mesh + mesh_select.setVisible(False) + + # Ensure UI is visually up-to-date + app.processEvents(QtCore.QEventLoop.ExcludeUserInputEvents, 8000) + + # Trigger the 'select file' dialog to set the path and have the + # new file dialog to use the path. + QtCore.QTimer.singleShot(10, _setup_file_dialog) + mesh_select.click() + + app.processEvents(QtCore.QEventLoop.AllEvents, 5000) + + mesh_filename = dialog.findChild(QtWidgets.QFrame, "meshFileName") + mesh_filename_label = mesh_filename.findChild(QtWidgets.QLabel) + if not mesh_filename_label.text(): + dialog.close() + substance_painter.logging.warning( + "Failed to set mesh path with the prompt dialog:" + f"{mesh_filepath}\n\n" + "Creating new project directly with the mesh path instead.") + + new_action = _get_new_project_action() + if not new_action: + raise RuntimeError("Unable to detect new file action..") + + QtCore.QTimer.singleShot(0, _setup_prompt) + new_action.trigger() + app.processEvents(QtCore.QEventLoop.AllEvents, 5000) + + if not substance_painter.project.is_open(): + return + + # Confirm mesh was set as expected + project_mesh = substance_painter.project.last_imported_mesh_path() + if os.path.normpath(project_mesh) != os.path.normpath(mesh_filepath): + return + + return project_mesh diff --git a/client/ayon_core/hosts/substancepainter/api/pipeline.py b/server_addon/substancepainter/client/substancepainter/api/pipeline.py similarity index 100% rename from client/ayon_core/hosts/substancepainter/api/pipeline.py rename to server_addon/substancepainter/client/substancepainter/api/pipeline.py diff --git a/server_addon/substancepainter/client/substancepainter/deploy/plugins/openpype_plugin.py b/server_addon/substancepainter/client/substancepainter/deploy/plugins/openpype_plugin.py new file mode 100644 index 0000000000..8ced463367 --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/deploy/plugins/openpype_plugin.py @@ -0,0 +1,36 @@ + + +def cleanup_openpype_qt_widgets(): + """ + Workaround for Substance failing to shut down correctly + when a Qt window was still open at the time of shutting down. + + This seems to work sometimes, but not all the time. + + """ + # TODO: Create a more reliable method to close down all OpenPype Qt widgets + from PySide2 import QtWidgets + import substance_painter.ui + + # Kill OpenPype Qt widgets + print("Killing OpenPype Qt widgets..") + for widget in QtWidgets.QApplication.topLevelWidgets(): + if widget.__module__.startswith("openpype."): + print(f"Deleting widget: {widget.__class__.__name__}") + substance_painter.ui.delete_ui_element(widget) + + +def start_plugin(): + from ayon_core.pipeline import install_host + from ayon_core.hosts.substancepainter.api import SubstanceHost + install_host(SubstanceHost()) + + +def close_plugin(): + from ayon_core.pipeline import uninstall_host + cleanup_openpype_qt_widgets() + uninstall_host() + + +if __name__ == "__main__": + start_plugin() diff --git a/server_addon/substancepainter/client/substancepainter/deploy/startup/openpype_load_on_first_run.py b/server_addon/substancepainter/client/substancepainter/deploy/startup/openpype_load_on_first_run.py new file mode 100644 index 0000000000..04b610b4df --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/deploy/startup/openpype_load_on_first_run.py @@ -0,0 +1,43 @@ +"""Ease the OpenPype on-boarding process by loading the plug-in on first run""" + +OPENPYPE_PLUGIN_NAME = "openpype_plugin" + + +def start_plugin(): + try: + # This isn't exposed in the official API so we keep it in a try-except + from painter_plugins_ui import ( + get_settings, + LAUNCH_AT_START_KEY, + ON_STATE, + PLUGINS_MENU, + plugin_manager + ) + + # The `painter_plugins_ui` plug-in itself is also a startup plug-in + # we need to take into account that it could run either earlier or + # later than this startup script, we check whether its menu initialized + is_before_plugins_menu = PLUGINS_MENU is None + + settings = get_settings(OPENPYPE_PLUGIN_NAME) + if settings.value(LAUNCH_AT_START_KEY, None) is None: + print("Initializing OpenPype plug-in on first run...") + if is_before_plugins_menu: + print("- running before 'painter_plugins_ui'") + # Delay the launch to the painter_plugins_ui initialization + settings.setValue(LAUNCH_AT_START_KEY, ON_STATE) + else: + # Launch now + print("- running after 'painter_plugins_ui'") + plugin_manager(OPENPYPE_PLUGIN_NAME)(True) + + # Set the checked state in the menu to avoid confusion + action = next(action for action in PLUGINS_MENU._menu.actions() + if action.text() == OPENPYPE_PLUGIN_NAME) + if action is not None: + action.blockSignals(True) + action.setChecked(True) + action.blockSignals(False) + + except Exception as exc: + print(exc) diff --git a/server_addon/substancepainter/client/substancepainter/plugins/create/create_textures.py b/server_addon/substancepainter/client/substancepainter/plugins/create/create_textures.py new file mode 100644 index 0000000000..f46afadb5a --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/plugins/create/create_textures.py @@ -0,0 +1,175 @@ +# -*- coding: utf-8 -*- +"""Creator plugin for creating textures.""" + +from ayon_core.pipeline import CreatedInstance, Creator, CreatorError +from ayon_core.lib import ( + EnumDef, + UILabelDef, + NumberDef, + BoolDef +) + +from ayon_core.hosts.substancepainter.api.pipeline import ( + get_instances, + set_instance, + set_instances, + remove_instance +) +from ayon_core.hosts.substancepainter.api.lib import get_export_presets + +import substance_painter.project + + +class CreateTextures(Creator): + """Create a texture set.""" + identifier = "io.openpype.creators.substancepainter.textureset" + label = "Textures" + product_type = "textureSet" + icon = "picture-o" + + default_variant = "Main" + + def create(self, product_name, instance_data, pre_create_data): + + if not substance_painter.project.is_open(): + raise CreatorError("Can't create a Texture Set instance without " + "an open project.") + # Transfer settings from pre create to instance + creator_attributes = instance_data.setdefault( + "creator_attributes", dict()) + for key in [ + "exportPresetUrl", + "exportFileFormat", + "exportSize", + "exportPadding", + "exportDilationDistance" + ]: + if key in pre_create_data: + creator_attributes[key] = pre_create_data[key] + + instance = self.create_instance_in_context(product_name, + instance_data) + set_instance( + instance_id=instance["instance_id"], + instance_data=instance.data_to_store() + ) + + def collect_instances(self): + for instance in get_instances(): + if (instance.get("creator_identifier") == self.identifier or + instance.get("productType") == self.product_type): + self.create_instance_in_context_from_existing(instance) + + def update_instances(self, update_list): + instance_data_by_id = {} + for instance, _changes in update_list: + # Persist the data + instance_id = instance.get("instance_id") + instance_data = instance.data_to_store() + instance_data_by_id[instance_id] = instance_data + set_instances(instance_data_by_id, update=True) + + def remove_instances(self, instances): + for instance in instances: + remove_instance(instance["instance_id"]) + self._remove_instance_from_context(instance) + + # Helper methods (this might get moved into Creator class) + def create_instance_in_context(self, product_name, data): + instance = CreatedInstance( + self.product_type, product_name, data, self + ) + self.create_context.creator_adds_instance(instance) + return instance + + def create_instance_in_context_from_existing(self, data): + instance = CreatedInstance.from_existing(data, self) + self.create_context.creator_adds_instance(instance) + return instance + + def get_instance_attr_defs(self): + + return [ + EnumDef("exportPresetUrl", + items=get_export_presets(), + label="Output Template"), + BoolDef("allowSkippedMaps", + label="Allow Skipped Output Maps", + tooltip="When enabled this allows the publish to ignore " + "output maps in the used output template if one " + "or more maps are skipped due to the required " + "channels not being present in the current file.", + default=True), + EnumDef("exportFileFormat", + items={ + None: "Based on output template", + # TODO: Get available extensions from substance API + "bmp": "bmp", + "ico": "ico", + "jpeg": "jpeg", + "jng": "jng", + "pbm": "pbm", + "pgm": "pgm", + "png": "png", + "ppm": "ppm", + "tga": "targa", + "tif": "tiff", + "wap": "wap", + "wbmp": "wbmp", + "xpm": "xpm", + "gif": "gif", + "hdr": "hdr", + "exr": "exr", + "j2k": "j2k", + "jp2": "jp2", + "pfm": "pfm", + "webp": "webp", + # TODO: Unsure why jxr format fails to export + # "jxr": "jpeg-xr", + # TODO: File formats that combine the exported textures + # like psd are not correctly supported due to + # publishing only a single file + # "psd": "psd", + # "sbsar": "sbsar", + }, + default=None, + label="File type"), + EnumDef("exportSize", + items={ + None: "Based on each Texture Set's size", + # The key is size of the texture file in log2. + # (i.e. 10 means 2^10 = 1024) + 7: "128", + 8: "256", + 9: "512", + 10: "1024", + 11: "2048", + 12: "4096", + 13: "8192" + }, + default=None, + label="Size"), + + EnumDef("exportPadding", + items={ + "passthrough": "No padding (passthrough)", + "infinite": "Dilation infinite", + "transparent": "Dilation + transparent", + "color": "Dilation + default background color", + "diffusion": "Dilation + diffusion" + }, + default="infinite", + label="Padding"), + NumberDef("exportDilationDistance", + minimum=0, + maximum=256, + decimals=0, + default=16, + label="Dilation Distance"), + UILabelDef("*only used with " + "'Dilation + ' padding"), + ] + + def get_pre_create_attr_defs(self): + # Use same attributes as for instance attributes + return self.get_instance_attr_defs() diff --git a/server_addon/substancepainter/client/substancepainter/plugins/create/create_workfile.py b/server_addon/substancepainter/client/substancepainter/plugins/create/create_workfile.py new file mode 100644 index 0000000000..63b1c6c7da --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/plugins/create/create_workfile.py @@ -0,0 +1,124 @@ +# -*- coding: utf-8 -*- +"""Creator plugin for creating workfiles.""" + +import ayon_api + +from ayon_core.pipeline import CreatedInstance, AutoCreator + +from ayon_core.hosts.substancepainter.api.pipeline import ( + set_instances, + set_instance, + get_instances +) + +import substance_painter.project + + +class CreateWorkfile(AutoCreator): + """Workfile auto-creator.""" + identifier = "io.openpype.creators.substancepainter.workfile" + label = "Workfile" + product_type = "workfile" + icon = "document" + + default_variant = "Main" + + def create(self): + + if not substance_painter.project.is_open(): + return + + variant = self.default_variant + project_name = self.project_name + folder_path = self.create_context.get_current_folder_path() + task_name = self.create_context.get_current_task_name() + host_name = self.create_context.host_name + + # Workfile instance should always exist and must only exist once. + # As such we'll first check if it already exists and is collected. + current_instance = next( + ( + instance for instance in self.create_context.instances + if instance.creator_identifier == self.identifier + ), None) + + current_folder_path = None + if current_instance is not None: + current_folder_path = current_instance["folderPath"] + + if current_instance is None: + self.log.info("Auto-creating workfile instance...") + folder_entity = ayon_api.get_folder_by_path( + project_name, folder_path + ) + task_entity = ayon_api.get_task_by_name( + project_name, folder_entity["id"], task_name + ) + product_name = self.get_product_name( + project_name, + folder_entity, + task_entity, + variant, + host_name, + ) + data = { + "folderPath": folder_path, + "task": task_name, + "variant": variant + } + current_instance = self.create_instance_in_context(product_name, + data) + elif ( + current_folder_path != folder_path + or current_instance["task"] != task_name + ): + # Update instance context if is not the same + folder_entity = ayon_api.get_folder_by_path( + project_name, folder_path + ) + task_entity = ayon_api.get_task_by_name( + project_name, folder_entity["id"], task_name + ) + product_name = self.get_product_name( + project_name, + folder_entity, + task_entity, + variant, + host_name, + ) + current_instance["folderPath"] = folder_path + current_instance["task"] = task_name + current_instance["productName"] = product_name + + set_instance( + instance_id=current_instance.get("instance_id"), + instance_data=current_instance.data_to_store() + ) + + def collect_instances(self): + for instance in get_instances(): + if (instance.get("creator_identifier") == self.identifier or + instance.get("productType") == self.product_type): + self.create_instance_in_context_from_existing(instance) + + def update_instances(self, update_list): + instance_data_by_id = {} + for instance, _changes in update_list: + # Persist the data + instance_id = instance.get("instance_id") + instance_data = instance.data_to_store() + instance_data_by_id[instance_id] = instance_data + set_instances(instance_data_by_id, update=True) + + # Helper methods (this might get moved into Creator class) + def create_instance_in_context(self, product_name, data): + instance = CreatedInstance( + self.product_type, product_name, data, self + ) + self.create_context.creator_adds_instance(instance) + return instance + + def create_instance_in_context_from_existing(self, data): + instance = CreatedInstance.from_existing(data, self) + self.create_context.creator_adds_instance(instance) + return instance diff --git a/server_addon/substancepainter/client/substancepainter/plugins/load/load_mesh.py b/server_addon/substancepainter/client/substancepainter/plugins/load/load_mesh.py new file mode 100644 index 0000000000..d5aac1191c --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/plugins/load/load_mesh.py @@ -0,0 +1,246 @@ +import copy +from qtpy import QtWidgets, QtCore +from ayon_core.pipeline import ( + load, + get_representation_path, +) +from ayon_core.pipeline.load import LoadError +from ayon_core.hosts.substancepainter.api.pipeline import ( + imprint_container, + set_container_metadata, + remove_container_metadata +) + +import substance_painter.project + + +def _convert(substance_attr): + """Return Substance Painter Python API Project attribute from string. + + This converts a string like "ProjectWorkflow.Default" to for example + the Substance Painter Python API equivalent object, like: + `substance_painter.project.ProjectWorkflow.Default` + + Args: + substance_attr (str): The `substance_painter.project` attribute, + for example "ProjectWorkflow.Default" + + Returns: + Any: Substance Python API object of the project attribute. + + Raises: + ValueError: If attribute does not exist on the + `substance_painter.project` python api. + """ + root = substance_painter.project + for attr in substance_attr.split("."): + root = getattr(root, attr, None) + if root is None: + raise ValueError( + "Substance Painter project attribute" + f" does not exist: {substance_attr}") + + return root + + +def get_template_by_name(name: str, templates: list[dict]) -> dict: + return next( + template for template in templates + if template["name"] == name + ) + + +class SubstanceProjectConfigurationWindow(QtWidgets.QDialog): + """The pop-up dialog allows users to choose material + duplicate options for importing Max objects when updating + or switching assets. + """ + def __init__(self, project_templates): + super(SubstanceProjectConfigurationWindow, self).__init__() + self.setWindowFlags(self.windowFlags() | QtCore.Qt.FramelessWindowHint) + + self.configuration = None + self.template_names = [template["name"] for template + in project_templates] + self.project_templates = project_templates + + self.widgets = { + "label": QtWidgets.QLabel( + "Select your template for project configuration"), + "template_options": QtWidgets.QComboBox(), + "import_cameras": QtWidgets.QCheckBox("Import Cameras"), + "preserve_strokes": QtWidgets.QCheckBox("Preserve Strokes"), + "clickbox": QtWidgets.QWidget(), + "combobox": QtWidgets.QWidget(), + "buttons": QtWidgets.QDialogButtonBox( + QtWidgets.QDialogButtonBox.Ok + | QtWidgets.QDialogButtonBox.Cancel) + } + + self.widgets["template_options"].addItems(self.template_names) + + template_name = self.widgets["template_options"].currentText() + self._update_to_match_template(template_name) + # Build clickboxes + layout = QtWidgets.QHBoxLayout(self.widgets["clickbox"]) + layout.addWidget(self.widgets["import_cameras"]) + layout.addWidget(self.widgets["preserve_strokes"]) + # Build combobox + layout = QtWidgets.QHBoxLayout(self.widgets["combobox"]) + layout.addWidget(self.widgets["template_options"]) + # Build buttons + layout = QtWidgets.QHBoxLayout(self.widgets["buttons"]) + # Build layout. + layout = QtWidgets.QVBoxLayout(self) + layout.addWidget(self.widgets["label"]) + layout.addWidget(self.widgets["combobox"]) + layout.addWidget(self.widgets["clickbox"]) + layout.addWidget(self.widgets["buttons"]) + + self.widgets["template_options"].currentTextChanged.connect( + self._update_to_match_template) + self.widgets["buttons"].accepted.connect(self.on_accept) + self.widgets["buttons"].rejected.connect(self.on_reject) + + def on_accept(self): + self.configuration = self.get_project_configuration() + self.close() + + def on_reject(self): + self.close() + + def _update_to_match_template(self, template_name): + template = get_template_by_name(template_name, self.project_templates) + self.widgets["import_cameras"].setChecked(template["import_cameras"]) + self.widgets["preserve_strokes"].setChecked( + template["preserve_strokes"]) + + def get_project_configuration(self): + templates = self.project_templates + template_name = self.widgets["template_options"].currentText() + template = get_template_by_name(template_name, templates) + template = copy.deepcopy(template) # do not edit the original + template["import_cameras"] = self.widgets["import_cameras"].isChecked() + template["preserve_strokes"] = ( + self.widgets["preserve_strokes"].isChecked() + ) + for key in ["normal_map_format", + "project_workflow", + "tangent_space_mode"]: + template[key] = _convert(template[key]) + return template + + @classmethod + def prompt(cls, templates): + dialog = cls(templates) + dialog.exec_() + configuration = dialog.configuration + dialog.deleteLater() + return configuration + + +class SubstanceLoadProjectMesh(load.LoaderPlugin): + """Load mesh for project""" + + product_types = {"*"} + representations = {"abc", "fbx", "obj", "gltf", "usd", "usda", "usdc"} + + label = "Load mesh" + order = -10 + icon = "code-fork" + color = "orange" + + # Defined via settings + project_templates = [] + + def load(self, context, name, namespace, options=None): + + # Get user inputs + result = SubstanceProjectConfigurationWindow.prompt( + self.project_templates) + if not result: + # cancelling loader action + return + if not substance_painter.project.is_open(): + # Allow to 'initialize' a new project + path = self.filepath_from_context(context) + sp_settings = substance_painter.project.Settings( + import_cameras=result["import_cameras"], + normal_map_format=result["normal_map_format"], + project_workflow=result["project_workflow"], + tangent_space_mode=result["tangent_space_mode"], + default_texture_resolution=result["default_texture_resolution"] + ) + settings = substance_painter.project.create( + mesh_file_path=path, settings=sp_settings + ) + else: + # Reload the mesh + settings = substance_painter.project.MeshReloadingSettings( + import_cameras=result["import_cameras"], + preserve_strokes=result["preserve_strokes"]) + + def on_mesh_reload(status: substance_painter.project.ReloadMeshStatus): # noqa + if status == substance_painter.project.ReloadMeshStatus.SUCCESS: # noqa + self.log.info("Reload succeeded") + else: + raise LoadError("Reload of mesh failed") + + path = self.filepath_from_context(context) + substance_painter.project.reload_mesh(path, + settings, + on_mesh_reload) + + # Store container + container = {} + project_mesh_object_name = "_ProjectMesh_" + imprint_container(container, + name=project_mesh_object_name, + namespace=project_mesh_object_name, + context=context, + loader=self) + + # We want store some options for updating to keep consistent behavior + # from the user's original choice. We don't store 'preserve_strokes' + # as we always preserve strokes on updates. + container["options"] = { + "import_cameras": result["import_cameras"], + } + + set_container_metadata(project_mesh_object_name, container) + + def switch(self, container, context): + self.update(container, context) + + def update(self, container, context): + repre_entity = context["representation"] + + path = get_representation_path(repre_entity) + + # Reload the mesh + container_options = container.get("options", {}) + settings = substance_painter.project.MeshReloadingSettings( + import_cameras=container_options.get("import_cameras", True), + preserve_strokes=True + ) + + def on_mesh_reload(status: substance_painter.project.ReloadMeshStatus): + if status == substance_painter.project.ReloadMeshStatus.SUCCESS: + self.log.info("Reload succeeded") + else: + raise LoadError("Reload of mesh failed") + + substance_painter.project.reload_mesh(path, settings, on_mesh_reload) + + # Update container representation + object_name = container["objectName"] + update_data = {"representation": repre_entity["id"]} + set_container_metadata(object_name, update_data, update=True) + + def remove(self, container): + + # Remove OpenPype related settings about what model was loaded + # or close the project? + # TODO: This is likely best 'hidden' away to the user because + # this will leave the project's mesh unmanaged. + remove_container_metadata(container["objectName"]) diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_current_file.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_current_file.py new file mode 100644 index 0000000000..db0edafac0 --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_current_file.py @@ -0,0 +1,17 @@ +import pyblish.api + +from ayon_core.pipeline import registered_host + + +class CollectCurrentFile(pyblish.api.ContextPlugin): + """Inject the current working file into context""" + + order = pyblish.api.CollectorOrder - 0.49 + label = "Current Workfile" + hosts = ["substancepainter"] + + def process(self, context): + host = registered_host() + path = host.get_current_workfile() + context.data["currentFile"] = path + self.log.debug(f"Current workfile: {path}") diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_textureset_images.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_textureset_images.py new file mode 100644 index 0000000000..20aaa56993 --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_textureset_images.py @@ -0,0 +1,211 @@ +import os +import copy + +import pyblish.api +import ayon_api + +import substance_painter.textureset +from ayon_core.pipeline import publish +from ayon_core.hosts.substancepainter.api.lib import ( + get_parsed_export_maps, + strip_template +) +from ayon_core.pipeline.create import get_product_name + + +class CollectTextureSet(pyblish.api.InstancePlugin): + """Extract Textures using an output template config""" + # TODO: Production-test usage of color spaces + # TODO: Detect what source data channels end up in each file + + label = "Collect Texture Set images" + hosts = ["substancepainter"] + families = ["textureSet"] + order = pyblish.api.CollectorOrder + + def process(self, instance): + + config = self.get_export_config(instance) + project_name = instance.context.data["projectName"] + folder_entity = ayon_api.get_folder_by_path( + project_name, + instance.data["folderPath"] + ) + task_name = instance.data.get("task") + task_entity = None + if folder_entity and task_name: + task_entity = ayon_api.get_task_by_name( + project_name, folder_entity["id"], task_name + ) + + instance.data["exportConfig"] = config + maps = get_parsed_export_maps(config) + + # Let's break the instance into multiple instances to integrate + # a product per generated texture or texture UDIM sequence + for (texture_set_name, stack_name), template_maps in maps.items(): + self.log.info(f"Processing {texture_set_name}/{stack_name}") + for template, outputs in template_maps.items(): + self.log.info(f"Processing {template}") + self.create_image_instance(instance, template, outputs, + task_entity=task_entity, + texture_set_name=texture_set_name, + stack_name=stack_name) + + def create_image_instance(self, instance, template, outputs, + task_entity, texture_set_name, stack_name): + """Create a new instance per image or UDIM sequence. + + The new instances will be of product type `image`. + + """ + + context = instance.context + first_filepath = outputs[0]["filepath"] + fnames = [os.path.basename(output["filepath"]) for output in outputs] + ext = os.path.splitext(first_filepath)[1] + assert ext.lstrip("."), f"No extension: {ext}" + + always_include_texture_set_name = False # todo: make this configurable + all_texture_sets = substance_painter.textureset.all_texture_sets() + texture_set = substance_painter.textureset.TextureSet.from_name( + texture_set_name + ) + + # Define the suffix we want to give this particular texture + # set and set up a remapped product naming for it. + suffix = "" + if always_include_texture_set_name or len(all_texture_sets) > 1: + # More than one texture set, include texture set name + suffix += f".{texture_set_name}" + if texture_set.is_layered_material() and stack_name: + # More than one stack, include stack name + suffix += f".{stack_name}" + + # Always include the map identifier + map_identifier = strip_template(template) + suffix += f".{map_identifier}" + + task_name = task_type = None + if task_entity: + task_name = task_entity["name"] + task_type = task_entity["taskType"] + + image_product_name = get_product_name( + # TODO: The product type actually isn't 'texture' currently but + # for now this is only done so the product name starts with + # 'texture' + context.data["projectName"], + task_name, + task_type, + context.data["hostName"], + product_type="texture", + variant=instance.data["variant"] + suffix, + project_settings=context.data["project_settings"] + ) + + # Prepare representation + representation = { + "name": ext.lstrip("."), + "ext": ext.lstrip("."), + "files": fnames if len(fnames) > 1 else fnames[0], + } + + # Mark as UDIM explicitly if it has UDIM tiles. + if bool(outputs[0].get("udim")): + # The representation for a UDIM sequence should have a `udim` key + # that is a list of all udim tiles (str) like: ["1001", "1002"] + # strings. See CollectTextures plug-in and Integrators. + representation["udim"] = [output["udim"] for output in outputs] + + # Set up the representation for thumbnail generation + # TODO: Simplify this once thumbnail extraction is refactored + staging_dir = os.path.dirname(first_filepath) + representation["tags"] = ["review"] + representation["stagingDir"] = staging_dir + + # Clone the instance + product_type = "image" + image_instance = context.create_instance(image_product_name) + image_instance[:] = instance[:] + image_instance.data.update(copy.deepcopy(dict(instance.data))) + image_instance.data["name"] = image_product_name + image_instance.data["label"] = image_product_name + image_instance.data["productName"] = image_product_name + image_instance.data["productType"] = product_type + image_instance.data["family"] = product_type + image_instance.data["families"] = [product_type, "textures"] + image_instance.data["representations"] = [representation] + + # Group the textures together in the loader + image_instance.data["productGroup"] = image_product_name + + # Store the texture set name and stack name on the instance + image_instance.data["textureSetName"] = texture_set_name + image_instance.data["textureStackName"] = stack_name + + # Store color space with the instance + # Note: The extractor will assign it to the representation + colorspace = outputs[0].get("colorSpace") + if colorspace: + self.log.debug(f"{image_product_name} colorspace: {colorspace}") + image_instance.data["colorspace"] = colorspace + + # Store the instance in the original instance as a member + instance.append(image_instance) + + def get_export_config(self, instance): + """Return an export configuration dict for texture exports. + + This config can be supplied to: + - `substance_painter.export.export_project_textures` + - `substance_painter.export.list_project_textures` + + See documentation on substance_painter.export module about the + formatting of the configuration dictionary. + + Args: + instance (pyblish.api.Instance): Texture Set instance to be + published. + + Returns: + dict: Export config + + """ + + creator_attrs = instance.data["creator_attributes"] + preset_url = creator_attrs["exportPresetUrl"] + self.log.debug(f"Exporting using preset: {preset_url}") + + # See: https://substance3d.adobe.com/documentation/ptpy/api/substance_painter/export # noqa + config = { # noqa + "exportShaderParams": True, + "exportPath": publish.get_instance_staging_dir(instance), + "defaultExportPreset": preset_url, + + # Custom overrides to the exporter + "exportParameters": [ + { + "parameters": { + "fileFormat": creator_attrs["exportFileFormat"], + "sizeLog2": creator_attrs["exportSize"], + "paddingAlgorithm": creator_attrs["exportPadding"], + "dilationDistance": creator_attrs["exportDilationDistance"] # noqa + } + } + ] + } + + # Create the list of Texture Sets to export. + config["exportList"] = [] + for texture_set in substance_painter.textureset.all_texture_sets(): + config["exportList"].append({"rootPath": texture_set.name()}) + + # Consider None values from the creator attributes optionals + for override in config["exportParameters"]: + parameters = override.get("parameters") + for key, value in dict(parameters).items(): + if value is None: + parameters.pop(key) + + return config diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_workfile_representation.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_workfile_representation.py new file mode 100644 index 0000000000..8d98d0b014 --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_workfile_representation.py @@ -0,0 +1,26 @@ +import os +import pyblish.api + + +class CollectWorkfileRepresentation(pyblish.api.InstancePlugin): + """Create a publish representation for the current workfile instance.""" + + order = pyblish.api.CollectorOrder + label = "Workfile representation" + hosts = ["substancepainter"] + families = ["workfile"] + + def process(self, instance): + + context = instance.context + current_file = context.data["currentFile"] + + folder, file = os.path.split(current_file) + filename, ext = os.path.splitext(file) + + instance.data["representations"] = [{ + "name": ext.lstrip("."), + "ext": ext.lstrip("."), + "files": file, + "stagingDir": folder, + }] diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/extract_textures.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/extract_textures.py new file mode 100644 index 0000000000..0fa7b52f45 --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/plugins/publish/extract_textures.py @@ -0,0 +1,62 @@ +import substance_painter.export + +from ayon_core.pipeline import KnownPublishError, publish + + +class ExtractTextures(publish.Extractor, + publish.ColormanagedPyblishPluginMixin): + """Extract Textures using an output template config. + + Note: + This Extractor assumes that `collect_textureset_images` has prepared + the relevant export config and has also collected the individual image + instances for publishing including its representation. That is why this + particular Extractor doesn't specify representations to integrate. + + """ + + label = "Extract Texture Set" + hosts = ["substancepainter"] + families = ["textureSet"] + + # Run before thumbnail extractors + order = publish.Extractor.order - 0.1 + + def process(self, instance): + + config = instance.data["exportConfig"] + result = substance_painter.export.export_project_textures(config) + + if result.status != substance_painter.export.ExportStatus.Success: + raise KnownPublishError( + "Failed to export texture set: {}".format(result.message) + ) + + # Log what files we generated + for (texture_set_name, stack_name), maps in result.textures.items(): + # Log our texture outputs + self.log.info(f"Exported stack: {texture_set_name} {stack_name}") + for texture_map in maps: + self.log.info(f"Exported texture: {texture_map}") + + # We'll insert the color space data for each image instance that we + # added into this texture set. The collector couldn't do so because + # some anatomy and other instance data needs to be collected prior + context = instance.context + for image_instance in instance: + representation = next(iter(image_instance.data["representations"])) + + colorspace = image_instance.data.get("colorspace") + if not colorspace: + self.log.debug("No color space data present for instance: " + f"{image_instance}") + continue + + self.set_representation_colorspace(representation, + context=context, + colorspace=colorspace) + + # The TextureSet instance should not be integrated. It generates no + # output data. Instead the separated texture instances are generated + # from it which themselves integrate into the database. + instance.data["integrate"] = False diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/increment_workfile.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/increment_workfile.py new file mode 100644 index 0000000000..521a28130b --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/plugins/publish/increment_workfile.py @@ -0,0 +1,23 @@ +import pyblish.api + +from ayon_core.lib import version_up +from ayon_core.pipeline import registered_host + + +class IncrementWorkfileVersion(pyblish.api.ContextPlugin): + """Increment current workfile version.""" + + order = pyblish.api.IntegratorOrder + 1 + label = "Increment Workfile Version" + optional = True + hosts = ["substancepainter"] + + def process(self, context): + + assert all(result["success"] for result in context.data["results"]), ( + "Publishing not successful so version is not increased.") + + host = registered_host() + path = context.data["currentFile"] + self.log.info(f"Incrementing current workfile to: {path}") + host.save_workfile(version_up(path)) diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/save_workfile.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/save_workfile.py new file mode 100644 index 0000000000..627fb991aa --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/plugins/publish/save_workfile.py @@ -0,0 +1,28 @@ +import pyblish.api + +from ayon_core.pipeline import ( + registered_host, + KnownPublishError +) + + +class SaveCurrentWorkfile(pyblish.api.ContextPlugin): + """Save current workfile""" + + label = "Save current workfile" + order = pyblish.api.ExtractorOrder - 0.49 + hosts = ["substancepainter"] + + def process(self, context): + + host = registered_host() + current = host.get_current_workfile() + if context.data["currentFile"] != current: + raise KnownPublishError("Workfile has changed during publishing!") + + if host.workfile_has_unsaved_changes(): + self.log.info("Saving current file: {}".format(current)) + host.save_workfile() + else: + self.log.debug("Skipping workfile save because there are no " + "unsaved changes.") diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/validate_ouput_maps.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/validate_ouput_maps.py new file mode 100644 index 0000000000..720771994c --- /dev/null +++ b/server_addon/substancepainter/client/substancepainter/plugins/publish/validate_ouput_maps.py @@ -0,0 +1,110 @@ +import copy +import os + +import pyblish.api + +import substance_painter.export + +from ayon_core.pipeline import PublishValidationError + + +class ValidateOutputMaps(pyblish.api.InstancePlugin): + """Validate all output maps for Output Template are generated. + + Output maps will be skipped by Substance Painter if it is an output + map in the Substance Output Template which uses channels that the current + substance painter project has not painted or generated. + + """ + + order = pyblish.api.ValidatorOrder + label = "Validate output maps" + hosts = ["substancepainter"] + families = ["textureSet"] + + def process(self, instance): + + config = instance.data["exportConfig"] + + # Substance Painter API does not allow to query the actual output maps + # it will generate without actually exporting the files. So we try to + # generate the smallest size / fastest export as possible + config = copy.deepcopy(config) + parameters = config["exportParameters"][0]["parameters"] + parameters["sizeLog2"] = [1, 1] # output 2x2 images (smallest) + parameters["paddingAlgorithm"] = "passthrough" # no dilation (faster) + parameters["dithering"] = False # no dithering (faster) + + result = substance_painter.export.export_project_textures(config) + if result.status != substance_painter.export.ExportStatus.Success: + raise PublishValidationError( + "Failed to export texture set: {}".format(result.message) + ) + + generated_files = set() + for texture_maps in result.textures.values(): + for texture_map in texture_maps: + generated_files.add(os.path.normpath(texture_map)) + # Directly clean up our temporary export + os.remove(texture_map) + + creator_attributes = instance.data.get("creator_attributes", {}) + allow_skipped_maps = creator_attributes.get("allowSkippedMaps", True) + error_report_missing = [] + for image_instance in instance: + + # Confirm whether the instance has its expected files generated. + # We assume there's just one representation and that it is + # the actual texture representation from the collector. + representation = next(iter(image_instance.data["representations"])) + staging_dir = representation["stagingDir"] + filenames = representation["files"] + if not isinstance(filenames, (list, tuple)): + # Convert single file to list + filenames = [filenames] + + missing = [] + for filename in filenames: + filepath = os.path.join(staging_dir, filename) + filepath = os.path.normpath(filepath) + if filepath not in generated_files: + self.log.warning(f"Missing texture: {filepath}") + missing.append(filepath) + + if not missing: + continue + + if allow_skipped_maps: + # TODO: This is changing state on the instance's which + # should not be done during validation. + self.log.warning(f"Disabling texture instance: " + f"{image_instance}") + image_instance.data["active"] = False + image_instance.data["publish"] = False + image_instance.data["integrate"] = False + representation.setdefault("tags", []).append("delete") + continue + else: + error_report_missing.append((image_instance, missing)) + + if error_report_missing: + + message = ( + "The Texture Set skipped exporting some output maps which are " + "defined in the Output Template. This happens if the Output " + "Templates exports maps from channels which you do not " + "have in your current Substance Painter project.\n\n" + "To allow this enable the *Allow Skipped Output Maps* setting " + "on the instance.\n\n" + f"Instance {instance} skipped exporting output maps:\n" + "" + ) + + for image_instance, missing in error_report_missing: + missing_str = ", ".join(missing) + message += f"- **{image_instance}** skipped: {missing_str}\n" + + raise PublishValidationError( + message=message, + title="Missing output maps" + ) From c9d1998cab20f7b49798d27f7c2ff830fd92a71c Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 15 May 2024 16:06:38 +0800 Subject: [PATCH 02/67] move substance painter integration to server-addon and rename the folder as ayon_substancepainter --- .../client/substancepainter/__init__.py | 10 - .../client/substancepainter/addon.py | 31 - .../client/substancepainter/api/__init__.py | 8 - .../client/substancepainter/api/colorspace.py | 157 ----- .../client/substancepainter/api/lib.py | 642 ------------------ .../client/substancepainter/api/pipeline.py | 425 ------------ .../deploy/plugins/openpype_plugin.py | 36 - .../startup/openpype_load_on_first_run.py | 43 -- .../plugins/create/create_textures.py | 175 ----- .../plugins/create/create_workfile.py | 124 ---- .../plugins/load/load_mesh.py | 246 ------- .../plugins/publish/collect_current_file.py | 17 - .../publish/collect_textureset_images.py | 211 ------ .../collect_workfile_representation.py | 26 - .../plugins/publish/extract_textures.py | 62 -- .../plugins/publish/increment_workfile.py | 23 - .../plugins/publish/save_workfile.py | 28 - .../plugins/publish/validate_ouput_maps.py | 110 --- server_addon/substancepainter/package.py | 9 +- 19 files changed, 8 insertions(+), 2375 deletions(-) delete mode 100644 server_addon/substancepainter/client/substancepainter/__init__.py delete mode 100644 server_addon/substancepainter/client/substancepainter/addon.py delete mode 100644 server_addon/substancepainter/client/substancepainter/api/__init__.py delete mode 100644 server_addon/substancepainter/client/substancepainter/api/colorspace.py delete mode 100644 server_addon/substancepainter/client/substancepainter/api/lib.py delete mode 100644 server_addon/substancepainter/client/substancepainter/api/pipeline.py delete mode 100644 server_addon/substancepainter/client/substancepainter/deploy/plugins/openpype_plugin.py delete mode 100644 server_addon/substancepainter/client/substancepainter/deploy/startup/openpype_load_on_first_run.py delete mode 100644 server_addon/substancepainter/client/substancepainter/plugins/create/create_textures.py delete mode 100644 server_addon/substancepainter/client/substancepainter/plugins/create/create_workfile.py delete mode 100644 server_addon/substancepainter/client/substancepainter/plugins/load/load_mesh.py delete mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/collect_current_file.py delete mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/collect_textureset_images.py delete mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/collect_workfile_representation.py delete mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/extract_textures.py delete mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/increment_workfile.py delete mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/save_workfile.py delete mode 100644 server_addon/substancepainter/client/substancepainter/plugins/publish/validate_ouput_maps.py diff --git a/server_addon/substancepainter/client/substancepainter/__init__.py b/server_addon/substancepainter/client/substancepainter/__init__.py deleted file mode 100644 index 4c33b9f507..0000000000 --- a/server_addon/substancepainter/client/substancepainter/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -from .addon import ( - SubstanceAddon, - SUBSTANCE_HOST_DIR, -) - - -__all__ = ( - "SubstanceAddon", - "SUBSTANCE_HOST_DIR" -) diff --git a/server_addon/substancepainter/client/substancepainter/addon.py b/server_addon/substancepainter/client/substancepainter/addon.py deleted file mode 100644 index 26829d3153..0000000000 --- a/server_addon/substancepainter/client/substancepainter/addon.py +++ /dev/null @@ -1,31 +0,0 @@ -import os -from ayon_core.addon import AYONAddon, IHostAddon - -SUBSTANCE_HOST_DIR = os.path.dirname(os.path.abspath(__file__)) - - -class SubstanceAddon(AYONAddon, IHostAddon): - name = "substancepainter" - host_name = "substancepainter" - - def add_implementation_envs(self, env, _app): - # Add requirements to SUBSTANCE_PAINTER_PLUGINS_PATH - plugin_path = os.path.join(SUBSTANCE_HOST_DIR, "deploy") - plugin_path = plugin_path.replace("\\", "/") - if env.get("SUBSTANCE_PAINTER_PLUGINS_PATH"): - plugin_path += os.pathsep + env["SUBSTANCE_PAINTER_PLUGINS_PATH"] - - env["SUBSTANCE_PAINTER_PLUGINS_PATH"] = plugin_path - - # Log in Substance Painter doesn't support custom terminal colors - env["AYON_LOG_NO_COLORS"] = "1" - - def get_launch_hook_paths(self, app): - if app.host_name != self.host_name: - return [] - return [ - os.path.join(SUBSTANCE_HOST_DIR, "hooks") - ] - - def get_workfile_extensions(self): - return [".spp", ".toc"] diff --git a/server_addon/substancepainter/client/substancepainter/api/__init__.py b/server_addon/substancepainter/client/substancepainter/api/__init__.py deleted file mode 100644 index 937d0c429e..0000000000 --- a/server_addon/substancepainter/client/substancepainter/api/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -from .pipeline import ( - SubstanceHost, - -) - -__all__ = [ - "SubstanceHost", -] diff --git a/server_addon/substancepainter/client/substancepainter/api/colorspace.py b/server_addon/substancepainter/client/substancepainter/api/colorspace.py deleted file mode 100644 index 375b61b39b..0000000000 --- a/server_addon/substancepainter/client/substancepainter/api/colorspace.py +++ /dev/null @@ -1,157 +0,0 @@ -"""Substance Painter OCIO management - -Adobe Substance 3D Painter supports OCIO color management using a per project -configuration. Output color spaces are defined at the project level - -More information see: - - https://substance3d.adobe.com/documentation/spdoc/color-management-223053233.html # noqa - - https://substance3d.adobe.com/documentation/spdoc/color-management-with-opencolorio-225969419.html # noqa - -""" -import substance_painter.export -import substance_painter.js -import json - -from .lib import ( - get_document_structure, - get_channel_format -) - - -def _iter_document_stack_channels(): - """Yield all stack paths and channels project""" - - for material in get_document_structure()["materials"]: - material_name = material["name"] - for stack in material["stacks"]: - stack_name = stack["name"] - if stack_name: - stack_path = [material_name, stack_name] - else: - stack_path = material_name - for channel in stack["channels"]: - yield stack_path, channel - - -def _get_first_color_and_data_stack_and_channel(): - """Return first found color channel and data channel.""" - color_channel = None - data_channel = None - for stack_path, channel in _iter_document_stack_channels(): - channel_format = get_channel_format(stack_path, channel) - if channel_format["color"]: - color_channel = (stack_path, channel) - else: - data_channel = (stack_path, channel) - - if color_channel and data_channel: - return color_channel, data_channel - - return color_channel, data_channel - - -def get_project_channel_data(): - """Return colorSpace settings for the current substance painter project. - - In Substance Painter only color channels have Color Management enabled - whereas data channels have no color management applied. This can't be - changed. The artist can only customize the export color space for color - channels per bit-depth for 8 bpc, 16 bpc and 32 bpc. - - As such this returns the color space for 'data' and for per bit-depth - for color channels. - - Example output: - { - "data": {'colorSpace': 'Utility - Raw'}, - "8": {"colorSpace": "ACES - AcesCG"}, - "16": {"colorSpace": "ACES - AcesCG"}, - "16f": {"colorSpace": "ACES - AcesCG"}, - "32f": {"colorSpace": "ACES - AcesCG"} - } - - """ - - keys = ["colorSpace"] - query = {key: f"${key}" for key in keys} - - config = { - "exportPath": "/", - "exportShaderParams": False, - "defaultExportPreset": "query_preset", - - "exportPresets": [{ - "name": "query_preset", - - # List of maps making up this export preset. - "maps": [{ - "fileName": json.dumps(query), - # List of source/destination defining which channels will - # make up the texture file. - "channels": [], - "parameters": { - "fileFormat": "exr", - "bitDepth": "32f", - "dithering": False, - "sizeLog2": 4, - "paddingAlgorithm": "passthrough", - "dilationDistance": 16 - } - }] - }], - } - - def _get_query_output(config): - # Return the basename of the single output path we defined - result = substance_painter.export.list_project_textures(config) - path = next(iter(result.values()))[0] - # strip extension and slash since we know relevant json data starts - # and ends with { and } characters - path = path.strip("/\\.exr") - return json.loads(path) - - # Query for each type of channel (color and data) - color_channel, data_channel = _get_first_color_and_data_stack_and_channel() - colorspaces = {} - for key, channel_data in { - "data": data_channel, - "color": color_channel - }.items(): - if channel_data is None: - # No channel of that datatype anywhere in the Stack. We're - # unable to identify the output color space of the project - colorspaces[key] = None - continue - - stack, channel = channel_data - - # Stack must be a string - if not isinstance(stack, str): - # Assume iterable - stack = "/".join(stack) - - # Define the temp output config - config["exportList"] = [{"rootPath": stack}] - config_map = config["exportPresets"][0]["maps"][0] - config_map["channels"] = [ - { - "destChannel": x, - "srcChannel": x, - "srcMapType": "documentMap", - "srcMapName": channel - } for x in "RGB" - ] - - if key == "color": - # Query for each bit depth - # Color space definition can have a different OCIO config set - # for 8-bit, 16-bit and 32-bit outputs so we need to check each - # bit depth - for depth in ["8", "16", "16f", "32f"]: - config_map["parameters"]["bitDepth"] = depth # noqa - colorspaces[key + depth] = _get_query_output(config) - else: - # Data channel (not color managed) - colorspaces[key] = _get_query_output(config) - - return colorspaces diff --git a/server_addon/substancepainter/client/substancepainter/api/lib.py b/server_addon/substancepainter/client/substancepainter/api/lib.py deleted file mode 100644 index 64c39943ce..0000000000 --- a/server_addon/substancepainter/client/substancepainter/api/lib.py +++ /dev/null @@ -1,642 +0,0 @@ -import os -import re -import json -from collections import defaultdict - -import substance_painter.project -import substance_painter.resource -import substance_painter.js -import substance_painter.export - -from qtpy import QtGui, QtWidgets, QtCore - - -def get_export_presets(): - """Return Export Preset resource URLs for all available Export Presets. - - Returns: - dict: {Resource url: GUI Label} - - """ - # TODO: Find more optimal way to find all export templates - - preset_resources = {} - for shelf in substance_painter.resource.Shelves.all(): - shelf_path = os.path.normpath(shelf.path()) - - presets_path = os.path.join(shelf_path, "export-presets") - if not os.path.exists(presets_path): - continue - - for filename in os.listdir(presets_path): - if filename.endswith(".spexp"): - template_name = os.path.splitext(filename)[0] - - resource = substance_painter.resource.ResourceID( - context=shelf.name(), - name=template_name - ) - resource_url = resource.url() - - preset_resources[resource_url] = template_name - - # Sort by template name - export_templates = dict(sorted(preset_resources.items(), - key=lambda x: x[1])) - - # Add default built-ins at the start - # TODO: find the built-ins automatically; scraped with https://gist.github.com/BigRoy/97150c7c6f0a0c916418207b9a2bc8f1 # noqa - result = { - "export-preset-generator://viewport2d": "2D View", # noqa - "export-preset-generator://doc-channel-normal-no-alpha": "Document channels + Normal + AO (No Alpha)", # noqa - "export-preset-generator://doc-channel-normal-with-alpha": "Document channels + Normal + AO (With Alpha)", # noqa - "export-preset-generator://sketchfab": "Sketchfab", # noqa - "export-preset-generator://adobe-standard-material": "Substance 3D Stager", # noqa - "export-preset-generator://usd": "USD PBR Metal Roughness", # noqa - "export-preset-generator://gltf": "glTF PBR Metal Roughness", # noqa - "export-preset-generator://gltf-displacement": "glTF PBR Metal Roughness + Displacement texture (experimental)" # noqa - } - result.update(export_templates) - return result - - -def _convert_stack_path_to_cmd_str(stack_path): - """Convert stack path `str` or `[str, str]` for javascript query - - Example usage: - >>> stack_path = _convert_stack_path_to_cmd_str(stack_path) - >>> cmd = f"alg.mapexport.channelIdentifiers({stack_path})" - >>> substance_painter.js.evaluate(cmd) - - Args: - stack_path (list or str): Path to the stack, could be - "Texture set name" or ["Texture set name", "Stack name"] - - Returns: - str: Stack path usable as argument in javascript query. - - """ - return json.dumps(stack_path) - - -def get_channel_identifiers(stack_path=None): - """Return the list of channel identifiers. - - If a context is passed (texture set/stack), - return only used channels with resolved user channels. - - Channel identifiers are: - basecolor, height, specular, opacity, emissive, displacement, - glossiness, roughness, anisotropylevel, anisotropyangle, transmissive, - scattering, reflection, ior, metallic, normal, ambientOcclusion, - diffuse, specularlevel, blendingmask, [custom user names]. - - Args: - stack_path (list or str, Optional): Path to the stack, could be - "Texture set name" or ["Texture set name", "Stack name"] - - Returns: - list: List of channel identifiers. - - """ - if stack_path is None: - stack_path = "" - else: - stack_path = _convert_stack_path_to_cmd_str(stack_path) - cmd = f"alg.mapexport.channelIdentifiers({stack_path})" - return substance_painter.js.evaluate(cmd) - - -def get_channel_format(stack_path, channel): - """Retrieve the channel format of a specific stack channel. - - See `alg.mapexport.channelFormat` (javascript API) for more details. - - The channel format data is: - "label" (str): The channel format label: could be one of - [sRGB8, L8, RGB8, L16, RGB16, L16F, RGB16F, L32F, RGB32F] - "color" (bool): True if the format is in color, False is grayscale - "floating" (bool): True if the format uses floating point - representation, false otherwise - "bitDepth" (int): Bit per color channel (could be 8, 16 or 32 bpc) - - Arguments: - stack_path (list or str): Path to the stack, could be - "Texture set name" or ["Texture set name", "Stack name"] - channel (str): Identifier of the channel to export - (see `get_channel_identifiers`) - - Returns: - dict: The channel format data. - - """ - stack_path = _convert_stack_path_to_cmd_str(stack_path) - cmd = f"alg.mapexport.channelFormat({stack_path}, '{channel}')" - return substance_painter.js.evaluate(cmd) - - -def get_document_structure(): - """Dump the document structure. - - See `alg.mapexport.documentStructure` (javascript API) for more details. - - Returns: - dict: Document structure or None when no project is open - - """ - return substance_painter.js.evaluate("alg.mapexport.documentStructure()") - - -def get_export_templates(config, format="png", strip_folder=True): - """Return export config outputs. - - This use the Javascript API `alg.mapexport.getPathsExportDocumentMaps` - which returns a different output than using the Python equivalent - `substance_painter.export.list_project_textures(config)`. - - The nice thing about the Javascript API version is that it returns the - output textures grouped by filename template. - - A downside is that it doesn't return all the UDIM tiles but per template - always returns a single file. - - Note: - The file format needs to be explicitly passed to the Javascript API - but upon exporting through the Python API the file format can be based - on the output preset. So it's likely the file extension will mismatch - - Warning: - Even though the function appears to solely get the expected outputs - the Javascript API will actually create the config's texture output - folder if it does not exist yet. As such, a valid path must be set. - - Example output: - { - "DefaultMaterial": { - "$textureSet_BaseColor(_$colorSpace)(.$udim)": "DefaultMaterial_BaseColor_ACES - ACEScg.1002.png", # noqa - "$textureSet_Emissive(_$colorSpace)(.$udim)": "DefaultMaterial_Emissive_ACES - ACEScg.1002.png", # noqa - "$textureSet_Height(_$colorSpace)(.$udim)": "DefaultMaterial_Height_Utility - Raw.1002.png", # noqa - "$textureSet_Metallic(_$colorSpace)(.$udim)": "DefaultMaterial_Metallic_Utility - Raw.1002.png", # noqa - "$textureSet_Normal(_$colorSpace)(.$udim)": "DefaultMaterial_Normal_Utility - Raw.1002.png", # noqa - "$textureSet_Roughness(_$colorSpace)(.$udim)": "DefaultMaterial_Roughness_Utility - Raw.1002.png" # noqa - } - } - - Arguments: - config (dict) Export config - format (str, Optional): Output format to write to, defaults to 'png' - strip_folder (bool, Optional): Whether to strip the output folder - from the output filenames. - - Returns: - dict: The expected output maps. - - """ - folder = config["exportPath"].replace("\\", "/") - preset = config["defaultExportPreset"] - cmd = f'alg.mapexport.getPathsExportDocumentMaps("{preset}", "{folder}", "{format}")' # noqa - result = substance_painter.js.evaluate(cmd) - - if strip_folder: - for _stack, maps in result.items(): - for map_template, map_filepath in maps.items(): - map_filepath = map_filepath.replace("\\", "/") - assert map_filepath.startswith(folder) - map_filename = map_filepath[len(folder):].lstrip("/") - maps[map_template] = map_filename - - return result - - -def _templates_to_regex(templates, - texture_set, - colorspaces, - project, - mesh): - """Return regex based on a Substance Painter expot filename template. - - This converts Substance Painter export filename templates like - `$mesh_$textureSet_BaseColor(_$colorSpace)(.$udim)` into a regex - which can be used to query an output filename to help retrieve: - - - Which template filename the file belongs to. - - Which color space the file is written with. - - Which udim tile it is exactly. - - This is used by `get_parsed_export_maps` which tries to as explicitly - as possible match the filename pattern against the known possible outputs. - That's why Texture Set name, Color spaces, Project path and mesh path must - be provided. By doing so we get the best shot at correctly matching the - right template because otherwise $texture_set could basically be any string - and thus match even that of a color space or mesh. - - Arguments: - templates (list): List of templates to convert to regex. - texture_set (str): The texture set to match against. - colorspaces (list): The colorspaces defined in the current project. - project (str): Filepath of current substance project. - mesh (str): Path to mesh file used in current project. - - Returns: - dict: Template: Template regex pattern - - """ - def _filename_no_ext(path): - return os.path.splitext(os.path.basename(path))[0] - - if colorspaces and any(colorspaces): - colorspace_match = "|".join(re.escape(c) for c in set(colorspaces)) - colorspace_match = f"({colorspace_match})" - else: - # No colorspace support enabled - colorspace_match = "" - - # Key to regex valid search values - key_matches = { - "$project": re.escape(_filename_no_ext(project)), - "$mesh": re.escape(_filename_no_ext(mesh)), - "$textureSet": re.escape(texture_set), - "$colorSpace": colorspace_match, - "$udim": "([0-9]{4})" - } - - # Turn the templates into regexes - regexes = {} - for template in templates: - - # We need to tweak a temp - search_regex = re.escape(template) - - # Let's assume that any ( and ) character in the file template was - # intended as an optional template key and do a simple `str.replace` - # Note: we are matching against re.escape(template) so will need to - # search for the escaped brackets. - search_regex = search_regex.replace(re.escape("("), "(") - search_regex = search_regex.replace(re.escape(")"), ")?") - - # Substitute each key into a named group - for key, key_expected_regex in key_matches.items(): - - # We want to use the template as a regex basis in the end so will - # escape the whole thing first. Note that thus we'll need to - # search for the escaped versions of the keys too. - escaped_key = re.escape(key) - key_label = key[1:] # key without $ prefix - - key_expected_grp_regex = f"(?P<{key_label}>{key_expected_regex})" - search_regex = search_regex.replace(escaped_key, - key_expected_grp_regex) - - # The filename templates don't include the extension so we add it - # to be able to match the out filename beginning to end - ext_regex = r"(?P\.[A-Za-z][A-Za-z0-9-]*)" - search_regex = rf"^{search_regex}{ext_regex}$" - - regexes[template] = search_regex - - return regexes - - -def strip_template(template, strip="._ "): - """Return static characters in a substance painter filename template. - - >>> strip_template("$textureSet_HELLO(.$udim)") - # HELLO - >>> strip_template("$mesh_$textureSet_HELLO_WORLD_$colorSpace(.$udim)") - # HELLO_WORLD - >>> strip_template("$textureSet_HELLO(.$udim)", strip=None) - # _HELLO - >>> strip_template("$mesh_$textureSet_$colorSpace(.$udim)", strip=None) - # _HELLO_ - >>> strip_template("$textureSet_HELLO(.$udim)") - # _HELLO - - Arguments: - template (str): Filename template to strip. - strip (str, optional): Characters to strip from beginning and end - of the static string in template. Defaults to: `._ `. - - Returns: - str: The static string in filename template. - - """ - # Return only characters that were part of the template that were static. - # Remove all keys - keys = ["$project", "$mesh", "$textureSet", "$udim", "$colorSpace"] - stripped_template = template - for key in keys: - stripped_template = stripped_template.replace(key, "") - - # Everything inside an optional bracket space is excluded since it's not - # static. We keep a counter to track whether we are currently iterating - # over parts of the template that are inside an 'optional' group or not. - counter = 0 - result = "" - for char in stripped_template: - if char == "(": - counter += 1 - elif char == ")": - counter -= 1 - if counter < 0: - counter = 0 - else: - if counter == 0: - result += char - - if strip: - # Strip of any trailing start/end characters. Technically these are - # static but usually start and end separators like space or underscore - # aren't wanted. - result = result.strip(strip) - - return result - - -def get_parsed_export_maps(config): - """Return Export Config's expected output textures with parsed data. - - This tries to parse the texture outputs using a Python API export config. - - Parses template keys: $project, $mesh, $textureSet, $colorSpace, $udim - - Example: - {("DefaultMaterial", ""): { - "$mesh_$textureSet_BaseColor(_$colorSpace)(.$udim)": [ - { - // OUTPUT DATA FOR FILE #1 OF THE TEMPLATE - }, - { - // OUTPUT DATA FOR FILE #2 OF THE TEMPLATE - }, - ] - }, - }} - - File output data (all outputs are `str`). - 1) Parsed tokens: These are parsed tokens from the template, they will - only exist if found in the filename template and output filename. - - project: Workfile filename without extension - mesh: Filename of the loaded mesh without extension - textureSet: The texture set, e.g. "DefaultMaterial", - colorSpace: The color space, e.g. "ACES - ACEScg", - udim: The udim tile, e.g. "1001" - - 2) Template output and filepath - - filepath: Full path to the resulting texture map, e.g. - "/path/to/mesh_DefaultMaterial_BaseColor_ACES - ACEScg.1002.png", - output: "mesh_DefaultMaterial_BaseColor_ACES - ACEScg.1002.png" - Note: if template had slashes (folders) then `output` will too. - So `output` might include a folder. - - Returns: - dict: [texture_set, stack]: {template: [file1_data, file2_data]} - - """ - # Import is here to avoid recursive lib <-> colorspace imports - from .colorspace import get_project_channel_data - - outputs = substance_painter.export.list_project_textures(config) - templates = get_export_templates(config, strip_folder=False) - - # Get all color spaces set for the current project - project_colorspaces = set( - data["colorSpace"] for data in get_project_channel_data().values() - ) - - # Get current project mesh path and project path to explicitly match - # the $mesh and $project tokens - project_mesh_path = substance_painter.project.last_imported_mesh_path() - project_path = substance_painter.project.file_path() - - # Get the current export path to strip this of the beginning of filepath - # results, since filename templates don't have these we'll match without - # that part of the filename. - export_path = config["exportPath"] - export_path = export_path.replace("\\", "/") - if not export_path.endswith("/"): - export_path += "/" - - # Parse the outputs - result = {} - for key, filepaths in outputs.items(): - texture_set, stack = key - - if stack: - stack_path = f"{texture_set}/{stack}" - else: - stack_path = texture_set - - stack_templates = list(templates[stack_path].keys()) - - template_regex = _templates_to_regex(stack_templates, - texture_set=texture_set, - colorspaces=project_colorspaces, - mesh=project_mesh_path, - project=project_path) - - # Let's precompile the regexes - for template, regex in template_regex.items(): - template_regex[template] = re.compile(regex) - - stack_results = defaultdict(list) - for filepath in sorted(filepaths): - # We strip explicitly using the full parent export path instead of - # using `os.path.basename` because export template is allowed to - # have subfolders in its template which we want to match against - filepath = filepath.replace("\\", "/") - assert filepath.startswith(export_path), ( - f"Filepath {filepath} must start with folder {export_path}" - ) - filename = filepath[len(export_path):] - - for template, regex in template_regex.items(): - match = regex.match(filename) - if match: - parsed = match.groupdict(default={}) - - # Include some special outputs for convenience - parsed["filepath"] = filepath - parsed["output"] = filename - - stack_results[template].append(parsed) - break - else: - raise ValueError(f"Unable to match {filename} against any " - f"template in: {list(template_regex.keys())}") - - result[key] = dict(stack_results) - - return result - - -def load_shelf(path, name=None): - """Add shelf to substance painter (for current application session) - - This will dynamically add a Shelf for the current session. It's good - to note however that these will *not* persist on restart of the host. - - Note: - Consider the loaded shelf a static library of resources. - - The shelf will *not* be visible in application preferences in - Edit > Settings > Libraries. - - The shelf will *not* show in the Assets browser if it has no existing - assets - - The shelf will *not* be a selectable option for selecting it as a - destination to import resources too. - - """ - - # Ensure expanded path with forward slashes - path = os.path.expandvars(path) - path = os.path.abspath(path) - path = path.replace("\\", "/") - - # Path must exist - if not os.path.isdir(path): - raise ValueError(f"Path is not an existing folder: {path}") - - # This name must be unique and must only contain lowercase letters, - # numbers, underscores or hyphens. - if name is None: - name = os.path.basename(path) - - name = name.lower() - name = re.sub(r"[^a-z0-9_\-]", "_", name) # sanitize to underscores - - if substance_painter.resource.Shelves.exists(name): - shelf = next( - shelf for shelf in substance_painter.resource.Shelves.all() - if shelf.name() == name - ) - if os.path.normpath(shelf.path()) != os.path.normpath(path): - raise ValueError(f"Shelf with name '{name}' already exists " - f"for a different path: '{shelf.path()}") - - return - - print(f"Adding Shelf '{name}' to path: {path}") - substance_painter.resource.Shelves.add(name, path) - - return name - - -def _get_new_project_action(): - """Return QAction which triggers Substance Painter's new project dialog""" - - main_window = substance_painter.ui.get_main_window() - - # Find the file menu's New file action - menubar = main_window.menuBar() - new_action = None - for action in menubar.actions(): - menu = action.menu() - if not menu: - continue - - if menu.objectName() != "file": - continue - - # Find the action with the CTRL+N key sequence - new_action = next(action for action in menu.actions() - if action.shortcut() == QtGui.QKeySequence.New) - break - - return new_action - - -def prompt_new_file_with_mesh(mesh_filepath): - """Prompts the user for a new file using Substance Painter's own dialog. - - This will set the mesh path to load to the given mesh and disables the - dialog box to disallow the user to change the path. This way we can allow - user configuration of a project but set the mesh path ourselves. - - Warning: - This is very hacky and experimental. - - Note: - If a project is currently open using the same mesh filepath it can't - accurately detect whether the user had actually accepted the new project - dialog or whether the project afterwards is still the original project, - for example when the user might have cancelled the operation. - - """ - - app = QtWidgets.QApplication.instance() - assert os.path.isfile(mesh_filepath), \ - f"Mesh filepath does not exist: {mesh_filepath}" - - def _setup_file_dialog(): - """Set filepath in QFileDialog and trigger accept result""" - file_dialog = app.activeModalWidget() - assert isinstance(file_dialog, QtWidgets.QFileDialog) - - # Quickly hide the dialog - file_dialog.hide() - app.processEvents(QtCore.QEventLoop.ExcludeUserInputEvents, 1000) - - file_dialog.setDirectory(os.path.dirname(mesh_filepath)) - url = QtCore.QUrl.fromLocalFile(os.path.basename(mesh_filepath)) - file_dialog.selectUrl(url) - # TODO: find a way to improve the process event to - # load more complicated mesh - app.processEvents(QtCore.QEventLoop.ExcludeUserInputEvents, 3000) - file_dialog.done(file_dialog.Accepted) - app.processEvents(QtCore.QEventLoop.AllEvents) - - def _setup_prompt(): - app.processEvents(QtCore.QEventLoop.ExcludeUserInputEvents) - dialog = app.activeModalWidget() - assert dialog.objectName() == "NewProjectDialog" - - # Set the window title - mesh = os.path.basename(mesh_filepath) - dialog.setWindowTitle(f"New Project with mesh: {mesh}") - - # Get the select mesh file button - mesh_select = dialog.findChild(QtWidgets.QPushButton, "meshSelect") - - # Hide the select mesh button to the user to block changing of mesh - mesh_select.setVisible(False) - - # Ensure UI is visually up-to-date - app.processEvents(QtCore.QEventLoop.ExcludeUserInputEvents, 8000) - - # Trigger the 'select file' dialog to set the path and have the - # new file dialog to use the path. - QtCore.QTimer.singleShot(10, _setup_file_dialog) - mesh_select.click() - - app.processEvents(QtCore.QEventLoop.AllEvents, 5000) - - mesh_filename = dialog.findChild(QtWidgets.QFrame, "meshFileName") - mesh_filename_label = mesh_filename.findChild(QtWidgets.QLabel) - if not mesh_filename_label.text(): - dialog.close() - substance_painter.logging.warning( - "Failed to set mesh path with the prompt dialog:" - f"{mesh_filepath}\n\n" - "Creating new project directly with the mesh path instead.") - - new_action = _get_new_project_action() - if not new_action: - raise RuntimeError("Unable to detect new file action..") - - QtCore.QTimer.singleShot(0, _setup_prompt) - new_action.trigger() - app.processEvents(QtCore.QEventLoop.AllEvents, 5000) - - if not substance_painter.project.is_open(): - return - - # Confirm mesh was set as expected - project_mesh = substance_painter.project.last_imported_mesh_path() - if os.path.normpath(project_mesh) != os.path.normpath(mesh_filepath): - return - - return project_mesh diff --git a/server_addon/substancepainter/client/substancepainter/api/pipeline.py b/server_addon/substancepainter/client/substancepainter/api/pipeline.py deleted file mode 100644 index 23d629533c..0000000000 --- a/server_addon/substancepainter/client/substancepainter/api/pipeline.py +++ /dev/null @@ -1,425 +0,0 @@ -# -*- coding: utf-8 -*- -"""Pipeline tools for OpenPype Substance Painter integration.""" -import os -import logging -from functools import partial - -# Substance 3D Painter modules -import substance_painter.ui -import substance_painter.event -import substance_painter.project - -import pyblish.api - -from ayon_core.host import HostBase, IWorkfileHost, ILoadHost, IPublishHost -from ayon_core.settings import get_current_project_settings - -from ayon_core.pipeline.template_data import get_template_data_with_names -from ayon_core.pipeline import ( - register_creator_plugin_path, - register_loader_plugin_path, - AVALON_CONTAINER_ID, - Anatomy, -) -from ayon_core.lib import ( - StringTemplate, - register_event_callback, - emit_event, -) -from ayon_core.pipeline.load import any_outdated_containers -from ayon_core.hosts.substancepainter import SUBSTANCE_HOST_DIR - -from . import lib - -log = logging.getLogger("ayon_core.hosts.substance") - -PLUGINS_DIR = os.path.join(SUBSTANCE_HOST_DIR, "plugins") -PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") -LOAD_PATH = os.path.join(PLUGINS_DIR, "load") -CREATE_PATH = os.path.join(PLUGINS_DIR, "create") -INVENTORY_PATH = os.path.join(PLUGINS_DIR, "inventory") - -OPENPYPE_METADATA_KEY = "OpenPype" -OPENPYPE_METADATA_CONTAINERS_KEY = "containers" # child key -OPENPYPE_METADATA_CONTEXT_KEY = "context" # child key -OPENPYPE_METADATA_INSTANCES_KEY = "instances" # child key - - -class SubstanceHost(HostBase, IWorkfileHost, ILoadHost, IPublishHost): - name = "substancepainter" - - def __init__(self): - super(SubstanceHost, self).__init__() - self._has_been_setup = False - self.menu = None - self.callbacks = [] - self.shelves = [] - - def install(self): - pyblish.api.register_host("substancepainter") - - pyblish.api.register_plugin_path(PUBLISH_PATH) - register_loader_plugin_path(LOAD_PATH) - register_creator_plugin_path(CREATE_PATH) - - log.info("Installing callbacks ... ") - # register_event_callback("init", on_init) - self._register_callbacks() - # register_event_callback("before.save", before_save) - # register_event_callback("save", on_save) - register_event_callback("open", on_open) - # register_event_callback("new", on_new) - - log.info("Installing menu ... ") - self._install_menu() - - project_settings = get_current_project_settings() - self._install_shelves(project_settings) - - self._has_been_setup = True - - def uninstall(self): - self._uninstall_shelves() - self._uninstall_menu() - self._deregister_callbacks() - - def workfile_has_unsaved_changes(self): - - if not substance_painter.project.is_open(): - return False - - return substance_painter.project.needs_saving() - - def get_workfile_extensions(self): - return [".spp", ".toc"] - - def save_workfile(self, dst_path=None): - - if not substance_painter.project.is_open(): - return False - - if not dst_path: - dst_path = self.get_current_workfile() - - full_save_mode = substance_painter.project.ProjectSaveMode.Full - substance_painter.project.save_as(dst_path, full_save_mode) - - return dst_path - - def open_workfile(self, filepath): - - if not os.path.exists(filepath): - raise RuntimeError("File does not exist: {}".format(filepath)) - - # We must first explicitly close current project before opening another - if substance_painter.project.is_open(): - substance_painter.project.close() - - substance_painter.project.open(filepath) - return filepath - - def get_current_workfile(self): - if not substance_painter.project.is_open(): - return None - - filepath = substance_painter.project.file_path() - if filepath and filepath.endswith(".spt"): - # When currently in a Substance Painter template assume our - # scene isn't saved. This can be the case directly after doing - # "New project", the path will then be the template used. This - # avoids Workfiles tool trying to save as .spt extension if the - # file hasn't been saved before. - return - - return filepath - - def get_containers(self): - - if not substance_painter.project.is_open(): - return - - metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) - containers = metadata.get(OPENPYPE_METADATA_CONTAINERS_KEY) - if containers: - for key, container in containers.items(): - container["objectName"] = key - yield container - - def update_context_data(self, data, changes): - - if not substance_painter.project.is_open(): - return - - metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) - metadata.set(OPENPYPE_METADATA_CONTEXT_KEY, data) - - def get_context_data(self): - - if not substance_painter.project.is_open(): - return - - metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) - return metadata.get(OPENPYPE_METADATA_CONTEXT_KEY) or {} - - def _install_menu(self): - from PySide2 import QtWidgets - from ayon_core.tools.utils import host_tools - - parent = substance_painter.ui.get_main_window() - - tab_menu_label = os.environ.get("AYON_MENU_LABEL") or "AYON" - menu = QtWidgets.QMenu(tab_menu_label) - - action = menu.addAction("Create...") - action.triggered.connect( - lambda: host_tools.show_publisher(parent=parent, - tab="create") - ) - - action = menu.addAction("Load...") - action.triggered.connect( - lambda: host_tools.show_loader(parent=parent, use_context=True) - ) - - action = menu.addAction("Publish...") - action.triggered.connect( - lambda: host_tools.show_publisher(parent=parent, - tab="publish") - ) - - action = menu.addAction("Manage...") - action.triggered.connect( - lambda: host_tools.show_scene_inventory(parent=parent) - ) - - action = menu.addAction("Library...") - action.triggered.connect( - lambda: host_tools.show_library_loader(parent=parent) - ) - - menu.addSeparator() - action = menu.addAction("Work Files...") - action.triggered.connect( - lambda: host_tools.show_workfiles(parent=parent) - ) - - substance_painter.ui.add_menu(menu) - - def on_menu_destroyed(): - self.menu = None - - menu.destroyed.connect(on_menu_destroyed) - - self.menu = menu - - def _uninstall_menu(self): - if self.menu: - self.menu.destroy() - self.menu = None - - def _register_callbacks(self): - # Prepare emit event callbacks - open_callback = partial(emit_event, "open") - - # Connect to the Substance Painter events - dispatcher = substance_painter.event.DISPATCHER - for event, callback in [ - (substance_painter.event.ProjectOpened, open_callback) - ]: - dispatcher.connect(event, callback) - # Keep a reference so we can deregister if needed - self.callbacks.append((event, callback)) - - def _deregister_callbacks(self): - for event, callback in self.callbacks: - substance_painter.event.DISPATCHER.disconnect(event, callback) - self.callbacks.clear() - - def _install_shelves(self, project_settings): - - shelves = project_settings["substancepainter"].get("shelves", []) - if not shelves: - return - - # Prepare formatting data if we detect any path which might have - # template tokens like {folder[name]} in there. - formatting_data = {} - has_formatting_entries = any("{" in item["value"] for item in shelves) - if has_formatting_entries: - project_name = self.get_current_project_name() - folder_path = self.get_current_folder_path() - task_name = self.get_current_task_name() - formatting_data = get_template_data_with_names( - project_name, folder_path, task_name, project_settings - ) - anatomy = Anatomy(project_name) - formatting_data["root"] = anatomy.roots - - for shelve_item in shelves: - - # Allow formatting with anatomy for the paths - path = shelve_item["value"] - if "{" in path: - path = StringTemplate.format_template(path, formatting_data) - - name = shelve_item["name"] - shelf_name = None - try: - shelf_name = lib.load_shelf(path, name=name) - except ValueError as exc: - print(f"Failed to load shelf -> {exc}") - - if shelf_name: - self.shelves.append(shelf_name) - - def _uninstall_shelves(self): - for shelf_name in self.shelves: - substance_painter.resource.Shelves.remove(shelf_name) - self.shelves.clear() - - -def on_open(): - log.info("Running callback on open..") - - if any_outdated_containers(): - from ayon_core.tools.utils import SimplePopup - - log.warning("Scene has outdated content.") - - # Get main window - parent = substance_painter.ui.get_main_window() - if parent is None: - log.info("Skipping outdated content pop-up " - "because Substance window can't be found.") - else: - - # Show outdated pop-up - def _on_show_inventory(): - from ayon_core.tools.utils import host_tools - host_tools.show_scene_inventory(parent=parent) - - dialog = SimplePopup(parent=parent) - dialog.setWindowTitle("Substance scene has outdated content") - dialog.set_message("There are outdated containers in " - "your Substance scene.") - dialog.on_clicked.connect(_on_show_inventory) - dialog.show() - - -def imprint_container(container, - name, - namespace, - context, - loader): - """Imprint a loaded container with metadata. - - Containerisation enables a tracking of version, author and origin - for loaded assets. - - Arguments: - container (dict): The (substance metadata) dictionary to imprint into. - name (str): Name of resulting assembly - namespace (str): Namespace under which to host container - context (dict): Asset information - loader (load.LoaderPlugin): loader instance used to produce container. - - Returns: - None - - """ - - data = [ - ("schema", "openpype:container-2.0"), - ("id", AVALON_CONTAINER_ID), - ("name", str(name)), - ("namespace", str(namespace) if namespace else None), - ("loader", str(loader.__class__.__name__)), - ("representation", context["representation"]["id"]), - ] - for key, value in data: - container[key] = value - - -def set_container_metadata(object_name, container_data, update=False): - """Helper method to directly set the data for a specific container - - Args: - object_name (str): The unique object name identifier for the container - container_data (dict): The data for the container. - Note 'objectName' data is derived from `object_name` and key in - `container_data` will be ignored. - update (bool): Whether to only update the dict data. - - """ - # The objectName is derived from the key in the metadata so won't be stored - # in the metadata in the container's data. - container_data.pop("objectName", None) - - metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) - containers = metadata.get(OPENPYPE_METADATA_CONTAINERS_KEY) or {} - if update: - existing_data = containers.setdefault(object_name, {}) - existing_data.update(container_data) # mutable dict, in-place update - else: - containers[object_name] = container_data - metadata.set("containers", containers) - - -def remove_container_metadata(object_name): - """Helper method to remove the data for a specific container""" - metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) - containers = metadata.get(OPENPYPE_METADATA_CONTAINERS_KEY) - if containers: - containers.pop(object_name, None) - metadata.set("containers", containers) - - -def set_instance(instance_id, instance_data, update=False): - """Helper method to directly set the data for a specific container - - Args: - instance_id (str): Unique identifier for the instance - instance_data (dict): The instance data to store in the metaadata. - """ - set_instances({instance_id: instance_data}, update=update) - - -def set_instances(instance_data_by_id, update=False): - """Store data for multiple instances at the same time. - - This is more optimal than querying and setting them in the metadata one - by one. - """ - metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) - instances = metadata.get(OPENPYPE_METADATA_INSTANCES_KEY) or {} - - for instance_id, instance_data in instance_data_by_id.items(): - if update: - existing_data = instances.get(instance_id, {}) - existing_data.update(instance_data) - else: - instances[instance_id] = instance_data - - metadata.set("instances", instances) - - -def remove_instance(instance_id): - """Helper method to remove the data for a specific container""" - metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) - instances = metadata.get(OPENPYPE_METADATA_INSTANCES_KEY) or {} - instances.pop(instance_id, None) - metadata.set("instances", instances) - - -def get_instances_by_id(): - """Return all instances stored in the project instances metadata""" - if not substance_painter.project.is_open(): - return {} - - metadata = substance_painter.project.Metadata(OPENPYPE_METADATA_KEY) - return metadata.get(OPENPYPE_METADATA_INSTANCES_KEY) or {} - - -def get_instances(): - """Return all instances stored in the project instances as a list""" - return list(get_instances_by_id().values()) diff --git a/server_addon/substancepainter/client/substancepainter/deploy/plugins/openpype_plugin.py b/server_addon/substancepainter/client/substancepainter/deploy/plugins/openpype_plugin.py deleted file mode 100644 index 8ced463367..0000000000 --- a/server_addon/substancepainter/client/substancepainter/deploy/plugins/openpype_plugin.py +++ /dev/null @@ -1,36 +0,0 @@ - - -def cleanup_openpype_qt_widgets(): - """ - Workaround for Substance failing to shut down correctly - when a Qt window was still open at the time of shutting down. - - This seems to work sometimes, but not all the time. - - """ - # TODO: Create a more reliable method to close down all OpenPype Qt widgets - from PySide2 import QtWidgets - import substance_painter.ui - - # Kill OpenPype Qt widgets - print("Killing OpenPype Qt widgets..") - for widget in QtWidgets.QApplication.topLevelWidgets(): - if widget.__module__.startswith("openpype."): - print(f"Deleting widget: {widget.__class__.__name__}") - substance_painter.ui.delete_ui_element(widget) - - -def start_plugin(): - from ayon_core.pipeline import install_host - from ayon_core.hosts.substancepainter.api import SubstanceHost - install_host(SubstanceHost()) - - -def close_plugin(): - from ayon_core.pipeline import uninstall_host - cleanup_openpype_qt_widgets() - uninstall_host() - - -if __name__ == "__main__": - start_plugin() diff --git a/server_addon/substancepainter/client/substancepainter/deploy/startup/openpype_load_on_first_run.py b/server_addon/substancepainter/client/substancepainter/deploy/startup/openpype_load_on_first_run.py deleted file mode 100644 index 04b610b4df..0000000000 --- a/server_addon/substancepainter/client/substancepainter/deploy/startup/openpype_load_on_first_run.py +++ /dev/null @@ -1,43 +0,0 @@ -"""Ease the OpenPype on-boarding process by loading the plug-in on first run""" - -OPENPYPE_PLUGIN_NAME = "openpype_plugin" - - -def start_plugin(): - try: - # This isn't exposed in the official API so we keep it in a try-except - from painter_plugins_ui import ( - get_settings, - LAUNCH_AT_START_KEY, - ON_STATE, - PLUGINS_MENU, - plugin_manager - ) - - # The `painter_plugins_ui` plug-in itself is also a startup plug-in - # we need to take into account that it could run either earlier or - # later than this startup script, we check whether its menu initialized - is_before_plugins_menu = PLUGINS_MENU is None - - settings = get_settings(OPENPYPE_PLUGIN_NAME) - if settings.value(LAUNCH_AT_START_KEY, None) is None: - print("Initializing OpenPype plug-in on first run...") - if is_before_plugins_menu: - print("- running before 'painter_plugins_ui'") - # Delay the launch to the painter_plugins_ui initialization - settings.setValue(LAUNCH_AT_START_KEY, ON_STATE) - else: - # Launch now - print("- running after 'painter_plugins_ui'") - plugin_manager(OPENPYPE_PLUGIN_NAME)(True) - - # Set the checked state in the menu to avoid confusion - action = next(action for action in PLUGINS_MENU._menu.actions() - if action.text() == OPENPYPE_PLUGIN_NAME) - if action is not None: - action.blockSignals(True) - action.setChecked(True) - action.blockSignals(False) - - except Exception as exc: - print(exc) diff --git a/server_addon/substancepainter/client/substancepainter/plugins/create/create_textures.py b/server_addon/substancepainter/client/substancepainter/plugins/create/create_textures.py deleted file mode 100644 index f46afadb5a..0000000000 --- a/server_addon/substancepainter/client/substancepainter/plugins/create/create_textures.py +++ /dev/null @@ -1,175 +0,0 @@ -# -*- coding: utf-8 -*- -"""Creator plugin for creating textures.""" - -from ayon_core.pipeline import CreatedInstance, Creator, CreatorError -from ayon_core.lib import ( - EnumDef, - UILabelDef, - NumberDef, - BoolDef -) - -from ayon_core.hosts.substancepainter.api.pipeline import ( - get_instances, - set_instance, - set_instances, - remove_instance -) -from ayon_core.hosts.substancepainter.api.lib import get_export_presets - -import substance_painter.project - - -class CreateTextures(Creator): - """Create a texture set.""" - identifier = "io.openpype.creators.substancepainter.textureset" - label = "Textures" - product_type = "textureSet" - icon = "picture-o" - - default_variant = "Main" - - def create(self, product_name, instance_data, pre_create_data): - - if not substance_painter.project.is_open(): - raise CreatorError("Can't create a Texture Set instance without " - "an open project.") - # Transfer settings from pre create to instance - creator_attributes = instance_data.setdefault( - "creator_attributes", dict()) - for key in [ - "exportPresetUrl", - "exportFileFormat", - "exportSize", - "exportPadding", - "exportDilationDistance" - ]: - if key in pre_create_data: - creator_attributes[key] = pre_create_data[key] - - instance = self.create_instance_in_context(product_name, - instance_data) - set_instance( - instance_id=instance["instance_id"], - instance_data=instance.data_to_store() - ) - - def collect_instances(self): - for instance in get_instances(): - if (instance.get("creator_identifier") == self.identifier or - instance.get("productType") == self.product_type): - self.create_instance_in_context_from_existing(instance) - - def update_instances(self, update_list): - instance_data_by_id = {} - for instance, _changes in update_list: - # Persist the data - instance_id = instance.get("instance_id") - instance_data = instance.data_to_store() - instance_data_by_id[instance_id] = instance_data - set_instances(instance_data_by_id, update=True) - - def remove_instances(self, instances): - for instance in instances: - remove_instance(instance["instance_id"]) - self._remove_instance_from_context(instance) - - # Helper methods (this might get moved into Creator class) - def create_instance_in_context(self, product_name, data): - instance = CreatedInstance( - self.product_type, product_name, data, self - ) - self.create_context.creator_adds_instance(instance) - return instance - - def create_instance_in_context_from_existing(self, data): - instance = CreatedInstance.from_existing(data, self) - self.create_context.creator_adds_instance(instance) - return instance - - def get_instance_attr_defs(self): - - return [ - EnumDef("exportPresetUrl", - items=get_export_presets(), - label="Output Template"), - BoolDef("allowSkippedMaps", - label="Allow Skipped Output Maps", - tooltip="When enabled this allows the publish to ignore " - "output maps in the used output template if one " - "or more maps are skipped due to the required " - "channels not being present in the current file.", - default=True), - EnumDef("exportFileFormat", - items={ - None: "Based on output template", - # TODO: Get available extensions from substance API - "bmp": "bmp", - "ico": "ico", - "jpeg": "jpeg", - "jng": "jng", - "pbm": "pbm", - "pgm": "pgm", - "png": "png", - "ppm": "ppm", - "tga": "targa", - "tif": "tiff", - "wap": "wap", - "wbmp": "wbmp", - "xpm": "xpm", - "gif": "gif", - "hdr": "hdr", - "exr": "exr", - "j2k": "j2k", - "jp2": "jp2", - "pfm": "pfm", - "webp": "webp", - # TODO: Unsure why jxr format fails to export - # "jxr": "jpeg-xr", - # TODO: File formats that combine the exported textures - # like psd are not correctly supported due to - # publishing only a single file - # "psd": "psd", - # "sbsar": "sbsar", - }, - default=None, - label="File type"), - EnumDef("exportSize", - items={ - None: "Based on each Texture Set's size", - # The key is size of the texture file in log2. - # (i.e. 10 means 2^10 = 1024) - 7: "128", - 8: "256", - 9: "512", - 10: "1024", - 11: "2048", - 12: "4096", - 13: "8192" - }, - default=None, - label="Size"), - - EnumDef("exportPadding", - items={ - "passthrough": "No padding (passthrough)", - "infinite": "Dilation infinite", - "transparent": "Dilation + transparent", - "color": "Dilation + default background color", - "diffusion": "Dilation + diffusion" - }, - default="infinite", - label="Padding"), - NumberDef("exportDilationDistance", - minimum=0, - maximum=256, - decimals=0, - default=16, - label="Dilation Distance"), - UILabelDef("*only used with " - "'Dilation + ' padding"), - ] - - def get_pre_create_attr_defs(self): - # Use same attributes as for instance attributes - return self.get_instance_attr_defs() diff --git a/server_addon/substancepainter/client/substancepainter/plugins/create/create_workfile.py b/server_addon/substancepainter/client/substancepainter/plugins/create/create_workfile.py deleted file mode 100644 index 63b1c6c7da..0000000000 --- a/server_addon/substancepainter/client/substancepainter/plugins/create/create_workfile.py +++ /dev/null @@ -1,124 +0,0 @@ -# -*- coding: utf-8 -*- -"""Creator plugin for creating workfiles.""" - -import ayon_api - -from ayon_core.pipeline import CreatedInstance, AutoCreator - -from ayon_core.hosts.substancepainter.api.pipeline import ( - set_instances, - set_instance, - get_instances -) - -import substance_painter.project - - -class CreateWorkfile(AutoCreator): - """Workfile auto-creator.""" - identifier = "io.openpype.creators.substancepainter.workfile" - label = "Workfile" - product_type = "workfile" - icon = "document" - - default_variant = "Main" - - def create(self): - - if not substance_painter.project.is_open(): - return - - variant = self.default_variant - project_name = self.project_name - folder_path = self.create_context.get_current_folder_path() - task_name = self.create_context.get_current_task_name() - host_name = self.create_context.host_name - - # Workfile instance should always exist and must only exist once. - # As such we'll first check if it already exists and is collected. - current_instance = next( - ( - instance for instance in self.create_context.instances - if instance.creator_identifier == self.identifier - ), None) - - current_folder_path = None - if current_instance is not None: - current_folder_path = current_instance["folderPath"] - - if current_instance is None: - self.log.info("Auto-creating workfile instance...") - folder_entity = ayon_api.get_folder_by_path( - project_name, folder_path - ) - task_entity = ayon_api.get_task_by_name( - project_name, folder_entity["id"], task_name - ) - product_name = self.get_product_name( - project_name, - folder_entity, - task_entity, - variant, - host_name, - ) - data = { - "folderPath": folder_path, - "task": task_name, - "variant": variant - } - current_instance = self.create_instance_in_context(product_name, - data) - elif ( - current_folder_path != folder_path - or current_instance["task"] != task_name - ): - # Update instance context if is not the same - folder_entity = ayon_api.get_folder_by_path( - project_name, folder_path - ) - task_entity = ayon_api.get_task_by_name( - project_name, folder_entity["id"], task_name - ) - product_name = self.get_product_name( - project_name, - folder_entity, - task_entity, - variant, - host_name, - ) - current_instance["folderPath"] = folder_path - current_instance["task"] = task_name - current_instance["productName"] = product_name - - set_instance( - instance_id=current_instance.get("instance_id"), - instance_data=current_instance.data_to_store() - ) - - def collect_instances(self): - for instance in get_instances(): - if (instance.get("creator_identifier") == self.identifier or - instance.get("productType") == self.product_type): - self.create_instance_in_context_from_existing(instance) - - def update_instances(self, update_list): - instance_data_by_id = {} - for instance, _changes in update_list: - # Persist the data - instance_id = instance.get("instance_id") - instance_data = instance.data_to_store() - instance_data_by_id[instance_id] = instance_data - set_instances(instance_data_by_id, update=True) - - # Helper methods (this might get moved into Creator class) - def create_instance_in_context(self, product_name, data): - instance = CreatedInstance( - self.product_type, product_name, data, self - ) - self.create_context.creator_adds_instance(instance) - return instance - - def create_instance_in_context_from_existing(self, data): - instance = CreatedInstance.from_existing(data, self) - self.create_context.creator_adds_instance(instance) - return instance diff --git a/server_addon/substancepainter/client/substancepainter/plugins/load/load_mesh.py b/server_addon/substancepainter/client/substancepainter/plugins/load/load_mesh.py deleted file mode 100644 index d5aac1191c..0000000000 --- a/server_addon/substancepainter/client/substancepainter/plugins/load/load_mesh.py +++ /dev/null @@ -1,246 +0,0 @@ -import copy -from qtpy import QtWidgets, QtCore -from ayon_core.pipeline import ( - load, - get_representation_path, -) -from ayon_core.pipeline.load import LoadError -from ayon_core.hosts.substancepainter.api.pipeline import ( - imprint_container, - set_container_metadata, - remove_container_metadata -) - -import substance_painter.project - - -def _convert(substance_attr): - """Return Substance Painter Python API Project attribute from string. - - This converts a string like "ProjectWorkflow.Default" to for example - the Substance Painter Python API equivalent object, like: - `substance_painter.project.ProjectWorkflow.Default` - - Args: - substance_attr (str): The `substance_painter.project` attribute, - for example "ProjectWorkflow.Default" - - Returns: - Any: Substance Python API object of the project attribute. - - Raises: - ValueError: If attribute does not exist on the - `substance_painter.project` python api. - """ - root = substance_painter.project - for attr in substance_attr.split("."): - root = getattr(root, attr, None) - if root is None: - raise ValueError( - "Substance Painter project attribute" - f" does not exist: {substance_attr}") - - return root - - -def get_template_by_name(name: str, templates: list[dict]) -> dict: - return next( - template for template in templates - if template["name"] == name - ) - - -class SubstanceProjectConfigurationWindow(QtWidgets.QDialog): - """The pop-up dialog allows users to choose material - duplicate options for importing Max objects when updating - or switching assets. - """ - def __init__(self, project_templates): - super(SubstanceProjectConfigurationWindow, self).__init__() - self.setWindowFlags(self.windowFlags() | QtCore.Qt.FramelessWindowHint) - - self.configuration = None - self.template_names = [template["name"] for template - in project_templates] - self.project_templates = project_templates - - self.widgets = { - "label": QtWidgets.QLabel( - "Select your template for project configuration"), - "template_options": QtWidgets.QComboBox(), - "import_cameras": QtWidgets.QCheckBox("Import Cameras"), - "preserve_strokes": QtWidgets.QCheckBox("Preserve Strokes"), - "clickbox": QtWidgets.QWidget(), - "combobox": QtWidgets.QWidget(), - "buttons": QtWidgets.QDialogButtonBox( - QtWidgets.QDialogButtonBox.Ok - | QtWidgets.QDialogButtonBox.Cancel) - } - - self.widgets["template_options"].addItems(self.template_names) - - template_name = self.widgets["template_options"].currentText() - self._update_to_match_template(template_name) - # Build clickboxes - layout = QtWidgets.QHBoxLayout(self.widgets["clickbox"]) - layout.addWidget(self.widgets["import_cameras"]) - layout.addWidget(self.widgets["preserve_strokes"]) - # Build combobox - layout = QtWidgets.QHBoxLayout(self.widgets["combobox"]) - layout.addWidget(self.widgets["template_options"]) - # Build buttons - layout = QtWidgets.QHBoxLayout(self.widgets["buttons"]) - # Build layout. - layout = QtWidgets.QVBoxLayout(self) - layout.addWidget(self.widgets["label"]) - layout.addWidget(self.widgets["combobox"]) - layout.addWidget(self.widgets["clickbox"]) - layout.addWidget(self.widgets["buttons"]) - - self.widgets["template_options"].currentTextChanged.connect( - self._update_to_match_template) - self.widgets["buttons"].accepted.connect(self.on_accept) - self.widgets["buttons"].rejected.connect(self.on_reject) - - def on_accept(self): - self.configuration = self.get_project_configuration() - self.close() - - def on_reject(self): - self.close() - - def _update_to_match_template(self, template_name): - template = get_template_by_name(template_name, self.project_templates) - self.widgets["import_cameras"].setChecked(template["import_cameras"]) - self.widgets["preserve_strokes"].setChecked( - template["preserve_strokes"]) - - def get_project_configuration(self): - templates = self.project_templates - template_name = self.widgets["template_options"].currentText() - template = get_template_by_name(template_name, templates) - template = copy.deepcopy(template) # do not edit the original - template["import_cameras"] = self.widgets["import_cameras"].isChecked() - template["preserve_strokes"] = ( - self.widgets["preserve_strokes"].isChecked() - ) - for key in ["normal_map_format", - "project_workflow", - "tangent_space_mode"]: - template[key] = _convert(template[key]) - return template - - @classmethod - def prompt(cls, templates): - dialog = cls(templates) - dialog.exec_() - configuration = dialog.configuration - dialog.deleteLater() - return configuration - - -class SubstanceLoadProjectMesh(load.LoaderPlugin): - """Load mesh for project""" - - product_types = {"*"} - representations = {"abc", "fbx", "obj", "gltf", "usd", "usda", "usdc"} - - label = "Load mesh" - order = -10 - icon = "code-fork" - color = "orange" - - # Defined via settings - project_templates = [] - - def load(self, context, name, namespace, options=None): - - # Get user inputs - result = SubstanceProjectConfigurationWindow.prompt( - self.project_templates) - if not result: - # cancelling loader action - return - if not substance_painter.project.is_open(): - # Allow to 'initialize' a new project - path = self.filepath_from_context(context) - sp_settings = substance_painter.project.Settings( - import_cameras=result["import_cameras"], - normal_map_format=result["normal_map_format"], - project_workflow=result["project_workflow"], - tangent_space_mode=result["tangent_space_mode"], - default_texture_resolution=result["default_texture_resolution"] - ) - settings = substance_painter.project.create( - mesh_file_path=path, settings=sp_settings - ) - else: - # Reload the mesh - settings = substance_painter.project.MeshReloadingSettings( - import_cameras=result["import_cameras"], - preserve_strokes=result["preserve_strokes"]) - - def on_mesh_reload(status: substance_painter.project.ReloadMeshStatus): # noqa - if status == substance_painter.project.ReloadMeshStatus.SUCCESS: # noqa - self.log.info("Reload succeeded") - else: - raise LoadError("Reload of mesh failed") - - path = self.filepath_from_context(context) - substance_painter.project.reload_mesh(path, - settings, - on_mesh_reload) - - # Store container - container = {} - project_mesh_object_name = "_ProjectMesh_" - imprint_container(container, - name=project_mesh_object_name, - namespace=project_mesh_object_name, - context=context, - loader=self) - - # We want store some options for updating to keep consistent behavior - # from the user's original choice. We don't store 'preserve_strokes' - # as we always preserve strokes on updates. - container["options"] = { - "import_cameras": result["import_cameras"], - } - - set_container_metadata(project_mesh_object_name, container) - - def switch(self, container, context): - self.update(container, context) - - def update(self, container, context): - repre_entity = context["representation"] - - path = get_representation_path(repre_entity) - - # Reload the mesh - container_options = container.get("options", {}) - settings = substance_painter.project.MeshReloadingSettings( - import_cameras=container_options.get("import_cameras", True), - preserve_strokes=True - ) - - def on_mesh_reload(status: substance_painter.project.ReloadMeshStatus): - if status == substance_painter.project.ReloadMeshStatus.SUCCESS: - self.log.info("Reload succeeded") - else: - raise LoadError("Reload of mesh failed") - - substance_painter.project.reload_mesh(path, settings, on_mesh_reload) - - # Update container representation - object_name = container["objectName"] - update_data = {"representation": repre_entity["id"]} - set_container_metadata(object_name, update_data, update=True) - - def remove(self, container): - - # Remove OpenPype related settings about what model was loaded - # or close the project? - # TODO: This is likely best 'hidden' away to the user because - # this will leave the project's mesh unmanaged. - remove_container_metadata(container["objectName"]) diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_current_file.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_current_file.py deleted file mode 100644 index db0edafac0..0000000000 --- a/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_current_file.py +++ /dev/null @@ -1,17 +0,0 @@ -import pyblish.api - -from ayon_core.pipeline import registered_host - - -class CollectCurrentFile(pyblish.api.ContextPlugin): - """Inject the current working file into context""" - - order = pyblish.api.CollectorOrder - 0.49 - label = "Current Workfile" - hosts = ["substancepainter"] - - def process(self, context): - host = registered_host() - path = host.get_current_workfile() - context.data["currentFile"] = path - self.log.debug(f"Current workfile: {path}") diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_textureset_images.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_textureset_images.py deleted file mode 100644 index 20aaa56993..0000000000 --- a/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_textureset_images.py +++ /dev/null @@ -1,211 +0,0 @@ -import os -import copy - -import pyblish.api -import ayon_api - -import substance_painter.textureset -from ayon_core.pipeline import publish -from ayon_core.hosts.substancepainter.api.lib import ( - get_parsed_export_maps, - strip_template -) -from ayon_core.pipeline.create import get_product_name - - -class CollectTextureSet(pyblish.api.InstancePlugin): - """Extract Textures using an output template config""" - # TODO: Production-test usage of color spaces - # TODO: Detect what source data channels end up in each file - - label = "Collect Texture Set images" - hosts = ["substancepainter"] - families = ["textureSet"] - order = pyblish.api.CollectorOrder - - def process(self, instance): - - config = self.get_export_config(instance) - project_name = instance.context.data["projectName"] - folder_entity = ayon_api.get_folder_by_path( - project_name, - instance.data["folderPath"] - ) - task_name = instance.data.get("task") - task_entity = None - if folder_entity and task_name: - task_entity = ayon_api.get_task_by_name( - project_name, folder_entity["id"], task_name - ) - - instance.data["exportConfig"] = config - maps = get_parsed_export_maps(config) - - # Let's break the instance into multiple instances to integrate - # a product per generated texture or texture UDIM sequence - for (texture_set_name, stack_name), template_maps in maps.items(): - self.log.info(f"Processing {texture_set_name}/{stack_name}") - for template, outputs in template_maps.items(): - self.log.info(f"Processing {template}") - self.create_image_instance(instance, template, outputs, - task_entity=task_entity, - texture_set_name=texture_set_name, - stack_name=stack_name) - - def create_image_instance(self, instance, template, outputs, - task_entity, texture_set_name, stack_name): - """Create a new instance per image or UDIM sequence. - - The new instances will be of product type `image`. - - """ - - context = instance.context - first_filepath = outputs[0]["filepath"] - fnames = [os.path.basename(output["filepath"]) for output in outputs] - ext = os.path.splitext(first_filepath)[1] - assert ext.lstrip("."), f"No extension: {ext}" - - always_include_texture_set_name = False # todo: make this configurable - all_texture_sets = substance_painter.textureset.all_texture_sets() - texture_set = substance_painter.textureset.TextureSet.from_name( - texture_set_name - ) - - # Define the suffix we want to give this particular texture - # set and set up a remapped product naming for it. - suffix = "" - if always_include_texture_set_name or len(all_texture_sets) > 1: - # More than one texture set, include texture set name - suffix += f".{texture_set_name}" - if texture_set.is_layered_material() and stack_name: - # More than one stack, include stack name - suffix += f".{stack_name}" - - # Always include the map identifier - map_identifier = strip_template(template) - suffix += f".{map_identifier}" - - task_name = task_type = None - if task_entity: - task_name = task_entity["name"] - task_type = task_entity["taskType"] - - image_product_name = get_product_name( - # TODO: The product type actually isn't 'texture' currently but - # for now this is only done so the product name starts with - # 'texture' - context.data["projectName"], - task_name, - task_type, - context.data["hostName"], - product_type="texture", - variant=instance.data["variant"] + suffix, - project_settings=context.data["project_settings"] - ) - - # Prepare representation - representation = { - "name": ext.lstrip("."), - "ext": ext.lstrip("."), - "files": fnames if len(fnames) > 1 else fnames[0], - } - - # Mark as UDIM explicitly if it has UDIM tiles. - if bool(outputs[0].get("udim")): - # The representation for a UDIM sequence should have a `udim` key - # that is a list of all udim tiles (str) like: ["1001", "1002"] - # strings. See CollectTextures plug-in and Integrators. - representation["udim"] = [output["udim"] for output in outputs] - - # Set up the representation for thumbnail generation - # TODO: Simplify this once thumbnail extraction is refactored - staging_dir = os.path.dirname(first_filepath) - representation["tags"] = ["review"] - representation["stagingDir"] = staging_dir - - # Clone the instance - product_type = "image" - image_instance = context.create_instance(image_product_name) - image_instance[:] = instance[:] - image_instance.data.update(copy.deepcopy(dict(instance.data))) - image_instance.data["name"] = image_product_name - image_instance.data["label"] = image_product_name - image_instance.data["productName"] = image_product_name - image_instance.data["productType"] = product_type - image_instance.data["family"] = product_type - image_instance.data["families"] = [product_type, "textures"] - image_instance.data["representations"] = [representation] - - # Group the textures together in the loader - image_instance.data["productGroup"] = image_product_name - - # Store the texture set name and stack name on the instance - image_instance.data["textureSetName"] = texture_set_name - image_instance.data["textureStackName"] = stack_name - - # Store color space with the instance - # Note: The extractor will assign it to the representation - colorspace = outputs[0].get("colorSpace") - if colorspace: - self.log.debug(f"{image_product_name} colorspace: {colorspace}") - image_instance.data["colorspace"] = colorspace - - # Store the instance in the original instance as a member - instance.append(image_instance) - - def get_export_config(self, instance): - """Return an export configuration dict for texture exports. - - This config can be supplied to: - - `substance_painter.export.export_project_textures` - - `substance_painter.export.list_project_textures` - - See documentation on substance_painter.export module about the - formatting of the configuration dictionary. - - Args: - instance (pyblish.api.Instance): Texture Set instance to be - published. - - Returns: - dict: Export config - - """ - - creator_attrs = instance.data["creator_attributes"] - preset_url = creator_attrs["exportPresetUrl"] - self.log.debug(f"Exporting using preset: {preset_url}") - - # See: https://substance3d.adobe.com/documentation/ptpy/api/substance_painter/export # noqa - config = { # noqa - "exportShaderParams": True, - "exportPath": publish.get_instance_staging_dir(instance), - "defaultExportPreset": preset_url, - - # Custom overrides to the exporter - "exportParameters": [ - { - "parameters": { - "fileFormat": creator_attrs["exportFileFormat"], - "sizeLog2": creator_attrs["exportSize"], - "paddingAlgorithm": creator_attrs["exportPadding"], - "dilationDistance": creator_attrs["exportDilationDistance"] # noqa - } - } - ] - } - - # Create the list of Texture Sets to export. - config["exportList"] = [] - for texture_set in substance_painter.textureset.all_texture_sets(): - config["exportList"].append({"rootPath": texture_set.name()}) - - # Consider None values from the creator attributes optionals - for override in config["exportParameters"]: - parameters = override.get("parameters") - for key, value in dict(parameters).items(): - if value is None: - parameters.pop(key) - - return config diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_workfile_representation.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_workfile_representation.py deleted file mode 100644 index 8d98d0b014..0000000000 --- a/server_addon/substancepainter/client/substancepainter/plugins/publish/collect_workfile_representation.py +++ /dev/null @@ -1,26 +0,0 @@ -import os -import pyblish.api - - -class CollectWorkfileRepresentation(pyblish.api.InstancePlugin): - """Create a publish representation for the current workfile instance.""" - - order = pyblish.api.CollectorOrder - label = "Workfile representation" - hosts = ["substancepainter"] - families = ["workfile"] - - def process(self, instance): - - context = instance.context - current_file = context.data["currentFile"] - - folder, file = os.path.split(current_file) - filename, ext = os.path.splitext(file) - - instance.data["representations"] = [{ - "name": ext.lstrip("."), - "ext": ext.lstrip("."), - "files": file, - "stagingDir": folder, - }] diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/extract_textures.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/extract_textures.py deleted file mode 100644 index 0fa7b52f45..0000000000 --- a/server_addon/substancepainter/client/substancepainter/plugins/publish/extract_textures.py +++ /dev/null @@ -1,62 +0,0 @@ -import substance_painter.export - -from ayon_core.pipeline import KnownPublishError, publish - - -class ExtractTextures(publish.Extractor, - publish.ColormanagedPyblishPluginMixin): - """Extract Textures using an output template config. - - Note: - This Extractor assumes that `collect_textureset_images` has prepared - the relevant export config and has also collected the individual image - instances for publishing including its representation. That is why this - particular Extractor doesn't specify representations to integrate. - - """ - - label = "Extract Texture Set" - hosts = ["substancepainter"] - families = ["textureSet"] - - # Run before thumbnail extractors - order = publish.Extractor.order - 0.1 - - def process(self, instance): - - config = instance.data["exportConfig"] - result = substance_painter.export.export_project_textures(config) - - if result.status != substance_painter.export.ExportStatus.Success: - raise KnownPublishError( - "Failed to export texture set: {}".format(result.message) - ) - - # Log what files we generated - for (texture_set_name, stack_name), maps in result.textures.items(): - # Log our texture outputs - self.log.info(f"Exported stack: {texture_set_name} {stack_name}") - for texture_map in maps: - self.log.info(f"Exported texture: {texture_map}") - - # We'll insert the color space data for each image instance that we - # added into this texture set. The collector couldn't do so because - # some anatomy and other instance data needs to be collected prior - context = instance.context - for image_instance in instance: - representation = next(iter(image_instance.data["representations"])) - - colorspace = image_instance.data.get("colorspace") - if not colorspace: - self.log.debug("No color space data present for instance: " - f"{image_instance}") - continue - - self.set_representation_colorspace(representation, - context=context, - colorspace=colorspace) - - # The TextureSet instance should not be integrated. It generates no - # output data. Instead the separated texture instances are generated - # from it which themselves integrate into the database. - instance.data["integrate"] = False diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/increment_workfile.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/increment_workfile.py deleted file mode 100644 index 521a28130b..0000000000 --- a/server_addon/substancepainter/client/substancepainter/plugins/publish/increment_workfile.py +++ /dev/null @@ -1,23 +0,0 @@ -import pyblish.api - -from ayon_core.lib import version_up -from ayon_core.pipeline import registered_host - - -class IncrementWorkfileVersion(pyblish.api.ContextPlugin): - """Increment current workfile version.""" - - order = pyblish.api.IntegratorOrder + 1 - label = "Increment Workfile Version" - optional = True - hosts = ["substancepainter"] - - def process(self, context): - - assert all(result["success"] for result in context.data["results"]), ( - "Publishing not successful so version is not increased.") - - host = registered_host() - path = context.data["currentFile"] - self.log.info(f"Incrementing current workfile to: {path}") - host.save_workfile(version_up(path)) diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/save_workfile.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/save_workfile.py deleted file mode 100644 index 627fb991aa..0000000000 --- a/server_addon/substancepainter/client/substancepainter/plugins/publish/save_workfile.py +++ /dev/null @@ -1,28 +0,0 @@ -import pyblish.api - -from ayon_core.pipeline import ( - registered_host, - KnownPublishError -) - - -class SaveCurrentWorkfile(pyblish.api.ContextPlugin): - """Save current workfile""" - - label = "Save current workfile" - order = pyblish.api.ExtractorOrder - 0.49 - hosts = ["substancepainter"] - - def process(self, context): - - host = registered_host() - current = host.get_current_workfile() - if context.data["currentFile"] != current: - raise KnownPublishError("Workfile has changed during publishing!") - - if host.workfile_has_unsaved_changes(): - self.log.info("Saving current file: {}".format(current)) - host.save_workfile() - else: - self.log.debug("Skipping workfile save because there are no " - "unsaved changes.") diff --git a/server_addon/substancepainter/client/substancepainter/plugins/publish/validate_ouput_maps.py b/server_addon/substancepainter/client/substancepainter/plugins/publish/validate_ouput_maps.py deleted file mode 100644 index 720771994c..0000000000 --- a/server_addon/substancepainter/client/substancepainter/plugins/publish/validate_ouput_maps.py +++ /dev/null @@ -1,110 +0,0 @@ -import copy -import os - -import pyblish.api - -import substance_painter.export - -from ayon_core.pipeline import PublishValidationError - - -class ValidateOutputMaps(pyblish.api.InstancePlugin): - """Validate all output maps for Output Template are generated. - - Output maps will be skipped by Substance Painter if it is an output - map in the Substance Output Template which uses channels that the current - substance painter project has not painted or generated. - - """ - - order = pyblish.api.ValidatorOrder - label = "Validate output maps" - hosts = ["substancepainter"] - families = ["textureSet"] - - def process(self, instance): - - config = instance.data["exportConfig"] - - # Substance Painter API does not allow to query the actual output maps - # it will generate without actually exporting the files. So we try to - # generate the smallest size / fastest export as possible - config = copy.deepcopy(config) - parameters = config["exportParameters"][0]["parameters"] - parameters["sizeLog2"] = [1, 1] # output 2x2 images (smallest) - parameters["paddingAlgorithm"] = "passthrough" # no dilation (faster) - parameters["dithering"] = False # no dithering (faster) - - result = substance_painter.export.export_project_textures(config) - if result.status != substance_painter.export.ExportStatus.Success: - raise PublishValidationError( - "Failed to export texture set: {}".format(result.message) - ) - - generated_files = set() - for texture_maps in result.textures.values(): - for texture_map in texture_maps: - generated_files.add(os.path.normpath(texture_map)) - # Directly clean up our temporary export - os.remove(texture_map) - - creator_attributes = instance.data.get("creator_attributes", {}) - allow_skipped_maps = creator_attributes.get("allowSkippedMaps", True) - error_report_missing = [] - for image_instance in instance: - - # Confirm whether the instance has its expected files generated. - # We assume there's just one representation and that it is - # the actual texture representation from the collector. - representation = next(iter(image_instance.data["representations"])) - staging_dir = representation["stagingDir"] - filenames = representation["files"] - if not isinstance(filenames, (list, tuple)): - # Convert single file to list - filenames = [filenames] - - missing = [] - for filename in filenames: - filepath = os.path.join(staging_dir, filename) - filepath = os.path.normpath(filepath) - if filepath not in generated_files: - self.log.warning(f"Missing texture: {filepath}") - missing.append(filepath) - - if not missing: - continue - - if allow_skipped_maps: - # TODO: This is changing state on the instance's which - # should not be done during validation. - self.log.warning(f"Disabling texture instance: " - f"{image_instance}") - image_instance.data["active"] = False - image_instance.data["publish"] = False - image_instance.data["integrate"] = False - representation.setdefault("tags", []).append("delete") - continue - else: - error_report_missing.append((image_instance, missing)) - - if error_report_missing: - - message = ( - "The Texture Set skipped exporting some output maps which are " - "defined in the Output Template. This happens if the Output " - "Templates exports maps from channels which you do not " - "have in your current Substance Painter project.\n\n" - "To allow this enable the *Allow Skipped Output Maps* setting " - "on the instance.\n\n" - f"Instance {instance} skipped exporting output maps:\n" - "" - ) - - for image_instance, missing in error_report_missing: - missing_str = ", ".join(missing) - message += f"- **{image_instance}** skipped: {missing_str}\n" - - raise PublishValidationError( - message=message, - title="Missing output maps" - ) diff --git a/server_addon/substancepainter/package.py b/server_addon/substancepainter/package.py index d445b0059f..66638b0a2e 100644 --- a/server_addon/substancepainter/package.py +++ b/server_addon/substancepainter/package.py @@ -1,3 +1,10 @@ name = "substancepainter" title = "Substance Painter" -version = "0.1.1" +version = "0.1.2" + +client_dir = "ayon_substancepainter" + +ayon_required_addons = { + "core": ">=0.3.1", +} +ayon_compatible_addons = {} From bad4de2f7c0f1143648d8c90ac18f9ddef0617a6 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 15 May 2024 17:06:53 +0800 Subject: [PATCH 03/67] move substance painter integration to server-addon and rename the folder as ayon_substancepainter --- .../ayon_substancepainter/deploy/plugins/openpype_plugin.py | 2 +- .../ayon_substancepainter/plugins/create/create_textures.py | 4 ++-- .../ayon_substancepainter/plugins/create/create_workfile.py | 2 +- .../client/ayon_substancepainter/plugins/load/load_mesh.py | 2 +- .../plugins/publish/collect_textureset_images.py | 2 +- server_addon/substancepainter/package.py | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/openpype_plugin.py b/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/openpype_plugin.py index 8ced463367..5a0aff5649 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/openpype_plugin.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/openpype_plugin.py @@ -22,7 +22,7 @@ def cleanup_openpype_qt_widgets(): def start_plugin(): from ayon_core.pipeline import install_host - from ayon_core.hosts.substancepainter.api import SubstanceHost + from ayon_substancepainter.api import SubstanceHost install_host(SubstanceHost()) diff --git a/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_textures.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_textures.py index f46afadb5a..248bc00aa3 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_textures.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_textures.py @@ -9,13 +9,13 @@ from ayon_core.lib import ( BoolDef ) -from ayon_core.hosts.substancepainter.api.pipeline import ( +from ayon_substancepainter.api.pipeline import ( get_instances, set_instance, set_instances, remove_instance ) -from ayon_core.hosts.substancepainter.api.lib import get_export_presets +from ayon_substancepainter.api.lib import get_export_presets import substance_painter.project diff --git a/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py index 63b1c6c7da..16a6f1bbb8 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py @@ -5,7 +5,7 @@ import ayon_api from ayon_core.pipeline import CreatedInstance, AutoCreator -from ayon_core.hosts.substancepainter.api.pipeline import ( +from ayon_substancepainter.api.pipeline import ( set_instances, set_instance, get_instances diff --git a/server_addon/substancepainter/client/ayon_substancepainter/plugins/load/load_mesh.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/load/load_mesh.py index d5aac1191c..e2a48dd5a4 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/plugins/load/load_mesh.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/plugins/load/load_mesh.py @@ -5,7 +5,7 @@ from ayon_core.pipeline import ( get_representation_path, ) from ayon_core.pipeline.load import LoadError -from ayon_core.hosts.substancepainter.api.pipeline import ( +from ayon_substancepainter.api.pipeline import ( imprint_container, set_container_metadata, remove_container_metadata diff --git a/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/collect_textureset_images.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/collect_textureset_images.py index 20aaa56993..824f2d999f 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/collect_textureset_images.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/collect_textureset_images.py @@ -6,7 +6,7 @@ import ayon_api import substance_painter.textureset from ayon_core.pipeline import publish -from ayon_core.hosts.substancepainter.api.lib import ( +from ayon_substancepainter.api.lib import ( get_parsed_export_maps, strip_template ) diff --git a/server_addon/substancepainter/package.py b/server_addon/substancepainter/package.py index 66638b0a2e..7232a4dbe4 100644 --- a/server_addon/substancepainter/package.py +++ b/server_addon/substancepainter/package.py @@ -1,6 +1,6 @@ name = "substancepainter" title = "Substance Painter" -version = "0.1.2" +version = "0.2.0" client_dir = "ayon_substancepainter" From 9ee4de380d38a9d586b92e1d4863c40526e13fe8 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 15 May 2024 17:21:42 +0800 Subject: [PATCH 04/67] added addon milestone version --- client/ayon_core/addon/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index 21b1193b07..39dcb6b044 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -51,6 +51,7 @@ IGNORED_MODULES_IN_AYON = set() # - this is used to log the missing addon MOVED_ADDON_MILESTONE_VERSIONS = { "applications": VersionInfo(0, 2, 0), + "substancepainter": VersionInfo(0, 2, 0), } # Inherit from `object` for Python 2 hosts From b2215217e408e6b1643eb49938069bc312c6a9c0 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 15 May 2024 17:34:24 +0800 Subject: [PATCH 05/67] add version.py --- .../substancepainter/client/ayon_substancepainter/version.py | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 server_addon/substancepainter/client/ayon_substancepainter/version.py diff --git a/server_addon/substancepainter/client/ayon_substancepainter/version.py b/server_addon/substancepainter/client/ayon_substancepainter/version.py new file mode 100644 index 0000000000..4f4a309b30 --- /dev/null +++ b/server_addon/substancepainter/client/ayon_substancepainter/version.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +"""Package declaring Substance Painter addon version.""" +__version__ = "0.2.0" \ No newline at end of file From f476de6e493fac21622cc2919a004711d75d96d1 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 15 May 2024 17:41:57 +0800 Subject: [PATCH 06/67] add version.py --- .../substancepainter/client/ayon_substancepainter/version.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server_addon/substancepainter/client/ayon_substancepainter/version.py b/server_addon/substancepainter/client/ayon_substancepainter/version.py index 4f4a309b30..b4293649fe 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/version.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- -"""Package declaring Substance Painter addon version.""" -__version__ = "0.2.0" \ No newline at end of file +"""Package declaring AYON core addon version.""" +__version__ = "0.2.0" From 33d491e1f6afc600b64effa88dfedee600cafeb9 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 15 May 2024 19:19:07 +0800 Subject: [PATCH 07/67] add version.py --- .../substancepainter/client/ayon_substancepainter/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/substancepainter/client/ayon_substancepainter/version.py b/server_addon/substancepainter/client/ayon_substancepainter/version.py index b4293649fe..36fe942532 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/version.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- -"""Package declaring AYON core addon version.""" +"""Package declaring Substance Painter addon version.""" __version__ = "0.2.0" From bec84133e2d8c2c88eb14a3651443a16c7867a18 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 15 May 2024 20:30:27 +0800 Subject: [PATCH 08/67] rename Openpype to AYON --- .../client/ayon_substancepainter/api/pipeline.py | 2 +- .../plugins/{openpype_plugin.py => ayon_plugin.py} | 12 ++++++------ ...oad_on_first_run.py => ayon_load_on_first_run.py} | 4 ++-- .../plugins/create/create_textures.py | 1 + .../plugins/create/create_workfile.py | 1 + .../client/ayon_substancepainter/version.py | 2 +- 6 files changed, 12 insertions(+), 10 deletions(-) rename server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/{openpype_plugin.py => ayon_plugin.py} (73%) rename server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/{openpype_load_on_first_run.py => ayon_load_on_first_run.py} (93%) diff --git a/server_addon/substancepainter/client/ayon_substancepainter/api/pipeline.py b/server_addon/substancepainter/client/ayon_substancepainter/api/pipeline.py index 6e0ca0145b..47090c4b0a 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/api/pipeline.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/api/pipeline.py @@ -31,7 +31,7 @@ from ayon_substancepainter import SUBSTANCE_HOST_DIR from . import lib -log = logging.getLogger("ayon_core.hosts.substance") +log = logging.getLogger("ayon_substancepainter") PLUGINS_DIR = os.path.join(SUBSTANCE_HOST_DIR, "plugins") PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") diff --git a/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/openpype_plugin.py b/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py similarity index 73% rename from server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/openpype_plugin.py rename to server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py index 5a0aff5649..1cdcc5073d 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/openpype_plugin.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py @@ -1,6 +1,6 @@ -def cleanup_openpype_qt_widgets(): +def cleanup_ayon_qt_widgets(): """ Workaround for Substance failing to shut down correctly when a Qt window was still open at the time of shutting down. @@ -8,14 +8,14 @@ def cleanup_openpype_qt_widgets(): This seems to work sometimes, but not all the time. """ - # TODO: Create a more reliable method to close down all OpenPype Qt widgets + # TODO: Create a more reliable method to close down all AYON Qt widgets from PySide2 import QtWidgets import substance_painter.ui - # Kill OpenPype Qt widgets - print("Killing OpenPype Qt widgets..") + # Kill AYON Qt widgets + print("Killing AYON Qt widgets..") for widget in QtWidgets.QApplication.topLevelWidgets(): - if widget.__module__.startswith("openpype."): + if widget.__module__.startswith("ayon."): print(f"Deleting widget: {widget.__class__.__name__}") substance_painter.ui.delete_ui_element(widget) @@ -28,7 +28,7 @@ def start_plugin(): def close_plugin(): from ayon_core.pipeline import uninstall_host - cleanup_openpype_qt_widgets() + cleanup_ayon_qt_widgets() uninstall_host() diff --git a/server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/openpype_load_on_first_run.py b/server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/ayon_load_on_first_run.py similarity index 93% rename from server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/openpype_load_on_first_run.py rename to server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/ayon_load_on_first_run.py index 04b610b4df..666a0e9f05 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/openpype_load_on_first_run.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/ayon_load_on_first_run.py @@ -1,6 +1,6 @@ -"""Ease the OpenPype on-boarding process by loading the plug-in on first run""" +"""Ease the AYON on-boarding process by loading the plug-in on first run""" -OPENPYPE_PLUGIN_NAME = "openpype_plugin" +OPENPYPE_PLUGIN_NAME = "ayon_plugin" def start_plugin(): diff --git a/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_textures.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_textures.py index 248bc00aa3..45c171fb23 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_textures.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_textures.py @@ -28,6 +28,7 @@ class CreateTextures(Creator): icon = "picture-o" default_variant = "Main" + settings_category = "substancepainter" def create(self, product_name, instance_data, pre_create_data): diff --git a/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py index 16a6f1bbb8..b100e4189d 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py @@ -22,6 +22,7 @@ class CreateWorkfile(AutoCreator): icon = "document" default_variant = "Main" + settings_category = "substancepainter" def create(self): diff --git a/server_addon/substancepainter/client/ayon_substancepainter/version.py b/server_addon/substancepainter/client/ayon_substancepainter/version.py index 36fe942532..b4293649fe 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/version.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- -"""Package declaring Substance Painter addon version.""" +"""Package declaring AYON core addon version.""" __version__ = "0.2.0" From 2ac32e71855d08c8596db4500f777742df44eb86 Mon Sep 17 00:00:00 2001 From: Kayla Man <64118225+moonyuet@users.noreply.github.com> Date: Wed, 15 May 2024 20:44:54 +0800 Subject: [PATCH 09/67] Update server_addon/substancepainter/package.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- server_addon/substancepainter/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/substancepainter/package.py b/server_addon/substancepainter/package.py index 7232a4dbe4..1508225fd8 100644 --- a/server_addon/substancepainter/package.py +++ b/server_addon/substancepainter/package.py @@ -5,6 +5,6 @@ version = "0.2.0" client_dir = "ayon_substancepainter" ayon_required_addons = { - "core": ">=0.3.1", + "core": ">0.3.1", } ayon_compatible_addons = {} From 498260172a4dc50f06cee6aaf0296ad60401f66a Mon Sep 17 00:00:00 2001 From: Kayla Man <64118225+moonyuet@users.noreply.github.com> Date: Mon, 20 May 2024 22:18:01 +0800 Subject: [PATCH 10/67] Update server_addon/substancepainter/package.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- server_addon/substancepainter/package.py | 1 + 1 file changed, 1 insertion(+) diff --git a/server_addon/substancepainter/package.py b/server_addon/substancepainter/package.py index 1508225fd8..b82168c27e 100644 --- a/server_addon/substancepainter/package.py +++ b/server_addon/substancepainter/package.py @@ -1,6 +1,7 @@ name = "substancepainter" title = "Substance Painter" version = "0.2.0" +app_host_name = "substancepainter" client_dir = "ayon_substancepainter" From 31c24e4129e9323eea6b78de5068115eb13dd161 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Tue, 21 May 2024 00:45:13 +0800 Subject: [PATCH 11/67] make sure module name to find QtWIdget is correct and make sure all Openpype name converted to AYON --- .../deploy/plugins/ayon_plugin.py | 3 ++- .../deploy/startup/ayon_load_on_first_run.py | 10 +++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py b/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py index 1cdcc5073d..fd819bf476 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py @@ -15,7 +15,8 @@ def cleanup_ayon_qt_widgets(): # Kill AYON Qt widgets print("Killing AYON Qt widgets..") for widget in QtWidgets.QApplication.topLevelWidgets(): - if widget.__module__.startswith("ayon."): + print(widget.__module__) + if widget.__module__.startswith("ayon_substancepainter."): print(f"Deleting widget: {widget.__class__.__name__}") substance_painter.ui.delete_ui_element(widget) diff --git a/server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/ayon_load_on_first_run.py b/server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/ayon_load_on_first_run.py index 666a0e9f05..9ef119e357 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/ayon_load_on_first_run.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/deploy/startup/ayon_load_on_first_run.py @@ -1,6 +1,6 @@ """Ease the AYON on-boarding process by loading the plug-in on first run""" -OPENPYPE_PLUGIN_NAME = "ayon_plugin" +AYON_PLUGIN_NAME = "ayon_plugin" def start_plugin(): @@ -19,9 +19,9 @@ def start_plugin(): # later than this startup script, we check whether its menu initialized is_before_plugins_menu = PLUGINS_MENU is None - settings = get_settings(OPENPYPE_PLUGIN_NAME) + settings = get_settings(AYON_PLUGIN_NAME) if settings.value(LAUNCH_AT_START_KEY, None) is None: - print("Initializing OpenPype plug-in on first run...") + print("Initializing AYON plug-in on first run...") if is_before_plugins_menu: print("- running before 'painter_plugins_ui'") # Delay the launch to the painter_plugins_ui initialization @@ -29,11 +29,11 @@ def start_plugin(): else: # Launch now print("- running after 'painter_plugins_ui'") - plugin_manager(OPENPYPE_PLUGIN_NAME)(True) + plugin_manager(AYON_PLUGIN_NAME)(True) # Set the checked state in the menu to avoid confusion action = next(action for action in PLUGINS_MENU._menu.actions() - if action.text() == OPENPYPE_PLUGIN_NAME) + if action.text() == AYON_PLUGIN_NAME) if action is not None: action.blockSignals(True) action.setChecked(True) From 22564b2071dc25acdf0afe8b17e2b65e6c597365 Mon Sep 17 00:00:00 2001 From: Kayla Man <64118225+moonyuet@users.noreply.github.com> Date: Thu, 23 May 2024 00:56:34 +0800 Subject: [PATCH 12/67] Update server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- .../client/ayon_substancepainter/deploy/plugins/ayon_plugin.py | 1 - 1 file changed, 1 deletion(-) diff --git a/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py b/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py index fd819bf476..4d7b318e44 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py @@ -15,7 +15,6 @@ def cleanup_ayon_qt_widgets(): # Kill AYON Qt widgets print("Killing AYON Qt widgets..") for widget in QtWidgets.QApplication.topLevelWidgets(): - print(widget.__module__) if widget.__module__.startswith("ayon_substancepainter."): print(f"Deleting widget: {widget.__class__.__name__}") substance_painter.ui.delete_ui_element(widget) From b2c0fc08b7989975ec1b97832ee61a87d1ff13a9 Mon Sep 17 00:00:00 2001 From: Kayla Man <64118225+moonyuet@users.noreply.github.com> Date: Thu, 23 May 2024 00:57:01 +0800 Subject: [PATCH 13/67] Update server_addon/substancepainter/package.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- server_addon/substancepainter/package.py | 1 - 1 file changed, 1 deletion(-) diff --git a/server_addon/substancepainter/package.py b/server_addon/substancepainter/package.py index b82168c27e..1508225fd8 100644 --- a/server_addon/substancepainter/package.py +++ b/server_addon/substancepainter/package.py @@ -1,7 +1,6 @@ name = "substancepainter" title = "Substance Painter" version = "0.2.0" -app_host_name = "substancepainter" client_dir = "ayon_substancepainter" From 11eb3d7def6c7faf2510f0f94cd4d4b966e64f70 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Thu, 23 May 2024 01:00:05 +0800 Subject: [PATCH 14/67] use ayon_ to capture widget in ayon_core too --- .../client/ayon_substancepainter/deploy/plugins/ayon_plugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py b/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py index 4d7b318e44..85bb56d73c 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/deploy/plugins/ayon_plugin.py @@ -15,7 +15,7 @@ def cleanup_ayon_qt_widgets(): # Kill AYON Qt widgets print("Killing AYON Qt widgets..") for widget in QtWidgets.QApplication.topLevelWidgets(): - if widget.__module__.startswith("ayon_substancepainter."): + if widget.__module__.startswith("ayon_"): print(f"Deleting widget: {widget.__class__.__name__}") substance_painter.ui.delete_ui_element(widget) From c2984fcc3b97323a75af48b4396bb595bac0ac9a Mon Sep 17 00:00:00 2001 From: Kayla Man <64118225+moonyuet@users.noreply.github.com> Date: Thu, 23 May 2024 21:08:13 +0800 Subject: [PATCH 15/67] Update server_addon/substancepainter/package.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- server_addon/substancepainter/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/substancepainter/package.py b/server_addon/substancepainter/package.py index 1508225fd8..4db5ef634f 100644 --- a/server_addon/substancepainter/package.py +++ b/server_addon/substancepainter/package.py @@ -5,6 +5,6 @@ version = "0.2.0" client_dir = "ayon_substancepainter" ayon_required_addons = { - "core": ">0.3.1", + "core": ">0.3.2", } ayon_compatible_addons = {} From d92385c3d491c84d4466a8f115684961d19100c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Samohel?= Date: Thu, 23 May 2024 17:05:58 +0200 Subject: [PATCH 16/67] :recyce: move maya addon --- client/ayon_core/addon/base.py | 4 +++- .../plugins/publish/submit_maya_deadline.py | 4 ++-- pyproject.toml | 4 ++++ .../maya/client/ayon_maya}/__init__.py | 0 .../maya/client/ayon_maya}/addon.py | 0 .../maya/client/ayon_maya}/api/__init__.py | 0 .../maya/client/ayon_maya}/api/action.py | 0 .../maya/client/ayon_maya}/api/alembic.py | 2 +- .../maya/client/ayon_maya}/api/commands.py | 0 .../maya/client/ayon_maya}/api/customize.py | 0 .../maya/client/ayon_maya}/api/exitstack.py | 2 +- .../maya/client/ayon_maya}/api/fbx.py | 2 +- .../maya/client/ayon_maya}/api/gltf.py | 2 +- .../maya/client/ayon_maya}/api/lib.py | 0 .../ayon_maya}/api/lib_renderproducts.py | 0 .../ayon_maya}/api/lib_rendersettings.py | 2 +- .../client/ayon_maya}/api/lib_rendersetup.py | 2 +- .../maya/client/ayon_maya}/api/menu.py | 2 +- .../maya/client/ayon_maya}/api/pipeline.py | 6 ++--- .../maya/client/ayon_maya}/api/plugin.py | 2 +- .../ayon_maya}/api/render_setup_tools.py | 0 .../maya/client/ayon_maya}/api/setdress.py | 2 +- .../api/workfile_template_builder.py | 0 .../maya/client/ayon_maya}/api/workio.py | 0 .../maya/client/ayon_maya}/api/yeti.py | 0 .../ayon_maya}/hooks/pre_auto_load_plugins.py | 0 .../client/ayon_maya}/hooks/pre_copy_mel.py | 2 +- .../pre_open_workfile_post_initialization.py | 0 .../maya/client/ayon_maya}/lib.py | 0 .../client/ayon_maya}/plugins/__init__.py | 0 .../plugins/create/convert_legacy.py | 6 ++--- .../create/create_animation_pointcache.py | 2 +- .../create/create_arnold_scene_source.py | 2 +- .../plugins/create/create_assembly.py | 2 +- .../plugins/create/create_camera.py | 2 +- .../plugins/create/create_layout.py | 2 +- .../ayon_maya}/plugins/create/create_look.py | 2 +- .../plugins/create/create_matchmove.py | 2 +- .../plugins/create/create_maya_usd.py | 2 +- .../plugins/create/create_mayascene.py | 2 +- .../ayon_maya}/plugins/create/create_model.py | 2 +- .../plugins/create/create_multishot_layout.py | 2 +- .../plugins/create/create_multiverse_look.py | 2 +- .../plugins/create/create_multiverse_usd.py | 2 +- .../create/create_multiverse_usd_comp.py | 2 +- .../create/create_multiverse_usd_over.py | 2 +- .../plugins/create/create_proxy_abc.py | 2 +- .../plugins/create/create_redshift_proxy.py | 2 +- .../plugins/create/create_render.py | 2 +- .../plugins/create/create_rendersetup.py | 2 +- .../plugins/create/create_review.py | 2 +- .../ayon_maya}/plugins/create/create_rig.py | 2 +- .../plugins/create/create_setdress.py | 2 +- .../create/create_unreal_skeletalmesh.py | 2 +- .../create/create_unreal_staticmesh.py | 2 +- .../plugins/create/create_unreal_yeticache.py | 2 +- .../plugins/create/create_vrayproxy.py | 2 +- .../plugins/create/create_vrayscene.py | 2 +- .../plugins/create/create_workfile.py | 2 +- .../ayon_maya}/plugins/create/create_xgen.py | 2 +- .../plugins/create/create_yeti_cache.py | 2 +- .../plugins/create/create_yeti_rig.py | 2 +- .../plugins/inventory/connect_geometry.py | 2 +- .../plugins/inventory/connect_xgen.py | 0 .../plugins/inventory/connect_yeti_rig.py | 2 +- .../plugins/inventory/import_modelrender.py | 2 +- .../plugins/inventory/import_reference.py | 2 +- .../rig_recreate_animation_instance.py | 2 +- .../plugins/inventory/select_containers.py | 2 +- .../plugins/load/_load_animation.py | 8 +++---- .../client/ayon_maya}/plugins/load/actions.py | 6 ++--- .../plugins/load/load_arnold_standin.py | 6 ++--- .../plugins/load/load_as_template.py | 2 +- .../ayon_maya}/plugins/load/load_assembly.py | 6 ++--- .../ayon_maya}/plugins/load/load_audio.py | 4 ++-- .../ayon_maya}/plugins/load/load_gpucache.py | 6 ++--- .../ayon_maya}/plugins/load/load_image.py | 4 ++-- .../plugins/load/load_image_plane.py | 4 ++-- .../ayon_maya}/plugins/load/load_look.py | 8 +++---- .../ayon_maya}/plugins/load/load_matchmove.py | 0 .../ayon_maya}/plugins/load/load_maya_usd.py | 4 ++-- .../plugins/load/load_multiverse_usd.py | 4 ++-- .../plugins/load/load_multiverse_usd_over.py | 4 ++-- .../plugins/load/load_redshift_proxy.py | 6 ++--- .../ayon_maya}/plugins/load/load_reference.py | 4 ++-- .../plugins/load/load_rendersetup.py | 4 ++-- .../plugins/load/load_vdb_to_arnold.py | 6 ++--- .../plugins/load/load_vdb_to_redshift.py | 6 ++--- .../plugins/load/load_vdb_to_vray.py | 8 +++---- .../ayon_maya}/plugins/load/load_vrayproxy.py | 6 ++--- .../ayon_maya}/plugins/load/load_vrayscene.py | 6 ++--- .../ayon_maya}/plugins/load/load_xgen.py | 8 +++---- .../plugins/load/load_yeti_cache.py | 8 +++---- .../ayon_maya}/plugins/load/load_yeti_rig.py | 4 ++-- .../ayon_maya}/plugins/publish/__init__.py | 0 .../plugins/publish/collect_animation.py | 0 .../publish/collect_arnold_scene_source.py | 2 +- .../plugins/publish/collect_assembly.py | 4 ++-- .../plugins/publish/collect_current_file.py | 0 .../plugins/publish/collect_fbx_animation.py | 0 .../plugins/publish/collect_fbx_camera.py | 0 .../publish/collect_file_dependencies.py | 0 .../plugins/publish/collect_gltf.py | 0 .../plugins/publish/collect_history.py | 0 .../plugins/publish/collect_inputs.py | 4 ++-- .../plugins/publish/collect_instances.py | 8 ++++--- .../plugins/publish/collect_look.py | 2 +- .../publish/collect_maya_scene_time.py | 0 .../plugins/publish/collect_maya_units.py | 0 .../plugins/publish/collect_maya_workspace.py | 0 .../plugins/publish/collect_model.py | 0 .../publish/collect_multiverse_look.py | 2 +- .../plugins/publish/collect_pointcache.py | 0 .../plugins/publish/collect_remove_marked.py | 0 .../plugins/publish/collect_render.py | 4 ++-- .../publish/collect_render_layer_aovs.py | 2 +- .../publish/collect_renderable_camera.py | 2 +- .../plugins/publish/collect_review.py | 2 +- .../plugins/publish/collect_rig_sets.py | 0 .../plugins/publish/collect_skeleton_mesh.py | 0 .../publish/collect_unreal_skeletalmesh.py | 0 .../publish/collect_unreal_staticmesh.py | 0 .../collect_user_defined_attributes.py | 0 .../plugins/publish/collect_vrayproxy.py | 0 .../plugins/publish/collect_vrayscene.py | 2 +- .../plugins/publish/collect_workfile.py | 0 .../plugins/publish/collect_workscene_fps.py | 0 .../plugins/publish/collect_xgen.py | 2 +- .../plugins/publish/collect_yeti_cache.py | 4 ++-- .../plugins/publish/collect_yeti_rig.py | 2 +- .../publish/determine_future_version.py | 0 .../publish/extract_active_view_thumbnail.py | 2 +- .../publish/extract_arnold_scene_source.py | 2 +- .../plugins/publish/extract_assembly.py | 2 +- .../plugins/publish/extract_camera_alembic.py | 2 +- .../publish/extract_camera_mayaScene.py | 2 +- .../ayon_maya}/plugins/publish/extract_fbx.py | 4 ++-- .../plugins/publish/extract_fbx_animation.py | 4 ++-- .../plugins/publish/extract_gltf.py | 6 ++--- .../plugins/publish/extract_gpu_cache.py | 0 .../publish/extract_import_reference.py | 2 +- .../plugins/publish/extract_layout.py | 0 .../plugins/publish/extract_look.py | 2 +- .../plugins/publish/extract_maya_scene_raw.py | 2 +- .../plugins/publish/extract_maya_usd.py | 2 +- .../plugins/publish/extract_model.py | 2 +- .../publish/extract_multiverse_look.py | 2 +- .../plugins/publish/extract_multiverse_usd.py | 2 +- .../publish/extract_multiverse_usd_comp.py | 2 +- .../publish/extract_multiverse_usd_over.py | 2 +- .../ayon_maya}/plugins/publish/extract_obj.py | 2 +- .../plugins/publish/extract_playblast.py | 2 +- .../plugins/publish/extract_pointcache.py | 4 ++-- .../plugins/publish/extract_proxy_abc.py | 4 ++-- .../plugins/publish/extract_redshift_proxy.py | 4 ++-- .../plugins/publish/extract_rendersetup.py | 0 .../ayon_maya}/plugins/publish/extract_rig.py | 2 +- .../plugins/publish/extract_skeleton_mesh.py | 2 +- .../plugins/publish/extract_thumbnail.py | 2 +- .../extract_unreal_skeletalmesh_abc.py | 4 ++-- .../extract_unreal_skeletalmesh_fbx.py | 2 +- .../publish/extract_unreal_staticmesh.py | 4 ++-- .../publish/extract_unreal_yeticache.py | 0 .../plugins/publish/extract_vrayproxy.py | 2 +- .../plugins/publish/extract_vrayscene.py | 4 ++-- .../plugins/publish/extract_workfile_xgen.py | 2 +- .../plugins/publish/extract_xgen.py | 2 +- .../plugins/publish/extract_yeti_cache.py | 0 .../plugins/publish/extract_yeti_rig.py | 2 +- .../submit_maya_remote_publish_deadline.xml | 2 +- ...ate_animation_out_set_related_node_ids.xml | 4 ++-- .../publish/help/validate_maya_units.xml | 0 .../help/validate_mesh_non_manifold.xml | 0 .../publish/help/validate_node_ids.xml | 0 .../help/validate_rig_out_set_node_ids.xml | 2 +- .../help/validate_skeletalmesh_hierarchy.xml | 0 .../increment_current_file_deadline.py | 0 .../plugins/publish/reset_xgen_attributes.py | 0 .../ayon_maya}/plugins/publish/save_scene.py | 0 .../validate_alembic_options_defaults.py | 16 +++++++------- .../publish/validate_animation_content.py | 4 ++-- ...date_animation_out_set_related_node_ids.py | 6 ++--- .../publish/validate_arnold_scene_source.py | 2 +- .../validate_arnold_scene_source_cbid.py | 2 +- .../publish/validate_ass_relative_paths.py | 0 .../plugins/publish/validate_assembly_name.py | 4 ++-- .../publish/validate_assembly_namespaces.py | 4 ++-- .../publish/validate_assembly_transforms.py | 8 +++---- .../plugins/publish/validate_attributes.py | 2 +- .../publish/validate_camera_attributes.py | 4 ++-- .../publish/validate_camera_contents.py | 4 ++-- .../plugins/publish/validate_color_sets.py | 4 ++-- ...validate_current_renderlayer_renderable.py | 0 .../plugins/publish/validate_cycle_error.py | 6 ++--- .../plugins/publish/validate_frame_range.py | 2 +- .../plugins/publish/validate_glsl_material.py | 0 .../plugins/publish/validate_glsl_plugin.py | 0 .../publish/validate_instance_has_members.py | 4 ++-- .../publish/validate_instance_in_context.py | 4 ++-- .../publish/validate_instance_subset.py | 0 .../plugins/publish/validate_loaded_plugin.py | 0 .../plugins/publish/validate_look_contents.py | 4 ++-- ...lidate_look_default_shaders_connections.py | 0 .../validate_look_id_reference_edits.py | 4 ++-- .../validate_look_no_default_shaders.py | 4 ++-- .../plugins/publish/validate_look_sets.py | 6 ++--- .../publish/validate_look_shading_group.py | 4 ++-- .../publish/validate_look_single_shader.py | 4 ++-- .../plugins/publish/validate_maya_units.py | 2 +- .../validate_mesh_arnold_attributes.py | 6 ++--- .../plugins/publish/validate_mesh_empty.py | 4 ++-- .../plugins/publish/validate_mesh_has_uv.py | 6 ++--- .../publish/validate_mesh_lamina_faces.py | 4 ++-- .../plugins/publish/validate_mesh_ngons.py | 6 ++--- .../validate_mesh_no_negative_scale.py | 4 ++-- .../publish/validate_mesh_non_manifold.py | 4 ++-- .../publish/validate_mesh_non_zero_edge.py | 6 ++--- .../publish/validate_mesh_normals_unlocked.py | 4 ++-- .../publish/validate_mesh_overlapping_uvs.py | 4 ++-- .../validate_mesh_shader_connections.py | 4 ++-- .../publish/validate_mesh_single_uv_set.py | 6 ++--- .../publish/validate_mesh_uv_set_map1.py | 10 ++++----- .../validate_mesh_vertices_have_edges.py | 6 ++--- .../plugins/publish/validate_model_content.py | 18 +++++++-------- .../publish/validate_mvlook_contents.py | 4 ++-- .../plugins/publish/validate_no_animation.py | 4 ++-- .../publish/validate_no_default_camera.py | 4 ++-- .../plugins/publish/validate_no_namespace.py | 4 ++-- .../publish/validate_no_null_transforms.py | 4 ++-- .../publish/validate_no_unknown_nodes.py | 4 ++-- .../plugins/publish/validate_no_vraymesh.py | 0 .../plugins/publish/validate_node_ids.py | 8 +++---- .../validate_node_ids_deformed_shapes.py | 6 ++--- .../publish/validate_node_ids_in_database.py | 8 +++---- .../publish/validate_node_ids_related.py | 22 +++++++++---------- .../publish/validate_node_ids_unique.py | 8 +++---- .../publish/validate_node_no_ghosting.py | 4 ++-- .../validate_plugin_path_attributes.py | 4 ++-- .../publish/validate_render_image_rule.py | 0 .../validate_render_no_default_cameras.py | 4 ++-- .../publish/validate_render_single_camera.py | 10 ++++----- .../publish/validate_renderlayer_aovs.py | 4 ++-- .../publish/validate_rendersettings.py | 4 ++-- .../plugins/publish/validate_resolution.py | 4 ++-- .../plugins/publish/validate_resources.py | 0 .../plugins/publish/validate_review.py | 0 .../plugins/publish/validate_rig_contents.py | 4 ++-- .../publish/validate_rig_controllers.py | 6 ++--- ...idate_rig_controllers_arnold_attributes.py | 6 ++--- .../publish/validate_rig_joints_hidden.py | 6 ++--- .../publish/validate_rig_out_set_node_ids.py | 6 ++--- .../publish/validate_rig_output_ids.py | 6 ++--- .../publish/validate_scene_set_workspace.py | 0 .../plugins/publish/validate_setdress_root.py | 0 .../plugins/publish/validate_shader_name.py | 4 ++-- .../publish/validate_shape_default_names.py | 4 ++-- .../publish/validate_shape_render_stats.py | 4 ++-- .../plugins/publish/validate_shape_zero.py | 6 ++--- .../publish/validate_single_assembly.py | 0 .../validate_skeletalmesh_hierarchy.py | 0 .../validate_skeletalmesh_triangulated.py | 2 +- .../validate_skeleton_top_group_hierarchy.py | 0 .../validate_skinCluster_deformer_set.py | 4 ++-- .../plugins/publish/validate_step_size.py | 4 ++-- .../validate_transform_naming_suffix.py | 4 ++-- .../publish/validate_transform_zero.py | 6 ++--- .../plugins/publish/validate_unique_names.py | 4 ++-- .../validate_unreal_mesh_triangulated.py | 4 ++-- .../validate_unreal_staticmesh_naming.py | 4 ++-- .../publish/validate_unreal_up_axis.py | 0 .../plugins/publish/validate_visible_only.py | 6 ++--- .../plugins/publish/validate_vray.py | 0 .../validate_vray_distributed_rendering.py | 2 +- .../publish/validate_vray_referenced_aovs.py | 0 .../validate_vray_translator_settings.py | 0 .../plugins/publish/validate_vrayproxy.py | 0 .../publish/validate_vrayproxy_members.py | 4 ++-- .../plugins/publish/validate_xgen.py | 0 .../validate_yeti_renderscript_callbacks.py | 0 .../publish/validate_yeti_rig_cache_state.py | 4 ++-- .../validate_yeti_rig_input_in_instance.py | 4 ++-- .../publish/validate_yeti_rig_settings.py | 0 .../workfile_build/load_placeholder.py | 4 ++-- .../workfile_build/script_placeholder.py | 2 +- .../client/ayon_maya}/startup/userSetup.py | 2 +- .../maya/client/ayon_maya}/tools/__init__.py | 0 .../ayon_maya}/tools/mayalookassigner/LICENSE | 0 .../tools/mayalookassigner/__init__.py | 0 .../tools/mayalookassigner/alembic.py | 0 .../ayon_maya}/tools/mayalookassigner/app.py | 2 +- .../tools/mayalookassigner/arnold_standin.py | 2 +- .../tools/mayalookassigner/commands.py | 2 +- .../ayon_maya}/tools/mayalookassigner/lib.py | 2 +- .../tools/mayalookassigner/models.py | 0 .../ayon_maya}/tools/mayalookassigner/usd.py | 0 .../tools/mayalookassigner/views.py | 0 .../tools/mayalookassigner/vray_proxies.py | 2 +- .../tools/mayalookassigner/widgets.py | 0 .../ayon_maya}/vendor/python/capture.py | 0 server_addon/maya/package.py | 6 ++++- 300 files changed, 416 insertions(+), 404 deletions(-) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/__init__.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/addon.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/__init__.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/action.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/alembic.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/commands.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/customize.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/exitstack.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/fbx.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/gltf.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/lib.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/lib_renderproducts.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/lib_rendersettings.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/lib_rendersetup.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/menu.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/pipeline.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/plugin.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/render_setup_tools.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/setdress.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/workfile_template_builder.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/workio.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/api/yeti.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/hooks/pre_auto_load_plugins.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/hooks/pre_copy_mel.py (92%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/hooks/pre_open_workfile_post_initialization.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/lib.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/__init__.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/convert_legacy.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_animation_pointcache.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_arnold_scene_source.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_assembly.py (83%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_camera.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_layout.py (92%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_look.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_matchmove.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_maya_usd.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_mayascene.py (84%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_model.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_multishot_layout.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_multiverse_look.py (93%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_multiverse_usd.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_multiverse_usd_comp.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_multiverse_usd_over.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_proxy_abc.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_redshift_proxy.py (92%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_render.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_rendersetup.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_review.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_rig.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_setdress.py (91%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_unreal_skeletalmesh.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_unreal_staticmesh.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_unreal_yeticache.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_vrayproxy.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_vrayscene.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_workfile.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_xgen.py (79%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_yeti_cache.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/create/create_yeti_rig.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/inventory/connect_geometry.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/inventory/connect_xgen.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/inventory/connect_yeti_rig.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/inventory/import_modelrender.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/inventory/import_reference.py (92%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/inventory/rig_recreate_animation_instance.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/inventory/select_containers.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/_load_animation.py (91%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/actions.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_arnold_standin.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_as_template.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_assembly.py (93%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_audio.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_gpucache.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_image.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_image_plane.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_look.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_matchmove.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_maya_usd.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_multiverse_usd.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_multiverse_usd_over.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_redshift_proxy.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_reference.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_rendersetup.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_vdb_to_arnold.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_vdb_to_redshift.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_vdb_to_vray.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_vrayproxy.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_vrayscene.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_xgen.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_yeti_cache.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/load/load_yeti_rig.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/__init__.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_animation.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_arnold_scene_source.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_assembly.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_current_file.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_fbx_animation.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_fbx_camera.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_file_dependencies.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_gltf.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_history.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_inputs.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_instances.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_look.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_maya_scene_time.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_maya_units.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_maya_workspace.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_model.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_multiverse_look.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_pointcache.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_remove_marked.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_render.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_render_layer_aovs.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_renderable_camera.py (92%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_review.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_rig_sets.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_skeleton_mesh.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_unreal_skeletalmesh.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_unreal_staticmesh.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_user_defined_attributes.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_vrayproxy.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_vrayscene.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_workfile.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_workscene_fps.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_xgen.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_yeti_cache.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/collect_yeti_rig.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/determine_future_version.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_active_view_thumbnail.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_arnold_scene_source.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_assembly.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_camera_alembic.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_camera_mayaScene.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_fbx.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_fbx_animation.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_gltf.py (93%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_gpu_cache.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_import_reference.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_layout.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_look.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_maya_scene_raw.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_maya_usd.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_model.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_multiverse_look.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_multiverse_usd.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_multiverse_usd_comp.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_multiverse_usd_over.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_obj.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_playblast.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_pointcache.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_proxy_abc.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_redshift_proxy.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_rendersetup.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_rig.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_skeleton_mesh.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_thumbnail.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_unreal_skeletalmesh_abc.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_unreal_skeletalmesh_fbx.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_unreal_staticmesh.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_unreal_yeticache.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_vrayproxy.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_vrayscene.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_workfile_xgen.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_xgen.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_yeti_cache.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/extract_yeti_rig.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/help/submit_maya_remote_publish_deadline.xml (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/help/validate_animation_out_set_related_node_ids.xml (90%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/help/validate_maya_units.xml (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/help/validate_mesh_non_manifold.xml (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/help/validate_node_ids.xml (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/help/validate_rig_out_set_node_ids.xml (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/help/validate_skeletalmesh_hierarchy.xml (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/increment_current_file_deadline.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/reset_xgen_attributes.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/save_scene.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_alembic_options_defaults.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_animation_content.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_animation_out_set_related_node_ids.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_arnold_scene_source.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_arnold_scene_source_cbid.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_ass_relative_paths.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_assembly_name.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_assembly_namespaces.py (92%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_assembly_transforms.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_attributes.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_camera_attributes.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_camera_contents.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_color_sets.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_current_renderlayer_renderable.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_cycle_error.py (86%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_frame_range.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_glsl_material.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_glsl_plugin.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_instance_has_members.py (91%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_instance_in_context.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_instance_subset.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_loaded_plugin.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_look_contents.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_look_default_shaders_connections.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_look_id_reference_edits.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_look_no_default_shaders.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_look_sets.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_look_shading_group.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_look_single_shader.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_maya_units.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_arnold_attributes.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_empty.py (92%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_has_uv.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_lamina_faces.py (93%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_ngons.py (92%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_no_negative_scale.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_non_manifold.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_non_zero_edge.py (93%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_normals_unlocked.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_overlapping_uvs.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_shader_connections.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_single_uv_set.py (93%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_uv_set_map1.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mesh_vertices_have_edges.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_model_content.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_mvlook_contents.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_no_animation.py (93%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_no_default_camera.py (93%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_no_namespace.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_no_null_transforms.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_no_unknown_nodes.py (93%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_no_vraymesh.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_node_ids.py (89%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_node_ids_deformed_shapes.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_node_ids_in_database.py (93%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_node_ids_related.py (91%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_node_ids_unique.py (91%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_node_no_ghosting.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_plugin_path_attributes.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_render_image_rule.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_render_no_default_cameras.py (92%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_render_single_camera.py (92%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_renderlayer_aovs.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_rendersettings.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_resolution.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_resources.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_review.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_rig_contents.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_rig_controllers.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_rig_controllers_arnold_attributes.py (95%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_rig_joints_hidden.py (90%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_rig_out_set_node_ids.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_rig_output_ids.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_scene_set_workspace.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_setdress_root.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_shader_name.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_shape_default_names.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_shape_render_stats.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_shape_zero.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_single_assembly.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_skeletalmesh_hierarchy.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_skeletalmesh_triangulated.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_skeleton_top_group_hierarchy.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_skinCluster_deformer_set.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_step_size.py (92%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_transform_naming_suffix.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_transform_zero.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_unique_names.py (91%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_unreal_mesh_triangulated.py (91%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_unreal_staticmesh_naming.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_unreal_up_axis.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_visible_only.py (91%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_vray.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_vray_distributed_rendering.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_vray_referenced_aovs.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_vray_translator_settings.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_vrayproxy.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_vrayproxy_members.py (91%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_xgen.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_yeti_renderscript_callbacks.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_yeti_rig_cache_state.py (94%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_yeti_rig_input_in_instance.py (93%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/publish/validate_yeti_rig_settings.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/workfile_build/load_placeholder.py (97%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/plugins/workfile_build/script_placeholder.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/startup/userSetup.py (96%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/__init__.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/mayalookassigner/LICENSE (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/mayalookassigner/__init__.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/mayalookassigner/alembic.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/mayalookassigner/app.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/mayalookassigner/arnold_standin.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/mayalookassigner/commands.py (99%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/mayalookassigner/lib.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/mayalookassigner/models.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/mayalookassigner/usd.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/mayalookassigner/views.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/mayalookassigner/vray_proxies.py (98%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/tools/mayalookassigner/widgets.py (100%) rename {client/ayon_core/hosts/maya => server_addon/maya/client/ayon_maya}/vendor/python/capture.py (100%) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index d49358b0d2..2c6082256a 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -53,8 +53,10 @@ MOVED_ADDON_MILESTONE_VERSIONS = { "applications": VersionInfo(0, 2, 0), "clockify": VersionInfo(0, 2, 0), "tvpaint": VersionInfo(0, 2, 0), + "maya": VersionInfo(0, 2, 0), } + # Inherit from `object` for Python 2 hosts class _ModuleClass(object): """Fake module class for storing AYON addons. @@ -1323,7 +1325,7 @@ class TrayAddonsManager(AddonsManager): self.doubleclick_callback = None def add_doubleclick_callback(self, addon, callback): - """Register doubleclick callbacks on tray icon. + """Register double-click callbacks on tray icon. Currently, there is no way how to determine which is launched. Name of callback can be defined with `doubleclick_callback` attribute. diff --git a/client/ayon_core/modules/deadline/plugins/publish/submit_maya_deadline.py b/client/ayon_core/modules/deadline/plugins/publish/submit_maya_deadline.py index f1bc1cb2be..b1193fb914 100644 --- a/client/ayon_core/modules/deadline/plugins/publish/submit_maya_deadline.py +++ b/client/ayon_core/modules/deadline/plugins/publish/submit_maya_deadline.py @@ -39,8 +39,8 @@ from ayon_core.lib import ( EnumDef, is_in_tests, ) -from ayon_core.hosts.maya.api.lib_rendersettings import RenderSettings -from ayon_core.hosts.maya.api.lib import get_attr_in_layer +from ayon_maya.api.lib_rendersettings import RenderSettings +from ayon_maya.api.lib import get_attr_in_layer from openpype_modules.deadline import abstract_submit_deadline from openpype_modules.deadline.abstract_submit_deadline import DeadlineJobInfo diff --git a/pyproject.toml b/pyproject.toml index 4726bef41a..63d7434c06 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -108,6 +108,10 @@ line-ending = "auto" # Ignore words that are not in the dictionary. ignore-words-list = "ayon,ynput,parms,parm,hda,developpement,ue" +# Ignore lines that contain this regex. This is hack for missing inline ignore. +# Remove with next codespell release (>2.2.6) +ignore-regex = ".*codespell:ignore.*" + skip = "./.*,./package/*,*/vendor/*,*/unreal/integration/*,*/aftereffects/api/extension/js/libs/*" count = true quiet-level = 3 diff --git a/client/ayon_core/hosts/maya/__init__.py b/server_addon/maya/client/ayon_maya/__init__.py similarity index 100% rename from client/ayon_core/hosts/maya/__init__.py rename to server_addon/maya/client/ayon_maya/__init__.py diff --git a/client/ayon_core/hosts/maya/addon.py b/server_addon/maya/client/ayon_maya/addon.py similarity index 100% rename from client/ayon_core/hosts/maya/addon.py rename to server_addon/maya/client/ayon_maya/addon.py diff --git a/client/ayon_core/hosts/maya/api/__init__.py b/server_addon/maya/client/ayon_maya/api/__init__.py similarity index 100% rename from client/ayon_core/hosts/maya/api/__init__.py rename to server_addon/maya/client/ayon_maya/api/__init__.py diff --git a/client/ayon_core/hosts/maya/api/action.py b/server_addon/maya/client/ayon_maya/api/action.py similarity index 100% rename from client/ayon_core/hosts/maya/api/action.py rename to server_addon/maya/client/ayon_maya/api/action.py diff --git a/client/ayon_core/hosts/maya/api/alembic.py b/server_addon/maya/client/ayon_maya/api/alembic.py similarity index 99% rename from client/ayon_core/hosts/maya/api/alembic.py rename to server_addon/maya/client/ayon_maya/api/alembic.py index 6bd00e1cb1..007e3ce4f3 100644 --- a/client/ayon_core/hosts/maya/api/alembic.py +++ b/server_addon/maya/client/ayon_maya/api/alembic.py @@ -4,7 +4,7 @@ import os from maya import cmds # noqa -from ayon_core.hosts.maya.api.lib import evaluation +from ayon_maya.api.lib import evaluation log = logging.getLogger(__name__) diff --git a/client/ayon_core/hosts/maya/api/commands.py b/server_addon/maya/client/ayon_maya/api/commands.py similarity index 100% rename from client/ayon_core/hosts/maya/api/commands.py rename to server_addon/maya/client/ayon_maya/api/commands.py diff --git a/client/ayon_core/hosts/maya/api/customize.py b/server_addon/maya/client/ayon_maya/api/customize.py similarity index 100% rename from client/ayon_core/hosts/maya/api/customize.py rename to server_addon/maya/client/ayon_maya/api/customize.py diff --git a/client/ayon_core/hosts/maya/api/exitstack.py b/server_addon/maya/client/ayon_maya/api/exitstack.py similarity index 98% rename from client/ayon_core/hosts/maya/api/exitstack.py rename to server_addon/maya/client/ayon_maya/api/exitstack.py index 5eb7e15784..c35724e889 100644 --- a/client/ayon_core/hosts/maya/api/exitstack.py +++ b/server_addon/maya/client/ayon_maya/api/exitstack.py @@ -6,7 +6,7 @@ compatible implementation to support bothPython 2 and Python 3. Instead of using ExitStack from contextlib, use it from this module: ->>> from ayon_core.hosts.maya.api.exitstack import ExitStack +>>> from ayon_maya.api.exitstack import ExitStack It will provide the appropriate ExitStack implementation for the current running Python version. diff --git a/client/ayon_core/hosts/maya/api/fbx.py b/server_addon/maya/client/ayon_maya/api/fbx.py similarity index 99% rename from client/ayon_core/hosts/maya/api/fbx.py rename to server_addon/maya/client/ayon_maya/api/fbx.py index fd1bf2c901..28a4058551 100644 --- a/client/ayon_core/hosts/maya/api/fbx.py +++ b/server_addon/maya/client/ayon_maya/api/fbx.py @@ -4,7 +4,7 @@ import logging from maya import cmds # noqa import maya.mel as mel # noqa -from ayon_core.hosts.maya.api.lib import maintained_selection +from ayon_maya.api.lib import maintained_selection class FBXExtractor: diff --git a/client/ayon_core/hosts/maya/api/gltf.py b/server_addon/maya/client/ayon_maya/api/gltf.py similarity index 97% rename from client/ayon_core/hosts/maya/api/gltf.py rename to server_addon/maya/client/ayon_maya/api/gltf.py index 2a983f1573..9aa4bf37ef 100644 --- a/client/ayon_core/hosts/maya/api/gltf.py +++ b/server_addon/maya/client/ayon_maya/api/gltf.py @@ -16,7 +16,7 @@ _gltf_options = { "hbu": bool, # hashBufferURI "ext": bool, # externalTextures "ivt": int, # initialValuesTime - "acn": str, # animationClipName + "acn": str, # animationClipName # codespell:ignore acn "ast": int, # animationClipStartTime "aet": int, # animationClipEndTime "afr": float, # animationClipFrameRate diff --git a/client/ayon_core/hosts/maya/api/lib.py b/server_addon/maya/client/ayon_maya/api/lib.py similarity index 100% rename from client/ayon_core/hosts/maya/api/lib.py rename to server_addon/maya/client/ayon_maya/api/lib.py diff --git a/client/ayon_core/hosts/maya/api/lib_renderproducts.py b/server_addon/maya/client/ayon_maya/api/lib_renderproducts.py similarity index 100% rename from client/ayon_core/hosts/maya/api/lib_renderproducts.py rename to server_addon/maya/client/ayon_maya/api/lib_renderproducts.py diff --git a/client/ayon_core/hosts/maya/api/lib_rendersettings.py b/server_addon/maya/client/ayon_maya/api/lib_rendersettings.py similarity index 99% rename from client/ayon_core/hosts/maya/api/lib_rendersettings.py rename to server_addon/maya/client/ayon_maya/api/lib_rendersettings.py index f9e243146a..f7f3f1d746 100644 --- a/client/ayon_core/hosts/maya/api/lib_rendersettings.py +++ b/server_addon/maya/client/ayon_maya/api/lib_rendersettings.py @@ -8,7 +8,7 @@ from ayon_core.settings import get_project_settings from ayon_core.pipeline import CreatorError, get_current_project_name from ayon_core.pipeline.context_tools import get_current_folder_entity -from ayon_core.hosts.maya.api.lib import reset_frame_range +from ayon_maya.api.lib import reset_frame_range class RenderSettings(object): diff --git a/client/ayon_core/hosts/maya/api/lib_rendersetup.py b/server_addon/maya/client/ayon_maya/api/lib_rendersetup.py similarity index 99% rename from client/ayon_core/hosts/maya/api/lib_rendersetup.py rename to server_addon/maya/client/ayon_maya/api/lib_rendersetup.py index 6dca8eb6dd..d93e6af0e2 100644 --- a/client/ayon_core/hosts/maya/api/lib_rendersetup.py +++ b/server_addon/maya/client/ayon_maya/api/lib_rendersetup.py @@ -19,7 +19,7 @@ from maya.app.renderSetup.model.override import ( UniqueOverride ) -from ayon_core.hosts.maya.api.lib import get_attribute +from ayon_maya.api.lib import get_attribute EXACT_MATCH = 0 PARENT_MATCH = 1 diff --git a/client/ayon_core/hosts/maya/api/menu.py b/server_addon/maya/client/ayon_maya/api/menu.py similarity index 99% rename from client/ayon_core/hosts/maya/api/menu.py rename to server_addon/maya/client/ayon_maya/api/menu.py index e3ef50cdc0..153aff07c3 100644 --- a/client/ayon_core/hosts/maya/api/menu.py +++ b/server_addon/maya/client/ayon_maya/api/menu.py @@ -15,7 +15,7 @@ from ayon_core.pipeline import ( ) from ayon_core.pipeline.workfile import BuildWorkfile from ayon_core.tools.utils import host_tools -from ayon_core.hosts.maya.api import lib, lib_rendersettings +from ayon_maya.api import lib, lib_rendersettings from .lib import get_main_window, IS_HEADLESS from ..tools import show_look_assigner diff --git a/client/ayon_core/hosts/maya/api/pipeline.py b/server_addon/maya/client/ayon_maya/api/pipeline.py similarity index 99% rename from client/ayon_core/hosts/maya/api/pipeline.py rename to server_addon/maya/client/ayon_maya/api/pipeline.py index 74d73e5f95..84268cc6f1 100644 --- a/client/ayon_core/hosts/maya/api/pipeline.py +++ b/server_addon/maya/client/ayon_maya/api/pipeline.py @@ -45,8 +45,8 @@ from ayon_core.pipeline.workfile.lock_workfile import ( is_workfile_locked, is_workfile_lock_enabled ) -from ayon_core.hosts.maya import MAYA_ROOT_DIR -from ayon_core.hosts.maya.lib import create_workspace_mel +from ayon_maya import MAYA_ROOT_DIR +from ayon_maya.lib import create_workspace_mel from . import menu, lib from .workio import ( @@ -58,7 +58,7 @@ from .workio import ( current_file ) -log = logging.getLogger("ayon_core.hosts.maya") +log = logging.getLogger("ayon_maya") PLUGINS_DIR = os.path.join(MAYA_ROOT_DIR, "plugins") PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") diff --git a/client/ayon_core/hosts/maya/api/plugin.py b/server_addon/maya/client/ayon_maya/api/plugin.py similarity index 99% rename from client/ayon_core/hosts/maya/api/plugin.py rename to server_addon/maya/client/ayon_maya/api/plugin.py index 6f8b74c906..0eb998cb36 100644 --- a/client/ayon_core/hosts/maya/api/plugin.py +++ b/server_addon/maya/client/ayon_maya/api/plugin.py @@ -809,7 +809,7 @@ class ReferenceLoader(Loader): def update(self, container, context): from maya import cmds - from ayon_core.hosts.maya.api.lib import get_container_members + from ayon_maya.api.lib import get_container_members node = container["objectName"] diff --git a/client/ayon_core/hosts/maya/api/render_setup_tools.py b/server_addon/maya/client/ayon_maya/api/render_setup_tools.py similarity index 100% rename from client/ayon_core/hosts/maya/api/render_setup_tools.py rename to server_addon/maya/client/ayon_maya/api/render_setup_tools.py diff --git a/client/ayon_core/hosts/maya/api/setdress.py b/server_addon/maya/client/ayon_maya/api/setdress.py similarity index 99% rename from client/ayon_core/hosts/maya/api/setdress.py rename to server_addon/maya/client/ayon_maya/api/setdress.py index b1d5beb343..a130b93f4f 100644 --- a/client/ayon_core/hosts/maya/api/setdress.py +++ b/server_addon/maya/client/ayon_maya/api/setdress.py @@ -20,7 +20,7 @@ from ayon_core.pipeline import ( get_representation_path, get_current_project_name, ) -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( matrix_equals, unique_namespace, get_container_transforms, diff --git a/client/ayon_core/hosts/maya/api/workfile_template_builder.py b/server_addon/maya/client/ayon_maya/api/workfile_template_builder.py similarity index 100% rename from client/ayon_core/hosts/maya/api/workfile_template_builder.py rename to server_addon/maya/client/ayon_maya/api/workfile_template_builder.py diff --git a/client/ayon_core/hosts/maya/api/workio.py b/server_addon/maya/client/ayon_maya/api/workio.py similarity index 100% rename from client/ayon_core/hosts/maya/api/workio.py rename to server_addon/maya/client/ayon_maya/api/workio.py diff --git a/client/ayon_core/hosts/maya/api/yeti.py b/server_addon/maya/client/ayon_maya/api/yeti.py similarity index 100% rename from client/ayon_core/hosts/maya/api/yeti.py rename to server_addon/maya/client/ayon_maya/api/yeti.py diff --git a/client/ayon_core/hosts/maya/hooks/pre_auto_load_plugins.py b/server_addon/maya/client/ayon_maya/hooks/pre_auto_load_plugins.py similarity index 100% rename from client/ayon_core/hosts/maya/hooks/pre_auto_load_plugins.py rename to server_addon/maya/client/ayon_maya/hooks/pre_auto_load_plugins.py diff --git a/client/ayon_core/hosts/maya/hooks/pre_copy_mel.py b/server_addon/maya/client/ayon_maya/hooks/pre_copy_mel.py similarity index 92% rename from client/ayon_core/hosts/maya/hooks/pre_copy_mel.py rename to server_addon/maya/client/ayon_maya/hooks/pre_copy_mel.py index 683b4c59c7..c3268b09ee 100644 --- a/client/ayon_core/hosts/maya/hooks/pre_copy_mel.py +++ b/server_addon/maya/client/ayon_maya/hooks/pre_copy_mel.py @@ -1,5 +1,5 @@ from ayon_applications import PreLaunchHook, LaunchTypes -from ayon_core.hosts.maya.lib import create_workspace_mel +from ayon_maya.lib import create_workspace_mel class PreCopyMel(PreLaunchHook): diff --git a/client/ayon_core/hosts/maya/hooks/pre_open_workfile_post_initialization.py b/server_addon/maya/client/ayon_maya/hooks/pre_open_workfile_post_initialization.py similarity index 100% rename from client/ayon_core/hosts/maya/hooks/pre_open_workfile_post_initialization.py rename to server_addon/maya/client/ayon_maya/hooks/pre_open_workfile_post_initialization.py diff --git a/client/ayon_core/hosts/maya/lib.py b/server_addon/maya/client/ayon_maya/lib.py similarity index 100% rename from client/ayon_core/hosts/maya/lib.py rename to server_addon/maya/client/ayon_maya/lib.py diff --git a/client/ayon_core/hosts/maya/plugins/__init__.py b/server_addon/maya/client/ayon_maya/plugins/__init__.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/__init__.py rename to server_addon/maya/client/ayon_maya/plugins/__init__.py diff --git a/client/ayon_core/hosts/maya/plugins/create/convert_legacy.py b/server_addon/maya/client/ayon_maya/plugins/create/convert_legacy.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/create/convert_legacy.py rename to server_addon/maya/client/ayon_maya/plugins/create/convert_legacy.py index 81cf9613b4..8616413bdd 100644 --- a/client/ayon_core/hosts/maya/plugins/create/convert_legacy.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/convert_legacy.py @@ -1,8 +1,8 @@ import ayon_api from ayon_core.pipeline.create.creator_plugins import ProductConvertorPlugin -from ayon_core.hosts.maya.api import plugin -from ayon_core.hosts.maya.api.lib import read +from ayon_maya.api import plugin +from ayon_maya.api.lib import read from maya import cmds from maya.app.renderSetup.model import renderSetup @@ -12,7 +12,7 @@ class MayaLegacyConvertor(ProductConvertorPlugin, plugin.MayaCreatorBase): """Find and convert any legacy products in the scene. - This Convertor will find all legacy products in the scene and will + This Converter will find all legacy products in the scene and will transform them to the current system. Since the old products doesn't retain any information about their original creators, the only mapping we can do is based on their families. diff --git a/client/ayon_core/hosts/maya/plugins/create/create_animation_pointcache.py b/server_addon/maya/client/ayon_maya/plugins/create/create_animation_pointcache.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/create/create_animation_pointcache.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_animation_pointcache.py index 069762e4ae..ea4cdb57fe 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_animation_pointcache.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_animation_pointcache.py @@ -1,6 +1,6 @@ from maya import cmds -from ayon_core.hosts.maya.api import lib, plugin +from ayon_maya.api import lib, plugin from ayon_core.lib import ( BoolDef, diff --git a/client/ayon_core/hosts/maya/plugins/create/create_arnold_scene_source.py b/server_addon/maya/client/ayon_maya/plugins/create/create_arnold_scene_source.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/create/create_arnold_scene_source.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_arnold_scene_source.py index e321c13ca0..8ae2759628 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_arnold_scene_source.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_arnold_scene_source.py @@ -1,6 +1,6 @@ from maya import cmds -from ayon_core.hosts.maya.api import ( +from ayon_maya.api import ( lib, plugin ) diff --git a/client/ayon_core/hosts/maya/plugins/create/create_assembly.py b/server_addon/maya/client/ayon_maya/plugins/create/create_assembly.py similarity index 83% rename from client/ayon_core/hosts/maya/plugins/create/create_assembly.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_assembly.py index 92df125748..dff04f059e 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_assembly.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_assembly.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import plugin +from ayon_maya.api import plugin class CreateAssembly(plugin.MayaCreator): diff --git a/client/ayon_core/hosts/maya/plugins/create/create_camera.py b/server_addon/maya/client/ayon_maya/plugins/create/create_camera.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/create/create_camera.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_camera.py index 4b1265bd3b..393176f5dd 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_camera.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_camera.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import ( +from ayon_maya.api import ( lib, plugin ) diff --git a/client/ayon_core/hosts/maya/plugins/create/create_layout.py b/server_addon/maya/client/ayon_maya/plugins/create/create_layout.py similarity index 92% rename from client/ayon_core/hosts/maya/plugins/create/create_layout.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_layout.py index 6cbc697502..1d9bc2c1c8 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_layout.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_layout.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import plugin +from ayon_maya.api import plugin from ayon_core.lib import BoolDef diff --git a/client/ayon_core/hosts/maya/plugins/create/create_look.py b/server_addon/maya/client/ayon_maya/plugins/create/create_look.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/create/create_look.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_look.py index ac3625c38f..1f90d18607 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_look.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import ( +from ayon_maya.api import ( plugin, lib ) diff --git a/client/ayon_core/hosts/maya/plugins/create/create_matchmove.py b/server_addon/maya/client/ayon_maya/plugins/create/create_matchmove.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/create/create_matchmove.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_matchmove.py index 44443a8b9f..9cb2a3dd47 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_matchmove.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_matchmove.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import ( +from ayon_maya.api import ( lib, plugin ) diff --git a/client/ayon_core/hosts/maya/plugins/create/create_maya_usd.py b/server_addon/maya/client/ayon_maya/plugins/create/create_maya_usd.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/create/create_maya_usd.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_maya_usd.py index 3f34a541b4..19b55384f3 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_maya_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_maya_usd.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import plugin, lib +from ayon_maya.api import plugin, lib from ayon_core.lib import ( BoolDef, EnumDef, diff --git a/client/ayon_core/hosts/maya/plugins/create/create_mayascene.py b/server_addon/maya/client/ayon_maya/plugins/create/create_mayascene.py similarity index 84% rename from client/ayon_core/hosts/maya/plugins/create/create_mayascene.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_mayascene.py index cfe46336a2..9913efc016 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_mayascene.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_mayascene.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import plugin +from ayon_maya.api import plugin class CreateMayaScene(plugin.MayaCreator): diff --git a/client/ayon_core/hosts/maya/plugins/create/create_model.py b/server_addon/maya/client/ayon_maya/plugins/create/create_model.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/create/create_model.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_model.py index b47df421f3..87696c58d2 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_model.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_model.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import plugin +from ayon_maya.api import plugin from ayon_core.lib import ( BoolDef, TextDef diff --git a/client/ayon_core/hosts/maya/plugins/create/create_multishot_layout.py b/server_addon/maya/client/ayon_maya/plugins/create/create_multishot_layout.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/create/create_multishot_layout.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_multishot_layout.py index 7216236719..5229823110 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_multishot_layout.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_multishot_layout.py @@ -8,7 +8,7 @@ from ayon_api import ( ) from maya import cmds # noqa: F401 -from ayon_core.hosts.maya.api import plugin +from ayon_maya.api import plugin from ayon_core.lib import BoolDef, EnumDef, TextDef from ayon_core.pipeline import ( Creator, diff --git a/client/ayon_core/hosts/maya/plugins/create/create_multiverse_look.py b/server_addon/maya/client/ayon_maya/plugins/create/create_multiverse_look.py similarity index 93% rename from client/ayon_core/hosts/maya/plugins/create/create_multiverse_look.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_multiverse_look.py index de604a33b3..f2dcb77187 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_multiverse_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_multiverse_look.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import plugin +from ayon_maya.api import plugin from ayon_core.lib import ( BoolDef, EnumDef diff --git a/client/ayon_core/hosts/maya/plugins/create/create_multiverse_usd.py b/server_addon/maya/client/ayon_maya/plugins/create/create_multiverse_usd.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/create/create_multiverse_usd.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_multiverse_usd.py index 668700995f..bdcea4cd2c 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_multiverse_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_multiverse_usd.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import plugin, lib +from ayon_maya.api import plugin, lib from ayon_core.lib import ( BoolDef, NumberDef, diff --git a/client/ayon_core/hosts/maya/plugins/create/create_multiverse_usd_comp.py b/server_addon/maya/client/ayon_maya/plugins/create/create_multiverse_usd_comp.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/create/create_multiverse_usd_comp.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_multiverse_usd_comp.py index 120e6ad920..2459704d14 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_multiverse_usd_comp.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_multiverse_usd_comp.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import plugin, lib +from ayon_maya.api import plugin, lib from ayon_core.lib import ( BoolDef, NumberDef, diff --git a/client/ayon_core/hosts/maya/plugins/create/create_multiverse_usd_over.py b/server_addon/maya/client/ayon_maya/plugins/create/create_multiverse_usd_over.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/create/create_multiverse_usd_over.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_multiverse_usd_over.py index 26208794e3..b070daf550 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_multiverse_usd_over.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_multiverse_usd_over.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import plugin, lib +from ayon_maya.api import plugin, lib from ayon_core.lib import ( BoolDef, NumberDef, diff --git a/client/ayon_core/hosts/maya/plugins/create/create_proxy_abc.py b/server_addon/maya/client/ayon_maya/plugins/create/create_proxy_abc.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/create/create_proxy_abc.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_proxy_abc.py index ecc031436c..431f113941 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_proxy_abc.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_proxy_abc.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import ( +from ayon_maya.api import ( lib, plugin ) diff --git a/client/ayon_core/hosts/maya/plugins/create/create_redshift_proxy.py b/server_addon/maya/client/ayon_maya/plugins/create/create_redshift_proxy.py similarity index 92% rename from client/ayon_core/hosts/maya/plugins/create/create_redshift_proxy.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_redshift_proxy.py index d99fe5a787..c4cc874a2a 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_redshift_proxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_redshift_proxy.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Creator of Redshift proxy product types.""" -from ayon_core.hosts.maya.api import plugin, lib +from ayon_maya.api import plugin, lib from ayon_core.lib import BoolDef diff --git a/client/ayon_core/hosts/maya/plugins/create/create_render.py b/server_addon/maya/client/ayon_maya/plugins/create/create_render.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/create/create_render.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_render.py index e5a8d4dbd8..5defee7d07 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_render.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_render.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Create ``Render`` instance in Maya.""" -from ayon_core.hosts.maya.api import ( +from ayon_maya.api import ( lib_rendersettings, plugin ) diff --git a/client/ayon_core/hosts/maya/plugins/create/create_rendersetup.py b/server_addon/maya/client/ayon_maya/plugins/create/create_rendersetup.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/create/create_rendersetup.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_rendersetup.py index 3d8d6a7309..415ab4ff8c 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_rendersetup.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_rendersetup.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import plugin +from ayon_maya.api import plugin from ayon_core.pipeline import CreatorError diff --git a/client/ayon_core/hosts/maya/plugins/create/create_review.py b/server_addon/maya/client/ayon_maya/plugins/create/create_review.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/create/create_review.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_review.py index 8a2f2df745..26fad91ed9 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_review.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_review.py @@ -3,7 +3,7 @@ import json from maya import cmds import ayon_api -from ayon_core.hosts.maya.api import ( +from ayon_maya.api import ( lib, plugin ) diff --git a/client/ayon_core/hosts/maya/plugins/create/create_rig.py b/server_addon/maya/client/ayon_maya/plugins/create/create_rig.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/create/create_rig.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_rig.py index 54be50c169..135e51bcbf 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_rig.py @@ -1,6 +1,6 @@ from maya import cmds -from ayon_core.hosts.maya.api import plugin +from ayon_maya.api import plugin class CreateRig(plugin.MayaCreator): diff --git a/client/ayon_core/hosts/maya/plugins/create/create_setdress.py b/server_addon/maya/client/ayon_maya/plugins/create/create_setdress.py similarity index 91% rename from client/ayon_core/hosts/maya/plugins/create/create_setdress.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_setdress.py index 0f72d4d184..12532e0724 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_setdress.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_setdress.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import plugin +from ayon_maya.api import plugin from ayon_core.lib import BoolDef diff --git a/client/ayon_core/hosts/maya/plugins/create/create_unreal_skeletalmesh.py b/server_addon/maya/client/ayon_maya/plugins/create/create_unreal_skeletalmesh.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/create/create_unreal_skeletalmesh.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_unreal_skeletalmesh.py index a32e94971e..a182fe7a24 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_unreal_skeletalmesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_unreal_skeletalmesh.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator for Unreal Skeletal Meshes.""" -from ayon_core.hosts.maya.api import plugin, lib +from ayon_maya.api import plugin, lib from ayon_core.lib import ( BoolDef, TextDef diff --git a/client/ayon_core/hosts/maya/plugins/create/create_unreal_staticmesh.py b/server_addon/maya/client/ayon_maya/plugins/create/create_unreal_staticmesh.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/create/create_unreal_staticmesh.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_unreal_staticmesh.py index 76c33f00cc..e5436bca64 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_unreal_staticmesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_unreal_staticmesh.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- """Creator for Unreal Static Meshes.""" -from ayon_core.hosts.maya.api import plugin, lib +from ayon_maya.api import plugin, lib from maya import cmds # noqa diff --git a/client/ayon_core/hosts/maya/plugins/create/create_unreal_yeticache.py b/server_addon/maya/client/ayon_maya/plugins/create/create_unreal_yeticache.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/create/create_unreal_yeticache.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_unreal_yeticache.py index dea64b40fb..eea866d406 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_unreal_yeticache.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_unreal_yeticache.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import ( +from ayon_maya.api import ( lib, plugin ) diff --git a/client/ayon_core/hosts/maya/plugins/create/create_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/create/create_vrayproxy.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/create/create_vrayproxy.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_vrayproxy.py index d565ec37e0..742e14ace0 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_vrayproxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_vrayproxy.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import ( +from ayon_maya.api import ( plugin, lib ) diff --git a/client/ayon_core/hosts/maya/plugins/create/create_vrayscene.py b/server_addon/maya/client/ayon_maya/plugins/create/create_vrayscene.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/create/create_vrayscene.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_vrayscene.py index cf5e7b5364..11c356fdef 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_vrayscene.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_vrayscene.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """Create instance of vrayscene.""" -from ayon_core.hosts.maya.api import ( +from ayon_maya.api import ( lib_rendersettings, plugin ) diff --git a/client/ayon_core/hosts/maya/plugins/create/create_workfile.py b/server_addon/maya/client/ayon_maya/plugins/create/create_workfile.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/create/create_workfile.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_workfile.py index f636ed7b74..e0c94611b0 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_workfile.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_workfile.py @@ -3,7 +3,7 @@ import ayon_api from ayon_core.pipeline import CreatedInstance, AutoCreator -from ayon_core.hosts.maya.api import plugin +from ayon_maya.api import plugin from maya import cmds diff --git a/client/ayon_core/hosts/maya/plugins/create/create_xgen.py b/server_addon/maya/client/ayon_maya/plugins/create/create_xgen.py similarity index 79% rename from client/ayon_core/hosts/maya/plugins/create/create_xgen.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_xgen.py index fec2f07456..d13d032a13 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_xgen.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import plugin +from ayon_maya.api import plugin class CreateXgen(plugin.MayaCreator): diff --git a/client/ayon_core/hosts/maya/plugins/create/create_yeti_cache.py b/server_addon/maya/client/ayon_maya/plugins/create/create_yeti_cache.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/create/create_yeti_cache.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_yeti_cache.py index bf20acaca8..8a834f18c0 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_yeti_cache.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_yeti_cache.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.maya.api import ( +from ayon_maya.api import ( lib, plugin ) diff --git a/client/ayon_core/hosts/maya/plugins/create/create_yeti_rig.py b/server_addon/maya/client/ayon_maya/plugins/create/create_yeti_rig.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/create/create_yeti_rig.py rename to server_addon/maya/client/ayon_maya/plugins/create/create_yeti_rig.py index dfe224ceb1..c5378dc1b8 100644 --- a/client/ayon_core/hosts/maya/plugins/create/create_yeti_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/create/create_yeti_rig.py @@ -1,6 +1,6 @@ from maya import cmds -from ayon_core.hosts.maya.api import ( +from ayon_maya.api import ( lib, plugin ) diff --git a/client/ayon_core/hosts/maya/plugins/inventory/connect_geometry.py b/server_addon/maya/client/ayon_maya/plugins/inventory/connect_geometry.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/inventory/connect_geometry.py rename to server_addon/maya/client/ayon_maya/plugins/inventory/connect_geometry.py index 5410546a2e..ccb88313e9 100644 --- a/client/ayon_core/hosts/maya/plugins/inventory/connect_geometry.py +++ b/server_addon/maya/client/ayon_maya/plugins/inventory/connect_geometry.py @@ -1,7 +1,7 @@ from maya import cmds from ayon_core.pipeline import InventoryAction, get_repres_contexts -from ayon_core.hosts.maya.api.lib import get_id +from ayon_maya.api.lib import get_id class ConnectGeometry(InventoryAction): diff --git a/client/ayon_core/hosts/maya/plugins/inventory/connect_xgen.py b/server_addon/maya/client/ayon_maya/plugins/inventory/connect_xgen.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/inventory/connect_xgen.py rename to server_addon/maya/client/ayon_maya/plugins/inventory/connect_xgen.py diff --git a/client/ayon_core/hosts/maya/plugins/inventory/connect_yeti_rig.py b/server_addon/maya/client/ayon_maya/plugins/inventory/connect_yeti_rig.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/inventory/connect_yeti_rig.py rename to server_addon/maya/client/ayon_maya/plugins/inventory/connect_yeti_rig.py index 8f13cc6ae5..2385444403 100644 --- a/client/ayon_core/hosts/maya/plugins/inventory/connect_yeti_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/inventory/connect_yeti_rig.py @@ -9,7 +9,7 @@ from ayon_core.pipeline import ( get_repres_contexts, get_representation_path, ) -from ayon_core.hosts.maya.api.lib import get_container_members, get_id +from ayon_maya.api.lib import get_container_members, get_id class ConnectYetiRig(InventoryAction): diff --git a/client/ayon_core/hosts/maya/plugins/inventory/import_modelrender.py b/server_addon/maya/client/ayon_maya/plugins/inventory/import_modelrender.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/inventory/import_modelrender.py rename to server_addon/maya/client/ayon_maya/plugins/inventory/import_modelrender.py index 4655017ae5..5e36ec6bc1 100644 --- a/client/ayon_core/hosts/maya/plugins/inventory/import_modelrender.py +++ b/server_addon/maya/client/ayon_maya/plugins/inventory/import_modelrender.py @@ -8,7 +8,7 @@ from ayon_core.pipeline import ( InventoryAction, get_current_project_name, ) -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( maintained_selection, apply_shaders ) diff --git a/client/ayon_core/hosts/maya/plugins/inventory/import_reference.py b/server_addon/maya/client/ayon_maya/plugins/inventory/import_reference.py similarity index 92% rename from client/ayon_core/hosts/maya/plugins/inventory/import_reference.py rename to server_addon/maya/client/ayon_maya/plugins/inventory/import_reference.py index 771cb96a57..5e42facad4 100644 --- a/client/ayon_core/hosts/maya/plugins/inventory/import_reference.py +++ b/server_addon/maya/client/ayon_maya/plugins/inventory/import_reference.py @@ -1,7 +1,7 @@ from maya import cmds from ayon_core.pipeline import InventoryAction -from ayon_core.hosts.maya.api.lib import get_reference_node +from ayon_maya.api.lib import get_reference_node class ImportReference(InventoryAction): diff --git a/client/ayon_core/hosts/maya/plugins/inventory/rig_recreate_animation_instance.py b/server_addon/maya/client/ayon_maya/plugins/inventory/rig_recreate_animation_instance.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/inventory/rig_recreate_animation_instance.py rename to server_addon/maya/client/ayon_maya/plugins/inventory/rig_recreate_animation_instance.py index cbff293cd7..796a651f8a 100644 --- a/client/ayon_core/hosts/maya/plugins/inventory/rig_recreate_animation_instance.py +++ b/server_addon/maya/client/ayon_maya/plugins/inventory/rig_recreate_animation_instance.py @@ -3,7 +3,7 @@ from ayon_core.pipeline import ( get_current_project_name, ) from ayon_core.pipeline.load import get_representation_contexts_by_ids -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( create_rig_animation_instance, get_container_members, ) diff --git a/client/ayon_core/hosts/maya/plugins/inventory/select_containers.py b/server_addon/maya/client/ayon_maya/plugins/inventory/select_containers.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/inventory/select_containers.py rename to server_addon/maya/client/ayon_maya/plugins/inventory/select_containers.py index f0bb2fc376..e45c8a5706 100644 --- a/client/ayon_core/hosts/maya/plugins/inventory/select_containers.py +++ b/server_addon/maya/client/ayon_maya/plugins/inventory/select_containers.py @@ -1,7 +1,7 @@ from maya import cmds from ayon_core.pipeline import InventoryAction, registered_host -from ayon_core.hosts.maya.api.lib import get_container_members +from ayon_maya.api.lib import get_container_members class SelectInScene(InventoryAction): diff --git a/client/ayon_core/hosts/maya/plugins/load/_load_animation.py b/server_addon/maya/client/ayon_maya/plugins/load/_load_animation.py similarity index 91% rename from client/ayon_core/hosts/maya/plugins/load/_load_animation.py rename to server_addon/maya/client/ayon_maya/plugins/load/_load_animation.py index 393f6b0115..6d4ebe250c 100644 --- a/client/ayon_core/hosts/maya/plugins/load/_load_animation.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/_load_animation.py @@ -1,4 +1,4 @@ -import ayon_core.hosts.maya.api.plugin +import ayon_maya.api.plugin import maya.cmds as cmds @@ -14,7 +14,7 @@ def _process_reference(file_url, name, namespace, options): Returns: list: list of object nodes """ - from ayon_core.hosts.maya.api.lib import unique_namespace + from ayon_maya.api.lib import unique_namespace # Get name from asset being loaded # Assuming name is product name from the animation, we split the number # suffix from the name to ensure the namespace is unique @@ -43,7 +43,7 @@ def _process_reference(file_url, name, namespace, options): return nodes -class AbcLoader(ayon_core.hosts.maya.api.plugin.ReferenceLoader): +class AbcLoader(ayon_maya.api.plugin.ReferenceLoader): """Loader to reference an Alembic file""" product_types = { @@ -74,7 +74,7 @@ class AbcLoader(ayon_core.hosts.maya.api.plugin.ReferenceLoader): return nodes -class FbxLoader(ayon_core.hosts.maya.api.plugin.ReferenceLoader): +class FbxLoader(ayon_maya.api.plugin.ReferenceLoader): """Loader to reference an Fbx files""" product_types = { diff --git a/client/ayon_core/hosts/maya/plugins/load/actions.py b/server_addon/maya/client/ayon_maya/plugins/load/actions.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/load/actions.py rename to server_addon/maya/client/ayon_maya/plugins/load/actions.py index 8bef219812..d28645ea43 100644 --- a/client/ayon_core/hosts/maya/plugins/load/actions.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/actions.py @@ -3,11 +3,11 @@ """ import qargparse from ayon_core.pipeline import load -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( maintained_selection, get_custom_namespace ) -import ayon_core.hosts.maya.api.plugin +import ayon_maya.api.plugin class SetFrameRangeLoader(load.LoaderPlugin): @@ -85,7 +85,7 @@ class SetFrameRangeWithHandlesLoader(load.LoaderPlugin): animationEndTime=end) -class ImportMayaLoader(ayon_core.hosts.maya.api.plugin.Loader): +class ImportMayaLoader(ayon_maya.api.plugin.Loader): """Import action for Maya (unmanaged) Warning: diff --git a/client/ayon_core/hosts/maya/plugins/load/load_arnold_standin.py b/server_addon/maya/client/ayon_maya/plugins/load/load_arnold_standin.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/load/load_arnold_standin.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_arnold_standin.py index ae3b68965a..db81199ed6 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_arnold_standin.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_arnold_standin.py @@ -8,14 +8,14 @@ from ayon_core.pipeline import ( load, get_representation_path ) -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( unique_namespace, get_attribute_input, maintained_selection, get_fps_for_current_context ) -from ayon_core.hosts.maya.api.pipeline import containerise -from ayon_core.hosts.maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.plugin import get_load_color_for_product_type def is_sequence(files): diff --git a/client/ayon_core/hosts/maya/plugins/load/load_as_template.py b/server_addon/maya/client/ayon_maya/plugins/load/load_as_template.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/load/load_as_template.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_as_template.py index f696d369e3..2a29faa77d 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_as_template.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_as_template.py @@ -5,7 +5,7 @@ from ayon_core.pipeline import ( load, registered_host ) -from ayon_core.hosts.maya.api.workfile_template_builder import ( +from ayon_maya.api.workfile_template_builder import ( MayaTemplateBuilder ) diff --git a/client/ayon_core/hosts/maya/plugins/load/load_assembly.py b/server_addon/maya/client/ayon_maya/plugins/load/load_assembly.py similarity index 93% rename from client/ayon_core/hosts/maya/plugins/load/load_assembly.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_assembly.py index 0fcbc6bd07..b37bf14101 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_assembly.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_assembly.py @@ -5,9 +5,9 @@ from ayon_core.pipeline import ( remove_container ) -from ayon_core.hosts.maya.api.pipeline import containerise -from ayon_core.hosts.maya.api.lib import unique_namespace -from ayon_core.hosts.maya.api import setdress +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.lib import unique_namespace +from ayon_maya.api import setdress class AssemblyLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/maya/plugins/load/load_audio.py b/server_addon/maya/client/ayon_maya/plugins/load/load_audio.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/load/load_audio.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_audio.py index 228189f1a1..81e49c616e 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_audio.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_audio.py @@ -4,8 +4,8 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.maya.api.pipeline import containerise -from ayon_core.hosts.maya.api.lib import unique_namespace, get_container_members +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.lib import unique_namespace, get_container_members class AudioLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/maya/plugins/load/load_gpucache.py b/server_addon/maya/client/ayon_maya/plugins/load/load_gpucache.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/load/load_gpucache.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_gpucache.py index 9832d2d657..fb6db94cee 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_gpucache.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_gpucache.py @@ -1,13 +1,13 @@ import maya.cmds as cmds -from ayon_core.hosts.maya.api.pipeline import containerise -from ayon_core.hosts.maya.api.lib import unique_namespace +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.lib import unique_namespace from ayon_core.pipeline import ( load, get_representation_path ) from ayon_core.settings import get_project_settings -from ayon_core.hosts.maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.plugin import get_load_color_for_product_type class GpuCacheLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/maya/plugins/load/load_image.py b/server_addon/maya/client/ayon_maya/plugins/load/load_image.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/load/load_image.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_image.py index 171920f747..28b44ac99c 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_image.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_image.py @@ -13,8 +13,8 @@ from ayon_core.pipeline.colorspace import ( ) from ayon_core.settings import get_project_settings -from ayon_core.hosts.maya.api.pipeline import containerise -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.lib import ( unique_namespace, namespaced ) diff --git a/client/ayon_core/hosts/maya/plugins/load/load_image_plane.py b/server_addon/maya/client/ayon_maya/plugins/load/load_image_plane.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/load/load_image_plane.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_image_plane.py index 15c7654c52..2740f106d6 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_image_plane.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_image_plane.py @@ -4,8 +4,8 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.maya.api.pipeline import containerise -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.lib import ( unique_namespace, namespaced, pairwise, diff --git a/client/ayon_core/hosts/maya/plugins/load/load_look.py b/server_addon/maya/client/ayon_maya/plugins/load/load_look.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/load/load_look.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_look.py index af0e000dd2..f61d0e9c35 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_look.py @@ -7,14 +7,14 @@ from qtpy import QtWidgets from ayon_api import get_representation_by_name from ayon_core.pipeline import get_representation_path -import ayon_core.hosts.maya.api.plugin -from ayon_core.hosts.maya.api import lib -from ayon_core.hosts.maya.api.lib import get_reference_node +import ayon_maya.api.plugin +from ayon_maya.api import lib +from ayon_maya.api.lib import get_reference_node from ayon_core.tools.utils import ScrollMessageBox -class LookLoader(ayon_core.hosts.maya.api.plugin.ReferenceLoader): +class LookLoader(ayon_maya.api.plugin.ReferenceLoader): """Specific loader for lookdev""" product_types = {"look"} diff --git a/client/ayon_core/hosts/maya/plugins/load/load_matchmove.py b/server_addon/maya/client/ayon_maya/plugins/load/load_matchmove.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/load/load_matchmove.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_matchmove.py diff --git a/client/ayon_core/hosts/maya/plugins/load/load_maya_usd.py b/server_addon/maya/client/ayon_maya/plugins/load/load_maya_usd.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/load/load_maya_usd.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_maya_usd.py index 628a25e574..6c2945f4a8 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_maya_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_maya_usd.py @@ -6,11 +6,11 @@ from ayon_core.pipeline import ( get_representation_path, ) from ayon_core.pipeline.load import get_representation_path_from_context -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( namespaced, unique_namespace ) -from ayon_core.hosts.maya.api.pipeline import containerise +from ayon_maya.api.pipeline import containerise class MayaUsdLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/maya/plugins/load/load_multiverse_usd.py b/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/load/load_multiverse_usd.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd.py index f32c76481d..93bb95092e 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_multiverse_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd.py @@ -9,12 +9,12 @@ from ayon_core.pipeline import ( load, get_representation_path ) -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( maintained_selection, namespaced, unique_namespace ) -from ayon_core.hosts.maya.api.pipeline import containerise +from ayon_maya.api.pipeline import containerise class MultiverseUsdLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/maya/plugins/load/load_multiverse_usd_over.py b/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd_over.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/load/load_multiverse_usd_over.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd_over.py index b23fa48f07..e51353887e 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_multiverse_usd_over.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd_over.py @@ -10,10 +10,10 @@ from ayon_core.pipeline import ( load, get_representation_path ) -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( maintained_selection ) -from ayon_core.hosts.maya.api.pipeline import containerise +from ayon_maya.api.pipeline import containerise class MultiverseUsdOverLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/maya/plugins/load/load_redshift_proxy.py b/server_addon/maya/client/ayon_maya/plugins/load/load_redshift_proxy.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/load/load_redshift_proxy.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_redshift_proxy.py index 7760d4081c..fba6314fec 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_redshift_proxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_redshift_proxy.py @@ -10,13 +10,13 @@ from ayon_core.pipeline import ( load, get_representation_path ) -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( namespaced, maintained_selection, unique_namespace ) -from ayon_core.hosts.maya.api.pipeline import containerise -from ayon_core.hosts.maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.plugin import get_load_color_for_product_type class RedshiftProxyLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/maya/plugins/load/load_reference.py b/server_addon/maya/client/ayon_maya/plugins/load/load_reference.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/load/load_reference.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_reference.py index 847591bd11..4aad3ddb22 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_reference.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_reference.py @@ -5,8 +5,8 @@ from maya import cmds import qargparse from ayon_core.settings import get_project_settings -from ayon_core.hosts.maya.api import plugin -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api import plugin +from ayon_maya.api.lib import ( maintained_selection, get_container_members, parent_nodes, diff --git a/client/ayon_core/hosts/maya/plugins/load/load_rendersetup.py b/server_addon/maya/client/ayon_maya/plugins/load/load_rendersetup.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/load/load_rendersetup.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_rendersetup.py index d5685b2c4c..96f38ba1ce 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_rendersetup.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_rendersetup.py @@ -16,8 +16,8 @@ from ayon_core.pipeline import ( load, get_representation_path ) -from ayon_core.hosts.maya.api import lib -from ayon_core.hosts.maya.api.pipeline import containerise +from ayon_maya.api import lib +from ayon_maya.api.pipeline import containerise from maya import cmds import maya.app.renderSetup.model.renderSetup as renderSetup diff --git a/client/ayon_core/hosts/maya/plugins/load/load_vdb_to_arnold.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_arnold.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/load/load_vdb_to_arnold.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_arnold.py index 5b0c78fd6f..d326c224bf 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_vdb_to_arnold.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_arnold.py @@ -5,7 +5,7 @@ from ayon_core.pipeline import ( load, get_representation_path ) -from ayon_core.hosts.maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.plugin import get_load_color_for_product_type # TODO aiVolume doesn't automatically set velocity fps correctly, set manual? @@ -22,8 +22,8 @@ class LoadVDBtoArnold(load.LoaderPlugin): def load(self, context, name, namespace, data): from maya import cmds - from ayon_core.hosts.maya.api.pipeline import containerise - from ayon_core.hosts.maya.api.lib import unique_namespace + from ayon_maya.api.pipeline import containerise + from ayon_maya.api.lib import unique_namespace product_type = context["product"]["productType"] diff --git a/client/ayon_core/hosts/maya/plugins/load/load_vdb_to_redshift.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_redshift.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/load/load_vdb_to_redshift.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_redshift.py index e345a7bf6f..5ac8dfa05e 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_vdb_to_redshift.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_redshift.py @@ -5,7 +5,7 @@ from ayon_core.pipeline import ( load, get_representation_path ) -from ayon_core.hosts.maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.plugin import get_load_color_for_product_type class LoadVDBtoRedShift(load.LoaderPlugin): @@ -28,8 +28,8 @@ class LoadVDBtoRedShift(load.LoaderPlugin): def load(self, context, name=None, namespace=None, data=None): from maya import cmds - from ayon_core.hosts.maya.api.pipeline import containerise - from ayon_core.hosts.maya.api.lib import unique_namespace + from ayon_maya.api.pipeline import containerise + from ayon_maya.api.lib import unique_namespace product_type = context["product"]["productType"] diff --git a/client/ayon_core/hosts/maya/plugins/load/load_vdb_to_vray.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_vray.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/load/load_vdb_to_vray.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_vray.py index d6d1c948b0..7a3129dfe7 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_vdb_to_vray.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_vray.py @@ -5,7 +5,7 @@ from ayon_core.pipeline import ( load, get_representation_path ) -from ayon_core.hosts.maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.plugin import get_load_color_for_product_type from maya import cmds @@ -86,8 +86,8 @@ class LoadVDBtoVRay(load.LoaderPlugin): def load(self, context, name, namespace, data): - from ayon_core.hosts.maya.api.lib import unique_namespace - from ayon_core.hosts.maya.api.pipeline import containerise + from ayon_maya.api.lib import unique_namespace + from ayon_maya.api.pipeline import containerise path = self.filepath_from_context(context) assert os.path.exists(path), ( @@ -159,7 +159,7 @@ class LoadVDBtoVRay(load.LoaderPlugin): def _set_path(self, grid_node, path, show_preset_popup=True): - from ayon_core.hosts.maya.api.lib import attribute_values + from ayon_maya.api.lib import attribute_values from maya import cmds def _get_filename_from_folder(path): diff --git a/client/ayon_core/hosts/maya/plugins/load/load_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vrayproxy.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/load/load_vrayproxy.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_vrayproxy.py index 14d645021c..014c8fea48 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_vrayproxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vrayproxy.py @@ -15,13 +15,13 @@ from ayon_core.pipeline import ( load, get_representation_path, ) -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( maintained_selection, namespaced, unique_namespace ) -from ayon_core.hosts.maya.api.pipeline import containerise -from ayon_core.hosts.maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.plugin import get_load_color_for_product_type class VRayProxyLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/maya/plugins/load/load_vrayscene.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vrayscene.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/load/load_vrayscene.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_vrayscene.py index ea3215da97..17b0c2cd44 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_vrayscene.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vrayscene.py @@ -5,13 +5,13 @@ from ayon_core.pipeline import ( load, get_representation_path ) -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( maintained_selection, namespaced, unique_namespace ) -from ayon_core.hosts.maya.api.pipeline import containerise -from ayon_core.hosts.maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.plugin import get_load_color_for_product_type class VRaySceneLoader(load.LoaderPlugin): diff --git a/client/ayon_core/hosts/maya/plugins/load/load_xgen.py b/server_addon/maya/client/ayon_maya/plugins/load/load_xgen.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/load/load_xgen.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_xgen.py index e2664439b0..f1f25640bd 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_xgen.py @@ -6,18 +6,18 @@ import xgenm from qtpy import QtWidgets -import ayon_core.hosts.maya.api.plugin -from ayon_core.hosts.maya.api.lib import ( +import ayon_maya.api.plugin +from ayon_maya.api.lib import ( maintained_selection, get_container_members, attribute_values, write_xgen_file ) -from ayon_core.hosts.maya.api import current_file +from ayon_maya.api import current_file from ayon_core.pipeline import get_representation_path -class XgenLoader(ayon_core.hosts.maya.api.plugin.ReferenceLoader): +class XgenLoader(ayon_maya.api.plugin.ReferenceLoader): """Load Xgen as reference""" product_types = {"xgen"} diff --git a/client/ayon_core/hosts/maya/plugins/load/load_yeti_cache.py b/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_cache.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/load/load_yeti_cache.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_yeti_cache.py index 4ca9ae9d03..bb7d2792c5 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_yeti_cache.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_cache.py @@ -11,10 +11,10 @@ from ayon_core.pipeline import ( load, get_representation_path ) -from ayon_core.hosts.maya.api import lib -from ayon_core.hosts.maya.api.yeti import create_yeti_variable -from ayon_core.hosts.maya.api.pipeline import containerise -from ayon_core.hosts.maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api import lib +from ayon_maya.api.yeti import create_yeti_variable +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.plugin import get_load_color_for_product_type # Do not reset these values on update but only apply on first load diff --git a/client/ayon_core/hosts/maya/plugins/load/load_yeti_rig.py b/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_rig.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/load/load_yeti_rig.py rename to server_addon/maya/client/ayon_maya/plugins/load/load_yeti_rig.py index 7444566ee1..41129b0245 100644 --- a/client/ayon_core/hosts/maya/plugins/load/load_yeti_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_rig.py @@ -2,8 +2,8 @@ from typing import List import maya.cmds as cmds -from ayon_core.hosts.maya.api import plugin -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import plugin +from ayon_maya.api import lib from ayon_core.pipeline import registered_host from ayon_core.pipeline.create import CreateContext diff --git a/client/ayon_core/hosts/maya/plugins/publish/__init__.py b/server_addon/maya/client/ayon_maya/plugins/publish/__init__.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/__init__.py rename to server_addon/maya/client/ayon_maya/plugins/publish/__init__.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_animation.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_animation.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_animation.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_animation.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_arnold_scene_source.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_arnold_scene_source.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/collect_arnold_scene_source.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_arnold_scene_source.py index fb71e128eb..cdeadd9036 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_arnold_scene_source.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_arnold_scene_source.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -from ayon_core.hosts.maya.api.lib import get_all_children +from ayon_maya.api.lib import get_all_children class CollectArnoldSceneSource(pyblish.api.InstancePlugin): diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_assembly.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_assembly.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/collect_assembly.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_assembly.py index eebbbd4447..affb22c530 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_assembly.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_assembly.py @@ -2,8 +2,8 @@ from collections import defaultdict import pyblish.api from maya import cmds, mel -from ayon_core.hosts.maya import api -from ayon_core.hosts.maya.api import lib +from ayon_maya import api +from ayon_maya.api import lib # TODO : Publish of assembly: -unique namespace for all assets, VALIDATOR! diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_current_file.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_current_file.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_current_file.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_current_file.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_fbx_animation.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_animation.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_fbx_animation.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_animation.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_fbx_camera.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_camera.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_fbx_camera.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_camera.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_file_dependencies.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_file_dependencies.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_file_dependencies.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_file_dependencies.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_gltf.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_gltf.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_gltf.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_gltf.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_history.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_history.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_history.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_history.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_inputs.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_inputs.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/collect_inputs.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_inputs.py index fa5a694a76..28788ac50d 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_inputs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_inputs.py @@ -5,8 +5,8 @@ import maya.api.OpenMaya as om import pyblish.api from ayon_core.pipeline import registered_host -from ayon_core.hosts.maya.api.lib import get_container_members -from ayon_core.hosts.maya.api.lib_rendersetup import get_shader_in_layer +from ayon_maya.api.lib import get_container_members +from ayon_maya.api.lib_rendersetup import get_shader_in_layer def iter_history(nodes, diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_instances.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_instances.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/publish/collect_instances.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_instances.py index 774c217cfd..758b977c8d 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_instances.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_instances.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -from ayon_core.hosts.maya.api.lib import get_all_children +from ayon_maya.api.lib import get_all_children class CollectNewInstances(pyblish.api.InstancePlugin): @@ -105,8 +105,10 @@ class CollectNewInstances(pyblish.api.InstancePlugin): parents = set() for node in nodes: - splitted = node.split("|") - items = ["|".join(splitted[0:i]) for i in range(2, len(splitted))] + split_parts = node.split("|") + items = [ + "|".join(split_parts[:i]) for i in range(2, len(split_parts)) + ] parents.update(items) return parents diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_look.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_look.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/collect_look.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_look.py index a3a32bc0cb..f4bc26506b 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_look.py @@ -6,7 +6,7 @@ import glob from maya import cmds # noqa import pyblish.api -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib SHAPE_ATTRS = {"castsShadows", "receiveShadows", diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_maya_scene_time.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_scene_time.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_maya_scene_time.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_scene_time.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_maya_units.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_units.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_maya_units.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_units.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_maya_workspace.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_workspace.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_maya_workspace.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_workspace.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_model.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_model.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_model.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_model.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_multiverse_look.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_multiverse_look.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/collect_multiverse_look.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_multiverse_look.py index 83e743c92e..9910936e7d 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_multiverse_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_multiverse_look.py @@ -4,7 +4,7 @@ import re from maya import cmds import pyblish.api -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib SHAPE_ATTRS = ["castsShadows", "receiveShadows", diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_pointcache.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_pointcache.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_pointcache.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_pointcache.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_remove_marked.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_remove_marked.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_remove_marked.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_remove_marked.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_render.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_render.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/collect_render.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_render.py index 21095935a2..cacde15561 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_render.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_render.py @@ -42,11 +42,11 @@ import pyblish.api from ayon_core.pipeline import KnownPublishError from ayon_core.lib import get_formatted_current_time -from ayon_core.hosts.maya.api.lib_renderproducts import ( +from ayon_maya.api.lib_renderproducts import ( get as get_layer_render_products, UnsupportedRendererException ) -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib class CollectMayaRender(pyblish.api.InstancePlugin): diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_render_layer_aovs.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_render_layer_aovs.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/collect_render_layer_aovs.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_render_layer_aovs.py index 1c83918155..d23a4edb4d 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_render_layer_aovs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_render_layer_aovs.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib class CollectRenderLayerAOVS(pyblish.api.InstancePlugin): diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_renderable_camera.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_renderable_camera.py similarity index 92% rename from client/ayon_core/hosts/maya/plugins/publish/collect_renderable_camera.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_renderable_camera.py index 97d857079b..d2d05971e9 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_renderable_camera.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_renderable_camera.py @@ -2,7 +2,7 @@ import pyblish.api from maya import cmds -from ayon_core.hosts.maya.api.lib_rendersetup import get_attr_in_layer +from ayon_maya.api.lib_rendersetup import get_attr_in_layer class CollectRenderableCamera(pyblish.api.InstancePlugin): diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_review.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_review.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/collect_review.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_review.py index 4e35b3bcc2..490e197ce0 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_review.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_review.py @@ -4,7 +4,7 @@ import ayon_api import pyblish.api from ayon_core.pipeline import KnownPublishError -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib class CollectReview(pyblish.api.InstancePlugin): diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_rig_sets.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_rig_sets.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_rig_sets.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_rig_sets.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_skeleton_mesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_skeleton_mesh.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_skeleton_mesh.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_skeleton_mesh.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_unreal_skeletalmesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_skeletalmesh.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_unreal_skeletalmesh.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_skeletalmesh.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_unreal_staticmesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_staticmesh.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_unreal_staticmesh.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_staticmesh.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_user_defined_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_user_defined_attributes.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_user_defined_attributes.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_user_defined_attributes.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayproxy.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_vrayproxy.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayproxy.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_vrayscene.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayscene.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/collect_vrayscene.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayscene.py index 9548cd9387..ea7064292b 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_vrayscene.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayscene.py @@ -4,7 +4,7 @@ import pyblish.api from ayon_core.lib import get_formatted_current_time -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib class CollectVrayScene(pyblish.api.InstancePlugin): diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_workfile.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_workfile.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_workfile.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_workfile.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_workscene_fps.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_workscene_fps.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/collect_workscene_fps.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_workscene_fps.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_xgen.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_xgen.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/collect_xgen.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_xgen.py index f8f506376d..d09f60c827 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_xgen.py @@ -3,7 +3,7 @@ import os from maya import cmds import pyblish.api -from ayon_core.hosts.maya.api.lib import get_attribute_input +from ayon_maya.api.lib import get_attribute_input class CollectXgen(pyblish.api.InstancePlugin): diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_yeti_cache.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_cache.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/collect_yeti_cache.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_cache.py index e1755e4212..fa9670820f 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_yeti_cache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_cache.py @@ -2,8 +2,8 @@ from maya import cmds import pyblish.api -from ayon_core.hosts.maya.api import lib -from ayon_core.hosts.maya.api.yeti import get_yeti_user_variables +from ayon_maya.api import lib +from ayon_maya.api.yeti import get_yeti_user_variables SETTINGS = { diff --git a/client/ayon_core/hosts/maya/plugins/publish/collect_yeti_rig.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_rig.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/collect_yeti_rig.py rename to server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_rig.py index 8964e17f14..95e6afdb01 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/collect_yeti_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_rig.py @@ -5,7 +5,7 @@ from maya import cmds import pyblish.api -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib from ayon_core.pipeline.publish import KnownPublishError diff --git a/client/ayon_core/hosts/maya/plugins/publish/determine_future_version.py b/server_addon/maya/client/ayon_maya/plugins/publish/determine_future_version.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/determine_future_version.py rename to server_addon/maya/client/ayon_maya/plugins/publish/determine_future_version.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_active_view_thumbnail.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_active_view_thumbnail.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/extract_active_view_thumbnail.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_active_view_thumbnail.py index b5054b4846..777bc2000a 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_active_view_thumbnail.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_active_view_thumbnail.py @@ -4,7 +4,7 @@ import maya.api.OpenMayaUI as omui import pyblish.api import tempfile -from ayon_core.hosts.maya.api.lib import IS_HEADLESS +from ayon_maya.api.lib import IS_HEADLESS class ExtractActiveViewThumbnail(pyblish.api.InstancePlugin): diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_arnold_scene_source.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_arnold_scene_source.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_arnold_scene_source.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_arnold_scene_source.py index fb4c41f1de..2829420ae1 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_arnold_scene_source.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_arnold_scene_source.py @@ -6,7 +6,7 @@ from maya import cmds import arnold from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib class ExtractArnoldSceneSource(publish.Extractor): diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_assembly.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_assembly.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/extract_assembly.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_assembly.py index 5f51dc38cb..df390c0798 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_assembly.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_assembly.py @@ -2,7 +2,7 @@ import os import json from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.alembic import extract_alembic +from ayon_maya.api.alembic import extract_alembic from maya import cmds diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_camera_alembic.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_alembic.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_camera_alembic.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_alembic.py index 74abc8de75..e36f964abd 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_camera_alembic.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_alembic.py @@ -4,7 +4,7 @@ import json from maya import cmds from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib class ExtractCameraAlembic(publish.Extractor, diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_camera_mayaScene.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_mayaScene.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_camera_mayaScene.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_mayaScene.py index cb3951ec0c..62ce0a1806 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_camera_mayaScene.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_mayaScene.py @@ -7,7 +7,7 @@ import contextlib from maya import cmds from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib from ayon_core.lib import ( BoolDef ) diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_fbx.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/extract_fbx.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx.py index bb2a6dad07..d6a1de8455 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_fbx.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx.py @@ -6,8 +6,8 @@ import maya.mel as mel # noqa import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.lib import maintained_selection -from ayon_core.hosts.maya.api import fbx +from ayon_maya.api.lib import maintained_selection +from ayon_maya.api import fbx class ExtractFBX(publish.Extractor): diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_fbx_animation.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx_animation.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/extract_fbx_animation.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx_animation.py index 77b5b79b5f..92ba0be953 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_fbx_animation.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx_animation.py @@ -5,8 +5,8 @@ from maya import cmds # noqa import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api import fbx -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api import fbx +from ayon_maya.api.lib import ( namespaced, get_namespace, strip_namespace ) diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_gltf.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_gltf.py similarity index 93% rename from client/ayon_core/hosts/maya/plugins/publish/extract_gltf.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_gltf.py index ff11bf0c1f..1472454af7 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_gltf.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_gltf.py @@ -4,8 +4,8 @@ from maya import cmds, mel import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api import lib -from ayon_core.hosts.maya.api.gltf import extract_gltf +from ayon_maya.api import lib +from ayon_maya.api.gltf import extract_gltf class ExtractGLB(publish.Extractor): @@ -39,7 +39,7 @@ class ExtractGLB(publish.Extractor): "aet": end_frame, "afr": fps, "dsa": 1, - "acn": instance.name, + "acn": instance.name, # codespell:ignore acn "glb": True, "vno": True # visibleNodeOnly } diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_gpu_cache.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_gpu_cache.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/extract_gpu_cache.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_gpu_cache.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_import_reference.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_import_reference.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_import_reference.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_import_reference.py index 3fb84c8d83..e461499d88 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_import_reference.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_import_reference.py @@ -9,7 +9,7 @@ import tempfile from ayon_core.lib import run_subprocess from ayon_core.pipeline import publish from ayon_core.pipeline.publish import OptionalPyblishPluginMixin -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib class ExtractImportReference(publish.Extractor, diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_layout.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_layout.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/extract_layout.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_layout.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_look.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_look.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_look.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_look.py index 2a86b20131..f6b5e7d5a8 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_look.py @@ -25,7 +25,7 @@ from ayon_core.lib import ( ) from ayon_core.pipeline import publish, KnownPublishError -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib # Modes for transfer COPY = 1 diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_maya_scene_raw.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_scene_raw.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/extract_maya_scene_raw.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_scene_raw.py index 2fd4f44449..bc0a9afd97 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_maya_scene_raw.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_scene_raw.py @@ -4,7 +4,7 @@ import os from maya import cmds -from ayon_core.hosts.maya.api.lib import maintained_selection +from ayon_maya.api.lib import maintained_selection from ayon_core.pipeline import ( AYON_CONTAINER_ID, AVALON_CONTAINER_ID, diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_maya_usd.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_usd.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_maya_usd.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_usd.py index cfaea8e479..b6f6529ca5 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_maya_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_usd.py @@ -7,7 +7,7 @@ from maya import cmds import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.lib import maintained_selection +from ayon_maya.api.lib import maintained_selection @contextlib.contextmanager diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_model.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_model.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_model.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_model.py index 543af59e8f..b439d05a1a 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_model.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_model.py @@ -5,7 +5,7 @@ import os from maya import cmds from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib class ExtractModel(publish.Extractor, diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_multiverse_look.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_look.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/extract_multiverse_look.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_look.py index 2dd8821b3a..d69c179712 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_multiverse_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_look.py @@ -3,7 +3,7 @@ import os from maya import cmds from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.lib import maintained_selection +from ayon_maya.api.lib import maintained_selection class ExtractMultiverseLook(publish.Extractor): diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_multiverse_usd.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_multiverse_usd.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd.py index 8c195c25fd..a787093648 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_multiverse_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd.py @@ -6,7 +6,7 @@ from maya import mel import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.lib import maintained_selection +from ayon_maya.api.lib import maintained_selection class ExtractMultiverseUsd(publish.Extractor): diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_multiverse_usd_comp.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_comp.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_multiverse_usd_comp.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_comp.py index d31660d1b4..eac150ec1a 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_multiverse_usd_comp.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_comp.py @@ -3,7 +3,7 @@ import os from maya import cmds from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.lib import maintained_selection +from ayon_maya.api.lib import maintained_selection class ExtractMultiverseUsdComposition(publish.Extractor): diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_multiverse_usd_over.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_over.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/extract_multiverse_usd_over.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_over.py index 00303e604c..d1e806da9f 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_multiverse_usd_over.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_over.py @@ -1,7 +1,7 @@ import os from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.lib import maintained_selection +from ayon_maya.api.lib import maintained_selection from maya import cmds diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_obj.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_obj.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/extract_obj.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_obj.py index 6ce40a8728..16204b6008 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_obj.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_obj.py @@ -4,7 +4,7 @@ import os from maya import cmds import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib class ExtractObj(publish.Extractor): diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_playblast.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_playblast.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/extract_playblast.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_playblast.py index a394d880ff..8a94b24e3a 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_playblast.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_playblast.py @@ -3,7 +3,7 @@ import os import clique from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib from maya import cmds diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_pointcache.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_pointcache.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_pointcache.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_pointcache.py index cc930e49cc..04a895ff41 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_pointcache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_pointcache.py @@ -4,8 +4,8 @@ from collections import OrderedDict from maya import cmds from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.alembic import extract_alembic -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.alembic import extract_alembic +from ayon_maya.api.lib import ( get_all_children, suspended_refresh, maintained_selection, diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_proxy_abc.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_proxy_abc.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/extract_proxy_abc.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_proxy_abc.py index 5aefdfc33a..dd15622f5f 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_proxy_abc.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_proxy_abc.py @@ -3,8 +3,8 @@ import os from maya import cmds from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.alembic import extract_alembic -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.alembic import extract_alembic +from ayon_maya.api.lib import ( suspended_refresh, maintained_selection, iter_visible_nodes_in_range diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_redshift_proxy.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_redshift_proxy.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/extract_redshift_proxy.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_redshift_proxy.py index 66dd805437..9d0f4085a3 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_redshift_proxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_redshift_proxy.py @@ -5,11 +5,11 @@ import os from maya import cmds from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( maintained_selection, renderlayer ) -from ayon_core.hosts.maya.api.render_setup_tools import ( +from ayon_maya.api.render_setup_tools import ( allow_export_from_render_setup_layer ) diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_rendersetup.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_rendersetup.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/extract_rendersetup.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_rendersetup.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_rig.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_rig.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/extract_rig.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_rig.py index 305f4698c6..58e4373d74 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_rig.py @@ -5,7 +5,7 @@ import os from maya import cmds from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.lib import maintained_selection +from ayon_maya.api.lib import maintained_selection class ExtractRig(publish.Extractor): diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_skeleton_mesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_skeleton_mesh.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/extract_skeleton_mesh.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_skeleton_mesh.py index a6811d6a6f..76e49d1588 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_skeleton_mesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_skeleton_mesh.py @@ -6,7 +6,7 @@ import pyblish.api from ayon_core.pipeline import publish from ayon_core.pipeline.publish import OptionalPyblishPluginMixin -from ayon_core.hosts.maya.api import fbx +from ayon_maya.api import fbx class ExtractSkeletonMesh(publish.Extractor, diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_thumbnail.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_thumbnail.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_thumbnail.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_thumbnail.py index d3140487a6..2863e4460b 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_thumbnail.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_thumbnail.py @@ -3,7 +3,7 @@ import glob import tempfile from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib class ExtractThumbnail(publish.Extractor): diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_unreal_skeletalmesh_abc.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_abc.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/extract_unreal_skeletalmesh_abc.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_abc.py index b5cc7745a1..f0096e37e3 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_unreal_skeletalmesh_abc.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_abc.py @@ -5,8 +5,8 @@ import os from maya import cmds # noqa from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.alembic import extract_alembic -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.alembic import extract_alembic +from ayon_maya.api.lib import ( suspended_refresh, maintained_selection ) diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py index 6292afcf41..95e12795de 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py @@ -8,7 +8,7 @@ from maya import cmds # noqa import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api import fbx +from ayon_maya.api import fbx @contextmanager diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_unreal_staticmesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_staticmesh.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/publish/extract_unreal_staticmesh.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_staticmesh.py index 9cf8a543f4..140a4e4147 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_unreal_staticmesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_staticmesh.py @@ -7,11 +7,11 @@ from maya import cmds # noqa import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( parent_nodes, maintained_selection ) -from ayon_core.hosts.maya.api import fbx +from ayon_maya.api import fbx class ExtractUnrealStaticMesh(publish.Extractor): diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_unreal_yeticache.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_yeticache.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/extract_unreal_yeticache.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_yeticache.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayproxy.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/extract_vrayproxy.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayproxy.py index d16f9e8701..581195c5da 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_vrayproxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayproxy.py @@ -3,7 +3,7 @@ import os from maya import cmds from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.lib import maintained_selection +from ayon_maya.api.lib import maintained_selection class ExtractVRayProxy(publish.Extractor): diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_vrayscene.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayscene.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/extract_vrayscene.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayscene.py index 023a15e67a..d55c0ddef6 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_vrayscene.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayscene.py @@ -4,8 +4,8 @@ import os import re from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.render_setup_tools import export_in_rs_layer -from ayon_core.hosts.maya.api.lib import maintained_selection +from ayon_maya.api.render_setup_tools import export_in_rs_layer +from ayon_maya.api.lib import maintained_selection from maya import cmds diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_workfile_xgen.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_workfile_xgen.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_workfile_xgen.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_workfile_xgen.py index 54d295b479..227c16d62a 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_workfile_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_workfile_xgen.py @@ -5,7 +5,7 @@ import copy from maya import cmds import pyblish.api -from ayon_core.hosts.maya.api.alembic import extract_alembic +from ayon_maya.api.alembic import extract_alembic from ayon_core.pipeline import publish diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_xgen.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_xgen.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_xgen.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_xgen.py index b672089a63..61cad1dc33 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_xgen.py @@ -6,7 +6,7 @@ from maya import cmds import xgenm from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( maintained_selection, attribute_values, write_xgen_file, delete_after ) diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_yeti_cache.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_cache.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/extract_yeti_cache.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_cache.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/extract_yeti_rig.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_rig.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/extract_yeti_rig.py rename to server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_rig.py index 0b67117ebc..8ef43fbf13 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/extract_yeti_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_rig.py @@ -8,7 +8,7 @@ import contextlib from maya import cmds from ayon_core.pipeline import publish -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib @contextlib.contextmanager diff --git a/client/ayon_core/hosts/maya/plugins/publish/help/submit_maya_remote_publish_deadline.xml b/server_addon/maya/client/ayon_maya/plugins/publish/help/submit_maya_remote_publish_deadline.xml similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/help/submit_maya_remote_publish_deadline.xml rename to server_addon/maya/client/ayon_maya/plugins/publish/help/submit_maya_remote_publish_deadline.xml index e92320ccdc..fa908fe425 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/help/submit_maya_remote_publish_deadline.xml +++ b/server_addon/maya/client/ayon_maya/plugins/publish/help/submit_maya_remote_publish_deadline.xml @@ -13,4 +13,4 @@ Check all failing plugins (should be highlighted in red) and fix issues if possi - \ No newline at end of file + diff --git a/client/ayon_core/hosts/maya/plugins/publish/help/validate_animation_out_set_related_node_ids.xml b/server_addon/maya/client/ayon_maya/plugins/publish/help/validate_animation_out_set_related_node_ids.xml similarity index 90% rename from client/ayon_core/hosts/maya/plugins/publish/help/validate_animation_out_set_related_node_ids.xml rename to server_addon/maya/client/ayon_maya/plugins/publish/help/validate_animation_out_set_related_node_ids.xml index a855dd90a5..cdaf97b8f4 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/help/validate_animation_out_set_related_node_ids.xml +++ b/server_addon/maya/client/ayon_maya/plugins/publish/help/validate_animation_out_set_related_node_ids.xml @@ -6,13 +6,13 @@ Meshes are detected where the (deformed) mesh has a different `cbId` than the same mesh in its deformation history. -Theses should normally be the same. +These should normally be the same. ### How to repair? By using the repair action the IDs from the shape in history will be copied to the deformed shape. For **animation** instances using the -repair action usually is usually the correct fix. +repair action is usually the correct fix. diff --git a/client/ayon_core/hosts/maya/plugins/publish/help/validate_maya_units.xml b/server_addon/maya/client/ayon_maya/plugins/publish/help/validate_maya_units.xml similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/help/validate_maya_units.xml rename to server_addon/maya/client/ayon_maya/plugins/publish/help/validate_maya_units.xml diff --git a/client/ayon_core/hosts/maya/plugins/publish/help/validate_mesh_non_manifold.xml b/server_addon/maya/client/ayon_maya/plugins/publish/help/validate_mesh_non_manifold.xml similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/help/validate_mesh_non_manifold.xml rename to server_addon/maya/client/ayon_maya/plugins/publish/help/validate_mesh_non_manifold.xml diff --git a/client/ayon_core/hosts/maya/plugins/publish/help/validate_node_ids.xml b/server_addon/maya/client/ayon_maya/plugins/publish/help/validate_node_ids.xml similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/help/validate_node_ids.xml rename to server_addon/maya/client/ayon_maya/plugins/publish/help/validate_node_ids.xml diff --git a/client/ayon_core/hosts/maya/plugins/publish/help/validate_rig_out_set_node_ids.xml b/server_addon/maya/client/ayon_maya/plugins/publish/help/validate_rig_out_set_node_ids.xml similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/help/validate_rig_out_set_node_ids.xml rename to server_addon/maya/client/ayon_maya/plugins/publish/help/validate_rig_out_set_node_ids.xml index 374b8e59ae..956a7adb3b 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/help/validate_rig_out_set_node_ids.xml +++ b/server_addon/maya/client/ayon_maya/plugins/publish/help/validate_rig_out_set_node_ids.xml @@ -6,7 +6,7 @@ Meshes are detected in the **rig** where the (deformed) mesh has a different `cbId` than the same mesh in its deformation history. -Theses should normally be the same. +These should normally be the same. ### How to repair? diff --git a/client/ayon_core/hosts/maya/plugins/publish/help/validate_skeletalmesh_hierarchy.xml b/server_addon/maya/client/ayon_maya/plugins/publish/help/validate_skeletalmesh_hierarchy.xml similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/help/validate_skeletalmesh_hierarchy.xml rename to server_addon/maya/client/ayon_maya/plugins/publish/help/validate_skeletalmesh_hierarchy.xml diff --git a/client/ayon_core/hosts/maya/plugins/publish/increment_current_file_deadline.py b/server_addon/maya/client/ayon_maya/plugins/publish/increment_current_file_deadline.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/increment_current_file_deadline.py rename to server_addon/maya/client/ayon_maya/plugins/publish/increment_current_file_deadline.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/reset_xgen_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/reset_xgen_attributes.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/reset_xgen_attributes.py rename to server_addon/maya/client/ayon_maya/plugins/publish/reset_xgen_attributes.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/save_scene.py b/server_addon/maya/client/ayon_maya/plugins/publish/save_scene.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/save_scene.py rename to server_addon/maya/client/ayon_maya/plugins/publish/save_scene.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_alembic_options_defaults.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_alembic_options_defaults.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/publish/validate_alembic_options_defaults.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_alembic_options_defaults.py index 11f4c313fa..bd69e7a3cd 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_alembic_options_defaults.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_alembic_options_defaults.py @@ -54,8 +54,8 @@ class ValidateAlembicDefaultsPointcache( default_value = settings[key] - # Lists are best to compared sorted since we cant rely on the order - # of the items. + # Lists are best to compared sorted since we can't rely on + # the order of the items. if isinstance(value, list): value = sorted(value) default_value = sorted(default_value) @@ -79,15 +79,15 @@ class ValidateAlembicDefaultsPointcache( def get_description(): return inspect.cleandoc( """### Alembic Extract settings differ from defaults - - The alembic export options differ from the project default values. - - If this is intentional you can disable this validation by + + The alembic export options differ from the project default values. + + If this is intentional you can disable this validation by disabling **Validate Alembic Options Default**. - + If not you may use the "Repair" action to revert all the options to their default values. - + """ ) diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_animation_content.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_content.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_animation_content.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_content.py index ea989bbcf3..17b9bf4e85 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_animation_content.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_content.py @@ -1,5 +1,5 @@ import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, @@ -20,7 +20,7 @@ class ValidateAnimationContent(pyblish.api.InstancePlugin, hosts = ["maya"] families = ["animation"] label = "Animation Content" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False @classmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_animation_out_set_related_node_ids.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_out_set_related_node_ids.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_animation_out_set_related_node_ids.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_out_set_related_node_ids.py index 7ecd602662..6d53608fb2 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_animation_out_set_related_node_ids.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_out_set_related_node_ids.py @@ -1,8 +1,8 @@ import maya.cmds as cmds import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, @@ -29,7 +29,7 @@ class ValidateOutRelatedNodeIds(pyblish.api.InstancePlugin, hosts = ['maya'] label = 'Animation Out Set Related Node Ids' actions = [ - ayon_core.hosts.maya.api.action.SelectInvalidAction, + ayon_maya.api.action.SelectInvalidAction, RepairAction ] optional = False diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_arnold_scene_source.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/validate_arnold_scene_source.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source.py index 8574b3ecc8..43c7b99ece 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_arnold_scene_source.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source.py @@ -5,7 +5,7 @@ import pyblish.api from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError ) -from ayon_core.hosts.maya.api.lib import is_visible +from ayon_maya.api.lib import is_visible class ValidateArnoldSceneSource(pyblish.api.InstancePlugin): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_arnold_scene_source_cbid.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source_cbid.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/validate_arnold_scene_source_cbid.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source_cbid.py index e5dbe178fc..546d65e84c 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_arnold_scene_source_cbid.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source_cbid.py @@ -1,5 +1,5 @@ import pyblish.api -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError, diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_ass_relative_paths.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_ass_relative_paths.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_ass_relative_paths.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_ass_relative_paths.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_assembly_name.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_name.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_assembly_name.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_name.py index c829f4bf74..c5ac22dd84 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_assembly_name.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_name.py @@ -1,6 +1,6 @@ import pyblish.api import maya.cmds as cmds -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin @@ -17,7 +17,7 @@ class ValidateAssemblyName(pyblish.api.InstancePlugin, label = "Validate Assembly Name" order = pyblish.api.ValidatorOrder families = ["assembly"] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] active = False optional = True diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_assembly_namespaces.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_namespaces.py similarity index 92% rename from client/ayon_core/hosts/maya/plugins/publish/validate_assembly_namespaces.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_namespaces.py index 814a8295c4..51b9485999 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_assembly_namespaces.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_namespaces.py @@ -1,5 +1,5 @@ import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin @@ -21,7 +21,7 @@ class ValidateAssemblyNamespaces(pyblish.api.InstancePlugin, label = "Validate Assembly Namespaces" order = pyblish.api.ValidatorOrder families = ["assembly"] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False def process(self, instance): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_assembly_transforms.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_transforms.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_assembly_transforms.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_transforms.py index 3bcae5de49..c5f0b6fd65 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_assembly_transforms.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_transforms.py @@ -1,7 +1,7 @@ import pyblish.api from maya import cmds -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, RepairAction, @@ -32,7 +32,7 @@ class ValidateAssemblyModelTransforms(pyblish.api.InstancePlugin, order = pyblish.api.ValidatorOrder + 0.49 label = "Assembly Model Transforms" families = ["assembly"] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, + actions = [ayon_maya.api.action.SelectInvalidAction, RepairAction] prompt_message = ("You are about to reset the matrix to the default values." @@ -53,7 +53,7 @@ class ValidateAssemblyModelTransforms(pyblish.api.InstancePlugin, @classmethod def get_invalid(cls, instance): - from ayon_core.hosts.maya.api import lib + from ayon_maya.api import lib # Get all transforms in the loaded containers container_roots = cmds.listRelatives(instance.data["nodesHierarchy"], @@ -100,7 +100,7 @@ class ValidateAssemblyModelTransforms(pyblish.api.InstancePlugin, from qtpy import QtWidgets - from ayon_core.hosts.maya.api import lib + from ayon_maya.api import lib # Store namespace in variable, cosmetics thingy choice = QtWidgets.QMessageBox.warning( diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_attributes.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/validate_attributes.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_attributes.py index 1514972159..08620e22bf 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_attributes.py @@ -4,7 +4,7 @@ from collections import defaultdict import pyblish.api from maya import cmds -from ayon_core.hosts.maya.api.lib import set_attribute +from ayon_maya.api.lib import set_attribute from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError, RepairAction, ValidateContentsOrder) diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_camera_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_attributes.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/publish/validate_camera_attributes.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_attributes.py index 5fd8772a96..95d1e76b83 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_camera_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_attributes.py @@ -1,7 +1,7 @@ import pyblish.api from maya import cmds -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, @@ -23,7 +23,7 @@ class ValidateCameraAttributes(pyblish.api.InstancePlugin, families = ['camera'] hosts = ['maya'] label = 'Camera Attributes' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = True DEFAULTS = [ diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_camera_contents.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_contents.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_camera_contents.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_contents.py index 0f14a057f9..3ce512aebc 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_camera_contents.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_contents.py @@ -1,7 +1,7 @@ import pyblish.api from maya import cmds -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, @@ -23,7 +23,7 @@ class ValidateCameraContents(pyblish.api.InstancePlugin, families = ['camera'] hosts = ['maya'] label = 'Camera Contents' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] validate_shapes = True optional = False diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_color_sets.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_color_sets.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_color_sets.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_color_sets.py index f70b46f89e..40d7297444 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_color_sets.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_color_sets.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateMeshOrder, OptionalPyblishPluginMixin, @@ -24,7 +24,7 @@ class ValidateColorSets(pyblish.api.InstancePlugin, families = ['model'] label = 'Mesh ColorSets' actions = [ - ayon_core.hosts.maya.api.action.SelectInvalidAction, RepairAction + ayon_maya.api.action.SelectInvalidAction, RepairAction ] optional = True diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_current_renderlayer_renderable.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_current_renderlayer_renderable.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_current_renderlayer_renderable.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_current_renderlayer_renderable.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_cycle_error.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_cycle_error.py similarity index 86% rename from client/ayon_core/hosts/maya/plugins/publish/validate_cycle_error.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_cycle_error.py index f969ff533b..ac773a586a 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_cycle_error.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_cycle_error.py @@ -1,8 +1,8 @@ import pyblish.api from maya import cmds -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api.lib import maintained_selection +import ayon_maya.api.action +from ayon_maya.api.lib import maintained_selection from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError, ValidateContentsOrder) @@ -15,7 +15,7 @@ class ValidateCycleError(pyblish.api.InstancePlugin, label = "Cycle Errors" hosts = ["maya"] families = ["rig"] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = True def process(self, instance): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_frame_range.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_frame_range.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/validate_frame_range.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_frame_range.py index 5736e726e9..20feee8756 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_frame_range.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_frame_range.py @@ -7,7 +7,7 @@ from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin ) -from ayon_core.hosts.maya.api.lib_rendersetup import ( +from ayon_maya.api.lib_rendersetup import ( get_attr_overrides, get_attr_in_layer, ) diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_glsl_material.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_material.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_glsl_material.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_material.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_glsl_plugin.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_plugin.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_glsl_plugin.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_plugin.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_instance_has_members.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_has_members.py similarity index 91% rename from client/ayon_core/hosts/maya/plugins/publish/validate_instance_has_members.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_has_members.py index 16e04af446..de20a7c150 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_instance_has_members.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_has_members.py @@ -1,5 +1,5 @@ import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError @@ -12,7 +12,7 @@ class ValidateInstanceHasMembers(pyblish.api.InstancePlugin): order = ValidateContentsOrder hosts = ["maya"] label = 'Instance has members' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] @classmethod def get_invalid(cls, instance): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_instance_in_context.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_in_context.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_instance_in_context.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_in_context.py index e6f4b908bb..f67845bcd5 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_instance_in_context.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_in_context.py @@ -3,7 +3,7 @@ from __future__ import absolute_import import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, @@ -28,7 +28,7 @@ class ValidateInstanceInContext(pyblish.api.InstancePlugin, optional = True hosts = ["maya"] actions = [ - ayon_core.hosts.maya.api.action.SelectInvalidAction, RepairAction + ayon_maya.api.action.SelectInvalidAction, RepairAction ] def process(self, instance): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_instance_subset.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_subset.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_instance_subset.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_subset.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_loaded_plugin.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_loaded_plugin.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_loaded_plugin.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_loaded_plugin.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_look_contents.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_contents.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/validate_look_contents.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_look_contents.py index a8d8ec373a..4709a7bb1e 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_look_contents.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_contents.py @@ -1,5 +1,5 @@ import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder @@ -27,7 +27,7 @@ class ValidateLookContents(pyblish.api.InstancePlugin): families = ['look'] hosts = ['maya'] label = 'Look Data Contents' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] def process(self, instance): """Process all the nodes in the instance""" diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_look_default_shaders_connections.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_default_shaders_connections.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_look_default_shaders_connections.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_look_default_shaders_connections.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_look_id_reference_edits.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_id_reference_edits.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/validate_look_id_reference_edits.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_look_id_reference_edits.py index 7ae3b4b9b5..5a4ccc16ca 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_look_id_reference_edits.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_id_reference_edits.py @@ -2,7 +2,7 @@ from collections import defaultdict from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, @@ -24,7 +24,7 @@ class ValidateLookIdReferenceEdits(pyblish.api.InstancePlugin): families = ['look'] hosts = ['maya'] label = 'Look Id Reference Edits' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, + actions = [ayon_maya.api.action.SelectInvalidAction, RepairAction] @classmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_look_no_default_shaders.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_no_default_shaders.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_look_no_default_shaders.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_look_no_default_shaders.py index 3a67bbd72b..21a056c81c 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_look_no_default_shaders.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_no_default_shaders.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError @@ -30,7 +30,7 @@ class ValidateLookNoDefaultShaders(pyblish.api.InstancePlugin): families = ['look'] hosts = ['maya'] label = 'Look No Default Shaders' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] DEFAULT_SHADERS = {"lambert1", "initialShadingGroup", "initialParticleSE", "particleCloud1"} diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_look_sets.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_sets.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_look_sets.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_look_sets.py index dd7515c1fb..97c790c8c6 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_look_sets.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_sets.py @@ -1,6 +1,6 @@ import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError @@ -44,7 +44,7 @@ class ValidateLookSets(pyblish.api.InstancePlugin): families = ['look'] hosts = ['maya'] label = 'Look Sets' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] def process(self, instance): """Process all the nodes in the instance""" diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_look_shading_group.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_shading_group.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/publish/validate_look_shading_group.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_look_shading_group.py index 070974aef5..25e4eb046d 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_look_shading_group.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_shading_group.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, @@ -22,7 +22,7 @@ class ValidateShadingEngine(pyblish.api.InstancePlugin, hosts = ["maya"] label = "Look Shading Engine Naming" actions = [ - ayon_core.hosts.maya.api.action.SelectInvalidAction, RepairAction + ayon_maya.api.action.SelectInvalidAction, RepairAction ] optional = True diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_look_single_shader.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_single_shader.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_look_single_shader.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_look_single_shader.py index c0ffaaf9c0..de0a9619b4 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_look_single_shader.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_single_shader.py @@ -1,7 +1,7 @@ import pyblish.api from maya import cmds -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder) @@ -17,7 +17,7 @@ class ValidateSingleShader(pyblish.api.InstancePlugin): families = ['look'] hosts = ['maya'] label = 'Look Single Shader Per Shape' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] # The default connections to check def process(self, instance): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_maya_units.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_maya_units.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/validate_maya_units.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_maya_units.py index 47314b64ac..8171e7e8fa 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_maya_units.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_maya_units.py @@ -2,7 +2,7 @@ import maya.cmds as cmds import pyblish.api -import ayon_core.hosts.maya.api.lib as mayalib +import ayon_maya.api.lib as mayalib from ayon_core.pipeline.publish import ( RepairContextAction, ValidateSceneOrder, diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_arnold_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_arnold_attributes.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_arnold_attributes.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_arnold_attributes.py index e9d9a17ff4..5a9841b6c0 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_arnold_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_arnold_attributes.py @@ -1,8 +1,8 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api.lib import ( +import ayon_maya.api.action +from ayon_maya.api.lib import ( maintained_selection, delete_after, undo_chunk, @@ -30,7 +30,7 @@ class ValidateMeshArnoldAttributes(pyblish.api.InstancePlugin, families = ["model"] label = "Mesh Arnold Attributes" actions = [ - ayon_core.hosts.maya.api.action.SelectInvalidAction, + ayon_maya.api.action.SelectInvalidAction, RepairAction ] diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_empty.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_empty.py similarity index 92% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_empty.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_empty.py index c95e1ec816..ad2b08ba19 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_empty.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_empty.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, @@ -21,7 +21,7 @@ class ValidateMeshEmpty(pyblish.api.InstancePlugin): families = ["model"] label = "Mesh Empty" actions = [ - ayon_core.hosts.maya.api.action.SelectInvalidAction, RepairAction + ayon_maya.api.action.SelectInvalidAction, RepairAction ] @classmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_has_uv.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_has_uv.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_has_uv.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_has_uv.py index 633fc29732..25da24db1c 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_has_uv.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_has_uv.py @@ -1,13 +1,13 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateMeshOrder, OptionalPyblishPluginMixin, PublishValidationError ) -from ayon_core.hosts.maya.api.lib import len_flattened +from ayon_maya.api.lib import len_flattened class ValidateMeshHasUVs(pyblish.api.InstancePlugin, @@ -24,7 +24,7 @@ class ValidateMeshHasUVs(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['model'] label = 'Mesh Has UVs' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = True @classmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_lamina_faces.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_lamina_faces.py similarity index 93% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_lamina_faces.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_lamina_faces.py index bfb4257f23..ee6acd1685 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_lamina_faces.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_lamina_faces.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateMeshOrder, OptionalPyblishPluginMixin, @@ -21,7 +21,7 @@ class ValidateMeshLaminaFaces(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['model'] label = 'Mesh Lamina Faces' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = True description = ( diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_ngons.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_ngons.py similarity index 92% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_ngons.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_ngons.py index 58d015e962..f4d907636c 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_ngons.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_ngons.py @@ -1,8 +1,8 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, @@ -25,7 +25,7 @@ class ValidateMeshNgons(pyblish.api.InstancePlugin, hosts = ["maya"] families = ["model"] label = "Mesh ngons" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = True description = ( diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_no_negative_scale.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_no_negative_scale.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_no_negative_scale.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_no_negative_scale.py index bf1489f92e..7868015a30 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_no_negative_scale.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_no_negative_scale.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateMeshOrder, PublishValidationError, @@ -33,7 +33,7 @@ class ValidateMeshNoNegativeScale(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['model'] label = 'Mesh No Negative Scale' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False @staticmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_non_manifold.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_manifold.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_non_manifold.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_manifold.py index 958707e4f4..dc561be981 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_non_manifold.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_manifold.py @@ -1,7 +1,7 @@ from maya import cmds, mel import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateMeshOrder, PublishXmlValidationError, @@ -114,7 +114,7 @@ class ValidateMeshNonManifold(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['model'] label = 'Mesh Non-Manifold Edges/Vertices' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, + actions = [ayon_maya.api.action.SelectInvalidAction, CleanupMatchingPolygons] optional = True diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_non_zero_edge.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_zero_edge.py similarity index 93% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_non_zero_edge.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_zero_edge.py index 0a8d6cf159..7830e10f2a 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_non_zero_edge.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_zero_edge.py @@ -1,8 +1,8 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( ValidateMeshOrder, OptionalPyblishPluginMixin, @@ -25,7 +25,7 @@ class ValidateMeshNonZeroEdgeLength(pyblish.api.InstancePlugin, families = ['model'] hosts = ['maya'] label = 'Mesh Edge Length Non Zero' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = True __tolerance = 1e-5 diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_normals_unlocked.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_normals_unlocked.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_normals_unlocked.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_normals_unlocked.py index 76b716d01f..2d8370166b 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_normals_unlocked.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_normals_unlocked.py @@ -2,7 +2,7 @@ from maya import cmds import maya.api.OpenMaya as om2 import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, @@ -31,7 +31,7 @@ class ValidateMeshNormalsUnlocked(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['model'] label = 'Mesh Normals Unlocked' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, + actions = [ayon_maya.api.action.SelectInvalidAction, RepairAction] optional = True diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_overlapping_uvs.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_overlapping_uvs.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_overlapping_uvs.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_overlapping_uvs.py index a13d16e849..9606ec3202 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_overlapping_uvs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_overlapping_uvs.py @@ -5,7 +5,7 @@ from maya import cmds import maya.api.OpenMaya as om import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateMeshOrder, OptionalPyblishPluginMixin, @@ -248,7 +248,7 @@ class ValidateMeshHasOverlappingUVs(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['model'] label = 'Mesh Has Overlapping UVs' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = True @classmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_shader_connections.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_shader_connections.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_shader_connections.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_shader_connections.py index 70ede83f2d..2e91df87a3 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_shader_connections.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_shader_connections.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, @@ -96,7 +96,7 @@ class ValidateMeshShaderConnections(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['model'] label = "Mesh Shader Connections" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, + actions = [ayon_maya.api.action.SelectInvalidAction, RepairAction] optional = True diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_single_uv_set.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_single_uv_set.py similarity index 93% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_single_uv_set.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_single_uv_set.py index 21697cd903..d807833a77 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_single_uv_set.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_single_uv_set.py @@ -1,8 +1,8 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, @@ -26,7 +26,7 @@ class ValidateMeshSingleUVSet(pyblish.api.InstancePlugin, families = ['model', 'pointcache'] optional = True label = "Mesh Single UV Set" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, + actions = [ayon_maya.api.action.SelectInvalidAction, RepairAction] @staticmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_uv_set_map1.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_uv_set_map1.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_uv_set_map1.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_uv_set_map1.py index 305a58d78e..c4d3abc624 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_uv_set_map1.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_uv_set_map1.py @@ -3,7 +3,7 @@ import inspect from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, @@ -28,7 +28,7 @@ class ValidateMeshUVSetMap1(pyblish.api.InstancePlugin, families = ['model'] optional = True label = "Mesh has map1 UV Set" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, + actions = [ayon_maya.api.action.SelectInvalidAction, RepairAction] @classmethod @@ -120,10 +120,10 @@ class ValidateMeshUVSetMap1(pyblish.api.InstancePlugin, @staticmethod def get_description(): return inspect.cleandoc("""### Mesh found without map1 uv set - + A mesh must have a default UV set named `map1` to adhere to the default mesh behavior of Maya meshes. - + There may be meshes that: - Have no UV set - Have no `map1` uv set but are using a different name @@ -131,7 +131,7 @@ class ValidateMeshUVSetMap1(pyblish.api.InstancePlugin, #### Repair - + Using repair will try to make the first UV set the `map1` uv set. If it does not exist yet it will be created or renames the current first UV set to `map1`. diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_vertices_have_edges.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_vertices_have_edges.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mesh_vertices_have_edges.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_vertices_have_edges.py index f0962148dc..9dbdc8fd2b 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mesh_vertices_have_edges.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_vertices_have_edges.py @@ -1,8 +1,8 @@ import pyblish.api from maya import cmds -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api.lib import len_flattened +import ayon_maya.api.action +from ayon_maya.api.lib import len_flattened from ayon_core.pipeline.publish import ( PublishValidationError, RepairAction, @@ -35,7 +35,7 @@ class ValidateMeshVerticesHaveEdges(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['model'] label = 'Mesh Vertices Have Edges' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, + actions = [ayon_maya.api.action.SelectInvalidAction, RepairAction] optional = True diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_model_content.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_model_content.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_model_content.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_model_content.py index bbc644c3db..b06b45db81 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_model_content.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_model_content.py @@ -3,8 +3,8 @@ import inspect from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError, @@ -24,7 +24,7 @@ class ValidateModelContent(pyblish.api.InstancePlugin, hosts = ["maya"] families = ["model"] label = "Model Content" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] validate_top_group = True optional = False @@ -120,18 +120,18 @@ class ValidateModelContent(pyblish.api.InstancePlugin, message="Model content is invalid. See log for more details.", description=self.get_description() ) - + @classmethod def get_description(cls): return inspect.cleandoc(f""" ### Model content is invalid - - Your model instance does not adhere to the rules of a + + Your model instance does not adhere to the rules of a model product type: - + - Must have at least one visible shape in it, like a mesh. - - Must have one root node. When exporting multiple meshes they + - Must have one root node. When exporting multiple meshes they must be inside a group. - - May only contain the following node types: + - May only contain the following node types: {", ".join(cls.allowed)} """) diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_mvlook_contents.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mvlook_contents.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/validate_mvlook_contents.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_mvlook_contents.py index 8c2bbf2a36..980565afad 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_mvlook_contents.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mvlook_contents.py @@ -1,6 +1,6 @@ import os import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, @@ -18,7 +18,7 @@ class ValidateMvLookContents(pyblish.api.InstancePlugin, families = ['mvLook'] hosts = ['maya'] label = 'Validate mvLook Data' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] # Allow this validation step to be skipped when you just need to # get things pushed through. diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_no_animation.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_animation.py similarity index 93% rename from client/ayon_core/hosts/maya/plugins/publish/validate_no_animation.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_no_animation.py index bf45c0e974..0e1f179483 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_no_animation.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_animation.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, @@ -31,7 +31,7 @@ class ValidateNoAnimation(pyblish.api.InstancePlugin, hosts = ["maya"] families = ["model"] optional = True - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] def process(self, instance): if not self.is_active(instance.data): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_no_default_camera.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_default_camera.py similarity index 93% rename from client/ayon_core/hosts/maya/plugins/publish/validate_no_default_camera.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_no_default_camera.py index 3e21ec6e50..be469cd4df 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_no_default_camera.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_default_camera.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError, @@ -29,7 +29,7 @@ class ValidateNoDefaultCameras(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['camera'] label = "No Default Cameras" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False @staticmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_no_namespace.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_namespace.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/publish/validate_no_namespace.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_no_namespace.py index f546caff2c..0d7b67e179 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_no_namespace.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_namespace.py @@ -8,7 +8,7 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin ) -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action def _as_report_list(values, prefix="- ", suffix="\n"): @@ -33,7 +33,7 @@ class ValidateNoNamespace(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['model'] label = 'No Namespaces' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, + actions = [ayon_maya.api.action.SelectInvalidAction, RepairAction] optional = False diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_no_null_transforms.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_null_transforms.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_no_null_transforms.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_no_null_transforms.py index 38955fd777..876be073a0 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_no_null_transforms.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_null_transforms.py @@ -1,7 +1,7 @@ import maya.cmds as cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, @@ -50,7 +50,7 @@ class ValidateNoNullTransforms(pyblish.api.InstancePlugin, families = ['model'] label = 'No Empty/Null Transforms' actions = [RepairAction, - ayon_core.hosts.maya.api.action.SelectInvalidAction] + ayon_maya.api.action.SelectInvalidAction] optional = False @staticmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_no_unknown_nodes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_unknown_nodes.py similarity index 93% rename from client/ayon_core/hosts/maya/plugins/publish/validate_no_unknown_nodes.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_no_unknown_nodes.py index 5cc3e95593..8b4d873014 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_no_unknown_nodes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_unknown_nodes.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, @@ -33,7 +33,7 @@ class ValidateNoUnknownNodes(pyblish.api.InstancePlugin, families = ['model', 'rig'] optional = True label = "Unknown Nodes" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] @staticmethod def get_invalid(instance): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_no_vraymesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_vraymesh.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_no_vraymesh.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_no_vraymesh.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_node_ids.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids.py similarity index 89% rename from client/ayon_core/hosts/maya/plugins/publish/validate_node_ids.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids.py index 2d6f231cb5..810dbc4fa1 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_node_ids.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids.py @@ -4,8 +4,8 @@ from ayon_core.pipeline.publish import ( ValidatePipelineOrder, PublishXmlValidationError ) -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib class ValidateNodeIDs(pyblish.api.InstancePlugin): @@ -28,8 +28,8 @@ class ValidateNodeIDs(pyblish.api.InstancePlugin): "yetiRig", "assembly"] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, - ayon_core.hosts.maya.api.action.GenerateUUIDsOnInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction, + ayon_maya.api.action.GenerateUUIDsOnInvalidAction] @classmethod def apply_settings(cls, project_settings): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_node_ids_deformed_shapes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_deformed_shapes.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_node_ids_deformed_shapes.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_deformed_shapes.py index 545ab8e28c..4fc8f776ef 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_node_ids_deformed_shapes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_deformed_shapes.py @@ -1,8 +1,8 @@ import pyblish.api from maya import cmds -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( PublishValidationError, RepairAction, ValidateContentsOrder) @@ -22,7 +22,7 @@ class ValidateNodeIdsDeformedShape(pyblish.api.InstancePlugin): hosts = ['maya'] label = 'Deformed shape ids' actions = [ - ayon_core.hosts.maya.api.action.SelectInvalidAction, + ayon_maya.api.action.SelectInvalidAction, RepairAction ] diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_node_ids_in_database.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_in_database.py similarity index 93% rename from client/ayon_core/hosts/maya/plugins/publish/validate_node_ids_in_database.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_in_database.py index d679c510af..a1fde89fc3 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_node_ids_in_database.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_in_database.py @@ -1,8 +1,8 @@ import pyblish.api import ayon_api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( PublishValidationError, ValidatePipelineOrder) @@ -23,8 +23,8 @@ class ValidateNodeIdsInDatabase(pyblish.api.InstancePlugin): hosts = ['maya'] families = ["*"] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, - ayon_core.hosts.maya.api.action.GenerateUUIDsOnInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction, + ayon_maya.api.action.GenerateUUIDsOnInvalidAction] @classmethod def apply_settings(cls, project_settings): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_node_ids_related.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_related.py similarity index 91% rename from client/ayon_core/hosts/maya/plugins/publish/validate_node_ids_related.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_related.py index 17eb58f421..0ad497d119 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_node_ids_related.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_related.py @@ -3,8 +3,8 @@ import uuid from collections import defaultdict import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError, ValidatePipelineOrder) from ayon_api import get_folders @@ -31,8 +31,8 @@ class ValidateNodeIDsRelated(pyblish.api.InstancePlugin, "rig"] optional = True - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, - ayon_core.hosts.maya.api.action.GenerateUUIDsOnInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction, + ayon_maya.api.action.GenerateUUIDsOnInvalidAction] @classmethod def apply_settings(cls, project_settings): @@ -109,14 +109,14 @@ class ValidateNodeIDsRelated(pyblish.api.InstancePlugin, @staticmethod def get_description(): return inspect.cleandoc("""### Node IDs must match folder id - + The node ids must match the folder entity id you are publishing to. - - Usually these mismatch occurs if you are re-using nodes from another - folder or project. - + + Usually these mismatch occurs if you are re-using nodes from another + folder or project. + #### How to repair? - - The repair action will regenerate new ids for + + The repair action will regenerate new ids for the invalid nodes to match the instance's folder. """) diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_node_ids_unique.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_unique.py similarity index 91% rename from client/ayon_core/hosts/maya/plugins/publish/validate_node_ids_unique.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_unique.py index 6b44a307d2..ae04a48678 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_node_ids_unique.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_unique.py @@ -5,8 +5,8 @@ from ayon_core.pipeline.publish import ( ValidatePipelineOrder, PublishValidationError ) -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from maya import cmds @@ -25,8 +25,8 @@ class ValidateNodeIdsUnique(pyblish.api.InstancePlugin): "rig", "yetiRig"] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, - ayon_core.hosts.maya.api.action.GenerateUUIDsOnInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction, + ayon_maya.api.action.GenerateUUIDsOnInvalidAction] @classmethod def apply_settings(cls, project_settings): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_node_no_ghosting.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_no_ghosting.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_node_no_ghosting.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_node_no_ghosting.py index 10cbbc9a88..1220282d0c 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_node_no_ghosting.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_no_ghosting.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, @@ -27,7 +27,7 @@ class ValidateNodeNoGhosting(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['model', 'rig'] label = "No Ghosting" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False _attributes = {'ghosting': 0} diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_plugin_path_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_plugin_path_attributes.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/publish/validate_plugin_path_attributes.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_plugin_path_attributes.py index f961ec6e4a..ef6f97371f 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_plugin_path_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_plugin_path_attributes.py @@ -4,8 +4,8 @@ from maya import cmds import pyblish.api -from ayon_core.hosts.maya.api.lib import pairwise -from ayon_core.hosts.maya.api.action import SelectInvalidAction +from ayon_maya.api.lib import pairwise +from ayon_maya.api.action import SelectInvalidAction from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError, diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_render_image_rule.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_image_rule.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_render_image_rule.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_render_image_rule.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_render_no_default_cameras.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_no_default_cameras.py similarity index 92% rename from client/ayon_core/hosts/maya/plugins/publish/validate_render_no_default_cameras.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_render_no_default_cameras.py index 41c0fa4807..1692b90993 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_render_no_default_cameras.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_no_default_cameras.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError, @@ -18,7 +18,7 @@ class ValidateRenderNoDefaultCameras(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['renderlayer'] label = "No Default Cameras Renderable" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False @staticmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_render_single_camera.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_single_camera.py similarity index 92% rename from client/ayon_core/hosts/maya/plugins/publish/validate_render_single_camera.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_render_single_camera.py index e186d74b89..cb03e68642 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_render_single_camera.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_single_camera.py @@ -4,8 +4,8 @@ import inspect import pyblish.api from maya import cmds -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api.lib_rendersettings import RenderSettings +import ayon_maya.api.action +from ayon_maya.api.lib_rendersettings import RenderSettings from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError, @@ -26,7 +26,7 @@ class ValidateRenderSingleCamera(pyblish.api.InstancePlugin, hosts = ['maya'] families = ["renderlayer", "vrayscene"] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False R_CAMERA_TOKEN = re.compile(r'%c|', re.IGNORECASE) @@ -77,8 +77,8 @@ class ValidateRenderSingleCamera(pyblish.api.InstancePlugin, Your render cameras are misconfigured. You may have no render camera set or have multiple cameras with a render filename prefix that does not include the `` token. - + See the logs for more details about the cameras. - + """ ) diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_renderlayer_aovs.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_renderlayer_aovs.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_renderlayer_aovs.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_renderlayer_aovs.py index 910e336fc1..92d97776e1 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_renderlayer_aovs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_renderlayer_aovs.py @@ -1,7 +1,7 @@ import ayon_api import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin @@ -28,7 +28,7 @@ class ValidateRenderLayerAOVs(pyblish.api.InstancePlugin, label = "Render Passes / AOVs Are Registered" hosts = ["maya"] families = ["renderlayer"] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False def process(self, instance): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_rendersettings.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rendersettings.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/publish/validate_rendersettings.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_rendersettings.py index 7badfdc027..d5a9ea778c 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_rendersettings.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rendersettings.py @@ -12,8 +12,8 @@ from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin ) -from ayon_core.hosts.maya.api import lib -from ayon_core.hosts.maya.api.lib_rendersettings import RenderSettings +from ayon_maya.api import lib +from ayon_maya.api.lib_rendersettings import RenderSettings def convert_to_int_or_float(string_value): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_resolution.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_resolution.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/validate_resolution.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_resolution.py index d822dca288..aae3940e02 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_resolution.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_resolution.py @@ -5,8 +5,8 @@ from ayon_core.pipeline import ( ) from maya import cmds from ayon_core.pipeline.publish import RepairAction -from ayon_core.hosts.maya.api import lib -from ayon_core.hosts.maya.api.lib import reset_scene_resolution +from ayon_maya.api import lib +from ayon_maya.api.lib import reset_scene_resolution class ValidateResolution(pyblish.api.InstancePlugin, diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_resources.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_resources.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_resources.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_resources.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_review.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_review.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_review.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_review.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_rig_contents.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_contents.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/validate_rig_contents.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_contents.py index f05e2b7311..b8b8728888 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_rig_contents.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_contents.py @@ -1,6 +1,6 @@ import pyblish.api from maya import cmds -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, @@ -22,7 +22,7 @@ class ValidateRigContents(pyblish.api.InstancePlugin, label = "Rig Contents" hosts = ["maya"] families = ["rig"] - action = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + action = [ayon_maya.api.action.SelectInvalidAction] optional = True accepted_output = ["mesh", "transform"] diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_rig_controllers.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/validate_rig_controllers.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers.py index 814ff50177..aed0800160 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_rig_controllers.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers.py @@ -8,8 +8,8 @@ from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin ) -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api.lib import undo_chunk +import ayon_maya.api.action +from ayon_maya.api.lib import undo_chunk class ValidateRigControllers(pyblish.api.InstancePlugin, @@ -37,7 +37,7 @@ class ValidateRigControllers(pyblish.api.InstancePlugin, families = ["rig"] optional = True actions = [RepairAction, - ayon_core.hosts.maya.api.action.SelectInvalidAction] + ayon_maya.api.action.SelectInvalidAction] # Default controller values CONTROLLER_DEFAULTS = { diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_rig_controllers_arnold_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers_arnold_attributes.py similarity index 95% rename from client/ayon_core/hosts/maya/plugins/publish/validate_rig_controllers_arnold_attributes.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers_arnold_attributes.py index ea2de81036..4bc47c5949 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_rig_controllers_arnold_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers_arnold_attributes.py @@ -9,8 +9,8 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin ) -from ayon_core.hosts.maya.api import lib -import ayon_core.hosts.maya.api.action +from ayon_maya.api import lib +import ayon_maya.api.action class ValidateRigControllersArnoldAttributes(pyblish.api.InstancePlugin, @@ -39,7 +39,7 @@ class ValidateRigControllersArnoldAttributes(pyblish.api.InstancePlugin, families = ["rig"] optional = False actions = [RepairAction, - ayon_core.hosts.maya.api.action.SelectInvalidAction] + ayon_maya.api.action.SelectInvalidAction] attributes = [ "rcurve", diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_rig_joints_hidden.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_joints_hidden.py similarity index 90% rename from client/ayon_core/hosts/maya/plugins/publish/validate_rig_joints_hidden.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_joints_hidden.py index 78cc3f5938..d45af574ab 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_rig_joints_hidden.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_joints_hidden.py @@ -2,8 +2,8 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, @@ -28,7 +28,7 @@ class ValidateRigJointsHidden(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['rig'] label = "Joints Hidden" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, + actions = [ayon_maya.api.action.SelectInvalidAction, RepairAction] optional = True diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_rig_out_set_node_ids.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_out_set_node_ids.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/validate_rig_out_set_node_ids.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_out_set_node_ids.py index d94ddc5f2a..e5404aae7e 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_rig_out_set_node_ids.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_out_set_node_ids.py @@ -2,8 +2,8 @@ import maya.cmds as cmds import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, @@ -30,7 +30,7 @@ class ValidateRigOutSetNodeIds(pyblish.api.InstancePlugin, hosts = ['maya'] label = 'Rig Out Set Node Ids' actions = [ - ayon_core.hosts.maya.api.action.SelectInvalidAction, + ayon_maya.api.action.SelectInvalidAction, RepairAction ] allow_history_only = False diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_rig_output_ids.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_output_ids.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_rig_output_ids.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_output_ids.py index d04006f013..c5fee5ddc6 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_rig_output_ids.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_output_ids.py @@ -4,8 +4,8 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api.lib import get_id, set_id +import ayon_maya.api.action +from ayon_maya.api.lib import get_id, set_id from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, @@ -30,7 +30,7 @@ class ValidateRigOutputIds(pyblish.api.InstancePlugin): hosts = ["maya"] families = ["rig"] actions = [RepairAction, - ayon_core.hosts.maya.api.action.SelectInvalidAction] + ayon_maya.api.action.SelectInvalidAction] @classmethod def apply_settings(cls, project_settings): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_scene_set_workspace.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_scene_set_workspace.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_scene_set_workspace.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_scene_set_workspace.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_setdress_root.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_setdress_root.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_setdress_root.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_setdress_root.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_shader_name.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shader_name.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_shader_name.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_shader_name.py index 09c17202c5..ed1ea17966 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_shader_name.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shader_name.py @@ -3,7 +3,7 @@ import re import pyblish.api from maya import cmds -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError, ValidateContentsOrder) @@ -20,7 +20,7 @@ class ValidateShaderName(pyblish.api.InstancePlugin, families = ["look"] hosts = ['maya'] label = 'Validate Shaders Name' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] regex = r'(?P.*)_(.*)_SHD' # The default connections to check diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_shape_default_names.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_default_names.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_shape_default_names.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_default_names.py index c4c4c909d3..5355cd9cfd 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_shape_default_names.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_default_names.py @@ -4,7 +4,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, RepairAction, @@ -43,7 +43,7 @@ class ValidateShapeDefaultNames(pyblish.api.InstancePlugin, families = ['model'] optional = True label = "Shape Default Naming" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, + actions = [ayon_maya.api.action.SelectInvalidAction, RepairAction] @staticmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_shape_render_stats.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_render_stats.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_shape_render_stats.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_render_stats.py index 52ce3c5436..e6e2f963e9 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_shape_render_stats.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_render_stats.py @@ -2,7 +2,7 @@ import pyblish.api from maya import cmds -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, @@ -19,7 +19,7 @@ class ValidateShapeRenderStats(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['model'] label = 'Shape Default Render Stats' - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction, + actions = [ayon_maya.api.action.SelectInvalidAction, RepairAction] defaults = {'castsShadows': 1, diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_shape_zero.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_zero.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_shape_zero.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_zero.py index 6c89258085..6d39e26408 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_shape_zero.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_zero.py @@ -2,8 +2,8 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action -from ayon_core.hosts.maya.api import lib +import ayon_maya.api.action +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( ValidateContentsOrder, RepairAction, @@ -25,7 +25,7 @@ class ValidateShapeZero(pyblish.api.InstancePlugin, families = ["model"] label = "Shape Zero (Freeze)" actions = [ - ayon_core.hosts.maya.api.action.SelectInvalidAction, + ayon_maya.api.action.SelectInvalidAction, RepairAction ] optional = True diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_single_assembly.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_single_assembly.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_single_assembly.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_single_assembly.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_skeletalmesh_hierarchy.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_hierarchy.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_skeletalmesh_hierarchy.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_hierarchy.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_skeletalmesh_triangulated.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_triangulated.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/validate_skeletalmesh_triangulated.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_triangulated.py index cc25e769e6..7e63ed2ae3 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_skeletalmesh_triangulated.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_triangulated.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- import pyblish.api -from ayon_core.hosts.maya.api.action import ( +from ayon_maya.api.action import ( SelectInvalidAction, ) from ayon_core.pipeline.publish import ( diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_skeleton_top_group_hierarchy.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeleton_top_group_hierarchy.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_skeleton_top_group_hierarchy.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_skeleton_top_group_hierarchy.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_skinCluster_deformer_set.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skinCluster_deformer_set.py similarity index 96% rename from client/ayon_core/hosts/maya/plugins/publish/validate_skinCluster_deformer_set.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_skinCluster_deformer_set.py index a548e12f33..7a7b6a9048 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_skinCluster_deformer_set.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skinCluster_deformer_set.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, @@ -24,7 +24,7 @@ class ValidateSkinclusterDeformerSet(pyblish.api.InstancePlugin, hosts = ['maya'] families = ['fbx'] label = "Skincluster Deformer Relationships" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False def process(self, instance): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_step_size.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_step_size.py similarity index 92% rename from client/ayon_core/hosts/maya/plugins/publish/validate_step_size.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_step_size.py index a276a5b644..1373048cc2 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_step_size.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_step_size.py @@ -1,6 +1,6 @@ import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, @@ -21,7 +21,7 @@ class ValidateStepSize(pyblish.api.InstancePlugin, families = ['camera', 'pointcache', 'animation'] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False MIN = 0.01 MAX = 1.0 diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_transform_naming_suffix.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_naming_suffix.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/publish/validate_transform_naming_suffix.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_naming_suffix.py index e565866778..846fc86650 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_transform_naming_suffix.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_naming_suffix.py @@ -5,7 +5,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, @@ -40,7 +40,7 @@ class ValidateTransformNamingSuffix(pyblish.api.InstancePlugin, families = ["model"] optional = True label = "Suffix Naming Conventions" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] SUFFIX_NAMING_TABLE = json.dumps({ "mesh": ["_GEO", "_GES", "_GEP", "_OSD"], "nurbsCurve": ["_CRV"], diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_transform_zero.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_zero.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_transform_zero.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_zero.py index cd96ebb10d..51fa7938ef 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_transform_zero.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_zero.py @@ -3,7 +3,7 @@ import inspect from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError, @@ -25,7 +25,7 @@ class ValidateTransformZero(pyblish.api.InstancePlugin, hosts = ["maya"] families = ["model"] label = "Transform Zero (Freeze)" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] _identity = [1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, @@ -86,7 +86,7 @@ class ValidateTransformZero(pyblish.api.InstancePlugin, def get_description(): return inspect.cleandoc("""### Transform can't have any values - The model publish allows no transformations. + The model publish allows no transformations. You must **freeze transformations** to continue. diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_unique_names.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unique_names.py similarity index 91% rename from client/ayon_core/hosts/maya/plugins/publish/validate_unique_names.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_unique_names.py index 0066d70531..74f2292680 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_unique_names.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unique_names.py @@ -1,7 +1,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, @@ -21,7 +21,7 @@ class ValidateUniqueNames(pyblish.api.InstancePlugin, hosts = ["maya"] families = ["model"] label = "Unique transform name" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = True @staticmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_unreal_mesh_triangulated.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_mesh_triangulated.py similarity index 91% rename from client/ayon_core/hosts/maya/plugins/publish/validate_unreal_mesh_triangulated.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_mesh_triangulated.py index 6440c00eae..f6207797a7 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_unreal_mesh_triangulated.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_mesh_triangulated.py @@ -8,7 +8,7 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError ) -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action class ValidateUnrealMeshTriangulated(pyblish.api.InstancePlugin, @@ -19,7 +19,7 @@ class ValidateUnrealMeshTriangulated(pyblish.api.InstancePlugin, hosts = ["maya"] families = ["staticMesh"] label = "Mesh is Triangulated" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] active = False @classmethod diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_unreal_staticmesh_naming.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_staticmesh_naming.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/validate_unreal_staticmesh_naming.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_staticmesh_naming.py index 88b0ff0e71..eff980843e 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_unreal_staticmesh_naming.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_staticmesh_naming.py @@ -4,7 +4,7 @@ import re import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, @@ -58,7 +58,7 @@ class ValidateUnrealStaticMeshName(pyblish.api.InstancePlugin, hosts = ["maya"] families = ["staticMesh"] label = "Unreal Static Mesh Name" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] regex_mesh = r"(?P.*))" regex_collision = r"(?P.*)" diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_unreal_up_axis.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_up_axis.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_unreal_up_axis.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_up_axis.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_visible_only.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_visible_only.py similarity index 91% rename from client/ayon_core/hosts/maya/plugins/publish/validate_visible_only.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_visible_only.py index 1fdb476dba..4252585324 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_visible_only.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_visible_only.py @@ -1,7 +1,7 @@ import pyblish.api -from ayon_core.hosts.maya.api.lib import iter_visible_nodes_in_range -import ayon_core.hosts.maya.api.action +from ayon_maya.api.lib import iter_visible_nodes_in_range +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError, @@ -21,7 +21,7 @@ class ValidateAlembicVisibleOnly(pyblish.api.InstancePlugin, label = "Alembic Visible Only" hosts = ["maya"] families = ["pointcache", "animation"] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False def process(self, instance): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_vray.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_vray.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_vray.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_vray_distributed_rendering.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_distributed_rendering.py similarity index 98% rename from client/ayon_core/hosts/maya/plugins/publish/validate_vray_distributed_rendering.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_distributed_rendering.py index b3978b8483..76c87f3e8b 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_vray_distributed_rendering.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_distributed_rendering.py @@ -1,7 +1,7 @@ import pyblish.api from maya import cmds -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib from ayon_core.pipeline.publish import ( KnownPublishError, PublishValidationError, diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_vray_referenced_aovs.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_referenced_aovs.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_vray_referenced_aovs.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_referenced_aovs.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_vray_translator_settings.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_translator_settings.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_vray_translator_settings.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_translator_settings.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_vrayproxy.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_vrayproxy_members.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy_members.py similarity index 91% rename from client/ayon_core/hosts/maya/plugins/publish/validate_vrayproxy_members.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy_members.py index 6732d09202..40315a1e40 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_vrayproxy_members.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy_members.py @@ -2,7 +2,7 @@ import pyblish.api from maya import cmds -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin @@ -18,7 +18,7 @@ class ValidateVrayProxyMembers(pyblish.api.InstancePlugin, label = 'VRay Proxy Members' hosts = ['maya'] families = ['vrayproxy'] - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False def process(self, instance): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_xgen.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_xgen.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_xgen.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_xgen.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_yeti_renderscript_callbacks.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_renderscript_callbacks.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_yeti_renderscript_callbacks.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_renderscript_callbacks.py diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_yeti_rig_cache_state.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_cache_state.py similarity index 94% rename from client/ayon_core/hosts/maya/plugins/publish/validate_yeti_rig_cache_state.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_cache_state.py index 84614fc0be..87887b7d36 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_yeti_rig_cache_state.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_cache_state.py @@ -2,7 +2,7 @@ import inspect import pyblish.api import maya.cmds as cmds -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( RepairAction, PublishValidationError, @@ -25,7 +25,7 @@ class ValidateYetiRigCacheState(pyblish.api.InstancePlugin, hosts = ["maya"] families = ["yetiRig"] actions = [RepairAction, - ayon_core.hosts.maya.api.action.SelectInvalidAction] + ayon_maya.api.action.SelectInvalidAction] optional = False def process(self, instance): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_yeti_rig_input_in_instance.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_input_in_instance.py similarity index 93% rename from client/ayon_core/hosts/maya/plugins/publish/validate_yeti_rig_input_in_instance.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_input_in_instance.py index 77e189e37b..59a6867c17 100644 --- a/client/ayon_core/hosts/maya/plugins/publish/validate_yeti_rig_input_in_instance.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_input_in_instance.py @@ -2,7 +2,7 @@ from maya import cmds import pyblish.api -import ayon_core.hosts.maya.api.action +import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError, @@ -18,7 +18,7 @@ class ValidateYetiRigInputShapesInInstance(pyblish.api.InstancePlugin, hosts = ["maya"] families = ["yetiRig"] label = "Yeti Rig Input Shapes In Instance" - actions = [ayon_core.hosts.maya.api.action.SelectInvalidAction] + actions = [ayon_maya.api.action.SelectInvalidAction] optional = False def process(self, instance): diff --git a/client/ayon_core/hosts/maya/plugins/publish/validate_yeti_rig_settings.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_settings.py similarity index 100% rename from client/ayon_core/hosts/maya/plugins/publish/validate_yeti_rig_settings.py rename to server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_settings.py diff --git a/client/ayon_core/hosts/maya/plugins/workfile_build/load_placeholder.py b/server_addon/maya/client/ayon_maya/plugins/workfile_build/load_placeholder.py similarity index 97% rename from client/ayon_core/hosts/maya/plugins/workfile_build/load_placeholder.py rename to server_addon/maya/client/ayon_maya/plugins/workfile_build/load_placeholder.py index b07c7e9a70..6cf38e591a 100644 --- a/client/ayon_core/hosts/maya/plugins/workfile_build/load_placeholder.py +++ b/server_addon/maya/client/ayon_maya/plugins/workfile_build/load_placeholder.py @@ -4,12 +4,12 @@ from ayon_core.pipeline.workfile.workfile_template_builder import ( PlaceholderLoadMixin, LoadPlaceholderItem ) -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( get_container_transforms, get_node_parent, get_node_index_under_parent ) -from ayon_core.hosts.maya.api.workfile_template_builder import ( +from ayon_maya.api.workfile_template_builder import ( MayaPlaceholderPlugin, ) diff --git a/client/ayon_core/hosts/maya/plugins/workfile_build/script_placeholder.py b/server_addon/maya/client/ayon_maya/plugins/workfile_build/script_placeholder.py similarity index 99% rename from client/ayon_core/hosts/maya/plugins/workfile_build/script_placeholder.py rename to server_addon/maya/client/ayon_maya/plugins/workfile_build/script_placeholder.py index 62e10ba023..ff54306220 100644 --- a/client/ayon_core/hosts/maya/plugins/workfile_build/script_placeholder.py +++ b/server_addon/maya/client/ayon_maya/plugins/workfile_build/script_placeholder.py @@ -1,6 +1,6 @@ from maya import cmds -from ayon_core.hosts.maya.api.workfile_template_builder import ( +from ayon_maya.api.workfile_template_builder import ( MayaPlaceholderPlugin ) from ayon_core.lib import NumberDef, TextDef, EnumDef diff --git a/client/ayon_core/hosts/maya/startup/userSetup.py b/server_addon/maya/client/ayon_maya/startup/userSetup.py similarity index 96% rename from client/ayon_core/hosts/maya/startup/userSetup.py rename to server_addon/maya/client/ayon_maya/startup/userSetup.py index 3112e2bf12..600864fd2b 100644 --- a/client/ayon_core/hosts/maya/startup/userSetup.py +++ b/server_addon/maya/client/ayon_maya/startup/userSetup.py @@ -2,7 +2,7 @@ import os from ayon_core.settings import get_project_settings from ayon_core.pipeline import install_host, get_current_project_name -from ayon_core.hosts.maya.api import MayaHost +from ayon_maya.api import MayaHost from maya import cmds diff --git a/client/ayon_core/hosts/maya/tools/__init__.py b/server_addon/maya/client/ayon_maya/tools/__init__.py similarity index 100% rename from client/ayon_core/hosts/maya/tools/__init__.py rename to server_addon/maya/client/ayon_maya/tools/__init__.py diff --git a/client/ayon_core/hosts/maya/tools/mayalookassigner/LICENSE b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/LICENSE similarity index 100% rename from client/ayon_core/hosts/maya/tools/mayalookassigner/LICENSE rename to server_addon/maya/client/ayon_maya/tools/mayalookassigner/LICENSE diff --git a/client/ayon_core/hosts/maya/tools/mayalookassigner/__init__.py b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/__init__.py similarity index 100% rename from client/ayon_core/hosts/maya/tools/mayalookassigner/__init__.py rename to server_addon/maya/client/ayon_maya/tools/mayalookassigner/__init__.py diff --git a/client/ayon_core/hosts/maya/tools/mayalookassigner/alembic.py b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/alembic.py similarity index 100% rename from client/ayon_core/hosts/maya/tools/mayalookassigner/alembic.py rename to server_addon/maya/client/ayon_maya/tools/mayalookassigner/alembic.py diff --git a/client/ayon_core/hosts/maya/tools/mayalookassigner/app.py b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/app.py similarity index 99% rename from client/ayon_core/hosts/maya/tools/mayalookassigner/app.py rename to server_addon/maya/client/ayon_maya/tools/mayalookassigner/app.py index 44d8dfda21..2937b72934 100644 --- a/client/ayon_core/hosts/maya/tools/mayalookassigner/app.py +++ b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/app.py @@ -8,7 +8,7 @@ from qtpy import QtWidgets, QtCore from ayon_core import style from ayon_core.pipeline import get_current_project_name from ayon_core.tools.utils.lib import qt_app_context -from ayon_core.hosts.maya.api.lib import ( +from ayon_maya.api.lib import ( assign_look_by_version, get_main_window ) diff --git a/client/ayon_core/hosts/maya/tools/mayalookassigner/arnold_standin.py b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/arnold_standin.py similarity index 99% rename from client/ayon_core/hosts/maya/tools/mayalookassigner/arnold_standin.py rename to server_addon/maya/client/ayon_maya/tools/mayalookassigner/arnold_standin.py index a20880dffc..c285b857c7 100644 --- a/client/ayon_core/hosts/maya/tools/mayalookassigner/arnold_standin.py +++ b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/arnold_standin.py @@ -7,7 +7,7 @@ from maya import cmds import ayon_api from ayon_core.pipeline import get_current_project_name -from ayon_core.hosts.maya import api +from ayon_maya import api from . import lib from .alembic import get_alembic_ids_cache diff --git a/client/ayon_core/hosts/maya/tools/mayalookassigner/commands.py b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/commands.py similarity index 99% rename from client/ayon_core/hosts/maya/tools/mayalookassigner/commands.py rename to server_addon/maya/client/ayon_maya/tools/mayalookassigner/commands.py index ad43a24385..54b1cff740 100644 --- a/client/ayon_core/hosts/maya/tools/mayalookassigner/commands.py +++ b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/commands.py @@ -10,7 +10,7 @@ from ayon_core.pipeline import ( registered_host, get_current_project_name, ) -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib from .vray_proxies import get_alembic_ids_cache from . import arnold_standin diff --git a/client/ayon_core/hosts/maya/tools/mayalookassigner/lib.py b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/lib.py similarity index 98% rename from client/ayon_core/hosts/maya/tools/mayalookassigner/lib.py rename to server_addon/maya/client/ayon_maya/tools/mayalookassigner/lib.py index 78fded12a9..5417db26bc 100644 --- a/client/ayon_core/hosts/maya/tools/mayalookassigner/lib.py +++ b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/lib.py @@ -11,7 +11,7 @@ from ayon_core.pipeline import ( loaders_from_representation, load_container ) -from ayon_core.hosts.maya.api import lib +from ayon_maya.api import lib log = logging.getLogger(__name__) diff --git a/client/ayon_core/hosts/maya/tools/mayalookassigner/models.py b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/models.py similarity index 100% rename from client/ayon_core/hosts/maya/tools/mayalookassigner/models.py rename to server_addon/maya/client/ayon_maya/tools/mayalookassigner/models.py diff --git a/client/ayon_core/hosts/maya/tools/mayalookassigner/usd.py b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/usd.py similarity index 100% rename from client/ayon_core/hosts/maya/tools/mayalookassigner/usd.py rename to server_addon/maya/client/ayon_maya/tools/mayalookassigner/usd.py diff --git a/client/ayon_core/hosts/maya/tools/mayalookassigner/views.py b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/views.py similarity index 100% rename from client/ayon_core/hosts/maya/tools/mayalookassigner/views.py rename to server_addon/maya/client/ayon_maya/tools/mayalookassigner/views.py diff --git a/client/ayon_core/hosts/maya/tools/mayalookassigner/vray_proxies.py b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/vray_proxies.py similarity index 98% rename from client/ayon_core/hosts/maya/tools/mayalookassigner/vray_proxies.py rename to server_addon/maya/client/ayon_maya/tools/mayalookassigner/vray_proxies.py index c1d9f019e4..6b451abb9a 100644 --- a/client/ayon_core/hosts/maya/tools/mayalookassigner/vray_proxies.py +++ b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/vray_proxies.py @@ -7,7 +7,7 @@ from maya import cmds import ayon_api from ayon_core.pipeline import get_current_project_name -import ayon_core.hosts.maya.api.lib as maya_lib +import ayon_maya.api.lib as maya_lib from . import lib from .alembic import get_alembic_ids_cache diff --git a/client/ayon_core/hosts/maya/tools/mayalookassigner/widgets.py b/server_addon/maya/client/ayon_maya/tools/mayalookassigner/widgets.py similarity index 100% rename from client/ayon_core/hosts/maya/tools/mayalookassigner/widgets.py rename to server_addon/maya/client/ayon_maya/tools/mayalookassigner/widgets.py diff --git a/client/ayon_core/hosts/maya/vendor/python/capture.py b/server_addon/maya/client/ayon_maya/vendor/python/capture.py similarity index 100% rename from client/ayon_core/hosts/maya/vendor/python/capture.py rename to server_addon/maya/client/ayon_maya/vendor/python/capture.py diff --git a/server_addon/maya/package.py b/server_addon/maya/package.py index 4537c23eaa..274f74869b 100644 --- a/server_addon/maya/package.py +++ b/server_addon/maya/package.py @@ -1,3 +1,7 @@ name = "maya" title = "Maya" -version = "0.1.20" +version = "0.2.0" + +ayon_required_addons = { + "core": ">0.3.2", +} From 3b2901772ed464ae0ae84e658c2ae0d07126c8c0 Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Mon, 27 May 2024 22:10:57 +0800 Subject: [PATCH 17/67] remove unused version.py in the client folder --- .../substancepainter/client/ayon_substancepainter/version.py | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 server_addon/substancepainter/client/ayon_substancepainter/version.py diff --git a/server_addon/substancepainter/client/ayon_substancepainter/version.py b/server_addon/substancepainter/client/ayon_substancepainter/version.py deleted file mode 100644 index b4293649fe..0000000000 --- a/server_addon/substancepainter/client/ayon_substancepainter/version.py +++ /dev/null @@ -1,3 +0,0 @@ -# -*- coding: utf-8 -*- -"""Package declaring AYON core addon version.""" -__version__ = "0.2.0" From 2e120020fafcb3e9bb76f0705f6f240b9663291c Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Wed, 29 May 2024 18:55:39 +0800 Subject: [PATCH 18/67] use ayon_substancepainter as import --- .../ayon_substancepainter/plugins/create/create_workfile.py | 2 +- .../ayon_substancepainter/plugins/publish/extract_textures.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py index b100e4189d..0bf451f0e2 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py @@ -16,7 +16,7 @@ import substance_painter.project class CreateWorkfile(AutoCreator): """Workfile auto-creator.""" - identifier = "io.openpype.creators.substancepainter.workfile" + identifier = "io.ayon.creators.substancepainter.workfile" label = "Workfile" product_type = "workfile" icon = "document" diff --git a/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/extract_textures.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/extract_textures.py index 361ad788ca..52212922ae 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/extract_textures.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/plugins/publish/extract_textures.py @@ -1,6 +1,6 @@ import substance_painter.export from ayon_core.pipeline import KnownPublishError, publish -from ayon_core.hosts.substancepainter.api.lib import set_layer_stack_opacity +from ayon_substancepainter.api.lib import set_layer_stack_opacity class ExtractTextures(publish.Extractor, From e598e5fef355ec6bce62504c66b01917a9f07415 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 29 May 2024 14:57:00 +0200 Subject: [PATCH 19/67] refactor of scene inventory view --- .../ayon_core/tools/sceneinventory/control.py | 34 +- .../tools/sceneinventory/delegates.py | 112 +-- .../ayon_core/tools/sceneinventory/model.py | 780 +++++++---------- .../tools/sceneinventory/models/__init__.py | 2 + .../tools/sceneinventory/models/containers.py | 343 ++++++++ client/ayon_core/tools/sceneinventory/view.py | 782 ++++++++++-------- .../ayon_core/tools/sceneinventory/window.py | 103 +-- client/ayon_core/tools/utils/lib.py | 17 +- 8 files changed, 1146 insertions(+), 1027 deletions(-) create mode 100644 client/ayon_core/tools/sceneinventory/models/containers.py diff --git a/client/ayon_core/tools/sceneinventory/control.py b/client/ayon_core/tools/sceneinventory/control.py index 592113455c..c564b5a992 100644 --- a/client/ayon_core/tools/sceneinventory/control.py +++ b/client/ayon_core/tools/sceneinventory/control.py @@ -1,14 +1,14 @@ import ayon_api from ayon_core.lib.events import QueuedEventSystem -from ayon_core.host import ILoadHost +from ayon_core.host import HostBase, ILoadHost from ayon_core.pipeline import ( registered_host, get_current_context, ) from ayon_core.tools.common_models import HierarchyModel -from .models import SiteSyncModel +from .models import SiteSyncModel, ContainersModel class SceneInventoryController: @@ -28,11 +28,15 @@ class SceneInventoryController: self._current_folder_id = None self._current_folder_set = False + self._containers_model = ContainersModel(self) self._sitesync_model = SiteSyncModel(self) # Switch dialog requirements self._hierarchy_model = HierarchyModel(self) self._event_system = self._create_event_system() + def get_host(self) -> HostBase: + return self._host + def emit_event(self, topic, data=None, source=None): if data is None: data = {} @@ -47,6 +51,7 @@ class SceneInventoryController: self._current_folder_id = None self._current_folder_set = False + self._containers_model.reset() self._sitesync_model.reset() self._hierarchy_model.reset() @@ -80,13 +85,26 @@ class SceneInventoryController: self._current_folder_set = True return self._current_folder_id + # Containers methods def get_containers(self): - host = self._host - if isinstance(host, ILoadHost): - return list(host.get_containers()) - elif hasattr(host, "ls"): - return list(host.ls()) - return [] + return self._containers_model.get_containers() + + def get_containers_by_item_ids(self, item_ids): + return self._containers_model.get_containers_by_item_ids(item_ids) + + def get_container_items(self): + return self._containers_model.get_container_items() + + def get_container_items_by_id(self, item_ids): + return self._containers_model.get_container_items_by_id(item_ids) + + def get_representation_info_items(self, representation_ids): + return self._containers_model.get_representation_info_items( + representation_ids + ) + + def get_version_items(self, product_ids): + return self._containers_model.get_version_items(product_ids) # Site Sync methods def is_sitesync_enabled(self): diff --git a/client/ayon_core/tools/sceneinventory/delegates.py b/client/ayon_core/tools/sceneinventory/delegates.py index 2126fa1cbe..6f91587613 100644 --- a/client/ayon_core/tools/sceneinventory/delegates.py +++ b/client/ayon_core/tools/sceneinventory/delegates.py @@ -1,38 +1,10 @@ -import numbers - -import ayon_api - -from ayon_core.pipeline import HeroVersionType -from ayon_core.tools.utils.models import TreeModel -from ayon_core.tools.utils.lib import format_version - from qtpy import QtWidgets, QtCore, QtGui +from .model import VERSION_LABEL_ROLE + class VersionDelegate(QtWidgets.QStyledItemDelegate): """A delegate that display version integer formatted as version string.""" - - version_changed = QtCore.Signal() - first_run = False - lock = False - - def __init__(self, controller, *args, **kwargs): - self._controller = controller - super(VersionDelegate, self).__init__(*args, **kwargs) - - def get_project_name(self): - return self._controller.get_current_project_name() - - def displayText(self, value, locale): - if isinstance(value, HeroVersionType): - return format_version(value) - if not isinstance(value, numbers.Integral): - # For cases where no version is resolved like NOT FOUND cases - # where a representation might not exist in current database - return - - return format_version(value) - def paint(self, painter, option, index): fg_color = index.data(QtCore.Qt.ForegroundRole) if fg_color: @@ -44,7 +16,7 @@ class VersionDelegate(QtWidgets.QStyledItemDelegate): fg_color = None if not fg_color: - return super(VersionDelegate, self).paint(painter, option, index) + return super().paint(painter, option, index) if option.widget: style = option.widget.style() @@ -60,9 +32,7 @@ class VersionDelegate(QtWidgets.QStyledItemDelegate): painter.save() - text = self.displayText( - index.data(QtCore.Qt.DisplayRole), option.locale - ) + text = index.data(VERSION_LABEL_ROLE) pen = painter.pen() pen.setColor(fg_color) painter.setPen(pen) @@ -82,77 +52,3 @@ class VersionDelegate(QtWidgets.QStyledItemDelegate): ) painter.restore() - - def createEditor(self, parent, option, index): - item = index.data(TreeModel.ItemRole) - if item.get("isGroup") or item.get("isMerged"): - return - - editor = QtWidgets.QComboBox(parent) - - def commit_data(): - if not self.first_run: - self.commitData.emit(editor) # Update model data - self.version_changed.emit() # Display model data - editor.currentIndexChanged.connect(commit_data) - - self.first_run = True - self.lock = False - - return editor - - def setEditorData(self, editor, index): - if self.lock: - # Only set editor data once per delegation - return - - editor.clear() - - # Current value of the index - item = index.data(TreeModel.ItemRole) - value = index.data(QtCore.Qt.DisplayRole) - - project_name = self.get_project_name() - # Add all available versions to the editor - product_id = item["version_entity"]["productId"] - version_entities = list(sorted( - ayon_api.get_versions( - project_name, product_ids={product_id}, active=True - ), - key=lambda item: abs(item["version"]) - )) - - selected = None - items = [] - is_hero_version = value < 0 - for version_entity in version_entities: - version = version_entity["version"] - label = format_version(version) - item = QtGui.QStandardItem(label) - item.setData(version_entity, QtCore.Qt.UserRole) - items.append(item) - - if ( - version == value - or is_hero_version and version < 0 - ): - selected = item - - # Reverse items so latest versions be upper - items.reverse() - for item in items: - editor.model().appendRow(item) - - index = 0 - if selected: - index = selected.row() - - # Will trigger index-change signal - editor.setCurrentIndex(index) - self.first_run = False - self.lock = True - - def setModelData(self, editor, model, index): - """Apply the integer version back in the model""" - version = editor.itemData(editor.currentIndex()) - model.setData(index, version["name"]) diff --git a/client/ayon_core/tools/sceneinventory/model.py b/client/ayon_core/tools/sceneinventory/model.py index 330b174218..052bdf3e4e 100644 --- a/client/ayon_core/tools/sceneinventory/model.py +++ b/client/ayon_core/tools/sceneinventory/model.py @@ -1,57 +1,110 @@ import re import logging -import uuid -from collections import defaultdict +import collections -import ayon_api from qtpy import QtCore, QtGui import qtawesome from ayon_core.pipeline import ( - get_current_project_name, HeroVersionType, ) from ayon_core.style import get_default_entity_icon_color from ayon_core.tools.utils import get_qt_icon -from ayon_core.tools.utils.models import TreeModel, Item +from ayon_core.tools.utils.lib import format_version + +ITEM_ID_ROLE = QtCore.Qt.UserRole + 1 +NAME_COLOR_ROLE = QtCore.Qt.UserRole + 2 +COUNT_ROLE = QtCore.Qt.UserRole + 3 +IS_CONTAINER_ITEM_ROLE = QtCore.Qt.UserRole + 4 +VERSION_IS_LATEST_ROLE = QtCore.Qt.UserRole + 5 +VERSION_VALUE_ROLE = QtCore.Qt.UserRole + 6 +VERSION_LABEL_ROLE = QtCore.Qt.UserRole + 7 +VERSION_COLOR_ROLE = QtCore.Qt.UserRole + 8 +STATUS_NAME_ROLE = QtCore.Qt.UserRole + 9 +STATUS_COLOR_ROLE = QtCore.Qt.UserRole + 10 +PRODUCT_ID_ROLE = QtCore.Qt.UserRole + 11 +PRODUCT_TYPE_ROLE = QtCore.Qt.UserRole + 12 +PRODUCT_TYPE_ICON_ROLE = QtCore.Qt.UserRole + 13 +PRODUCT_GROUP_NAME_ROLE = QtCore.Qt.UserRole + 14 +PRODUCT_GROUP_ICON_ROLE = QtCore.Qt.UserRole + 15 +LOADER_NAME_ROLE = QtCore.Qt.UserRole + 16 +OBJECT_NAME_ROLE = QtCore.Qt.UserRole + 17 +ACTIVE_SITE_PROGRESS_ROLE = QtCore.Qt.UserRole + 18 +REMOTE_SITE_PROGRESS_ROLE = QtCore.Qt.UserRole + 19 +ACTIVE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 20 +REMOTE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 21 +# This value hold unique value of container that should be used to identify +# containers inbetween refresh. +ITEM_UNIQUE_NAME_ROLE = QtCore.Qt.UserRole + 22 -def walk_hierarchy(node): - """Recursively yield group node.""" - for child in node.children(): - if child.get("isGroupNode"): - yield child - - for _child in walk_hierarchy(child): - yield _child - - -class InventoryModel(TreeModel): +class InventoryModel(QtGui.QStandardItemModel): """The model for the inventory""" - Columns = [ + column_labels = [ "Name", - "version", - "count", - "productType", - "group", - "loader", - "objectName", - "active_site", - "remote_site", + "Version", + "Count", + "Product type", + "Group", + "Loader", + "Object name", + "Active site", + "Remote site", ] - active_site_col = Columns.index("active_site") - remote_site_col = Columns.index("remote_site") + name_col = column_labels.index("Name") + version_col = column_labels.index("Version") + count_col = column_labels.index("Count") + product_type_col = column_labels.index("Product type") + product_group_col = column_labels.index("Group") + loader_col = column_labels.index("Loader") + object_name_col = column_labels.index("Object name") + active_site_col = column_labels.index("Active site") + remote_site_col = column_labels.index("Remote site") + display_role_by_column = { + name_col: QtCore.Qt.DisplayRole, + version_col: VERSION_LABEL_ROLE, + count_col: COUNT_ROLE, + # 3: STATUS_NAME_ROLE, + product_type_col: PRODUCT_TYPE_ROLE, + product_group_col: PRODUCT_GROUP_NAME_ROLE, + loader_col: LOADER_NAME_ROLE, + object_name_col: OBJECT_NAME_ROLE, + active_site_col: ACTIVE_SITE_PROGRESS_ROLE, + remote_site_col: REMOTE_SITE_PROGRESS_ROLE, + } + decoration_role_by_column = { + name_col: QtCore.Qt.DecorationRole, + product_type_col: PRODUCT_TYPE_ICON_ROLE, + product_group_col: PRODUCT_GROUP_ICON_ROLE, + active_site_col: ACTIVE_SITE_ICON_ROLE, + remote_site_col: REMOTE_SITE_ICON_ROLE, + } + foreground_role_by_column = { + version_col: VERSION_COLOR_ROLE, + name_col: NAME_COLOR_ROLE, + } + width_by_column = { + name_col: 250, + version_col: 55, + count_col: 55, + product_type_col: 150, + product_group_col: 120, + loader_col: 150, + } OUTDATED_COLOR = QtGui.QColor(235, 30, 30) CHILD_OUTDATED_COLOR = QtGui.QColor(200, 160, 30) GRAYOUT_COLOR = QtGui.QColor(160, 160, 160) - UniqueRole = QtCore.Qt.UserRole + 2 # unique label role - def __init__(self, controller, parent=None): - super(InventoryModel, self).__init__(parent) + super().__init__(parent) + + self.setColumnCount(len(self.column_labels)) + for idx, label in enumerate(self.column_labels): + self.setHeaderData(idx, QtCore.Qt.Horizontal, label) + self.log = logging.getLogger(self.__class__.__name__) self._controller = controller @@ -60,103 +113,201 @@ class InventoryModel(TreeModel): self._default_icon_color = get_default_entity_icon_color() - site_icons = self._controller.get_site_provider_icons() - - self._site_icons = { - provider: get_qt_icon(icon_def) - for provider, icon_def in site_icons.items() - } - def outdated(self, item): return item.get("isOutdated", True) + def refresh(self, selected=None): + """Refresh the model""" + # for debugging or testing, injecting items from outside + container_items = self._controller.get_container_items() + + self._clear_items() + + items_by_repre_id = {} + for container_item in container_items: + # if ( + # selected is not None + # and container_item.item_id not in selected + # ): + # continue + repre_id = container_item.representation_id + items = items_by_repre_id.setdefault(repre_id, []) + items.append(container_item) + + repre_id = set(items_by_repre_id.keys()) + repre_info_by_id = self._controller.get_representation_info_items( + repre_id + ) + product_ids = { + repre_info.product_id + for repre_info in repre_info_by_id.values() + } + version_items_by_product_id = self._controller.get_version_items( + product_ids + ) + # SiteSync addon information + progress_by_id = self._controller.get_representations_site_progress( + repre_id + ) + sites_info = self._controller.get_sites_information() + site_icons = { + provider: get_qt_icon(icon_def) + for provider, icon_def in ( + self._controller.get_site_provider_icons().items() + ) + } + + group_item_icon = qtawesome.icon( + "fa.folder", color=self._default_icon_color + ) + valid_item_icon = qtawesome.icon( + "fa.file-o", color=self._default_icon_color + ) + invalid_item_icon = qtawesome.icon( + "fa.exclamation-circle", color=self._default_icon_color + ) + group_icon = qtawesome.icon( + "fa.object-group", color=self._default_icon_color + ) + product_type_icon = qtawesome.icon( + "fa.folder", color="#0091B2" + ) + group_item_font = QtGui.QFont() + group_item_font.setBold(True) + + active_site_icon = site_icons.get(sites_info["active_site_provider"]) + remote_site_icon = site_icons.get(sites_info["remote_site_provider"]) + + root_item = self.invisibleRootItem() + + group_items = [] + for repre_id, container_items in items_by_repre_id.items(): + repre_info = repre_info_by_id[repre_id] + version_label = "N/A" + version_color = None + version_value = None + is_latest = False + if not repre_info.is_valid: + group_name = "< Entity N/A >" + item_icon = invalid_item_icon + + else: + group_name = "{}_{}: ({})".format( + repre_info.folder_path.rsplit("/")[-1], + repre_info.product_name, + repre_info.representation_name + ) + item_icon = valid_item_icon + + version_items = ( + version_items_by_product_id[repre_info.product_id] + ) + version_item = version_items[repre_info.version_id] + version_value = version_item.version + if version_value < 0: + version_value = HeroVersionType(version_value) + version_label = format_version(version_value) + is_latest = version_item.is_latest + if not is_latest: + version_color = self.OUTDATED_COLOR + + container_model_items = [] + for container_item in container_items: + unique_name = ( + repre_info.representation_name + + container_item.object_name or "" + ) + + item = QtGui.QStandardItem() + item.setColumnCount(root_item.columnCount()) + item.setData(container_item.namespace, QtCore.Qt.DisplayRole) + item.setData(self.GRAYOUT_COLOR, NAME_COLOR_ROLE) + item.setData(self.GRAYOUT_COLOR, VERSION_COLOR_ROLE) + item.setData(item_icon, QtCore.Qt.DecorationRole) + item.setData(repre_info.product_id, PRODUCT_ID_ROLE) + item.setData(container_item.item_id, ITEM_ID_ROLE) + item.setData(version_value, VERSION_VALUE_ROLE) + item.setData(version_label, VERSION_LABEL_ROLE) + item.setData(True, IS_CONTAINER_ITEM_ROLE) + item.setData(unique_name, ITEM_UNIQUE_NAME_ROLE) + container_model_items.append(item) + + if not container_model_items: + continue + + progress = progress_by_id[repre_id] + active_site_progress = "{}%".format( + max(progress["active_site"], 0) * 100 + ) + remote_site_progress = "{}%".format( + max(progress["remote_site"], 0) * 100 + ) + + group_item = QtGui.QStandardItem() + group_item.setColumnCount(root_item.columnCount()) + group_item.setData(group_name, QtCore.Qt.DisplayRole) + group_item.setData(group_name, ITEM_UNIQUE_NAME_ROLE) + group_item.setData(group_item_icon, QtCore.Qt.DecorationRole) + group_item.setData(group_item_font, QtCore.Qt.FontRole) + group_item.setData(repre_info.product_id, PRODUCT_ID_ROLE) + group_item.setData(repre_info.product_type, PRODUCT_TYPE_ROLE) + group_item.setData(product_type_icon, PRODUCT_TYPE_ICON_ROLE) + group_item.setData(is_latest, VERSION_IS_LATEST_ROLE) + group_item.setData(version_label, VERSION_LABEL_ROLE) + group_item.setData(len(container_items), COUNT_ROLE) + group_item.setData( + active_site_progress, ACTIVE_SITE_PROGRESS_ROLE + ) + group_item.setData( + remote_site_progress, REMOTE_SITE_PROGRESS_ROLE + ) + group_item.setData(active_site_icon, ACTIVE_SITE_ICON_ROLE) + group_item.setData(remote_site_icon, REMOTE_SITE_ICON_ROLE) + group_item.setData(False, IS_CONTAINER_ITEM_ROLE) + + if version_color is not None: + group_item.setData(version_color, VERSION_COLOR_ROLE) + + if repre_info.product_group: + group_item.setData( + repre_info.product_group, PRODUCT_GROUP_NAME_ROLE + ) + group_item.setData(group_icon, PRODUCT_GROUP_ICON_ROLE) + + group_item.appendRows(container_model_items) + group_items.append(group_item) + + if group_items: + root_item.appendRows(group_items) + + def flags(self, index): + return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable + def data(self, index, role): if not index.isValid(): return - item = index.internalPointer() + col = index.column() + if role == QtCore.Qt.DisplayRole: + role = self.display_role_by_column.get(col) + if role is None: + print(col, role) + return None - if role == QtCore.Qt.FontRole: - # Make top-level entries bold - if item.get("isGroupNode") or item.get("isNotSet"): # group-item - font = QtGui.QFont() - font.setBold(True) - return font + elif role == QtCore.Qt.DecorationRole: + role = self.decoration_role_by_column.get(col) + if role is None: + return None - if role == QtCore.Qt.ForegroundRole: - # Set the text color to the OUTDATED_COLOR when the - # collected version is not the same as the highest version - key = self.Columns[index.column()] - if key == "version": # version - if item.get("isGroupNode"): # group-item - if self.outdated(item): - return self.OUTDATED_COLOR + elif role == QtCore.Qt.ForegroundRole: + role = self.foreground_role_by_column.get(col) + if role is None: + return None - if self._hierarchy_view: - # If current group is not outdated, check if any - # outdated children. - for _node in walk_hierarchy(item): - if self.outdated(_node): - return self.CHILD_OUTDATED_COLOR - else: + if col != 0: + index = self.index(index.row(), 0, index.parent()) - if self._hierarchy_view: - # Although this is not a group item, we still need - # to distinguish which one contain outdated child. - for _node in walk_hierarchy(item): - if self.outdated(_node): - return self.CHILD_OUTDATED_COLOR.darker(150) - - return self.GRAYOUT_COLOR - - if key == "Name" and not item.get("isGroupNode"): - return self.GRAYOUT_COLOR - - # Add icons - if role == QtCore.Qt.DecorationRole: - if index.column() == 0: - # Override color - color = item.get("color", self._default_icon_color) - if item.get("isGroupNode"): # group-item - return qtawesome.icon("fa.folder", color=color) - if item.get("isNotSet"): - return qtawesome.icon("fa.exclamation-circle", color=color) - - return qtawesome.icon("fa.file-o", color=color) - - if index.column() == 3: - # Product type icon - return item.get("productTypeIcon", None) - - column_name = self.Columns[index.column()] - - if column_name == "group" and item.get("group"): - return qtawesome.icon("fa.object-group", - color=get_default_entity_icon_color()) - - if item.get("isGroupNode"): - if column_name == "active_site": - provider = item.get("active_site_provider") - return self._site_icons.get(provider) - - if column_name == "remote_site": - provider = item.get("remote_site_provider") - return self._site_icons.get(provider) - - if role == QtCore.Qt.DisplayRole and item.get("isGroupNode"): - column_name = self.Columns[index.column()] - progress = None - if column_name == "active_site": - progress = item.get("active_site_progress", 0) - elif column_name == "remote_site": - progress = item.get("remote_site_progress", 0) - if progress is not None: - return "{}%".format(max(progress, 0) * 100) - - if role == self.UniqueRole: - return item["representation"] + item.get("objectName", "") - - return super(InventoryModel, self).data(index, role) + return super().data(index, role) def set_hierarchy_view(self, state): """Set whether to display products in hierarchy view.""" @@ -165,299 +316,21 @@ class InventoryModel(TreeModel): if state != self._hierarchy_view: self._hierarchy_view = state - def refresh(self, selected=None, containers=None): - """Refresh the model""" + def get_outdated_item_ids(self): + return set() - # for debugging or testing, injecting items from outside - if containers is None: - containers = self._controller.get_containers() - - self.clear() - if not selected or not self._hierarchy_view: - self._add_containers(containers) - return - - # Filter by cherry-picked items - self._add_containers(( - container - for container in containers - if container["objectName"] in selected - )) - - def _add_containers(self, containers, parent=None): - """Add the items to the model. - - The items should be formatted similar to `api.ls()` returns, an item - is then represented as: - {"filename_v001.ma": [full/filename/of/loaded/filename_v001.ma, - full/filename/of/loaded/filename_v001.ma], - "nodetype" : "reference", - "node": "referenceNode1"} - - Note: When performing an additional call to `add_items` it will *not* - group the new items with previously existing item groups of the - same type. - - Args: - containers (generator): Container items. - parent (Item, optional): Set this item as parent for the added - items when provided. Defaults to the root of the model. - - Returns: - node.Item: root node which has children added based on the data - """ - - project_name = get_current_project_name() - - self.beginResetModel() - - # Group by representation - grouped = defaultdict(lambda: {"containers": list()}) - for container in containers: - repre_id = container["representation"] - grouped[repre_id]["containers"].append(container) - - ( - repres_by_id, - versions_by_id, - products_by_id, - folders_by_id, - ) = self._query_entities(project_name, set(grouped.keys())) - # Add to model - not_found = defaultdict(list) - not_found_ids = [] - for repre_id, group_dict in sorted(grouped.items()): - group_containers = group_dict["containers"] - representation = repres_by_id.get(repre_id) - if not representation: - not_found["representation"].extend(group_containers) - not_found_ids.append(repre_id) - continue - - version_entity = versions_by_id.get(representation["versionId"]) - if not version_entity: - not_found["version"].extend(group_containers) - not_found_ids.append(repre_id) - continue - - product_entity = products_by_id.get(version_entity["productId"]) - if not product_entity: - not_found["product"].extend(group_containers) - not_found_ids.append(repre_id) - continue - - folder_entity = folders_by_id.get(product_entity["folderId"]) - if not folder_entity: - not_found["folder"].extend(group_containers) - not_found_ids.append(repre_id) - continue - - group_dict.update({ - "representation": representation, - "version": version_entity, - "product": product_entity, - "folder": folder_entity - }) - - for _repre_id in not_found_ids: - grouped.pop(_repre_id) - - for where, group_containers in not_found.items(): - # create the group header - group_node = Item() - name = "< NOT FOUND - {} >".format(where) - group_node["Name"] = name - group_node["representation"] = name - group_node["count"] = len(group_containers) - group_node["isGroupNode"] = False - group_node["isNotSet"] = True - - self.add_child(group_node, parent=parent) - - for container in group_containers: - item_node = Item() - item_node.update(container) - item_node["Name"] = container.get("objectName", "NO NAME") - item_node["isNotFound"] = True - self.add_child(item_node, parent=group_node) - - # TODO Use product icons - product_type_icon = qtawesome.icon( - "fa.folder", color="#0091B2" - ) - # Prepare site sync specific data - progress_by_id = self._controller.get_representations_site_progress( - set(grouped.keys()) - ) - sites_info = self._controller.get_sites_information() - - # Query the highest available version so the model can know - # whether current version is currently up-to-date. - highest_version_by_product_id = ayon_api.get_last_versions( - project_name, - product_ids={ - group["version"]["productId"] for group in grouped.values() - }, - fields={"productId", "version"} - ) - # Map value to `version` key - highest_version_by_product_id = { - product_id: version["version"] - for product_id, version in highest_version_by_product_id.items() - } - - for repre_id, group_dict in sorted(grouped.items()): - group_containers = group_dict["containers"] - repre_entity = group_dict["representation"] - version_entity = group_dict["version"] - folder_entity = group_dict["folder"] - product_entity = group_dict["product"] - - product_type = product_entity["productType"] - - # create the group header - group_node = Item() - group_node["Name"] = "{}_{}: ({})".format( - folder_entity["name"], - product_entity["name"], - repre_entity["name"] - ) - group_node["representation"] = repre_id - - # Detect hero version type - version = version_entity["version"] - if version < 0: - version = HeroVersionType(version) - group_node["version"] = version - - # Check if the version is outdated. - # Hero versions are never considered to be outdated. - is_outdated = False - if not isinstance(version, HeroVersionType): - last_version = highest_version_by_product_id.get( - version_entity["productId"]) - if last_version is not None: - is_outdated = version_entity["version"] != last_version - group_node["isOutdated"] = is_outdated - - group_node["productType"] = product_type or "" - group_node["productTypeIcon"] = product_type_icon - group_node["count"] = len(group_containers) - group_node["isGroupNode"] = True - group_node["group"] = product_entity["attrib"].get("productGroup") - - # Site sync specific data - progress = progress_by_id[repre_id] - group_node.update(sites_info) - group_node["active_site_progress"] = progress["active_site"] - group_node["remote_site_progress"] = progress["remote_site"] - - self.add_child(group_node, parent=parent) - - for container in group_containers: - item_node = Item() - item_node.update(container) - - # store the current version on the item - item_node["version"] = version_entity["version"] - item_node["version_entity"] = version_entity - - # Remapping namespace to item name. - # Noted that the name key is capital "N", by doing this, we - # can view namespace in GUI without changing container data. - item_node["Name"] = container["namespace"] - - self.add_child(item_node, parent=group_node) - - self.endResetModel() - - return self._root_item - - def _query_entities(self, project_name, repre_ids): - """Query entities for representations from containers. - - Returns: - tuple[dict, dict, dict, dict]: Representation, version, product - and folder documents by id. - """ - - repres_by_id = {} - versions_by_id = {} - products_by_id = {} - folders_by_id = {} - output = ( - repres_by_id, - versions_by_id, - products_by_id, - folders_by_id, - ) - - filtered_repre_ids = set() - for repre_id in repre_ids: - # Filter out invalid representation ids - # NOTE: This is added because scenes from OpenPype did contain - # ObjectId from mongo. - try: - uuid.UUID(repre_id) - filtered_repre_ids.add(repre_id) - except ValueError: - continue - if not filtered_repre_ids: - return output - - repre_entities = ayon_api.get_representations(project_name, repre_ids) - repres_by_id.update({ - repre_entity["id"]: repre_entity - for repre_entity in repre_entities - }) - version_ids = { - repre_entity["versionId"] - for repre_entity in repres_by_id.values() - } - if not version_ids: - return output - - versions_by_id.update({ - version_entity["id"]: version_entity - for version_entity in ayon_api.get_versions( - project_name, version_ids=version_ids - ) - }) - - product_ids = { - version_entity["productId"] - for version_entity in versions_by_id.values() - } - if not product_ids: - return output - - products_by_id.update({ - product_entity["id"]: product_entity - for product_entity in ayon_api.get_products( - project_name, product_ids=product_ids - ) - }) - folder_ids = { - product_entity["folderId"] - for product_entity in products_by_id.values() - } - if not folder_ids: - return output - - folders_by_id.update({ - folder_entity["id"]: folder_entity - for folder_entity in ayon_api.get_folders( - project_name, folder_ids=folder_ids - ) - }) - return output + def _clear_items(self): + root_item = self.invisibleRootItem() + root_item.removeRows(0, root_item.rowCount()) class FilterProxyModel(QtCore.QSortFilterProxyModel): """Filter model to where key column's value is in the filtered tags""" def __init__(self, *args, **kwargs): - super(FilterProxyModel, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) + self.setDynamicSortFilter(True) + self.setFilterCaseSensitivity(QtCore.Qt.CaseInsensitive) self._filter_outdated = False self._hierarchy_view = False @@ -467,28 +340,23 @@ class FilterProxyModel(QtCore.QSortFilterProxyModel): # Always allow bottom entries (individual containers), since their # parent group hidden if it wouldn't have been validated. - rows = model.rowCount(source_index) - if not rows: + if source_index.data(IS_CONTAINER_ITEM_ROLE): return True - # Filter by regex - if hasattr(self, "filterRegExp"): - regex = self.filterRegExp() - else: - regex = self.filterRegularExpression() - pattern = regex.pattern() - if pattern: - pattern = re.escape(pattern) - - if not self._matches(row, parent, pattern): - return False - if self._filter_outdated: # When filtering to outdated we filter the up to date entries # thus we "allow" them when they are outdated - if not self._is_outdated(row, parent): + if source_index.data(VERSION_IS_LATEST_ROLE): return False + # Filter by regex + if hasattr(self, "filterRegularExpression"): + regex = self.filterRegularExpression() + else: + regex = self.filterRegExp() + + if not self._matches(row, parent, regex.pattern()): + return False return True def set_filter_outdated(self, state): @@ -505,37 +373,6 @@ class FilterProxyModel(QtCore.QSortFilterProxyModel): if state != self._hierarchy_view: self._hierarchy_view = state - def _is_outdated(self, row, parent): - """Return whether row is outdated. - - A row is considered outdated if `isOutdated` data is true or not set. - - """ - def outdated(node): - return node.get("isOutdated", True) - - index = self.sourceModel().index(row, self.filterKeyColumn(), parent) - - # The scene contents are grouped by "representation", e.g. the same - # "representation" loaded twice is grouped under the same header. - # Since the version check filters these parent groups we skip that - # check for the individual children. - has_parent = index.parent().isValid() - if has_parent and not self._hierarchy_view: - return True - - # Filter to those that have the different version numbers - node = index.internalPointer() - if outdated(node): - return True - - if self._hierarchy_view: - for _node in walk_hierarchy(node): - if outdated(_node): - return True - - return False - def _matches(self, row, parent, pattern): """Return whether row matches regex pattern. @@ -548,38 +385,31 @@ class FilterProxyModel(QtCore.QSortFilterProxyModel): bool """ + if not pattern: + return True + + flags = 0 + if self.sortCaseSensitivity() == QtCore.Qt.CaseInsensitive: + flags = re.IGNORECASE + + regex = re.compile(re.escape(pattern), flags=flags) + model = self.sourceModel() column = self.filterKeyColumn() role = self.filterRole() - def matches(row, parent, pattern): + matches_queue = collections.deque() + matches_queue.append((row, parent)) + while matches_queue: + queue_item = matches_queue.popleft() + row, parent = queue_item + index = model.index(row, column, parent) - key = model.data(index, role) - if re.search(pattern, key, re.IGNORECASE): + value = model.data(index, role) + if regex.search(value): return True - if matches(row, parent, pattern): - return True + for idx in range(model.rowCount(index)): + matches_queue.append((idx, index)) - # Also allow if any of the children matches - source_index = model.index(row, column, parent) - rows = model.rowCount(source_index) - - if any( - matches(idx, source_index, pattern) - for idx in range(rows) - ): - return True - - if not self._hierarchy_view: - return False - - for idx in range(rows): - child_index = model.index(idx, column, source_index) - child_rows = model.rowCount(child_index) - return any( - self._matches(child_idx, child_index, pattern) - for child_idx in range(child_rows) - ) - - return True + return False diff --git a/client/ayon_core/tools/sceneinventory/models/__init__.py b/client/ayon_core/tools/sceneinventory/models/__init__.py index f840a45aa8..28bc7be4d4 100644 --- a/client/ayon_core/tools/sceneinventory/models/__init__.py +++ b/client/ayon_core/tools/sceneinventory/models/__init__.py @@ -1,6 +1,8 @@ +from .containers import ContainersModel from .sitesync import SiteSyncModel __all__ = ( + "ContainersModel", "SiteSyncModel", ) diff --git a/client/ayon_core/tools/sceneinventory/models/containers.py b/client/ayon_core/tools/sceneinventory/models/containers.py new file mode 100644 index 0000000000..5230827ef6 --- /dev/null +++ b/client/ayon_core/tools/sceneinventory/models/containers.py @@ -0,0 +1,343 @@ +import uuid +import collections + +import ayon_api +from ayon_api.graphql import GraphQlQuery +from ayon_core.host import ILoadHost + + +# --- Implementation that should be in ayon-python-api --- +# The implementation is not available in all versions of ayon-python-api. +RepresentationHierarchy = collections.namedtuple( + "RepresentationHierarchy", + ("folder", "product", "version", "representation") +) + + +def representations_parent_ids_qraphql_query(): + query = GraphQlQuery("RepresentationsHierarchyQuery") + + project_name_var = query.add_variable("projectName", "String!") + repre_ids_var = query.add_variable("representationIds", "[String!]") + + project_field = query.add_field("project") + project_field.set_filter("name", project_name_var) + + repres_field = project_field.add_field_with_edges("representations") + repres_field.add_field("id") + repres_field.add_field("name") + repres_field.set_filter("ids", repre_ids_var) + version_field = repres_field.add_field("version") + version_field.add_field("id") + product_field = version_field.add_field("product") + product_field.add_field("id") + product_field.add_field("name") + product_field.add_field("productType") + product_attrib_field = product_field.add_field("attrib") + product_attrib_field.add_field("productGroup") + folder_field = product_field.add_field("folder") + folder_field.add_field("id") + folder_field.add_field("path") + return query + + +def get_representations_hierarchy(project_name, representation_ids): + """Find representations parents by representation id. + + Representation parent entities up to project. + + Args: + project_name (str): Project where to look for entities. + representation_ids (Iterable[str]): Representation ids. + + Returns: + dict[str, RepresentationParents]: Parent entities by + representation id. + + """ + if not representation_ids: + return {} + + repre_ids = set(representation_ids) + output = { + repre_id: RepresentationHierarchy(None, None, None, None) + for repre_id in representation_ids + } + + query = representations_parent_ids_qraphql_query() + query.set_variable_value("projectName", project_name) + query.set_variable_value("representationIds", list(repre_ids)) + + con = ayon_api.get_server_api_connection() + parsed_data = query.query(con) + for repre in parsed_data["project"]["representations"]: + repre_id = repre["id"] + version = repre.pop("version") + product = version.pop("product") + folder = product.pop("folder") + + output[repre_id] = RepresentationHierarchy( + folder, product, version, repre + ) + + return output +# --- END of ayon-python-api implementation --- + + +class ContainerItem: + def __init__( + self, + representation_id, + loader_name, + namespace, + name, + object_name, + item_id + ): + self.representation_id = representation_id + self.loader_name = loader_name + self.object_name = object_name + self.namespace = namespace + self.name = name + self.item_id = item_id + + @classmethod + def from_container_data(cls, container): + return cls( + representation_id=container["representation"], + loader_name=container["loader"], + namespace=container["namespace"], + name=container["name"], + object_name=container["objectName"], + item_id=uuid.uuid4().hex, + ) + + +class RepresentationInfo: + def __init__( + self, + folder_id, + folder_path, + product_id, + product_name, + product_type, + product_group, + version_id, + representation_name, + ): + self.folder_id = folder_id + self.folder_path = folder_path + self.product_id = product_id + self.product_name = product_name + self.product_type = product_type + self.product_group = product_group + self.version_id = version_id + self.representation_name = representation_name + self._is_valid = None + + @property + def is_valid(self): + if self._is_valid is None: + self._is_valid = ( + self.folder_id is not None + and self.product_id is not None + and self.version_id is not None + and self.representation_name is not None + ) + return self._is_valid + + @classmethod + def new_invalid(cls): + return cls(None, None, None, None, None, None, None, None) + + +class VersionItem: + def __init__(self, version_id, product_id, version, status, is_latest): + self.version = version + self.version_id = version_id + self.product_id = product_id + self.version = version + self.status = status + self.is_latest = is_latest + + @property + def is_hero(self): + return self.version < 0 + + @classmethod + def from_entity(cls, version_entity, is_latest): + return cls( + version_id=version_entity["id"], + product_id=version_entity["productId"], + version=version_entity["version"], + status=version_entity["status"], + is_latest=is_latest, + ) + + +class ContainersModel: + def __init__(self, controller): + self._controller = controller + self._items_cache = None + self._containers_by_id = {} + self._container_items_by_id = {} + self._version_items_by_product_id = {} + self._repre_info_by_id = {} + + def reset(self): + self._items_cache = None + self._containers_by_id = {} + self._container_items_by_id = {} + self._version_items_by_product_id = {} + self._repre_info_by_id = {} + + def get_containers(self): + self._update_cache() + return list(self._containers_by_id.values()) + + def get_containers_by_item_ids(self, item_ids): + return { + item_id: self._containers_by_id.get(item_id) + for item_id in item_ids + } + + def get_container_items(self): + self._update_cache() + return list(self._items_cache) + + def get_container_items_by_id(self, item_ids): + return { + item_id: self._container_items_by_id.get(item_id) + for item_id in item_ids + } + + def get_representation_info_items(self, representation_ids): + output = {} + missing_repre_ids = set() + for repre_id in representation_ids: + try: + uuid.UUID(repre_id) + except ValueError: + output[repre_id] = RepresentationInfo.new_invalid() + continue + + repre_info = self._repre_info_by_id.get(repre_id) + if repre_info is None: + missing_repre_ids.add(repre_id) + else: + output[repre_id] = repre_info + + if not missing_repre_ids: + return output + + project_name = self._controller.get_current_project_name() + repre_hierarchy_by_id = get_representations_hierarchy( + project_name, missing_repre_ids + ) + for repre_id, repre_hierarchy in repre_hierarchy_by_id.items(): + kwargs = { + "folder_id": None, + "folder_path": None, + "product_id": None, + "product_name": None, + "product_type": None, + "product_group": None, + "version_id": None, + "representation_name": None, + } + folder = repre_hierarchy.folder + product = repre_hierarchy.product + version = repre_hierarchy.version + repre = repre_hierarchy.representation + if folder: + kwargs["folder_id"] = folder["id"] + kwargs["folder_path"] = folder["path"] + if product: + group = product["attrib"]["productGroup"] + kwargs["product_id"] = product["id"] + kwargs["product_name"] = product["name"] + kwargs["product_type"] = product["productType"] + kwargs["product_group"] = group + if version: + kwargs["version_id"] = version["id"] + if repre: + kwargs["representation_name"] = repre["name"] + + repre_info = RepresentationInfo(**kwargs) + self._repre_info_by_id[repre_id] = repre_info + output[repre_id] = repre_info + return output + + def get_version_items(self, product_ids): + if not product_ids: + return {} + + missing_ids = { + product_id + for product_id in product_ids + if product_id not in self._version_items_by_product_id + } + if missing_ids: + def version_sorted(entity): + return entity["version"] + + project_name = self._controller.get_current_project_name() + version_entities_by_product_id = { + product_id: [] + for product_id in missing_ids + } + + version_entities = list(ayon_api.get_versions( + project_name, + product_ids=missing_ids, + fields={"id", "version", "productId", "status"} + )) + version_entities.sort(key=version_sorted) + for version_entity in version_entities: + product_id = version_entity["productId"] + version_entities_by_product_id[product_id].append( + version_entity + ) + + for product_id, version_entities in ( + version_entities_by_product_id.items() + ): + last_version = abs(version_entities[-1]["version"]) + version_items_by_id = { + entity["id"]: VersionItem.from_entity( + entity, abs(entity["version"]) == last_version + ) + for entity in version_entities + } + self._version_items_by_product_id[product_id] = ( + version_items_by_id + ) + + return { + product_id: dict(self._version_items_by_product_id[product_id]) + for product_id in product_ids + } + + def _update_cache(self): + if self._items_cache is not None: + return + + host = self._controller.get_host() + if isinstance(host, ILoadHost): + containers = list(host.get_containers()) + elif hasattr(host, "ls"): + containers = list(host.ls()) + else: + containers = [] + container_items = [] + containers_by_id = {} + container_items_by_id = {} + for container in containers: + item = ContainerItem.from_container_data(container) + containers_by_id[item.item_id] = container + container_items_by_id[item.item_id] = item + container_items.append(item) + + self._containers_by_id = containers_by_id + self._container_items_by_id = container_items_by_id + self._items_cache = container_items diff --git a/client/ayon_core/tools/sceneinventory/view.py b/client/ayon_core/tools/sceneinventory/view.py index 5cbd4daf70..9dcf3349e6 100644 --- a/client/ayon_core/tools/sceneinventory/view.py +++ b/client/ayon_core/tools/sceneinventory/view.py @@ -1,11 +1,8 @@ -import uuid import collections import logging -import itertools from functools import partial -import ayon_api -from qtpy import QtWidgets, QtCore +from qtpy import QtWidgets, QtCore, QtGui import qtawesome from ayon_core import style @@ -17,12 +14,21 @@ from ayon_core.pipeline import ( ) from ayon_core.tools.utils.lib import ( iter_model_rows, - format_version + format_version, + preserve_expanded_rows, + preserve_selection, ) from .switch_dialog import SwitchAssetDialog -from .model import InventoryModel - +from .model import ( + InventoryModel, + FilterProxyModel, + ITEM_UNIQUE_NAME_ROLE, + OBJECT_NAME_ROLE, + ITEM_ID_ROLE, + IS_CONTAINER_ITEM_ROLE, +) +from .delegates import VersionDelegate DEFAULT_COLOR = "#fb9c15" @@ -43,185 +49,187 @@ class SceneInventoryView(QtWidgets.QTreeView): self.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) self.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) + model = InventoryModel(controller) + proxy_model = FilterProxyModel() + proxy_model.setSourceModel(model) + + self.setModel(proxy_model) + + version_delegate = VersionDelegate() + self.setItemDelegateForColumn(model.version_col, version_delegate) + + # set some nice default widths for the view + for col, width in model.width_by_column.items(): + self.setColumnWidth(col, width) + + sync_enabled = controller.is_sitesync_enabled() + self.setColumnHidden(model.active_site_col, not sync_enabled) + self.setColumnHidden(model.remote_site_col, not sync_enabled) + self.customContextMenuRequested.connect(self._show_right_mouse_menu) + self._model = model + self._proxy_model = proxy_model + self._version_delegate = version_delegate + self._hierarchy_view = False self._selected = None self._controller = controller + def refresh(self): + with preserve_expanded_rows( + tree_view=self, + role=ITEM_UNIQUE_NAME_ROLE + ): + with preserve_selection( + tree_view=self, + role=ITEM_UNIQUE_NAME_ROLE, + current_index=False + ): + kwargs = {} + # TODO do not touch view's inner attribute + if self._hierarchy_view: + kwargs["selected"] = self._selected + self._model.refresh(**kwargs) + + def set_hierarchy_view(self, enabled): + self._proxy.set_hierarchy_view(enabled) + self._model.set_hierarchy_view(enabled) + + def set_text_filter(self, text_filter): + if hasattr(self._proxy, "setFilterRegularExpression"): + self._proxy.setFilterRegularExpression(text_filter) + else: + self._proxy.setFilterRegExp(text_filter) + + def set_filter_outdated(self, enabled): + self._proxy.set_filter_outdated(enabled) + + def get_selected_indexes(self): + """Get the selected rows""" + indexes, _ = self._get_selected_indexes() + return indexes + + def get_selected_item_ids(self): + return self._get_item_ids_from_indexes( + self.get_selected_indexes() + ) + + def get_selected_container_indexes(self): + return self._get_container_indexes( + self.get_selected_indexes() + ) + + def _get_selected_indexes(self): + selection_model = self.selectionModel() + indexes = selection_model.selectedRows() + active = self.currentIndex() + active = active.sibling(active.row(), 0) + if active not in indexes: + indexes.append(active) + return indexes, active + + def _get_item_ids_from_indexes(self, indexes): + return { + index.data(ITEM_ID_ROLE) + for index in self._get_container_indexes(indexes) + } + def _set_hierarchy_view(self, enabled): if enabled == self._hierarchy_view: return self._hierarchy_view = enabled self.hierarchy_view_changed.emit(enabled) - def _enter_hierarchy(self, items): - self._selected = set(i["objectName"] for i in items) + def _enter_hierarchy(self, item_ids): + self._selected = set(item_ids) self._set_hierarchy_view(True) self.data_changed.emit() self.expandToDepth(1) - self.setStyleSheet(""" - QTreeView { - border-color: #fb9c15; - } - """) + self.setStyleSheet("border-color: #fb9c15;") def _leave_hierarchy(self): self._set_hierarchy_view(False) self.data_changed.emit() - self.setStyleSheet("QTreeView {}") + self.setStyleSheet("") - def _build_item_menu_for_selection(self, items, menu): - # Exclude items that are "NOT FOUND" since setting versions, updating - # and removal won't work for those items. - items = [item for item in items if not item.get("isNotFound")] - if not items: + def _build_item_menu_for_selection(self, menu, indexes, active_index): + item_ids = { + index.data(ITEM_ID_ROLE) + for index in indexes + } + item_ids.discard(None) + if not item_ids: return - # An item might not have a representation, for example when an item - # is listed as "NOT FOUND" - repre_ids = set() - for item in items: - repre_id = item["representation"] - try: - uuid.UUID(repre_id) - repre_ids.add(repre_id) - except ValueError: - pass - - project_name = self._controller.get_current_project_name() - repre_entities = ayon_api.get_representations( - project_name, - representation_ids=repre_ids, - fields={"versionId"} + container_items_by_id = self._controller.get_container_items_by_id( + item_ids ) - version_ids = { - repre_entity["versionId"] - for repre_entity in repre_entities + active_repre_id = None + if active_index is not None: + for index in self._get_container_indexes({active_index}): + item_id = index.data(ITEM_ID_ROLE) + container_item = container_items_by_id[item_id] + active_repre_id = container_item.representation_id + break + + repre_info_by_id = self._controller.get_representation_info_items({ + container_item.representation_id + for container_item in container_items_by_id.values() + }) + valid_repre_ids = { + repre_id + for repre_id, repre_info in repre_info_by_id.items() + if repre_info.is_valid } - loaded_versions = ayon_api.get_versions( - project_name, version_ids=version_ids - ) - - loaded_hero_versions = [] - versions_by_product_id = collections.defaultdict(list) + # Exclude items that are "NOT FOUND" since setting versions, updating + # and removal won't work for those items. + filtered_items = [] product_ids = set() - for version_entity in loaded_versions: - version = version_entity["version"] - if version < 0: - loaded_hero_versions.append(version_entity) - else: - product_id = version_entity["productId"] - versions_by_product_id[product_id].append(version_entity) - product_ids.add(product_id) + version_ids = set() + for container_item in container_items_by_id.values(): + repre_id = container_item.representation_id + repre_info = repre_info_by_id.get(repre_id) + if repre_info and repre_info.is_valid: + filtered_items.append(container_item) + version_ids.add(repre_info.version_id) + product_ids.add(repre_info.product_id) - all_versions = ayon_api.get_versions( - project_name, product_ids=product_ids + # remove + remove_icon = qtawesome.icon("fa.remove", color=DEFAULT_COLOR) + remove_action = QtWidgets.QAction(remove_icon, "Remove items", menu) + remove_action.triggered.connect( + lambda: self._show_remove_warning_dialog(item_ids)) + + if not filtered_items: + # Keep remove action for invalid items + menu.addAction(remove_action) + return + + version_items_by_product_id = self._controller.get_version_items( + product_ids ) - hero_versions = [] - version_entities = [] - for version_entity in all_versions: - version = version_entity["version"] - if version < 0: - hero_versions.append(version_entity) - else: - version_entities.append(version_entity) - - has_loaded_hero_versions = len(loaded_hero_versions) > 0 - has_available_hero_version = len(hero_versions) > 0 has_outdated = False + has_loaded_hero_versions = False + has_available_hero_version = False + for version_items_by_id in version_items_by_product_id.values(): + for version_item in version_items_by_id.values(): + if version_item.is_hero: + has_available_hero_version = True - for version_entity in version_entities: - product_id = version_entity["productId"] - current_versions = versions_by_product_id[product_id] - for current_version in current_versions: - if current_version["version"] < version_entity["version"]: + if version_item.version_id not in version_ids: + continue + if version_item.is_hero: + has_loaded_hero_versions = True + + elif not version_item.is_latest: has_outdated = True - break - - if has_outdated: - break switch_to_versioned = None if has_loaded_hero_versions: - def _on_switch_to_versioned(items): - repre_ids = { - item["representation"] - for item in items - } - - repre_entities = ayon_api.get_representations( - project_name, - representation_ids=repre_ids, - fields={"id", "versionId"} - ) - - version_id_by_repre_id = {} - for repre_entity in repre_entities: - repre_id = repre_entity["id"] - version_id = repre_entity["versionId"] - version_id_by_repre_id[repre_id] = version_id - version_ids = set(version_id_by_repre_id.values()) - - src_version_entity_by_id = { - version_entity["id"]: version_entity - for version_entity in ayon_api.get_versions( - project_name, - version_ids, - fields={"productId", "version"} - ) - } - hero_versions_by_product_id = {} - for version_entity in src_version_entity_by_id.values(): - version = version_entity["version"] - if version < 0: - product_id = version_entity["productId"] - hero_versions_by_product_id[product_id] = abs(version) - - if not hero_versions_by_product_id: - return - - standard_versions = ayon_api.get_versions( - project_name, - product_ids=hero_versions_by_product_id.keys(), - versions=hero_versions_by_product_id.values() - ) - standard_version_by_product_id = { - product_id: {} - for product_id in hero_versions_by_product_id.keys() - } - for version_entity in standard_versions: - product_id = version_entity["productId"] - version = version_entity["version"] - standard_version_by_product_id[product_id][version] = ( - version_entity - ) - - # Specify version per item to update to - update_items = [] - update_versions = [] - for item in items: - repre_id = item["representation"] - version_id = version_id_by_repre_id.get(repre_id) - version_entity = src_version_entity_by_id.get(version_id) - if not version_entity or version_entity["version"] >= 0: - continue - product_id = version_entity["productId"] - version_entities_by_version = ( - standard_version_by_product_id[product_id] - ) - new_version = hero_versions_by_product_id.get(product_id) - new_version_entity = version_entities_by_version.get( - new_version - ) - if new_version_entity is not None: - update_items.append(item) - update_versions.append(new_version) - self._update_containers(update_items, update_versions) - update_icon = qtawesome.icon( "fa.asterisk", color=DEFAULT_COLOR @@ -232,7 +240,7 @@ class SceneInventoryView(QtWidgets.QTreeView): menu ) switch_to_versioned.triggered.connect( - lambda: _on_switch_to_versioned(items) + lambda: self._on_switch_to_versioned(item_ids) ) update_to_latest_action = None @@ -247,7 +255,9 @@ class SceneInventoryView(QtWidgets.QTreeView): menu ) update_to_latest_action.triggered.connect( - lambda: self._update_containers(items, version=-1) + lambda: self._update_containers_to_version( + item_ids, version=-1 + ) ) change_to_hero = None @@ -263,20 +273,23 @@ class SceneInventoryView(QtWidgets.QTreeView): menu ) change_to_hero.triggered.connect( - lambda: self._update_containers( - items, version=HeroVersionType(-1) + lambda: self._update_containers_to_version( + item_ids, version=HeroVersionType(-1) ) ) # set version - set_version_icon = qtawesome.icon("fa.hashtag", color=DEFAULT_COLOR) - set_version_action = QtWidgets.QAction( - set_version_icon, - "Set version", - menu - ) - set_version_action.triggered.connect( - lambda: self._show_version_dialog(items)) + set_version_action = None + if active_repre_id is not None: + set_version_icon = qtawesome.icon("fa.hashtag", color=DEFAULT_COLOR) + set_version_action = QtWidgets.QAction( + set_version_icon, + "Set version", + menu + ) + set_version_action.triggered.connect( + lambda: self._show_version_dialog(item_ids, active_repre_id) + ) # switch folder switch_folder_icon = qtawesome.icon("fa.sitemap", color=DEFAULT_COLOR) @@ -286,13 +299,7 @@ class SceneInventoryView(QtWidgets.QTreeView): menu ) switch_folder_action.triggered.connect( - lambda: self._show_switch_dialog(items)) - - # remove - remove_icon = qtawesome.icon("fa.remove", color=DEFAULT_COLOR) - remove_action = QtWidgets.QAction(remove_icon, "Remove items", menu) - remove_action.triggered.connect( - lambda: self._show_remove_warning_dialog(items)) + lambda: self._show_switch_dialog(item_ids)) # add the actions if switch_to_versioned: @@ -304,14 +311,15 @@ class SceneInventoryView(QtWidgets.QTreeView): if change_to_hero: menu.addAction(change_to_hero) - menu.addAction(set_version_action) + if set_version_action is not None: + menu.addAction(set_version_action) menu.addAction(switch_folder_action) menu.addSeparator() menu.addAction(remove_action) - self._handle_sitesync(menu, repre_ids) + self._handle_sitesync(menu, valid_repre_ids) def _handle_sitesync(self, menu, repre_ids): """Adds actions for download/upload when SyncServer is enabled @@ -327,6 +335,9 @@ class SceneInventoryView(QtWidgets.QTreeView): if not self._controller.is_sitesync_enabled(): return + if not repre_ids: + return + menu.addSeparator() download_icon = qtawesome.icon("fa.download", color=DEFAULT_COLOR) @@ -365,30 +376,35 @@ class SceneInventoryView(QtWidgets.QTreeView): self.data_changed.emit() - def _build_item_menu(self, items=None): + def _build_item_menu(self, indexes=None, active_index=None): """Create menu for the selected items""" - - if not items: - items = [] - menu = QtWidgets.QMenu(self) - # add the actions - self._build_item_menu_for_selection(items, menu) - # These two actions should be able to work without selection # expand all items - expandall_action = QtWidgets.QAction(menu, text="Expand all items") - expandall_action.triggered.connect(self.expandAll) + expand_all_action = QtWidgets.QAction(menu, text="Expand all items") + expand_all_action.triggered.connect(self.expandAll) # collapse all items collapse_action = QtWidgets.QAction(menu, text="Collapse all items") collapse_action.triggered.connect(self.collapseAll) - menu.addAction(expandall_action) + if not indexes: + indexes = [] + + item_ids = { + index.data(ITEM_ID_ROLE) + for index in indexes + } + item_ids.discard(None) + + # add the actions + self._build_item_menu_for_selection(menu, indexes, active_index) + + menu.addAction(expand_all_action) menu.addAction(collapse_action) - custom_actions = self._get_custom_actions(containers=items) + custom_actions = self._get_custom_actions(item_ids) if custom_actions: submenu = QtWidgets.QMenu("Actions", self) for action in custom_actions: @@ -396,7 +412,10 @@ class SceneInventoryView(QtWidgets.QTreeView): icon = qtawesome.icon("fa.%s" % action.icon, color=color) action_item = QtWidgets.QAction(icon, action.label, submenu) action_item.triggered.connect( - partial(self._process_custom_action, action, items)) + partial( + self._process_custom_action, action, item_ids + ) + ) submenu.addAction(action_item) @@ -421,9 +440,9 @@ class SceneInventoryView(QtWidgets.QTreeView): menu ) enter_hierarchy_action.triggered.connect( - lambda: self._enter_hierarchy(items)) + lambda: self._enter_hierarchy(item_ids)) - if items: + if indexes: menu.addAction(enter_hierarchy_action) if back_to_flat_action is not None: @@ -431,11 +450,11 @@ class SceneInventoryView(QtWidgets.QTreeView): return menu - def _get_custom_actions(self, containers): + def _get_custom_actions(self, item_ids): """Get the registered Inventory Actions Args: - containers(list): collection of containers + item_ids (Iterable[str]): collection of containers Returns: list: collection of filter and initialized actions @@ -448,29 +467,40 @@ class SceneInventoryView(QtWidgets.QTreeView): # Fedd an empty dict if no selection, this will ensure the compat # lookup always work, so plugin can interact with Scene Inventory # reversely. - containers = containers or [dict()] + if not item_ids: + containers = [dict()] + else: + containers_by_id = self._controller.get_containers_by_item_ids( + item_ids + ) + containers = list(containers_by_id.values()) # Check which action will be available in the menu Plugins = discover_inventory_actions() - compatible = [p() for p in Plugins if - any(p.is_compatible(c) for c in containers)] + compatible = [ + p() + for p in Plugins + if any(p.is_compatible(c) for c in containers) + ] return sorted(compatible, key=sorter) - def _process_custom_action(self, action, containers): + def _process_custom_action(self, action, item_ids): """Run action and if results are returned positive update the view If the result is list or dict, will select view items by the result. Args: action (InventoryAction): Inventory Action instance - containers (list): Data of currently selected items + item_ids (Iterable[str]): Data of currently selected items Returns: None """ - - result = action.process(containers) + containers_by_id = self._controller.get_containers_by_item_ids( + item_ids + ) + result = action.process(list(containers_by_id.values())) if result: self.data_changed.emit() @@ -498,17 +528,24 @@ class SceneInventoryView(QtWidgets.QTreeView): if options.get("clear", True): self.clearSelection() - object_names = set(object_names) - if ( - self._hierarchy_view - and not self._selected.issuperset(object_names) - ): - # If any container not in current cherry-picked view, update - # view before selecting them. - self._selected.update(object_names) - self.data_changed.emit() - model = self.model() + object_names = set(object_names) + if self._hierarchy_view: + item_ids = set() + for index in iter_model_rows(model): + if not index.data(IS_CONTAINER_ITEM_ROLE): + continue + if index.data(OBJECT_NAME_ROLE) in object_names: + item_id = index.data(ITEM_ID_ROLE) + if item_id: + item_ids.add(item_id) + + if not self._selected.issuperset(item_ids): + # If any container not in current cherry-picked view, update + # view before selecting them. + self._selected.update(item_ids) + self.data_changed.emit() + selection_model = self.selectionModel() select_mode = { @@ -517,12 +554,10 @@ class SceneInventoryView(QtWidgets.QTreeView): "toggle": QtCore.QItemSelectionModel.Toggle, }[options.get("mode", "select")] - for index in iter_model_rows(model, 0): - item = index.data(InventoryModel.ItemRole) - if item.get("isGroupNode"): + for index in iter_model_rows(model): + if not index.data(IS_CONTAINER_ITEM_ROLE): continue - - name = item.get("objectName") + name = index.data(OBJECT_NAME_ROLE) if name in object_names: self.scrollTo(index) # Ensure item is visible flags = select_mode | QtCore.QItemSelectionModel.Rows @@ -539,143 +574,140 @@ class SceneInventoryView(QtWidgets.QTreeView): globalpos = self.viewport().mapToGlobal(pos) if not self.selectionModel().hasSelection(): - print("No selection") # Build menu without selection, feed an empty list menu = self._build_item_menu() menu.exec_(globalpos) return - active = self.currentIndex() # index under mouse - active = active.sibling(active.row(), 0) # get first column - - # move index under mouse - indices = self.get_indices() - if active in indices: - indices.remove(active) - - indices.append(active) + indexes, active_index = self._get_selected_indexes() # Extend to the sub-items - all_indices = self._extend_to_children(indices) - items = [dict(i.data(InventoryModel.ItemRole)) for i in all_indices - if i.parent().isValid()] + all_indexes = self._extend_to_children(indexes) - if self._hierarchy_view: - # Ensure no group item - items = [n for n in items if not n.get("isGroupNode")] - - menu = self._build_item_menu(items) + menu = self._build_item_menu(all_indexes, active_index) menu.exec_(globalpos) - def get_indices(self): - """Get the selected rows""" - selection_model = self.selectionModel() - return selection_model.selectedRows() + def _get_container_indexes(self, indexes): + container_indexes = [] + indexes_queue = collections.deque() + indexes_queue.extend(indexes) + # Ignore already added containers + items_ids = set() + while indexes_queue: + index = indexes_queue.popleft() + if index.data(IS_CONTAINER_ITEM_ROLE): + item_id = index.data(ITEM_ID_ROLE) + if item_id in items_ids: + continue + items_ids.add(item_id) + container_indexes.append(index) + continue + model = index.model() + for row in range(model.rowCount(index)): + child = model.index(row, 0, parent=index) + indexes_queue.append(child) + return container_indexes - def _extend_to_children(self, indices): + def _extend_to_children(self, indexes): """Extend the indices to the children indices. Top-level indices are extended to its children indices. Sub-items are kept as is. Args: - indices (list): The indices to extend. + indexes (list): The indices to extend. Returns: list: The children indices """ - def get_children(i): - model = i.model() - rows = model.rowCount(parent=i) - for row in range(rows): - child = model.index(row, 0, parent=i) - yield child + def get_children(index): + model = index.model() + for row in range(model.rowCount(index)): + yield model.index(row, 0, parent=index) subitems = set() - for i in indices: - valid_parent = i.parent().isValid() - if valid_parent and i not in subitems: - subitems.add(i) + for index in indexes: + if index.parent().isValid() and index not in subitems: + subitems.add(index) if self._hierarchy_view: # Assume this is a group item - for child in get_children(i): + for child in get_children(index): subitems.add(child) else: # is top level item - for child in get_children(i): + for child in get_children(index): subitems.add(child) return list(subitems) - def _show_version_dialog(self, items): + def _show_version_dialog(self, item_ids, active_repre_id): """Create a dialog with the available versions for the selected file Args: - items (list): list of items to run the "set_version" for + item_ids (Iterable[str]): List of item ids to run the + "set_version" for. + active_repre_id (Union[str, None]): Active representation id. Returns: None + """ - - active = items[-1] - - project_name = self._controller.get_current_project_name() - # Get available versions for active representation - repre_entity = ayon_api.get_representation_by_id( - project_name, - active["representation"], - fields={"versionId"} + container_items_by_id = self._controller.get_container_items_by_id( + item_ids + ) + repre_ids = { + container_item.representation_id + for container_item in container_items_by_id.values() + } + repre_info_by_id = self._controller.get_representation_info_items( + repre_ids ) - repre_version_entity = ayon_api.get_version_by_id( - project_name, - repre_entity["versionId"], - fields={"productId"} - ) + active_repre_info = repre_info_by_id[active_repre_id] + active_product_id = active_repre_info.product_id + active_version_id = active_repre_info.version_id + filtered_repre_info_by_id = { + repre_id: repre_info + for repre_id, repre_info in repre_info_by_id.items() + if repre_info.product_id == active_product_id + } + filtered_container_item_ids = { + item_id + for item_id, container_item in container_items_by_id.items() + if container_item.representation_id in filtered_repre_info_by_id + } + version_items_by_id = self._controller.get_version_items( + {active_product_id} + )[active_product_id] - version_entities = list(ayon_api.get_versions( - project_name, - product_ids={repre_version_entity["productId"]}, - )) - hero_version = None - standard_versions = [] - for version_entity in version_entities: - if version_entity["version"] < 0: - hero_version = version_entity - else: - standard_versions.append(version_entity) - standard_versions.sort(key=lambda item: item["version"]) - standard_versions.reverse() + def version_sorter(item): + hero_value = 0 + version = item.version + if version < 0: + hero_value = 1 + version = abs(version) + return version, hero_value - # Get index among the listed versions - current_item = None - current_version = active["version"] - if isinstance(current_version, HeroVersionType): - current_item = hero_version - else: - for version_entity in standard_versions: - if version_entity["version"] == current_version: - current_item = version_entity - break + version_items = list(version_items_by_id.values()) + version_items.sort(key=version_sorter, reverse=True) - all_versions = [] - if hero_version: - all_versions.append(hero_version) - all_versions.extend(standard_versions) - - if current_item: - index = all_versions.index(current_item) - else: - index = 0 - - versions_by_label = dict() + versions_by_label = {} labels = [] - for version_entity in all_versions: - label = format_version(version_entity["version"]) + active_version_label = None + for version_item in version_items: + version = version_item.version + label = format_version(version) + if version_item.version_id == active_version_id: + active_version_label = label + labels.append(label) - versions_by_label[label] = version_entity["version"] + versions_by_label[label] = version + + index = 0 + if active_version_label in labels: + index = labels.index(active_version_label) label, state = QtWidgets.QInputDialog.getItem( self, @@ -692,24 +724,35 @@ class SceneInventoryView(QtWidgets.QTreeView): version = versions_by_label[label] if version < 0: version = HeroVersionType(version) - self._update_containers(items, version) - def _show_switch_dialog(self, items): + self._update_containers_to_version( + filtered_container_item_ids, version + ) + + def _show_switch_dialog(self, item_ids): """Display Switch dialog""" - dialog = SwitchAssetDialog(self._controller, self, items) + containers_by_id = self._controller.get_containers_by_item_ids( + item_ids + ) + dialog = SwitchAssetDialog( + self._controller, self, list(containers_by_id.values()) + ) dialog.switched.connect(self.data_changed.emit) dialog.show() - def _show_remove_warning_dialog(self, items): + def _show_remove_warning_dialog(self, item_ids): """Prompt a dialog to inform the user the action will remove items""" - + containers_by_id = self._controller.get_containers_by_item_ids( + item_ids + ) + containers = list(containers_by_id.values()) accept = QtWidgets.QMessageBox.Ok buttons = accept | QtWidgets.QMessageBox.Cancel state = QtWidgets.QMessageBox.question( self, "Are you sure?", - "Are you sure you want to remove {} item(s)".format(len(items)), + f"Are you sure you want to remove {len(containers)} item(s)", buttons=buttons, defaultButton=accept ) @@ -717,15 +760,15 @@ class SceneInventoryView(QtWidgets.QTreeView): if state != accept: return - for item in items: - remove_container(item) + for container in containers: + remove_container(container) self.data_changed.emit() - def _show_version_error_dialog(self, version, items): + def _show_version_error_dialog(self, version, item_ids): """Shows QMessageBox when version switch doesn't work - Args: - version: str or int or None + Args: + version: str or int or None """ if version == -1: version_str = "latest" @@ -745,7 +788,7 @@ class SceneInventoryView(QtWidgets.QTreeView): "Switch Folder", QtWidgets.QMessageBox.ActionRole ) - switch_btn.clicked.connect(lambda: self._show_switch_dialog(items)) + switch_btn.clicked.connect(lambda: self._show_switch_dialog(item_ids)) dialog.addButton(QtWidgets.QMessageBox.Cancel) @@ -760,69 +803,106 @@ class SceneInventoryView(QtWidgets.QTreeView): def update_all(self): """Update all items that are currently 'outdated' in the view""" # Get the source model through the proxy model - model = self.model().sourceModel() - - # Get all items from outdated groups - outdated_items = [] - for index in iter_model_rows(model, - column=0, - include_root=False): - item = index.data(model.ItemRole) - - if not item.get("isGroupNode"): - continue - - # Only the group nodes contain the "highest_version" data and as - # such we find only the groups and take its children. - if not model.outdated(item): - continue - - # Collect all children which we want to update - children = item.children() - outdated_items.extend(children) - - if not outdated_items: + item_ids = self._model.get_outdated_item_ids() + if not item_ids: log.info("Nothing to update.") return # Trigger update to latest - self._update_containers(outdated_items, version=-1) + self._update_containers_to_version(item_ids, version=-1) - def _update_containers(self, items, version): + def _on_switch_to_versioned(self, item_ids): + containers_items_by_id = self._controller.get_container_items_by_id( + item_ids + ) + product_ids = { + container_item.product_id + for container_item in containers_items_by_id.values() + if container_item.is_valid + } + version_items_by_product_id = self._controller.get_version_items( + product_ids + ) + + update_containers = [] + update_versions = [] + for item_id, container_item in containers_items_by_id.items(): + product_id = container_item.product_id + version_items_id = version_items_by_product_id[product_id] + version_item = version_items_id.get(container_item.version_id, {}) + if not version_item or not version_item.is_hero: + continue + version = abs(version_item.version) + version_found = False + for version_item in version_items_id.values(): + if version_item.is_hero: + continue + if version_item.version == version: + version_found = True + break + + if not version_found: + continue + + update_containers.append(container_item.item_id) + update_versions.append(version) + + # Specify version per item to update to + self._update_containers(update_containers, update_versions) + + def _update_containers(self, item_ids, versions): """Helper to update items to given version (or version per item) If at least one item is specified this will always try to refresh the inventory even if errors occurred on any of the items. Arguments: - items (list): Items to update - version (int or list): Version to set to. + item_ids (Iterable[str]): Items to update + versions (Iterable[Union[int, HeroVersion]]): Version to set to. This can be a list specifying a version for each item. Like `update_container` version -1 sets the latest version and HeroTypeVersion instances set the hero version. """ - if isinstance(version, (list, tuple)): - # We allow a unique version to be specified per item. In that case - # the length must match with the items - assert len(items) == len(version), ( - "Number of items mismatches number of versions: " - "{} items - {} versions".format(len(items), len(version)) - ) - versions = version - else: - # Repeat the same version infinitely - versions = itertools.repeat(version) + # We allow a unique version to be specified per item. In that case + # the length must match with the items + assert len(item_ids) == len(versions), ( + "Number of items mismatches number of versions: " + f"{len(item_ids)} items - {len(versions)} versions" + ) # Trigger update to latest + containers_by_id = self._controller.get_containers_by_item_ids( + item_ids + ) try: - for item, item_version in zip(items, versions): + for item_id, item_version in zip(item_ids, versions): + container = containers_by_id[item_id] try: - update_container(item, item_version) + update_container(container, item_version) except AssertionError: - self._show_version_error_dialog(item_version, [item]) log.warning("Update failed", exc_info=True) + self._show_version_error_dialog( + item_version, [item_id] + ) finally: # Always update the scene inventory view, even if errors occurred self.data_changed.emit() + + def _update_containers_to_version(self, item_ids, version): + """Helper to update items to given version (or version per item) + + If at least one item is specified this will always try to refresh + the inventory even if errors occurred on any of the items. + + Arguments: + item_ids (Iterable[str]): Items to update + version (Union[int, HeroVersion]): Version to set to. + This can be a list specifying a version for each item. + Like `update_container` version -1 sets the latest version + and HeroTypeVersion instances set the hero version. + + """ + versions = [version for _ in range(len(item_ids))] + self._update_containers(item_ids, versions) diff --git a/client/ayon_core/tools/sceneinventory/window.py b/client/ayon_core/tools/sceneinventory/window.py index 555db3a17c..58ff0c3b6d 100644 --- a/client/ayon_core/tools/sceneinventory/window.py +++ b/client/ayon_core/tools/sceneinventory/window.py @@ -2,17 +2,10 @@ from qtpy import QtWidgets, QtCore, QtGui import qtawesome from ayon_core import style, resources -from ayon_core.tools.utils.lib import ( - preserve_expanded_rows, - preserve_selection, -) +from ayon_core.tools.utils import PlaceholderLineEdit + from ayon_core.tools.sceneinventory import SceneInventoryController -from .delegates import VersionDelegate -from .model import ( - InventoryModel, - FilterProxyModel -) from .view import SceneInventoryView @@ -20,7 +13,7 @@ class SceneInventoryWindow(QtWidgets.QDialog): """Scene Inventory window""" def __init__(self, controller=None, parent=None): - super(SceneInventoryWindow, self).__init__(parent) + super().__init__(parent) if controller is None: controller = SceneInventoryController() @@ -33,10 +26,9 @@ class SceneInventoryWindow(QtWidgets.QDialog): self.resize(1100, 480) - # region control - filter_label = QtWidgets.QLabel("Search", self) - text_filter = QtWidgets.QLineEdit(self) + text_filter = PlaceholderLineEdit(self) + text_filter.setPlaceholderText("Filter by name...") outdated_only_checkbox = QtWidgets.QCheckBox( "Filter to outdated", self @@ -44,52 +36,30 @@ class SceneInventoryWindow(QtWidgets.QDialog): outdated_only_checkbox.setToolTip("Show outdated files only") outdated_only_checkbox.setChecked(False) - icon = qtawesome.icon("fa.arrow-up", color="white") + update_all_icon = qtawesome.icon("fa.arrow-up", color="white") update_all_button = QtWidgets.QPushButton(self) update_all_button.setToolTip("Update all outdated to latest version") - update_all_button.setIcon(icon) + update_all_button.setIcon(update_all_icon) - icon = qtawesome.icon("fa.refresh", color="white") + refresh_icon = qtawesome.icon("fa.refresh", color="white") refresh_button = QtWidgets.QPushButton(self) refresh_button.setToolTip("Refresh") - refresh_button.setIcon(icon) + refresh_button.setIcon(refresh_icon) - control_layout = QtWidgets.QHBoxLayout() - control_layout.addWidget(filter_label) - control_layout.addWidget(text_filter) - control_layout.addWidget(outdated_only_checkbox) - control_layout.addWidget(update_all_button) - control_layout.addWidget(refresh_button) - - model = InventoryModel(controller) - proxy = FilterProxyModel() - proxy.setSourceModel(model) - proxy.setDynamicSortFilter(True) - proxy.setFilterCaseSensitivity(QtCore.Qt.CaseInsensitive) + headers_widget = QtWidgets.QWidget(self) + headers_layout = QtWidgets.QHBoxLayout(headers_widget) + headers_layout.setContentsMargins(0, 0, 0, 0) + headers_layout.addWidget(filter_label, 0) + headers_layout.addWidget(text_filter, 1) + headers_layout.addWidget(outdated_only_checkbox, 0) + headers_layout.addWidget(update_all_button, 0) + headers_layout.addWidget(refresh_button, 0) view = SceneInventoryView(controller, self) - view.setModel(proxy) - sync_enabled = controller.is_sitesync_enabled() - view.setColumnHidden(model.active_site_col, not sync_enabled) - view.setColumnHidden(model.remote_site_col, not sync_enabled) - - # set some nice default widths for the view - view.setColumnWidth(0, 250) # name - view.setColumnWidth(1, 55) # version - view.setColumnWidth(2, 55) # count - view.setColumnWidth(3, 150) # product type - view.setColumnWidth(4, 120) # group - view.setColumnWidth(5, 150) # loader - - # apply delegates - version_delegate = VersionDelegate(controller, self) - column = model.Columns.index("version") - view.setItemDelegateForColumn(column, version_delegate) - - layout = QtWidgets.QVBoxLayout(self) - layout.addLayout(control_layout) - layout.addWidget(view) + main_layout = QtWidgets.QVBoxLayout(self) + main_layout.addWidget(headers_widget, 0) + main_layout.addWidget(view, 1) show_timer = QtCore.QTimer() show_timer.setInterval(0) @@ -114,12 +84,8 @@ class SceneInventoryWindow(QtWidgets.QDialog): self._update_all_button = update_all_button self._outdated_only_checkbox = outdated_only_checkbox self._view = view - self._model = model - self._proxy = proxy - self._version_delegate = version_delegate self._first_show = True - self._first_refresh = True def showEvent(self, event): super(SceneInventoryWindow, self).showEvent(event) @@ -139,29 +105,16 @@ class SceneInventoryWindow(QtWidgets.QDialog): whilst trying to name an instance. """ + pass def _on_refresh_request(self): """Signal callback to trigger 'refresh' without any arguments.""" self.refresh() - def refresh(self, containers=None): - self._first_refresh = False + def refresh(self): self._controller.reset() - with preserve_expanded_rows( - tree_view=self._view, - role=self._model.UniqueRole - ): - with preserve_selection( - tree_view=self._view, - role=self._model.UniqueRole, - current_index=False - ): - kwargs = {"containers": containers} - # TODO do not touch view's inner attribute - if self._view._hierarchy_view: - kwargs["selected"] = self._view._selected - self._model.refresh(**kwargs) + self._view.refresh() def _on_show_timer(self): if self._show_counter < 3: @@ -171,17 +124,13 @@ class SceneInventoryWindow(QtWidgets.QDialog): self.refresh() def _on_hierarchy_view_change(self, enabled): - self._proxy.set_hierarchy_view(enabled) - self._model.set_hierarchy_view(enabled) + self._view.set_hierarchy_view(enabled) def _on_text_filter_change(self, text_filter): - if hasattr(self._proxy, "setFilterRegExp"): - self._proxy.setFilterRegExp(text_filter) - else: - self._proxy.setFilterRegularExpression(text_filter) + self._view.set_text_filter(text_filter) def _on_outdated_state_change(self): - self._proxy.set_filter_outdated( + self._view.set_filter_outdated( self._outdated_only_checkbox.isChecked() ) diff --git a/client/ayon_core/tools/utils/lib.py b/client/ayon_core/tools/utils/lib.py index d56b370d75..323b5c07e1 100644 --- a/client/ayon_core/tools/utils/lib.py +++ b/client/ayon_core/tools/utils/lib.py @@ -1,6 +1,7 @@ import os import sys import contextlib +import collections from functools import partial from qtpy import QtWidgets, QtCore, QtGui @@ -196,16 +197,16 @@ def get_openpype_qt_app(): return get_ayon_qt_app() -def iter_model_rows(model, column, include_root=False): +def iter_model_rows(model, column=0, include_root=False): """Iterate over all row indices in a model""" - indices = [QtCore.QModelIndex()] # start iteration at root - - for index in indices: + indexes_queue = collections.deque() + # start iteration at root + indexes_queue.append(QtCore.QModelIndex()) + while indexes_queue: + index = indexes_queue.popleft() # Add children to the iterations - child_rows = model.rowCount(index) - for child_row in range(child_rows): - child_index = model.index(child_row, column, index) - indices.append(child_index) + for child_row in range(model.rowCount(index)): + indexes_queue.append(model.index(child_row, column, index)) if not include_root and not index.isValid(): continue From 72d53bd0bdd5d60698d03531e6ac7e13e21978c9 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 29 May 2024 15:17:26 +0200 Subject: [PATCH 20/67] added unified StatusDelegate --- client/ayon_core/tools/utils/delegates.py | 79 ++++++++++++++++++++++- 1 file changed, 78 insertions(+), 1 deletion(-) diff --git a/client/ayon_core/tools/utils/delegates.py b/client/ayon_core/tools/utils/delegates.py index 1147074b77..b296f952e0 100644 --- a/client/ayon_core/tools/utils/delegates.py +++ b/client/ayon_core/tools/utils/delegates.py @@ -2,7 +2,7 @@ import time from datetime import datetime import logging -from qtpy import QtWidgets +from qtpy import QtWidgets, QtGui log = logging.getLogger(__name__) @@ -106,3 +106,80 @@ class PrettyTimeDelegate(QtWidgets.QStyledItemDelegate): def displayText(self, value, locale): if value is not None: return pretty_timestamp(value) + + +class StatusDelegate(QtWidgets.QStyledItemDelegate): + """Delegate showing status name and short name.""" + def __init__( + self, + status_name_role, + status_short_name_role, + status_color_role, + status_icon_role, + *args, **kwargs + ): + super().__init__(*args, **kwargs) + self.status_name_role = status_name_role + self.status_short_name_role = status_short_name_role + self.status_color_role = status_color_role + self.status_icon_role = status_icon_role + + def paint(self, painter, option, index): + if option.widget: + style = option.widget.style() + else: + style = QtWidgets.QApplication.style() + + style.drawControl( + QtWidgets.QCommonStyle.CE_ItemViewItem, + option, + painter, + option.widget + ) + + painter.save() + + text_rect = style.subElementRect( + QtWidgets.QCommonStyle.SE_ItemViewItemText, + option + ) + text_margin = style.proxy().pixelMetric( + QtWidgets.QCommonStyle.PM_FocusFrameHMargin, + option, + option.widget + ) + 1 + padded_text_rect = text_rect.adjusted( + text_margin, 0, - text_margin, 0 + ) + + fm = QtGui.QFontMetrics(option.font) + text = self._get_status_name(index) + if padded_text_rect.width() < fm.width(text): + text = self._get_status_short_name(index) + + fg_color = self._get_status_color(index) + pen = painter.pen() + pen.setColor(fg_color) + painter.setPen(pen) + + painter.drawText( + padded_text_rect, + option.displayAlignment, + text + ) + + painter.restore() + + def _get_status_name(self, index): + return index.data(self.status_name_role) + + def _get_status_short_name(self, index): + return index.data(self.status_short_name_role) + + def _get_status_color(self, index): + return QtGui.QColor(index.data(self.status_color_role)) + + def _get_status_icon(self, index): + if self.status_icon_role is not None: + return index.data(self.status_icon_role) + return None From daadddf8a4fd4ed7ffaed0c8670ee95e883ba987 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 29 May 2024 15:17:44 +0200 Subject: [PATCH 21/67] added statuses to scene inventory --- .../ayon_core/tools/sceneinventory/control.py | 11 +++- .../ayon_core/tools/sceneinventory/model.py | 50 +++++++++++++------ client/ayon_core/tools/sceneinventory/view.py | 18 ++++++- 3 files changed, 62 insertions(+), 17 deletions(-) diff --git a/client/ayon_core/tools/sceneinventory/control.py b/client/ayon_core/tools/sceneinventory/control.py index c564b5a992..b890462506 100644 --- a/client/ayon_core/tools/sceneinventory/control.py +++ b/client/ayon_core/tools/sceneinventory/control.py @@ -1,12 +1,12 @@ import ayon_api from ayon_core.lib.events import QueuedEventSystem -from ayon_core.host import HostBase, ILoadHost +from ayon_core.host import HostBase from ayon_core.pipeline import ( registered_host, get_current_context, ) -from ayon_core.tools.common_models import HierarchyModel +from ayon_core.tools.common_models import HierarchyModel, ProjectsModel from .models import SiteSyncModel, ContainersModel @@ -32,6 +32,7 @@ class SceneInventoryController: self._sitesync_model = SiteSyncModel(self) # Switch dialog requirements self._hierarchy_model = HierarchyModel(self) + self._projects_model = ProjectsModel(self) self._event_system = self._create_event_system() def get_host(self) -> HostBase: @@ -85,6 +86,12 @@ class SceneInventoryController: self._current_folder_set = True return self._current_folder_id + def get_project_status_items(self): + project_name = self.get_current_project_name() + return self._projects_model.get_project_status_items( + project_name, None + ) + # Containers methods def get_containers(self): return self._containers_model.get_containers() diff --git a/client/ayon_core/tools/sceneinventory/model.py b/client/ayon_core/tools/sceneinventory/model.py index 052bdf3e4e..8e549f6bde 100644 --- a/client/ayon_core/tools/sceneinventory/model.py +++ b/client/ayon_core/tools/sceneinventory/model.py @@ -23,20 +23,22 @@ VERSION_LABEL_ROLE = QtCore.Qt.UserRole + 7 VERSION_COLOR_ROLE = QtCore.Qt.UserRole + 8 STATUS_NAME_ROLE = QtCore.Qt.UserRole + 9 STATUS_COLOR_ROLE = QtCore.Qt.UserRole + 10 -PRODUCT_ID_ROLE = QtCore.Qt.UserRole + 11 -PRODUCT_TYPE_ROLE = QtCore.Qt.UserRole + 12 -PRODUCT_TYPE_ICON_ROLE = QtCore.Qt.UserRole + 13 -PRODUCT_GROUP_NAME_ROLE = QtCore.Qt.UserRole + 14 -PRODUCT_GROUP_ICON_ROLE = QtCore.Qt.UserRole + 15 -LOADER_NAME_ROLE = QtCore.Qt.UserRole + 16 -OBJECT_NAME_ROLE = QtCore.Qt.UserRole + 17 -ACTIVE_SITE_PROGRESS_ROLE = QtCore.Qt.UserRole + 18 -REMOTE_SITE_PROGRESS_ROLE = QtCore.Qt.UserRole + 19 -ACTIVE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 20 -REMOTE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 21 +STATUS_SHORT_ROLE = QtCore.Qt.UserRole + 11 +STATUS_ICON_ROLE = QtCore.Qt.UserRole + 12 +PRODUCT_ID_ROLE = QtCore.Qt.UserRole + 13 +PRODUCT_TYPE_ROLE = QtCore.Qt.UserRole + 14 +PRODUCT_TYPE_ICON_ROLE = QtCore.Qt.UserRole + 15 +PRODUCT_GROUP_NAME_ROLE = QtCore.Qt.UserRole + 16 +PRODUCT_GROUP_ICON_ROLE = QtCore.Qt.UserRole + 17 +LOADER_NAME_ROLE = QtCore.Qt.UserRole + 18 +OBJECT_NAME_ROLE = QtCore.Qt.UserRole + 19 +ACTIVE_SITE_PROGRESS_ROLE = QtCore.Qt.UserRole + 20 +REMOTE_SITE_PROGRESS_ROLE = QtCore.Qt.UserRole + 21 +ACTIVE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 22 +REMOTE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 23 # This value hold unique value of container that should be used to identify # containers inbetween refresh. -ITEM_UNIQUE_NAME_ROLE = QtCore.Qt.UserRole + 22 +ITEM_UNIQUE_NAME_ROLE = QtCore.Qt.UserRole + 24 class InventoryModel(QtGui.QStandardItemModel): @@ -45,6 +47,7 @@ class InventoryModel(QtGui.QStandardItemModel): column_labels = [ "Name", "Version", + "Status", "Count", "Product type", "Group", @@ -55,6 +58,7 @@ class InventoryModel(QtGui.QStandardItemModel): ] name_col = column_labels.index("Name") version_col = column_labels.index("Version") + status_col = column_labels.index("Status") count_col = column_labels.index("Count") product_type_col = column_labels.index("Product type") product_group_col = column_labels.index("Group") @@ -65,8 +69,8 @@ class InventoryModel(QtGui.QStandardItemModel): display_role_by_column = { name_col: QtCore.Qt.DisplayRole, version_col: VERSION_LABEL_ROLE, + status_col: STATUS_NAME_ROLE, count_col: COUNT_ROLE, - # 3: STATUS_NAME_ROLE, product_type_col: PRODUCT_TYPE_ROLE, product_group_col: PRODUCT_GROUP_NAME_ROLE, loader_col: LOADER_NAME_ROLE, @@ -82,12 +86,14 @@ class InventoryModel(QtGui.QStandardItemModel): remote_site_col: REMOTE_SITE_ICON_ROLE, } foreground_role_by_column = { - version_col: VERSION_COLOR_ROLE, name_col: NAME_COLOR_ROLE, + version_col: VERSION_COLOR_ROLE, + status_col: STATUS_COLOR_ROLE } width_by_column = { name_col: 250, version_col: 55, + status_col: 100, count_col: 55, product_type_col: 150, product_group_col: 120, @@ -156,6 +162,10 @@ class InventoryModel(QtGui.QStandardItemModel): self._controller.get_site_provider_icons().items() ) } + status_items_by_name = { + status_item.name: status_item + for status_item in self._controller.get_project_status_items() + } group_item_icon = qtawesome.icon( "fa.folder", color=self._default_icon_color @@ -187,6 +197,9 @@ class InventoryModel(QtGui.QStandardItemModel): version_color = None version_value = None is_latest = False + status_name = None + status_color = None + status_short = None if not repre_info.is_valid: group_name = "< Entity N/A >" item_icon = invalid_item_icon @@ -210,6 +223,11 @@ class InventoryModel(QtGui.QStandardItemModel): is_latest = version_item.is_latest if not is_latest: version_color = self.OUTDATED_COLOR + status_name = version_item.status + status_item = status_items_by_name.get(status_name) + if status_item: + status_short = status_item.short + status_color = status_item.color container_model_items = [] for container_item in container_items: @@ -255,6 +273,10 @@ class InventoryModel(QtGui.QStandardItemModel): group_item.setData(is_latest, VERSION_IS_LATEST_ROLE) group_item.setData(version_label, VERSION_LABEL_ROLE) group_item.setData(len(container_items), COUNT_ROLE) + group_item.setData(status_name, STATUS_NAME_ROLE) + group_item.setData(status_short, STATUS_SHORT_ROLE) + group_item.setData(status_color, STATUS_COLOR_ROLE) + group_item.setData( active_site_progress, ACTIVE_SITE_PROGRESS_ROLE ) diff --git a/client/ayon_core/tools/sceneinventory/view.py b/client/ayon_core/tools/sceneinventory/view.py index 9dcf3349e6..18615b8a89 100644 --- a/client/ayon_core/tools/sceneinventory/view.py +++ b/client/ayon_core/tools/sceneinventory/view.py @@ -18,6 +18,7 @@ from ayon_core.tools.utils.lib import ( preserve_expanded_rows, preserve_selection, ) +from ayon_core.tools.utils.delegates import StatusDelegate from .switch_dialog import SwitchAssetDialog from .model import ( @@ -27,6 +28,10 @@ from .model import ( OBJECT_NAME_ROLE, ITEM_ID_ROLE, IS_CONTAINER_ITEM_ROLE, + STATUS_NAME_ROLE, + STATUS_SHORT_ROLE, + STATUS_COLOR_ROLE, + STATUS_ICON_ROLE, ) from .delegates import VersionDelegate @@ -56,7 +61,17 @@ class SceneInventoryView(QtWidgets.QTreeView): self.setModel(proxy_model) version_delegate = VersionDelegate() - self.setItemDelegateForColumn(model.version_col, version_delegate) + status_delegate = StatusDelegate( + STATUS_NAME_ROLE, + STATUS_SHORT_ROLE, + STATUS_COLOR_ROLE, + STATUS_ICON_ROLE, + ) + for col, delegate in ( + (model.version_col, version_delegate), + (model.status_col, status_delegate), + ): + self.setItemDelegateForColumn(col, delegate) # set some nice default widths for the view for col, width in model.width_by_column.items(): @@ -71,6 +86,7 @@ class SceneInventoryView(QtWidgets.QTreeView): self._model = model self._proxy_model = proxy_model self._version_delegate = version_delegate + self._status_delegate = status_delegate self._hierarchy_view = False self._selected = None From 5fdc433c22a30f716062cc52315ecd5bf1316f50 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 29 May 2024 15:18:11 +0200 Subject: [PATCH 22/67] loader uses generic status delegate --- .../tools/loader/ui/products_delegates.py | 54 ------------------- .../tools/loader/ui/products_model.py | 25 ++++----- .../tools/loader/ui/products_widget.py | 14 +++-- 3 files changed, 24 insertions(+), 69 deletions(-) diff --git a/client/ayon_core/tools/loader/ui/products_delegates.py b/client/ayon_core/tools/loader/ui/products_delegates.py index 1ac19b53eb..cedac6199b 100644 --- a/client/ayon_core/tools/loader/ui/products_delegates.py +++ b/client/ayon_core/tools/loader/ui/products_delegates.py @@ -6,9 +6,6 @@ from ayon_core.tools.utils.lib import format_version from .products_model import ( PRODUCT_ID_ROLE, VERSION_NAME_EDIT_ROLE, - VERSION_STATUS_NAME_ROLE, - VERSION_STATUS_SHORT_ROLE, - VERSION_STATUS_COLOR_ROLE, VERSION_ID_ROLE, PRODUCT_IN_SCENE_ROLE, ACTIVE_SITE_ICON_ROLE, @@ -205,57 +202,6 @@ class LoadedInSceneDelegate(QtWidgets.QStyledItemDelegate): option.palette.setBrush(QtGui.QPalette.Text, color) -class StatusDelegate(QtWidgets.QStyledItemDelegate): - """Delegate showing status name and short name.""" - - def paint(self, painter, option, index): - if option.widget: - style = option.widget.style() - else: - style = QtWidgets.QApplication.style() - - style.drawControl( - QtWidgets.QCommonStyle.CE_ItemViewItem, - option, - painter, - option.widget - ) - - painter.save() - - text_rect = style.subElementRect( - QtWidgets.QCommonStyle.SE_ItemViewItemText, - option - ) - text_margin = style.proxy().pixelMetric( - QtWidgets.QCommonStyle.PM_FocusFrameHMargin, - option, - option.widget - ) + 1 - padded_text_rect = text_rect.adjusted( - text_margin, 0, - text_margin, 0 - ) - - fm = QtGui.QFontMetrics(option.font) - text = index.data(VERSION_STATUS_NAME_ROLE) - if padded_text_rect.width() < fm.width(text): - text = index.data(VERSION_STATUS_SHORT_ROLE) - - status_color = index.data(VERSION_STATUS_COLOR_ROLE) - fg_color = QtGui.QColor(status_color) - pen = painter.pen() - pen.setColor(fg_color) - painter.setPen(pen) - - painter.drawText( - padded_text_rect, - option.displayAlignment, - text - ) - - painter.restore() - - class SiteSyncDelegate(QtWidgets.QStyledItemDelegate): """Paints icons and downloaded representation ration for both sites.""" diff --git a/client/ayon_core/tools/loader/ui/products_model.py b/client/ayon_core/tools/loader/ui/products_model.py index f309473d10..8035b1f0fe 100644 --- a/client/ayon_core/tools/loader/ui/products_model.py +++ b/client/ayon_core/tools/loader/ui/products_model.py @@ -25,18 +25,19 @@ VERSION_PUBLISH_TIME_ROLE = QtCore.Qt.UserRole + 14 VERSION_STATUS_NAME_ROLE = QtCore.Qt.UserRole + 15 VERSION_STATUS_SHORT_ROLE = QtCore.Qt.UserRole + 16 VERSION_STATUS_COLOR_ROLE = QtCore.Qt.UserRole + 17 -VERSION_AUTHOR_ROLE = QtCore.Qt.UserRole + 18 -VERSION_FRAME_RANGE_ROLE = QtCore.Qt.UserRole + 19 -VERSION_DURATION_ROLE = QtCore.Qt.UserRole + 20 -VERSION_HANDLES_ROLE = QtCore.Qt.UserRole + 21 -VERSION_STEP_ROLE = QtCore.Qt.UserRole + 22 -VERSION_AVAILABLE_ROLE = QtCore.Qt.UserRole + 23 -VERSION_THUMBNAIL_ID_ROLE = QtCore.Qt.UserRole + 24 -ACTIVE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 25 -REMOTE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 26 -REPRESENTATIONS_COUNT_ROLE = QtCore.Qt.UserRole + 27 -SYNC_ACTIVE_SITE_AVAILABILITY = QtCore.Qt.UserRole + 28 -SYNC_REMOTE_SITE_AVAILABILITY = QtCore.Qt.UserRole + 29 +VERSION_STATUS_ICON_ROLE = QtCore.Qt.UserRole + 18 +VERSION_AUTHOR_ROLE = QtCore.Qt.UserRole + 19 +VERSION_FRAME_RANGE_ROLE = QtCore.Qt.UserRole + 20 +VERSION_DURATION_ROLE = QtCore.Qt.UserRole + 21 +VERSION_HANDLES_ROLE = QtCore.Qt.UserRole + 22 +VERSION_STEP_ROLE = QtCore.Qt.UserRole + 23 +VERSION_AVAILABLE_ROLE = QtCore.Qt.UserRole + 24 +VERSION_THUMBNAIL_ID_ROLE = QtCore.Qt.UserRole + 25 +ACTIVE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 26 +REMOTE_SITE_ICON_ROLE = QtCore.Qt.UserRole + 27 +REPRESENTATIONS_COUNT_ROLE = QtCore.Qt.UserRole + 28 +SYNC_ACTIVE_SITE_AVAILABILITY = QtCore.Qt.UserRole + 29 +SYNC_REMOTE_SITE_AVAILABILITY = QtCore.Qt.UserRole + 30 class ProductsModel(QtGui.QStandardItemModel): diff --git a/client/ayon_core/tools/loader/ui/products_widget.py b/client/ayon_core/tools/loader/ui/products_widget.py index 3a30d83d52..61ddd690e9 100644 --- a/client/ayon_core/tools/loader/ui/products_widget.py +++ b/client/ayon_core/tools/loader/ui/products_widget.py @@ -6,7 +6,7 @@ from ayon_core.tools.utils import ( RecursiveSortFilterProxyModel, DeselectableTreeView, ) -from ayon_core.tools.utils.delegates import PrettyTimeDelegate +from ayon_core.tools.utils.delegates import PrettyTimeDelegate, StatusDelegate from .products_model import ( ProductsModel, @@ -17,12 +17,15 @@ from .products_model import ( FOLDER_ID_ROLE, PRODUCT_ID_ROLE, VERSION_ID_ROLE, + VERSION_STATUS_NAME_ROLE, + VERSION_STATUS_SHORT_ROLE, + VERSION_STATUS_COLOR_ROLE, + VERSION_STATUS_ICON_ROLE, VERSION_THUMBNAIL_ID_ROLE, ) from .products_delegates import ( VersionDelegate, LoadedInSceneDelegate, - StatusDelegate, SiteSyncDelegate, ) from .actions_utils import show_actions_menu @@ -131,7 +134,12 @@ class ProductsWidget(QtWidgets.QWidget): version_delegate = VersionDelegate() time_delegate = PrettyTimeDelegate() - status_delegate = StatusDelegate() + status_delegate = StatusDelegate( + VERSION_STATUS_NAME_ROLE, + VERSION_STATUS_SHORT_ROLE, + VERSION_STATUS_COLOR_ROLE, + VERSION_STATUS_ICON_ROLE, + ) in_scene_delegate = LoadedInSceneDelegate() sitesync_delegate = SiteSyncDelegate() From ff6efcccfc7b7796cefbfea79fab99368488a9a1 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 29 May 2024 17:12:06 +0200 Subject: [PATCH 23/67] added statuses to set version dialog --- .../sceneinventory/select_version_dialog.py | 218 ++++++++++++++++++ client/ayon_core/tools/sceneinventory/view.py | 62 ++--- 2 files changed, 254 insertions(+), 26 deletions(-) create mode 100644 client/ayon_core/tools/sceneinventory/select_version_dialog.py diff --git a/client/ayon_core/tools/sceneinventory/select_version_dialog.py b/client/ayon_core/tools/sceneinventory/select_version_dialog.py new file mode 100644 index 0000000000..421989338c --- /dev/null +++ b/client/ayon_core/tools/sceneinventory/select_version_dialog.py @@ -0,0 +1,218 @@ +import uuid + +from qtpy import QtWidgets, QtCore, QtGui + +from ayon_core.tools.utils.delegates import StatusDelegate + +from .model import ( + ITEM_ID_ROLE, + STATUS_NAME_ROLE, + STATUS_SHORT_ROLE, + STATUS_COLOR_ROLE, + STATUS_ICON_ROLE, +) + + +class VersionOption: + def __init__( + self, + version, + label, + status_name, + status_short, + status_color + ): + self.version = version + self.label = label + self.status_name = status_name + self.status_short = status_short + self.status_color = status_color + + +class SelectVersionModel(QtGui.QStandardItemModel): + def data(self, index, role=None): + if role is None: + role = QtCore.Qt.DisplayRole + + index = self.index(index.row(), 0, index.parent()) + return super().data(index, role) + + +class SelectVersionComboBox(QtWidgets.QComboBox): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + combo_model = SelectVersionModel(0, 2) + + self.setModel(combo_model) + + combo_view = QtWidgets.QTreeView(self) + combo_view.setHeaderHidden(True) + combo_view.setIndentation(0) + + self.setView(combo_view) + + header = combo_view.header() + header.setSectionResizeMode(0, QtWidgets.QHeaderView.ResizeToContents) + header.setSectionResizeMode(1, QtWidgets.QHeaderView.Stretch) + + status_delegate = StatusDelegate( + STATUS_NAME_ROLE, + STATUS_SHORT_ROLE, + STATUS_COLOR_ROLE, + STATUS_ICON_ROLE, + ) + combo_view.setItemDelegateForColumn(1, status_delegate) + + self._combo_model = combo_model + self._combo_view = combo_view + self._status_delegate = status_delegate + self._items_by_id = {} + + def paintEvent(self, event): + painter = QtWidgets.QStylePainter(self) + option = QtWidgets.QStyleOptionComboBox() + self.initStyleOption(option) + painter.drawComplexControl(QtWidgets.QStyle.CC_ComboBox, option) + idx = self.currentIndex() + status_name = self.itemData(idx, STATUS_NAME_ROLE) + if status_name is None: + painter.drawControl(QtWidgets.QStyle.CE_ComboBoxLabel, option) + return + + painter.save() + text_field_rect = self.style().subControlRect( + QtWidgets.QStyle.CC_ComboBox, + option, + QtWidgets.QStyle.SC_ComboBoxEditField + ) + adj_rect = text_field_rect.adjusted(1, 0, -1, 0) + painter.drawText( + adj_rect, + QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter, + option.currentText + ) + metrics = QtGui.QFontMetrics(self.font()) + text_width = metrics.width(option.currentText) + x_offset = text_width + 2 + diff_width = adj_rect.width() - x_offset + if diff_width <= 0: + return + + status_rect = adj_rect.adjusted(x_offset + 2, 0, 0, 0) + if diff_width < metrics.width(status_name): + status_name = self.itemData(idx, STATUS_SHORT_ROLE) + + color = QtGui.QColor(self.itemData(idx, STATUS_COLOR_ROLE)) + + pen = painter.pen() + pen.setColor(color) + painter.setPen(pen) + painter.drawText( + status_rect, + QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter, + status_name + ) + + def set_current_index(self, index): + model = self._combo_view.model() + if index > model.rowCount(): + return + + self.setCurrentIndex(index) + + def get_item_by_id(self, item_id): + return self._items_by_id[item_id] + + def set_versions(self, version_options): + self._items_by_id = {} + model = self._combo_model + root_item = model.invisibleRootItem() + root_item.removeRows(0, root_item.rowCount()) + + new_items = [] + for version_option in version_options: + item_id = uuid.uuid4().hex + item = QtGui.QStandardItem(version_option.label) + item.setColumnCount(root_item.columnCount()) + item.setData( + version_option.status_name, STATUS_NAME_ROLE + ) + item.setData( + version_option.status_short, STATUS_SHORT_ROLE + ) + item.setData( + version_option.status_color, STATUS_COLOR_ROLE + ) + item.setData(item_id, ITEM_ID_ROLE) + + new_items.append(item) + self._items_by_id[item_id] = version_option + + if new_items: + root_item.appendRows(new_items) + + +class SelectVersionDialog(QtWidgets.QDialog): + def __init__(self, parent=None): + super().__init__(parent=parent) + + self.setWindowTitle("Select version") + + label_widget = QtWidgets.QLabel("Set version number to", self) + versions_combobox = SelectVersionComboBox(self) + + btns_widget = QtWidgets.QWidget(self) + + confirm_btn = QtWidgets.QPushButton("OK", btns_widget) + cancel_btn = QtWidgets.QPushButton("Cancel", btns_widget) + + btns_layout = QtWidgets.QHBoxLayout(btns_widget) + btns_layout.setContentsMargins(0, 0, 0, 0) + btns_layout.addStretch(1) + btns_layout.addWidget(confirm_btn, 0) + btns_layout.addWidget(cancel_btn, 0) + + main_layout = QtWidgets.QVBoxLayout(self) + main_layout.addWidget(label_widget, 0) + main_layout.addWidget(versions_combobox, 0) + main_layout.addWidget(btns_widget, 0) + + confirm_btn.clicked.connect(self._on_confirm) + cancel_btn.clicked.connect(self._on_cancel) + + self._selected_item = None + self._cancelled = False + self._versions_combobox = versions_combobox + + def get_selected_item(self): + if self._cancelled: + return None + return self._selected_item + + def set_versions(self, version_options): + self._versions_combobox.set_versions(version_options) + + def select_index(self, index): + self._versions_combobox.set_current_index(index) + + @classmethod + def ask_for_version(cls, version_options, index=None, parent=None): + dialog = cls(parent) + dialog.set_versions(version_options) + if index is not None: + dialog.select_index(index) + dialog.exec_() + return dialog.get_selected_item() + + def _on_confirm(self): + self._cancelled = False + index = self._versions_combobox.currentIndex() + print(index) + item_id = self._versions_combobox.itemData(index, ITEM_ID_ROLE) + print(item_id) + self._selected_item = self._versions_combobox.get_item_by_id(item_id) + self.accept() + + def _on_cancel(self): + self._cancelled = True + self.reject() diff --git a/client/ayon_core/tools/sceneinventory/view.py b/client/ayon_core/tools/sceneinventory/view.py index 18615b8a89..15f00fc707 100644 --- a/client/ayon_core/tools/sceneinventory/view.py +++ b/client/ayon_core/tools/sceneinventory/view.py @@ -34,6 +34,7 @@ from .model import ( STATUS_ICON_ROLE, ) from .delegates import VersionDelegate +from .select_version_dialog import SelectVersionDialog, VersionOption DEFAULT_COLOR = "#fb9c15" @@ -708,42 +709,51 @@ class SceneInventoryView(QtWidgets.QTreeView): version_items = list(version_items_by_id.values()) version_items.sort(key=version_sorter, reverse=True) + status_items_by_name = { + status_item.name: status_item + for status_item in self._controller.get_project_status_items() + } - versions_by_label = {} - labels = [] - active_version_label = None - for version_item in version_items: + version_options = [] + active_version_idx = 0 + for idx, version_item in enumerate(version_items): version = version_item.version label = format_version(version) if version_item.version_id == active_version_id: - active_version_label = label + active_version_idx = idx - labels.append(label) - versions_by_label[label] = version + status_name = version_item.status + status_short = None + status_color = None + status_item = status_items_by_name.get(status_name) + if status_item: + status_short = status_item.short + status_color = status_item.color + version_options.append( + VersionOption( + version, + label, + status_name, + status_short, + status_color, + ) + ) - index = 0 - if active_version_label in labels: - index = labels.index(active_version_label) - - label, state = QtWidgets.QInputDialog.getItem( - self, - "Set version..", - "Set version number to", - labels, - current=index, - editable=False + version_option = SelectVersionDialog.ask_for_version( + version_options, + active_version_idx, + parent=self ) - if not state: + if version_option is None: return - if label: - version = versions_by_label[label] - if version < 0: - version = HeroVersionType(version) + version = version_option.version + if version < 0: + version = HeroVersionType(version) - self._update_containers_to_version( - filtered_container_item_ids, version - ) + self._update_containers_to_version( + filtered_container_item_ids, version + ) def _show_switch_dialog(self, item_ids): """Display Switch dialog""" From e2de3795a2545048f39c1ccae2f975826e7c8a2a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 29 May 2024 17:46:41 +0200 Subject: [PATCH 24/67] fix switch to versioned --- client/ayon_core/tools/sceneinventory/view.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/client/ayon_core/tools/sceneinventory/view.py b/client/ayon_core/tools/sceneinventory/view.py index 15f00fc707..1daeae74ab 100644 --- a/client/ayon_core/tools/sceneinventory/view.py +++ b/client/ayon_core/tools/sceneinventory/view.py @@ -841,10 +841,17 @@ class SceneInventoryView(QtWidgets.QTreeView): containers_items_by_id = self._controller.get_container_items_by_id( item_ids ) - product_ids = { - container_item.product_id + repre_ids = { + container_item.representation_id for container_item in containers_items_by_id.values() - if container_item.is_valid + } + repre_info_by_id = self._controller.get_representation_info_items( + repre_ids + ) + product_ids = { + repre_info.product_id + for repre_info in repre_info_by_id.values() + if repre_info.is_valid } version_items_by_product_id = self._controller.get_version_items( product_ids @@ -853,9 +860,11 @@ class SceneInventoryView(QtWidgets.QTreeView): update_containers = [] update_versions = [] for item_id, container_item in containers_items_by_id.items(): - product_id = container_item.product_id + repre_id = container_item.representation_id + repre_info = repre_info_by_id[repre_id] + product_id = repre_info.product_id version_items_id = version_items_by_product_id[product_id] - version_item = version_items_id.get(container_item.version_id, {}) + version_item = version_items_id.get(repre_info.version_id, {}) if not version_item or not version_item.is_hero: continue version = abs(version_item.version) From 04339d9bc0e75b809310067ae707acfa8d1d1dc1 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Wed, 29 May 2024 17:48:40 +0200 Subject: [PATCH 25/67] remove unused import --- client/ayon_core/tools/sceneinventory/view.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/tools/sceneinventory/view.py b/client/ayon_core/tools/sceneinventory/view.py index 1daeae74ab..b4ff62a405 100644 --- a/client/ayon_core/tools/sceneinventory/view.py +++ b/client/ayon_core/tools/sceneinventory/view.py @@ -2,7 +2,7 @@ import collections import logging from functools import partial -from qtpy import QtWidgets, QtCore, QtGui +from qtpy import QtWidgets, QtCore import qtawesome from ayon_core import style From b93c0ace2771ae321baf4f42822a3cbb958ad2d1 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 09:34:23 +0200 Subject: [PATCH 26/67] Remove debug prints Co-authored-by: Roy Nieterau --- client/ayon_core/tools/sceneinventory/select_version_dialog.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/client/ayon_core/tools/sceneinventory/select_version_dialog.py b/client/ayon_core/tools/sceneinventory/select_version_dialog.py index 421989338c..1945d71a6d 100644 --- a/client/ayon_core/tools/sceneinventory/select_version_dialog.py +++ b/client/ayon_core/tools/sceneinventory/select_version_dialog.py @@ -207,9 +207,7 @@ class SelectVersionDialog(QtWidgets.QDialog): def _on_confirm(self): self._cancelled = False index = self._versions_combobox.currentIndex() - print(index) item_id = self._versions_combobox.itemData(index, ITEM_ID_ROLE) - print(item_id) self._selected_item = self._versions_combobox.get_item_by_id(item_id) self.accept() From f937fc954246d922d37899e800f1ae08f63bd5c0 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 09:55:57 +0200 Subject: [PATCH 27/67] fix filtering --- client/ayon_core/tools/sceneinventory/view.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/client/ayon_core/tools/sceneinventory/view.py b/client/ayon_core/tools/sceneinventory/view.py index b4ff62a405..770d0d903d 100644 --- a/client/ayon_core/tools/sceneinventory/view.py +++ b/client/ayon_core/tools/sceneinventory/view.py @@ -58,6 +58,7 @@ class SceneInventoryView(QtWidgets.QTreeView): model = InventoryModel(controller) proxy_model = FilterProxyModel() proxy_model.setSourceModel(model) + proxy_model.setSortCaseSensitivity(QtCore.Qt.CaseInsensitive) self.setModel(proxy_model) @@ -111,17 +112,17 @@ class SceneInventoryView(QtWidgets.QTreeView): self._model.refresh(**kwargs) def set_hierarchy_view(self, enabled): - self._proxy.set_hierarchy_view(enabled) + self._proxy_model.set_hierarchy_view(enabled) self._model.set_hierarchy_view(enabled) def set_text_filter(self, text_filter): - if hasattr(self._proxy, "setFilterRegularExpression"): - self._proxy.setFilterRegularExpression(text_filter) + if hasattr(self._proxy_model, "setFilterRegularExpression"): + self._proxy_model.setFilterRegularExpression(text_filter) else: - self._proxy.setFilterRegExp(text_filter) + self._proxy_model.setFilterRegExp(text_filter) def set_filter_outdated(self, enabled): - self._proxy.set_filter_outdated(enabled) + self._proxy_model.set_filter_outdated(enabled) def get_selected_indexes(self): """Get the selected rows""" From f2fdb237d6b1ec9abbfbcfcddd456e9b7713f4c0 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 09:56:04 +0200 Subject: [PATCH 28/67] fix update all --- client/ayon_core/tools/sceneinventory/model.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/tools/sceneinventory/model.py b/client/ayon_core/tools/sceneinventory/model.py index 8e549f6bde..c505ece689 100644 --- a/client/ayon_core/tools/sceneinventory/model.py +++ b/client/ayon_core/tools/sceneinventory/model.py @@ -11,7 +11,7 @@ from ayon_core.pipeline import ( ) from ayon_core.style import get_default_entity_icon_color from ayon_core.tools.utils import get_qt_icon -from ayon_core.tools.utils.lib import format_version +from ayon_core.tools.utils.lib import iter_model_rows, format_version ITEM_ID_ROLE = QtCore.Qt.UserRole + 1 NAME_COLOR_ROLE = QtCore.Qt.UserRole + 2 @@ -339,7 +339,16 @@ class InventoryModel(QtGui.QStandardItemModel): self._hierarchy_view = state def get_outdated_item_ids(self): - return set() + outdated_item_ids = [] + root_item = self.invisibleRootItem() + for row in range(root_item.rowCount()): + group_item = root_item.child(row) + if group_item.data(VERSION_IS_LATEST_ROLE): + continue + for idx in range(group_item.rowCount()): + item = group_item.child(idx) + outdated_item_ids.append(item.data(ITEM_ID_ROLE)) + return outdated_item_ids def _clear_items(self): root_item = self.invisibleRootItem() From 879805647fa48eeb314a99ffb4b516acea598a26 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 09:58:15 +0200 Subject: [PATCH 29/67] fill container data --- client/ayon_core/tools/sceneinventory/model.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/client/ayon_core/tools/sceneinventory/model.py b/client/ayon_core/tools/sceneinventory/model.py index c505ece689..3db33c77f7 100644 --- a/client/ayon_core/tools/sceneinventory/model.py +++ b/client/ayon_core/tools/sceneinventory/model.py @@ -246,6 +246,8 @@ class InventoryModel(QtGui.QStandardItemModel): item.setData(container_item.item_id, ITEM_ID_ROLE) item.setData(version_value, VERSION_VALUE_ROLE) item.setData(version_label, VERSION_LABEL_ROLE) + item.setData(container_item.loader_name, LOADER_NAME_ROLE) + item.setData(container_item.object_name, OBJECT_NAME_ROLE) item.setData(True, IS_CONTAINER_ITEM_ROLE) item.setData(unique_name, ITEM_UNIQUE_NAME_ROLE) container_model_items.append(item) From b9f646b9a06742a0ec7ceecfb381954e1e588324 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 10:08:48 +0200 Subject: [PATCH 30/67] don't update hero versions on update all --- .../ayon_core/tools/sceneinventory/model.py | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/client/ayon_core/tools/sceneinventory/model.py b/client/ayon_core/tools/sceneinventory/model.py index 3db33c77f7..0e9c80b3da 100644 --- a/client/ayon_core/tools/sceneinventory/model.py +++ b/client/ayon_core/tools/sceneinventory/model.py @@ -11,14 +11,14 @@ from ayon_core.pipeline import ( ) from ayon_core.style import get_default_entity_icon_color from ayon_core.tools.utils import get_qt_icon -from ayon_core.tools.utils.lib import iter_model_rows, format_version +from ayon_core.tools.utils.lib import format_version ITEM_ID_ROLE = QtCore.Qt.UserRole + 1 NAME_COLOR_ROLE = QtCore.Qt.UserRole + 2 COUNT_ROLE = QtCore.Qt.UserRole + 3 IS_CONTAINER_ITEM_ROLE = QtCore.Qt.UserRole + 4 VERSION_IS_LATEST_ROLE = QtCore.Qt.UserRole + 5 -VERSION_VALUE_ROLE = QtCore.Qt.UserRole + 6 +VERSION_IS_HERO_ROLE = QtCore.Qt.UserRole + 6 VERSION_LABEL_ROLE = QtCore.Qt.UserRole + 7 VERSION_COLOR_ROLE = QtCore.Qt.UserRole + 8 STATUS_NAME_ROLE = QtCore.Qt.UserRole + 9 @@ -195,8 +195,8 @@ class InventoryModel(QtGui.QStandardItemModel): repre_info = repre_info_by_id[repre_id] version_label = "N/A" version_color = None - version_value = None is_latest = False + is_hero = False status_name = None status_color = None status_short = None @@ -216,10 +216,8 @@ class InventoryModel(QtGui.QStandardItemModel): version_items_by_product_id[repre_info.product_id] ) version_item = version_items[repre_info.version_id] - version_value = version_item.version - if version_value < 0: - version_value = HeroVersionType(version_value) - version_label = format_version(version_value) + version_label = format_version(version_item.version) + is_hero = version_item.version < 0 is_latest = version_item.is_latest if not is_latest: version_color = self.OUTDATED_COLOR @@ -244,7 +242,6 @@ class InventoryModel(QtGui.QStandardItemModel): item.setData(item_icon, QtCore.Qt.DecorationRole) item.setData(repre_info.product_id, PRODUCT_ID_ROLE) item.setData(container_item.item_id, ITEM_ID_ROLE) - item.setData(version_value, VERSION_VALUE_ROLE) item.setData(version_label, VERSION_LABEL_ROLE) item.setData(container_item.loader_name, LOADER_NAME_ROLE) item.setData(container_item.object_name, OBJECT_NAME_ROLE) @@ -273,6 +270,7 @@ class InventoryModel(QtGui.QStandardItemModel): group_item.setData(repre_info.product_type, PRODUCT_TYPE_ROLE) group_item.setData(product_type_icon, PRODUCT_TYPE_ICON_ROLE) group_item.setData(is_latest, VERSION_IS_LATEST_ROLE) + group_item.setData(is_hero, VERSION_IS_HERO_ROLE) group_item.setData(version_label, VERSION_LABEL_ROLE) group_item.setData(len(container_items), COUNT_ROLE) group_item.setData(status_name, STATUS_NAME_ROLE) @@ -340,13 +338,17 @@ class InventoryModel(QtGui.QStandardItemModel): if state != self._hierarchy_view: self._hierarchy_view = state - def get_outdated_item_ids(self): + def get_outdated_item_ids(self, ignore_hero=True): outdated_item_ids = [] root_item = self.invisibleRootItem() for row in range(root_item.rowCount()): group_item = root_item.child(row) if group_item.data(VERSION_IS_LATEST_ROLE): continue + + if ignore_hero and group_item.data(VERSION_IS_HERO_ROLE): + continue + for idx in range(group_item.rowCount()): item = group_item.child(idx) outdated_item_ids.append(item.data(ITEM_ID_ROLE)) From 881d487fb35f66180f8ff2e6799978ee4a4851e2 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 10:14:20 +0200 Subject: [PATCH 31/67] remove unused import --- client/ayon_core/tools/sceneinventory/model.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/client/ayon_core/tools/sceneinventory/model.py b/client/ayon_core/tools/sceneinventory/model.py index 0e9c80b3da..1c51b7a98b 100644 --- a/client/ayon_core/tools/sceneinventory/model.py +++ b/client/ayon_core/tools/sceneinventory/model.py @@ -6,9 +6,6 @@ import collections from qtpy import QtCore, QtGui import qtawesome -from ayon_core.pipeline import ( - HeroVersionType, -) from ayon_core.style import get_default_entity_icon_color from ayon_core.tools.utils import get_qt_icon from ayon_core.tools.utils.lib import format_version From c3c4951a31e0f8b1d1002ed7eb82fef0efa4b706 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:11:46 +0200 Subject: [PATCH 32/67] move client code next to server codebase --- .../celaction/client/ayon_celaction}/__init__.py | 0 .../celaction/client/ayon_celaction}/addon.py | 0 .../ayon_celaction}/hooks/pre_celaction_setup.py | 0 .../client/ayon_celaction}/plugins/__init__.py | 0 .../plugins/publish/collect_celaction_cli_kwargs.py | 0 .../plugins/publish/collect_celaction_instances.py | 0 .../plugins/publish/collect_render_path.py | 0 .../plugins/publish/integrate_version_up.py | 0 .../resources/celaction_template_scene.scn | Bin .../client/ayon_celaction}/scripts/__init__.py | 0 .../client/ayon_celaction}/scripts/publish_cli.py | 0 11 files changed, 0 insertions(+), 0 deletions(-) rename {client/ayon_core/hosts/celaction => server_addon/celaction/client/ayon_celaction}/__init__.py (100%) rename {client/ayon_core/hosts/celaction => server_addon/celaction/client/ayon_celaction}/addon.py (100%) rename {client/ayon_core/hosts/celaction => server_addon/celaction/client/ayon_celaction}/hooks/pre_celaction_setup.py (100%) rename {client/ayon_core/hosts/celaction => server_addon/celaction/client/ayon_celaction}/plugins/__init__.py (100%) rename {client/ayon_core/hosts/celaction => server_addon/celaction/client/ayon_celaction}/plugins/publish/collect_celaction_cli_kwargs.py (100%) rename {client/ayon_core/hosts/celaction => server_addon/celaction/client/ayon_celaction}/plugins/publish/collect_celaction_instances.py (100%) rename {client/ayon_core/hosts/celaction => server_addon/celaction/client/ayon_celaction}/plugins/publish/collect_render_path.py (100%) rename {client/ayon_core/hosts/celaction => server_addon/celaction/client/ayon_celaction}/plugins/publish/integrate_version_up.py (100%) rename {client/ayon_core/hosts/celaction => server_addon/celaction/client/ayon_celaction}/resources/celaction_template_scene.scn (100%) rename {client/ayon_core/hosts/celaction => server_addon/celaction/client/ayon_celaction}/scripts/__init__.py (100%) rename {client/ayon_core/hosts/celaction => server_addon/celaction/client/ayon_celaction}/scripts/publish_cli.py (100%) diff --git a/client/ayon_core/hosts/celaction/__init__.py b/server_addon/celaction/client/ayon_celaction/__init__.py similarity index 100% rename from client/ayon_core/hosts/celaction/__init__.py rename to server_addon/celaction/client/ayon_celaction/__init__.py diff --git a/client/ayon_core/hosts/celaction/addon.py b/server_addon/celaction/client/ayon_celaction/addon.py similarity index 100% rename from client/ayon_core/hosts/celaction/addon.py rename to server_addon/celaction/client/ayon_celaction/addon.py diff --git a/client/ayon_core/hosts/celaction/hooks/pre_celaction_setup.py b/server_addon/celaction/client/ayon_celaction/hooks/pre_celaction_setup.py similarity index 100% rename from client/ayon_core/hosts/celaction/hooks/pre_celaction_setup.py rename to server_addon/celaction/client/ayon_celaction/hooks/pre_celaction_setup.py diff --git a/client/ayon_core/hosts/celaction/plugins/__init__.py b/server_addon/celaction/client/ayon_celaction/plugins/__init__.py similarity index 100% rename from client/ayon_core/hosts/celaction/plugins/__init__.py rename to server_addon/celaction/client/ayon_celaction/plugins/__init__.py diff --git a/client/ayon_core/hosts/celaction/plugins/publish/collect_celaction_cli_kwargs.py b/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_celaction_cli_kwargs.py similarity index 100% rename from client/ayon_core/hosts/celaction/plugins/publish/collect_celaction_cli_kwargs.py rename to server_addon/celaction/client/ayon_celaction/plugins/publish/collect_celaction_cli_kwargs.py diff --git a/client/ayon_core/hosts/celaction/plugins/publish/collect_celaction_instances.py b/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_celaction_instances.py similarity index 100% rename from client/ayon_core/hosts/celaction/plugins/publish/collect_celaction_instances.py rename to server_addon/celaction/client/ayon_celaction/plugins/publish/collect_celaction_instances.py diff --git a/client/ayon_core/hosts/celaction/plugins/publish/collect_render_path.py b/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_render_path.py similarity index 100% rename from client/ayon_core/hosts/celaction/plugins/publish/collect_render_path.py rename to server_addon/celaction/client/ayon_celaction/plugins/publish/collect_render_path.py diff --git a/client/ayon_core/hosts/celaction/plugins/publish/integrate_version_up.py b/server_addon/celaction/client/ayon_celaction/plugins/publish/integrate_version_up.py similarity index 100% rename from client/ayon_core/hosts/celaction/plugins/publish/integrate_version_up.py rename to server_addon/celaction/client/ayon_celaction/plugins/publish/integrate_version_up.py diff --git a/client/ayon_core/hosts/celaction/resources/celaction_template_scene.scn b/server_addon/celaction/client/ayon_celaction/resources/celaction_template_scene.scn similarity index 100% rename from client/ayon_core/hosts/celaction/resources/celaction_template_scene.scn rename to server_addon/celaction/client/ayon_celaction/resources/celaction_template_scene.scn diff --git a/client/ayon_core/hosts/celaction/scripts/__init__.py b/server_addon/celaction/client/ayon_celaction/scripts/__init__.py similarity index 100% rename from client/ayon_core/hosts/celaction/scripts/__init__.py rename to server_addon/celaction/client/ayon_celaction/scripts/__init__.py diff --git a/client/ayon_core/hosts/celaction/scripts/publish_cli.py b/server_addon/celaction/client/ayon_celaction/scripts/publish_cli.py similarity index 100% rename from client/ayon_core/hosts/celaction/scripts/publish_cli.py rename to server_addon/celaction/client/ayon_celaction/scripts/publish_cli.py From fb7dc5b07a6279f3668d9674c9d0344041b87fd3 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:12:24 +0200 Subject: [PATCH 33/67] removed unnecessary __init__ file --- server_addon/celaction/client/ayon_celaction/plugins/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 server_addon/celaction/client/ayon_celaction/plugins/__init__.py diff --git a/server_addon/celaction/client/ayon_celaction/plugins/__init__.py b/server_addon/celaction/client/ayon_celaction/plugins/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 From 0af0545f533f2112e8f352a374c81d67c673814f Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:13:04 +0200 Subject: [PATCH 34/67] fix imports --- .../client/ayon_celaction/hooks/pre_celaction_setup.py | 2 +- .../celaction/client/ayon_celaction/scripts/publish_cli.py | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/server_addon/celaction/client/ayon_celaction/hooks/pre_celaction_setup.py b/server_addon/celaction/client/ayon_celaction/hooks/pre_celaction_setup.py index 8350c7b7c8..2b76b30015 100644 --- a/server_addon/celaction/client/ayon_celaction/hooks/pre_celaction_setup.py +++ b/server_addon/celaction/client/ayon_celaction/hooks/pre_celaction_setup.py @@ -4,7 +4,7 @@ import winreg import subprocess from ayon_core.lib import get_ayon_launcher_args from ayon_applications import PreLaunchHook, LaunchTypes -from ayon_core.hosts.celaction import CELACTION_ROOT_DIR +from ayon_celaction import CELACTION_ROOT_DIR class CelactionPrelaunchHook(PreLaunchHook): diff --git a/server_addon/celaction/client/ayon_celaction/scripts/publish_cli.py b/server_addon/celaction/client/ayon_celaction/scripts/publish_cli.py index 92019b8702..9888244d6f 100644 --- a/server_addon/celaction/client/ayon_celaction/scripts/publish_cli.py +++ b/server_addon/celaction/client/ayon_celaction/scripts/publish_cli.py @@ -4,7 +4,7 @@ import sys import pyblish.api import pyblish.util -import ayon_core.hosts.celaction +from ayon_celaction import CELACTION_ROOT_DIR from ayon_core.lib import Logger from ayon_core.tools.utils import host_tools from ayon_core.pipeline import install_ayon_plugins @@ -13,8 +13,7 @@ from ayon_core.pipeline import install_ayon_plugins log = Logger.get_logger("celaction") PUBLISH_HOST = "celaction" -HOST_DIR = os.path.dirname(os.path.abspath(ayon_core.hosts.celaction.__file__)) -PLUGINS_DIR = os.path.join(HOST_DIR, "plugins") +PLUGINS_DIR = os.path.join(CELACTION_ROOT_DIR, "plugins") PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") From 7bd81a83e649b3e02a11af592d0642e904355c58 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:13:17 +0200 Subject: [PATCH 35/67] added settings category --- .../ayon_celaction/plugins/publish/collect_render_path.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_render_path.py b/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_render_path.py index 1bb4d54831..36a033ebb0 100644 --- a/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_render_path.py +++ b/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_render_path.py @@ -10,6 +10,8 @@ class CollectRenderPath(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder + 0.495 families = ["render.farm"] + settings_category = "celaction" + # Presets output_extension = "png" anatomy_template_key_render_files = None From 4267252a36f8ba0841e0cfe909dcb7538dd8295d Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:13:27 +0200 Subject: [PATCH 36/67] formatting changes --- .../client/ayon_celaction/hooks/pre_celaction_setup.py | 8 +++----- .../ayon_celaction/plugins/publish/collect_render_path.py | 2 +- .../client/ayon_celaction/scripts/publish_cli.py | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/server_addon/celaction/client/ayon_celaction/hooks/pre_celaction_setup.py b/server_addon/celaction/client/ayon_celaction/hooks/pre_celaction_setup.py index 2b76b30015..52622d43b8 100644 --- a/server_addon/celaction/client/ayon_celaction/hooks/pre_celaction_setup.py +++ b/server_addon/celaction/client/ayon_celaction/hooks/pre_celaction_setup.py @@ -8,9 +8,7 @@ from ayon_celaction import CELACTION_ROOT_DIR class CelactionPrelaunchHook(PreLaunchHook): - """ - Bootstrap celacion with pype - """ + """Bootstrap celacion with AYON""" app_groups = {"celaction"} platforms = {"windows"} launch_types = {LaunchTypes.local} @@ -39,7 +37,7 @@ class CelactionPrelaunchHook(PreLaunchHook): CELACTION_ROOT_DIR, "scripts", "publish_cli.py" ) subprocess_args = get_ayon_launcher_args("run", path_to_cli) - openpype_executable = subprocess_args.pop(0) + executable = subprocess_args.pop(0) workfile_settings = self.get_workfile_settings() winreg.SetValueEx( @@ -47,7 +45,7 @@ class CelactionPrelaunchHook(PreLaunchHook): "SubmitAppTitle", 0, winreg.REG_SZ, - openpype_executable + executable ) # add required arguments for workfile path diff --git a/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_render_path.py b/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_render_path.py index 36a033ebb0..3bcd1c69b3 100644 --- a/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_render_path.py +++ b/server_addon/celaction/client/ayon_celaction/plugins/publish/collect_render_path.py @@ -1,6 +1,6 @@ import os -import pyblish.api import copy +import pyblish.api class CollectRenderPath(pyblish.api.InstancePlugin): diff --git a/server_addon/celaction/client/ayon_celaction/scripts/publish_cli.py b/server_addon/celaction/client/ayon_celaction/scripts/publish_cli.py index 9888244d6f..4e54aa253a 100644 --- a/server_addon/celaction/client/ayon_celaction/scripts/publish_cli.py +++ b/server_addon/celaction/client/ayon_celaction/scripts/publish_cli.py @@ -18,7 +18,7 @@ PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") def main(): - # Registers pype's Global pyblish plugins + # Registers global pyblish plugins install_ayon_plugins() if os.path.exists(PUBLISH_PATH): From 438230bf5cdcaccf5506eebee1bac8fec917825b Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:13:33 +0200 Subject: [PATCH 37/67] update package.py --- server_addon/celaction/package.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/server_addon/celaction/package.py b/server_addon/celaction/package.py index 2b11a8630f..8b9069d019 100644 --- a/server_addon/celaction/package.py +++ b/server_addon/celaction/package.py @@ -1,3 +1,12 @@ name = "celaction" title = "CelAction" -version = "0.1.0" +version = "0.2.0" + +client_dir = "ayon_celaction" + +ayon_required_addons = { + "core": ">0.3.2", +} +ayon_compatible_addons = { + "applications": ">=0.2.0", +} From 04126feff2919110755258aa141821ef625a7825 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:15:26 +0200 Subject: [PATCH 38/67] added milestone version --- client/ayon_core/addon/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index 939fab68b8..865c6a56a3 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -51,6 +51,7 @@ IGNORED_MODULES_IN_AYON = set() # - this is used to log the missing addon MOVED_ADDON_MILESTONE_VERSIONS = { "applications": VersionInfo(0, 2, 0), + "celaction": VersionInfo(0, 2, 0), "clockify": VersionInfo(0, 2, 0), "traypublisher": VersionInfo(0, 2, 0), "tvpaint": VersionInfo(0, 2, 0), From 6bd274df24f556837c7a6dbba17b66a363421920 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:20:52 +0200 Subject: [PATCH 39/67] moved flame integration next to server codebase --- .../flame => server_addon/flame/client/ayon_flame}/__init__.py | 0 .../hosts/flame => server_addon/flame/client/ayon_flame}/addon.py | 0 .../flame/client/ayon_flame}/api/__init__.py | 0 .../flame/client/ayon_flame}/api/batch_utils.py | 0 .../flame/client/ayon_flame}/api/constants.py | 0 .../flame => server_addon/flame/client/ayon_flame}/api/lib.py | 0 .../flame => server_addon/flame/client/ayon_flame}/api/menu.py | 0 .../flame/client/ayon_flame}/api/pipeline.py | 0 .../flame => server_addon/flame/client/ayon_flame}/api/plugin.py | 0 .../flame/client/ayon_flame}/api/render_utils.py | 0 .../flame/client/ayon_flame}/api/scripts/wiretap_com.py | 0 .../flame => server_addon/flame/client/ayon_flame}/api/utils.py | 0 .../flame => server_addon/flame/client/ayon_flame}/api/workio.py | 0 .../flame/client/ayon_flame}/hooks/pre_flame_setup.py | 0 .../flame/client/ayon_flame}/otio/__init__.py | 0 .../flame/client/ayon_flame}/otio/flame_export.py | 0 .../flame => server_addon/flame/client/ayon_flame}/otio/utils.py | 0 .../flame/client/ayon_flame}/plugins/create/create_shot_clip.py | 0 .../flame/client/ayon_flame}/plugins/load/load_clip.py | 0 .../flame/client/ayon_flame}/plugins/load/load_clip_batch.py | 0 .../client/ayon_flame}/plugins/publish/collect_test_selection.py | 0 .../ayon_flame}/plugins/publish/collect_timeline_instances.py | 0 .../client/ayon_flame}/plugins/publish/collect_timeline_otio.py | 0 .../flame/client/ayon_flame}/plugins/publish/extract_otio_file.py | 0 .../ayon_flame}/plugins/publish/extract_subset_resources.py | 0 .../client/ayon_flame}/plugins/publish/integrate_batch_group.py | 0 .../export_preset/openpype_seg_thumbnails_jpg.xml | 0 .../export_preset/openpype_seg_video_h264.xml | 0 .../startup/openpype_babypublisher/modules/__init__.py | 0 .../startup/openpype_babypublisher/modules/app_utils.py | 0 .../startup/openpype_babypublisher/modules/ftrack_lib.py | 0 .../startup/openpype_babypublisher/modules/panel_app.py | 0 .../startup/openpype_babypublisher/modules/uiwidgets.py | 0 .../startup/openpype_babypublisher/openpype_babypublisher.py | 0 .../flame/client/ayon_flame}/startup/openpype_in_flame.py | 0 35 files changed, 0 insertions(+), 0 deletions(-) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/__init__.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/addon.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/api/__init__.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/api/batch_utils.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/api/constants.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/api/lib.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/api/menu.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/api/pipeline.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/api/plugin.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/api/render_utils.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/api/scripts/wiretap_com.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/api/utils.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/api/workio.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/hooks/pre_flame_setup.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/otio/__init__.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/otio/flame_export.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/otio/utils.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/plugins/create/create_shot_clip.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/plugins/load/load_clip.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/plugins/load/load_clip_batch.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/plugins/publish/collect_test_selection.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/plugins/publish/collect_timeline_instances.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/plugins/publish/collect_timeline_otio.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/plugins/publish/extract_otio_file.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/plugins/publish/extract_subset_resources.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/plugins/publish/integrate_batch_group.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/startup/openpype_babypublisher/export_preset/openpype_seg_thumbnails_jpg.xml (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/startup/openpype_babypublisher/export_preset/openpype_seg_video_h264.xml (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/startup/openpype_babypublisher/modules/__init__.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/startup/openpype_babypublisher/modules/app_utils.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/startup/openpype_babypublisher/modules/ftrack_lib.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/startup/openpype_babypublisher/modules/panel_app.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/startup/openpype_babypublisher/modules/uiwidgets.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/startup/openpype_babypublisher/openpype_babypublisher.py (100%) rename {client/ayon_core/hosts/flame => server_addon/flame/client/ayon_flame}/startup/openpype_in_flame.py (100%) diff --git a/client/ayon_core/hosts/flame/__init__.py b/server_addon/flame/client/ayon_flame/__init__.py similarity index 100% rename from client/ayon_core/hosts/flame/__init__.py rename to server_addon/flame/client/ayon_flame/__init__.py diff --git a/client/ayon_core/hosts/flame/addon.py b/server_addon/flame/client/ayon_flame/addon.py similarity index 100% rename from client/ayon_core/hosts/flame/addon.py rename to server_addon/flame/client/ayon_flame/addon.py diff --git a/client/ayon_core/hosts/flame/api/__init__.py b/server_addon/flame/client/ayon_flame/api/__init__.py similarity index 100% rename from client/ayon_core/hosts/flame/api/__init__.py rename to server_addon/flame/client/ayon_flame/api/__init__.py diff --git a/client/ayon_core/hosts/flame/api/batch_utils.py b/server_addon/flame/client/ayon_flame/api/batch_utils.py similarity index 100% rename from client/ayon_core/hosts/flame/api/batch_utils.py rename to server_addon/flame/client/ayon_flame/api/batch_utils.py diff --git a/client/ayon_core/hosts/flame/api/constants.py b/server_addon/flame/client/ayon_flame/api/constants.py similarity index 100% rename from client/ayon_core/hosts/flame/api/constants.py rename to server_addon/flame/client/ayon_flame/api/constants.py diff --git a/client/ayon_core/hosts/flame/api/lib.py b/server_addon/flame/client/ayon_flame/api/lib.py similarity index 100% rename from client/ayon_core/hosts/flame/api/lib.py rename to server_addon/flame/client/ayon_flame/api/lib.py diff --git a/client/ayon_core/hosts/flame/api/menu.py b/server_addon/flame/client/ayon_flame/api/menu.py similarity index 100% rename from client/ayon_core/hosts/flame/api/menu.py rename to server_addon/flame/client/ayon_flame/api/menu.py diff --git a/client/ayon_core/hosts/flame/api/pipeline.py b/server_addon/flame/client/ayon_flame/api/pipeline.py similarity index 100% rename from client/ayon_core/hosts/flame/api/pipeline.py rename to server_addon/flame/client/ayon_flame/api/pipeline.py diff --git a/client/ayon_core/hosts/flame/api/plugin.py b/server_addon/flame/client/ayon_flame/api/plugin.py similarity index 100% rename from client/ayon_core/hosts/flame/api/plugin.py rename to server_addon/flame/client/ayon_flame/api/plugin.py diff --git a/client/ayon_core/hosts/flame/api/render_utils.py b/server_addon/flame/client/ayon_flame/api/render_utils.py similarity index 100% rename from client/ayon_core/hosts/flame/api/render_utils.py rename to server_addon/flame/client/ayon_flame/api/render_utils.py diff --git a/client/ayon_core/hosts/flame/api/scripts/wiretap_com.py b/server_addon/flame/client/ayon_flame/api/scripts/wiretap_com.py similarity index 100% rename from client/ayon_core/hosts/flame/api/scripts/wiretap_com.py rename to server_addon/flame/client/ayon_flame/api/scripts/wiretap_com.py diff --git a/client/ayon_core/hosts/flame/api/utils.py b/server_addon/flame/client/ayon_flame/api/utils.py similarity index 100% rename from client/ayon_core/hosts/flame/api/utils.py rename to server_addon/flame/client/ayon_flame/api/utils.py diff --git a/client/ayon_core/hosts/flame/api/workio.py b/server_addon/flame/client/ayon_flame/api/workio.py similarity index 100% rename from client/ayon_core/hosts/flame/api/workio.py rename to server_addon/flame/client/ayon_flame/api/workio.py diff --git a/client/ayon_core/hosts/flame/hooks/pre_flame_setup.py b/server_addon/flame/client/ayon_flame/hooks/pre_flame_setup.py similarity index 100% rename from client/ayon_core/hosts/flame/hooks/pre_flame_setup.py rename to server_addon/flame/client/ayon_flame/hooks/pre_flame_setup.py diff --git a/client/ayon_core/hosts/flame/otio/__init__.py b/server_addon/flame/client/ayon_flame/otio/__init__.py similarity index 100% rename from client/ayon_core/hosts/flame/otio/__init__.py rename to server_addon/flame/client/ayon_flame/otio/__init__.py diff --git a/client/ayon_core/hosts/flame/otio/flame_export.py b/server_addon/flame/client/ayon_flame/otio/flame_export.py similarity index 100% rename from client/ayon_core/hosts/flame/otio/flame_export.py rename to server_addon/flame/client/ayon_flame/otio/flame_export.py diff --git a/client/ayon_core/hosts/flame/otio/utils.py b/server_addon/flame/client/ayon_flame/otio/utils.py similarity index 100% rename from client/ayon_core/hosts/flame/otio/utils.py rename to server_addon/flame/client/ayon_flame/otio/utils.py diff --git a/client/ayon_core/hosts/flame/plugins/create/create_shot_clip.py b/server_addon/flame/client/ayon_flame/plugins/create/create_shot_clip.py similarity index 100% rename from client/ayon_core/hosts/flame/plugins/create/create_shot_clip.py rename to server_addon/flame/client/ayon_flame/plugins/create/create_shot_clip.py diff --git a/client/ayon_core/hosts/flame/plugins/load/load_clip.py b/server_addon/flame/client/ayon_flame/plugins/load/load_clip.py similarity index 100% rename from client/ayon_core/hosts/flame/plugins/load/load_clip.py rename to server_addon/flame/client/ayon_flame/plugins/load/load_clip.py diff --git a/client/ayon_core/hosts/flame/plugins/load/load_clip_batch.py b/server_addon/flame/client/ayon_flame/plugins/load/load_clip_batch.py similarity index 100% rename from client/ayon_core/hosts/flame/plugins/load/load_clip_batch.py rename to server_addon/flame/client/ayon_flame/plugins/load/load_clip_batch.py diff --git a/client/ayon_core/hosts/flame/plugins/publish/collect_test_selection.py b/server_addon/flame/client/ayon_flame/plugins/publish/collect_test_selection.py similarity index 100% rename from client/ayon_core/hosts/flame/plugins/publish/collect_test_selection.py rename to server_addon/flame/client/ayon_flame/plugins/publish/collect_test_selection.py diff --git a/client/ayon_core/hosts/flame/plugins/publish/collect_timeline_instances.py b/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_instances.py similarity index 100% rename from client/ayon_core/hosts/flame/plugins/publish/collect_timeline_instances.py rename to server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_instances.py diff --git a/client/ayon_core/hosts/flame/plugins/publish/collect_timeline_otio.py b/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_otio.py similarity index 100% rename from client/ayon_core/hosts/flame/plugins/publish/collect_timeline_otio.py rename to server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_otio.py diff --git a/client/ayon_core/hosts/flame/plugins/publish/extract_otio_file.py b/server_addon/flame/client/ayon_flame/plugins/publish/extract_otio_file.py similarity index 100% rename from client/ayon_core/hosts/flame/plugins/publish/extract_otio_file.py rename to server_addon/flame/client/ayon_flame/plugins/publish/extract_otio_file.py diff --git a/client/ayon_core/hosts/flame/plugins/publish/extract_subset_resources.py b/server_addon/flame/client/ayon_flame/plugins/publish/extract_subset_resources.py similarity index 100% rename from client/ayon_core/hosts/flame/plugins/publish/extract_subset_resources.py rename to server_addon/flame/client/ayon_flame/plugins/publish/extract_subset_resources.py diff --git a/client/ayon_core/hosts/flame/plugins/publish/integrate_batch_group.py b/server_addon/flame/client/ayon_flame/plugins/publish/integrate_batch_group.py similarity index 100% rename from client/ayon_core/hosts/flame/plugins/publish/integrate_batch_group.py rename to server_addon/flame/client/ayon_flame/plugins/publish/integrate_batch_group.py diff --git a/client/ayon_core/hosts/flame/startup/openpype_babypublisher/export_preset/openpype_seg_thumbnails_jpg.xml b/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/export_preset/openpype_seg_thumbnails_jpg.xml similarity index 100% rename from client/ayon_core/hosts/flame/startup/openpype_babypublisher/export_preset/openpype_seg_thumbnails_jpg.xml rename to server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/export_preset/openpype_seg_thumbnails_jpg.xml diff --git a/client/ayon_core/hosts/flame/startup/openpype_babypublisher/export_preset/openpype_seg_video_h264.xml b/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/export_preset/openpype_seg_video_h264.xml similarity index 100% rename from client/ayon_core/hosts/flame/startup/openpype_babypublisher/export_preset/openpype_seg_video_h264.xml rename to server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/export_preset/openpype_seg_video_h264.xml diff --git a/client/ayon_core/hosts/flame/startup/openpype_babypublisher/modules/__init__.py b/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/__init__.py similarity index 100% rename from client/ayon_core/hosts/flame/startup/openpype_babypublisher/modules/__init__.py rename to server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/__init__.py diff --git a/client/ayon_core/hosts/flame/startup/openpype_babypublisher/modules/app_utils.py b/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/app_utils.py similarity index 100% rename from client/ayon_core/hosts/flame/startup/openpype_babypublisher/modules/app_utils.py rename to server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/app_utils.py diff --git a/client/ayon_core/hosts/flame/startup/openpype_babypublisher/modules/ftrack_lib.py b/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/ftrack_lib.py similarity index 100% rename from client/ayon_core/hosts/flame/startup/openpype_babypublisher/modules/ftrack_lib.py rename to server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/ftrack_lib.py diff --git a/client/ayon_core/hosts/flame/startup/openpype_babypublisher/modules/panel_app.py b/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/panel_app.py similarity index 100% rename from client/ayon_core/hosts/flame/startup/openpype_babypublisher/modules/panel_app.py rename to server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/panel_app.py diff --git a/client/ayon_core/hosts/flame/startup/openpype_babypublisher/modules/uiwidgets.py b/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/uiwidgets.py similarity index 100% rename from client/ayon_core/hosts/flame/startup/openpype_babypublisher/modules/uiwidgets.py rename to server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/modules/uiwidgets.py diff --git a/client/ayon_core/hosts/flame/startup/openpype_babypublisher/openpype_babypublisher.py b/server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/openpype_babypublisher.py similarity index 100% rename from client/ayon_core/hosts/flame/startup/openpype_babypublisher/openpype_babypublisher.py rename to server_addon/flame/client/ayon_flame/startup/openpype_babypublisher/openpype_babypublisher.py diff --git a/client/ayon_core/hosts/flame/startup/openpype_in_flame.py b/server_addon/flame/client/ayon_flame/startup/openpype_in_flame.py similarity index 100% rename from client/ayon_core/hosts/flame/startup/openpype_in_flame.py rename to server_addon/flame/client/ayon_flame/startup/openpype_in_flame.py From 7ad67f57b907f5589e87591c315fb4cc793a09f1 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:28:54 +0200 Subject: [PATCH 40/67] renamed 'HOST_DIR to 'FLAME_ADDON_ROOT' --- server_addon/flame/client/ayon_flame/__init__.py | 4 ++-- server_addon/flame/client/ayon_flame/addon.py | 6 +++--- server_addon/flame/client/ayon_flame/api/pipeline.py | 5 ++--- server_addon/flame/client/ayon_flame/api/utils.py | 5 +++-- .../flame/client/ayon_flame/hooks/pre_flame_setup.py | 5 +++-- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/server_addon/flame/client/ayon_flame/__init__.py b/server_addon/flame/client/ayon_flame/__init__.py index b45f107747..c7b4516c95 100644 --- a/server_addon/flame/client/ayon_flame/__init__.py +++ b/server_addon/flame/client/ayon_flame/__init__.py @@ -1,10 +1,10 @@ from .addon import ( - HOST_DIR, + FLAME_ADDON_ROOT, FlameAddon, ) __all__ = ( - "HOST_DIR", + "FLAME_ADDON_ROOT", "FlameAddon", ) diff --git a/server_addon/flame/client/ayon_flame/addon.py b/server_addon/flame/client/ayon_flame/addon.py index f5560cde7a..2a9c57b24c 100644 --- a/server_addon/flame/client/ayon_flame/addon.py +++ b/server_addon/flame/client/ayon_flame/addon.py @@ -1,7 +1,7 @@ import os from ayon_core.addon import AYONAddon, IHostAddon -HOST_DIR = os.path.dirname(os.path.abspath(__file__)) +FLAME_ADDON_ROOT = os.path.dirname(os.path.abspath(__file__)) class FlameAddon(AYONAddon, IHostAddon): @@ -10,7 +10,7 @@ class FlameAddon(AYONAddon, IHostAddon): def add_implementation_envs(self, env, _app): # Add requirements to DL_PYTHON_HOOK_PATH - env["DL_PYTHON_HOOK_PATH"] = os.path.join(HOST_DIR, "startup") + env["DL_PYTHON_HOOK_PATH"] = os.path.join(FLAME_ADDON_ROOT, "startup") env.pop("QT_AUTO_SCREEN_SCALE_FACTOR", None) # Set default values if are not already set via settings @@ -25,7 +25,7 @@ class FlameAddon(AYONAddon, IHostAddon): if app.host_name != self.host_name: return [] return [ - os.path.join(HOST_DIR, "hooks") + os.path.join(FLAME_ADDON_ROOT, "hooks") ] def get_workfile_extensions(self): diff --git a/server_addon/flame/client/ayon_flame/api/pipeline.py b/server_addon/flame/client/ayon_flame/api/pipeline.py index 4578d7bb4b..73baca87df 100644 --- a/server_addon/flame/client/ayon_flame/api/pipeline.py +++ b/server_addon/flame/client/ayon_flame/api/pipeline.py @@ -13,6 +13,7 @@ from ayon_core.pipeline import ( deregister_creator_plugin_path, AVALON_CONTAINER_ID, ) +from ayon_flame import FLAME_ADDON_ROOT from .lib import ( set_segment_data_marker, set_publish_attribute, @@ -20,10 +21,8 @@ from .lib import ( get_current_sequence, reset_segment_selection ) -from .. import HOST_DIR -API_DIR = os.path.join(HOST_DIR, "api") -PLUGINS_DIR = os.path.join(HOST_DIR, "plugins") +PLUGINS_DIR = os.path.join(FLAME_ADDON_ROOT, "plugins") PUBLISH_PATH = os.path.join(PLUGINS_DIR, "publish") LOAD_PATH = os.path.join(PLUGINS_DIR, "load") CREATE_PATH = os.path.join(PLUGINS_DIR, "create") diff --git a/server_addon/flame/client/ayon_flame/api/utils.py b/server_addon/flame/client/ayon_flame/api/utils.py index b76dd92ada..03a694c25c 100644 --- a/server_addon/flame/client/ayon_flame/api/utils.py +++ b/server_addon/flame/client/ayon_flame/api/utils.py @@ -5,6 +5,8 @@ Flame utils for syncing scripts import os import shutil from ayon_core.lib import Logger +from ayon_flame import FLAME_ADDON_ROOT + log = Logger.get_logger(__name__) @@ -16,7 +18,6 @@ def _sync_utility_scripts(env=None): `/opt/Autodesk/shared/python`. This will be always synchronizing those folders. """ - from .. import HOST_DIR env = env or os.environ @@ -26,7 +27,7 @@ def _sync_utility_scripts(env=None): flame_shared_dir = "/opt/Autodesk/shared/python" fsd_paths = [os.path.join( - HOST_DIR, + FLAME_ADDON_ROOT, "api", "utility_scripts" )] diff --git a/server_addon/flame/client/ayon_flame/hooks/pre_flame_setup.py b/server_addon/flame/client/ayon_flame/hooks/pre_flame_setup.py index 77a9435205..e9e9aca3f4 100644 --- a/server_addon/flame/client/ayon_flame/hooks/pre_flame_setup.py +++ b/server_addon/flame/client/ayon_flame/hooks/pre_flame_setup.py @@ -10,7 +10,7 @@ from ayon_core.lib import ( run_subprocess, ) from ayon_applications import PreLaunchHook, LaunchTypes -from ayon_core.hosts import flame as opflame +from ayon_flame import FLAME_ADDON_ROOT class FlamePrelaunch(PreLaunchHook): @@ -23,7 +23,8 @@ class FlamePrelaunch(PreLaunchHook): permissions = 0o777 wtc_script_path = os.path.join( - opflame.HOST_DIR, "api", "scripts", "wiretap_com.py") + FLAME_ADDON_ROOT, "api", "scripts", "wiretap_com.py" + ) launch_types = {LaunchTypes.local} def __init__(self, *args, **kwargs): From 9ce468d15577bed0c3c2aa1cb4fd083bfbac4b4f Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:29:22 +0200 Subject: [PATCH 41/67] fixed imports --- server_addon/flame/client/ayon_flame/api/menu.py | 2 +- server_addon/flame/client/ayon_flame/otio/flame_export.py | 2 +- .../client/ayon_flame/plugins/create/create_shot_clip.py | 2 +- .../flame/client/ayon_flame/plugins/load/load_clip.py | 2 +- .../flame/client/ayon_flame/plugins/load/load_clip_batch.py | 2 +- .../ayon_flame/plugins/publish/collect_test_selection.py | 4 ++-- .../ayon_flame/plugins/publish/collect_timeline_instances.py | 4 ++-- .../ayon_flame/plugins/publish/collect_timeline_otio.py | 4 ++-- .../ayon_flame/plugins/publish/extract_subset_resources.py | 4 ++-- .../ayon_flame/plugins/publish/integrate_batch_group.py | 2 +- .../flame/client/ayon_flame/startup/openpype_in_flame.py | 2 +- 11 files changed, 15 insertions(+), 15 deletions(-) diff --git a/server_addon/flame/client/ayon_flame/api/menu.py b/server_addon/flame/client/ayon_flame/api/menu.py index 7e880483f5..83d75d18d3 100644 --- a/server_addon/flame/client/ayon_flame/api/menu.py +++ b/server_addon/flame/client/ayon_flame/api/menu.py @@ -28,7 +28,7 @@ default_flame_export_presets = { def callback_selection(selection, function): - import ayon_core.hosts.flame.api as opfapi + import ayon_flame.api as opfapi opfapi.CTX.selection = selection print("Hook Selection: \n\t{}".format( pformat({ diff --git a/server_addon/flame/client/ayon_flame/otio/flame_export.py b/server_addon/flame/client/ayon_flame/otio/flame_export.py index cb038f9e9a..bebe9be1c1 100644 --- a/server_addon/flame/client/ayon_flame/otio/flame_export.py +++ b/server_addon/flame/client/ayon_flame/otio/flame_export.py @@ -275,7 +275,7 @@ def create_otio_reference(clip_data, fps=None): def create_otio_clip(clip_data): - from ayon_core.hosts.flame.api import MediaInfoFile, TimeEffectMetadata + from ayon_flame.api import MediaInfoFile, TimeEffectMetadata segment = clip_data["PySegment"] diff --git a/server_addon/flame/client/ayon_flame/plugins/create/create_shot_clip.py b/server_addon/flame/client/ayon_flame/plugins/create/create_shot_clip.py index 56f5319f21..120c8c559d 100644 --- a/server_addon/flame/client/ayon_flame/plugins/create/create_shot_clip.py +++ b/server_addon/flame/client/ayon_flame/plugins/create/create_shot_clip.py @@ -1,5 +1,5 @@ from copy import deepcopy -import ayon_core.hosts.flame.api as opfapi +import ayon_flame.api as opfapi class CreateShotClip(opfapi.Creator): diff --git a/server_addon/flame/client/ayon_flame/plugins/load/load_clip.py b/server_addon/flame/client/ayon_flame/plugins/load/load_clip.py index 40ab9c038b..c8ec7b36c9 100644 --- a/server_addon/flame/client/ayon_flame/plugins/load/load_clip.py +++ b/server_addon/flame/client/ayon_flame/plugins/load/load_clip.py @@ -2,7 +2,7 @@ from copy import deepcopy import os import flame from pprint import pformat -import ayon_core.hosts.flame.api as opfapi +import ayon_flame.api as opfapi from ayon_core.lib import StringTemplate from ayon_core.lib.transcoding import ( VIDEO_EXTENSIONS, diff --git a/server_addon/flame/client/ayon_flame/plugins/load/load_clip_batch.py b/server_addon/flame/client/ayon_flame/plugins/load/load_clip_batch.py index 1b23a8b465..0d7a125af7 100644 --- a/server_addon/flame/client/ayon_flame/plugins/load/load_clip_batch.py +++ b/server_addon/flame/client/ayon_flame/plugins/load/load_clip_batch.py @@ -2,7 +2,7 @@ from copy import deepcopy import os import flame from pprint import pformat -import ayon_core.hosts.flame.api as opfapi +import ayon_flame.api as opfapi from ayon_core.lib import StringTemplate from ayon_core.lib.transcoding import ( VIDEO_EXTENSIONS, diff --git a/server_addon/flame/client/ayon_flame/plugins/publish/collect_test_selection.py b/server_addon/flame/client/ayon_flame/plugins/publish/collect_test_selection.py index 7442e7df48..dac2c862e6 100644 --- a/server_addon/flame/client/ayon_flame/plugins/publish/collect_test_selection.py +++ b/server_addon/flame/client/ayon_flame/plugins/publish/collect_test_selection.py @@ -1,8 +1,8 @@ import os import pyblish.api import tempfile -import ayon_core.hosts.flame.api as opfapi -from ayon_core.hosts.flame.otio import flame_export as otio_export +import ayon_flame.api as opfapi +from ayon_flame.otio import flame_export as otio_export import opentimelineio as otio from pprint import pformat reload(otio_export) # noqa diff --git a/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_instances.py b/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_instances.py index ca5475824d..06108a37a7 100644 --- a/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_instances.py +++ b/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_instances.py @@ -1,8 +1,8 @@ import re from types import NoneType import pyblish -import ayon_core.hosts.flame.api as opfapi -from ayon_core.hosts.flame.otio import flame_export +import ayon_flame.api as opfapi +from ayon_flame.otio import flame_export from ayon_core.pipeline import AYON_INSTANCE_ID, AVALON_INSTANCE_ID from ayon_core.pipeline.editorial import ( is_overlapping_otio_ranges, diff --git a/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_otio.py b/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_otio.py index 7609ea7879..139ac5b875 100644 --- a/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_otio.py +++ b/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_otio.py @@ -1,7 +1,7 @@ import pyblish.api -import ayon_core.hosts.flame.api as opfapi -from ayon_core.hosts.flame.otio import flame_export +import ayon_flame.api as opfapi +from ayon_flame.otio import flame_export from ayon_core.pipeline.create import get_product_name diff --git a/server_addon/flame/client/ayon_flame/plugins/publish/extract_subset_resources.py b/server_addon/flame/client/ayon_flame/plugins/publish/extract_subset_resources.py index cae08cd76b..51c0b280b7 100644 --- a/server_addon/flame/client/ayon_flame/plugins/publish/extract_subset_resources.py +++ b/server_addon/flame/client/ayon_flame/plugins/publish/extract_subset_resources.py @@ -5,8 +5,8 @@ from copy import deepcopy import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.flame import api as opfapi -from ayon_core.hosts.flame.api import MediaInfoFile +from ayon_flame import api as opfapi +from ayon_flame.api import MediaInfoFile from ayon_core.pipeline.editorial import ( get_media_range_with_retimes ) diff --git a/server_addon/flame/client/ayon_flame/plugins/publish/integrate_batch_group.py b/server_addon/flame/client/ayon_flame/plugins/publish/integrate_batch_group.py index d8669f836d..776c89d38d 100644 --- a/server_addon/flame/client/ayon_flame/plugins/publish/integrate_batch_group.py +++ b/server_addon/flame/client/ayon_flame/plugins/publish/integrate_batch_group.py @@ -3,7 +3,7 @@ import copy from collections import OrderedDict from pprint import pformat import pyblish -import ayon_core.hosts.flame.api as opfapi +import ayon_flame.api as opfapi import ayon_core.pipeline as op_pipeline from ayon_core.pipeline.workfile import get_workdir diff --git a/server_addon/flame/client/ayon_flame/startup/openpype_in_flame.py b/server_addon/flame/client/ayon_flame/startup/openpype_in_flame.py index b9cbf9700b..8f319a88eb 100644 --- a/server_addon/flame/client/ayon_flame/startup/openpype_in_flame.py +++ b/server_addon/flame/client/ayon_flame/startup/openpype_in_flame.py @@ -4,7 +4,7 @@ from qtpy import QtWidgets from pprint import pformat import atexit -import ayon_core.hosts.flame.api as opfapi +import ayon_flame.api as opfapi from ayon_core.pipeline import ( install_host, registered_host, From c349cc7015dafc9e534f379535189d2502eaee7b Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:29:30 +0200 Subject: [PATCH 42/67] added settings category --- .../ayon_flame/plugins/publish/collect_timeline_instances.py | 2 ++ .../ayon_flame/plugins/publish/extract_subset_resources.py | 2 ++ .../client/ayon_flame/plugins/publish/integrate_batch_group.py | 2 ++ 3 files changed, 6 insertions(+) diff --git a/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_instances.py b/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_instances.py index 06108a37a7..35591f1a0d 100644 --- a/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_instances.py +++ b/server_addon/flame/client/ayon_flame/plugins/publish/collect_timeline_instances.py @@ -24,6 +24,8 @@ class CollectTimelineInstances(pyblish.api.ContextPlugin): label = "Collect timeline Instances" hosts = ["flame"] + settings_category = "flame" + audio_track_items = [] # settings diff --git a/server_addon/flame/client/ayon_flame/plugins/publish/extract_subset_resources.py b/server_addon/flame/client/ayon_flame/plugins/publish/extract_subset_resources.py index 51c0b280b7..66c6181ffb 100644 --- a/server_addon/flame/client/ayon_flame/plugins/publish/extract_subset_resources.py +++ b/server_addon/flame/client/ayon_flame/plugins/publish/extract_subset_resources.py @@ -24,6 +24,8 @@ class ExtractProductResources(publish.Extractor): families = ["clip"] hosts = ["flame"] + settings_category = "flame" + # plugin defaults keep_original_representation = False diff --git a/server_addon/flame/client/ayon_flame/plugins/publish/integrate_batch_group.py b/server_addon/flame/client/ayon_flame/plugins/publish/integrate_batch_group.py index 776c89d38d..f77c9e9116 100644 --- a/server_addon/flame/client/ayon_flame/plugins/publish/integrate_batch_group.py +++ b/server_addon/flame/client/ayon_flame/plugins/publish/integrate_batch_group.py @@ -16,6 +16,8 @@ class IntegrateBatchGroup(pyblish.api.InstancePlugin): hosts = ["flame"] families = ["clip"] + settings_category = "flame" + # settings default_loader = "LoadClip" From c5ca23ff0f098410c19a721e4f710ac98ea1ea8a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:29:38 +0200 Subject: [PATCH 43/67] removed resolve import --- server_addon/flame/client/ayon_flame/api/pipeline.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/server_addon/flame/client/ayon_flame/api/pipeline.py b/server_addon/flame/client/ayon_flame/api/pipeline.py index 73baca87df..121b925920 100644 --- a/server_addon/flame/client/ayon_flame/api/pipeline.py +++ b/server_addon/flame/client/ayon_flame/api/pipeline.py @@ -112,10 +112,6 @@ def on_pyblish_instance_toggled(instance, old_value, new_value): log.info("instance toggle: {}, old_value: {}, new_value:{} ".format( instance, old_value, new_value)) - # from ayon_core.hosts.resolve import ( - # set_publish_attribute - # ) - # # Whether instances should be passthrough based on new value # timeline_item = instance.data["item"] # set_publish_attribute(timeline_item, new_value) From ded6f0b7beb98c58351a6e93b5699b6638b097f6 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:30:57 +0200 Subject: [PATCH 44/67] added more information to package --- server_addon/flame/package.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/server_addon/flame/package.py b/server_addon/flame/package.py index 8c077ed91d..f228e61f8e 100644 --- a/server_addon/flame/package.py +++ b/server_addon/flame/package.py @@ -1,3 +1,10 @@ name = "flame" title = "Flame" -version = "0.1.0" +version = "0.2.0" + +client_dir = "ayon_flame" + +ayon_required_addons = { + "core": ">0.3.2", +} +ayon_compatible_addons = {} From 7de260a0f6dc5141fd510beab84943b6eb1d6249 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:33:32 +0200 Subject: [PATCH 45/67] added version.py --- server_addon/flame/client/ayon_flame/version.py | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 server_addon/flame/client/ayon_flame/version.py diff --git a/server_addon/flame/client/ayon_flame/version.py b/server_addon/flame/client/ayon_flame/version.py new file mode 100644 index 0000000000..0004797e59 --- /dev/null +++ b/server_addon/flame/client/ayon_flame/version.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +"""Package declaring AYON addon 'flame' version.""" +__version__ = "0.2.0" From 8df1cab5896543a6c5645398acd8192b6ef07bc3 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:33:46 +0200 Subject: [PATCH 46/67] added flame to version milestones --- client/ayon_core/addon/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index 939fab68b8..fa008778dd 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -52,6 +52,7 @@ IGNORED_MODULES_IN_AYON = set() MOVED_ADDON_MILESTONE_VERSIONS = { "applications": VersionInfo(0, 2, 0), "clockify": VersionInfo(0, 2, 0), + "flame": VersionInfo(0, 2, 0), "traypublisher": VersionInfo(0, 2, 0), "tvpaint": VersionInfo(0, 2, 0), "nuke": VersionInfo(0, 2, 0), From cfb06c9a9be33b6f472263200a5f9db26bd4a66a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:36:13 +0200 Subject: [PATCH 47/67] added version.py --- server_addon/celaction/client/ayon_celaction/version.py | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 server_addon/celaction/client/ayon_celaction/version.py diff --git a/server_addon/celaction/client/ayon_celaction/version.py b/server_addon/celaction/client/ayon_celaction/version.py new file mode 100644 index 0000000000..ceed47c3a0 --- /dev/null +++ b/server_addon/celaction/client/ayon_celaction/version.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +"""Package declaring AYON addon 'celaction' version.""" +__version__ = "0.2.0" From ddb4da0e869ed00ed8ac09cf382431cc58e328cb Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:36:59 +0200 Subject: [PATCH 48/67] added version to cealaction addon class --- server_addon/celaction/client/ayon_celaction/__init__.py | 3 +++ server_addon/celaction/client/ayon_celaction/addon.py | 3 +++ 2 files changed, 6 insertions(+) diff --git a/server_addon/celaction/client/ayon_celaction/__init__.py b/server_addon/celaction/client/ayon_celaction/__init__.py index 8983d48d7d..0df0224125 100644 --- a/server_addon/celaction/client/ayon_celaction/__init__.py +++ b/server_addon/celaction/client/ayon_celaction/__init__.py @@ -1,3 +1,4 @@ +from .version import __version__ from .addon import ( CELACTION_ROOT_DIR, CelactionAddon, @@ -5,6 +6,8 @@ from .addon import ( __all__ = ( + "__version__", + "CELACTION_ROOT_DIR", "CelactionAddon", ) diff --git a/server_addon/celaction/client/ayon_celaction/addon.py b/server_addon/celaction/client/ayon_celaction/addon.py index d00401a2e0..ad04a54088 100644 --- a/server_addon/celaction/client/ayon_celaction/addon.py +++ b/server_addon/celaction/client/ayon_celaction/addon.py @@ -1,11 +1,14 @@ import os from ayon_core.addon import AYONAddon, IHostAddon +from .version import __version__ + CELACTION_ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) class CelactionAddon(AYONAddon, IHostAddon): name = "celaction" + version = __version__ host_name = "celaction" def get_launch_hook_paths(self, app): From 230a7c1ac34a64268c79a0d557402c69f236a3ca Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 11:37:46 +0200 Subject: [PATCH 49/67] added 'version' to addon class --- server_addon/flame/client/ayon_flame/__init__.py | 3 +++ server_addon/flame/client/ayon_flame/addon.py | 3 +++ 2 files changed, 6 insertions(+) diff --git a/server_addon/flame/client/ayon_flame/__init__.py b/server_addon/flame/client/ayon_flame/__init__.py index c7b4516c95..d2d89bdb01 100644 --- a/server_addon/flame/client/ayon_flame/__init__.py +++ b/server_addon/flame/client/ayon_flame/__init__.py @@ -1,3 +1,4 @@ +from .version import __version__ from .addon import ( FLAME_ADDON_ROOT, FlameAddon, @@ -5,6 +6,8 @@ from .addon import ( __all__ = ( + "__version__", + "FLAME_ADDON_ROOT", "FlameAddon", ) diff --git a/server_addon/flame/client/ayon_flame/addon.py b/server_addon/flame/client/ayon_flame/addon.py index 2a9c57b24c..5a96a9332e 100644 --- a/server_addon/flame/client/ayon_flame/addon.py +++ b/server_addon/flame/client/ayon_flame/addon.py @@ -1,11 +1,14 @@ import os from ayon_core.addon import AYONAddon, IHostAddon +from .version import __version__ + FLAME_ADDON_ROOT = os.path.dirname(os.path.abspath(__file__)) class FlameAddon(AYONAddon, IHostAddon): name = "flame" + version = __version__ host_name = "flame" def add_implementation_envs(self, env, _app): From 4b593e9273176255395b68d71cfd6373b9410d30 Mon Sep 17 00:00:00 2001 From: Kayla Man <64118225+moonyuet@users.noreply.github.com> Date: Thu, 30 May 2024 19:54:22 +0800 Subject: [PATCH 50/67] Update server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py --- .../ayon_substancepainter/plugins/create/create_workfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py index 0bf451f0e2..b100e4189d 100644 --- a/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py +++ b/server_addon/substancepainter/client/ayon_substancepainter/plugins/create/create_workfile.py @@ -16,7 +16,7 @@ import substance_painter.project class CreateWorkfile(AutoCreator): """Workfile auto-creator.""" - identifier = "io.ayon.creators.substancepainter.workfile" + identifier = "io.openpype.creators.substancepainter.workfile" label = "Workfile" product_type = "workfile" icon = "document" From 7259bd2f1deeaaaeab42581ad3d3f5a4ae61a7b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Samohel?= Date: Thu, 30 May 2024 14:12:21 +0200 Subject: [PATCH 51/67] :art: add settings category to plugin base class --- .../maya/client/ayon_maya/api/plugin.py | 59 ++++++++++++++----- .../plugins/load/load_arnold_standin.py | 16 ++--- .../plugins/load/load_as_template.py | 16 ++--- .../ayon_maya/plugins/load/load_assembly.py | 14 ++--- .../ayon_maya/plugins/load/load_audio.py | 13 ++-- .../ayon_maya/plugins/load/load_gpucache.py | 14 ++--- .../ayon_maya/plugins/load/load_image.py | 23 +++----- .../plugins/load/load_image_plane.py | 18 +++--- .../ayon_maya/plugins/load/load_look.py | 10 ++-- .../ayon_maya/plugins/load/load_matchmove.py | 5 +- .../ayon_maya/plugins/load/load_maya_usd.py | 14 ++--- .../plugins/load/load_multiverse_usd.py | 19 ++---- .../plugins/load/load_multiverse_usd_over.py | 17 ++---- .../plugins/load/load_redshift_proxy.py | 18 ++---- .../ayon_maya/plugins/load/load_reference.py | 9 ++- .../plugins/load/load_rendersetup.py | 15 ++--- .../plugins/load/load_vdb_to_arnold.py | 20 ++++--- .../plugins/load/load_vdb_to_redshift.py | 13 ++-- .../plugins/load/load_vdb_to_vray.py | 11 ++-- .../ayon_maya/plugins/load/load_vrayproxy.py | 18 ++---- .../ayon_maya/plugins/load/load_vrayscene.py | 15 ++--- .../ayon_maya/plugins/load/load_xgen.py | 20 +++---- .../ayon_maya/plugins/load/load_yeti_cache.py | 17 ++---- .../ayon_maya/plugins/load/load_yeti_rig.py | 5 +- .../plugins/publish/collect_animation.py | 7 +-- .../publish/collect_arnold_scene_source.py | 6 +- .../plugins/publish/collect_assembly.py | 12 +++- .../plugins/publish/collect_current_file.py | 6 +- .../plugins/publish/collect_fbx_animation.py | 6 +- .../plugins/publish/collect_fbx_camera.py | 5 +- .../publish/collect_file_dependencies.py | 5 +- .../ayon_maya/plugins/publish/collect_gltf.py | 3 +- .../plugins/publish/collect_history.py | 6 +- .../plugins/publish/collect_inputs.py | 4 +- .../plugins/publish/collect_instances.py | 3 +- .../ayon_maya/plugins/publish/collect_look.py | 11 ++-- .../publish/collect_maya_scene_time.py | 6 +- .../plugins/publish/collect_maya_units.py | 5 +- .../plugins/publish/collect_maya_workspace.py | 5 +- .../plugins/publish/collect_model.py | 6 +- .../publish/collect_multiverse_look.py | 5 +- .../plugins/publish/collect_pointcache.py | 7 +-- .../plugins/publish/collect_remove_marked.py | 3 +- .../plugins/publish/collect_render.py | 19 +++--- .../publish/collect_render_layer_aovs.py | 10 ++-- .../publish/collect_renderable_camera.py | 7 +-- .../plugins/publish/collect_review.py | 7 +-- .../plugins/publish/collect_rig_sets.py | 4 +- .../plugins/publish/collect_skeleton_mesh.py | 6 +- .../publish/collect_unreal_skeletalmesh.py | 3 +- .../publish/collect_unreal_staticmesh.py | 3 +- .../collect_user_defined_attributes.py | 5 +- .../plugins/publish/collect_vrayproxy.py | 3 +- .../plugins/publish/collect_vrayscene.py | 4 +- .../plugins/publish/collect_workfile.py | 4 +- .../plugins/publish/collect_workscene_fps.py | 4 +- .../ayon_maya/plugins/publish/collect_xgen.py | 6 +- .../plugins/publish/collect_yeti_cache.py | 9 +-- .../plugins/publish/collect_yeti_rig.py | 11 ++-- .../publish/determine_future_version.py | 4 +- .../publish/extract_active_view_thumbnail.py | 11 ++-- .../publish/extract_arnold_scene_source.py | 10 ++-- .../plugins/publish/extract_assembly.py | 8 +-- .../plugins/publish/extract_camera_alembic.py | 4 +- .../publish/extract_camera_mayaScene.py | 14 ++--- .../ayon_maya/plugins/publish/extract_fbx.py | 9 ++- .../plugins/publish/extract_fbx_animation.py | 12 ++-- .../ayon_maya/plugins/publish/extract_gltf.py | 8 +-- .../plugins/publish/extract_gpu_cache.py | 7 +-- .../publish/extract_import_reference.py | 11 ++-- .../plugins/publish/extract_layout.py | 10 ++-- .../ayon_maya/plugins/publish/extract_look.py | 26 ++++---- .../plugins/publish/extract_maya_scene_raw.py | 17 ++---- .../plugins/publish/extract_maya_usd.py | 14 ++--- .../plugins/publish/extract_model.py | 7 +-- .../publish/extract_multiverse_look.py | 5 +- .../plugins/publish/extract_multiverse_usd.py | 11 ++-- .../publish/extract_multiverse_usd_comp.py | 8 +-- .../publish/extract_multiverse_usd_over.py | 6 +- .../ayon_maya/plugins/publish/extract_obj.py | 7 +-- .../plugins/publish/extract_playblast.py | 7 +-- .../plugins/publish/extract_pointcache.py | 31 +++++----- .../plugins/publish/extract_proxy_abc.py | 12 ++-- .../plugins/publish/extract_redshift_proxy.py | 17 ++---- .../plugins/publish/extract_rendersetup.py | 7 +-- .../ayon_maya/plugins/publish/extract_rig.py | 8 +-- .../plugins/publish/extract_skeleton_mesh.py | 5 +- .../plugins/publish/extract_thumbnail.py | 7 +-- .../extract_unreal_skeletalmesh_abc.py | 13 ++-- .../extract_unreal_skeletalmesh_fbx.py | 8 +-- .../publish/extract_unreal_staticmesh.py | 15 ++--- .../publish/extract_unreal_yeticache.py | 6 +- .../plugins/publish/extract_vrayproxy.py | 8 +-- .../plugins/publish/extract_vrayscene.py | 8 +-- .../plugins/publish/extract_workfile_xgen.py | 10 ++-- .../ayon_maya/plugins/publish/extract_xgen.py | 15 ++--- .../plugins/publish/extract_yeti_cache.py | 8 +-- .../plugins/publish/extract_yeti_rig.py | 12 ++-- .../increment_current_file_deadline.py | 6 +- .../plugins/publish/reset_xgen_attributes.py | 6 +- .../ayon_maya/plugins/publish/save_scene.py | 10 ++-- .../validate_alembic_options_defaults.py | 8 +-- .../publish/validate_animation_content.py | 7 +-- ...date_animation_out_set_related_node_ids.py | 15 +++-- .../publish/validate_arnold_scene_source.py | 11 ++-- .../validate_arnold_scene_source_cbid.py | 11 ++-- .../publish/validate_ass_relative_paths.py | 5 +- .../plugins/publish/validate_assembly_name.py | 9 +-- .../publish/validate_assembly_namespaces.py | 10 ++-- .../publish/validate_assembly_transforms.py | 13 ++-- .../plugins/publish/validate_attributes.py | 17 +++--- .../publish/validate_camera_attributes.py | 9 ++- .../publish/validate_camera_contents.py | 5 +- .../plugins/publish/validate_color_sets.py | 12 ++-- ...validate_current_renderlayer_renderable.py | 11 ++-- .../plugins/publish/validate_cycle_error.py | 16 ++--- .../plugins/publish/validate_frame_range.py | 16 ++--- .../plugins/publish/validate_glsl_material.py | 17 +++--- .../plugins/publish/validate_glsl_plugin.py | 6 +- .../publish/validate_instance_has_members.py | 7 +-- .../publish/validate_instance_in_context.py | 9 ++- .../publish/validate_instance_subset.py | 6 +- .../plugins/publish/validate_loaded_plugin.py | 4 +- .../plugins/publish/validate_look_contents.py | 9 +-- ...lidate_look_default_shaders_connections.py | 9 ++- .../validate_look_id_reference_edits.py | 9 ++- .../validate_look_no_default_shaders.py | 10 ++-- .../plugins/publish/validate_look_sets.py | 5 +- .../publish/validate_look_shading_group.py | 12 ++-- .../publish/validate_look_single_shader.py | 12 ++-- .../plugins/publish/validate_maya_units.py | 13 ++-- .../validate_mesh_arnold_attributes.py | 23 ++++---- .../plugins/publish/validate_mesh_empty.py | 10 ++-- .../plugins/publish/validate_mesh_has_uv.py | 12 ++-- .../publish/validate_mesh_lamina_faces.py | 12 ++-- .../plugins/publish/validate_mesh_ngons.py | 20 +++---- .../validate_mesh_no_negative_scale.py | 12 ++-- .../publish/validate_mesh_non_manifold.py | 12 ++-- .../publish/validate_mesh_non_zero_edge.py | 20 +++---- .../publish/validate_mesh_normals_unlocked.py | 14 ++--- .../publish/validate_mesh_overlapping_uvs.py | 16 +++-- .../validate_mesh_shader_connections.py | 12 ++-- .../publish/validate_mesh_single_uv_set.py | 14 ++--- .../publish/validate_mesh_uv_set_map1.py | 12 ++-- .../validate_mesh_vertices_have_edges.py | 12 ++-- .../plugins/publish/validate_model_content.py | 20 +++---- .../publish/validate_mvlook_contents.py | 10 ++-- .../plugins/publish/validate_no_animation.py | 11 ++-- .../publish/validate_no_default_camera.py | 12 ++-- .../plugins/publish/validate_no_namespace.py | 13 ++-- .../publish/validate_no_null_transforms.py | 12 ++-- .../publish/validate_no_unknown_nodes.py | 11 ++-- .../plugins/publish/validate_no_vraymesh.py | 8 ++- .../plugins/publish/validate_node_ids.py | 6 +- .../validate_node_ids_deformed_shapes.py | 17 +++--- .../publish/validate_node_ids_in_database.py | 12 ++-- .../publish/validate_node_ids_related.py | 14 +++-- .../publish/validate_node_ids_unique.py | 14 ++--- .../publish/validate_node_no_ghosting.py | 13 ++-- .../validate_plugin_path_attributes.py | 21 +++---- .../publish/validate_render_image_rule.py | 11 ++-- .../validate_render_no_default_cameras.py | 13 ++-- .../publish/validate_render_single_camera.py | 16 +++-- .../publish/validate_renderlayer_aovs.py | 10 ++-- .../publish/validate_rendersettings.py | 11 ++-- .../plugins/publish/validate_resolution.py | 8 +-- .../plugins/publish/validate_resources.py | 6 +- .../plugins/publish/validate_review.py | 5 +- .../plugins/publish/validate_rig_contents.py | 9 ++- .../publish/validate_rig_controllers.py | 23 ++++---- ...idate_rig_controllers_arnold_attributes.py | 24 ++++---- .../publish/validate_rig_joints_hidden.py | 15 ++--- .../publish/validate_rig_out_set_node_ids.py | 17 +++--- .../publish/validate_rig_output_ids.py | 13 ++-- .../publish/validate_scene_set_workspace.py | 10 ++-- .../plugins/publish/validate_setdress_root.py | 7 +-- .../plugins/publish/validate_shader_name.py | 13 ++-- .../publish/validate_shape_default_names.py | 14 ++--- .../publish/validate_shape_render_stats.py | 13 ++-- .../plugins/publish/validate_shape_zero.py | 23 ++++---- .../publish/validate_single_assembly.py | 7 +-- .../validate_skeletalmesh_hierarchy.py | 10 ++-- .../validate_skeletalmesh_triangulated.py | 13 ++-- .../validate_skeleton_top_group_hierarchy.py | 16 +++-- .../validate_skinCluster_deformer_set.py | 6 +- .../plugins/publish/validate_step_size.py | 7 +-- .../validate_transform_naming_suffix.py | 12 ++-- .../publish/validate_transform_zero.py | 12 ++-- .../plugins/publish/validate_unique_names.py | 12 ++-- .../validate_unreal_mesh_triangulated.py | 19 +++--- .../validate_unreal_staticmesh_naming.py | 10 ++-- .../publish/validate_unreal_up_axis.py | 15 ++--- .../plugins/publish/validate_visible_only.py | 12 ++-- .../plugins/publish/validate_vray.py | 7 +-- .../validate_vray_distributed_rendering.py | 11 ++-- .../publish/validate_vray_referenced_aovs.py | 18 +++--- .../validate_vray_translator_settings.py | 11 ++-- .../plugins/publish/validate_vrayproxy.py | 7 +-- .../publish/validate_vrayproxy_members.py | 17 +++--- .../plugins/publish/validate_xgen.py | 7 +-- .../validate_yeti_renderscript_callbacks.py | 16 +++-- .../publish/validate_yeti_rig_cache_state.py | 12 ++-- .../validate_yeti_rig_input_in_instance.py | 13 ++-- .../publish/validate_yeti_rig_settings.py | 6 +- 204 files changed, 991 insertions(+), 1287 deletions(-) diff --git a/server_addon/maya/client/ayon_maya/api/plugin.py b/server_addon/maya/client/ayon_maya/api/plugin.py index 0eb998cb36..b8d9748ef1 100644 --- a/server_addon/maya/client/ayon_maya/api/plugin.py +++ b/server_addon/maya/client/ayon_maya/api/plugin.py @@ -2,40 +2,41 @@ import json import os from abc import ABCMeta +import ayon_api import qargparse import six -import ayon_api -from maya import cmds -from maya.app.renderSetup.model import renderSetup from ayon_core.lib import BoolDef, Logger -from ayon_core.settings import get_project_settings from ayon_core.pipeline import ( - AYON_INSTANCE_ID, - AYON_CONTAINER_ID, - AVALON_INSTANCE_ID, AVALON_CONTAINER_ID, + AVALON_INSTANCE_ID, + AYON_CONTAINER_ID, + AYON_INSTANCE_ID, Anatomy, - + AutoCreator, CreatedInstance, Creator as NewCreator, - AutoCreator, - HiddenCreator, - CreatorError, + HiddenCreator, LegacyCreator, LoaderPlugin, - get_representation_path, get_current_project_name, + get_representation_path, + publish, ) -from ayon_core.pipeline.load import LoadError from ayon_core.pipeline.create import get_product_name +from ayon_core.pipeline.load import LoadError +from ayon_core.settings import get_project_settings +from maya import cmds +from maya.app.renderSetup.model import renderSetup +from pyblish.api import ContextPlugin, InstancePlugin from . import lib from .lib import imprint, read from .pipeline import containerise log = Logger.get_logger() +SETTINGS_CATEGORY = "maya" def _get_attr(node, attr, default=None): @@ -652,7 +653,7 @@ def get_load_color_for_product_type(product_type, settings=None): class Loader(LoaderPlugin): hosts = ["maya"] - + settings_category = SETTINGS_CATEGORY load_settings = {} # defined in settings @classmethod @@ -807,9 +808,8 @@ class ReferenceLoader(Loader): raise NotImplementedError("Must be implemented by subclass") def update(self, container, context): - from maya import cmds - from ayon_maya.api.lib import get_container_members + from maya import cmds node = container["objectName"] @@ -1025,3 +1025,30 @@ class ReferenceLoader(Loader): AYON_CONTAINER_ID, AVALON_CONTAINER_ID }: cmds.sets(node, forceElement=container) + + +class MayaLoader(LoaderPlugin): + """Base class for loader plugins.""" + + settings_category = SETTINGS_CATEGORY + + +class MayaInstancePlugin(InstancePlugin): + """Base class for instance publish plugins.""" + + settings_category = SETTINGS_CATEGORY + hosts = ["maya"] + + +class MayaContextPlugin(ContextPlugin): + """Base class for context publish plugins.""" + + settings_category = SETTINGS_CATEGORY + hosts = ["maya"] + + +class MayaExtractorPlugin(publish.Extractor): + """Base class for extract plugins.""" + + settings_category = SETTINGS_CATEGORY + hosts = ["maya"] diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_arnold_standin.py b/server_addon/maya/client/ayon_maya/plugins/load/load_arnold_standin.py index db81199ed6..087a0a488b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_arnold_standin.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_arnold_standin.py @@ -1,21 +1,17 @@ import os + import clique - import maya.cmds as cmds - +from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings -from ayon_core.pipeline import ( - load, - get_representation_path -) from ayon_maya.api.lib import ( - unique_namespace, get_attribute_input, + get_fps_for_current_context, maintained_selection, - get_fps_for_current_context + unique_namespace, ) from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.plugin import Loader, get_load_color_for_product_type def is_sequence(files): @@ -26,7 +22,7 @@ def is_sequence(files): return sequence -class ArnoldStandinLoader(load.LoaderPlugin): +class ArnoldStandinLoader(Loader): """Load as Arnold standin""" product_types = { diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_as_template.py b/server_addon/maya/client/ayon_maya/plugins/load/load_as_template.py index 2a29faa77d..8ad3e526d1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_as_template.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_as_template.py @@ -1,16 +1,10 @@ -from ayon_core.lib import ( - BoolDef -) -from ayon_core.pipeline import ( - load, - registered_host -) -from ayon_maya.api.workfile_template_builder import ( - MayaTemplateBuilder -) +from ayon_core.lib import BoolDef +from ayon_core.pipeline import registered_host +from ayon_maya.api.plugin import Loader +from ayon_maya.api.workfile_template_builder import MayaTemplateBuilder -class LoadAsTemplate(load.LoaderPlugin): +class LoadAsTemplate(Loader): """Load workfile as a template """ product_types = {"workfile", "mayaScene"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_assembly.py b/server_addon/maya/client/ayon_maya/plugins/load/load_assembly.py index b37bf14101..8c6edf3aac 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_assembly.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_assembly.py @@ -1,16 +1,12 @@ import maya.cmds as cmds - -from ayon_core.pipeline import ( - load, - remove_container -) - -from ayon_maya.api.pipeline import containerise -from ayon_maya.api.lib import unique_namespace +from ayon_core.pipeline import remove_container from ayon_maya.api import setdress +from ayon_maya.api.lib import unique_namespace +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.plugin import Loader -class AssemblyLoader(load.LoaderPlugin): +class AssemblyLoader(Loader): product_types = {"assembly"} representations = {"json"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_audio.py b/server_addon/maya/client/ayon_maya/plugins/load/load_audio.py index 81e49c616e..5ad3993e57 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_audio.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_audio.py @@ -1,14 +1,11 @@ +from ayon_core.pipeline import get_representation_path +from ayon_maya.api.lib import get_container_members, unique_namespace +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.plugin import Loader from maya import cmds, mel -from ayon_core.pipeline import ( - load, - get_representation_path, -) -from ayon_maya.api.pipeline import containerise -from ayon_maya.api.lib import unique_namespace, get_container_members - -class AudioLoader(load.LoaderPlugin): +class AudioLoader(Loader): """Specific loader of audio.""" product_types = {"audio"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_gpucache.py b/server_addon/maya/client/ayon_maya/plugins/load/load_gpucache.py index fb6db94cee..d40b31e885 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_gpucache.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_gpucache.py @@ -1,16 +1,12 @@ import maya.cmds as cmds - -from ayon_maya.api.pipeline import containerise -from ayon_maya.api.lib import unique_namespace -from ayon_core.pipeline import ( - load, - get_representation_path -) +from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings -from ayon_maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.lib import unique_namespace +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.plugin import Loader, get_load_color_for_product_type -class GpuCacheLoader(load.LoaderPlugin): +class GpuCacheLoader(Loader): """Load Alembic as gpuCache""" product_types = {"model", "animation", "proxyAbc", "pointcache"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_image.py b/server_addon/maya/client/ayon_maya/plugins/load/load_image.py index 28b44ac99c..3a32237729 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_image.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_image.py @@ -1,24 +1,17 @@ import copy from ayon_core.lib import EnumDef -from ayon_core.pipeline import ( - load, - get_current_host_name, +from ayon_core.pipeline import get_current_host_name +from ayon_core.pipeline.colorspace import ( + get_current_context_imageio_config_preset, + get_imageio_file_rules, + get_imageio_file_rules_colorspace_from_filepath, ) from ayon_core.pipeline.load.utils import get_representation_path_from_context -from ayon_core.pipeline.colorspace import ( - get_imageio_file_rules_colorspace_from_filepath, - get_current_context_imageio_config_preset, - get_imageio_file_rules -) from ayon_core.settings import get_project_settings - +from ayon_maya.api.lib import namespaced, unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.lib import ( - unique_namespace, - namespaced -) - +from ayon_maya.api.plugin import Loader from maya import cmds @@ -88,7 +81,7 @@ def create_stencil(): return file, place, stencil, place_stencil -class FileNodeLoader(load.LoaderPlugin): +class FileNodeLoader(Loader): """File node loader.""" product_types = {"image", "plate", "render"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_image_plane.py b/server_addon/maya/client/ayon_maya/plugins/load/load_image_plane.py index 2740f106d6..21625affca 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_image_plane.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_image_plane.py @@ -1,18 +1,14 @@ -from qtpy import QtWidgets, QtCore - -from ayon_core.pipeline import ( - load, - get_representation_path, -) -from ayon_maya.api.pipeline import containerise +from ayon_core.pipeline import get_representation_path from ayon_maya.api.lib import ( - unique_namespace, + get_container_members, namespaced, pairwise, - get_container_members + unique_namespace, ) - +from ayon_maya.api.pipeline import containerise +from ayon_maya.api.plugin import Loader from maya import cmds +from qtpy import QtCore, QtWidgets def disconnect_inputs(plug): @@ -84,7 +80,7 @@ class CameraWindow(QtWidgets.QDialog): self.close() -class ImagePlaneLoader(load.LoaderPlugin): +class ImagePlaneLoader(Loader): """Specific loader of plate for image planes on selected camera.""" product_types = {"image", "plate", "render"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_look.py b/server_addon/maya/client/ayon_maya/plugins/load/load_look.py index f61d0e9c35..da7b3691fd 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_look.py @@ -3,15 +3,13 @@ import json from collections import defaultdict -from qtpy import QtWidgets -from ayon_api import get_representation_by_name - -from ayon_core.pipeline import get_representation_path import ayon_maya.api.plugin +from ayon_api import get_representation_by_name +from ayon_core.pipeline import get_representation_path +from ayon_core.tools.utils import ScrollMessageBox from ayon_maya.api import lib from ayon_maya.api.lib import get_reference_node - -from ayon_core.tools.utils import ScrollMessageBox +from qtpy import QtWidgets class LookLoader(ayon_maya.api.plugin.ReferenceLoader): diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_matchmove.py b/server_addon/maya/client/ayon_maya/plugins/load/load_matchmove.py index b19b14b1aa..f4aaca6a4d 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_matchmove.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_matchmove.py @@ -1,7 +1,8 @@ +from ayon_maya.api.plugin import Loader from maya import mel -from ayon_core.pipeline import load -class MatchmoveLoader(load.LoaderPlugin): + +class MatchmoveLoader(Loader): """ This will run matchmove script to create track in scene. diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_maya_usd.py b/server_addon/maya/client/ayon_maya/plugins/load/load_maya_usd.py index 6c2945f4a8..b3bd2475fd 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_maya_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_maya_usd.py @@ -1,19 +1,13 @@ # -*- coding: utf-8 -*- import maya.cmds as cmds - -from ayon_core.pipeline import ( - load, - get_representation_path, -) +from ayon_core.pipeline import get_representation_path from ayon_core.pipeline.load import get_representation_path_from_context -from ayon_maya.api.lib import ( - namespaced, - unique_namespace -) +from ayon_maya.api.lib import namespaced, unique_namespace from ayon_maya.api.pipeline import containerise +from ayon_maya.api.plugin import Loader -class MayaUsdLoader(load.LoaderPlugin): +class MayaUsdLoader(Loader): """Read USD data in a Maya USD Proxy""" product_types = {"model", "usd", "pointcache", "animation"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd.py b/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd.py index 93bb95092e..ca347697ab 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd.py @@ -1,23 +1,16 @@ # -*- coding: utf-8 -*- -import maya.cmds as cmds -from maya import mel import os +import maya.cmds as cmds from ayon_api import get_representation_by_id - -from ayon_core.pipeline import ( - load, - get_representation_path -) -from ayon_maya.api.lib import ( - maintained_selection, - namespaced, - unique_namespace -) +from ayon_core.pipeline import get_representation_path +from ayon_maya.api.lib import maintained_selection, namespaced, unique_namespace from ayon_maya.api.pipeline import containerise +from ayon_maya.api.plugin import Loader +from maya import mel -class MultiverseUsdLoader(load.LoaderPlugin): +class MultiverseUsdLoader(Loader): """Read USD data in a Multiverse Compound""" product_types = { diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd_over.py b/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd_over.py index e51353887e..bdcb771109 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd_over.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd_over.py @@ -1,22 +1,17 @@ # -*- coding: utf-8 -*- -import maya.cmds as cmds -from maya import mel import os +import maya.cmds as cmds import qargparse from ayon_api import get_representation_by_id - -from ayon_core.pipeline import ( - load, - get_representation_path -) -from ayon_maya.api.lib import ( - maintained_selection -) +from ayon_core.pipeline import get_representation_path +from ayon_maya.api.lib import maintained_selection from ayon_maya.api.pipeline import containerise +from ayon_maya.api.plugin import Loader +from maya import mel -class MultiverseUsdOverLoader(load.LoaderPlugin): +class MultiverseUsdOverLoader(Loader): """Reference file""" product_types = {"mvUsdOverride"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_redshift_proxy.py b/server_addon/maya/client/ayon_maya/plugins/load/load_redshift_proxy.py index fba6314fec..996d77856d 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_redshift_proxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_redshift_proxy.py @@ -1,25 +1,17 @@ # -*- coding: utf-8 -*- """Loader for Redshift proxy.""" import os + import clique - import maya.cmds as cmds - +from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings -from ayon_core.pipeline import ( - load, - get_representation_path -) -from ayon_maya.api.lib import ( - namespaced, - maintained_selection, - unique_namespace -) +from ayon_maya.api.lib import maintained_selection, namespaced, unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.plugin import Loader, get_load_color_for_product_type -class RedshiftProxyLoader(load.LoaderPlugin): +class RedshiftProxyLoader(Loader): """Load Redshift proxy""" product_types = {"redshiftproxy"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_reference.py b/server_addon/maya/client/ayon_maya/plugins/load/load_reference.py index 4aad3ddb22..f8e1062e38 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_reference.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_reference.py @@ -1,17 +1,16 @@ -import difflib import contextlib +import difflib -from maya import cmds import qargparse - from ayon_core.settings import get_project_settings from ayon_maya.api import plugin from ayon_maya.api.lib import ( - maintained_selection, + create_rig_animation_instance, get_container_members, + maintained_selection, parent_nodes, - create_rig_animation_instance ) +from maya import cmds @contextlib.contextmanager diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_rendersetup.py b/server_addon/maya/client/ayon_maya/plugins/load/load_rendersetup.py index 96f38ba1ce..09fda5d2f4 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_rendersetup.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_rendersetup.py @@ -6,21 +6,18 @@ When this json is loaded, it will overwrite all settings on RenderSetup instance. """ +import contextlib import json import sys -import six -import contextlib +import maya.app.renderSetup.model.renderSetup as renderSetup +import six from ayon_core.lib import BoolDef, EnumDef -from ayon_core.pipeline import ( - load, - get_representation_path -) +from ayon_core.pipeline import get_representation_path from ayon_maya.api import lib from ayon_maya.api.pipeline import containerise - +from ayon_maya.api.plugin import Loader from maya import cmds -import maya.app.renderSetup.model.renderSetup as renderSetup @contextlib.contextmanager @@ -48,7 +45,7 @@ def mark_all_imported(enabled): cmds.deleteAttr(plug) -class RenderSetupLoader(load.LoaderPlugin): +class RenderSetupLoader(Loader): """Load json preset for RenderSetup overwriting current one.""" product_types = {"rendersetup"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_arnold.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_arnold.py index d326c224bf..832562971f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_arnold.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_arnold.py @@ -1,15 +1,17 @@ +"""Load OpenVDB for Arnold in aiVolume. + +TODO: + `aiVolume` doesn't automatically set velocity fps correctly, set manual? + +""" import os +from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings -from ayon_core.pipeline import ( - load, - get_representation_path -) -from ayon_maya.api.plugin import get_load_color_for_product_type -# TODO aiVolume doesn't automatically set velocity fps correctly, set manual? +from ayon_maya.api.plugin import Loader, get_load_color_for_product_type -class LoadVDBtoArnold(load.LoaderPlugin): +class LoadVDBtoArnold(Loader): """Load OpenVDB for Arnold in aiVolume""" product_types = {"vdbcache"} @@ -21,9 +23,9 @@ class LoadVDBtoArnold(load.LoaderPlugin): def load(self, context, name, namespace, data): - from maya import cmds - from ayon_maya.api.pipeline import containerise from ayon_maya.api.lib import unique_namespace + from ayon_maya.api.pipeline import containerise + from maya import cmds product_type = context["product"]["productType"] diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_redshift.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_redshift.py index 5ac8dfa05e..1ea82cbf28 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_redshift.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_redshift.py @@ -1,14 +1,11 @@ import os +from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings -from ayon_core.pipeline import ( - load, - get_representation_path -) -from ayon_maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.plugin import Loader, get_load_color_for_product_type -class LoadVDBtoRedShift(load.LoaderPlugin): +class LoadVDBtoRedShift(Loader): """Load OpenVDB in a Redshift Volume Shape Note that the RedshiftVolumeShape is created without a RedshiftVolume @@ -27,9 +24,9 @@ class LoadVDBtoRedShift(load.LoaderPlugin): def load(self, context, name=None, namespace=None, data=None): - from maya import cmds - from ayon_maya.api.pipeline import containerise from ayon_maya.api.lib import unique_namespace + from ayon_maya.api.pipeline import containerise + from maya import cmds product_type = context["product"]["productType"] diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_vray.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_vray.py index 7a3129dfe7..fefbea0e88 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_vray.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_vray.py @@ -1,12 +1,8 @@ import os +from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings -from ayon_core.pipeline import ( - load, - get_representation_path -) -from ayon_maya.api.plugin import get_load_color_for_product_type - +from ayon_maya.api.plugin import Loader, get_load_color_for_product_type from maya import cmds # List of 3rd Party Channels Mapping names for VRayVolumeGrid @@ -74,7 +70,7 @@ def _fix_duplicate_vvg_callbacks(): matched.add(callback) -class LoadVDBtoVRay(load.LoaderPlugin): +class LoadVDBtoVRay(Loader): """Load OpenVDB in a V-Ray Volume Grid""" product_types = {"vdbcache"} @@ -175,6 +171,7 @@ class LoadVDBtoVRay(load.LoaderPlugin): else: # Sequence import clique + # todo: check support for negative frames as input collections, remainder = clique.assemble(files) assert len(collections) == 1, ( diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vrayproxy.py index 014c8fea48..53995f877b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_vrayproxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vrayproxy.py @@ -7,24 +7,16 @@ loader will use them instead of native vray vrmesh format. """ import os -import maya.cmds as cmds - import ayon_api +import maya.cmds as cmds +from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings -from ayon_core.pipeline import ( - load, - get_representation_path, -) -from ayon_maya.api.lib import ( - maintained_selection, - namespaced, - unique_namespace -) +from ayon_maya.api.lib import maintained_selection, namespaced, unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.plugin import Loader, get_load_color_for_product_type -class VRayProxyLoader(load.LoaderPlugin): +class VRayProxyLoader(Loader): """Load VRay Proxy with Alembic or VrayMesh.""" product_types = {"vrayproxy", "model", "pointcache", "animation"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_vrayscene.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vrayscene.py index 17b0c2cd44..acea6cdd63 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_vrayscene.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vrayscene.py @@ -1,20 +1,13 @@ # -*- coding: utf-8 -*- import maya.cmds as cmds # noqa +from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings -from ayon_core.pipeline import ( - load, - get_representation_path -) -from ayon_maya.api.lib import ( - maintained_selection, - namespaced, - unique_namespace -) +from ayon_maya.api.lib import maintained_selection, namespaced, unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api.plugin import Loader, get_load_color_for_product_type -class VRaySceneLoader(load.LoaderPlugin): +class VRaySceneLoader(Loader): """Load Vray scene""" product_types = {"vrayscene_layer"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_xgen.py b/server_addon/maya/client/ayon_maya/plugins/load/load_xgen.py index f1f25640bd..6f053cd1e6 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_xgen.py @@ -1,20 +1,18 @@ import os import shutil +import ayon_maya.api.plugin import maya.cmds as cmds import xgenm - -from qtpy import QtWidgets - -import ayon_maya.api.plugin -from ayon_maya.api.lib import ( - maintained_selection, - get_container_members, - attribute_values, - write_xgen_file -) -from ayon_maya.api import current_file from ayon_core.pipeline import get_representation_path +from ayon_maya.api import current_file +from ayon_maya.api.lib import ( + attribute_values, + get_container_members, + maintained_selection, + write_xgen_file, +) +from qtpy import QtWidgets class XgenLoader(ayon_maya.api.plugin.ReferenceLoader): diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_cache.py b/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_cache.py index bb7d2792c5..b2b5c7c710 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_cache.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_cache.py @@ -1,21 +1,16 @@ -import os import json +import os import re from collections import defaultdict import clique -from maya import cmds - +from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings -from ayon_core.pipeline import ( - load, - get_representation_path -) from ayon_maya.api import lib -from ayon_maya.api.yeti import create_yeti_variable from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import get_load_color_for_product_type - +from ayon_maya.api.plugin import Loader, get_load_color_for_product_type +from ayon_maya.api.yeti import create_yeti_variable +from maya import cmds # Do not reset these values on update but only apply on first load # to preserve any potential local overrides @@ -45,7 +40,7 @@ def set_attribute(node, attr, value): lib.set_attribute(node, attr, value) -class YetiCacheLoader(load.LoaderPlugin): +class YetiCacheLoader(Loader): """Load Yeti Cache with one or more Yeti nodes""" product_types = {"yeticache", "yetiRig"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_rig.py b/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_rig.py index 41129b0245..a45e5c63ef 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_rig.py @@ -1,12 +1,9 @@ from typing import List import maya.cmds as cmds - -from ayon_maya.api import plugin -from ayon_maya.api import lib - from ayon_core.pipeline import registered_host from ayon_core.pipeline.create import CreateContext +from ayon_maya.api import lib, plugin class YetiRigLoader(plugin.ReferenceLoader): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_animation.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_animation.py index 391c80c84e..7996602c37 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_animation.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_animation.py @@ -1,9 +1,9 @@ -import pyblish.api - import maya.cmds as cmds +import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin -class CollectAnimationOutputGeometry(pyblish.api.InstancePlugin): +class CollectAnimationOutputGeometry(MayaInstancePlugin): """Collect out hierarchy data for instance. Collect all hierarchy nodes which reside in the out_SET of the animation @@ -18,7 +18,6 @@ class CollectAnimationOutputGeometry(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder + 0.4 families = ["animation"] label = "Collect Animation Output Geometry" - hosts = ["maya"] ignore_type = ["constraints"] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_arnold_scene_source.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_arnold_scene_source.py index cdeadd9036..55f332e4b9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_arnold_scene_source.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_arnold_scene_source.py @@ -1,10 +1,10 @@ -from maya import cmds - import pyblish.api from ayon_maya.api.lib import get_all_children +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class CollectArnoldSceneSource(pyblish.api.InstancePlugin): +class CollectArnoldSceneSource(MayaInstancePlugin): """Collect Arnold Scene Source data.""" # Offset to be after renderable camera collection. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_assembly.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_assembly.py index affb22c530..57b3443dd3 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_assembly.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_assembly.py @@ -1,14 +1,20 @@ +"""Collect all relevant assembly items. + +Todo: + Publish of assembly need unique namespace for all assets, we should + create validator for this. + +""" from collections import defaultdict import pyblish.api from maya import cmds, mel from ayon_maya import api from ayon_maya.api import lib - -# TODO : Publish of assembly: -unique namespace for all assets, VALIDATOR! +from ayon_maya.api.plugin import MayaInstancePlugin -class CollectAssembly(pyblish.api.InstancePlugin): +class CollectAssembly(MayaInstancePlugin): """Collect all relevant assembly items Collected data: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_current_file.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_current_file.py index c7105a7f3c..27c9dc130e 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_current_file.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_current_file.py @@ -1,15 +1,13 @@ - import pyblish.api - +from ayon_maya.api.plugin import MayaContextPlugin from maya import cmds -class CollectCurrentFile(pyblish.api.ContextPlugin): +class CollectCurrentFile(MayaContextPlugin): """Inject the current working file.""" order = pyblish.api.CollectorOrder - 0.4 label = "Maya Current File" - hosts = ['maya'] def process(self, context): """Inject the current working file""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_animation.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_animation.py index d8fd7a16e8..687b93211b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_animation.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_animation.py @@ -1,16 +1,16 @@ # -*- coding: utf-8 -*- -from maya import cmds # noqa import pyblish.api from ayon_core.pipeline import OptionalPyblishPluginMixin +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds # noqa -class CollectFbxAnimation(pyblish.api.InstancePlugin, +class CollectFbxAnimation(MayaInstancePlugin, OptionalPyblishPluginMixin): """Collect Animated Rig Data for FBX Extractor.""" order = pyblish.api.CollectorOrder + 0.2 label = "Collect Fbx Animation" - hosts = ["maya"] families = ["animation"] optional = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_camera.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_camera.py index bfa5bccbb9..eabc1237a3 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_camera.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_camera.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- -from maya import cmds # noqa import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds # noqa -class CollectFbxCamera(pyblish.api.InstancePlugin): +class CollectFbxCamera(MayaInstancePlugin): """Collect Camera for FBX export.""" order = pyblish.api.CollectorOrder + 0.2 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_file_dependencies.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_file_dependencies.py index 60853bd1ee..ca4c617fa9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_file_dependencies.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_file_dependencies.py @@ -1,14 +1,13 @@ from maya import cmds - +from ayon_maya.api.plugin import MayaContextPlugin import pyblish.api -class CollectFileDependencies(pyblish.api.ContextPlugin): +class CollectFileDependencies(MayaContextPlugin): """Gather all files referenced in this scene.""" label = "Collect File Dependencies" order = pyblish.api.CollectorOrder - 0.49 - hosts = ["maya"] families = ["renderlayer"] @classmethod diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_gltf.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_gltf.py index bb37fe3a7e..c34505597c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_gltf.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_gltf.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin -class CollectGLTF(pyblish.api.InstancePlugin): +class CollectGLTF(MayaInstancePlugin): """Collect Assets for GLTF/GLB export.""" order = pyblish.api.CollectorOrder + 0.2 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_history.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_history.py index 2da74991c0..b649628a36 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_history.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_history.py @@ -1,9 +1,9 @@ +import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api - -class CollectMayaHistory(pyblish.api.InstancePlugin): +class CollectMayaHistory(MayaInstancePlugin): """Collect history for instances from the Maya scene Note: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_inputs.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_inputs.py index 28788ac50d..bebd765c1b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_inputs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_inputs.py @@ -7,6 +7,7 @@ import pyblish.api from ayon_core.pipeline import registered_host from ayon_maya.api.lib import get_container_members from ayon_maya.api.lib_rendersetup import get_shader_in_layer +from ayon_maya.api.plugin import MayaInstancePlugin def iter_history(nodes, @@ -93,7 +94,7 @@ def collect_input_containers(containers, nodes): if any(node in container["_members"] for node in nodes)] -class CollectUpstreamInputs(pyblish.api.InstancePlugin): +class CollectUpstreamInputs(MayaInstancePlugin): """Collect input source inputs for this publish. This will include `inputs` data of which loaded publishes were used in the @@ -104,7 +105,6 @@ class CollectUpstreamInputs(pyblish.api.InstancePlugin): label = "Collect Inputs" order = pyblish.api.CollectorOrder + 0.34 - hosts = ["maya"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_instances.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_instances.py index 758b977c8d..89b490febc 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_instances.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_instances.py @@ -2,9 +2,10 @@ from maya import cmds import pyblish.api from ayon_maya.api.lib import get_all_children +from ayon_maya.api.plugin import MayaInstancePlugin -class CollectNewInstances(pyblish.api.InstancePlugin): +class CollectNewInstances(MayaInstancePlugin): """Gather members for instances and pre-defined attribute This collector takes into account assets that are associated with diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_look.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_look.py index f4bc26506b..27fb409777 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_look.py @@ -1,12 +1,13 @@ # -*- coding: utf-8 -*- """Maya look collector.""" -import re -import os import glob +import os +import re -from maya import cmds # noqa import pyblish.api from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds # noqa SHAPE_ATTRS = {"castsShadows", "receiveShadows", @@ -265,7 +266,7 @@ def get_file_node_files(node): return result -class CollectLook(pyblish.api.InstancePlugin): +class CollectLook(MayaInstancePlugin): """Collect look data for instance. For the shapes/transforms of the referenced object to collect look for @@ -286,7 +287,6 @@ class CollectLook(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder + 0.2 families = ["look"] label = "Collect Look" - hosts = ["maya"] def process(self, instance): """Collect the Look in the instance with the correct layer settings""" @@ -644,7 +644,6 @@ class CollectModelRenderSets(CollectLook): order = pyblish.api.CollectorOrder + 0.21 families = ["model"] label = "Collect Model Render Sets" - hosts = ["maya"] def collect_sets(self, instance): """Collect all related objectSets except shadingEngines diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_scene_time.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_scene_time.py index 6a20cb151f..b6a15a637f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_scene_time.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_scene_time.py @@ -1,9 +1,9 @@ +import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api - -class CollectMayaSceneTime(pyblish.api.InstancePlugin): +class CollectMayaSceneTime(MayaInstancePlugin): """Collect Maya Scene playback range This allows to reproduce the playback range for the content to be loaded. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_units.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_units.py index 2421641d26..2224037b1f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_units.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_units.py @@ -1,15 +1,16 @@ import maya.cmds as cmds import maya.mel as mel +from ayon_maya.api.plugin import MayaContextPlugin + import pyblish.api -class CollectMayaUnits(pyblish.api.ContextPlugin): +class CollectMayaUnits(MayaContextPlugin): """Collect Maya's scene units.""" label = "Maya Units" order = pyblish.api.CollectorOrder - hosts = ["maya"] def process(self, context): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_workspace.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_workspace.py index 122fabe8a1..bdcd232348 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_workspace.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_workspace.py @@ -1,17 +1,16 @@ import os import pyblish.api - +from ayon_maya.api.plugin import MayaContextPlugin from maya import cmds -class CollectMayaWorkspace(pyblish.api.ContextPlugin): +class CollectMayaWorkspace(MayaContextPlugin): """Inject the current workspace into context""" order = pyblish.api.CollectorOrder - 0.5 label = "Maya Workspace" - hosts = ['maya'] def process(self, context): workspace = cmds.workspace(rootDirectory=True, query=True) diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_model.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_model.py index 9d45ed63bc..c239f1c118 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_model.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_model.py @@ -1,9 +1,9 @@ +import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api - -class CollectModelData(pyblish.api.InstancePlugin): +class CollectModelData(MayaInstancePlugin): """Collect model data Ensures always only a single frame is extracted (current frame). diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_multiverse_look.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_multiverse_look.py index 9910936e7d..fff35d32f5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_multiverse_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_multiverse_look.py @@ -2,9 +2,10 @@ import glob import os import re -from maya import cmds import pyblish.api from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds SHAPE_ATTRS = ["castsShadows", "receiveShadows", @@ -251,7 +252,7 @@ def is_mipmap(fname): return False -class CollectMultiverseLookData(pyblish.api.InstancePlugin): +class CollectMultiverseLookData(MayaInstancePlugin): """Collect Multiverse Look Searches through the overrides finding all material overrides. From there diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_pointcache.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_pointcache.py index 5578a57f31..0c3cccc8ec 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_pointcache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_pointcache.py @@ -1,15 +1,14 @@ +import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api - -class CollectPointcache(pyblish.api.InstancePlugin): +class CollectPointcache(MayaInstancePlugin): """Collect pointcache data for instance.""" order = pyblish.api.CollectorOrder + 0.4 families = ["pointcache"] label = "Collect Pointcache" - hosts = ["maya"] def process(self, instance): if instance.data.get("farm"): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_remove_marked.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_remove_marked.py index 69e69f6630..97c5dc67d4 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_remove_marked.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_remove_marked.py @@ -1,7 +1,8 @@ import pyblish.api +from ayon_maya.api.plugin import MayaContextPlugin -class CollectRemoveMarked(pyblish.api.ContextPlugin): +class CollectRemoveMarked(MayaContextPlugin): """Remove marked data Remove instances that have 'remove' in their instance.data diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_render.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_render.py index cacde15561..143d1c08e2 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_render.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_render.py @@ -32,24 +32,23 @@ Provides: instance -> pixelAspect """ +import json import os import platform -import json - -from maya import cmds import pyblish.api - -from ayon_core.pipeline import KnownPublishError from ayon_core.lib import get_formatted_current_time -from ayon_maya.api.lib_renderproducts import ( - get as get_layer_render_products, - UnsupportedRendererException -) +from ayon_core.pipeline import KnownPublishError from ayon_maya.api import lib +from ayon_maya.api.lib_renderproducts import ( + UnsupportedRendererException, + get as get_layer_render_products, +) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class CollectMayaRender(pyblish.api.InstancePlugin): +class CollectMayaRender(MayaInstancePlugin): """Gather all publishable render layers from renderSetup.""" order = pyblish.api.CollectorOrder + 0.01 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_render_layer_aovs.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_render_layer_aovs.py index d23a4edb4d..7e1d531541 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_render_layer_aovs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_render_layer_aovs.py @@ -1,11 +1,10 @@ +import pyblish.api +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api -from ayon_maya.api import lib - - -class CollectRenderLayerAOVS(pyblish.api.InstancePlugin): +class CollectRenderLayerAOVS(MayaInstancePlugin): """Collect all render layer's AOVs / Render Elements that will render. This collector is important to be able to Extend Frames. @@ -26,7 +25,6 @@ class CollectRenderLayerAOVS(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder + 0.02 label = "Render Elements / AOVs" - hosts = ["maya"] families = ["renderlayer"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_renderable_camera.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_renderable_camera.py index d2d05971e9..4ac16eb714 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_renderable_camera.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_renderable_camera.py @@ -1,11 +1,10 @@ import pyblish.api - +from ayon_maya.api.lib_rendersetup import get_attr_in_layer +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -from ayon_maya.api.lib_rendersetup import get_attr_in_layer - -class CollectRenderableCamera(pyblish.api.InstancePlugin): +class CollectRenderableCamera(MayaInstancePlugin): """Collect the renderable camera(s) for the render layer""" # Offset to be after renderlayer collection. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_review.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_review.py index 490e197ce0..90620771e1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_review.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_review.py @@ -1,13 +1,12 @@ -from maya import cmds, mel - import ayon_api import pyblish.api - from ayon_core.pipeline import KnownPublishError from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds, mel -class CollectReview(pyblish.api.InstancePlugin): +class CollectReview(MayaInstancePlugin): """Collect Review data """ diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_rig_sets.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_rig_sets.py index 34ff26a8b8..dfa4fc2d9a 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_rig_sets.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_rig_sets.py @@ -1,8 +1,9 @@ import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -class CollectRigSets(pyblish.api.InstancePlugin): +class CollectRigSets(MayaInstancePlugin): """Ensure rig contains pipeline-critical content Every rig must contain at least two object sets: @@ -13,7 +14,6 @@ class CollectRigSets(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder + 0.05 label = "Collect Rig Sets" - hosts = ["maya"] families = ["rig"] accepted_output = ["mesh", "transform"] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_skeleton_mesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_skeleton_mesh.py index 31f0eca88c..a8783018c9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_skeleton_mesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_skeleton_mesh.py @@ -1,14 +1,14 @@ # -*- coding: utf-8 -*- -from maya import cmds # noqa import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds # noqa -class CollectSkeletonMesh(pyblish.api.InstancePlugin): +class CollectSkeletonMesh(MayaInstancePlugin): """Collect Static Rig Data for FBX Extractor.""" order = pyblish.api.CollectorOrder + 0.2 label = "Collect Skeleton Mesh" - hosts = ["maya"] families = ["rig"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_skeletalmesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_skeletalmesh.py index 79693bb35e..a7900a2085 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_skeletalmesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_skeletalmesh.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- from maya import cmds # noqa import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin -class CollectUnrealSkeletalMesh(pyblish.api.InstancePlugin): +class CollectUnrealSkeletalMesh(MayaInstancePlugin): """Collect Unreal Skeletal Mesh.""" order = pyblish.api.CollectorOrder + 0.2 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_staticmesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_staticmesh.py index 03b6c4a188..762c7daa4a 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_staticmesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_staticmesh.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- from maya import cmds # noqa import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin from pprint import pformat -class CollectUnrealStaticMesh(pyblish.api.InstancePlugin): +class CollectUnrealStaticMesh(MayaInstancePlugin): """Collect Unreal Static Mesh.""" order = pyblish.api.CollectorOrder + 0.2 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_user_defined_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_user_defined_attributes.py index 3d586d48fb..b7ef70c874 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_user_defined_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_user_defined_attributes.py @@ -1,15 +1,14 @@ from maya import cmds - +from ayon_maya.api.plugin import MayaInstancePlugin import pyblish.api -class CollectUserDefinedAttributes(pyblish.api.InstancePlugin): +class CollectUserDefinedAttributes(MayaInstancePlugin): """Collect user defined attributes for nodes in instance.""" order = pyblish.api.CollectorOrder + 0.45 families = ["pointcache", "animation", "usd"] label = "Collect User Defined Attributes" - hosts = ["maya"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayproxy.py index 8630f56e58..8710858150 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayproxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayproxy.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- """Collect Vray Proxy.""" import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin -class CollectVrayProxy(pyblish.api.InstancePlugin): +class CollectVrayProxy(MayaInstancePlugin): """Collect Vray Proxy instance. Add `pointcache` family for it. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayscene.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayscene.py index ea7064292b..86538450b7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayscene.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayscene.py @@ -1,13 +1,13 @@ # -*- coding: utf-8 -*- """Collect Vray Scene and prepare it for extraction and publishing.""" - import pyblish.api from ayon_core.lib import get_formatted_current_time from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin -class CollectVrayScene(pyblish.api.InstancePlugin): +class CollectVrayScene(MayaInstancePlugin): """Collect Vray Scene. If export on farm is checked, job is created to export it. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_workfile.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_workfile.py index e2b64f1ebd..d7cea61a2c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_workfile.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_workfile.py @@ -1,13 +1,13 @@ import os import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin -class CollectWorkfileData(pyblish.api.InstancePlugin): +class CollectWorkfileData(MayaInstancePlugin): """Inject data into Workfile instance""" order = pyblish.api.CollectorOrder - 0.01 label = "Maya Workfile" - hosts = ['maya'] families = ["workfile"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_workscene_fps.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_workscene_fps.py index 41d6ffea33..5c1b021799 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_workscene_fps.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_workscene_fps.py @@ -1,13 +1,13 @@ import pyblish.api +from ayon_maya.api.plugin import MayaContextPlugin from maya import mel -class CollectWorksceneFPS(pyblish.api.ContextPlugin): +class CollectWorksceneFPS(MayaContextPlugin): """Get the FPS of the work scene""" label = "Workscene FPS" order = pyblish.api.CollectorOrder - hosts = ["maya"] def process(self, context): fps = mel.eval('currentTimeUnitToFPS()') diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_xgen.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_xgen.py index d09f60c827..784c0a4b83 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_xgen.py @@ -1,12 +1,12 @@ import os -from maya import cmds - import pyblish.api from ayon_maya.api.lib import get_attribute_input +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class CollectXgen(pyblish.api.InstancePlugin): +class CollectXgen(MayaInstancePlugin): """Collect Xgen""" order = pyblish.api.CollectorOrder + 0.499999 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_cache.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_cache.py index fa9670820f..10883074d3 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_cache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_cache.py @@ -1,10 +1,8 @@ -from maya import cmds - import pyblish.api - from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin from ayon_maya.api.yeti import get_yeti_user_variables - +from maya import cmds SETTINGS = { # Preview @@ -24,7 +22,7 @@ SETTINGS = { } -class CollectYetiCache(pyblish.api.InstancePlugin): +class CollectYetiCache(MayaInstancePlugin): """Collect all information of the Yeti caches The information contains the following attributes per Yeti node @@ -41,7 +39,6 @@ class CollectYetiCache(pyblish.api.InstancePlugin): order = pyblish.api.CollectorOrder + 0.45 label = "Collect Yeti Cache" families = ["yetiRig", "yeticache", "yeticacheUE"] - hosts = ["maya"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_rig.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_rig.py index 95e6afdb01..25bc5ec172 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_rig.py @@ -1,13 +1,11 @@ import os import re -from maya import cmds - import pyblish.api - -from ayon_maya.api import lib from ayon_core.pipeline.publish import KnownPublishError - +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds SETTINGS = {"renderDensity", "renderWidth", @@ -17,13 +15,12 @@ SETTINGS = {"renderDensity", "cbId"} -class CollectYetiRig(pyblish.api.InstancePlugin): +class CollectYetiRig(MayaInstancePlugin): """Collect all information of the Yeti Rig""" order = pyblish.api.CollectorOrder + 0.4 label = "Collect Yeti Rig" families = ["yetiRig"] - hosts = ["maya"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/determine_future_version.py b/server_addon/maya/client/ayon_maya/plugins/publish/determine_future_version.py index 5b597f2707..a09489d4ae 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/determine_future_version.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/determine_future_version.py @@ -1,13 +1,13 @@ import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin -class DetermineFutureVersion(pyblish.api.InstancePlugin): +class DetermineFutureVersion(MayaInstancePlugin): """ This will determine version of product if we want render to be attached to. """ label = "Determine Product Version" order = pyblish.api.IntegratorOrder - hosts = ["maya"] families = ["renderlayer"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_active_view_thumbnail.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_active_view_thumbnail.py index 777bc2000a..221da82d36 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_active_view_thumbnail.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_active_view_thumbnail.py @@ -1,13 +1,13 @@ -import maya.api.OpenMaya as om -import maya.api.OpenMayaUI as omui - -import pyblish.api import tempfile +import maya.api.OpenMaya as om +import maya.api.OpenMayaUI as omui +import pyblish.api from ayon_maya.api.lib import IS_HEADLESS +from ayon_maya.api.plugin import MayaInstancePlugin -class ExtractActiveViewThumbnail(pyblish.api.InstancePlugin): +class ExtractActiveViewThumbnail(MayaInstancePlugin): """Set instance thumbnail to a screengrab of current active viewport. This makes it so that if an instance does not have a thumbnail set yet that @@ -18,7 +18,6 @@ class ExtractActiveViewThumbnail(pyblish.api.InstancePlugin): order = pyblish.api.ExtractorOrder + 0.49 label = "Active View Thumbnail" families = ["workfile"] - hosts = ["maya"] def process(self, instance): if IS_HEADLESS: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_arnold_scene_source.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_arnold_scene_source.py index 2829420ae1..fb79094aec 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_arnold_scene_source.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_arnold_scene_source.py @@ -1,19 +1,17 @@ +import json import os from collections import defaultdict -import json -from maya import cmds import arnold - -from ayon_core.pipeline import publish from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds -class ExtractArnoldSceneSource(publish.Extractor): +class ExtractArnoldSceneSource(MayaExtractorPlugin): """Extract the content of the instance to an Arnold Scene Source file.""" label = "Extract Arnold Scene Source" - hosts = ["maya"] families = ["ass"] asciiAss = False diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_assembly.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_assembly.py index df390c0798..ecbf21dfb9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_assembly.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_assembly.py @@ -1,13 +1,12 @@ -import os import json +import os -from ayon_core.pipeline import publish from ayon_maya.api.alembic import extract_alembic - +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds -class ExtractAssembly(publish.Extractor): +class ExtractAssembly(MayaExtractorPlugin): """Produce an alembic of just point positions and normals. Positions and normals are preserved, but nothing more, @@ -16,7 +15,6 @@ class ExtractAssembly(publish.Extractor): """ label = "Extract Assembly" - hosts = ["maya"] families = ["assembly"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_alembic.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_alembic.py index e36f964abd..2c38110913 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_alembic.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_alembic.py @@ -2,12 +2,12 @@ import os import json from maya import cmds - +from ayon_maya.api.plugin import MayaExtractorPlugin from ayon_core.pipeline import publish from ayon_maya.api import lib -class ExtractCameraAlembic(publish.Extractor, +class ExtractCameraAlembic(MayaExtractorPlugin, publish.OptionalPyblishPluginMixin): """Extract a Camera as Alembic. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_mayaScene.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_mayaScene.py index 62ce0a1806..5f6260c794 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_mayaScene.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_mayaScene.py @@ -1,16 +1,14 @@ # -*- coding: utf-8 -*- """Extract camera as Maya Scene.""" -import os -import itertools import contextlib +import itertools +import os -from maya import cmds - +from ayon_core.lib import BoolDef from ayon_core.pipeline import publish from ayon_maya.api import lib -from ayon_core.lib import ( - BoolDef -) +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds def massage_ma_file(path): @@ -82,7 +80,7 @@ def unlock(plug): cmds.disconnectAttr(source, destination) -class ExtractCameraMayaScene(publish.Extractor, +class ExtractCameraMayaScene(MayaExtractorPlugin, publish.OptionalPyblishPluginMixin): """Extract a Camera as Maya Scene. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx.py index d6a1de8455..cd1fe1f7e8 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx.py @@ -1,16 +1,15 @@ # -*- coding: utf-8 -*- import os -from maya import cmds # noqa import maya.mel as mel # noqa import pyblish.api - -from ayon_core.pipeline import publish -from ayon_maya.api.lib import maintained_selection from ayon_maya.api import fbx +from ayon_maya.api.lib import maintained_selection +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds # noqa -class ExtractFBX(publish.Extractor): +class ExtractFBX(MayaExtractorPlugin): """Extract FBX from Maya. This extracts reproducible FBX exports ignoring any of the diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx_animation.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx_animation.py index 92ba0be953..186486c153 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx_animation.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx_animation.py @@ -1,17 +1,14 @@ # -*- coding: utf-8 -*- import os -from maya import cmds # noqa import pyblish.api - -from ayon_core.pipeline import publish from ayon_maya.api import fbx -from ayon_maya.api.lib import ( - namespaced, get_namespace, strip_namespace -) +from ayon_maya.api.lib import get_namespace, namespaced, strip_namespace +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds # noqa -class ExtractFBXAnimation(publish.Extractor): +class ExtractFBXAnimation(MayaExtractorPlugin): """Extract Rig in FBX format from Maya. This extracts the rig in fbx with the constraints @@ -22,7 +19,6 @@ class ExtractFBXAnimation(publish.Extractor): """ order = pyblish.api.ExtractorOrder label = "Extract Animation (FBX)" - hosts = ["maya"] families = ["animation.fbx"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_gltf.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_gltf.py index 1472454af7..450764a9f1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_gltf.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_gltf.py @@ -1,17 +1,15 @@ import os -from maya import cmds, mel import pyblish.api - -from ayon_core.pipeline import publish from ayon_maya.api import lib from ayon_maya.api.gltf import extract_gltf +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds, mel -class ExtractGLB(publish.Extractor): +class ExtractGLB(MayaExtractorPlugin): order = pyblish.api.ExtractorOrder - hosts = ["maya"] label = "Extract GLB" families = ["gltf"] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_gpu_cache.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_gpu_cache.py index 4b293b5785..2d177bda96 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_gpu_cache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_gpu_cache.py @@ -1,16 +1,15 @@ import json +from ayon_core.pipeline import publish +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds -from ayon_core.pipeline import publish - -class ExtractGPUCache(publish.Extractor, +class ExtractGPUCache(MayaExtractorPlugin, publish.OptionalPyblishPluginMixin): """Extract the content of the instance to a GPU cache file.""" label = "GPU Cache" - hosts = ["maya"] families = ["model", "animation", "pointcache"] step = 1.0 stepSave = 1 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_import_reference.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_import_reference.py index e461499d88..6c76e8173c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_import_reference.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_import_reference.py @@ -1,18 +1,16 @@ import os import sys - -from maya import cmds - -import pyblish.api import tempfile +import pyblish.api from ayon_core.lib import run_subprocess -from ayon_core.pipeline import publish from ayon_core.pipeline.publish import OptionalPyblishPluginMixin from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds -class ExtractImportReference(publish.Extractor, +class ExtractImportReference(MayaExtractorPlugin, OptionalPyblishPluginMixin): """ @@ -24,7 +22,6 @@ class ExtractImportReference(publish.Extractor, label = "Extract Import Reference" order = pyblish.api.ExtractorOrder - 0.48 - hosts = ["maya"] families = ["renderlayer", "workfile"] optional = True tmp_format = "_tmp" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_layout.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_layout.py index b025a1605a..5f398e2fd5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_layout.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_layout.py @@ -1,19 +1,17 @@ +import json import math import os -import json +from ayon_api import get_representation_by_id +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds from maya.api import OpenMaya as om -from ayon_api import get_representation_by_id - -from ayon_core.pipeline import publish -class ExtractLayout(publish.Extractor): +class ExtractLayout(MayaExtractorPlugin): """Extract a layout.""" label = "Extract Layout" - hosts = ["maya"] families = ["layout"] project_container = "AVALON_CONTAINERS" optional = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_look.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_look.py index f6b5e7d5a8..ec27e762b5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_look.py @@ -1,31 +1,29 @@ # -*- coding: utf-8 -*- """Maya look extractor.""" -import os -import sys import contextlib import json import logging -import tempfile +import os import platform +import sys +import tempfile from abc import ABCMeta, abstractmethod from collections import OrderedDict -import six import attr import pyblish.api - -from maya import cmds # noqa - +import six from ayon_core.lib import ( - find_executable, - source_hash, - run_subprocess, - get_oiio_tool_args, ToolNotFoundError, + find_executable, + get_oiio_tool_args, + run_subprocess, + source_hash, ) - -from ayon_core.pipeline import publish, KnownPublishError +from ayon_core.pipeline import KnownPublishError from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds # noqa # Modes for transfer COPY = 1 @@ -407,7 +405,7 @@ class MakeTX(TextureProcessor): return False -class ExtractLook(publish.Extractor): +class ExtractLook(MayaExtractorPlugin): """Extract Look (Maya Scene + JSON) Only extracts the sets (shadingEngines and alike) alongside a .json file diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_scene_raw.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_scene_raw.py index bc0a9afd97..473a26ce8f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_scene_raw.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_scene_raw.py @@ -2,26 +2,21 @@ """Extract data as Maya scene (raw).""" import os +from ayon_core.lib import BoolDef +from ayon_core.pipeline import AVALON_CONTAINER_ID, AYON_CONTAINER_ID +from ayon_core.pipeline.publish import AYONPyblishPluginMixin +from ayon_maya.api.lib import maintained_selection +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds -from ayon_maya.api.lib import maintained_selection -from ayon_core.pipeline import ( - AYON_CONTAINER_ID, - AVALON_CONTAINER_ID, - publish, -) -from ayon_core.pipeline.publish import AYONPyblishPluginMixin -from ayon_core.lib import BoolDef - -class ExtractMayaSceneRaw(publish.Extractor, AYONPyblishPluginMixin): +class ExtractMayaSceneRaw(MayaExtractorPlugin, AYONPyblishPluginMixin): """Extract as Maya Scene (raw). This will preserve all references, construction history, etc. """ label = "Maya Scene (Raw)" - hosts = ["maya"] families = ["mayaAscii", "mayaScene", "setdress", diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_usd.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_usd.py index b6f6529ca5..4ae0445055 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_usd.py @@ -1,13 +1,12 @@ -import os -import six -import json import contextlib - -from maya import cmds +import json +import os import pyblish.api -from ayon_core.pipeline import publish +import six from ayon_maya.api.lib import maintained_selection +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds @contextlib.contextmanager @@ -112,14 +111,13 @@ def usd_export_attributes(nodes, attrs=None, attr_prefixes=None, mapping=None): dg_mod.undoIt() -class ExtractMayaUsd(publish.Extractor): +class ExtractMayaUsd(MayaExtractorPlugin): """Extractor for Maya USD Asset data. Upon publish a .usd (or .usdz) asset file will typically be written. """ label = "Extract Maya USD Asset" - hosts = ["maya"] families = ["mayaUsd"] @property diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_model.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_model.py index b439d05a1a..950e09fb29 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_model.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_model.py @@ -2,13 +2,13 @@ """Extract model as Maya Scene.""" import os -from maya import cmds - from ayon_core.pipeline import publish from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds -class ExtractModel(publish.Extractor, +class ExtractModel(MayaExtractorPlugin, publish.OptionalPyblishPluginMixin): """Extract as Model (Maya Scene). @@ -25,7 +25,6 @@ class ExtractModel(publish.Extractor, """ label = "Model (Maya Scene)" - hosts = ["maya"] families = ["model"] scene_type = "ma" optional = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_look.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_look.py index d69c179712..f951f255b9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_look.py @@ -2,11 +2,11 @@ import os from maya import cmds -from ayon_core.pipeline import publish from ayon_maya.api.lib import maintained_selection +from ayon_maya.api.plugin import MayaExtractorPlugin -class ExtractMultiverseLook(publish.Extractor): +class ExtractMultiverseLook(MayaExtractorPlugin): """Extractor for Multiverse USD look data. This will extract: @@ -34,7 +34,6 @@ class ExtractMultiverseLook(publish.Extractor): """ label = "Extract Multiverse USD Look" - hosts = ["maya"] families = ["mvLook"] scene_type = "usda" file_formats = ["usda", "usd"] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd.py index a787093648..3f86f23ee3 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd.py @@ -1,15 +1,13 @@ import os -import six - -from maya import cmds -from maya import mel import pyblish.api -from ayon_core.pipeline import publish +import six from ayon_maya.api.lib import maintained_selection +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds, mel -class ExtractMultiverseUsd(publish.Extractor): +class ExtractMultiverseUsd(MayaExtractorPlugin): """Extractor for Multiverse USD Asset data. This will extract settings for a Multiverse Write Asset operation: @@ -27,7 +25,6 @@ class ExtractMultiverseUsd(publish.Extractor): """ label = "Extract Multiverse USD Asset" - hosts = ["maya"] families = ["mvUsd"] scene_type = "usd" file_formats = ["usd", "usda", "usdz"] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_comp.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_comp.py index eac150ec1a..648b5b3cc7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_comp.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_comp.py @@ -1,12 +1,11 @@ import os +from ayon_maya.api.lib import maintained_selection +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds -from ayon_core.pipeline import publish -from ayon_maya.api.lib import maintained_selection - -class ExtractMultiverseUsdComposition(publish.Extractor): +class ExtractMultiverseUsdComposition(MayaExtractorPlugin): """Extractor of Multiverse USD Composition data. This will extract settings for a Multiverse Write Composition operation: @@ -24,7 +23,6 @@ class ExtractMultiverseUsdComposition(publish.Extractor): """ label = "Extract Multiverse USD Composition" - hosts = ["maya"] families = ["mvUsdComposition"] scene_type = "usd" # Order of `fileFormat` must match create_multiverse_usd_comp.py diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_over.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_over.py index d1e806da9f..b7469d3627 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_over.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_over.py @@ -1,12 +1,11 @@ import os -from ayon_core.pipeline import publish from ayon_maya.api.lib import maintained_selection - +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds -class ExtractMultiverseUsdOverride(publish.Extractor): +class ExtractMultiverseUsdOverride(MayaExtractorPlugin): """Extractor for Multiverse USD Override data. This will extract settings for a Multiverse Write Override operation: @@ -22,7 +21,6 @@ class ExtractMultiverseUsdOverride(publish.Extractor): """ label = "Extract Multiverse USD Override" - hosts = ["maya"] families = ["mvUsdOverride"] scene_type = "usd" # Order of `fileFormat` must match create_multiverse_usd_over.py diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_obj.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_obj.py index 16204b6008..1daf37afde 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_obj.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_obj.py @@ -1,13 +1,13 @@ # -*- coding: utf-8 -*- import os -from maya import cmds import pyblish.api -from ayon_core.pipeline import publish from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds -class ExtractObj(publish.Extractor): +class ExtractObj(MayaExtractorPlugin): """Extract OBJ from Maya. This extracts reproducible OBJ exports ignoring any of the settings @@ -15,7 +15,6 @@ class ExtractObj(publish.Extractor): """ order = pyblish.api.ExtractorOrder - hosts = ["maya"] label = "Extract OBJ" families = ["model"] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_playblast.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_playblast.py index 8a94b24e3a..f4388827a5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_playblast.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_playblast.py @@ -1,14 +1,12 @@ import os import clique - -from ayon_core.pipeline import publish from ayon_maya.api import lib - +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds -class ExtractPlayblast(publish.Extractor): +class ExtractPlayblast(MayaExtractorPlugin): """Extract viewport playblast. Takes review camera and creates review Quicktime video based on viewport @@ -17,7 +15,6 @@ class ExtractPlayblast(publish.Extractor): """ label = "Extract Playblast" - hosts = ["maya"] families = ["review"] optional = True capture_preset = {} diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_pointcache.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_pointcache.py index 04a895ff41..cdbcb7c9f1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_pointcache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_pointcache.py @@ -1,29 +1,28 @@ import os from collections import OrderedDict -from maya import cmds - -from ayon_core.pipeline import publish +from ayon_core.lib import ( + BoolDef, + EnumDef, + NumberDef, + TextDef, + UILabelDef, + UISeparatorDef, +) +from ayon_core.pipeline import KnownPublishError +from ayon_core.pipeline.publish import AYONPyblishPluginMixin from ayon_maya.api.alembic import extract_alembic from ayon_maya.api.lib import ( get_all_children, - suspended_refresh, + iter_visible_nodes_in_range, maintained_selection, - iter_visible_nodes_in_range + suspended_refresh, ) -from ayon_core.lib import ( - BoolDef, - TextDef, - NumberDef, - EnumDef, - UISeparatorDef, - UILabelDef, -) -from ayon_core.pipeline.publish import AYONPyblishPluginMixin -from ayon_core.pipeline import KnownPublishError +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds -class ExtractAlembic(publish.Extractor, AYONPyblishPluginMixin): +class ExtractAlembic(MayaExtractorPlugin, AYONPyblishPluginMixin): """Produce an alembic of just point positions and normals. Positions and normals, uvs, creases are preserved, but nothing more, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_proxy_abc.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_proxy_abc.py index dd15622f5f..fb17768eb2 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_proxy_abc.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_proxy_abc.py @@ -1,22 +1,20 @@ import os -from maya import cmds - -from ayon_core.pipeline import publish from ayon_maya.api.alembic import extract_alembic from ayon_maya.api.lib import ( - suspended_refresh, + iter_visible_nodes_in_range, maintained_selection, - iter_visible_nodes_in_range + suspended_refresh, ) +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds -class ExtractProxyAlembic(publish.Extractor): +class ExtractProxyAlembic(MayaExtractorPlugin): """Produce an alembic for bounding box geometry """ label = "Extract Proxy (Alembic)" - hosts = ["maya"] families = ["proxyAbc"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_redshift_proxy.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_redshift_proxy.py index 9d0f4085a3..18b0282e83 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_redshift_proxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_redshift_proxy.py @@ -2,23 +2,18 @@ """Redshift Proxy extractor.""" import os +from ayon_maya.api.lib import maintained_selection, renderlayer +from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api.render_setup_tools import ( + allow_export_from_render_setup_layer, +) from maya import cmds -from ayon_core.pipeline import publish -from ayon_maya.api.lib import ( - maintained_selection, - renderlayer -) -from ayon_maya.api.render_setup_tools import ( - allow_export_from_render_setup_layer -) - -class ExtractRedshiftProxy(publish.Extractor): +class ExtractRedshiftProxy(MayaExtractorPlugin): """Extract the content of the instance to a redshift proxy file.""" label = "Redshift Proxy (.rs)" - hosts = ["maya"] families = ["redshiftproxy"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_rendersetup.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_rendersetup.py index 4815033777..c8043e435e 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_rendersetup.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_rendersetup.py @@ -1,11 +1,11 @@ -import os import json +import os import maya.app.renderSetup.model.renderSetup as renderSetup -from ayon_core.pipeline import publish +from ayon_maya.api.plugin import MayaExtractorPlugin -class ExtractRenderSetup(publish.Extractor): +class ExtractRenderSetup(MayaExtractorPlugin): """ Produce renderSetup template file @@ -13,7 +13,6 @@ class ExtractRenderSetup(publish.Extractor): """ label = "Extract RenderSetup" - hosts = ["maya"] families = ["rendersetup"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_rig.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_rig.py index 58e4373d74..7568ee9b5b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_rig.py @@ -2,17 +2,15 @@ """Extract rig as Maya Scene.""" import os +from ayon_maya.api.lib import maintained_selection +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds -from ayon_core.pipeline import publish -from ayon_maya.api.lib import maintained_selection - -class ExtractRig(publish.Extractor): +class ExtractRig(MayaExtractorPlugin): """Extract rig as Maya Scene.""" label = "Extract Rig (Maya Scene)" - hosts = ["maya"] families = ["rig"] scene_type = "ma" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_skeleton_mesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_skeleton_mesh.py index 76e49d1588..549327d8a2 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_skeleton_mesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_skeleton_mesh.py @@ -4,12 +4,12 @@ import os from maya import cmds # noqa import pyblish.api -from ayon_core.pipeline import publish from ayon_core.pipeline.publish import OptionalPyblishPluginMixin from ayon_maya.api import fbx +from ayon_maya.api.plugin import MayaExtractorPlugin -class ExtractSkeletonMesh(publish.Extractor, +class ExtractSkeletonMesh(MayaExtractorPlugin, OptionalPyblishPluginMixin): """Extract Rig in FBX format from Maya. @@ -21,7 +21,6 @@ class ExtractSkeletonMesh(publish.Extractor, """ order = pyblish.api.ExtractorOrder label = "Extract Skeleton Mesh" - hosts = ["maya"] families = ["rig.fbx"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_thumbnail.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_thumbnail.py index 2863e4460b..d2ecf7f158 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_thumbnail.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_thumbnail.py @@ -1,12 +1,12 @@ -import os import glob +import os import tempfile -from ayon_core.pipeline import publish from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaExtractorPlugin -class ExtractThumbnail(publish.Extractor): +class ExtractThumbnail(MayaExtractorPlugin): """Extract viewport thumbnail. Takes review camera and creates a thumbnail based on viewport @@ -15,7 +15,6 @@ class ExtractThumbnail(publish.Extractor): """ label = "Thumbnail" - hosts = ["maya"] families = ["review"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_abc.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_abc.py index f0096e37e3..66ea4b1b6c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_abc.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_abc.py @@ -2,21 +2,16 @@ """Create Unreal Skeletal Mesh data to be extracted as FBX.""" import os +from ayon_maya.api.alembic import extract_alembic +from ayon_maya.api.lib import maintained_selection, suspended_refresh +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds # noqa -from ayon_core.pipeline import publish -from ayon_maya.api.alembic import extract_alembic -from ayon_maya.api.lib import ( - suspended_refresh, - maintained_selection -) - -class ExtractUnrealSkeletalMeshAbc(publish.Extractor): +class ExtractUnrealSkeletalMeshAbc(MayaExtractorPlugin): """Extract Unreal Skeletal Mesh as FBX from Maya. """ label = "Extract Unreal Skeletal Mesh - Alembic" - hosts = ["maya"] families = ["skeletalMesh"] optional = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py index 95e12795de..81135bbb92 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py @@ -3,12 +3,10 @@ import os from contextlib import contextmanager -from maya import cmds # noqa - import pyblish.api - -from ayon_core.pipeline import publish from ayon_maya.api import fbx +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds # noqa @contextmanager @@ -21,7 +19,7 @@ def renamed(original_name, renamed_name): cmds.rename(renamed_name, original_name) -class ExtractUnrealSkeletalMeshFbx(publish.Extractor): +class ExtractUnrealSkeletalMeshFbx(MayaExtractorPlugin): """Extract Unreal Skeletal Mesh as FBX from Maya. """ order = pyblish.api.ExtractorOrder - 0.1 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_staticmesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_staticmesh.py index 140a4e4147..b4ee55b9e1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_staticmesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_staticmesh.py @@ -2,19 +2,14 @@ """Create Unreal Static Mesh data to be extracted as FBX.""" import os +import pyblish.api +from ayon_maya.api import fbx +from ayon_maya.api.lib import maintained_selection, parent_nodes +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds # noqa -import pyblish.api -from ayon_core.pipeline import publish -from ayon_maya.api.lib import ( - parent_nodes, - maintained_selection -) -from ayon_maya.api import fbx - - -class ExtractUnrealStaticMesh(publish.Extractor): +class ExtractUnrealStaticMesh(MayaExtractorPlugin): """Extract Unreal Static Mesh as FBX from Maya. """ order = pyblish.api.ExtractorOrder - 0.1 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_yeticache.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_yeticache.py index 9a6b4ebaed..fb90e9ee2b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_yeticache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_yeticache.py @@ -1,18 +1,16 @@ import os +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds -from ayon_core.pipeline import publish - -class ExtractUnrealYetiCache(publish.Extractor): +class ExtractUnrealYetiCache(MayaExtractorPlugin): """Producing Yeti cache files using scene time range. This will extract Yeti cache file sequence and fur settings. """ label = "Extract Yeti Cache (Unreal)" - hosts = ["maya"] families = ["yeticacheUE"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayproxy.py index 581195c5da..04b037ef03 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayproxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayproxy.py @@ -1,12 +1,11 @@ import os +from ayon_maya.api.lib import maintained_selection +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds -from ayon_core.pipeline import publish -from ayon_maya.api.lib import maintained_selection - -class ExtractVRayProxy(publish.Extractor): +class ExtractVRayProxy(MayaExtractorPlugin): """Extract the content of the instance to a vrmesh file Things to pay attention to: @@ -15,7 +14,6 @@ class ExtractVRayProxy(publish.Extractor): """ label = "VRay Proxy (.vrmesh)" - hosts = ["maya"] families = ["vrayproxy.vrmesh"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayscene.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayscene.py index d55c0ddef6..00c3f2b158 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayscene.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayscene.py @@ -3,18 +3,16 @@ import os import re -from ayon_core.pipeline import publish -from ayon_maya.api.render_setup_tools import export_in_rs_layer from ayon_maya.api.lib import maintained_selection - +from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api.render_setup_tools import export_in_rs_layer from maya import cmds -class ExtractVrayscene(publish.Extractor): +class ExtractVrayscene(MayaExtractorPlugin): """Extractor for vrscene.""" label = "VRay Scene (.vrscene)" - hosts = ["maya"] families = ["vrayscene_layer"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_workfile_xgen.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_workfile_xgen.py index 227c16d62a..c93da91207 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_workfile_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_workfile_xgen.py @@ -1,15 +1,14 @@ +import copy import os import shutil -import copy - -from maya import cmds import pyblish.api from ayon_maya.api.alembic import extract_alembic -from ayon_core.pipeline import publish +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds -class ExtractWorkfileXgen(publish.Extractor): +class ExtractWorkfileXgen(MayaExtractorPlugin): """Extract Workfile Xgen. When submitting a render, we need to prep Xgen side car files. @@ -19,7 +18,6 @@ class ExtractWorkfileXgen(publish.Extractor): order = pyblish.api.ExtractorOrder - 0.499 label = "Extract Workfile Xgen" families = ["workfile"] - hosts = ["maya"] def get_render_max_frame_range(self, context): """Return start to end frame range including all renderlayers in diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_xgen.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_xgen.py index 61cad1dc33..47a8140ef6 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_xgen.py @@ -1,17 +1,19 @@ -import os import copy +import os import tempfile -from maya import cmds import xgenm - -from ayon_core.pipeline import publish from ayon_maya.api.lib import ( - maintained_selection, attribute_values, write_xgen_file, delete_after + attribute_values, + delete_after, + maintained_selection, + write_xgen_file, ) +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds -class ExtractXgen(publish.Extractor): +class ExtractXgen(MayaExtractorPlugin): """Extract Xgen Workflow: @@ -23,7 +25,6 @@ class ExtractXgen(publish.Extractor): """ label = "Extract Xgen" - hosts = ["maya"] families = ["xgen"] scene_type = "ma" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_cache.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_cache.py index b9cd7a1be5..e3e9a76d72 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_cache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_cache.py @@ -1,19 +1,17 @@ -import os import json +import os +from ayon_maya.api.plugin import MayaExtractorPlugin from maya import cmds -from ayon_core.pipeline import publish - -class ExtractYetiCache(publish.Extractor): +class ExtractYetiCache(MayaExtractorPlugin): """Producing Yeti cache files using scene time range. This will extract Yeti cache file sequence and fur settings. """ label = "Extract Yeti Cache" - hosts = ["maya"] families = ["yetiRig", "yeticache"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_rig.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_rig.py index 8ef43fbf13..0c21118b22 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_rig.py @@ -1,14 +1,13 @@ # -*- coding: utf-8 -*- """Extract Yeti rig.""" -import os -import json import contextlib +import json +import os -from maya import cmds - -from ayon_core.pipeline import publish from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaExtractorPlugin +from maya import cmds @contextlib.contextmanager @@ -90,11 +89,10 @@ def yetigraph_attribute_values(assumed_destination, resources): pass -class ExtractYetiRig(publish.Extractor): +class ExtractYetiRig(MayaExtractorPlugin): """Extract the Yeti rig to a Maya Scene and write the Yeti rig data.""" label = "Extract Yeti Rig" - hosts = ["maya"] families = ["yetiRig"] scene_type = "ma" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/increment_current_file_deadline.py b/server_addon/maya/client/ayon_maya/plugins/publish/increment_current_file_deadline.py index a9378df8e1..62c5e9a8b2 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/increment_current_file_deadline.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/increment_current_file_deadline.py @@ -1,7 +1,8 @@ import pyblish.api +from ayon_maya.api.plugin import MayaContextPlugin -class IncrementCurrentFileDeadline(pyblish.api.ContextPlugin): +class IncrementCurrentFileDeadline(MayaContextPlugin): """Increment the current file. Saves the current maya scene with an increased version number. @@ -10,15 +11,14 @@ class IncrementCurrentFileDeadline(pyblish.api.ContextPlugin): label = "Increment current file" order = pyblish.api.IntegratorOrder + 9.0 - hosts = ["maya"] families = ["workfile"] optional = True def process(self, context): - from maya import cmds from ayon_core.lib import version_up from ayon_core.pipeline.publish import get_errored_plugins_from_context + from maya import cmds errored_plugins = get_errored_plugins_from_context(context) if any(plugin.__name__ == "MayaSubmitDeadline" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/reset_xgen_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/reset_xgen_attributes.py index 759aa23258..923614c8d1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/reset_xgen_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/reset_xgen_attributes.py @@ -1,9 +1,9 @@ +import pyblish.api +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api - -class ResetXgenAttributes(pyblish.api.InstancePlugin): +class ResetXgenAttributes(MayaInstancePlugin): """Reset Xgen attributes. When the incremental save of the workfile triggers, the Xgen attributes diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/save_scene.py b/server_addon/maya/client/ayon_maya/plugins/publish/save_scene.py index eb7c06a113..f062f0d947 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/save_scene.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/save_scene.py @@ -1,18 +1,16 @@ import pyblish.api from ayon_core.pipeline.workfile.lock_workfile import ( is_workfile_lock_enabled, - remove_workfile_lock + remove_workfile_lock, ) +from ayon_maya.api.plugin import MayaContextPlugin -class SaveCurrentScene(pyblish.api.ContextPlugin): - """Save current scene - - """ +class SaveCurrentScene(MayaContextPlugin): + """Save current scene.""" label = "Save current file" order = pyblish.api.ExtractorOrder - 0.49 - hosts = ["maya"] families = ["renderlayer", "workfile"] def process(self, context): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_alembic_options_defaults.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_alembic_options_defaults.py index bd69e7a3cd..f68418770b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_alembic_options_defaults.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_alembic_options_defaults.py @@ -1,12 +1,13 @@ import inspect -import pyblish.api +import pyblish.api from ayon_core.pipeline import OptionalPyblishPluginMixin -from ayon_core.pipeline.publish import RepairAction, PublishValidationError +from ayon_core.pipeline.publish import PublishValidationError, RepairAction +from ayon_maya.api.plugin import MayaInstancePlugin class ValidateAlembicDefaultsPointcache( - pyblish.api.InstancePlugin, OptionalPyblishPluginMixin + MayaInstancePlugin, OptionalPyblishPluginMixin ): """Validate the attributes on the instance are defaults. @@ -15,7 +16,6 @@ class ValidateAlembicDefaultsPointcache( order = pyblish.api.ValidatorOrder families = ["pointcache"] - hosts = ["maya"] label = "Validate Alembic Options Defaults" actions = [RepairAction] optional = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_content.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_content.py index 17b9bf4e85..b11e6ec930 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_content.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_content.py @@ -1,13 +1,13 @@ -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, PublishValidationError, ValidateContentsOrder, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateAnimationContent(pyblish.api.InstancePlugin, +class ValidateAnimationContent(MayaInstancePlugin, OptionalPyblishPluginMixin): """Adheres to the content of 'animation' product type @@ -17,7 +17,6 @@ class ValidateAnimationContent(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ["maya"] families = ["animation"] label = "Animation Content" actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_out_set_related_node_ids.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_out_set_related_node_ids.py index 6d53608fb2..ba8a50ea40 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_out_set_related_node_ids.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_out_set_related_node_ids.py @@ -1,19 +1,18 @@ -import maya.cmds as cmds - -import pyblish.api import ayon_maya.api.action -from ayon_maya.api import lib +import maya.cmds as cmds from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishXmlValidationError, RepairAction, ValidateContentsOrder, - PublishXmlValidationError, - OptionalPyblishPluginMixin, + apply_plugin_settings_automatically, get_plugin_settings, - apply_plugin_settings_automatically ) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateOutRelatedNodeIds(pyblish.api.InstancePlugin, +class ValidateOutRelatedNodeIds(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate if deformed shapes have related IDs to the original shapes diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source.py index 43c7b99ece..7f8015443d 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source.py @@ -1,21 +1,20 @@ -from maya import cmds - import pyblish.api - from ayon_core.pipeline.publish import ( - ValidateContentsOrder, PublishValidationError + PublishValidationError, + ValidateContentsOrder, ) from ayon_maya.api.lib import is_visible +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateArnoldSceneSource(pyblish.api.InstancePlugin): +class ValidateArnoldSceneSource(MayaInstancePlugin): """Validate Arnold Scene Source. Ensure no nodes are hidden. """ order = ValidateContentsOrder - hosts = ["maya"] families = ["ass", "assProxy"] label = "Validate Arnold Scene Source" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source_cbid.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source_cbid.py index 546d65e84c..0da1a26293 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source_cbid.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source_cbid.py @@ -1,14 +1,14 @@ -import pyblish.api -from ayon_maya.api import lib from ayon_core.pipeline.publish import ( - ValidateContentsOrder, + OptionalPyblishPluginMixin, PublishValidationError, RepairAction, - OptionalPyblishPluginMixin + ValidateContentsOrder, ) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateArnoldSceneSourceCbid(pyblish.api.InstancePlugin, +class ValidateArnoldSceneSourceCbid(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate Arnold Scene Source Cbid. @@ -16,7 +16,6 @@ class ValidateArnoldSceneSourceCbid(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ["maya"] families = ["assProxy"] label = "Validate Arnold Scene Source CBID" actions = [RepairAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_ass_relative_paths.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_ass_relative_paths.py index 6e65eee592..030e2fb950 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_ass_relative_paths.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_ass_relative_paths.py @@ -4,21 +4,20 @@ import types import maya.cmds as cmds from mtoa.core import createOptions -import pyblish.api from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, PublishValidationError, OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateAssRelativePaths(pyblish.api.InstancePlugin, +class ValidateAssRelativePaths(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure exporting ass file has set relative texture paths""" order = ValidateContentsOrder - hosts = ['maya'] families = ['ass'] label = "ASS has relative texture paths" actions = [RepairAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_name.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_name.py index c5ac22dd84..468f9aee9b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_name.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_name.py @@ -1,13 +1,14 @@ -import pyblish.api -import maya.cmds as cmds import ayon_maya.api.action +import maya.cmds as cmds +import pyblish.api from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateAssemblyName(pyblish.api.InstancePlugin, +class ValidateAssemblyName(MayaInstancePlugin, OptionalPyblishPluginMixin): """ Ensure Assembly name ends with `GRP` diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_namespaces.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_namespaces.py index 51b9485999..15119fa3c2 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_namespaces.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_namespaces.py @@ -1,13 +1,15 @@ -import pyblish.api import ayon_maya.api.action +import pyblish.api from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateAssemblyNamespaces(pyblish.api.InstancePlugin, + +class ValidateAssemblyNamespaces(MayaInstancePlugin, OptionalPyblishPluginMixin): - """Ensure namespaces are not nested + """Ensure namespaces are not nested. In the outliner an item in a normal namespace looks as following: props_desk_01_:modelDefault diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_transforms.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_transforms.py index c5f0b6fd65..9d2aa98c24 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_transforms.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_transforms.py @@ -1,15 +1,15 @@ -import pyblish.api -from maya import cmds - import ayon_maya.api.action +import pyblish.api from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, PublishValidationError, RepairAction, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateAssemblyModelTransforms(pyblish.api.InstancePlugin, +class ValidateAssemblyModelTransforms(MayaInstancePlugin, OptionalPyblishPluginMixin): """Verify only root nodes of the loaded asset have transformations. @@ -98,9 +98,8 @@ class ValidateAssemblyModelTransforms(pyblish.api.InstancePlugin, """ - from qtpy import QtWidgets - from ayon_maya.api import lib + from qtpy import QtWidgets # Store namespace in variable, cosmetics thingy choice = QtWidgets.QMessageBox.warning( diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_attributes.py index 08620e22bf..2f52c92200 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_attributes.py @@ -1,16 +1,18 @@ import json from collections import defaultdict -import pyblish.api +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + RepairAction, + ValidateContentsOrder, +) +from ayon_maya.api.lib import set_attribute +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -from ayon_maya.api.lib import set_attribute -from ayon_core.pipeline.publish import ( - OptionalPyblishPluginMixin, PublishValidationError, RepairAction, - ValidateContentsOrder) - -class ValidateAttributes(pyblish.api.InstancePlugin, +class ValidateAttributes(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure attributes are consistent. @@ -25,7 +27,6 @@ class ValidateAttributes(pyblish.api.InstancePlugin, order = ValidateContentsOrder label = "Validate Attributes" - hosts = ["maya"] actions = [RepairAction] optional = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_attributes.py index 95d1e76b83..1922b22109 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_attributes.py @@ -1,15 +1,14 @@ -import pyblish.api -from maya import cmds - import ayon_maya.api.action from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, PublishValidationError, ValidateContentsOrder, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateCameraAttributes(pyblish.api.InstancePlugin, +class ValidateCameraAttributes(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates Camera has no invalid attribute keys or values. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_contents.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_contents.py index 3ce512aebc..988b16cec2 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_contents.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_contents.py @@ -1,4 +1,3 @@ -import pyblish.api from maya import cmds import ayon_maya.api.action @@ -6,9 +5,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, OptionalPyblishPluginMixin) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateCameraContents(pyblish.api.InstancePlugin, +class ValidateCameraContents(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates Camera instance contents. @@ -21,7 +21,6 @@ class ValidateCameraContents(pyblish.api.InstancePlugin, order = ValidateContentsOrder families = ['camera'] - hosts = ['maya'] label = 'Camera Contents' actions = [ayon_maya.api.action.SelectInvalidAction] validate_shapes = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_color_sets.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_color_sets.py index 40d7297444..d89244b5f7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_color_sets.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_color_sets.py @@ -1,16 +1,15 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateMeshOrder, OptionalPyblishPluginMixin, PublishValidationError, - RepairAction + RepairAction, + ValidateMeshOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateColorSets(pyblish.api.InstancePlugin, +class ValidateColorSets(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate all meshes in the instance have unlocked normals @@ -20,7 +19,6 @@ class ValidateColorSets(pyblish.api.InstancePlugin, """ order = ValidateMeshOrder - hosts = ['maya'] families = ['model'] label = 'Mesh ColorSets' actions = [ diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_current_renderlayer_renderable.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_current_renderlayer_renderable.py index 045e22545c..c863778e07 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_current_renderlayer_renderable.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_current_renderlayer_renderable.py @@ -1,16 +1,16 @@ import inspect import pyblish.api - -from maya import cmds from ayon_core.pipeline.publish import ( - context_plugin_should_run, + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin + context_plugin_should_run, ) +from ayon_maya.api.plugin import MayaContextPlugin +from maya import cmds -class ValidateCurrentRenderLayerIsRenderable(pyblish.api.ContextPlugin, +class ValidateCurrentRenderLayerIsRenderable(MayaContextPlugin, OptionalPyblishPluginMixin): """Validate if current render layer has a renderable camera. @@ -25,7 +25,6 @@ class ValidateCurrentRenderLayerIsRenderable(pyblish.api.ContextPlugin, label = "Current Render Layer Has Renderable Camera" order = pyblish.api.ValidatorOrder - hosts = ["maya"] families = ["renderlayer"] optional = False diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_cycle_error.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_cycle_error.py index ac773a586a..62aafa9f53 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_cycle_error.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_cycle_error.py @@ -1,13 +1,15 @@ -import pyblish.api +import ayon_maya.api.action +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + ValidateContentsOrder, +) +from ayon_maya.api.lib import maintained_selection +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import ayon_maya.api.action -from ayon_maya.api.lib import maintained_selection -from ayon_core.pipeline.publish import ( - OptionalPyblishPluginMixin, PublishValidationError, ValidateContentsOrder) - -class ValidateCycleError(pyblish.api.InstancePlugin, +class ValidateCycleError(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate nodes produce no cycle errors.""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_frame_range.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_frame_range.py index 20feee8756..a5834d9bff 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_frame_range.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_frame_range.py @@ -1,20 +1,16 @@ -import pyblish.api - -from maya import cmds from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateContentsOrder, - PublishValidationError, - OptionalPyblishPluginMixin -) -from ayon_maya.api.lib_rendersetup import ( - get_attr_overrides, - get_attr_in_layer, ) +from ayon_maya.api.lib_rendersetup import get_attr_in_layer, get_attr_overrides +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds from maya.app.renderSetup.model.override import AbsOverride -class ValidateFrameRange(pyblish.api.InstancePlugin, +class ValidateFrameRange(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates the frame ranges. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_material.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_material.py index 3735dbb74c..d620de49c1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_material.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_material.py @@ -1,15 +1,15 @@ import os + +from ayon_core.pipeline import ( + OptionalPyblishPluginMixin, + PublishValidationError, +) +from ayon_core.pipeline.publish import RepairAction, ValidateContentsOrder +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api -from ayon_core.pipeline.publish import ( - RepairAction, - ValidateContentsOrder -) -from ayon_core.pipeline import PublishValidationError, OptionalPyblishPluginMixin - -class ValidateGLSLMaterial(pyblish.api.InstancePlugin, +class ValidateGLSLMaterial(MayaInstancePlugin, OptionalPyblishPluginMixin): """ Validate if the asset uses GLSL Shader @@ -17,7 +17,6 @@ class ValidateGLSLMaterial(pyblish.api.InstancePlugin, order = ValidateContentsOrder + 0.1 families = ['gltf'] - hosts = ['maya'] label = 'GLSL Shader for GLTF' actions = [RepairAction] optional = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_plugin.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_plugin.py index d783da8b5c..588c86e297 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_plugin.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_plugin.py @@ -1,16 +1,15 @@ - from maya import cmds -import pyblish.api from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, PublishValidationError, OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateGLSLPlugin(pyblish.api.InstancePlugin, +class ValidateGLSLPlugin(MayaInstancePlugin, OptionalPyblishPluginMixin): """ Validate if the asset uses GLSL Shader @@ -18,7 +17,6 @@ class ValidateGLSLPlugin(pyblish.api.InstancePlugin, order = ValidateContentsOrder + 0.15 families = ['gltf'] - hosts = ['maya'] label = 'maya2glTF plugin' actions = [RepairAction] optional = False diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_has_members.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_has_members.py index de20a7c150..2fc5a3910f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_has_members.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_has_members.py @@ -1,16 +1,15 @@ -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( + PublishValidationError, ValidateContentsOrder, - PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateInstanceHasMembers(pyblish.api.InstancePlugin): +class ValidateInstanceHasMembers(MayaInstancePlugin): """Validates instance objectSet has *any* members.""" order = ValidateContentsOrder - hosts = ["maya"] label = 'Instance has members' actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_in_context.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_in_context.py index f67845bcd5..3d1d051484 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_in_context.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_in_context.py @@ -2,17 +2,17 @@ """Validate if instance asset is the same as context asset.""" from __future__ import absolute_import -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateContentsOrder, - PublishValidationError, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateInstanceInContext(pyblish.api.InstancePlugin, +class ValidateInstanceInContext(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validator to check if instance asset match context asset. @@ -26,7 +26,6 @@ class ValidateInstanceInContext(pyblish.api.InstancePlugin, order = ValidateContentsOrder label = "Instance in same Context" optional = True - hosts = ["maya"] actions = [ ayon_maya.api.action.SelectInvalidAction, RepairAction ] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_subset.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_subset.py index df9ca0bf13..fe18d9359e 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_subset.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_subset.py @@ -1,11 +1,11 @@ -import pyblish.api import string import six from ayon_core.pipeline.publish import ( + PublishValidationError, ValidateContentsOrder, - PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin # Allow only characters, numbers and underscore allowed = set(string.ascii_lowercase + @@ -18,7 +18,7 @@ def validate_name(product_name): return all(x in allowed for x in product_name) -class ValidateSubsetName(pyblish.api.InstancePlugin): +class ValidateSubsetName(MayaInstancePlugin): """Validates product name has only valid characters""" order = ValidateContentsOrder diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_loaded_plugin.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_loaded_plugin.py index a05920a21e..b83f411681 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_loaded_plugin.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_loaded_plugin.py @@ -7,15 +7,15 @@ from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateLoadedPlugin(pyblish.api.ContextPlugin, +class ValidateLoadedPlugin(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure there are no unauthorized loaded plugins""" label = "Loaded Plugin" order = pyblish.api.ValidatorOrder - host = ["maya"] actions = [RepairContextAction] optional = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_contents.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_contents.py index 4709a7bb1e..31e4073807 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_contents.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_contents.py @@ -1,15 +1,13 @@ -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( PublishValidationError, - ValidateContentsOrder + ValidateContentsOrder, ) - - +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds # noqa -class ValidateLookContents(pyblish.api.InstancePlugin): +class ValidateLookContents(MayaInstancePlugin): """Validate look instance contents Rules: @@ -25,7 +23,6 @@ class ValidateLookContents(pyblish.api.InstancePlugin): order = ValidateContentsOrder families = ['look'] - hosts = ['maya'] label = 'Look Data Contents' actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_default_shaders_connections.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_default_shaders_connections.py index cfd4156124..2dca5a4a90 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_default_shaders_connections.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_default_shaders_connections.py @@ -1,13 +1,13 @@ -from maya import cmds - import pyblish.api from ayon_core.pipeline.publish import ( + PublishValidationError, RepairContextAction, - PublishValidationError ) +from ayon_maya.api.plugin import MayaContextPlugin +from maya import cmds -class ValidateLookDefaultShadersConnections(pyblish.api.ContextPlugin): +class ValidateLookDefaultShadersConnections(MayaContextPlugin): """Validate default shaders in the scene have their default connections. For example the standardSurface1 or lambert1 (maya 2023 and before) could @@ -22,7 +22,6 @@ class ValidateLookDefaultShadersConnections(pyblish.api.ContextPlugin): order = pyblish.api.ValidatorOrder - 0.4999 families = ['look'] - hosts = ['maya'] label = 'Look Default Shader Connections' actions = [RepairContextAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_id_reference_edits.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_id_reference_edits.py index 5a4ccc16ca..e1d956e060 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_id_reference_edits.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_id_reference_edits.py @@ -1,16 +1,16 @@ from collections import defaultdict -from maya import cmds -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( + PublishValidationError, RepairAction, ValidateContentsOrder, - PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateLookIdReferenceEdits(pyblish.api.InstancePlugin): +class ValidateLookIdReferenceEdits(MayaInstancePlugin): """Validate nodes in look have no reference edits to cbId. Note: @@ -22,7 +22,6 @@ class ValidateLookIdReferenceEdits(pyblish.api.InstancePlugin): order = ValidateContentsOrder families = ['look'] - hosts = ['maya'] label = 'Look Id Reference Edits' actions = [ayon_maya.api.action.SelectInvalidAction, RepairAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_no_default_shaders.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_no_default_shaders.py index 21a056c81c..a93815f275 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_no_default_shaders.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_no_default_shaders.py @@ -1,14 +1,13 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( + PublishValidationError, ValidateContentsOrder, - PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateLookNoDefaultShaders(pyblish.api.InstancePlugin): +class ValidateLookNoDefaultShaders(MayaInstancePlugin): """Validate if any node has a connection to a default shader. This checks whether the look has any members of: @@ -28,7 +27,6 @@ class ValidateLookNoDefaultShaders(pyblish.api.InstancePlugin): order = ValidateContentsOrder + 0.01 families = ['look'] - hosts = ['maya'] label = 'Look No Default Shaders' actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_sets.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_sets.py index 97c790c8c6..21de06b061 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_sets.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_sets.py @@ -1,13 +1,13 @@ -import pyblish.api import ayon_maya.api.action from ayon_maya.api import lib from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateLookSets(pyblish.api.InstancePlugin): +class ValidateLookSets(MayaInstancePlugin): """Validate if any sets relationships are not being collected. A shader can be assigned to a node that is missing a Colorbleed ID. @@ -42,7 +42,6 @@ class ValidateLookSets(pyblish.api.InstancePlugin): order = ValidateContentsOrder families = ['look'] - hosts = ['maya'] label = 'Look Sets' actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_shading_group.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_shading_group.py index 25e4eb046d..8c0a92b012 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_shading_group.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_shading_group.py @@ -1,16 +1,15 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateContentsOrder, - PublishValidationError, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateShadingEngine(pyblish.api.InstancePlugin, +class ValidateShadingEngine(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate all shading engines are named after the surface material. @@ -19,7 +18,6 @@ class ValidateShadingEngine(pyblish.api.InstancePlugin, order = ValidateContentsOrder families = ["look"] - hosts = ["maya"] label = "Look Shading Engine Naming" actions = [ ayon_maya.api.action.SelectInvalidAction, RepairAction diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_single_shader.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_single_shader.py index de0a9619b4..0cfb18df96 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_single_shader.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_single_shader.py @@ -1,12 +1,13 @@ -import pyblish.api -from maya import cmds - import ayon_maya.api.action from ayon_core.pipeline.publish import ( - PublishValidationError, ValidateContentsOrder) + PublishValidationError, + ValidateContentsOrder, +) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateSingleShader(pyblish.api.InstancePlugin): +class ValidateSingleShader(MayaInstancePlugin): """Validate all nurbsSurfaces and meshes have exactly one shader assigned. This will error if a shape has no shaders or more than one shader. @@ -15,7 +16,6 @@ class ValidateSingleShader(pyblish.api.InstancePlugin): order = ValidateContentsOrder families = ['look'] - hosts = ['maya'] label = 'Look Single Shader Per Shape' actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_maya_units.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_maya_units.py index 8171e7e8fa..16c7920642 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_maya_units.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_maya_units.py @@ -1,23 +1,20 @@ -import maya.cmds as cmds - -import pyblish.api - import ayon_maya.api.lib as mayalib +import maya.cmds as cmds from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishXmlValidationError, RepairContextAction, ValidateSceneOrder, - PublishXmlValidationError, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaContextPlugin -class ValidateMayaUnits(pyblish.api.ContextPlugin, +class ValidateMayaUnits(MayaContextPlugin, OptionalPyblishPluginMixin): """Check if the Maya units are set correct""" order = ValidateSceneOrder label = "Maya Units" - hosts = ['maya'] actions = [RepairContextAction] validate_linear_units = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_arnold_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_arnold_attributes.py index 5a9841b6c0..26aac9c944 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_arnold_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_arnold_attributes.py @@ -1,23 +1,22 @@ -from maya import cmds -import pyblish.api - import ayon_maya.api.action -from ayon_maya.api.lib import ( - maintained_selection, - delete_after, - undo_chunk, - get_attribute, - set_attribute -) from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateMeshOrder, - PublishValidationError ) +from ayon_maya.api.lib import ( + delete_after, + get_attribute, + maintained_selection, + set_attribute, + undo_chunk, +) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateMeshArnoldAttributes(pyblish.api.InstancePlugin, +class ValidateMeshArnoldAttributes(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate the mesh has default Arnold attributes. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_empty.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_empty.py index ad2b08ba19..419ca3c3c3 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_empty.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_empty.py @@ -1,15 +1,14 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( + PublishValidationError, RepairAction, ValidateMeshOrder, - PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateMeshEmpty(pyblish.api.InstancePlugin): +class ValidateMeshEmpty(MayaInstancePlugin): """Validate meshes have some vertices. Its possible to have meshes without any vertices. To replicate @@ -17,7 +16,6 @@ class ValidateMeshEmpty(pyblish.api.InstancePlugin): """ order = ValidateMeshOrder - hosts = ["maya"] families = ["model"] label = "Mesh Empty" actions = [ diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_has_uv.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_has_uv.py index 25da24db1c..6f45cba973 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_has_uv.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_has_uv.py @@ -1,16 +1,15 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateMeshOrder, OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, + ValidateMeshOrder, ) from ayon_maya.api.lib import len_flattened +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateMeshHasUVs(pyblish.api.InstancePlugin, +class ValidateMeshHasUVs(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate the current mesh has UVs. @@ -21,7 +20,6 @@ class ValidateMeshHasUVs(pyblish.api.InstancePlugin, """ order = ValidateMeshOrder - hosts = ['maya'] families = ['model'] label = 'Mesh Has UVs' actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_lamina_faces.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_lamina_faces.py index ee6acd1685..23a38aedd8 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_lamina_faces.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_lamina_faces.py @@ -1,15 +1,14 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateMeshOrder, OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, + ValidateMeshOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateMeshLaminaFaces(pyblish.api.InstancePlugin, +class ValidateMeshLaminaFaces(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate meshes don't have lamina faces. @@ -18,7 +17,6 @@ class ValidateMeshLaminaFaces(pyblish.api.InstancePlugin, """ order = ValidateMeshOrder - hosts = ['maya'] families = ['model'] label = 'Mesh Lamina Faces' actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_ngons.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_ngons.py index f4d907636c..f1d347df97 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_ngons.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_ngons.py @@ -1,16 +1,15 @@ +import ayon_maya.api.action +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + ValidateContentsOrder, +) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api -import ayon_maya.api.action -from ayon_maya.api import lib -from ayon_core.pipeline.publish import ( - ValidateContentsOrder, - OptionalPyblishPluginMixin, - PublishValidationError -) - -class ValidateMeshNgons(pyblish.api.InstancePlugin, +class ValidateMeshNgons(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure that meshes don't have ngons @@ -22,7 +21,6 @@ class ValidateMeshNgons(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ["maya"] families = ["model"] label = "Mesh ngons" actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_no_negative_scale.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_no_negative_scale.py index 7868015a30..58c3a9bc0f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_no_negative_scale.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_no_negative_scale.py @@ -1,12 +1,11 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateMeshOrder, + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin + ValidateMeshOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds def _as_report_list(values, prefix="- ", suffix="\n"): @@ -16,7 +15,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateMeshNoNegativeScale(pyblish.api.InstancePlugin, +class ValidateMeshNoNegativeScale(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure that meshes don't have a negative scale. @@ -30,7 +29,6 @@ class ValidateMeshNoNegativeScale(pyblish.api.InstancePlugin, """ order = ValidateMeshOrder - hosts = ['maya'] families = ['model'] label = 'Mesh No Negative Scale' actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_manifold.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_manifold.py index dc561be981..9e7461772e 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_manifold.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_manifold.py @@ -1,13 +1,12 @@ -from maya import cmds, mel - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateMeshOrder, + OptionalPyblishPluginMixin, PublishXmlValidationError, RepairAction, - OptionalPyblishPluginMixin + ValidateMeshOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds, mel def poly_cleanup(version=4, @@ -101,7 +100,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateMeshNonManifold(pyblish.api.InstancePlugin, +class ValidateMeshNonManifold(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure that meshes don't have non-manifold edges or vertices @@ -111,7 +110,6 @@ class ValidateMeshNonManifold(pyblish.api.InstancePlugin, """ order = ValidateMeshOrder - hosts = ['maya'] families = ['model'] label = 'Mesh Non-Manifold Edges/Vertices' actions = [ayon_maya.api.action.SelectInvalidAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_zero_edge.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_zero_edge.py index 7830e10f2a..f891a4f7de 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_zero_edge.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_zero_edge.py @@ -1,16 +1,15 @@ +import ayon_maya.api.action +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + ValidateMeshOrder, +) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api -import ayon_maya.api.action -from ayon_maya.api import lib -from ayon_core.pipeline.publish import ( - ValidateMeshOrder, - OptionalPyblishPluginMixin, - PublishValidationError -) - -class ValidateMeshNonZeroEdgeLength(pyblish.api.InstancePlugin, +class ValidateMeshNonZeroEdgeLength(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate meshes don't have edges with a zero length. @@ -23,7 +22,6 @@ class ValidateMeshNonZeroEdgeLength(pyblish.api.InstancePlugin, order = ValidateMeshOrder families = ['model'] - hosts = ['maya'] label = 'Mesh Edge Length Non Zero' actions = [ayon_maya.api.action.SelectInvalidAction] optional = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_normals_unlocked.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_normals_unlocked.py index 2d8370166b..c6b6786f24 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_normals_unlocked.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_normals_unlocked.py @@ -1,14 +1,13 @@ -from maya import cmds -import maya.api.OpenMaya as om2 - -import pyblish.api import ayon_maya.api.action +import maya.api.OpenMaya as om2 from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateMeshOrder, - OptionalPyblishPluginMixin, - PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds def _as_report_list(values, prefix="- ", suffix="\n"): @@ -18,7 +17,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateMeshNormalsUnlocked(pyblish.api.InstancePlugin, +class ValidateMeshNormalsUnlocked(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate all meshes in the instance have unlocked normals @@ -28,7 +27,6 @@ class ValidateMeshNormalsUnlocked(pyblish.api.InstancePlugin, """ order = ValidateMeshOrder - hosts = ['maya'] families = ['model'] label = 'Mesh Normals Unlocked' actions = [ayon_maya.api.action.SelectInvalidAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_overlapping_uvs.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_overlapping_uvs.py index 9606ec3202..5e9a4c3b60 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_overlapping_uvs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_overlapping_uvs.py @@ -1,16 +1,15 @@ import math -from six.moves import xrange - -from maya import cmds -import maya.api.OpenMaya as om -import pyblish.api import ayon_maya.api.action +import maya.api.OpenMaya as om from ayon_core.pipeline.publish import ( - ValidateMeshOrder, OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, + ValidateMeshOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds +from six.moves import xrange def _as_report_list(values, prefix="- ", suffix="\n"): @@ -236,7 +235,7 @@ class GetOverlappingUVs(object): return faces -class ValidateMeshHasOverlappingUVs(pyblish.api.InstancePlugin, +class ValidateMeshHasOverlappingUVs(MayaInstancePlugin, OptionalPyblishPluginMixin): """ Validate the current mesh overlapping UVs. @@ -245,7 +244,6 @@ class ValidateMeshHasOverlappingUVs(pyblish.api.InstancePlugin, """ order = ValidateMeshOrder - hosts = ['maya'] families = ['model'] label = 'Mesh Has Overlapping UVs' actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_shader_connections.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_shader_connections.py index 2e91df87a3..9f9ca0c0d5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_shader_connections.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_shader_connections.py @@ -1,13 +1,12 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateMeshOrder, - PublishValidationError, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds def pairs(iterable): @@ -80,7 +79,7 @@ def disconnect(node_a, node_b): cmds.disconnectAttr(source, input) -class ValidateMeshShaderConnections(pyblish.api.InstancePlugin, +class ValidateMeshShaderConnections(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure mesh shading engine connections are valid. @@ -93,7 +92,6 @@ class ValidateMeshShaderConnections(pyblish.api.InstancePlugin, """ order = ValidateMeshOrder - hosts = ['maya'] families = ['model'] label = "Mesh Shader Connections" actions = [ayon_maya.api.action.SelectInvalidAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_single_uv_set.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_single_uv_set.py index d807833a77..e7fb6d9ae0 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_single_uv_set.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_single_uv_set.py @@ -1,17 +1,16 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action -from ayon_maya.api import lib from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateMeshOrder, - OptionalPyblishPluginMixin, - PublishValidationError ) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateMeshSingleUVSet(pyblish.api.InstancePlugin, +class ValidateMeshSingleUVSet(MayaInstancePlugin, OptionalPyblishPluginMixin): """Warn on multiple UV sets existing for each polygon mesh. @@ -22,7 +21,6 @@ class ValidateMeshSingleUVSet(pyblish.api.InstancePlugin, """ order = ValidateMeshOrder - hosts = ['maya'] families = ['model', 'pointcache'] optional = True label = "Mesh Single UV Set" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_uv_set_map1.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_uv_set_map1.py index c4d3abc624..bce69c8279 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_uv_set_map1.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_uv_set_map1.py @@ -1,18 +1,17 @@ import inspect -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateMeshOrder, - OptionalPyblishPluginMixin, - PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateMeshUVSetMap1(pyblish.api.InstancePlugin, +class ValidateMeshUVSetMap1(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate model's default set exists and is named 'map1'. @@ -24,7 +23,6 @@ class ValidateMeshUVSetMap1(pyblish.api.InstancePlugin, """ order = ValidateMeshOrder - hosts = ['maya'] families = ['model'] optional = True label = "Mesh has map1 UV Set" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_vertices_have_edges.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_vertices_have_edges.py index 9dbdc8fd2b..a63e9a0727 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_vertices_have_edges.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_vertices_have_edges.py @@ -1,17 +1,16 @@ -import pyblish.api -from maya import cmds - import ayon_maya.api.action -from ayon_maya.api.lib import len_flattened from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, PublishValidationError, RepairAction, ValidateMeshOrder, - OptionalPyblishPluginMixin ) +from ayon_maya.api.lib import len_flattened +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateMeshVerticesHaveEdges(pyblish.api.InstancePlugin, +class ValidateMeshVerticesHaveEdges(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate meshes have only vertices that are connected to edges. @@ -32,7 +31,6 @@ class ValidateMeshVerticesHaveEdges(pyblish.api.InstancePlugin, """ order = ValidateMeshOrder - hosts = ['maya'] families = ['model'] label = 'Mesh Vertices Have Edges' actions = [ayon_maya.api.action.SelectInvalidAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_model_content.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_model_content.py index b06b45db81..32435e9d86 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_model_content.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_model_content.py @@ -1,18 +1,17 @@ import inspect +import ayon_maya.api.action +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + ValidateContentsOrder, +) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api -import ayon_maya.api.action -from ayon_maya.api import lib -from ayon_core.pipeline.publish import ( - ValidateContentsOrder, - PublishValidationError, - OptionalPyblishPluginMixin -) - -class ValidateModelContent(pyblish.api.InstancePlugin, +class ValidateModelContent(MayaInstancePlugin, OptionalPyblishPluginMixin): """Adheres to the content of 'model' product type @@ -21,7 +20,6 @@ class ValidateModelContent(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ["maya"] families = ["model"] label = "Model Content" actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mvlook_contents.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mvlook_contents.py index 980565afad..602c4ff371 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mvlook_contents.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mvlook_contents.py @@ -1,18 +1,18 @@ import os -import pyblish.api + import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, + ValidateContentsOrder, ) - +from ayon_maya.api.plugin import MayaInstancePlugin COLOUR_SPACES = ['sRGB', 'linear', 'auto'] MIPMAP_EXTENSIONS = ['tdl'] -class ValidateMvLookContents(pyblish.api.InstancePlugin, +class ValidateMvLookContents(MayaInstancePlugin, OptionalPyblishPluginMixin): order = ValidateContentsOrder families = ['mvLook'] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_animation.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_animation.py index 0e1f179483..6e6b04bfea 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_animation.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_animation.py @@ -1,12 +1,11 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, + ValidateContentsOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds def _as_report_list(values, prefix="- ", suffix="\n"): @@ -16,7 +15,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateNoAnimation(pyblish.api.InstancePlugin, +class ValidateNoAnimation(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure no keyframes on nodes in the Instance. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_default_camera.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_default_camera.py index be469cd4df..e5d938e337 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_default_camera.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_default_camera.py @@ -1,12 +1,11 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin + ValidateContentsOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds def _as_report_list(values, prefix="- ", suffix="\n"): @@ -16,7 +15,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateNoDefaultCameras(pyblish.api.InstancePlugin, +class ValidateNoDefaultCameras(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure no default (startup) cameras are in the instance. @@ -26,7 +25,6 @@ class ValidateNoDefaultCameras(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ['maya'] families = ['camera'] label = "No Default Cameras" actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_namespace.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_namespace.py index 0d7b67e179..a357b9cdec 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_namespace.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_namespace.py @@ -1,14 +1,12 @@ +import ayon_maya.api.action import maya.cmds as cmds - -import pyblish.api from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateContentsOrder, - PublishValidationError, - OptionalPyblishPluginMixin ) - -import ayon_maya.api.action +from ayon_maya.api.plugin import MayaInstancePlugin def _as_report_list(values, prefix="- ", suffix="\n"): @@ -25,12 +23,11 @@ def get_namespace(node_name): return node_name.rpartition(":")[0] -class ValidateNoNamespace(pyblish.api.InstancePlugin, +class ValidateNoNamespace(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure the nodes don't have a namespace""" order = ValidateContentsOrder - hosts = ['maya'] families = ['model'] label = 'No Namespaces' actions = [ayon_maya.api.action.SelectInvalidAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_null_transforms.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_null_transforms.py index 876be073a0..581b304f60 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_null_transforms.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_null_transforms.py @@ -1,13 +1,12 @@ -import maya.cmds as cmds - -import pyblish.api import ayon_maya.api.action +import maya.cmds as cmds from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateContentsOrder, - PublishValidationError, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin def _as_report_list(values, prefix="- ", suffix="\n"): @@ -33,7 +32,7 @@ def has_shape_children(node): return True -class ValidateNoNullTransforms(pyblish.api.InstancePlugin, +class ValidateNoNullTransforms(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure no null transforms are in the scene. @@ -46,7 +45,6 @@ class ValidateNoNullTransforms(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ['maya'] families = ['model'] label = 'No Empty/Null Transforms' actions = [RepairAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_unknown_nodes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_unknown_nodes.py index 8b4d873014..4f55f5f64f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_unknown_nodes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_unknown_nodes.py @@ -1,12 +1,11 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, + ValidateContentsOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds def _as_report_list(values, prefix="- ", suffix="\n"): @@ -16,7 +15,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateNoUnknownNodes(pyblish.api.InstancePlugin, +class ValidateNoUnknownNodes(MayaInstancePlugin, OptionalPyblishPluginMixin): """Checks to see if there are any unknown nodes in the instance. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_vraymesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_vraymesh.py index 2d59608e11..f54e0ddcd1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_vraymesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_vraymesh.py @@ -1,9 +1,11 @@ import pyblish.api -from maya import cmds from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds + def _as_report_list(values, prefix="- ", suffix="\n"): """Return list as bullet point list for a report""" @@ -12,7 +14,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateNoVRayMesh(pyblish.api.InstancePlugin, +class ValidateNoVRayMesh(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate there are no VRayMesh objects in the instance""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids.py index 810dbc4fa1..a5b1f50044 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids.py @@ -1,14 +1,13 @@ -import pyblish.api - from ayon_core.pipeline.publish import ( ValidatePipelineOrder, PublishXmlValidationError ) import ayon_maya.api.action from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateNodeIDs(pyblish.api.InstancePlugin): +class ValidateNodeIDs(MayaInstancePlugin): """Validate nodes have a Colorbleed Id. When IDs are missing from nodes *save your scene* and they should be @@ -19,7 +18,6 @@ class ValidateNodeIDs(pyblish.api.InstancePlugin): order = ValidatePipelineOrder label = 'Instance Nodes Have ID' - hosts = ['maya'] families = ["model", "look", "rig", diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_deformed_shapes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_deformed_shapes.py index 4fc8f776ef..28e6bf29b7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_deformed_shapes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_deformed_shapes.py @@ -1,13 +1,15 @@ -import pyblish.api +import ayon_maya.api.action +from ayon_core.pipeline.publish import ( + PublishValidationError, + RepairAction, + ValidateContentsOrder, +) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import ayon_maya.api.action -from ayon_maya.api import lib -from ayon_core.pipeline.publish import ( - PublishValidationError, RepairAction, ValidateContentsOrder) - -class ValidateNodeIdsDeformedShape(pyblish.api.InstancePlugin): +class ValidateNodeIdsDeformedShape(MayaInstancePlugin): """Validate if deformed shapes have related IDs to the original shapes. When a deformer is applied in the scene on a referenced mesh that already @@ -19,7 +21,6 @@ class ValidateNodeIdsDeformedShape(pyblish.api.InstancePlugin): order = ValidateContentsOrder families = ['look'] - hosts = ['maya'] label = 'Deformed shape ids' actions = [ ayon_maya.api.action.SelectInvalidAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_in_database.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_in_database.py index a1fde89fc3..6465878889 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_in_database.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_in_database.py @@ -1,13 +1,14 @@ -import pyblish.api import ayon_api - import ayon_maya.api.action -from ayon_maya.api import lib from ayon_core.pipeline.publish import ( - PublishValidationError, ValidatePipelineOrder) + PublishValidationError, + ValidatePipelineOrder, +) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateNodeIdsInDatabase(pyblish.api.InstancePlugin): +class ValidateNodeIdsInDatabase(MayaInstancePlugin): """Validate if the CB Id is related to an folder in the database All nodes with the `cbId` attribute will be validated to ensure that @@ -20,7 +21,6 @@ class ValidateNodeIdsInDatabase(pyblish.api.InstancePlugin): order = ValidatePipelineOrder label = 'Node Ids in Database' - hosts = ['maya'] families = ["*"] actions = [ayon_maya.api.action.SelectInvalidAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_related.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_related.py index 0ad497d119..eaf1d8a250 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_related.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_related.py @@ -1,13 +1,16 @@ import inspect import uuid from collections import defaultdict -import pyblish.api import ayon_maya.api.action -from ayon_maya.api import lib -from ayon_core.pipeline.publish import ( - OptionalPyblishPluginMixin, PublishValidationError, ValidatePipelineOrder) from ayon_api import get_folders +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + ValidatePipelineOrder, +) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin def is_valid_uuid(value) -> bool: @@ -19,13 +22,12 @@ def is_valid_uuid(value) -> bool: return True -class ValidateNodeIDsRelated(pyblish.api.InstancePlugin, +class ValidateNodeIDsRelated(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate nodes have a related `cbId` to the instance.data[folderPath]""" order = ValidatePipelineOrder label = 'Node Ids Related (ID)' - hosts = ['maya'] families = ["model", "look", "rig"] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_unique.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_unique.py index ae04a48678..ee32b1decc 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_unique.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_unique.py @@ -1,17 +1,16 @@ from collections import defaultdict -import pyblish.api -from ayon_core.pipeline.publish import ( - ValidatePipelineOrder, - PublishValidationError -) import ayon_maya.api.action +from ayon_core.pipeline.publish import ( + PublishValidationError, + ValidatePipelineOrder, +) from ayon_maya.api import lib - +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -class ValidateNodeIdsUnique(pyblish.api.InstancePlugin): +class ValidateNodeIdsUnique(MayaInstancePlugin): """Validate the nodes in the instance have a unique Colorbleed Id Here we ensure that what has been added to the instance is unique @@ -19,7 +18,6 @@ class ValidateNodeIdsUnique(pyblish.api.InstancePlugin): order = ValidatePipelineOrder label = 'Non Duplicate Instance Members (ID)' - hosts = ['maya'] families = ["model", "look", "rig", diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_no_ghosting.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_no_ghosting.py index 1220282d0c..735b98dfe9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_no_ghosting.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_no_ghosting.py @@ -1,16 +1,14 @@ -from maya import cmds - -import pyblish.api - import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, + ValidateContentsOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateNodeNoGhosting(pyblish.api.InstancePlugin, +class ValidateNodeNoGhosting(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure nodes do not have ghosting enabled. @@ -24,7 +22,6 @@ class ValidateNodeNoGhosting(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ['maya'] families = ['model', 'rig'] label = "No Ghosting" actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_plugin_path_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_plugin_path_attributes.py index ef6f97371f..4ab03f19c8 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_plugin_path_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_plugin_path_attributes.py @@ -1,26 +1,23 @@ import os +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + ValidateContentsOrder, +) +from ayon_maya.api.action import SelectInvalidAction +from ayon_maya.api.lib import pairwise +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api -from ayon_maya.api.lib import pairwise -from ayon_maya.api.action import SelectInvalidAction -from ayon_core.pipeline.publish import ( - ValidateContentsOrder, - PublishValidationError, - OptionalPyblishPluginMixin -) - - -class ValidatePluginPathAttributes(pyblish.api.InstancePlugin, +class ValidatePluginPathAttributes(MayaInstancePlugin, OptionalPyblishPluginMixin): """ Validate plug-in path attributes point to existing file paths. """ order = ValidateContentsOrder - hosts = ['maya'] families = ["workfile"] label = "Plug-in Path Attributes" actions = [SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_image_rule.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_image_rule.py index 117f7df822..72a69302a8 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_image_rule.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_image_rule.py @@ -1,18 +1,16 @@ import os -import pyblish.api - -from maya import cmds - from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, PublishValidationError, RepairAction, ValidateContentsOrder, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateRenderImageRule(pyblish.api.InstancePlugin, +class ValidateRenderImageRule(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates Maya Workpace "images" file rule matches project settings. @@ -24,7 +22,6 @@ class ValidateRenderImageRule(pyblish.api.InstancePlugin, order = ValidateContentsOrder label = "Images File Rule (Workspace)" - hosts = ["maya"] families = ["renderlayer"] actions = [RepairAction] optional = False diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_no_default_cameras.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_no_default_cameras.py index 1692b90993..85c304e0cd 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_no_default_cameras.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_no_default_cameras.py @@ -1,21 +1,18 @@ -from maya import cmds - -import pyblish.api - import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin + ValidateContentsOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateRenderNoDefaultCameras(pyblish.api.InstancePlugin, +class ValidateRenderNoDefaultCameras(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure no default (startup) cameras are to be rendered.""" order = ValidateContentsOrder - hosts = ['maya'] families = ['renderlayer'] label = "No Default Cameras Renderable" actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_single_camera.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_single_camera.py index cb03e68642..a50f4eeab5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_single_camera.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_single_camera.py @@ -1,19 +1,18 @@ -import re import inspect - -import pyblish.api -from maya import cmds +import re import ayon_maya.api.action -from ayon_maya.api.lib_rendersettings import RenderSettings from ayon_core.pipeline.publish import ( - ValidateContentsOrder, + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin + ValidateContentsOrder, ) +from ayon_maya.api.lib_rendersettings import RenderSettings +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateRenderSingleCamera(pyblish.api.InstancePlugin, +class ValidateRenderSingleCamera(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate renderable camera count for layer and token. @@ -23,7 +22,6 @@ class ValidateRenderSingleCamera(pyblish.api.InstancePlugin, order = ValidateContentsOrder label = "Render Single Camera" - hosts = ['maya'] families = ["renderlayer", "vrayscene"] actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_renderlayer_aovs.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_renderlayer_aovs.py index 92d97776e1..dd9cca19a5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_renderlayer_aovs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_renderlayer_aovs.py @@ -1,13 +1,14 @@ import ayon_api -import pyblish.api - import ayon_maya.api.action +import pyblish.api from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateRenderLayerAOVs(pyblish.api.InstancePlugin, + +class ValidateRenderLayerAOVs(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate created AOVs / RenderElement is registered in the database @@ -26,7 +27,6 @@ class ValidateRenderLayerAOVs(pyblish.api.InstancePlugin, order = pyblish.api.ValidatorOrder + 0.1 label = "Render Passes / AOVs Are Registered" - hosts = ["maya"] families = ["renderlayer"] actions = [ayon_maya.api.action.SelectInvalidAction] optional = False diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rendersettings.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rendersettings.py index d5a9ea778c..5e3b6c541f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rendersettings.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rendersettings.py @@ -3,17 +3,16 @@ import re from collections import OrderedDict -from maya import cmds, mel - -import pyblish.api from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateContentsOrder, - PublishValidationError, - OptionalPyblishPluginMixin ) from ayon_maya.api import lib from ayon_maya.api.lib_rendersettings import RenderSettings +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds, mel def convert_to_int_or_float(string_value): @@ -38,7 +37,7 @@ def get_redshift_image_format_labels(): return mel.eval("{0}={0}".format(var)) -class ValidateRenderSettings(pyblish.api.InstancePlugin, +class ValidateRenderSettings(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates the global render settings diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_resolution.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_resolution.py index aae3940e02..63c0b9dab1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_resolution.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_resolution.py @@ -1,21 +1,21 @@ import pyblish.api from ayon_core.pipeline import ( + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin ) -from maya import cmds from ayon_core.pipeline.publish import RepairAction from ayon_maya.api import lib from ayon_maya.api.lib import reset_scene_resolution +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateResolution(pyblish.api.InstancePlugin, +class ValidateResolution(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate the render resolution setting aligned with DB""" order = pyblish.api.ValidatorOrder families = ["renderlayer"] - hosts = ["maya"] label = "Validate Resolution" actions = [RepairAction] optional = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_resources.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_resources.py index 725e86450d..e3c7d65000 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_resources.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_resources.py @@ -1,14 +1,14 @@ import os from collections import defaultdict -import pyblish.api from ayon_core.pipeline.publish import ( + PublishValidationError, ValidateContentsOrder, - PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateResources(pyblish.api.InstancePlugin): +class ValidateResources(MayaInstancePlugin): """Validates mapped resources. These are external files to the current application, for example diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_review.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_review.py index fcfd851368..c38c132347 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_review.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_review.py @@ -1,11 +1,10 @@ -import pyblish.api - from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateReview(pyblish.api.InstancePlugin): +class ValidateReview(MayaInstancePlugin): """Validate review.""" order = ValidateContentsOrder diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_contents.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_contents.py index b8b8728888..ad642c34b2 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_contents.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_contents.py @@ -1,14 +1,14 @@ -import pyblish.api -from maya import cmds import ayon_maya.api.action from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, PublishValidationError, ValidateContentsOrder, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateRigContents(pyblish.api.InstancePlugin, +class ValidateRigContents(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure rig contains pipeline-critical content @@ -20,7 +20,6 @@ class ValidateRigContents(pyblish.api.InstancePlugin, order = ValidateContentsOrder label = "Rig Contents" - hosts = ["maya"] families = ["rig"] action = [ayon_maya.api.action.SelectInvalidAction] optional = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers.py index aed0800160..0bbbecc73d 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers.py @@ -1,18 +1,16 @@ +import ayon_maya.api.action +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + RepairAction, + ValidateContentsOrder, +) +from ayon_maya.api.lib import undo_chunk +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api -from ayon_core.pipeline.publish import ( - ValidateContentsOrder, - RepairAction, - PublishValidationError, - OptionalPyblishPluginMixin -) -import ayon_maya.api.action -from ayon_maya.api.lib import undo_chunk - - -class ValidateRigControllers(pyblish.api.InstancePlugin, +class ValidateRigControllers(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate rig controllers. @@ -33,7 +31,6 @@ class ValidateRigControllers(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder + 0.05 label = "Rig Controllers" - hosts = ["maya"] families = ["rig"] optional = True actions = [RepairAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers_arnold_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers_arnold_attributes.py index 4bc47c5949..4589603bff 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers_arnold_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers_arnold_attributes.py @@ -1,19 +1,16 @@ +import ayon_maya.api.action +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + RepairAction, + ValidateContentsOrder, +) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api -from ayon_core.pipeline.publish import ( - ValidateContentsOrder, - RepairAction, - PublishValidationError, - OptionalPyblishPluginMixin -) - -from ayon_maya.api import lib -import ayon_maya.api.action - - -class ValidateRigControllersArnoldAttributes(pyblish.api.InstancePlugin, +class ValidateRigControllersArnoldAttributes(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate rig control curves have no keyable arnold attributes. @@ -35,7 +32,6 @@ class ValidateRigControllersArnoldAttributes(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder + 0.05 label = "Rig Controllers (Arnold Attributes)" - hosts = ["maya"] families = ["rig"] optional = False actions = [RepairAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_joints_hidden.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_joints_hidden.py index d45af574ab..e9e43a9902 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_joints_hidden.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_joints_hidden.py @@ -1,18 +1,16 @@ -from maya import cmds - -import pyblish.api - import ayon_maya.api.action -from ayon_maya.api import lib from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateContentsOrder, - PublishValidationError, - OptionalPyblishPluginMixin ) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateRigJointsHidden(pyblish.api.InstancePlugin, +class ValidateRigJointsHidden(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate all joints are hidden visually. @@ -25,7 +23,6 @@ class ValidateRigJointsHidden(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ['maya'] families = ['rig'] label = "Joints Hidden" actions = [ayon_maya.api.action.SelectInvalidAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_out_set_node_ids.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_out_set_node_ids.py index e5404aae7e..163e2007dd 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_out_set_node_ids.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_out_set_node_ids.py @@ -1,20 +1,18 @@ -import maya.cmds as cmds - -import pyblish.api - import ayon_maya.api.action -from ayon_maya.api import lib +import maya.cmds as cmds from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishXmlValidationError, RepairAction, ValidateContentsOrder, - PublishXmlValidationError, - OptionalPyblishPluginMixin, + apply_plugin_settings_automatically, get_plugin_settings, - apply_plugin_settings_automatically ) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateRigOutSetNodeIds(pyblish.api.InstancePlugin, +class ValidateRigOutSetNodeIds(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate if deformed shapes have related IDs to the original shapes. @@ -27,7 +25,6 @@ class ValidateRigOutSetNodeIds(pyblish.api.InstancePlugin, order = ValidateContentsOrder families = ["rig"] - hosts = ['maya'] label = 'Rig Out Set Node Ids' actions = [ ayon_maya.api.action.SelectInvalidAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_output_ids.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_output_ids.py index c5fee5ddc6..2a965173fa 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_output_ids.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_output_ids.py @@ -1,16 +1,14 @@ from collections import defaultdict -from maya import cmds - -import pyblish.api - import ayon_maya.api.action -from ayon_maya.api.lib import get_id, set_id from ayon_core.pipeline.publish import ( + PublishValidationError, RepairAction, ValidateContentsOrder, - PublishValidationError ) +from ayon_maya.api.lib import get_id, set_id +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds def get_basename(node): @@ -18,7 +16,7 @@ def get_basename(node): return node.rsplit("|", 1)[-1].rsplit(":", 1)[-1] -class ValidateRigOutputIds(pyblish.api.InstancePlugin): +class ValidateRigOutputIds(MayaInstancePlugin): """Validate rig output ids. Ids must share the same id as similarly named nodes in the scene. This is @@ -27,7 +25,6 @@ class ValidateRigOutputIds(pyblish.api.InstancePlugin): """ order = ValidateContentsOrder + 0.05 label = "Rig Output Ids" - hosts = ["maya"] families = ["rig"] actions = [RepairAction, ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_scene_set_workspace.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_scene_set_workspace.py index c7d5de2050..d8885cc530 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_scene_set_workspace.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_scene_set_workspace.py @@ -1,10 +1,11 @@ import os import maya.cmds as cmds -import pyblish.api - from ayon_core.pipeline.publish import ( - PublishValidationError, ValidatePipelineOrder) + PublishValidationError, + ValidatePipelineOrder, +) +from ayon_maya.api.plugin import MayaContextPlugin def is_subdir(path, root_dir): @@ -26,11 +27,10 @@ def is_subdir(path, root_dir): return True -class ValidateSceneSetWorkspace(pyblish.api.ContextPlugin): +class ValidateSceneSetWorkspace(MayaContextPlugin): """Validate the scene is inside the currently set Maya workspace""" order = ValidatePipelineOrder - hosts = ['maya'] label = 'Maya Workspace Set' def process(self, context): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_setdress_root.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_setdress_root.py index f88e33fdfb..ae5493ffe4 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_setdress_root.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_setdress_root.py @@ -1,16 +1,15 @@ -import pyblish.api from ayon_core.pipeline.publish import ( + PublishValidationError, ValidateContentsOrder, - PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateSetdressRoot(pyblish.api.InstancePlugin): +class ValidateSetdressRoot(MayaInstancePlugin): """Validate if set dress top root node is published.""" order = ValidateContentsOrder label = "SetDress Root" - hosts = ["maya"] families = ["setdress"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shader_name.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shader_name.py index ed1ea17966..77dc24d1a4 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shader_name.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shader_name.py @@ -1,14 +1,16 @@ import re -import pyblish.api -from maya import cmds - import ayon_maya.api.action from ayon_core.pipeline.publish import ( - OptionalPyblishPluginMixin, PublishValidationError, ValidateContentsOrder) + OptionalPyblishPluginMixin, + PublishValidationError, + ValidateContentsOrder, +) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateShaderName(pyblish.api.InstancePlugin, +class ValidateShaderName(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate shader name assigned. @@ -18,7 +20,6 @@ class ValidateShaderName(pyblish.api.InstancePlugin, optional = True order = ValidateContentsOrder families = ["look"] - hosts = ['maya'] label = 'Validate Shaders Name' actions = [ayon_maya.api.action.SelectInvalidAction] regex = r'(?P.*)_(.*)_SHD' diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_default_names.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_default_names.py index 5355cd9cfd..bd9f0cf1d7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_default_names.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_default_names.py @@ -1,23 +1,21 @@ import re -from maya import cmds - -import pyblish.api - import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, - RepairAction, OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, + RepairAction, + ValidateContentsOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds def short_name(node): return node.rsplit("|", 1)[-1].rsplit(":", 1)[-1] -class ValidateShapeDefaultNames(pyblish.api.InstancePlugin, +class ValidateShapeDefaultNames(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates that Shape names are using Maya's default format. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_render_stats.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_render_stats.py index e6e2f963e9..646c12f331 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_render_stats.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_render_stats.py @@ -1,22 +1,19 @@ -import pyblish.api - -from maya import cmds - import ayon_maya.api.action from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, RepairAction, ValidateMeshOrder, - PublishValidationError, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateShapeRenderStats(pyblish.api.InstancePlugin, +class ValidateShapeRenderStats(MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure all render stats are set to the default values.""" order = ValidateMeshOrder - hosts = ['maya'] families = ['model'] label = 'Shape Default Render Stats' actions = [ayon_maya.api.action.SelectInvalidAction, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_zero.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_zero.py index 6d39e26408..8f58e646f0 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_zero.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_zero.py @@ -1,18 +1,16 @@ +import ayon_maya.api.action +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + RepairAction, + ValidateContentsOrder, +) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api -import ayon_maya.api.action -from ayon_maya.api import lib -from ayon_core.pipeline.publish import ( - ValidateContentsOrder, - RepairAction, - PublishValidationError, - OptionalPyblishPluginMixin -) - - -class ValidateShapeZero(pyblish.api.InstancePlugin, +class ValidateShapeZero(MayaInstancePlugin, OptionalPyblishPluginMixin): """Shape components may not have any "tweak" values @@ -21,7 +19,6 @@ class ValidateShapeZero(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ["maya"] families = ["model"] label = "Shape Zero (Freeze)" actions = [ diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_single_assembly.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_single_assembly.py index f5d73553d3..02f3973149 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_single_assembly.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_single_assembly.py @@ -1,11 +1,11 @@ -import pyblish.api from ayon_core.pipeline.publish import ( + PublishValidationError, ValidateContentsOrder, - PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateSingleAssembly(pyblish.api.InstancePlugin): +class ValidateSingleAssembly(MayaInstancePlugin): """Ensure the content of the instance is grouped in a single hierarchy The instance must have a single root node containing all the content. @@ -21,7 +21,6 @@ class ValidateSingleAssembly(pyblish.api.InstancePlugin): """ order = ValidateContentsOrder - hosts = ['maya'] families = ['rig'] label = 'Single Assembly' diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_hierarchy.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_hierarchy.py index 172453f1ef..be71eebac2 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_hierarchy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_hierarchy.py @@ -1,21 +1,19 @@ # -*- coding: utf-8 -*- -import pyblish.api from ayon_core.pipeline.publish import ( - ValidateContentsOrder, + OptionalPyblishPluginMixin, PublishXmlValidationError, - OptionalPyblishPluginMixin + ValidateContentsOrder, ) - +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -class ValidateSkeletalMeshHierarchy(pyblish.api.InstancePlugin, +class ValidateSkeletalMeshHierarchy(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates that nodes has common root.""" order = ValidateContentsOrder - hosts = ["maya"] families = ["skeletalMesh"] label = "Skeletal Mesh Top Node" optional = False diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_triangulated.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_triangulated.py index 7e63ed2ae3..db93b8cbc5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_triangulated.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_triangulated.py @@ -1,24 +1,19 @@ # -*- coding: utf-8 -*- -import pyblish.api -from ayon_maya.api.action import ( - SelectInvalidAction, -) from ayon_core.pipeline.publish import ( + PublishValidationError, RepairAction, ValidateContentsOrder, - PublishValidationError ) - - +from ayon_maya.api.action import SelectInvalidAction +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -class ValidateSkeletalMeshTriangulated(pyblish.api.InstancePlugin): +class ValidateSkeletalMeshTriangulated(MayaInstancePlugin): """Validates that the geometry has been triangulated.""" order = ValidateContentsOrder - hosts = ["maya"] families = ["skeletalMesh"] label = "Skeletal Mesh Triangulated" optional = True diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeleton_top_group_hierarchy.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeleton_top_group_hierarchy.py index 9fbe0f440b..57418324c9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeleton_top_group_hierarchy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeleton_top_group_hierarchy.py @@ -1,17 +1,15 @@ # -*- coding: utf-8 -*- """Plugin for validating naming conventions.""" +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + ValidateContentsOrder, +) +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api -from ayon_core.pipeline.publish import ( - ValidateContentsOrder, - OptionalPyblishPluginMixin, - PublishValidationError -) - - -class ValidateSkeletonTopGroupHierarchy(pyblish.api.InstancePlugin, +class ValidateSkeletonTopGroupHierarchy(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates top group hierarchy in the SETs Make sure the object inside the SETs are always top diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skinCluster_deformer_set.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skinCluster_deformer_set.py index 7a7b6a9048..ee99b432aa 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skinCluster_deformer_set.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skinCluster_deformer_set.py @@ -1,16 +1,15 @@ from maya import cmds -import pyblish.api - import ayon_maya.api.action from ayon_core.pipeline.publish import ( ValidateContentsOrder, OptionalPyblishPluginMixin, PublishValidationError ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateSkinclusterDeformerSet(pyblish.api.InstancePlugin, +class ValidateSkinclusterDeformerSet(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate skinClusters on meshes have valid member relationships. @@ -21,7 +20,6 @@ class ValidateSkinclusterDeformerSet(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ['maya'] families = ['fbx'] label = "Skincluster Deformer Relationships" actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_step_size.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_step_size.py index 1373048cc2..445388efc1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_step_size.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_step_size.py @@ -1,14 +1,13 @@ -import pyblish.api - import ayon_maya.api.action from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, PublishValidationError, ValidateContentsOrder, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateStepSize(pyblish.api.InstancePlugin, +class ValidateStepSize(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates the step size for the instance is in a valid range. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_naming_suffix.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_naming_suffix.py index 846fc86650..1d6a29d446 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_naming_suffix.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_naming_suffix.py @@ -1,19 +1,18 @@ # -*- coding: utf-8 -*- """Plugin for validating naming conventions.""" import json -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, + ValidateContentsOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateTransformNamingSuffix(pyblish.api.InstancePlugin, +class ValidateTransformNamingSuffix(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates transform suffix based on the type of its children shapes. @@ -36,7 +35,6 @@ class ValidateTransformNamingSuffix(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ["maya"] families = ["model"] optional = True label = "Suffix Naming Conventions" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_zero.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_zero.py index 51fa7938ef..621a7dd6bc 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_zero.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_zero.py @@ -1,17 +1,16 @@ import inspect -from maya import cmds -import pyblish.api - import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin + ValidateContentsOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateTransformZero(pyblish.api.InstancePlugin, +class ValidateTransformZero(MayaInstancePlugin, OptionalPyblishPluginMixin): """Transforms can't have any values @@ -22,7 +21,6 @@ class ValidateTransformZero(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ["maya"] families = ["model"] label = "Transform Zero (Freeze)" actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unique_names.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unique_names.py index 74f2292680..59540b659a 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unique_names.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unique_names.py @@ -1,15 +1,14 @@ -from maya import cmds - -import pyblish.api import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, + ValidateContentsOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateUniqueNames(pyblish.api.InstancePlugin, +class ValidateUniqueNames(MayaInstancePlugin, OptionalPyblishPluginMixin): """transform names should be unique @@ -18,7 +17,6 @@ class ValidateUniqueNames(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder - hosts = ["maya"] families = ["model"] label = "Unique transform name" actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_mesh_triangulated.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_mesh_triangulated.py index f6207797a7..e8fc3fc095 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_mesh_triangulated.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_mesh_triangulated.py @@ -1,22 +1,19 @@ # -*- coding: utf-8 -*- - -from maya import cmds -import pyblish.api - -from ayon_core.pipeline.publish import ( - ValidateMeshOrder, - OptionalPyblishPluginMixin, - PublishValidationError -) import ayon_maya.api.action +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + ValidateMeshOrder, +) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateUnrealMeshTriangulated(pyblish.api.InstancePlugin, +class ValidateUnrealMeshTriangulated(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate if mesh is made of triangles for Unreal Engine""" order = ValidateMeshOrder - hosts = ["maya"] families = ["staticMesh"] label = "Mesh is Triangulated" actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_staticmesh_naming.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_staticmesh_naming.py index eff980843e..054f9aa3a0 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_staticmesh_naming.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_staticmesh_naming.py @@ -2,17 +2,16 @@ """Validator for correct naming of Static Meshes.""" import re -import pyblish.api - import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, + ValidateContentsOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateUnrealStaticMeshName(pyblish.api.InstancePlugin, +class ValidateUnrealStaticMeshName(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate name of Unreal Static Mesh @@ -55,7 +54,6 @@ class ValidateUnrealStaticMeshName(pyblish.api.InstancePlugin, """ optional = True order = ValidateContentsOrder - hosts = ["maya"] families = ["staticMesh"] label = "Unreal Static Mesh Name" actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_up_axis.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_up_axis.py index f7acd41cea..fad0eff5f8 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_up_axis.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_up_axis.py @@ -1,24 +1,21 @@ # -*- coding: utf-8 -*- - -from maya import cmds -import pyblish.api - from ayon_core.pipeline.publish import ( - ValidateContentsOrder, - RepairAction, OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, + RepairAction, + ValidateContentsOrder, ) +from ayon_maya.api.plugin import MayaContextPlugin +from maya import cmds -class ValidateUnrealUpAxis(pyblish.api.ContextPlugin, +class ValidateUnrealUpAxis(MayaContextPlugin, OptionalPyblishPluginMixin): """Validate if Z is set as up axis in Maya""" optional = True active = False order = ValidateContentsOrder - hosts = ["maya"] families = ["staticMesh"] label = "Unreal Up-Axis check" actions = [RepairAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_visible_only.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_visible_only.py index 4252585324..431cf2f229 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_visible_only.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_visible_only.py @@ -1,15 +1,14 @@ -import pyblish.api - -from ayon_maya.api.lib import iter_visible_nodes_in_range import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin + ValidateContentsOrder, ) +from ayon_maya.api.lib import iter_visible_nodes_in_range +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateAlembicVisibleOnly(pyblish.api.InstancePlugin, +class ValidateAlembicVisibleOnly(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates at least a single node is visible in frame range. @@ -19,7 +18,6 @@ class ValidateAlembicVisibleOnly(pyblish.api.InstancePlugin, """ order = ValidateContentsOrder + 0.05 label = "Alembic Visible Only" - hosts = ["maya"] families = ["pointcache", "animation"] actions = [ayon_maya.api.action.SelectInvalidAction] optional = False diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray.py index db78212658..65a01886b6 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray.py @@ -1,15 +1,14 @@ -from maya import cmds - import pyblish.api from ayon_core.pipeline.publish import PublishValidationError +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateVray(pyblish.api.InstancePlugin): +class ValidateVray(MayaInstancePlugin): """Validate general Vray setup.""" order = pyblish.api.ValidatorOrder label = 'VRay' - hosts = ["maya"] families = ["vrayproxy"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_distributed_rendering.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_distributed_rendering.py index 76c87f3e8b..d58c01c1e2 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_distributed_rendering.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_distributed_rendering.py @@ -1,17 +1,16 @@ -import pyblish.api -from maya import cmds - -from ayon_maya.api import lib from ayon_core.pipeline.publish import ( KnownPublishError, + OptionalPyblishPluginMixin, PublishValidationError, RepairAction, ValidateContentsOrder, - OptionalPyblishPluginMixin ) +from ayon_maya.api import lib +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateVRayDistributedRendering(pyblish.api.InstancePlugin, +class ValidateVRayDistributedRendering(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate V-Ray Distributed Rendering is ignored in batch mode. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_referenced_aovs.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_referenced_aovs.py index 9df5fb8488..9cc3290853 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_referenced_aovs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_referenced_aovs.py @@ -1,17 +1,18 @@ # -*- coding: utf-8 -*- """Validate if there are AOVs pulled from references.""" -import pyblish.api import types + +import pyblish.api +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + RepairContextAction, +) +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -from ayon_core.pipeline.publish import ( - RepairContextAction, - OptionalPyblishPluginMixin, - PublishValidationError -) - -class ValidateVrayReferencedAOVs(pyblish.api.InstancePlugin, +class ValidateVrayReferencedAOVs(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate whether the V-Ray Render Elements (AOVs) include references. @@ -23,7 +24,6 @@ class ValidateVrayReferencedAOVs(pyblish.api.InstancePlugin, order = pyblish.api.ValidatorOrder label = 'VRay Referenced AOVs' - hosts = ['maya'] families = ['renderlayer'] actions = [RepairContextAction] optional = False diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_translator_settings.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_translator_settings.py index a3d93dd9c0..546fd480a9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_translator_settings.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_translator_settings.py @@ -1,18 +1,17 @@ # -*- coding: utf-8 -*- """Validate VRay Translator settings.""" -import pyblish.api from ayon_core.pipeline.publish import ( - context_plugin_should_run, + OptionalPyblishPluginMixin, + PublishValidationError, RepairContextAction, ValidateContentsOrder, - PublishValidationError, - OptionalPyblishPluginMixin + context_plugin_should_run, ) - +from ayon_maya.api.plugin import MayaContextPlugin from maya import cmds -class ValidateVRayTranslatorEnabled(pyblish.api.ContextPlugin, +class ValidateVRayTranslatorEnabled(MayaContextPlugin, OptionalPyblishPluginMixin): """Validate VRay Translator settings for extracting vrscenes.""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy.py index 0288d4b865..06b717be03 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy.py @@ -1,17 +1,16 @@ import pyblish.api - from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, - PublishValidationError + PublishValidationError, ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateVrayProxy(pyblish.api.InstancePlugin, +class ValidateVrayProxy(MayaInstancePlugin, OptionalPyblishPluginMixin): order = pyblish.api.ValidatorOrder label = "VRay Proxy Settings" - hosts = ["maya"] families = ["vrayproxy"] optional = False diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy_members.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy_members.py index 40315a1e40..60d4fe4d8c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy_members.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy_members.py @@ -1,22 +1,19 @@ +import ayon_maya.api.action import pyblish.api - +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, +) +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import ayon_maya.api.action -from ayon_core.pipeline.publish import ( - PublishValidationError, - OptionalPyblishPluginMixin -) - - -class ValidateVrayProxyMembers(pyblish.api.InstancePlugin, +class ValidateVrayProxyMembers(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate whether the V-Ray Proxy instance has shape members""" order = pyblish.api.ValidatorOrder label = 'VRay Proxy Members' - hosts = ['maya'] families = ['vrayproxy'] actions = [ayon_maya.api.action.SelectInvalidAction] optional = False diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_xgen.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_xgen.py index 7e0f01c482..036da2c1e6 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_xgen.py @@ -1,18 +1,17 @@ import json import maya.cmds as cmds -import xgenm - import pyblish.api +import xgenm from ayon_core.pipeline.publish import PublishValidationError +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateXgen(pyblish.api.InstancePlugin): +class ValidateXgen(MayaInstancePlugin): """Validate Xgen data.""" label = "Validate Xgen" order = pyblish.api.ValidatorOrder - host = ["maya"] families = ["xgen"] def process(self, instance): diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_renderscript_callbacks.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_renderscript_callbacks.py index 086cb7b1f5..c185838028 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_renderscript_callbacks.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_renderscript_callbacks.py @@ -1,14 +1,13 @@ +from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, + PublishValidationError, + ValidateContentsOrder, +) +from ayon_maya.api.plugin import MayaInstancePlugin from maya import cmds -import pyblish.api -from ayon_core.pipeline.publish import ( - ValidateContentsOrder, - PublishValidationError, - OptionalPyblishPluginMixin -) - -class ValidateYetiRenderScriptCallbacks(pyblish.api.InstancePlugin, +class ValidateYetiRenderScriptCallbacks(MayaInstancePlugin, OptionalPyblishPluginMixin): """Check if the render script callbacks will be used during the rendering @@ -27,7 +26,6 @@ class ValidateYetiRenderScriptCallbacks(pyblish.api.InstancePlugin, order = ValidateContentsOrder label = "Yeti Render Script Callbacks" - hosts = ["maya"] families = ["renderlayer"] optional = False diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_cache_state.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_cache_state.py index 87887b7d36..64478d4c50 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_cache_state.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_cache_state.py @@ -1,16 +1,17 @@ import inspect -import pyblish.api -import maya.cmds as cmds import ayon_maya.api.action +import maya.cmds as cmds +import pyblish.api from ayon_core.pipeline.publish import ( - RepairAction, + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin + RepairAction, ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateYetiRigCacheState(pyblish.api.InstancePlugin, +class ValidateYetiRigCacheState(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate the I/O attributes of the node @@ -22,7 +23,6 @@ class ValidateYetiRigCacheState(pyblish.api.InstancePlugin, order = pyblish.api.ValidatorOrder label = "Yeti Rig Cache State" - hosts = ["maya"] families = ["yetiRig"] actions = [RepairAction, ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_input_in_instance.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_input_in_instance.py index 59a6867c17..cf637e55cb 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_input_in_instance.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_input_in_instance.py @@ -1,21 +1,18 @@ -from maya import cmds - -import pyblish.api - import ayon_maya.api.action from ayon_core.pipeline.publish import ( - ValidateContentsOrder, + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin + ValidateContentsOrder, ) +from ayon_maya.api.plugin import MayaInstancePlugin +from maya import cmds -class ValidateYetiRigInputShapesInInstance(pyblish.api.InstancePlugin, +class ValidateYetiRigInputShapesInInstance(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate if all input nodes are part of the instance's hierarchy""" order = ValidateContentsOrder - hosts = ["maya"] families = ["yetiRig"] label = "Yeti Rig Input Shapes In Instance" actions = [ayon_maya.api.action.SelectInvalidAction] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_settings.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_settings.py index 6bd2ebb753..4258fb8feb 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_settings.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_settings.py @@ -1,12 +1,12 @@ import pyblish.api - from ayon_core.pipeline.publish import ( + OptionalPyblishPluginMixin, PublishValidationError, - OptionalPyblishPluginMixin ) +from ayon_maya.api.plugin import MayaInstancePlugin -class ValidateYetiRigSettings(pyblish.api.InstancePlugin, +class ValidateYetiRigSettings(MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate Yeti Rig Settings have collected input connections. From c5f385092f218c3847b5763a700601a41da1279d Mon Sep 17 00:00:00 2001 From: Kayla Man Date: Thu, 30 May 2024 20:54:32 +0800 Subject: [PATCH 52/67] add the missing addon milestone versions --- client/ayon_core/addon/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index 01f80267d8..5a2c1d353e 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -54,6 +54,7 @@ MOVED_ADDON_MILESTONE_VERSIONS = { "celaction": VersionInfo(0, 2, 0), "clockify": VersionInfo(0, 2, 0), "flame": VersionInfo(0, 2, 0), + "max": VersionInfo(0, 2, 0), "traypublisher": VersionInfo(0, 2, 0), "tvpaint": VersionInfo(0, 2, 0), "nuke": VersionInfo(0, 2, 0), From 1132da882fb0145141fc591995686d0afcb81882 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Samohel?= Date: Thu, 30 May 2024 16:43:16 +0200 Subject: [PATCH 53/67] :bug: fix imports workaround for discovery --- .../plugins/load/load_arnold_standin.py | 5 +++-- .../plugins/load/load_as_template.py | 4 ++-- .../ayon_maya/plugins/load/load_assembly.py | 4 ++-- .../ayon_maya/plugins/load/load_audio.py | 4 ++-- .../ayon_maya/plugins/load/load_gpucache.py | 5 +++-- .../ayon_maya/plugins/load/load_image.py | 4 ++-- .../plugins/load/load_image_plane.py | 4 ++-- .../ayon_maya/plugins/load/load_matchmove.py | 4 ++-- .../ayon_maya/plugins/load/load_maya_usd.py | 4 ++-- .../plugins/load/load_multiverse_usd.py | 4 ++-- .../plugins/load/load_multiverse_usd_over.py | 4 ++-- .../plugins/load/load_redshift_proxy.py | 5 +++-- .../plugins/load/load_rendersetup.py | 4 ++-- .../plugins/load/load_vdb_to_arnold.py | 5 +++-- .../plugins/load/load_vdb_to_redshift.py | 5 +++-- .../plugins/load/load_vdb_to_vray.py | 5 +++-- .../ayon_maya/plugins/load/load_vrayproxy.py | 5 +++-- .../ayon_maya/plugins/load/load_vrayscene.py | 5 +++-- .../ayon_maya/plugins/load/load_xgen.py | 4 ++-- .../ayon_maya/plugins/load/load_yeti_cache.py | 5 +++-- .../plugins/publish/collect_animation.py | 4 ++-- .../publish/collect_arnold_scene_source.py | 4 ++-- .../plugins/publish/collect_assembly.py | 4 ++-- .../plugins/publish/collect_current_file.py | 4 ++-- .../plugins/publish/collect_fbx_animation.py | 4 ++-- .../plugins/publish/collect_fbx_camera.py | 4 ++-- .../publish/collect_file_dependencies.py | 4 ++-- .../ayon_maya/plugins/publish/collect_gltf.py | 4 ++-- .../plugins/publish/collect_history.py | 4 ++-- .../plugins/publish/collect_inputs.py | 4 ++-- .../plugins/publish/collect_instances.py | 4 ++-- .../ayon_maya/plugins/publish/collect_look.py | 4 ++-- .../publish/collect_maya_scene_time.py | 4 ++-- .../plugins/publish/collect_maya_units.py | 4 ++-- .../plugins/publish/collect_maya_workspace.py | 4 ++-- .../plugins/publish/collect_model.py | 4 ++-- .../publish/collect_multiverse_look.py | 4 ++-- .../plugins/publish/collect_pointcache.py | 4 ++-- .../plugins/publish/collect_remove_marked.py | 4 ++-- .../plugins/publish/collect_render.py | 4 ++-- .../publish/collect_render_layer_aovs.py | 4 ++-- .../publish/collect_renderable_camera.py | 4 ++-- .../plugins/publish/collect_review.py | 4 ++-- .../plugins/publish/collect_rig_sets.py | 4 ++-- .../plugins/publish/collect_skeleton_mesh.py | 4 ++-- .../publish/collect_unreal_skeletalmesh.py | 4 ++-- .../publish/collect_unreal_staticmesh.py | 4 ++-- .../collect_user_defined_attributes.py | 4 ++-- .../plugins/publish/collect_vrayproxy.py | 4 ++-- .../plugins/publish/collect_vrayscene.py | 4 ++-- .../plugins/publish/collect_workfile.py | 4 ++-- .../plugins/publish/collect_workscene_fps.py | 4 ++-- .../ayon_maya/plugins/publish/collect_xgen.py | 4 ++-- .../plugins/publish/collect_yeti_cache.py | 4 ++-- .../plugins/publish/collect_yeti_rig.py | 4 ++-- .../publish/determine_future_version.py | 4 ++-- .../publish/extract_active_view_thumbnail.py | 4 ++-- .../publish/extract_arnold_scene_source.py | 5 ++--- .../plugins/publish/extract_assembly.py | 4 ++-- .../plugins/publish/extract_camera_alembic.py | 4 ++-- .../publish/extract_camera_mayaScene.py | 4 ++-- .../ayon_maya/plugins/publish/extract_fbx.py | 4 ++-- .../plugins/publish/extract_fbx_animation.py | 4 ++-- .../ayon_maya/plugins/publish/extract_gltf.py | 4 ++-- .../plugins/publish/extract_gpu_cache.py | 4 ++-- .../publish/extract_import_reference.py | 4 ++-- .../plugins/publish/extract_layout.py | 4 ++-- .../ayon_maya/plugins/publish/extract_look.py | 4 ++-- .../plugins/publish/extract_maya_scene_raw.py | 4 ++-- .../plugins/publish/extract_maya_usd.py | 4 ++-- .../plugins/publish/extract_model.py | 4 ++-- .../publish/extract_multiverse_look.py | 4 ++-- .../plugins/publish/extract_multiverse_usd.py | 4 ++-- .../publish/extract_multiverse_usd_comp.py | 4 ++-- .../publish/extract_multiverse_usd_over.py | 4 ++-- .../ayon_maya/plugins/publish/extract_obj.py | 4 ++-- .../plugins/publish/extract_playblast.py | 4 ++-- .../plugins/publish/extract_pointcache.py | 4 ++-- .../plugins/publish/extract_proxy_abc.py | 4 ++-- .../plugins/publish/extract_redshift_proxy.py | 4 ++-- .../plugins/publish/extract_rendersetup.py | 4 ++-- .../ayon_maya/plugins/publish/extract_rig.py | 4 ++-- .../plugins/publish/extract_skeleton_mesh.py | 4 ++-- .../plugins/publish/extract_thumbnail.py | 4 ++-- .../extract_unreal_skeletalmesh_abc.py | 4 ++-- .../extract_unreal_skeletalmesh_fbx.py | 4 ++-- .../publish/extract_unreal_staticmesh.py | 4 ++-- .../publish/extract_unreal_yeticache.py | 4 ++-- .../plugins/publish/extract_vrayproxy.py | 4 ++-- .../plugins/publish/extract_vrayscene.py | 4 ++-- .../plugins/publish/extract_workfile_xgen.py | 4 ++-- .../ayon_maya/plugins/publish/extract_xgen.py | 4 ++-- .../plugins/publish/extract_yeti_cache.py | 4 ++-- .../plugins/publish/extract_yeti_rig.py | 4 ++-- .../increment_current_file_deadline.py | 4 ++-- .../plugins/publish/reset_xgen_attributes.py | 4 ++-- .../ayon_maya/plugins/publish/save_scene.py | 4 ++-- .../validate_alembic_options_defaults.py | 4 ++-- .../publish/validate_animation_content.py | 4 ++-- ...date_animation_out_set_related_node_ids.py | 4 ++-- .../publish/validate_arnold_scene_source.py | 4 ++-- .../validate_arnold_scene_source_cbid.py | 4 ++-- .../publish/validate_ass_relative_paths.py | 4 ++-- .../plugins/publish/validate_assembly_name.py | 4 ++-- .../publish/validate_assembly_namespaces.py | 4 ++-- .../publish/validate_assembly_transforms.py | 4 ++-- .../plugins/publish/validate_attributes.py | 4 ++-- .../publish/validate_camera_attributes.py | 4 ++-- .../publish/validate_camera_contents.py | 4 ++-- .../plugins/publish/validate_color_sets.py | 4 ++-- ...validate_current_renderlayer_renderable.py | 4 ++-- .../plugins/publish/validate_cycle_error.py | 4 ++-- .../plugins/publish/validate_frame_range.py | 4 ++-- .../plugins/publish/validate_glsl_material.py | 4 ++-- .../plugins/publish/validate_glsl_plugin.py | 4 ++-- .../publish/validate_instance_has_members.py | 4 ++-- .../publish/validate_instance_in_context.py | 4 ++-- .../publish/validate_instance_subset.py | 4 ++-- .../plugins/publish/validate_loaded_plugin.py | 20 +++++++++---------- .../plugins/publish/validate_look_contents.py | 4 ++-- ...lidate_look_default_shaders_connections.py | 4 ++-- .../validate_look_id_reference_edits.py | 4 ++-- .../validate_look_no_default_shaders.py | 4 ++-- .../plugins/publish/validate_look_sets.py | 4 ++-- .../publish/validate_look_shading_group.py | 4 ++-- .../publish/validate_look_single_shader.py | 4 ++-- .../plugins/publish/validate_maya_units.py | 4 ++-- .../validate_mesh_arnold_attributes.py | 4 ++-- .../plugins/publish/validate_mesh_empty.py | 4 ++-- .../plugins/publish/validate_mesh_has_uv.py | 4 ++-- .../publish/validate_mesh_lamina_faces.py | 4 ++-- .../plugins/publish/validate_mesh_ngons.py | 4 ++-- .../validate_mesh_no_negative_scale.py | 4 ++-- .../publish/validate_mesh_non_manifold.py | 4 ++-- .../publish/validate_mesh_non_zero_edge.py | 4 ++-- .../publish/validate_mesh_normals_unlocked.py | 4 ++-- .../publish/validate_mesh_overlapping_uvs.py | 4 ++-- .../validate_mesh_shader_connections.py | 4 ++-- .../publish/validate_mesh_single_uv_set.py | 4 ++-- .../publish/validate_mesh_uv_set_map1.py | 4 ++-- .../validate_mesh_vertices_have_edges.py | 4 ++-- .../plugins/publish/validate_model_content.py | 4 ++-- .../publish/validate_mvlook_contents.py | 4 ++-- .../plugins/publish/validate_no_animation.py | 4 ++-- .../publish/validate_no_default_camera.py | 4 ++-- .../plugins/publish/validate_no_namespace.py | 4 ++-- .../publish/validate_no_null_transforms.py | 4 ++-- .../publish/validate_no_unknown_nodes.py | 4 ++-- .../plugins/publish/validate_no_vraymesh.py | 4 ++-- .../plugins/publish/validate_node_ids.py | 4 ++-- .../validate_node_ids_deformed_shapes.py | 4 ++-- .../publish/validate_node_ids_in_database.py | 4 ++-- .../publish/validate_node_ids_related.py | 4 ++-- .../publish/validate_node_ids_unique.py | 4 ++-- .../publish/validate_node_no_ghosting.py | 4 ++-- .../validate_plugin_path_attributes.py | 4 ++-- .../publish/validate_render_image_rule.py | 4 ++-- .../validate_render_no_default_cameras.py | 4 ++-- .../publish/validate_render_single_camera.py | 4 ++-- .../publish/validate_renderlayer_aovs.py | 4 ++-- .../publish/validate_rendersettings.py | 4 ++-- .../plugins/publish/validate_resolution.py | 4 ++-- .../plugins/publish/validate_resources.py | 4 ++-- .../plugins/publish/validate_review.py | 4 ++-- .../plugins/publish/validate_rig_contents.py | 4 ++-- .../publish/validate_rig_controllers.py | 4 ++-- ...idate_rig_controllers_arnold_attributes.py | 4 ++-- .../publish/validate_rig_joints_hidden.py | 4 ++-- .../publish/validate_rig_out_set_node_ids.py | 4 ++-- .../publish/validate_rig_output_ids.py | 4 ++-- .../publish/validate_scene_set_workspace.py | 4 ++-- .../plugins/publish/validate_setdress_root.py | 4 ++-- .../plugins/publish/validate_shader_name.py | 4 ++-- .../publish/validate_shape_default_names.py | 4 ++-- .../publish/validate_shape_render_stats.py | 4 ++-- .../plugins/publish/validate_shape_zero.py | 4 ++-- .../publish/validate_single_assembly.py | 4 ++-- .../validate_skeletalmesh_hierarchy.py | 4 ++-- .../validate_skeletalmesh_triangulated.py | 4 ++-- .../validate_skeleton_top_group_hierarchy.py | 4 ++-- .../validate_skinCluster_deformer_set.py | 4 ++-- .../plugins/publish/validate_step_size.py | 4 ++-- .../validate_transform_naming_suffix.py | 4 ++-- .../publish/validate_transform_zero.py | 4 ++-- .../plugins/publish/validate_unique_names.py | 4 ++-- .../validate_unreal_mesh_triangulated.py | 4 ++-- .../validate_unreal_staticmesh_naming.py | 4 ++-- .../publish/validate_unreal_up_axis.py | 4 ++-- .../plugins/publish/validate_visible_only.py | 4 ++-- .../plugins/publish/validate_vray.py | 4 ++-- .../validate_vray_distributed_rendering.py | 4 ++-- .../publish/validate_vray_referenced_aovs.py | 4 ++-- .../validate_vray_translator_settings.py | 4 ++-- .../plugins/publish/validate_vrayproxy.py | 4 ++-- .../publish/validate_vrayproxy_members.py | 4 ++-- .../plugins/publish/validate_xgen.py | 4 ++-- .../validate_yeti_renderscript_callbacks.py | 4 ++-- .../publish/validate_yeti_rig_cache_state.py | 4 ++-- .../validate_yeti_rig_input_in_instance.py | 4 ++-- .../publish/validate_yeti_rig_settings.py | 4 ++-- 200 files changed, 417 insertions(+), 409 deletions(-) diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_arnold_standin.py b/server_addon/maya/client/ayon_maya/plugins/load/load_arnold_standin.py index 087a0a488b..d01cea3ad4 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_arnold_standin.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_arnold_standin.py @@ -11,7 +11,8 @@ from ayon_maya.api.lib import ( unique_namespace, ) from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader, get_load_color_for_product_type +from ayon_maya.api.plugin import get_load_color_for_product_type +from ayon_maya.api import plugin def is_sequence(files): @@ -22,7 +23,7 @@ def is_sequence(files): return sequence -class ArnoldStandinLoader(Loader): +class ArnoldStandinLoader(plugin.Loader): """Load as Arnold standin""" product_types = { diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_as_template.py b/server_addon/maya/client/ayon_maya/plugins/load/load_as_template.py index 8ad3e526d1..b6bd3c3ab6 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_as_template.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_as_template.py @@ -1,10 +1,10 @@ from ayon_core.lib import BoolDef from ayon_core.pipeline import registered_host -from ayon_maya.api.plugin import Loader +from ayon_maya.api import plugin from ayon_maya.api.workfile_template_builder import MayaTemplateBuilder -class LoadAsTemplate(Loader): +class LoadAsTemplate(plugin.Loader): """Load workfile as a template """ product_types = {"workfile", "mayaScene"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_assembly.py b/server_addon/maya/client/ayon_maya/plugins/load/load_assembly.py index 8c6edf3aac..490631aa67 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_assembly.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_assembly.py @@ -3,10 +3,10 @@ from ayon_core.pipeline import remove_container from ayon_maya.api import setdress from ayon_maya.api.lib import unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader +from ayon_maya.api import plugin -class AssemblyLoader(Loader): +class AssemblyLoader(plugin.Loader): product_types = {"assembly"} representations = {"json"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_audio.py b/server_addon/maya/client/ayon_maya/plugins/load/load_audio.py index 5ad3993e57..d9f67fdd90 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_audio.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_audio.py @@ -1,11 +1,11 @@ from ayon_core.pipeline import get_representation_path from ayon_maya.api.lib import get_container_members, unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader +from ayon_maya.api import plugin from maya import cmds, mel -class AudioLoader(Loader): +class AudioLoader(plugin.Loader): """Specific loader of audio.""" product_types = {"audio"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_gpucache.py b/server_addon/maya/client/ayon_maya/plugins/load/load_gpucache.py index d40b31e885..795d01fd5a 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_gpucache.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_gpucache.py @@ -3,10 +3,11 @@ from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings from ayon_maya.api.lib import unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader, get_load_color_for_product_type +from ayon_maya.api import plugin +from ayon_maya.api.plugin import get_load_color_for_product_type -class GpuCacheLoader(Loader): +class GpuCacheLoader(plugin.Loader): """Load Alembic as gpuCache""" product_types = {"model", "animation", "proxyAbc", "pointcache"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_image.py b/server_addon/maya/client/ayon_maya/plugins/load/load_image.py index 3a32237729..453e24a2d5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_image.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_image.py @@ -11,7 +11,7 @@ from ayon_core.pipeline.load.utils import get_representation_path_from_context from ayon_core.settings import get_project_settings from ayon_maya.api.lib import namespaced, unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader +from ayon_maya.api import plugin from maya import cmds @@ -81,7 +81,7 @@ def create_stencil(): return file, place, stencil, place_stencil -class FileNodeLoader(Loader): +class FileNodeLoader(plugin.Loader): """File node loader.""" product_types = {"image", "plate", "render"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_image_plane.py b/server_addon/maya/client/ayon_maya/plugins/load/load_image_plane.py index 21625affca..3da67221e2 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_image_plane.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_image_plane.py @@ -6,7 +6,7 @@ from ayon_maya.api.lib import ( unique_namespace, ) from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader +from ayon_maya.api import plugin from maya import cmds from qtpy import QtCore, QtWidgets @@ -80,7 +80,7 @@ class CameraWindow(QtWidgets.QDialog): self.close() -class ImagePlaneLoader(Loader): +class ImagePlaneLoader(plugin.Loader): """Specific loader of plate for image planes on selected camera.""" product_types = {"image", "plate", "render"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_matchmove.py b/server_addon/maya/client/ayon_maya/plugins/load/load_matchmove.py index f4aaca6a4d..7689a3ca5e 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_matchmove.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_matchmove.py @@ -1,8 +1,8 @@ -from ayon_maya.api.plugin import Loader +from ayon_maya.api import plugin from maya import mel -class MatchmoveLoader(Loader): +class MatchmoveLoader(plugin.Loader): """ This will run matchmove script to create track in scene. diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_maya_usd.py b/server_addon/maya/client/ayon_maya/plugins/load/load_maya_usd.py index b3bd2475fd..79fc1fc94f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_maya_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_maya_usd.py @@ -4,10 +4,10 @@ from ayon_core.pipeline import get_representation_path from ayon_core.pipeline.load import get_representation_path_from_context from ayon_maya.api.lib import namespaced, unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader +from ayon_maya.api import plugin -class MayaUsdLoader(Loader): +class MayaUsdLoader(plugin.Loader): """Read USD data in a Maya USD Proxy""" product_types = {"model", "usd", "pointcache", "animation"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd.py b/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd.py index ca347697ab..026740a957 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd.py @@ -4,13 +4,13 @@ import os import maya.cmds as cmds from ayon_api import get_representation_by_id from ayon_core.pipeline import get_representation_path +from ayon_maya.api import plugin from ayon_maya.api.lib import maintained_selection, namespaced, unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader from maya import mel -class MultiverseUsdLoader(Loader): +class MultiverseUsdLoader(plugin.Loader): """Read USD data in a Multiverse Compound""" product_types = { diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd_over.py b/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd_over.py index bdcb771109..a8fff12577 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd_over.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_multiverse_usd_over.py @@ -5,13 +5,13 @@ import maya.cmds as cmds import qargparse from ayon_api import get_representation_by_id from ayon_core.pipeline import get_representation_path +from ayon_maya.api import plugin from ayon_maya.api.lib import maintained_selection from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader from maya import mel -class MultiverseUsdOverLoader(Loader): +class MultiverseUsdOverLoader(plugin.Loader): """Reference file""" product_types = {"mvUsdOverride"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_redshift_proxy.py b/server_addon/maya/client/ayon_maya/plugins/load/load_redshift_proxy.py index 996d77856d..92bf6dfe26 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_redshift_proxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_redshift_proxy.py @@ -6,12 +6,13 @@ import clique import maya.cmds as cmds from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings +from ayon_maya.api import plugin from ayon_maya.api.lib import maintained_selection, namespaced, unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader, get_load_color_for_product_type +from ayon_maya.api.plugin import get_load_color_for_product_type -class RedshiftProxyLoader(Loader): +class RedshiftProxyLoader(plugin.Loader): """Load Redshift proxy""" product_types = {"redshiftproxy"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_rendersetup.py b/server_addon/maya/client/ayon_maya/plugins/load/load_rendersetup.py index 09fda5d2f4..3b323698c4 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_rendersetup.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_rendersetup.py @@ -15,8 +15,8 @@ import six from ayon_core.lib import BoolDef, EnumDef from ayon_core.pipeline import get_representation_path from ayon_maya.api import lib +from ayon_maya.api import plugin from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader from maya import cmds @@ -45,7 +45,7 @@ def mark_all_imported(enabled): cmds.deleteAttr(plug) -class RenderSetupLoader(Loader): +class RenderSetupLoader(plugin.Loader): """Load json preset for RenderSetup overwriting current one.""" product_types = {"rendersetup"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_arnold.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_arnold.py index 832562971f..4515ec499d 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_arnold.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_arnold.py @@ -8,10 +8,11 @@ import os from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings -from ayon_maya.api.plugin import Loader, get_load_color_for_product_type +from ayon_maya.api import plugin +from ayon_maya.api.plugin import get_load_color_for_product_type -class LoadVDBtoArnold(Loader): +class LoadVDBtoArnold(plugin.Loader): """Load OpenVDB for Arnold in aiVolume""" product_types = {"vdbcache"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_redshift.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_redshift.py index 1ea82cbf28..c08004421b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_redshift.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_redshift.py @@ -2,10 +2,11 @@ import os from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings -from ayon_maya.api.plugin import Loader, get_load_color_for_product_type +from ayon_maya.api import plugin +from ayon_maya.api.plugin import get_load_color_for_product_type -class LoadVDBtoRedShift(Loader): +class LoadVDBtoRedShift(plugin.Loader): """Load OpenVDB in a Redshift Volume Shape Note that the RedshiftVolumeShape is created without a RedshiftVolume diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_vray.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_vray.py index fefbea0e88..f022f8be5e 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_vray.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vdb_to_vray.py @@ -2,7 +2,8 @@ import os from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings -from ayon_maya.api.plugin import Loader, get_load_color_for_product_type +from ayon_maya.api import plugin +from ayon_maya.api.plugin import get_load_color_for_product_type from maya import cmds # List of 3rd Party Channels Mapping names for VRayVolumeGrid @@ -70,7 +71,7 @@ def _fix_duplicate_vvg_callbacks(): matched.add(callback) -class LoadVDBtoVRay(Loader): +class LoadVDBtoVRay(plugin.Loader): """Load OpenVDB in a V-Ray Volume Grid""" product_types = {"vdbcache"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vrayproxy.py index 53995f877b..c71a48247c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_vrayproxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vrayproxy.py @@ -13,10 +13,11 @@ from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings from ayon_maya.api.lib import maintained_selection, namespaced, unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader, get_load_color_for_product_type +from ayon_maya.api import plugin +from ayon_maya.api.plugin import get_load_color_for_product_type -class VRayProxyLoader(Loader): +class VRayProxyLoader(plugin.Loader): """Load VRay Proxy with Alembic or VrayMesh.""" product_types = {"vrayproxy", "model", "pointcache", "animation"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_vrayscene.py b/server_addon/maya/client/ayon_maya/plugins/load/load_vrayscene.py index acea6cdd63..255ca844ba 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_vrayscene.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_vrayscene.py @@ -4,10 +4,11 @@ from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings from ayon_maya.api.lib import maintained_selection, namespaced, unique_namespace from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader, get_load_color_for_product_type +from ayon_maya.api import plugin +from ayon_maya.api.plugin import get_load_color_for_product_type -class VRaySceneLoader(Loader): +class VRaySceneLoader(plugin.Loader): """Load Vray scene""" product_types = {"vrayscene_layer"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_xgen.py b/server_addon/maya/client/ayon_maya/plugins/load/load_xgen.py index 6f053cd1e6..88d9d550da 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_xgen.py @@ -1,7 +1,7 @@ import os import shutil -import ayon_maya.api.plugin +from ayon_maya.api import plugin import maya.cmds as cmds import xgenm from ayon_core.pipeline import get_representation_path @@ -15,7 +15,7 @@ from ayon_maya.api.lib import ( from qtpy import QtWidgets -class XgenLoader(ayon_maya.api.plugin.ReferenceLoader): +class XgenLoader(plugin.ReferenceLoader): """Load Xgen as reference""" product_types = {"xgen"} diff --git a/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_cache.py b/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_cache.py index b2b5c7c710..6000de2507 100644 --- a/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_cache.py +++ b/server_addon/maya/client/ayon_maya/plugins/load/load_yeti_cache.py @@ -8,7 +8,8 @@ from ayon_core.pipeline import get_representation_path from ayon_core.settings import get_project_settings from ayon_maya.api import lib from ayon_maya.api.pipeline import containerise -from ayon_maya.api.plugin import Loader, get_load_color_for_product_type +from ayon_maya.api import plugin +from ayon_maya.api.plugin import get_load_color_for_product_type from ayon_maya.api.yeti import create_yeti_variable from maya import cmds @@ -40,7 +41,7 @@ def set_attribute(node, attr, value): lib.set_attribute(node, attr, value) -class YetiCacheLoader(Loader): +class YetiCacheLoader(plugin.Loader): """Load Yeti Cache with one or more Yeti nodes""" product_types = {"yeticache", "yetiRig"} diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_animation.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_animation.py index 7996602c37..528d981c4b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_animation.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_animation.py @@ -1,9 +1,9 @@ import maya.cmds as cmds import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class CollectAnimationOutputGeometry(MayaInstancePlugin): +class CollectAnimationOutputGeometry(plugin.MayaInstancePlugin): """Collect out hierarchy data for instance. Collect all hierarchy nodes which reside in the out_SET of the animation diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_arnold_scene_source.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_arnold_scene_source.py index 55f332e4b9..c9dd0b8063 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_arnold_scene_source.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_arnold_scene_source.py @@ -1,10 +1,10 @@ import pyblish.api from ayon_maya.api.lib import get_all_children -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class CollectArnoldSceneSource(MayaInstancePlugin): +class CollectArnoldSceneSource(plugin.MayaInstancePlugin): """Collect Arnold Scene Source data.""" # Offset to be after renderable camera collection. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_assembly.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_assembly.py index 57b3443dd3..e57d70662c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_assembly.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_assembly.py @@ -11,10 +11,10 @@ import pyblish.api from maya import cmds, mel from ayon_maya import api from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class CollectAssembly(MayaInstancePlugin): +class CollectAssembly(plugin.MayaInstancePlugin): """Collect all relevant assembly items Collected data: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_current_file.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_current_file.py index 27c9dc130e..8bd1908c73 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_current_file.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_current_file.py @@ -1,9 +1,9 @@ import pyblish.api -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin from maya import cmds -class CollectCurrentFile(MayaContextPlugin): +class CollectCurrentFile(plugin.MayaContextPlugin): """Inject the current working file.""" order = pyblish.api.CollectorOrder - 0.4 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_animation.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_animation.py index 687b93211b..83f42667a5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_animation.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_animation.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- import pyblish.api from ayon_core.pipeline import OptionalPyblishPluginMixin -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds # noqa -class CollectFbxAnimation(MayaInstancePlugin, +class CollectFbxAnimation(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Collect Animated Rig Data for FBX Extractor.""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_camera.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_camera.py index eabc1237a3..f6791b6e72 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_camera.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_fbx_camera.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds # noqa -class CollectFbxCamera(MayaInstancePlugin): +class CollectFbxCamera(plugin.MayaInstancePlugin): """Collect Camera for FBX export.""" order = pyblish.api.CollectorOrder + 0.2 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_file_dependencies.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_file_dependencies.py index ca4c617fa9..74b8054c33 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_file_dependencies.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_file_dependencies.py @@ -1,9 +1,9 @@ from maya import cmds -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin import pyblish.api -class CollectFileDependencies(MayaContextPlugin): +class CollectFileDependencies(plugin.MayaContextPlugin): """Gather all files referenced in this scene.""" label = "Collect File Dependencies" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_gltf.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_gltf.py index c34505597c..7ee23d289c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_gltf.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_gltf.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class CollectGLTF(MayaInstancePlugin): +class CollectGLTF(plugin.MayaInstancePlugin): """Collect Assets for GLTF/GLB export.""" order = pyblish.api.CollectorOrder + 0.2 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_history.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_history.py index b649628a36..9041d4d1d5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_history.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_history.py @@ -1,9 +1,9 @@ import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class CollectMayaHistory(MayaInstancePlugin): +class CollectMayaHistory(plugin.MayaInstancePlugin): """Collect history for instances from the Maya scene Note: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_inputs.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_inputs.py index bebd765c1b..67d4a3f378 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_inputs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_inputs.py @@ -7,7 +7,7 @@ import pyblish.api from ayon_core.pipeline import registered_host from ayon_maya.api.lib import get_container_members from ayon_maya.api.lib_rendersetup import get_shader_in_layer -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin def iter_history(nodes, @@ -94,7 +94,7 @@ def collect_input_containers(containers, nodes): if any(node in container["_members"] for node in nodes)] -class CollectUpstreamInputs(MayaInstancePlugin): +class CollectUpstreamInputs(plugin.MayaInstancePlugin): """Collect input source inputs for this publish. This will include `inputs` data of which loaded publishes were used in the diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_instances.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_instances.py index 89b490febc..0ca43d4be9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_instances.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_instances.py @@ -2,10 +2,10 @@ from maya import cmds import pyblish.api from ayon_maya.api.lib import get_all_children -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class CollectNewInstances(MayaInstancePlugin): +class CollectNewInstances(plugin.MayaInstancePlugin): """Gather members for instances and pre-defined attribute This collector takes into account assets that are associated with diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_look.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_look.py index 27fb409777..691933babd 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_look.py @@ -6,7 +6,7 @@ import re import pyblish.api from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds # noqa SHAPE_ATTRS = {"castsShadows", @@ -266,7 +266,7 @@ def get_file_node_files(node): return result -class CollectLook(MayaInstancePlugin): +class CollectLook(plugin.MayaInstancePlugin): """Collect look data for instance. For the shapes/transforms of the referenced object to collect look for diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_scene_time.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_scene_time.py index b6a15a637f..c10d0fffbe 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_scene_time.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_scene_time.py @@ -1,9 +1,9 @@ import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class CollectMayaSceneTime(MayaInstancePlugin): +class CollectMayaSceneTime(plugin.MayaInstancePlugin): """Collect Maya Scene playback range This allows to reproduce the playback range for the content to be loaded. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_units.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_units.py index 2224037b1f..47888506ff 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_units.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_units.py @@ -1,12 +1,12 @@ import maya.cmds as cmds import maya.mel as mel -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin import pyblish.api -class CollectMayaUnits(MayaContextPlugin): +class CollectMayaUnits(plugin.MayaContextPlugin): """Collect Maya's scene units.""" label = "Maya Units" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_workspace.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_workspace.py index bdcd232348..a7b51e1fb3 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_workspace.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_maya_workspace.py @@ -1,11 +1,11 @@ import os import pyblish.api -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin from maya import cmds -class CollectMayaWorkspace(MayaContextPlugin): +class CollectMayaWorkspace(plugin.MayaContextPlugin): """Inject the current workspace into context""" order = pyblish.api.CollectorOrder - 0.5 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_model.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_model.py index c239f1c118..13e5a609e7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_model.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_model.py @@ -1,9 +1,9 @@ import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class CollectModelData(MayaInstancePlugin): +class CollectModelData(plugin.MayaInstancePlugin): """Collect model data Ensures always only a single frame is extracted (current frame). diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_multiverse_look.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_multiverse_look.py index fff35d32f5..ddf36b7eda 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_multiverse_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_multiverse_look.py @@ -4,7 +4,7 @@ import re import pyblish.api from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds SHAPE_ATTRS = ["castsShadows", @@ -252,7 +252,7 @@ def is_mipmap(fname): return False -class CollectMultiverseLookData(MayaInstancePlugin): +class CollectMultiverseLookData(plugin.MayaInstancePlugin): """Collect Multiverse Look Searches through the overrides finding all material overrides. From there diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_pointcache.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_pointcache.py index 0c3cccc8ec..8d0b45137f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_pointcache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_pointcache.py @@ -1,9 +1,9 @@ import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class CollectPointcache(MayaInstancePlugin): +class CollectPointcache(plugin.MayaInstancePlugin): """Collect pointcache data for instance.""" order = pyblish.api.CollectorOrder + 0.4 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_remove_marked.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_remove_marked.py index 97c5dc67d4..14d914cac5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_remove_marked.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_remove_marked.py @@ -1,8 +1,8 @@ import pyblish.api -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin -class CollectRemoveMarked(MayaContextPlugin): +class CollectRemoveMarked(plugin.MayaContextPlugin): """Remove marked data Remove instances that have 'remove' in their instance.data diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_render.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_render.py index 143d1c08e2..160a019540 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_render.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_render.py @@ -44,11 +44,11 @@ from ayon_maya.api.lib_renderproducts import ( UnsupportedRendererException, get as get_layer_render_products, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class CollectMayaRender(MayaInstancePlugin): +class CollectMayaRender(plugin.MayaInstancePlugin): """Gather all publishable render layers from renderSetup.""" order = pyblish.api.CollectorOrder + 0.01 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_render_layer_aovs.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_render_layer_aovs.py index 7e1d531541..dd4a8fefe5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_render_layer_aovs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_render_layer_aovs.py @@ -1,10 +1,10 @@ import pyblish.api from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class CollectRenderLayerAOVS(MayaInstancePlugin): +class CollectRenderLayerAOVS(plugin.MayaInstancePlugin): """Collect all render layer's AOVs / Render Elements that will render. This collector is important to be able to Extend Frames. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_renderable_camera.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_renderable_camera.py index 4ac16eb714..fbd181de3e 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_renderable_camera.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_renderable_camera.py @@ -1,10 +1,10 @@ import pyblish.api from ayon_maya.api.lib_rendersetup import get_attr_in_layer -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class CollectRenderableCamera(MayaInstancePlugin): +class CollectRenderableCamera(plugin.MayaInstancePlugin): """Collect the renderable camera(s) for the render layer""" # Offset to be after renderlayer collection. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_review.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_review.py index 90620771e1..8a50c2f0a9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_review.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_review.py @@ -2,11 +2,11 @@ import ayon_api import pyblish.api from ayon_core.pipeline import KnownPublishError from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds, mel -class CollectReview(MayaInstancePlugin): +class CollectReview(plugin.MayaInstancePlugin): """Collect Review data """ diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_rig_sets.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_rig_sets.py index dfa4fc2d9a..98f4d38ab2 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_rig_sets.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_rig_sets.py @@ -1,9 +1,9 @@ import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class CollectRigSets(MayaInstancePlugin): +class CollectRigSets(plugin.MayaInstancePlugin): """Ensure rig contains pipeline-critical content Every rig must contain at least two object sets: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_skeleton_mesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_skeleton_mesh.py index a8783018c9..aaec4cb6d9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_skeleton_mesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_skeleton_mesh.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds # noqa -class CollectSkeletonMesh(MayaInstancePlugin): +class CollectSkeletonMesh(plugin.MayaInstancePlugin): """Collect Static Rig Data for FBX Extractor.""" order = pyblish.api.CollectorOrder + 0.2 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_skeletalmesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_skeletalmesh.py index a7900a2085..32515a5957 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_skeletalmesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_skeletalmesh.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- from maya import cmds # noqa import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class CollectUnrealSkeletalMesh(MayaInstancePlugin): +class CollectUnrealSkeletalMesh(plugin.MayaInstancePlugin): """Collect Unreal Skeletal Mesh.""" order = pyblish.api.CollectorOrder + 0.2 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_staticmesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_staticmesh.py index 762c7daa4a..35295d6e3b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_staticmesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_unreal_staticmesh.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- from maya import cmds # noqa import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from pprint import pformat -class CollectUnrealStaticMesh(MayaInstancePlugin): +class CollectUnrealStaticMesh(plugin.MayaInstancePlugin): """Collect Unreal Static Mesh.""" order = pyblish.api.CollectorOrder + 0.2 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_user_defined_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_user_defined_attributes.py index b7ef70c874..e468636def 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_user_defined_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_user_defined_attributes.py @@ -1,9 +1,9 @@ from maya import cmds -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin import pyblish.api -class CollectUserDefinedAttributes(MayaInstancePlugin): +class CollectUserDefinedAttributes(plugin.MayaInstancePlugin): """Collect user defined attributes for nodes in instance.""" order = pyblish.api.CollectorOrder + 0.45 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayproxy.py index 8710858150..a5491e5f9b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayproxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayproxy.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- """Collect Vray Proxy.""" import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class CollectVrayProxy(MayaInstancePlugin): +class CollectVrayProxy(plugin.MayaInstancePlugin): """Collect Vray Proxy instance. Add `pointcache` family for it. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayscene.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayscene.py index 86538450b7..f14735574e 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayscene.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_vrayscene.py @@ -4,10 +4,10 @@ import pyblish.api from ayon_core.lib import get_formatted_current_time from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class CollectVrayScene(MayaInstancePlugin): +class CollectVrayScene(plugin.MayaInstancePlugin): """Collect Vray Scene. If export on farm is checked, job is created to export it. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_workfile.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_workfile.py index d7cea61a2c..fa0689849a 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_workfile.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_workfile.py @@ -1,9 +1,9 @@ import os import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class CollectWorkfileData(MayaInstancePlugin): +class CollectWorkfileData(plugin.MayaInstancePlugin): """Inject data into Workfile instance""" order = pyblish.api.CollectorOrder - 0.01 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_workscene_fps.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_workscene_fps.py index 5c1b021799..a87483e67f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_workscene_fps.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_workscene_fps.py @@ -1,9 +1,9 @@ import pyblish.api -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin from maya import mel -class CollectWorksceneFPS(MayaContextPlugin): +class CollectWorksceneFPS(plugin.MayaContextPlugin): """Get the FPS of the work scene""" label = "Workscene FPS" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_xgen.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_xgen.py index 784c0a4b83..9ef17f3399 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_xgen.py @@ -2,11 +2,11 @@ import os import pyblish.api from ayon_maya.api.lib import get_attribute_input -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class CollectXgen(MayaInstancePlugin): +class CollectXgen(plugin.MayaInstancePlugin): """Collect Xgen""" order = pyblish.api.CollectorOrder + 0.499999 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_cache.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_cache.py index 10883074d3..44de461126 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_cache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_cache.py @@ -1,6 +1,6 @@ import pyblish.api from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from ayon_maya.api.yeti import get_yeti_user_variables from maya import cmds @@ -22,7 +22,7 @@ SETTINGS = { } -class CollectYetiCache(MayaInstancePlugin): +class CollectYetiCache(plugin.MayaInstancePlugin): """Collect all information of the Yeti caches The information contains the following attributes per Yeti node diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_rig.py b/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_rig.py index 25bc5ec172..dbdc10789f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/collect_yeti_rig.py @@ -4,7 +4,7 @@ import re import pyblish.api from ayon_core.pipeline.publish import KnownPublishError from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds SETTINGS = {"renderDensity", @@ -15,7 +15,7 @@ SETTINGS = {"renderDensity", "cbId"} -class CollectYetiRig(MayaInstancePlugin): +class CollectYetiRig(plugin.MayaInstancePlugin): """Collect all information of the Yeti Rig""" order = pyblish.api.CollectorOrder + 0.4 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/determine_future_version.py b/server_addon/maya/client/ayon_maya/plugins/publish/determine_future_version.py index a09489d4ae..0c05b499c0 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/determine_future_version.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/determine_future_version.py @@ -1,8 +1,8 @@ import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class DetermineFutureVersion(MayaInstancePlugin): +class DetermineFutureVersion(plugin.MayaInstancePlugin): """ This will determine version of product if we want render to be attached to. """ diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_active_view_thumbnail.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_active_view_thumbnail.py index 221da82d36..290f7e24eb 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_active_view_thumbnail.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_active_view_thumbnail.py @@ -4,10 +4,10 @@ import maya.api.OpenMaya as om import maya.api.OpenMayaUI as omui import pyblish.api from ayon_maya.api.lib import IS_HEADLESS -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ExtractActiveViewThumbnail(MayaInstancePlugin): +class ExtractActiveViewThumbnail(plugin.MayaInstancePlugin): """Set instance thumbnail to a screengrab of current active viewport. This makes it so that if an instance does not have a thumbnail set yet that diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_arnold_scene_source.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_arnold_scene_source.py index fb79094aec..b39c875400 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_arnold_scene_source.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_arnold_scene_source.py @@ -3,12 +3,11 @@ import os from collections import defaultdict import arnold -from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import lib, plugin from maya import cmds -class ExtractArnoldSceneSource(MayaExtractorPlugin): +class ExtractArnoldSceneSource(plugin.MayaExtractorPlugin): """Extract the content of the instance to an Arnold Scene Source file.""" label = "Extract Arnold Scene Source" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_assembly.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_assembly.py index ecbf21dfb9..8460fb716f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_assembly.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_assembly.py @@ -2,11 +2,11 @@ import json import os from ayon_maya.api.alembic import extract_alembic -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractAssembly(MayaExtractorPlugin): +class ExtractAssembly(plugin.MayaExtractorPlugin): """Produce an alembic of just point positions and normals. Positions and normals are preserved, but nothing more, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_alembic.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_alembic.py index 2c38110913..b5ce6a6a44 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_alembic.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_alembic.py @@ -2,12 +2,12 @@ import os import json from maya import cmds -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from ayon_core.pipeline import publish from ayon_maya.api import lib -class ExtractCameraAlembic(MayaExtractorPlugin, +class ExtractCameraAlembic(plugin.MayaExtractorPlugin, publish.OptionalPyblishPluginMixin): """Extract a Camera as Alembic. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_mayaScene.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_mayaScene.py index 5f6260c794..c5aa331cb2 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_mayaScene.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_camera_mayaScene.py @@ -7,7 +7,7 @@ import os from ayon_core.lib import BoolDef from ayon_core.pipeline import publish from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds @@ -80,7 +80,7 @@ def unlock(plug): cmds.disconnectAttr(source, destination) -class ExtractCameraMayaScene(MayaExtractorPlugin, +class ExtractCameraMayaScene(plugin.MayaExtractorPlugin, publish.OptionalPyblishPluginMixin): """Extract a Camera as Maya Scene. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx.py index cd1fe1f7e8..d9b0a789c5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx.py @@ -5,11 +5,11 @@ import maya.mel as mel # noqa import pyblish.api from ayon_maya.api import fbx from ayon_maya.api.lib import maintained_selection -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds # noqa -class ExtractFBX(MayaExtractorPlugin): +class ExtractFBX(plugin.MayaExtractorPlugin): """Extract FBX from Maya. This extracts reproducible FBX exports ignoring any of the diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx_animation.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx_animation.py index 186486c153..c22241d2ca 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx_animation.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_fbx_animation.py @@ -4,11 +4,11 @@ import os import pyblish.api from ayon_maya.api import fbx from ayon_maya.api.lib import get_namespace, namespaced, strip_namespace -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds # noqa -class ExtractFBXAnimation(MayaExtractorPlugin): +class ExtractFBXAnimation(plugin.MayaExtractorPlugin): """Extract Rig in FBX format from Maya. This extracts the rig in fbx with the constraints diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_gltf.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_gltf.py index 450764a9f1..46da8f9463 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_gltf.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_gltf.py @@ -3,11 +3,11 @@ import os import pyblish.api from ayon_maya.api import lib from ayon_maya.api.gltf import extract_gltf -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds, mel -class ExtractGLB(MayaExtractorPlugin): +class ExtractGLB(plugin.MayaExtractorPlugin): order = pyblish.api.ExtractorOrder label = "Extract GLB" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_gpu_cache.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_gpu_cache.py index 2d177bda96..53944571a8 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_gpu_cache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_gpu_cache.py @@ -1,11 +1,11 @@ import json from ayon_core.pipeline import publish -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractGPUCache(MayaExtractorPlugin, +class ExtractGPUCache(plugin.MayaExtractorPlugin, publish.OptionalPyblishPluginMixin): """Extract the content of the instance to a GPU cache file.""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_import_reference.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_import_reference.py index 6c76e8173c..b5964e426b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_import_reference.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_import_reference.py @@ -6,11 +6,11 @@ import pyblish.api from ayon_core.lib import run_subprocess from ayon_core.pipeline.publish import OptionalPyblishPluginMixin from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractImportReference(MayaExtractorPlugin, +class ExtractImportReference(plugin.MayaExtractorPlugin, OptionalPyblishPluginMixin): """ diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_layout.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_layout.py index 5f398e2fd5..ca53f563d4 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_layout.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_layout.py @@ -3,12 +3,12 @@ import math import os from ayon_api import get_representation_by_id -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds from maya.api import OpenMaya as om -class ExtractLayout(MayaExtractorPlugin): +class ExtractLayout(plugin.MayaExtractorPlugin): """Extract a layout.""" label = "Extract Layout" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_look.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_look.py index ec27e762b5..8e57b22d64 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_look.py @@ -22,7 +22,7 @@ from ayon_core.lib import ( ) from ayon_core.pipeline import KnownPublishError from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds # noqa # Modes for transfer @@ -405,7 +405,7 @@ class MakeTX(TextureProcessor): return False -class ExtractLook(MayaExtractorPlugin): +class ExtractLook(plugin.MayaExtractorPlugin): """Extract Look (Maya Scene + JSON) Only extracts the sets (shadingEngines and alike) alongside a .json file diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_scene_raw.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_scene_raw.py index 473a26ce8f..6e66353c7a 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_scene_raw.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_scene_raw.py @@ -6,11 +6,11 @@ from ayon_core.lib import BoolDef from ayon_core.pipeline import AVALON_CONTAINER_ID, AYON_CONTAINER_ID from ayon_core.pipeline.publish import AYONPyblishPluginMixin from ayon_maya.api.lib import maintained_selection -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractMayaSceneRaw(MayaExtractorPlugin, AYONPyblishPluginMixin): +class ExtractMayaSceneRaw(plugin.MayaExtractorPlugin, AYONPyblishPluginMixin): """Extract as Maya Scene (raw). This will preserve all references, construction history, etc. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_usd.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_usd.py index 4ae0445055..d2bf98afbc 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_maya_usd.py @@ -5,7 +5,7 @@ import os import pyblish.api import six from ayon_maya.api.lib import maintained_selection -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds @@ -111,7 +111,7 @@ def usd_export_attributes(nodes, attrs=None, attr_prefixes=None, mapping=None): dg_mod.undoIt() -class ExtractMayaUsd(MayaExtractorPlugin): +class ExtractMayaUsd(plugin.MayaExtractorPlugin): """Extractor for Maya USD Asset data. Upon publish a .usd (or .usdz) asset file will typically be written. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_model.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_model.py index 950e09fb29..7f257a2013 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_model.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_model.py @@ -4,11 +4,11 @@ import os from ayon_core.pipeline import publish from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractModel(MayaExtractorPlugin, +class ExtractModel(plugin.MayaExtractorPlugin, publish.OptionalPyblishPluginMixin): """Extract as Model (Maya Scene). diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_look.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_look.py index f951f255b9..b6f8043a93 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_look.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_look.py @@ -3,10 +3,10 @@ import os from maya import cmds from ayon_maya.api.lib import maintained_selection -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin -class ExtractMultiverseLook(MayaExtractorPlugin): +class ExtractMultiverseLook(plugin.MayaExtractorPlugin): """Extractor for Multiverse USD look data. This will extract: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd.py index 3f86f23ee3..477af9dc26 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd.py @@ -3,11 +3,11 @@ import os import pyblish.api import six from ayon_maya.api.lib import maintained_selection -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds, mel -class ExtractMultiverseUsd(MayaExtractorPlugin): +class ExtractMultiverseUsd(plugin.MayaExtractorPlugin): """Extractor for Multiverse USD Asset data. This will extract settings for a Multiverse Write Asset operation: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_comp.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_comp.py index 648b5b3cc7..3d18bb80e1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_comp.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_comp.py @@ -1,11 +1,11 @@ import os from ayon_maya.api.lib import maintained_selection -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractMultiverseUsdComposition(MayaExtractorPlugin): +class ExtractMultiverseUsdComposition(plugin.MayaExtractorPlugin): """Extractor of Multiverse USD Composition data. This will extract settings for a Multiverse Write Composition operation: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_over.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_over.py index b7469d3627..a67f5c0a99 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_over.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_multiverse_usd_over.py @@ -1,11 +1,11 @@ import os from ayon_maya.api.lib import maintained_selection -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractMultiverseUsdOverride(MayaExtractorPlugin): +class ExtractMultiverseUsdOverride(plugin.MayaExtractorPlugin): """Extractor for Multiverse USD Override data. This will extract settings for a Multiverse Write Override operation: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_obj.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_obj.py index 1daf37afde..baf86b581e 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_obj.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_obj.py @@ -3,11 +3,11 @@ import os import pyblish.api from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractObj(MayaExtractorPlugin): +class ExtractObj(plugin.MayaExtractorPlugin): """Extract OBJ from Maya. This extracts reproducible OBJ exports ignoring any of the settings diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_playblast.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_playblast.py index f4388827a5..539246eef0 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_playblast.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_playblast.py @@ -2,11 +2,11 @@ import os import clique from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractPlayblast(MayaExtractorPlugin): +class ExtractPlayblast(plugin.MayaExtractorPlugin): """Extract viewport playblast. Takes review camera and creates review Quicktime video based on viewport diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_pointcache.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_pointcache.py index cdbcb7c9f1..d3e9d89aaf 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_pointcache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_pointcache.py @@ -18,11 +18,11 @@ from ayon_maya.api.lib import ( maintained_selection, suspended_refresh, ) -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractAlembic(MayaExtractorPlugin, AYONPyblishPluginMixin): +class ExtractAlembic(plugin.MayaExtractorPlugin, AYONPyblishPluginMixin): """Produce an alembic of just point positions and normals. Positions and normals, uvs, creases are preserved, but nothing more, diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_proxy_abc.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_proxy_abc.py index fb17768eb2..fc1c7981ed 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_proxy_abc.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_proxy_abc.py @@ -6,11 +6,11 @@ from ayon_maya.api.lib import ( maintained_selection, suspended_refresh, ) -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractProxyAlembic(MayaExtractorPlugin): +class ExtractProxyAlembic(plugin.MayaExtractorPlugin): """Produce an alembic for bounding box geometry """ diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_redshift_proxy.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_redshift_proxy.py index 18b0282e83..909d3dd172 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_redshift_proxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_redshift_proxy.py @@ -3,14 +3,14 @@ import os from ayon_maya.api.lib import maintained_selection, renderlayer -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from ayon_maya.api.render_setup_tools import ( allow_export_from_render_setup_layer, ) from maya import cmds -class ExtractRedshiftProxy(MayaExtractorPlugin): +class ExtractRedshiftProxy(plugin.MayaExtractorPlugin): """Extract the content of the instance to a redshift proxy file.""" label = "Redshift Proxy (.rs)" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_rendersetup.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_rendersetup.py index c8043e435e..8dcdd603b7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_rendersetup.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_rendersetup.py @@ -2,10 +2,10 @@ import json import os import maya.app.renderSetup.model.renderSetup as renderSetup -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin -class ExtractRenderSetup(MayaExtractorPlugin): +class ExtractRenderSetup(plugin.MayaExtractorPlugin): """ Produce renderSetup template file diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_rig.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_rig.py index 7568ee9b5b..3f96d7123d 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_rig.py @@ -3,11 +3,11 @@ import os from ayon_maya.api.lib import maintained_selection -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractRig(MayaExtractorPlugin): +class ExtractRig(plugin.MayaExtractorPlugin): """Extract rig as Maya Scene.""" label = "Extract Rig (Maya Scene)" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_skeleton_mesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_skeleton_mesh.py index 549327d8a2..e496d53d42 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_skeleton_mesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_skeleton_mesh.py @@ -6,10 +6,10 @@ import pyblish.api from ayon_core.pipeline.publish import OptionalPyblishPluginMixin from ayon_maya.api import fbx -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin -class ExtractSkeletonMesh(MayaExtractorPlugin, +class ExtractSkeletonMesh(plugin.MayaExtractorPlugin, OptionalPyblishPluginMixin): """Extract Rig in FBX format from Maya. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_thumbnail.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_thumbnail.py index d2ecf7f158..c2ffedd67c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_thumbnail.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_thumbnail.py @@ -3,10 +3,10 @@ import os import tempfile from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin -class ExtractThumbnail(MayaExtractorPlugin): +class ExtractThumbnail(plugin.MayaExtractorPlugin): """Extract viewport thumbnail. Takes review camera and creates a thumbnail based on viewport diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_abc.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_abc.py index 66ea4b1b6c..a5d9303052 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_abc.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_abc.py @@ -4,11 +4,11 @@ import os from ayon_maya.api.alembic import extract_alembic from ayon_maya.api.lib import maintained_selection, suspended_refresh -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds # noqa -class ExtractUnrealSkeletalMeshAbc(MayaExtractorPlugin): +class ExtractUnrealSkeletalMeshAbc(plugin.MayaExtractorPlugin): """Extract Unreal Skeletal Mesh as FBX from Maya. """ label = "Extract Unreal Skeletal Mesh - Alembic" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py index 81135bbb92..36324d3511 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_skeletalmesh_fbx.py @@ -5,7 +5,7 @@ from contextlib import contextmanager import pyblish.api from ayon_maya.api import fbx -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds # noqa @@ -19,7 +19,7 @@ def renamed(original_name, renamed_name): cmds.rename(renamed_name, original_name) -class ExtractUnrealSkeletalMeshFbx(MayaExtractorPlugin): +class ExtractUnrealSkeletalMeshFbx(plugin.MayaExtractorPlugin): """Extract Unreal Skeletal Mesh as FBX from Maya. """ order = pyblish.api.ExtractorOrder - 0.1 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_staticmesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_staticmesh.py index b4ee55b9e1..215f82b338 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_staticmesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_staticmesh.py @@ -5,11 +5,11 @@ import os import pyblish.api from ayon_maya.api import fbx from ayon_maya.api.lib import maintained_selection, parent_nodes -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds # noqa -class ExtractUnrealStaticMesh(MayaExtractorPlugin): +class ExtractUnrealStaticMesh(plugin.MayaExtractorPlugin): """Extract Unreal Static Mesh as FBX from Maya. """ order = pyblish.api.ExtractorOrder - 0.1 diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_yeticache.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_yeticache.py index fb90e9ee2b..79f47fbe9b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_yeticache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_unreal_yeticache.py @@ -1,10 +1,10 @@ import os -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractUnrealYetiCache(MayaExtractorPlugin): +class ExtractUnrealYetiCache(plugin.MayaExtractorPlugin): """Producing Yeti cache files using scene time range. This will extract Yeti cache file sequence and fur settings. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayproxy.py index 04b037ef03..d6f1fd6698 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayproxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayproxy.py @@ -1,11 +1,11 @@ import os from ayon_maya.api.lib import maintained_selection -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractVRayProxy(MayaExtractorPlugin): +class ExtractVRayProxy(plugin.MayaExtractorPlugin): """Extract the content of the instance to a vrmesh file Things to pay attention to: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayscene.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayscene.py index 00c3f2b158..785cb4c37c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayscene.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_vrayscene.py @@ -4,12 +4,12 @@ import os import re from ayon_maya.api.lib import maintained_selection -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from ayon_maya.api.render_setup_tools import export_in_rs_layer from maya import cmds -class ExtractVrayscene(MayaExtractorPlugin): +class ExtractVrayscene(plugin.MayaExtractorPlugin): """Extractor for vrscene.""" label = "VRay Scene (.vrscene)" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_workfile_xgen.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_workfile_xgen.py index c93da91207..e6df19c7f1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_workfile_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_workfile_xgen.py @@ -4,11 +4,11 @@ import shutil import pyblish.api from ayon_maya.api.alembic import extract_alembic -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractWorkfileXgen(MayaExtractorPlugin): +class ExtractWorkfileXgen(plugin.MayaExtractorPlugin): """Extract Workfile Xgen. When submitting a render, we need to prep Xgen side car files. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_xgen.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_xgen.py index 47a8140ef6..bb700bbdec 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_xgen.py @@ -9,11 +9,11 @@ from ayon_maya.api.lib import ( maintained_selection, write_xgen_file, ) -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractXgen(MayaExtractorPlugin): +class ExtractXgen(plugin.MayaExtractorPlugin): """Extract Xgen Workflow: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_cache.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_cache.py index e3e9a76d72..b84867316c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_cache.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_cache.py @@ -1,11 +1,11 @@ import json import os -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds -class ExtractYetiCache(MayaExtractorPlugin): +class ExtractYetiCache(plugin.MayaExtractorPlugin): """Producing Yeti cache files using scene time range. This will extract Yeti cache file sequence and fur settings. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_rig.py b/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_rig.py index 0c21118b22..640b37b667 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_rig.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/extract_yeti_rig.py @@ -6,7 +6,7 @@ import json import os from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaExtractorPlugin +from ayon_maya.api import plugin from maya import cmds @@ -89,7 +89,7 @@ def yetigraph_attribute_values(assumed_destination, resources): pass -class ExtractYetiRig(MayaExtractorPlugin): +class ExtractYetiRig(plugin.MayaExtractorPlugin): """Extract the Yeti rig to a Maya Scene and write the Yeti rig data.""" label = "Extract Yeti Rig" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/increment_current_file_deadline.py b/server_addon/maya/client/ayon_maya/plugins/publish/increment_current_file_deadline.py index 62c5e9a8b2..66019c4837 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/increment_current_file_deadline.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/increment_current_file_deadline.py @@ -1,8 +1,8 @@ import pyblish.api -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin -class IncrementCurrentFileDeadline(MayaContextPlugin): +class IncrementCurrentFileDeadline(plugin.MayaContextPlugin): """Increment the current file. Saves the current maya scene with an increased version number. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/reset_xgen_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/reset_xgen_attributes.py index 923614c8d1..ac9e1beeec 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/reset_xgen_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/reset_xgen_attributes.py @@ -1,9 +1,9 @@ import pyblish.api -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ResetXgenAttributes(MayaInstancePlugin): +class ResetXgenAttributes(plugin.MayaInstancePlugin): """Reset Xgen attributes. When the incremental save of the workfile triggers, the Xgen attributes diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/save_scene.py b/server_addon/maya/client/ayon_maya/plugins/publish/save_scene.py index f062f0d947..9c23fcff85 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/save_scene.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/save_scene.py @@ -3,10 +3,10 @@ from ayon_core.pipeline.workfile.lock_workfile import ( is_workfile_lock_enabled, remove_workfile_lock, ) -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin -class SaveCurrentScene(MayaContextPlugin): +class SaveCurrentScene(plugin.MayaContextPlugin): """Save current scene.""" label = "Save current file" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_alembic_options_defaults.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_alembic_options_defaults.py index f68418770b..fd4e2254a7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_alembic_options_defaults.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_alembic_options_defaults.py @@ -3,11 +3,11 @@ import inspect import pyblish.api from ayon_core.pipeline import OptionalPyblishPluginMixin from ayon_core.pipeline.publish import PublishValidationError, RepairAction -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin class ValidateAlembicDefaultsPointcache( - MayaInstancePlugin, OptionalPyblishPluginMixin + plugin.MayaInstancePlugin, OptionalPyblishPluginMixin ): """Validate the attributes on the instance are defaults. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_content.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_content.py index b11e6ec930..b10a1a2bb7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_content.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_content.py @@ -4,10 +4,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateAnimationContent(MayaInstancePlugin, +class ValidateAnimationContent(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Adheres to the content of 'animation' product type diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_out_set_related_node_ids.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_out_set_related_node_ids.py index ba8a50ea40..40f03b2690 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_out_set_related_node_ids.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_animation_out_set_related_node_ids.py @@ -9,10 +9,10 @@ from ayon_core.pipeline.publish import ( get_plugin_settings, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateOutRelatedNodeIds(MayaInstancePlugin, +class ValidateOutRelatedNodeIds(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate if deformed shapes have related IDs to the original shapes diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source.py index 7f8015443d..edc4161dff 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source.py @@ -4,11 +4,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api.lib import is_visible -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateArnoldSceneSource(MayaInstancePlugin): +class ValidateArnoldSceneSource(plugin.MayaInstancePlugin): """Validate Arnold Scene Source. Ensure no nodes are hidden. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source_cbid.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source_cbid.py index 0da1a26293..8da8813b0d 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source_cbid.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_arnold_scene_source_cbid.py @@ -5,10 +5,10 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateArnoldSceneSourceCbid(MayaInstancePlugin, +class ValidateArnoldSceneSourceCbid(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate Arnold Scene Source Cbid. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_ass_relative_paths.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_ass_relative_paths.py index 030e2fb950..36c220f862 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_ass_relative_paths.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_ass_relative_paths.py @@ -10,10 +10,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateAssRelativePaths(MayaInstancePlugin, +class ValidateAssRelativePaths(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure exporting ass file has set relative texture paths""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_name.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_name.py index 468f9aee9b..4dfe7214bf 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_name.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_name.py @@ -5,10 +5,10 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateAssemblyName(MayaInstancePlugin, +class ValidateAssemblyName(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """ Ensure Assembly name ends with `GRP` diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_namespaces.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_namespaces.py index 15119fa3c2..324b12a207 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_namespaces.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_namespaces.py @@ -4,10 +4,10 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateAssemblyNamespaces(MayaInstancePlugin, +class ValidateAssemblyNamespaces(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure namespaces are not nested. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_transforms.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_transforms.py index 9d2aa98c24..7fc14560f7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_transforms.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_assembly_transforms.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, RepairAction, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateAssemblyModelTransforms(MayaInstancePlugin, +class ValidateAssemblyModelTransforms(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Verify only root nodes of the loaded asset have transformations. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_attributes.py index 2f52c92200..8d4d8323ce 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_attributes.py @@ -8,11 +8,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api.lib import set_attribute -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateAttributes(MayaInstancePlugin, +class ValidateAttributes(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure attributes are consistent. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_attributes.py index 1922b22109..8c3f3800cc 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_attributes.py @@ -4,11 +4,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateCameraAttributes(MayaInstancePlugin, +class ValidateCameraAttributes(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates Camera has no invalid attribute keys or values. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_contents.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_contents.py index 988b16cec2..42a5ef1769 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_contents.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_camera_contents.py @@ -5,10 +5,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, OptionalPyblishPluginMixin) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateCameraContents(MayaInstancePlugin, +class ValidateCameraContents(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates Camera instance contents. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_color_sets.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_color_sets.py index d89244b5f7..f95e27def1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_color_sets.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_color_sets.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateColorSets(MayaInstancePlugin, +class ValidateColorSets(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate all meshes in the instance have unlocked normals diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_current_renderlayer_renderable.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_current_renderlayer_renderable.py index c863778e07..6c599d398d 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_current_renderlayer_renderable.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_current_renderlayer_renderable.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, context_plugin_should_run, ) -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateCurrentRenderLayerIsRenderable(MayaContextPlugin, +class ValidateCurrentRenderLayerIsRenderable(plugin.MayaContextPlugin, OptionalPyblishPluginMixin): """Validate if current render layer has a renderable camera. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_cycle_error.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_cycle_error.py index 62aafa9f53..0b870993e9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_cycle_error.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_cycle_error.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api.lib import maintained_selection -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateCycleError(MayaInstancePlugin, +class ValidateCycleError(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate nodes produce no cycle errors.""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_frame_range.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_frame_range.py index a5834d9bff..90bdef4107 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_frame_range.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_frame_range.py @@ -5,12 +5,12 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api.lib_rendersetup import get_attr_in_layer, get_attr_overrides -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds from maya.app.renderSetup.model.override import AbsOverride -class ValidateFrameRange(MayaInstancePlugin, +class ValidateFrameRange(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates the frame ranges. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_material.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_material.py index d620de49c1..e94cb3e663 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_material.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_material.py @@ -5,11 +5,11 @@ from ayon_core.pipeline import ( PublishValidationError, ) from ayon_core.pipeline.publish import RepairAction, ValidateContentsOrder -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateGLSLMaterial(MayaInstancePlugin, +class ValidateGLSLMaterial(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """ Validate if the asset uses GLSL Shader diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_plugin.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_plugin.py index 588c86e297..aaea616631 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_plugin.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_glsl_plugin.py @@ -6,10 +6,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateGLSLPlugin(MayaInstancePlugin, +class ValidateGLSLPlugin(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """ Validate if the asset uses GLSL Shader diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_has_members.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_has_members.py index 2fc5a3910f..baca2a9008 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_has_members.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_has_members.py @@ -3,10 +3,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateInstanceHasMembers(MayaInstancePlugin): +class ValidateInstanceHasMembers(plugin.MayaInstancePlugin): """Validates instance objectSet has *any* members.""" order = ValidateContentsOrder diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_in_context.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_in_context.py index 3d1d051484..5168c8496c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_in_context.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_in_context.py @@ -9,10 +9,10 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateInstanceInContext(MayaInstancePlugin, +class ValidateInstanceInContext(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validator to check if instance asset match context asset. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_subset.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_subset.py index fe18d9359e..4c876079ff 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_subset.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_instance_subset.py @@ -5,7 +5,7 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin # Allow only characters, numbers and underscore allowed = set(string.ascii_lowercase + @@ -18,7 +18,7 @@ def validate_name(product_name): return all(x in allowed for x in product_name) -class ValidateSubsetName(MayaInstancePlugin): +class ValidateSubsetName(plugin.MayaInstancePlugin): """Validates product name has only valid characters""" order = ValidateContentsOrder diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_loaded_plugin.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_loaded_plugin.py index b83f411681..60af00186e 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_loaded_plugin.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_loaded_plugin.py @@ -7,10 +7,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateLoadedPlugin(MayaInstancePlugin, +class ValidateLoadedPlugin(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure there are no unauthorized loaded plugins""" @@ -23,17 +23,17 @@ class ValidateLoadedPlugin(MayaInstancePlugin, def get_invalid(cls, context): invalid = [] - loaded_plugin = cmds.pluginInfo(query=True, listPlugins=True) + loaded_plugins = cmds.pluginInfo(query=True, listPlugins=True) # get variable from AYON settings whitelist_native_plugins = cls.whitelist_native_plugins authorized_plugins = cls.authorized_plugins or [] - for plugin in loaded_plugin: + for maya_plugin in loaded_plugins: if not whitelist_native_plugins and os.getenv('MAYA_LOCATION') \ - in cmds.pluginInfo(plugin, query=True, path=True): + in cmds.pluginInfo(maya_plugin, query=True, path=True): continue - if plugin not in authorized_plugins: - invalid.append(plugin) + if maya_plugin not in authorized_plugins: + invalid.append(maya_plugin) return invalid @@ -50,6 +50,6 @@ class ValidateLoadedPlugin(MayaInstancePlugin, def repair(cls, context): """Unload forbidden plugins""" - for plugin in cls.get_invalid(context): - cmds.pluginInfo(plugin, edit=True, autoload=False) - cmds.unloadPlugin(plugin, force=True) + for maya_plugin in cls.get_invalid(context): + cmds.pluginInfo(maya_plugin, edit=True, autoload=False) + cmds.unloadPlugin(maya_plugin, force=True) diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_contents.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_contents.py index 31e4073807..722f92b1b5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_contents.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_contents.py @@ -3,11 +3,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds # noqa -class ValidateLookContents(MayaInstancePlugin): +class ValidateLookContents(plugin.MayaInstancePlugin): """Validate look instance contents Rules: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_default_shaders_connections.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_default_shaders_connections.py index 2dca5a4a90..ac936b36c7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_default_shaders_connections.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_default_shaders_connections.py @@ -3,11 +3,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, RepairContextAction, ) -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateLookDefaultShadersConnections(MayaContextPlugin): +class ValidateLookDefaultShadersConnections(plugin.MayaContextPlugin): """Validate default shaders in the scene have their default connections. For example the standardSurface1 or lambert1 (maya 2023 and before) could diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_id_reference_edits.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_id_reference_edits.py index e1d956e060..4763128f3f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_id_reference_edits.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_id_reference_edits.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateLookIdReferenceEdits(MayaInstancePlugin): +class ValidateLookIdReferenceEdits(plugin.MayaInstancePlugin): """Validate nodes in look have no reference edits to cbId. Note: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_no_default_shaders.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_no_default_shaders.py index a93815f275..e4662dd498 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_no_default_shaders.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_no_default_shaders.py @@ -3,11 +3,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateLookNoDefaultShaders(MayaInstancePlugin): +class ValidateLookNoDefaultShaders(plugin.MayaInstancePlugin): """Validate if any node has a connection to a default shader. This checks whether the look has any members of: diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_sets.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_sets.py index 21de06b061..eae1664114 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_sets.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_sets.py @@ -4,10 +4,10 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateLookSets(MayaInstancePlugin): +class ValidateLookSets(plugin.MayaInstancePlugin): """Validate if any sets relationships are not being collected. A shader can be assigned to a node that is missing a Colorbleed ID. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_shading_group.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_shading_group.py index 8c0a92b012..2aecf64e01 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_shading_group.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_shading_group.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateShadingEngine(MayaInstancePlugin, +class ValidateShadingEngine(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate all shading engines are named after the surface material. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_single_shader.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_single_shader.py index 0cfb18df96..d48c050d97 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_single_shader.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_look_single_shader.py @@ -3,11 +3,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateSingleShader(MayaInstancePlugin): +class ValidateSingleShader(plugin.MayaInstancePlugin): """Validate all nurbsSurfaces and meshes have exactly one shader assigned. This will error if a shape has no shaders or more than one shader. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_maya_units.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_maya_units.py index 16c7920642..cb4df4b5d5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_maya_units.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_maya_units.py @@ -6,10 +6,10 @@ from ayon_core.pipeline.publish import ( RepairContextAction, ValidateSceneOrder, ) -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin -class ValidateMayaUnits(MayaContextPlugin, +class ValidateMayaUnits(plugin.MayaContextPlugin, OptionalPyblishPluginMixin): """Check if the Maya units are set correct""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_arnold_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_arnold_attributes.py index 26aac9c944..9729c8863d 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_arnold_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_arnold_attributes.py @@ -12,11 +12,11 @@ from ayon_maya.api.lib import ( set_attribute, undo_chunk, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateMeshArnoldAttributes(MayaInstancePlugin, +class ValidateMeshArnoldAttributes(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate the mesh has default Arnold attributes. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_empty.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_empty.py index 419ca3c3c3..12b2252eb8 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_empty.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_empty.py @@ -4,11 +4,11 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateMeshEmpty(MayaInstancePlugin): +class ValidateMeshEmpty(plugin.MayaInstancePlugin): """Validate meshes have some vertices. Its possible to have meshes without any vertices. To replicate diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_has_uv.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_has_uv.py index 6f45cba973..c7576d2a78 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_has_uv.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_has_uv.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( ValidateMeshOrder, ) from ayon_maya.api.lib import len_flattened -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateMeshHasUVs(MayaInstancePlugin, +class ValidateMeshHasUVs(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate the current mesh has UVs. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_lamina_faces.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_lamina_faces.py index 23a38aedd8..50e3b5b53a 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_lamina_faces.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_lamina_faces.py @@ -4,11 +4,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateMeshOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateMeshLaminaFaces(MayaInstancePlugin, +class ValidateMeshLaminaFaces(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate meshes don't have lamina faces. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_ngons.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_ngons.py index f1d347df97..c73c8d27e8 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_ngons.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_ngons.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateMeshNgons(MayaInstancePlugin, +class ValidateMeshNgons(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure that meshes don't have ngons diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_no_negative_scale.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_no_negative_scale.py index 58c3a9bc0f..7a77a2a4f6 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_no_negative_scale.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_no_negative_scale.py @@ -4,7 +4,7 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateMeshOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds @@ -15,7 +15,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateMeshNoNegativeScale(MayaInstancePlugin, +class ValidateMeshNoNegativeScale(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure that meshes don't have a negative scale. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_manifold.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_manifold.py index 9e7461772e..8288e8a3b3 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_manifold.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_manifold.py @@ -5,7 +5,7 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds, mel @@ -100,7 +100,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateMeshNonManifold(MayaInstancePlugin, +class ValidateMeshNonManifold(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure that meshes don't have non-manifold edges or vertices diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_zero_edge.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_zero_edge.py index f891a4f7de..bd11ca6488 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_zero_edge.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_non_zero_edge.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( ValidateMeshOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateMeshNonZeroEdgeLength(MayaInstancePlugin, +class ValidateMeshNonZeroEdgeLength(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate meshes don't have edges with a zero length. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_normals_unlocked.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_normals_unlocked.py index c6b6786f24..dd8c523082 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_normals_unlocked.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_normals_unlocked.py @@ -6,7 +6,7 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds @@ -17,7 +17,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateMeshNormalsUnlocked(MayaInstancePlugin, +class ValidateMeshNormalsUnlocked(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate all meshes in the instance have unlocked normals diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_overlapping_uvs.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_overlapping_uvs.py index 5e9a4c3b60..0ef6c2732e 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_overlapping_uvs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_overlapping_uvs.py @@ -7,7 +7,7 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateMeshOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds from six.moves import xrange @@ -235,7 +235,7 @@ class GetOverlappingUVs(object): return faces -class ValidateMeshHasOverlappingUVs(MayaInstancePlugin, +class ValidateMeshHasOverlappingUVs(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """ Validate the current mesh overlapping UVs. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_shader_connections.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_shader_connections.py index 9f9ca0c0d5..e3fff157ac 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_shader_connections.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_shader_connections.py @@ -5,7 +5,7 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds @@ -79,7 +79,7 @@ def disconnect(node_a, node_b): cmds.disconnectAttr(source, input) -class ValidateMeshShaderConnections(MayaInstancePlugin, +class ValidateMeshShaderConnections(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure mesh shading engine connections are valid. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_single_uv_set.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_single_uv_set.py index e7fb6d9ae0..a254cbf8a6 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_single_uv_set.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_single_uv_set.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( ValidateMeshOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateMeshSingleUVSet(MayaInstancePlugin, +class ValidateMeshSingleUVSet(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Warn on multiple UV sets existing for each polygon mesh. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_uv_set_map1.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_uv_set_map1.py index bce69c8279..a749edb35a 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_uv_set_map1.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_uv_set_map1.py @@ -7,11 +7,11 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateMeshUVSetMap1(MayaInstancePlugin, +class ValidateMeshUVSetMap1(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate model's default set exists and is named 'map1'. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_vertices_have_edges.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_vertices_have_edges.py index a63e9a0727..a10a275c44 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_vertices_have_edges.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mesh_vertices_have_edges.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( ValidateMeshOrder, ) from ayon_maya.api.lib import len_flattened -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateMeshVerticesHaveEdges(MayaInstancePlugin, +class ValidateMeshVerticesHaveEdges(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate meshes have only vertices that are connected to edges. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_model_content.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_model_content.py index 32435e9d86..5e100dca1c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_model_content.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_model_content.py @@ -7,11 +7,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateModelContent(MayaInstancePlugin, +class ValidateModelContent(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Adheres to the content of 'model' product type diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mvlook_contents.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mvlook_contents.py index 602c4ff371..b26a3f4cb7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_mvlook_contents.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_mvlook_contents.py @@ -6,13 +6,13 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin COLOUR_SPACES = ['sRGB', 'linear', 'auto'] MIPMAP_EXTENSIONS = ['tdl'] -class ValidateMvLookContents(MayaInstancePlugin, +class ValidateMvLookContents(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): order = ValidateContentsOrder families = ['mvLook'] diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_animation.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_animation.py index 6e6b04bfea..146dfda2ca 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_animation.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_animation.py @@ -4,7 +4,7 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds @@ -15,7 +15,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateNoAnimation(MayaInstancePlugin, +class ValidateNoAnimation(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure no keyframes on nodes in the Instance. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_default_camera.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_default_camera.py index e5d938e337..a57c02a842 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_default_camera.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_default_camera.py @@ -4,7 +4,7 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds @@ -15,7 +15,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateNoDefaultCameras(MayaInstancePlugin, +class ValidateNoDefaultCameras(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure no default (startup) cameras are in the instance. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_namespace.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_namespace.py index a357b9cdec..9bd2d98e54 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_namespace.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_namespace.py @@ -6,7 +6,7 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin def _as_report_list(values, prefix="- ", suffix="\n"): @@ -23,7 +23,7 @@ def get_namespace(node_name): return node_name.rpartition(":")[0] -class ValidateNoNamespace(MayaInstancePlugin, +class ValidateNoNamespace(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure the nodes don't have a namespace""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_null_transforms.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_null_transforms.py index 581b304f60..5c1baeb0e3 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_null_transforms.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_null_transforms.py @@ -6,7 +6,7 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin def _as_report_list(values, prefix="- ", suffix="\n"): @@ -32,7 +32,7 @@ def has_shape_children(node): return True -class ValidateNoNullTransforms(MayaInstancePlugin, +class ValidateNoNullTransforms(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure no null transforms are in the scene. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_unknown_nodes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_unknown_nodes.py index 4f55f5f64f..3662c94ba3 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_unknown_nodes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_unknown_nodes.py @@ -4,7 +4,7 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds @@ -15,7 +15,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateNoUnknownNodes(MayaInstancePlugin, +class ValidateNoUnknownNodes(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Checks to see if there are any unknown nodes in the instance. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_vraymesh.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_vraymesh.py index f54e0ddcd1..d14c335021 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_vraymesh.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_no_vraymesh.py @@ -3,7 +3,7 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds @@ -14,7 +14,7 @@ def _as_report_list(values, prefix="- ", suffix="\n"): return prefix + (suffix + prefix).join(values) -class ValidateNoVRayMesh(MayaInstancePlugin, +class ValidateNoVRayMesh(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate there are no VRayMesh objects in the instance""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids.py index a5b1f50044..f9dafa024f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids.py @@ -4,10 +4,10 @@ from ayon_core.pipeline.publish import ( ) import ayon_maya.api.action from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateNodeIDs(MayaInstancePlugin): +class ValidateNodeIDs(plugin.MayaInstancePlugin): """Validate nodes have a Colorbleed Id. When IDs are missing from nodes *save your scene* and they should be diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_deformed_shapes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_deformed_shapes.py index 28e6bf29b7..8e3c4e5bff 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_deformed_shapes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_deformed_shapes.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateNodeIdsDeformedShape(MayaInstancePlugin): +class ValidateNodeIdsDeformedShape(plugin.MayaInstancePlugin): """Validate if deformed shapes have related IDs to the original shapes. When a deformer is applied in the scene on a referenced mesh that already diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_in_database.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_in_database.py index 6465878889..95e488d8e7 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_in_database.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_in_database.py @@ -5,10 +5,10 @@ from ayon_core.pipeline.publish import ( ValidatePipelineOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateNodeIdsInDatabase(MayaInstancePlugin): +class ValidateNodeIdsInDatabase(plugin.MayaInstancePlugin): """Validate if the CB Id is related to an folder in the database All nodes with the `cbId` attribute will be validated to ensure that diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_related.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_related.py index eaf1d8a250..7382653d35 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_related.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_related.py @@ -10,7 +10,7 @@ from ayon_core.pipeline.publish import ( ValidatePipelineOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin def is_valid_uuid(value) -> bool: @@ -22,7 +22,7 @@ def is_valid_uuid(value) -> bool: return True -class ValidateNodeIDsRelated(MayaInstancePlugin, +class ValidateNodeIDsRelated(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate nodes have a related `cbId` to the instance.data[folderPath]""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_unique.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_unique.py index ee32b1decc..27606baa55 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_unique.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_ids_unique.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( ValidatePipelineOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateNodeIdsUnique(MayaInstancePlugin): +class ValidateNodeIdsUnique(plugin.MayaInstancePlugin): """Validate the nodes in the instance have a unique Colorbleed Id Here we ensure that what has been added to the instance is unique diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_no_ghosting.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_no_ghosting.py index 735b98dfe9..184e4eaf15 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_no_ghosting.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_node_no_ghosting.py @@ -4,11 +4,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateNodeNoGhosting(MayaInstancePlugin, +class ValidateNodeNoGhosting(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure nodes do not have ghosting enabled. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_plugin_path_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_plugin_path_attributes.py index 4ab03f19c8..506759516e 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_plugin_path_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_plugin_path_attributes.py @@ -7,11 +7,11 @@ from ayon_core.pipeline.publish import ( ) from ayon_maya.api.action import SelectInvalidAction from ayon_maya.api.lib import pairwise -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidatePluginPathAttributes(MayaInstancePlugin, +class ValidatePluginPathAttributes(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """ Validate plug-in path attributes point to existing file paths. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_image_rule.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_image_rule.py index 72a69302a8..fd1a9ad9e4 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_image_rule.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_image_rule.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateRenderImageRule(MayaInstancePlugin, +class ValidateRenderImageRule(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates Maya Workpace "images" file rule matches project settings. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_no_default_cameras.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_no_default_cameras.py index 85c304e0cd..083b21b819 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_no_default_cameras.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_no_default_cameras.py @@ -4,11 +4,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateRenderNoDefaultCameras(MayaInstancePlugin, +class ValidateRenderNoDefaultCameras(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure no default (startup) cameras are to be rendered.""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_single_camera.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_single_camera.py index a50f4eeab5..6856b9a0f1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_single_camera.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_render_single_camera.py @@ -8,11 +8,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api.lib_rendersettings import RenderSettings -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateRenderSingleCamera(MayaInstancePlugin, +class ValidateRenderSingleCamera(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate renderable camera count for layer and token. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_renderlayer_aovs.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_renderlayer_aovs.py index dd9cca19a5..16350cfa08 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_renderlayer_aovs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_renderlayer_aovs.py @@ -5,10 +5,10 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateRenderLayerAOVs(MayaInstancePlugin, +class ValidateRenderLayerAOVs(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate created AOVs / RenderElement is registered in the database diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rendersettings.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rendersettings.py index 5e3b6c541f..7b21bf6a14 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rendersettings.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rendersettings.py @@ -11,7 +11,7 @@ from ayon_core.pipeline.publish import ( ) from ayon_maya.api import lib from ayon_maya.api.lib_rendersettings import RenderSettings -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds, mel @@ -37,7 +37,7 @@ def get_redshift_image_format_labels(): return mel.eval("{0}={0}".format(var)) -class ValidateRenderSettings(MayaInstancePlugin, +class ValidateRenderSettings(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates the global render settings diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_resolution.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_resolution.py index 63c0b9dab1..58d2ad3030 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_resolution.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_resolution.py @@ -6,11 +6,11 @@ from ayon_core.pipeline import ( from ayon_core.pipeline.publish import RepairAction from ayon_maya.api import lib from ayon_maya.api.lib import reset_scene_resolution -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateResolution(MayaInstancePlugin, +class ValidateResolution(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate the render resolution setting aligned with DB""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_resources.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_resources.py index e3c7d65000..0ec51d909c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_resources.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_resources.py @@ -5,10 +5,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateResources(MayaInstancePlugin): +class ValidateResources(plugin.MayaInstancePlugin): """Validates mapped resources. These are external files to the current application, for example diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_review.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_review.py index c38c132347..76f61dc3e5 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_review.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_review.py @@ -1,10 +1,10 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, PublishValidationError ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateReview(MayaInstancePlugin): +class ValidateReview(plugin.MayaInstancePlugin): """Validate review.""" order = ValidateContentsOrder diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_contents.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_contents.py index ad642c34b2..ada2ce045b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_contents.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_contents.py @@ -4,11 +4,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateRigContents(MayaInstancePlugin, +class ValidateRigContents(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure rig contains pipeline-critical content diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers.py index 0bbbecc73d..fed78df2da 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api.lib import undo_chunk -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateRigControllers(MayaInstancePlugin, +class ValidateRigControllers(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate rig controllers. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers_arnold_attributes.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers_arnold_attributes.py index 4589603bff..06691f4bd3 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers_arnold_attributes.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_controllers_arnold_attributes.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateRigControllersArnoldAttributes(MayaInstancePlugin, +class ValidateRigControllersArnoldAttributes(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate rig control curves have no keyable arnold attributes. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_joints_hidden.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_joints_hidden.py index e9e43a9902..f0593ed7bc 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_joints_hidden.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_joints_hidden.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateRigJointsHidden(MayaInstancePlugin, +class ValidateRigJointsHidden(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate all joints are hidden visually. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_out_set_node_ids.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_out_set_node_ids.py index 163e2007dd..e5f7a5b204 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_out_set_node_ids.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_out_set_node_ids.py @@ -9,10 +9,10 @@ from ayon_core.pipeline.publish import ( get_plugin_settings, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateRigOutSetNodeIds(MayaInstancePlugin, +class ValidateRigOutSetNodeIds(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate if deformed shapes have related IDs to the original shapes. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_output_ids.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_output_ids.py index 2a965173fa..064c83c0b9 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_output_ids.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_rig_output_ids.py @@ -7,7 +7,7 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api.lib import get_id, set_id -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds @@ -16,7 +16,7 @@ def get_basename(node): return node.rsplit("|", 1)[-1].rsplit(":", 1)[-1] -class ValidateRigOutputIds(MayaInstancePlugin): +class ValidateRigOutputIds(plugin.MayaInstancePlugin): """Validate rig output ids. Ids must share the same id as similarly named nodes in the scene. This is diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_scene_set_workspace.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_scene_set_workspace.py index d8885cc530..cd36f98dfb 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_scene_set_workspace.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_scene_set_workspace.py @@ -5,7 +5,7 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidatePipelineOrder, ) -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin def is_subdir(path, root_dir): @@ -27,7 +27,7 @@ def is_subdir(path, root_dir): return True -class ValidateSceneSetWorkspace(MayaContextPlugin): +class ValidateSceneSetWorkspace(plugin.MayaContextPlugin): """Validate the scene is inside the currently set Maya workspace""" order = ValidatePipelineOrder diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_setdress_root.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_setdress_root.py index ae5493ffe4..26245435eb 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_setdress_root.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_setdress_root.py @@ -2,10 +2,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateSetdressRoot(MayaInstancePlugin): +class ValidateSetdressRoot(plugin.MayaInstancePlugin): """Validate if set dress top root node is published.""" order = ValidateContentsOrder diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shader_name.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shader_name.py index 77dc24d1a4..45d7ee1c8b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shader_name.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shader_name.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateShaderName(MayaInstancePlugin, +class ValidateShaderName(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate shader name assigned. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_default_names.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_default_names.py index bd9f0cf1d7..4e4f98d755 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_default_names.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_default_names.py @@ -7,7 +7,7 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds @@ -15,7 +15,7 @@ def short_name(node): return node.rsplit("|", 1)[-1].rsplit(":", 1)[-1] -class ValidateShapeDefaultNames(MayaInstancePlugin, +class ValidateShapeDefaultNames(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates that Shape names are using Maya's default format. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_render_stats.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_render_stats.py index 646c12f331..a9c3e861f0 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_render_stats.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_render_stats.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateMeshOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateShapeRenderStats(MayaInstancePlugin, +class ValidateShapeRenderStats(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Ensure all render stats are set to the default values.""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_zero.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_zero.py index 8f58e646f0..8c11009374 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_zero.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_shape_zero.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateShapeZero(MayaInstancePlugin, +class ValidateShapeZero(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Shape components may not have any "tweak" values diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_single_assembly.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_single_assembly.py index 02f3973149..0a760e2acc 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_single_assembly.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_single_assembly.py @@ -2,10 +2,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateSingleAssembly(MayaInstancePlugin): +class ValidateSingleAssembly(plugin.MayaInstancePlugin): """Ensure the content of the instance is grouped in a single hierarchy The instance must have a single root node containing all the content. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_hierarchy.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_hierarchy.py index be71eebac2..9904fdce22 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_hierarchy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_hierarchy.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( PublishXmlValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateSkeletalMeshHierarchy(MayaInstancePlugin, +class ValidateSkeletalMeshHierarchy(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates that nodes has common root.""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_triangulated.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_triangulated.py index db93b8cbc5..7b2b005e9c 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_triangulated.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeletalmesh_triangulated.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api.action import SelectInvalidAction -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateSkeletalMeshTriangulated(MayaInstancePlugin): +class ValidateSkeletalMeshTriangulated(plugin.MayaInstancePlugin): """Validates that the geometry has been triangulated.""" order = ValidateContentsOrder diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeleton_top_group_hierarchy.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeleton_top_group_hierarchy.py index 57418324c9..4e0dc38a36 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeleton_top_group_hierarchy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skeleton_top_group_hierarchy.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateSkeletonTopGroupHierarchy(MayaInstancePlugin, +class ValidateSkeletonTopGroupHierarchy(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates top group hierarchy in the SETs Make sure the object inside the SETs are always top diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skinCluster_deformer_set.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skinCluster_deformer_set.py index ee99b432aa..32015a57bc 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_skinCluster_deformer_set.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_skinCluster_deformer_set.py @@ -6,10 +6,10 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateSkinclusterDeformerSet(MayaInstancePlugin, +class ValidateSkinclusterDeformerSet(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate skinClusters on meshes have valid member relationships. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_step_size.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_step_size.py index 445388efc1..303885d907 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_step_size.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_step_size.py @@ -4,10 +4,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateStepSize(MayaInstancePlugin, +class ValidateStepSize(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates the step size for the instance is in a valid range. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_naming_suffix.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_naming_suffix.py index 1d6a29d446..3a60bc7aef 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_naming_suffix.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_naming_suffix.py @@ -8,11 +8,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateTransformNamingSuffix(MayaInstancePlugin, +class ValidateTransformNamingSuffix(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates transform suffix based on the type of its children shapes. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_zero.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_zero.py index 621a7dd6bc..e251572c0d 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_zero.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_transform_zero.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateTransformZero(MayaInstancePlugin, +class ValidateTransformZero(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Transforms can't have any values diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unique_names.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unique_names.py index 59540b659a..cbe5d2f647 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unique_names.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unique_names.py @@ -4,11 +4,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateUniqueNames(MayaInstancePlugin, +class ValidateUniqueNames(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """transform names should be unique diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_mesh_triangulated.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_mesh_triangulated.py index e8fc3fc095..f283150892 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_mesh_triangulated.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_mesh_triangulated.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateMeshOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateUnrealMeshTriangulated(MayaInstancePlugin, +class ValidateUnrealMeshTriangulated(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate if mesh is made of triangles for Unreal Engine""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_staticmesh_naming.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_staticmesh_naming.py index 054f9aa3a0..dee6563989 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_staticmesh_naming.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_staticmesh_naming.py @@ -8,10 +8,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateUnrealStaticMeshName(MayaInstancePlugin, +class ValidateUnrealStaticMeshName(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate name of Unreal Static Mesh diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_up_axis.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_up_axis.py index fad0eff5f8..d970eb8020 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_up_axis.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_unreal_up_axis.py @@ -5,11 +5,11 @@ from ayon_core.pipeline.publish import ( RepairAction, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateUnrealUpAxis(MayaContextPlugin, +class ValidateUnrealUpAxis(plugin.MayaContextPlugin, OptionalPyblishPluginMixin): """Validate if Z is set as up axis in Maya""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_visible_only.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_visible_only.py index 431cf2f229..b694b890fc 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_visible_only.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_visible_only.py @@ -5,10 +5,10 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api.lib import iter_visible_nodes_in_range -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateAlembicVisibleOnly(MayaInstancePlugin, +class ValidateAlembicVisibleOnly(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validates at least a single node is visible in frame range. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray.py index 65a01886b6..7cf064f993 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray.py @@ -1,10 +1,10 @@ import pyblish.api from ayon_core.pipeline.publish import PublishValidationError -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateVray(MayaInstancePlugin): +class ValidateVray(plugin.MayaInstancePlugin): """Validate general Vray setup.""" order = pyblish.api.ValidatorOrder diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_distributed_rendering.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_distributed_rendering.py index d58c01c1e2..0338798e3f 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_distributed_rendering.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_distributed_rendering.py @@ -6,11 +6,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, ) from ayon_maya.api import lib -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateVRayDistributedRendering(MayaInstancePlugin, +class ValidateVRayDistributedRendering(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate V-Ray Distributed Rendering is ignored in batch mode. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_referenced_aovs.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_referenced_aovs.py index 9cc3290853..a330866e9b 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_referenced_aovs.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_referenced_aovs.py @@ -8,11 +8,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, RepairContextAction, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateVrayReferencedAOVs(MayaInstancePlugin, +class ValidateVrayReferencedAOVs(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate whether the V-Ray Render Elements (AOVs) include references. diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_translator_settings.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_translator_settings.py index 546fd480a9..a4b34db2a1 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_translator_settings.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vray_translator_settings.py @@ -7,11 +7,11 @@ from ayon_core.pipeline.publish import ( ValidateContentsOrder, context_plugin_should_run, ) -from ayon_maya.api.plugin import MayaContextPlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateVRayTranslatorEnabled(MayaContextPlugin, +class ValidateVRayTranslatorEnabled(plugin.MayaContextPlugin, OptionalPyblishPluginMixin): """Validate VRay Translator settings for extracting vrscenes.""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy.py index 06b717be03..67d656b183 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy.py @@ -3,10 +3,10 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateVrayProxy(MayaInstancePlugin, +class ValidateVrayProxy(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): order = pyblish.api.ValidatorOrder diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy_members.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy_members.py index 60d4fe4d8c..cfb17cda55 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy_members.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_vrayproxy_members.py @@ -4,11 +4,11 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateVrayProxyMembers(MayaInstancePlugin, +class ValidateVrayProxyMembers(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate whether the V-Ray Proxy instance has shape members""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_xgen.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_xgen.py index 036da2c1e6..050165db01 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_xgen.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_xgen.py @@ -4,10 +4,10 @@ import maya.cmds as cmds import pyblish.api import xgenm from ayon_core.pipeline.publish import PublishValidationError -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateXgen(MayaInstancePlugin): +class ValidateXgen(plugin.MayaInstancePlugin): """Validate Xgen data.""" label = "Validate Xgen" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_renderscript_callbacks.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_renderscript_callbacks.py index c185838028..ce6410deaa 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_renderscript_callbacks.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_renderscript_callbacks.py @@ -3,11 +3,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateYetiRenderScriptCallbacks(MayaInstancePlugin, +class ValidateYetiRenderScriptCallbacks(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Check if the render script callbacks will be used during the rendering diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_cache_state.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_cache_state.py index 64478d4c50..a7f272c1ec 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_cache_state.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_cache_state.py @@ -8,10 +8,10 @@ from ayon_core.pipeline.publish import ( PublishValidationError, RepairAction, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateYetiRigCacheState(MayaInstancePlugin, +class ValidateYetiRigCacheState(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate the I/O attributes of the node diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_input_in_instance.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_input_in_instance.py index cf637e55cb..8c258b4455 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_input_in_instance.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_input_in_instance.py @@ -4,11 +4,11 @@ from ayon_core.pipeline.publish import ( PublishValidationError, ValidateContentsOrder, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin from maya import cmds -class ValidateYetiRigInputShapesInInstance(MayaInstancePlugin, +class ValidateYetiRigInputShapesInInstance(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate if all input nodes are part of the instance's hierarchy""" diff --git a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_settings.py b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_settings.py index 4258fb8feb..fa0836e0ef 100644 --- a/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_settings.py +++ b/server_addon/maya/client/ayon_maya/plugins/publish/validate_yeti_rig_settings.py @@ -3,10 +3,10 @@ from ayon_core.pipeline.publish import ( OptionalPyblishPluginMixin, PublishValidationError, ) -from ayon_maya.api.plugin import MayaInstancePlugin +from ayon_maya.api import plugin -class ValidateYetiRigSettings(MayaInstancePlugin, +class ValidateYetiRigSettings(plugin.MayaInstancePlugin, OptionalPyblishPluginMixin): """Validate Yeti Rig Settings have collected input connections. From 34ccd63e2db9b6ea9cc4d0e5dbdfde10ea5f56f0 Mon Sep 17 00:00:00 2001 From: Petr Kalis Date: Thu, 30 May 2024 16:56:47 +0200 Subject: [PATCH 54/67] Fix deadline version Needs to match what is in package. Currently no way how to query Server to get version in a bundle. --- client/ayon_core/modules/deadline/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/modules/deadline/version.py b/client/ayon_core/modules/deadline/version.py index 569b1212f7..74acd0efba 100644 --- a/client/ayon_core/modules/deadline/version.py +++ b/client/ayon_core/modules/deadline/version.py @@ -1 +1 @@ -__version__ = "0.1.10" +__version__ = "0.1.12" From 41bee8c211c778ed0cfd2beaed825beadc0d7db0 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 17:29:22 +0200 Subject: [PATCH 55/67] move resolve code next to server code --- .../resolve/client/ayon_resolve}/README.markdown | 0 .../resolve/client/ayon_resolve}/RESOLVE_API_v19.0B-build20.txt | 0 .../resolve/client/ayon_resolve}/__init__.py | 0 .../resolve => server_addon/resolve/client/ayon_resolve}/addon.py | 0 .../resolve/client/ayon_resolve}/api/__init__.py | 0 .../resolve/client/ayon_resolve}/api/action.py | 0 .../resolve/client/ayon_resolve}/api/lib.py | 0 .../resolve/client/ayon_resolve}/api/menu.py | 0 .../resolve/client/ayon_resolve}/api/menu_style.qss | 0 .../resolve/client/ayon_resolve}/api/pipeline.py | 0 .../resolve/client/ayon_resolve}/api/plugin.py | 0 .../resolve/client/ayon_resolve}/api/testing_utils.py | 0 .../resolve/client/ayon_resolve}/api/todo-rendering.py | 0 .../resolve/client/ayon_resolve}/api/utils.py | 0 .../resolve/client/ayon_resolve}/api/workio.py | 0 .../client/ayon_resolve}/hooks/pre_resolve_last_workfile.py | 0 .../resolve/client/ayon_resolve}/hooks/pre_resolve_setup.py | 0 .../resolve/client/ayon_resolve}/hooks/pre_resolve_startup.py | 0 .../resolve/client/ayon_resolve}/otio/__init__.py | 0 .../resolve/client/ayon_resolve}/otio/davinci_export.py | 0 .../resolve/client/ayon_resolve}/otio/davinci_import.py | 0 .../resolve/client/ayon_resolve}/otio/utils.py | 0 .../client/ayon_resolve}/plugins/create/create_shot_clip.py | 0 .../resolve/client/ayon_resolve}/plugins/load/load_clip.py | 0 .../client/ayon_resolve}/plugins/load/load_editorial_package.py | 0 .../client/ayon_resolve}/plugins/publish/extract_workfile.py | 0 .../client/ayon_resolve}/plugins/publish/precollect_instances.py | 0 .../client/ayon_resolve}/plugins/publish/precollect_workfile.py | 0 .../resolve/client/ayon_resolve}/startup.py | 0 .../resolve/client/ayon_resolve}/utility_scripts/AYON__Menu.py | 0 .../client/ayon_resolve}/utility_scripts/ayon_startup.scriptlib | 0 .../client/ayon_resolve}/utility_scripts/develop/OTIO_export.py | 0 .../client/ayon_resolve}/utility_scripts/develop/OTIO_import.py | 0 .../utility_scripts/develop/OpenPype_sync_util_scripts.py | 0 .../resolve => server_addon/resolve/client/ayon_resolve}/utils.py | 0 35 files changed, 0 insertions(+), 0 deletions(-) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/README.markdown (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/RESOLVE_API_v19.0B-build20.txt (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/__init__.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/addon.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/api/__init__.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/api/action.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/api/lib.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/api/menu.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/api/menu_style.qss (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/api/pipeline.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/api/plugin.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/api/testing_utils.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/api/todo-rendering.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/api/utils.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/api/workio.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/hooks/pre_resolve_last_workfile.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/hooks/pre_resolve_setup.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/hooks/pre_resolve_startup.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/otio/__init__.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/otio/davinci_export.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/otio/davinci_import.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/otio/utils.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/plugins/create/create_shot_clip.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/plugins/load/load_clip.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/plugins/load/load_editorial_package.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/plugins/publish/extract_workfile.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/plugins/publish/precollect_instances.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/plugins/publish/precollect_workfile.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/startup.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/utility_scripts/AYON__Menu.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/utility_scripts/ayon_startup.scriptlib (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/utility_scripts/develop/OTIO_export.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/utility_scripts/develop/OTIO_import.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/utility_scripts/develop/OpenPype_sync_util_scripts.py (100%) rename {client/ayon_core/hosts/resolve => server_addon/resolve/client/ayon_resolve}/utils.py (100%) diff --git a/client/ayon_core/hosts/resolve/README.markdown b/server_addon/resolve/client/ayon_resolve/README.markdown similarity index 100% rename from client/ayon_core/hosts/resolve/README.markdown rename to server_addon/resolve/client/ayon_resolve/README.markdown diff --git a/client/ayon_core/hosts/resolve/RESOLVE_API_v19.0B-build20.txt b/server_addon/resolve/client/ayon_resolve/RESOLVE_API_v19.0B-build20.txt similarity index 100% rename from client/ayon_core/hosts/resolve/RESOLVE_API_v19.0B-build20.txt rename to server_addon/resolve/client/ayon_resolve/RESOLVE_API_v19.0B-build20.txt diff --git a/client/ayon_core/hosts/resolve/__init__.py b/server_addon/resolve/client/ayon_resolve/__init__.py similarity index 100% rename from client/ayon_core/hosts/resolve/__init__.py rename to server_addon/resolve/client/ayon_resolve/__init__.py diff --git a/client/ayon_core/hosts/resolve/addon.py b/server_addon/resolve/client/ayon_resolve/addon.py similarity index 100% rename from client/ayon_core/hosts/resolve/addon.py rename to server_addon/resolve/client/ayon_resolve/addon.py diff --git a/client/ayon_core/hosts/resolve/api/__init__.py b/server_addon/resolve/client/ayon_resolve/api/__init__.py similarity index 100% rename from client/ayon_core/hosts/resolve/api/__init__.py rename to server_addon/resolve/client/ayon_resolve/api/__init__.py diff --git a/client/ayon_core/hosts/resolve/api/action.py b/server_addon/resolve/client/ayon_resolve/api/action.py similarity index 100% rename from client/ayon_core/hosts/resolve/api/action.py rename to server_addon/resolve/client/ayon_resolve/api/action.py diff --git a/client/ayon_core/hosts/resolve/api/lib.py b/server_addon/resolve/client/ayon_resolve/api/lib.py similarity index 100% rename from client/ayon_core/hosts/resolve/api/lib.py rename to server_addon/resolve/client/ayon_resolve/api/lib.py diff --git a/client/ayon_core/hosts/resolve/api/menu.py b/server_addon/resolve/client/ayon_resolve/api/menu.py similarity index 100% rename from client/ayon_core/hosts/resolve/api/menu.py rename to server_addon/resolve/client/ayon_resolve/api/menu.py diff --git a/client/ayon_core/hosts/resolve/api/menu_style.qss b/server_addon/resolve/client/ayon_resolve/api/menu_style.qss similarity index 100% rename from client/ayon_core/hosts/resolve/api/menu_style.qss rename to server_addon/resolve/client/ayon_resolve/api/menu_style.qss diff --git a/client/ayon_core/hosts/resolve/api/pipeline.py b/server_addon/resolve/client/ayon_resolve/api/pipeline.py similarity index 100% rename from client/ayon_core/hosts/resolve/api/pipeline.py rename to server_addon/resolve/client/ayon_resolve/api/pipeline.py diff --git a/client/ayon_core/hosts/resolve/api/plugin.py b/server_addon/resolve/client/ayon_resolve/api/plugin.py similarity index 100% rename from client/ayon_core/hosts/resolve/api/plugin.py rename to server_addon/resolve/client/ayon_resolve/api/plugin.py diff --git a/client/ayon_core/hosts/resolve/api/testing_utils.py b/server_addon/resolve/client/ayon_resolve/api/testing_utils.py similarity index 100% rename from client/ayon_core/hosts/resolve/api/testing_utils.py rename to server_addon/resolve/client/ayon_resolve/api/testing_utils.py diff --git a/client/ayon_core/hosts/resolve/api/todo-rendering.py b/server_addon/resolve/client/ayon_resolve/api/todo-rendering.py similarity index 100% rename from client/ayon_core/hosts/resolve/api/todo-rendering.py rename to server_addon/resolve/client/ayon_resolve/api/todo-rendering.py diff --git a/client/ayon_core/hosts/resolve/api/utils.py b/server_addon/resolve/client/ayon_resolve/api/utils.py similarity index 100% rename from client/ayon_core/hosts/resolve/api/utils.py rename to server_addon/resolve/client/ayon_resolve/api/utils.py diff --git a/client/ayon_core/hosts/resolve/api/workio.py b/server_addon/resolve/client/ayon_resolve/api/workio.py similarity index 100% rename from client/ayon_core/hosts/resolve/api/workio.py rename to server_addon/resolve/client/ayon_resolve/api/workio.py diff --git a/client/ayon_core/hosts/resolve/hooks/pre_resolve_last_workfile.py b/server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_last_workfile.py similarity index 100% rename from client/ayon_core/hosts/resolve/hooks/pre_resolve_last_workfile.py rename to server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_last_workfile.py diff --git a/client/ayon_core/hosts/resolve/hooks/pre_resolve_setup.py b/server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_setup.py similarity index 100% rename from client/ayon_core/hosts/resolve/hooks/pre_resolve_setup.py rename to server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_setup.py diff --git a/client/ayon_core/hosts/resolve/hooks/pre_resolve_startup.py b/server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_startup.py similarity index 100% rename from client/ayon_core/hosts/resolve/hooks/pre_resolve_startup.py rename to server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_startup.py diff --git a/client/ayon_core/hosts/resolve/otio/__init__.py b/server_addon/resolve/client/ayon_resolve/otio/__init__.py similarity index 100% rename from client/ayon_core/hosts/resolve/otio/__init__.py rename to server_addon/resolve/client/ayon_resolve/otio/__init__.py diff --git a/client/ayon_core/hosts/resolve/otio/davinci_export.py b/server_addon/resolve/client/ayon_resolve/otio/davinci_export.py similarity index 100% rename from client/ayon_core/hosts/resolve/otio/davinci_export.py rename to server_addon/resolve/client/ayon_resolve/otio/davinci_export.py diff --git a/client/ayon_core/hosts/resolve/otio/davinci_import.py b/server_addon/resolve/client/ayon_resolve/otio/davinci_import.py similarity index 100% rename from client/ayon_core/hosts/resolve/otio/davinci_import.py rename to server_addon/resolve/client/ayon_resolve/otio/davinci_import.py diff --git a/client/ayon_core/hosts/resolve/otio/utils.py b/server_addon/resolve/client/ayon_resolve/otio/utils.py similarity index 100% rename from client/ayon_core/hosts/resolve/otio/utils.py rename to server_addon/resolve/client/ayon_resolve/otio/utils.py diff --git a/client/ayon_core/hosts/resolve/plugins/create/create_shot_clip.py b/server_addon/resolve/client/ayon_resolve/plugins/create/create_shot_clip.py similarity index 100% rename from client/ayon_core/hosts/resolve/plugins/create/create_shot_clip.py rename to server_addon/resolve/client/ayon_resolve/plugins/create/create_shot_clip.py diff --git a/client/ayon_core/hosts/resolve/plugins/load/load_clip.py b/server_addon/resolve/client/ayon_resolve/plugins/load/load_clip.py similarity index 100% rename from client/ayon_core/hosts/resolve/plugins/load/load_clip.py rename to server_addon/resolve/client/ayon_resolve/plugins/load/load_clip.py diff --git a/client/ayon_core/hosts/resolve/plugins/load/load_editorial_package.py b/server_addon/resolve/client/ayon_resolve/plugins/load/load_editorial_package.py similarity index 100% rename from client/ayon_core/hosts/resolve/plugins/load/load_editorial_package.py rename to server_addon/resolve/client/ayon_resolve/plugins/load/load_editorial_package.py diff --git a/client/ayon_core/hosts/resolve/plugins/publish/extract_workfile.py b/server_addon/resolve/client/ayon_resolve/plugins/publish/extract_workfile.py similarity index 100% rename from client/ayon_core/hosts/resolve/plugins/publish/extract_workfile.py rename to server_addon/resolve/client/ayon_resolve/plugins/publish/extract_workfile.py diff --git a/client/ayon_core/hosts/resolve/plugins/publish/precollect_instances.py b/server_addon/resolve/client/ayon_resolve/plugins/publish/precollect_instances.py similarity index 100% rename from client/ayon_core/hosts/resolve/plugins/publish/precollect_instances.py rename to server_addon/resolve/client/ayon_resolve/plugins/publish/precollect_instances.py diff --git a/client/ayon_core/hosts/resolve/plugins/publish/precollect_workfile.py b/server_addon/resolve/client/ayon_resolve/plugins/publish/precollect_workfile.py similarity index 100% rename from client/ayon_core/hosts/resolve/plugins/publish/precollect_workfile.py rename to server_addon/resolve/client/ayon_resolve/plugins/publish/precollect_workfile.py diff --git a/client/ayon_core/hosts/resolve/startup.py b/server_addon/resolve/client/ayon_resolve/startup.py similarity index 100% rename from client/ayon_core/hosts/resolve/startup.py rename to server_addon/resolve/client/ayon_resolve/startup.py diff --git a/client/ayon_core/hosts/resolve/utility_scripts/AYON__Menu.py b/server_addon/resolve/client/ayon_resolve/utility_scripts/AYON__Menu.py similarity index 100% rename from client/ayon_core/hosts/resolve/utility_scripts/AYON__Menu.py rename to server_addon/resolve/client/ayon_resolve/utility_scripts/AYON__Menu.py diff --git a/client/ayon_core/hosts/resolve/utility_scripts/ayon_startup.scriptlib b/server_addon/resolve/client/ayon_resolve/utility_scripts/ayon_startup.scriptlib similarity index 100% rename from client/ayon_core/hosts/resolve/utility_scripts/ayon_startup.scriptlib rename to server_addon/resolve/client/ayon_resolve/utility_scripts/ayon_startup.scriptlib diff --git a/client/ayon_core/hosts/resolve/utility_scripts/develop/OTIO_export.py b/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OTIO_export.py similarity index 100% rename from client/ayon_core/hosts/resolve/utility_scripts/develop/OTIO_export.py rename to server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OTIO_export.py diff --git a/client/ayon_core/hosts/resolve/utility_scripts/develop/OTIO_import.py b/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OTIO_import.py similarity index 100% rename from client/ayon_core/hosts/resolve/utility_scripts/develop/OTIO_import.py rename to server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OTIO_import.py diff --git a/client/ayon_core/hosts/resolve/utility_scripts/develop/OpenPype_sync_util_scripts.py b/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OpenPype_sync_util_scripts.py similarity index 100% rename from client/ayon_core/hosts/resolve/utility_scripts/develop/OpenPype_sync_util_scripts.py rename to server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OpenPype_sync_util_scripts.py diff --git a/client/ayon_core/hosts/resolve/utils.py b/server_addon/resolve/client/ayon_resolve/utils.py similarity index 100% rename from client/ayon_core/hosts/resolve/utils.py rename to server_addon/resolve/client/ayon_resolve/utils.py From e883ac4c812a62afe3a97af23da6f6bfff9c2907 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 17:36:37 +0200 Subject: [PATCH 56/67] updated package.py --- server_addon/resolve/package.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/server_addon/resolve/package.py b/server_addon/resolve/package.py index cf92413bce..993f700e40 100644 --- a/server_addon/resolve/package.py +++ b/server_addon/resolve/package.py @@ -1,3 +1,10 @@ name = "resolve" title = "DaVinci Resolve" -version = "0.1.0" +version = "0.2.0" + +client_dir = "ayon_resolve" + +ayon_required_addons = { + "core": ">0.3.2", +} +ayon_compatible_addons = {} From e16ce8f80c8523e2e74fe32845e94e72833c0f9a Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 17:37:08 +0200 Subject: [PATCH 57/67] fixed imports --- server_addon/resolve/client/ayon_resolve/__init__.py | 9 ++++++++- server_addon/resolve/client/ayon_resolve/addon.py | 6 ++++-- server_addon/resolve/client/ayon_resolve/api/pipeline.py | 6 ++---- server_addon/resolve/client/ayon_resolve/api/utils.py | 8 ++++---- .../client/ayon_resolve/hooks/pre_resolve_setup.py | 2 +- .../client/ayon_resolve/hooks/pre_resolve_startup.py | 5 ++--- .../ayon_resolve/plugins/create/create_shot_clip.py | 4 ++-- .../client/ayon_resolve/plugins/load/load_clip.py | 4 ++-- .../ayon_resolve/plugins/load/load_editorial_package.py | 2 +- .../ayon_resolve/plugins/publish/extract_workfile.py | 2 +- .../ayon_resolve/plugins/publish/precollect_instances.py | 2 +- .../ayon_resolve/plugins/publish/precollect_workfile.py | 4 ++-- server_addon/resolve/client/ayon_resolve/startup.py | 6 +++--- .../client/ayon_resolve/utility_scripts/AYON__Menu.py | 2 +- .../ayon_resolve/utility_scripts/develop/OTIO_export.py | 2 +- .../ayon_resolve/utility_scripts/develop/OTIO_import.py | 2 +- .../develop/OpenPype_sync_util_scripts.py | 4 ++-- server_addon/resolve/client/ayon_resolve/utils.py | 4 ++-- server_addon/resolve/client/ayon_resolve/version.py | 3 +++ 19 files changed, 43 insertions(+), 34 deletions(-) create mode 100644 server_addon/resolve/client/ayon_resolve/version.py diff --git a/server_addon/resolve/client/ayon_resolve/__init__.py b/server_addon/resolve/client/ayon_resolve/__init__.py index b4a994bbaa..ba9afb67d5 100644 --- a/server_addon/resolve/client/ayon_resolve/__init__.py +++ b/server_addon/resolve/client/ayon_resolve/__init__.py @@ -1,6 +1,13 @@ -from .addon import ResolveAddon +from .version import __version__ +from .addon import ( + RESOLVE_ADDON_ROOT, + ResolveAddon, +) __all__ = ( + "__version__", + + "RESOLVE_ADDON_ROOT", "ResolveAddon", ) diff --git a/server_addon/resolve/client/ayon_resolve/addon.py b/server_addon/resolve/client/ayon_resolve/addon.py index 1354caabb2..706d2802b0 100644 --- a/server_addon/resolve/client/ayon_resolve/addon.py +++ b/server_addon/resolve/client/ayon_resolve/addon.py @@ -2,18 +2,20 @@ import os from ayon_core.addon import AYONAddon, IHostAddon -from .utils import RESOLVE_ROOT_DIR +from .version import __version__ +from .utils import RESOLVE_ADDON_ROOT class ResolveAddon(AYONAddon, IHostAddon): name = "resolve" + version = __version__ host_name = "resolve" def get_launch_hook_paths(self, app): if app.host_name != self.host_name: return [] return [ - os.path.join(RESOLVE_ROOT_DIR, "hooks") + os.path.join(RESOLVE_ADDON_ROOT, "hooks") ] def get_workfile_extensions(self): diff --git a/server_addon/resolve/client/ayon_resolve/api/pipeline.py b/server_addon/resolve/client/ayon_resolve/api/pipeline.py index 15e4f1203d..d6d6dc799e 100644 --- a/server_addon/resolve/client/ayon_resolve/api/pipeline.py +++ b/server_addon/resolve/client/ayon_resolve/api/pipeline.py @@ -57,7 +57,7 @@ class ResolveHost(HostBase, IWorkfileHost, ILoadHost): """ - log.info("ayon_core.hosts.resolve installed") + log.info("ayon_resolve installed") pyblish.register_host(self.name) pyblish.register_plugin_path(PUBLISH_PATH) @@ -246,9 +246,7 @@ def on_pyblish_instance_toggled(instance, old_value, new_value): log.info("instance toggle: {}, old_value: {}, new_value:{} ".format( instance, old_value, new_value)) - from ayon_core.hosts.resolve.api import ( - set_publish_attribute - ) + from ayon_resolve.api import set_publish_attribute # Whether instances should be passthrough based on new value timeline_item = instance.data["item"] diff --git a/server_addon/resolve/client/ayon_resolve/api/utils.py b/server_addon/resolve/client/ayon_resolve/api/utils.py index 030534370b..d63ade9d51 100644 --- a/server_addon/resolve/client/ayon_resolve/api/utils.py +++ b/server_addon/resolve/client/ayon_resolve/api/utils.py @@ -13,11 +13,11 @@ log = Logger.get_logger(__name__) def get_resolve_module(): - from ayon_core.hosts.resolve import api + from ayon_resolve import api # dont run if already loaded if api.bmdvr: log.info(("resolve module is assigned to " - f"`ayon_core.hosts.resolve.api.bmdvr`: {api.bmdvr}")) + f"`ayon_resolve.api.bmdvr`: {api.bmdvr}")) return api.bmdvr try: """ @@ -78,6 +78,6 @@ def get_resolve_module(): api.bmdvr = bmdvr api.bmdvf = bmdvf log.info(("Assigning resolve module to " - f"`ayon_core.hosts.resolve.api.bmdvr`: {api.bmdvr}")) + f"`ayon_resolve.api.bmdvr`: {api.bmdvr}")) log.info(("Assigning resolve module to " - f"`ayon_core.hosts.resolve.api.bmdvf`: {api.bmdvf}")) + f"`ayon_resolve.api.bmdvf`: {api.bmdvf}")) diff --git a/server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_setup.py b/server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_setup.py index f45e28d5ab..ffd34d7b8d 100644 --- a/server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_setup.py +++ b/server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_setup.py @@ -2,7 +2,7 @@ import os from pathlib import Path import platform from ayon_applications import PreLaunchHook, LaunchTypes -from ayon_core.hosts.resolve.utils import setup +from ayon_resolve.utils import setup class PreLaunchResolveSetup(PreLaunchHook): diff --git a/server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_startup.py b/server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_startup.py index 300564f7cc..b357b10056 100644 --- a/server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_startup.py +++ b/server_addon/resolve/client/ayon_resolve/hooks/pre_resolve_startup.py @@ -1,7 +1,7 @@ import os from ayon_applications import PreLaunchHook, LaunchTypes -import ayon_core.hosts.resolve +from ayon_resolve import RESOLVE_ADDON_ROOT class PreLaunchResolveStartup(PreLaunchHook): @@ -15,8 +15,7 @@ class PreLaunchResolveStartup(PreLaunchHook): def execute(self): # Set the openpype prelaunch startup script path for easy access # in the LUA .scriptlib code - op_resolve_root = os.path.dirname(ayon_core.hosts.resolve.__file__) - script_path = os.path.join(op_resolve_root, "startup.py") + script_path = os.path.join(RESOLVE_ADDON_ROOT, "startup.py") key = "AYON_RESOLVE_STARTUP_SCRIPT" self.launch_context.env[key] = script_path diff --git a/server_addon/resolve/client/ayon_resolve/plugins/create/create_shot_clip.py b/server_addon/resolve/client/ayon_resolve/plugins/create/create_shot_clip.py index cbc03da3b6..da98c8de7d 100644 --- a/server_addon/resolve/client/ayon_resolve/plugins/create/create_shot_clip.py +++ b/server_addon/resolve/client/ayon_resolve/plugins/create/create_shot_clip.py @@ -1,6 +1,6 @@ # from pprint import pformat -from ayon_core.hosts.resolve.api import plugin, lib -from ayon_core.hosts.resolve.api.lib import ( +from ayon_resolve.api import plugin, lib +from ayon_resolve.api.lib import ( get_video_track_names, create_bin, ) diff --git a/server_addon/resolve/client/ayon_resolve/plugins/load/load_clip.py b/server_addon/resolve/client/ayon_resolve/plugins/load/load_clip.py index 2ce1c43957..7e3a5a254e 100644 --- a/server_addon/resolve/client/ayon_resolve/plugins/load/load_clip.py +++ b/server_addon/resolve/client/ayon_resolve/plugins/load/load_clip.py @@ -1,7 +1,7 @@ import ayon_api -from ayon_core.hosts.resolve.api import lib, plugin -from ayon_core.hosts.resolve.api.pipeline import ( +from ayon_resolve.api import lib, plugin +from ayon_resolve.api.pipeline import ( containerise, update_container, ) diff --git a/server_addon/resolve/client/ayon_resolve/plugins/load/load_editorial_package.py b/server_addon/resolve/client/ayon_resolve/plugins/load/load_editorial_package.py index 33395534fa..234e7b7f71 100644 --- a/server_addon/resolve/client/ayon_resolve/plugins/load/load_editorial_package.py +++ b/server_addon/resolve/client/ayon_resolve/plugins/load/load_editorial_package.py @@ -5,7 +5,7 @@ from ayon_core.pipeline import ( get_representation_path, ) -from ayon_core.hosts.resolve.api import lib +from ayon_resolve.api import lib class LoadEditorialPackage(load.LoaderPlugin): diff --git a/server_addon/resolve/client/ayon_resolve/plugins/publish/extract_workfile.py b/server_addon/resolve/client/ayon_resolve/plugins/publish/extract_workfile.py index 48ebdee7e3..77d14ccdc5 100644 --- a/server_addon/resolve/client/ayon_resolve/plugins/publish/extract_workfile.py +++ b/server_addon/resolve/client/ayon_resolve/plugins/publish/extract_workfile.py @@ -2,7 +2,7 @@ import os import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.resolve.api.lib import get_project_manager +from ayon_resolve.api.lib import get_project_manager class ExtractWorkfile(publish.Extractor): diff --git a/server_addon/resolve/client/ayon_resolve/plugins/publish/precollect_instances.py b/server_addon/resolve/client/ayon_resolve/plugins/publish/precollect_instances.py index caa79c85c0..10e1eba3e3 100644 --- a/server_addon/resolve/client/ayon_resolve/plugins/publish/precollect_instances.py +++ b/server_addon/resolve/client/ayon_resolve/plugins/publish/precollect_instances.py @@ -3,7 +3,7 @@ from pprint import pformat import pyblish from ayon_core.pipeline import AYON_INSTANCE_ID, AVALON_INSTANCE_ID -from ayon_core.hosts.resolve.api.lib import ( +from ayon_resolve.api.lib import ( get_current_timeline_items, get_timeline_item_pype_tag, publish_clip_color, diff --git a/server_addon/resolve/client/ayon_resolve/plugins/publish/precollect_workfile.py b/server_addon/resolve/client/ayon_resolve/plugins/publish/precollect_workfile.py index 6158cf1d61..a388d4bc59 100644 --- a/server_addon/resolve/client/ayon_resolve/plugins/publish/precollect_workfile.py +++ b/server_addon/resolve/client/ayon_resolve/plugins/publish/precollect_workfile.py @@ -3,8 +3,8 @@ from pprint import pformat from ayon_core.pipeline import get_current_folder_path -from ayon_core.hosts.resolve import api as rapi -from ayon_core.hosts.resolve.otio import davinci_export +from ayon_resolve import api as rapi +from ayon_resolve.otio import davinci_export class PrecollectWorkfile(pyblish.api.ContextPlugin): diff --git a/server_addon/resolve/client/ayon_resolve/startup.py b/server_addon/resolve/client/ayon_resolve/startup.py index 3ad0a6bf7b..7f0bd59055 100644 --- a/server_addon/resolve/client/ayon_resolve/startup.py +++ b/server_addon/resolve/client/ayon_resolve/startup.py @@ -11,7 +11,7 @@ This code runs in a separate process to the main Resolve process. """ import os from ayon_core.lib import Logger -import ayon_core.hosts.resolve.api +import ayon_resolve.api log = Logger.get_logger(__name__) @@ -27,7 +27,7 @@ def ensure_installed_host(): if host: return host - host = ayon_core.hosts.resolve.api.ResolveHost() + host = ayon_resolve.api.ResolveHost() install_host(host) return registered_host() @@ -35,7 +35,7 @@ def ensure_installed_host(): def launch_menu(): print("Launching Resolve AYON menu..") ensure_installed_host() - ayon_core.hosts.resolve.api.launch_ayon_menu() + ayon_resolve.api.launch_ayon_menu() def open_workfile(path): diff --git a/server_addon/resolve/client/ayon_resolve/utility_scripts/AYON__Menu.py b/server_addon/resolve/client/ayon_resolve/utility_scripts/AYON__Menu.py index b10b477beb..670544d605 100644 --- a/server_addon/resolve/client/ayon_resolve/utility_scripts/AYON__Menu.py +++ b/server_addon/resolve/client/ayon_resolve/utility_scripts/AYON__Menu.py @@ -8,7 +8,7 @@ log = Logger.get_logger(__name__) def main(env): - from ayon_core.hosts.resolve.api import ResolveHost, launch_ayon_menu + from ayon_resolve.api import ResolveHost, launch_ayon_menu # activate resolve from openpype host = ResolveHost() diff --git a/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OTIO_export.py b/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OTIO_export.py index c1c83eb060..4572d1354d 100644 --- a/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OTIO_export.py +++ b/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OTIO_export.py @@ -1,6 +1,6 @@ #!/usr/bin/env python import os -from ayon_core.hosts.resolve.otio import davinci_export as otio_export +from ayon_resolve.otio import davinci_export as otio_export resolve = bmd.scriptapp("Resolve") # noqa fu = resolve.Fusion() diff --git a/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OTIO_import.py b/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OTIO_import.py index 5bbdd73402..17de1b6fc3 100644 --- a/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OTIO_import.py +++ b/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OTIO_import.py @@ -1,6 +1,6 @@ #!/usr/bin/env python import os -from ayon_core.hosts.resolve.otio import davinci_import as otio_import +from ayon_resolve.otio import davinci_import as otio_import resolve = bmd.scriptapp("Resolve") # noqa fu = resolve.Fusion() diff --git a/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OpenPype_sync_util_scripts.py b/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OpenPype_sync_util_scripts.py index c394238860..5a069aff9e 100644 --- a/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OpenPype_sync_util_scripts.py +++ b/server_addon/resolve/client/ayon_resolve/utility_scripts/develop/OpenPype_sync_util_scripts.py @@ -6,8 +6,8 @@ from ayon_core.pipeline import install_host def main(env): - from ayon_core.hosts.resolve.utils import setup - import ayon_core.hosts.resolve.api as bmdvr + from ayon_resolve.utils import setup + import ayon_resolve.api as bmdvr # Registers openpype's Global pyblish plugins install_host(bmdvr) setup(env) diff --git a/server_addon/resolve/client/ayon_resolve/utils.py b/server_addon/resolve/client/ayon_resolve/utils.py index 4ef6ea4f40..d256fda18d 100644 --- a/server_addon/resolve/client/ayon_resolve/utils.py +++ b/server_addon/resolve/client/ayon_resolve/utils.py @@ -2,7 +2,7 @@ import os import shutil from ayon_core.lib import Logger, is_running_from_build -RESOLVE_ROOT_DIR = os.path.dirname(os.path.abspath(__file__)) +RESOLVE_ADDON_ROOT = os.path.dirname(os.path.abspath(__file__)) def setup(env): @@ -12,7 +12,7 @@ def setup(env): util_scripts_dir = env["RESOLVE_UTILITY_SCRIPTS_DIR"] util_scripts_paths = [os.path.join( - RESOLVE_ROOT_DIR, + RESOLVE_ADDON_ROOT, "utility_scripts" )] diff --git a/server_addon/resolve/client/ayon_resolve/version.py b/server_addon/resolve/client/ayon_resolve/version.py new file mode 100644 index 0000000000..c8f8df554c --- /dev/null +++ b/server_addon/resolve/client/ayon_resolve/version.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +"""Package declaring AYON addon 'resolve' version.""" +__version__ = "0.2.0" From 7da9638a2a11f6732d4eee6718d2a754fcc7d10d Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Thu, 30 May 2024 17:37:28 +0200 Subject: [PATCH 58/67] added resolve milestone --- client/ayon_core/addon/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index fcd41c5f7d..a5d1db4058 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -59,6 +59,7 @@ MOVED_ADDON_MILESTONE_VERSIONS = { "tvpaint": VersionInfo(0, 2, 0), "maya": VersionInfo(0, 2, 0), "nuke": VersionInfo(0, 2, 0), + "resolve": VersionInfo(0, 2, 0), "substancepainter": VersionInfo(0, 2, 0), } From 4996c184800b91b5f3cf313b930d4fd685f7e232 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 10:15:19 +0200 Subject: [PATCH 59/67] moved photoshop clinet next to server codebase --- .../photoshop/client/ayon_photoshop}/__init__.py | 0 .../photoshop/client/ayon_photoshop}/addon.py | 0 .../photoshop/client/ayon_photoshop}/api/README.md | 0 .../client/ayon_photoshop}/api/__init__.py | 0 .../client/ayon_photoshop}/api/extension.zxp | Bin .../client/ayon_photoshop}/api/extension/.debug | 0 .../ayon_photoshop}/api/extension/CSXS/manifest.xml | 0 .../api/extension/client/CSInterface.js | 0 .../ayon_photoshop}/api/extension/client/client.js | 0 .../api/extension/client/loglevel.min.js | 0 .../ayon_photoshop}/api/extension/client/wsrpc.js | 0 .../api/extension/client/wsrpc.min.js | 0 .../ayon_photoshop}/api/extension/host/JSX.js | 0 .../ayon_photoshop}/api/extension/host/index.jsx | 0 .../ayon_photoshop}/api/extension/host/json.js | 0 .../api/extension/icons/ayon_logo.png | Bin .../client/ayon_photoshop}/api/extension/index.html | 0 .../client/ayon_photoshop}/api/launch_logic.py | 0 .../client/ayon_photoshop}/api/launch_script.py | 0 .../photoshop/client/ayon_photoshop}/api/lib.py | 0 .../photoshop/client/ayon_photoshop}/api/panel.png | Bin .../client/ayon_photoshop}/api/panel_failure.png | Bin .../client/ayon_photoshop}/api/pipeline.py | 0 .../photoshop/client/ayon_photoshop}/api/plugin.py | 0 .../photoshop/client/ayon_photoshop}/api/ws_stub.py | 0 .../client/ayon_photoshop}/hooks/pre_launch_args.py | 0 .../photoshop/client/ayon_photoshop}/lib.py | 0 .../plugins/create/create_flatten_image.py | 0 .../ayon_photoshop}/plugins/create/create_image.py | 0 .../ayon_photoshop}/plugins/create/create_review.py | 0 .../plugins/create/create_workfile.py | 0 .../ayon_photoshop}/plugins/load/load_image.py | 0 .../plugins/load/load_image_from_sequence.py | 0 .../ayon_photoshop}/plugins/load/load_reference.py | 0 .../ayon_photoshop}/plugins/publish/closePS.py | 0 .../plugins/publish/collect_auto_image.py | 0 .../plugins/publish/collect_auto_image_refresh.py | 0 .../plugins/publish/collect_auto_review.py | 0 .../plugins/publish/collect_auto_workfile.py | 0 .../plugins/publish/collect_batch_data.py | 0 .../publish/collect_color_coded_instances.py | 0 .../plugins/publish/collect_current_file.py | 0 .../plugins/publish/collect_extension_version.py | 0 .../plugins/publish/collect_image.py | 0 .../plugins/publish/collect_published_version.py | 0 .../plugins/publish/collect_review.py | 0 .../plugins/publish/collect_version.py | 0 .../plugins/publish/collect_workfile.py | 0 .../plugins/publish/extract_image.py | 0 .../plugins/publish/extract_review.py | 0 .../plugins/publish/extract_save_scene.py | 0 .../publish/help/validate_instance_asset.xml | 0 .../plugins/publish/help/validate_naming.xml | 0 .../plugins/publish/increment_workfile.py | 0 .../plugins/publish/validate_instance_asset.py | 0 .../plugins/publish/validate_naming.py | 0 .../client/ayon_photoshop}/resources/template.psd | Bin 57 files changed, 0 insertions(+), 0 deletions(-) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/__init__.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/addon.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/README.md (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/__init__.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension.zxp (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension/.debug (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension/CSXS/manifest.xml (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension/client/CSInterface.js (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension/client/client.js (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension/client/loglevel.min.js (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension/client/wsrpc.js (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension/client/wsrpc.min.js (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension/host/JSX.js (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension/host/index.jsx (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension/host/json.js (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension/icons/ayon_logo.png (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/extension/index.html (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/launch_logic.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/launch_script.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/lib.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/panel.png (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/panel_failure.png (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/pipeline.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/plugin.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/api/ws_stub.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/hooks/pre_launch_args.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/lib.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/create/create_flatten_image.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/create/create_image.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/create/create_review.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/create/create_workfile.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/load/load_image.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/load/load_image_from_sequence.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/load/load_reference.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/closePS.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_auto_image.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_auto_image_refresh.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_auto_review.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_auto_workfile.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_batch_data.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_color_coded_instances.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_current_file.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_extension_version.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_image.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_published_version.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_review.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_version.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/collect_workfile.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/extract_image.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/extract_review.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/extract_save_scene.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/help/validate_instance_asset.xml (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/help/validate_naming.xml (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/increment_workfile.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/validate_instance_asset.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/plugins/publish/validate_naming.py (100%) rename {client/ayon_core/hosts/photoshop => server_addon/photoshop/client/ayon_photoshop}/resources/template.psd (100%) diff --git a/client/ayon_core/hosts/photoshop/__init__.py b/server_addon/photoshop/client/ayon_photoshop/__init__.py similarity index 100% rename from client/ayon_core/hosts/photoshop/__init__.py rename to server_addon/photoshop/client/ayon_photoshop/__init__.py diff --git a/client/ayon_core/hosts/photoshop/addon.py b/server_addon/photoshop/client/ayon_photoshop/addon.py similarity index 100% rename from client/ayon_core/hosts/photoshop/addon.py rename to server_addon/photoshop/client/ayon_photoshop/addon.py diff --git a/client/ayon_core/hosts/photoshop/api/README.md b/server_addon/photoshop/client/ayon_photoshop/api/README.md similarity index 100% rename from client/ayon_core/hosts/photoshop/api/README.md rename to server_addon/photoshop/client/ayon_photoshop/api/README.md diff --git a/client/ayon_core/hosts/photoshop/api/__init__.py b/server_addon/photoshop/client/ayon_photoshop/api/__init__.py similarity index 100% rename from client/ayon_core/hosts/photoshop/api/__init__.py rename to server_addon/photoshop/client/ayon_photoshop/api/__init__.py diff --git a/client/ayon_core/hosts/photoshop/api/extension.zxp b/server_addon/photoshop/client/ayon_photoshop/api/extension.zxp similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension.zxp rename to server_addon/photoshop/client/ayon_photoshop/api/extension.zxp diff --git a/client/ayon_core/hosts/photoshop/api/extension/.debug b/server_addon/photoshop/client/ayon_photoshop/api/extension/.debug similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension/.debug rename to server_addon/photoshop/client/ayon_photoshop/api/extension/.debug diff --git a/client/ayon_core/hosts/photoshop/api/extension/CSXS/manifest.xml b/server_addon/photoshop/client/ayon_photoshop/api/extension/CSXS/manifest.xml similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension/CSXS/manifest.xml rename to server_addon/photoshop/client/ayon_photoshop/api/extension/CSXS/manifest.xml diff --git a/client/ayon_core/hosts/photoshop/api/extension/client/CSInterface.js b/server_addon/photoshop/client/ayon_photoshop/api/extension/client/CSInterface.js similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension/client/CSInterface.js rename to server_addon/photoshop/client/ayon_photoshop/api/extension/client/CSInterface.js diff --git a/client/ayon_core/hosts/photoshop/api/extension/client/client.js b/server_addon/photoshop/client/ayon_photoshop/api/extension/client/client.js similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension/client/client.js rename to server_addon/photoshop/client/ayon_photoshop/api/extension/client/client.js diff --git a/client/ayon_core/hosts/photoshop/api/extension/client/loglevel.min.js b/server_addon/photoshop/client/ayon_photoshop/api/extension/client/loglevel.min.js similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension/client/loglevel.min.js rename to server_addon/photoshop/client/ayon_photoshop/api/extension/client/loglevel.min.js diff --git a/client/ayon_core/hosts/photoshop/api/extension/client/wsrpc.js b/server_addon/photoshop/client/ayon_photoshop/api/extension/client/wsrpc.js similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension/client/wsrpc.js rename to server_addon/photoshop/client/ayon_photoshop/api/extension/client/wsrpc.js diff --git a/client/ayon_core/hosts/photoshop/api/extension/client/wsrpc.min.js b/server_addon/photoshop/client/ayon_photoshop/api/extension/client/wsrpc.min.js similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension/client/wsrpc.min.js rename to server_addon/photoshop/client/ayon_photoshop/api/extension/client/wsrpc.min.js diff --git a/client/ayon_core/hosts/photoshop/api/extension/host/JSX.js b/server_addon/photoshop/client/ayon_photoshop/api/extension/host/JSX.js similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension/host/JSX.js rename to server_addon/photoshop/client/ayon_photoshop/api/extension/host/JSX.js diff --git a/client/ayon_core/hosts/photoshop/api/extension/host/index.jsx b/server_addon/photoshop/client/ayon_photoshop/api/extension/host/index.jsx similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension/host/index.jsx rename to server_addon/photoshop/client/ayon_photoshop/api/extension/host/index.jsx diff --git a/client/ayon_core/hosts/photoshop/api/extension/host/json.js b/server_addon/photoshop/client/ayon_photoshop/api/extension/host/json.js similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension/host/json.js rename to server_addon/photoshop/client/ayon_photoshop/api/extension/host/json.js diff --git a/client/ayon_core/hosts/photoshop/api/extension/icons/ayon_logo.png b/server_addon/photoshop/client/ayon_photoshop/api/extension/icons/ayon_logo.png similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension/icons/ayon_logo.png rename to server_addon/photoshop/client/ayon_photoshop/api/extension/icons/ayon_logo.png diff --git a/client/ayon_core/hosts/photoshop/api/extension/index.html b/server_addon/photoshop/client/ayon_photoshop/api/extension/index.html similarity index 100% rename from client/ayon_core/hosts/photoshop/api/extension/index.html rename to server_addon/photoshop/client/ayon_photoshop/api/extension/index.html diff --git a/client/ayon_core/hosts/photoshop/api/launch_logic.py b/server_addon/photoshop/client/ayon_photoshop/api/launch_logic.py similarity index 100% rename from client/ayon_core/hosts/photoshop/api/launch_logic.py rename to server_addon/photoshop/client/ayon_photoshop/api/launch_logic.py diff --git a/client/ayon_core/hosts/photoshop/api/launch_script.py b/server_addon/photoshop/client/ayon_photoshop/api/launch_script.py similarity index 100% rename from client/ayon_core/hosts/photoshop/api/launch_script.py rename to server_addon/photoshop/client/ayon_photoshop/api/launch_script.py diff --git a/client/ayon_core/hosts/photoshop/api/lib.py b/server_addon/photoshop/client/ayon_photoshop/api/lib.py similarity index 100% rename from client/ayon_core/hosts/photoshop/api/lib.py rename to server_addon/photoshop/client/ayon_photoshop/api/lib.py diff --git a/client/ayon_core/hosts/photoshop/api/panel.png b/server_addon/photoshop/client/ayon_photoshop/api/panel.png similarity index 100% rename from client/ayon_core/hosts/photoshop/api/panel.png rename to server_addon/photoshop/client/ayon_photoshop/api/panel.png diff --git a/client/ayon_core/hosts/photoshop/api/panel_failure.png b/server_addon/photoshop/client/ayon_photoshop/api/panel_failure.png similarity index 100% rename from client/ayon_core/hosts/photoshop/api/panel_failure.png rename to server_addon/photoshop/client/ayon_photoshop/api/panel_failure.png diff --git a/client/ayon_core/hosts/photoshop/api/pipeline.py b/server_addon/photoshop/client/ayon_photoshop/api/pipeline.py similarity index 100% rename from client/ayon_core/hosts/photoshop/api/pipeline.py rename to server_addon/photoshop/client/ayon_photoshop/api/pipeline.py diff --git a/client/ayon_core/hosts/photoshop/api/plugin.py b/server_addon/photoshop/client/ayon_photoshop/api/plugin.py similarity index 100% rename from client/ayon_core/hosts/photoshop/api/plugin.py rename to server_addon/photoshop/client/ayon_photoshop/api/plugin.py diff --git a/client/ayon_core/hosts/photoshop/api/ws_stub.py b/server_addon/photoshop/client/ayon_photoshop/api/ws_stub.py similarity index 100% rename from client/ayon_core/hosts/photoshop/api/ws_stub.py rename to server_addon/photoshop/client/ayon_photoshop/api/ws_stub.py diff --git a/client/ayon_core/hosts/photoshop/hooks/pre_launch_args.py b/server_addon/photoshop/client/ayon_photoshop/hooks/pre_launch_args.py similarity index 100% rename from client/ayon_core/hosts/photoshop/hooks/pre_launch_args.py rename to server_addon/photoshop/client/ayon_photoshop/hooks/pre_launch_args.py diff --git a/client/ayon_core/hosts/photoshop/lib.py b/server_addon/photoshop/client/ayon_photoshop/lib.py similarity index 100% rename from client/ayon_core/hosts/photoshop/lib.py rename to server_addon/photoshop/client/ayon_photoshop/lib.py diff --git a/client/ayon_core/hosts/photoshop/plugins/create/create_flatten_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_flatten_image.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/create/create_flatten_image.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/create/create_flatten_image.py diff --git a/client/ayon_core/hosts/photoshop/plugins/create/create_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_image.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/create/create_image.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/create/create_image.py diff --git a/client/ayon_core/hosts/photoshop/plugins/create/create_review.py b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_review.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/create/create_review.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/create/create_review.py diff --git a/client/ayon_core/hosts/photoshop/plugins/create/create_workfile.py b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_workfile.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/create/create_workfile.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/create/create_workfile.py diff --git a/client/ayon_core/hosts/photoshop/plugins/load/load_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/load/load_image.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image.py diff --git a/client/ayon_core/hosts/photoshop/plugins/load/load_image_from_sequence.py b/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image_from_sequence.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/load/load_image_from_sequence.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image_from_sequence.py diff --git a/client/ayon_core/hosts/photoshop/plugins/load/load_reference.py b/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_reference.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/load/load_reference.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/load/load_reference.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/closePS.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/closePS.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/closePS.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/closePS.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_auto_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_auto_image.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_auto_image_refresh.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image_refresh.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_auto_image_refresh.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image_refresh.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_auto_review.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_review.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_auto_review.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_review.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_auto_workfile.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_workfile.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_auto_workfile.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_workfile.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_batch_data.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_batch_data.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_batch_data.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_batch_data.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_color_coded_instances.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_color_coded_instances.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_color_coded_instances.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_color_coded_instances.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_current_file.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_current_file.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_current_file.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_current_file.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_extension_version.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_extension_version.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_extension_version.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_extension_version.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_image.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_image.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_image.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_published_version.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_published_version.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_published_version.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_published_version.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_review.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_review.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_review.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_review.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_version.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_version.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_version.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_version.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/collect_workfile.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_workfile.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/collect_workfile.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_workfile.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/extract_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_image.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/extract_image.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_image.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/extract_review.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_review.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/extract_review.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_review.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/extract_save_scene.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_save_scene.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/extract_save_scene.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_save_scene.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/help/validate_instance_asset.xml b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/help/validate_instance_asset.xml similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/help/validate_instance_asset.xml rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/help/validate_instance_asset.xml diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/help/validate_naming.xml b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/help/validate_naming.xml similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/help/validate_naming.xml rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/help/validate_naming.xml diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/increment_workfile.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/increment_workfile.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/increment_workfile.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/increment_workfile.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/validate_instance_asset.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_instance_asset.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/validate_instance_asset.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_instance_asset.py diff --git a/client/ayon_core/hosts/photoshop/plugins/publish/validate_naming.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_naming.py similarity index 100% rename from client/ayon_core/hosts/photoshop/plugins/publish/validate_naming.py rename to server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_naming.py diff --git a/client/ayon_core/hosts/photoshop/resources/template.psd b/server_addon/photoshop/client/ayon_photoshop/resources/template.psd similarity index 100% rename from client/ayon_core/hosts/photoshop/resources/template.psd rename to server_addon/photoshop/client/ayon_photoshop/resources/template.psd From 3cb36982ce3f09258bef71cc4997c65f2448134f Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 10:21:25 +0200 Subject: [PATCH 60/67] fixed imports --- server_addon/photoshop/client/ayon_photoshop/api/README.md | 2 +- .../photoshop/client/ayon_photoshop/api/launch_script.py | 2 +- server_addon/photoshop/client/ayon_photoshop/api/lib.py | 2 +- .../photoshop/client/ayon_photoshop/api/pipeline.py | 2 +- server_addon/photoshop/client/ayon_photoshop/lib.py | 4 ++-- .../ayon_photoshop/plugins/create/create_flatten_image.py | 4 ++-- .../client/ayon_photoshop/plugins/create/create_image.py | 6 +++--- .../client/ayon_photoshop/plugins/create/create_review.py | 2 +- .../client/ayon_photoshop/plugins/create/create_workfile.py | 2 +- .../client/ayon_photoshop/plugins/load/load_image.py | 4 ++-- .../ayon_photoshop/plugins/load/load_image_from_sequence.py | 4 ++-- .../client/ayon_photoshop/plugins/load/load_reference.py | 4 ++-- .../client/ayon_photoshop/plugins/publish/closePS.py | 2 +- .../ayon_photoshop/plugins/publish/collect_auto_image.py | 2 +- .../plugins/publish/collect_auto_image_refresh.py | 2 +- .../ayon_photoshop/plugins/publish/collect_auto_review.py | 2 +- .../ayon_photoshop/plugins/publish/collect_auto_workfile.py | 2 +- .../plugins/publish/collect_color_coded_instances.py | 2 +- .../ayon_photoshop/plugins/publish/collect_current_file.py | 2 +- .../plugins/publish/collect_extension_version.py | 2 +- .../client/ayon_photoshop/plugins/publish/collect_image.py | 2 +- .../client/ayon_photoshop/plugins/publish/extract_image.py | 2 +- .../client/ayon_photoshop/plugins/publish/extract_review.py | 2 +- .../ayon_photoshop/plugins/publish/extract_save_scene.py | 2 +- .../ayon_photoshop/plugins/publish/increment_workfile.py | 2 +- .../plugins/publish/validate_instance_asset.py | 2 +- .../ayon_photoshop/plugins/publish/validate_naming.py | 2 +- 27 files changed, 34 insertions(+), 34 deletions(-) diff --git a/server_addon/photoshop/client/ayon_photoshop/api/README.md b/server_addon/photoshop/client/ayon_photoshop/api/README.md index b391131a42..41a26de70a 100644 --- a/server_addon/photoshop/client/ayon_photoshop/api/README.md +++ b/server_addon/photoshop/client/ayon_photoshop/api/README.md @@ -128,7 +128,7 @@ class CollectInstances(pyblish.api.ContextPlugin): import os from ayon_core.pipeline import publish -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop class ExtractImage(publish.Extractor): diff --git a/server_addon/photoshop/client/ayon_photoshop/api/launch_script.py b/server_addon/photoshop/client/ayon_photoshop/api/launch_script.py index bb4de80086..de7fc8ba48 100644 --- a/server_addon/photoshop/client/ayon_photoshop/api/launch_script.py +++ b/server_addon/photoshop/client/ayon_photoshop/api/launch_script.py @@ -8,7 +8,7 @@ workfile or others. import os import sys -from ayon_core.hosts.photoshop.api.lib import main as host_main +from ayon_photoshop.api.lib import main as host_main # Get current file to locate start point of sys.argv CURRENT_FILE = os.path.abspath(__file__) diff --git a/server_addon/photoshop/client/ayon_photoshop/api/lib.py b/server_addon/photoshop/client/ayon_photoshop/api/lib.py index af14e6d02f..fd003919ce 100644 --- a/server_addon/photoshop/client/ayon_photoshop/api/lib.py +++ b/server_addon/photoshop/client/ayon_photoshop/api/lib.py @@ -19,7 +19,7 @@ def safe_excepthook(*args): def main(*subprocess_args): - from ayon_core.hosts.photoshop.api import PhotoshopHost + from ayon_photoshop.api import PhotoshopHost host = PhotoshopHost() install_host(host) diff --git a/server_addon/photoshop/client/ayon_photoshop/api/pipeline.py b/server_addon/photoshop/client/ayon_photoshop/api/pipeline.py index 27cfa5a7b5..d399bb25e2 100644 --- a/server_addon/photoshop/client/ayon_photoshop/api/pipeline.py +++ b/server_addon/photoshop/client/ayon_photoshop/api/pipeline.py @@ -21,8 +21,8 @@ from ayon_core.host import ( ) from ayon_core.pipeline.load import any_outdated_containers -from ayon_core.hosts.photoshop import PHOTOSHOP_ADDON_ROOT from ayon_core.tools.utils import get_ayon_qt_app +from ayon_photoshop import PHOTOSHOP_ADDON_ROOT from . import lib diff --git a/server_addon/photoshop/client/ayon_photoshop/lib.py b/server_addon/photoshop/client/ayon_photoshop/lib.py index dd227c5d81..9dc90953c5 100644 --- a/server_addon/photoshop/client/ayon_photoshop/lib.py +++ b/server_addon/photoshop/client/ayon_photoshop/lib.py @@ -2,13 +2,13 @@ import re import ayon_api -import ayon_core.hosts.photoshop.api as api from ayon_core.lib import prepare_template_data from ayon_core.pipeline import ( AutoCreator, CreatedInstance ) -from ayon_core.hosts.photoshop.api.pipeline import cache_and_get_instances +from ayon_photoshop import api +from ayon_photoshop.api.pipeline import cache_and_get_instances class PSAutoCreator(AutoCreator): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_flatten_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_flatten_image.py index a3bc77c640..a467a5ecaa 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_flatten_image.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_flatten_image.py @@ -1,7 +1,7 @@ import ayon_api -import ayon_core.hosts.photoshop.api as api -from ayon_core.hosts.photoshop.lib import PSAutoCreator, clean_product_name +from ayon_photoshop import api +from ayon_photoshop.lib import PSAutoCreator, clean_product_name from ayon_core.lib import BoolDef, prepare_template_data from ayon_core.pipeline.create import get_product_name, CreatedInstance diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_image.py index a44c3490c6..0170306301 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_image.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_image.py @@ -1,6 +1,5 @@ import re -from ayon_core.hosts.photoshop import api from ayon_core.lib import BoolDef from ayon_core.pipeline import ( Creator, @@ -9,8 +8,9 @@ from ayon_core.pipeline import ( ) from ayon_core.lib import prepare_template_data from ayon_core.pipeline.create import PRODUCT_NAME_ALLOWED_SYMBOLS -from ayon_core.hosts.photoshop.api.pipeline import cache_and_get_instances -from ayon_core.hosts.photoshop.lib import clean_product_name +from ayon_photoshop import api +from ayon_photoshop.api.pipeline import cache_and_get_instances +from ayon_photoshop.lib import clean_product_name class ImageCreator(Creator): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_review.py b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_review.py index 229b736801..60c64b3831 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_review.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_review.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.photoshop.lib import PSAutoCreator +from ayon_photoshop.lib import PSAutoCreator class ReviewCreator(PSAutoCreator): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_workfile.py b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_workfile.py index da0c9d1d12..ce44a1ad2d 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_workfile.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/create/create_workfile.py @@ -1,4 +1,4 @@ -from ayon_core.hosts.photoshop.lib import PSAutoCreator +from ayon_photoshop.lib import PSAutoCreator class WorkfileCreator(PSAutoCreator): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image.py index d71067615e..e3d80f6957 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image.py @@ -1,8 +1,8 @@ import re from ayon_core.pipeline import get_representation_path -from ayon_core.hosts.photoshop import api as photoshop -from ayon_core.hosts.photoshop.api import get_unique_layer_name +from ayon_photoshop import api as photoshop +from ayon_photoshop.api import get_unique_layer_name class ImageLoader(photoshop.PhotoshopLoader): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image_from_sequence.py b/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image_from_sequence.py index dd14543f3e..f69dce26f6 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image_from_sequence.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_image_from_sequence.py @@ -2,8 +2,8 @@ import os import qargparse -from ayon_core.hosts.photoshop import api as photoshop -from ayon_core.hosts.photoshop.api import get_unique_layer_name +from ayon_photoshop import api as photoshop +from ayon_photoshop.api import get_unique_layer_name class ImageFromSequenceLoader(photoshop.PhotoshopLoader): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_reference.py b/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_reference.py index b563faff82..21076f6a4f 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_reference.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/load/load_reference.py @@ -1,8 +1,8 @@ import re from ayon_core.pipeline import get_representation_path -from ayon_core.hosts.photoshop import api as photoshop -from ayon_core.hosts.photoshop.api import get_unique_layer_name +from ayon_photoshop import api as photoshop +from ayon_photoshop.api import get_unique_layer_name class ReferenceLoader(photoshop.PhotoshopLoader): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/closePS.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/closePS.py index 68c3b5b249..2cdc9fa1e8 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/closePS.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/closePS.py @@ -2,7 +2,7 @@ """Close PS after publish. For Webpublishing only.""" import pyblish.api -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop class ClosePS(pyblish.api.ContextPlugin): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image.py index adbe02eb74..23a71bdf46 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image.py @@ -1,6 +1,6 @@ import pyblish.api -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop from ayon_core.pipeline.create import get_product_name diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image_refresh.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image_refresh.py index 7a5f297c89..108b65232a 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image_refresh.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_image_refresh.py @@ -1,6 +1,6 @@ import pyblish.api -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop class CollectAutoImageRefresh(pyblish.api.ContextPlugin): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_review.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_review.py index d7267d253a..8b84e69309 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_review.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_review.py @@ -7,7 +7,7 @@ Provides: """ import pyblish.api -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop from ayon_core.pipeline.create import get_product_name diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_workfile.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_workfile.py index af74c76a15..1bf7c1a600 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_workfile.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_auto_workfile.py @@ -1,7 +1,7 @@ import os import pyblish.api -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop from ayon_core.pipeline.create import get_product_name diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_color_coded_instances.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_color_coded_instances.py index e8f7c7e3df..52df60dd8a 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_color_coded_instances.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_color_coded_instances.py @@ -4,8 +4,8 @@ import re import pyblish.api from ayon_core.lib import prepare_template_data, is_in_tests -from ayon_core.hosts.photoshop import api as photoshop from ayon_core.settings import get_project_settings +from ayon_photoshop import api as photoshop class CollectColorCodedInstances(pyblish.api.ContextPlugin): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_current_file.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_current_file.py index 74353d452f..02f2217f75 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_current_file.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_current_file.py @@ -2,7 +2,7 @@ import os import pyblish.api -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop class CollectCurrentFile(pyblish.api.ContextPlugin): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_extension_version.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_extension_version.py index 2d24a8de15..90415e9245 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_extension_version.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_extension_version.py @@ -2,7 +2,7 @@ import os import re import pyblish.api -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop class CollectExtensionVersion(pyblish.api.ContextPlugin): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_image.py index bfd73bfc5f..ed6af6f7d3 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_image.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/collect_image.py @@ -1,6 +1,6 @@ import pyblish.api -from ayon_core.hosts.photoshop import api +from ayon_photoshop import api class CollectImage(pyblish.api.InstancePlugin): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_image.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_image.py index 7290a1437e..0d8824af2d 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_image.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_image.py @@ -2,7 +2,7 @@ import os import pyblish.api from ayon_core.pipeline import publish -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop class ExtractImage(pyblish.api.ContextPlugin): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_review.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_review.py index 3497e7ad75..11bb47a886 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_review.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_review.py @@ -7,7 +7,7 @@ from ayon_core.lib import ( get_ffmpeg_tool_args, ) from ayon_core.pipeline import publish -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop class ExtractReview(publish.Extractor): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_save_scene.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_save_scene.py index 962c0722db..22ebbb739d 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_save_scene.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/extract_save_scene.py @@ -1,5 +1,5 @@ from ayon_core.pipeline import publish -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop class ExtractSaveScene(publish.Extractor): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/increment_workfile.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/increment_workfile.py index 9b25a35ef5..b10645813a 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/increment_workfile.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/increment_workfile.py @@ -3,7 +3,7 @@ import pyblish.api from ayon_core.pipeline.publish import get_errored_plugins_from_context from ayon_core.lib import version_up -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop class IncrementWorkfile(pyblish.api.InstancePlugin): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_instance_asset.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_instance_asset.py index c3a6822f32..36ba621dc2 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_instance_asset.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_instance_asset.py @@ -6,7 +6,7 @@ from ayon_core.pipeline.publish import ( PublishXmlValidationError, OptionalPyblishPluginMixin ) -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop class ValidateInstanceFolderRepair(pyblish.api.Action): diff --git a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_naming.py b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_naming.py index 13c6a54fd2..2b5492d878 100644 --- a/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_naming.py +++ b/server_addon/photoshop/client/ayon_photoshop/plugins/publish/validate_naming.py @@ -2,7 +2,7 @@ import re import pyblish.api -from ayon_core.hosts.photoshop import api as photoshop +from ayon_photoshop import api as photoshop from ayon_core.pipeline.create import PRODUCT_NAME_ALLOWED_SYMBOLS from ayon_core.pipeline.publish import ( ValidateContentsOrder, From f744f915aea2f23b53805dc812574707682e1a7d Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 10:22:43 +0200 Subject: [PATCH 61/67] updated package.py --- server_addon/photoshop/package.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/server_addon/photoshop/package.py b/server_addon/photoshop/package.py index 22043f951c..3c57a9c79e 100644 --- a/server_addon/photoshop/package.py +++ b/server_addon/photoshop/package.py @@ -1,3 +1,10 @@ name = "photoshop" title = "Photoshop" -version = "0.1.3" +version = "0.2.0" + +client_dir = "ayon_photoshop" + +ayon_required_addons = { + "core": ">0.3.2", +} +ayon_compatible_addons = {} From 2683ed9670713d11d7be3117fcca2c9ab9443e82 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 10:22:53 +0200 Subject: [PATCH 62/67] added version.py to client --- server_addon/photoshop/client/ayon_photoshop/__init__.py | 3 +++ server_addon/photoshop/client/ayon_photoshop/addon.py | 4 +++- server_addon/photoshop/client/ayon_photoshop/version.py | 3 +++ 3 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 server_addon/photoshop/client/ayon_photoshop/version.py diff --git a/server_addon/photoshop/client/ayon_photoshop/__init__.py b/server_addon/photoshop/client/ayon_photoshop/__init__.py index cf21b7df75..e72c79c812 100644 --- a/server_addon/photoshop/client/ayon_photoshop/__init__.py +++ b/server_addon/photoshop/client/ayon_photoshop/__init__.py @@ -1,3 +1,4 @@ +from .version import __version__ from .addon import ( PHOTOSHOP_ADDON_ROOT, PhotoshopAddon, @@ -6,6 +7,8 @@ from .addon import ( __all__ = ( + "__version__", + "PHOTOSHOP_ADDON_ROOT", "PhotoshopAddon", "get_launch_script_path", diff --git a/server_addon/photoshop/client/ayon_photoshop/addon.py b/server_addon/photoshop/client/ayon_photoshop/addon.py index 65fe6a7cd1..d0fe638f15 100644 --- a/server_addon/photoshop/client/ayon_photoshop/addon.py +++ b/server_addon/photoshop/client/ayon_photoshop/addon.py @@ -1,11 +1,14 @@ import os from ayon_core.addon import AYONAddon, IHostAddon +from .version import __version__ + PHOTOSHOP_ADDON_ROOT = os.path.dirname(os.path.abspath(__file__)) class PhotoshopAddon(AYONAddon, IHostAddon): name = "photoshop" + version = __version__ host_name = "photoshop" def add_implementation_envs(self, env, _app): @@ -33,4 +36,3 @@ def get_launch_script_path(): return os.path.join( PHOTOSHOP_ADDON_ROOT, "api", "launch_script.py" ) - diff --git a/server_addon/photoshop/client/ayon_photoshop/version.py b/server_addon/photoshop/client/ayon_photoshop/version.py new file mode 100644 index 0000000000..f04558d6c6 --- /dev/null +++ b/server_addon/photoshop/client/ayon_photoshop/version.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +"""Package declaring AYON addon 'photoshop' version.""" +__version__ = "0.2.0" From 6fb0b911161540aed4ca7f0b6acaabebd4311b60 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 10:23:45 +0200 Subject: [PATCH 63/67] added photoshop milestone --- client/ayon_core/addon/base.py | 1 + 1 file changed, 1 insertion(+) diff --git a/client/ayon_core/addon/base.py b/client/ayon_core/addon/base.py index fcd41c5f7d..18b2a5b0db 100644 --- a/client/ayon_core/addon/base.py +++ b/client/ayon_core/addon/base.py @@ -55,6 +55,7 @@ MOVED_ADDON_MILESTONE_VERSIONS = { "clockify": VersionInfo(0, 2, 0), "flame": VersionInfo(0, 2, 0), "max": VersionInfo(0, 2, 0), + "photoshop": VersionInfo(0, 2, 0), "traypublisher": VersionInfo(0, 2, 0), "tvpaint": VersionInfo(0, 2, 0), "maya": VersionInfo(0, 2, 0), From 11788c62c39d5525315c7882f683ea242e8d7ce6 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 10:28:49 +0200 Subject: [PATCH 64/67] moved webserver for communication to photoshop addon --- .../client/ayon_photoshop/api/launch_logic.py | 2 +- .../client/ayon_photoshop/api/webserver.py | 241 ++++++++++++++++++ .../client/ayon_photoshop/api/ws_stub.py | 2 +- server_addon/photoshop/client/pyproject.toml | 6 + 4 files changed, 249 insertions(+), 2 deletions(-) create mode 100644 server_addon/photoshop/client/ayon_photoshop/api/webserver.py create mode 100644 server_addon/photoshop/client/pyproject.toml diff --git a/server_addon/photoshop/client/ayon_photoshop/api/launch_logic.py b/server_addon/photoshop/client/ayon_photoshop/api/launch_logic.py index c388f93044..04401a0972 100644 --- a/server_addon/photoshop/client/ayon_photoshop/api/launch_logic.py +++ b/server_addon/photoshop/client/ayon_photoshop/api/launch_logic.py @@ -22,9 +22,9 @@ from ayon_core.pipeline.workfile import ( ) from ayon_core.pipeline.template_data import get_template_data_with_names from ayon_core.tools.utils import host_tools -from ayon_core.tools.adobe_webserver.app import WebServerTool from ayon_core.pipeline.context_tools import change_current_context +from .webserver import WebServerTool from .ws_stub import PhotoshopServerStub log = Logger.get_logger(__name__) diff --git a/server_addon/photoshop/client/ayon_photoshop/api/webserver.py b/server_addon/photoshop/client/ayon_photoshop/api/webserver.py new file mode 100644 index 0000000000..cd229c65ad --- /dev/null +++ b/server_addon/photoshop/client/ayon_photoshop/api/webserver.py @@ -0,0 +1,241 @@ +"""Webserver for communication with photoshop. + +Aiohttp (Asyncio) based websocket server used for communication with host +application. + +This webserver is started in spawned Python process that opens DCC during +its launch, waits for connection from DCC and handles communication going +forward. Server is closed before Python process is killed. +""" +import os +import logging +import urllib +import threading +import asyncio +import socket + +from aiohttp import web + +from wsrpc_aiohttp import WSRPCClient + +from ayon_core.pipeline import get_global_context + +log = logging.getLogger(__name__) + + +class WebServerTool: + """ + Basic POC implementation of asychronic websocket RPC server. + Uses class in external_app_1.py to mimic implementation for single + external application. + 'test_client' folder contains two test implementations of client + """ + _instance = None + + def __init__(self): + WebServerTool._instance = self + + self.client = None + self.handlers = {} + self.on_stop_callbacks = [] + + port = None + host_name = "localhost" + websocket_url = os.getenv("WEBSOCKET_URL") + if websocket_url: + parsed = urllib.parse.urlparse(websocket_url) + port = parsed.port + host_name = parsed.netloc.split(":")[0] + if not port: + port = 8098 # fallback + + self.port = port + self.host_name = host_name + + self.app = web.Application() + + # add route with multiple methods for single "external app" + self.webserver_thread = WebServerThread(self, self.port) + + def add_route(self, *args, **kwargs): + self.app.router.add_route(*args, **kwargs) + + def add_static(self, *args, **kwargs): + self.app.router.add_static(*args, **kwargs) + + def start_server(self): + if self.webserver_thread and not self.webserver_thread.is_alive(): + self.webserver_thread.start() + + def stop_server(self): + self.stop() + + async def send_context_change(self, host): + """ + Calls running webserver to inform about context change + + Used when new PS/AE should be triggered, + but one already running, without + this publish would point to old context. + """ + client = WSRPCClient(os.getenv("WEBSOCKET_URL"), + loop=asyncio.get_event_loop()) + await client.connect() + + context = get_global_context() + project_name = context["project_name"] + folder_path = context["folder_path"] + task_name = context["task_name"] + log.info("Sending context change to {}{}/{}".format( + project_name, folder_path, task_name + )) + + await client.call( + '{}.set_context'.format(host), + project=project_name, + folder=folder_path, + task=task_name + ) + await client.close() + + def port_occupied(self, host_name, port): + """ + Check if 'url' is already occupied. + + This could mean, that app is already running and we are trying open it + again. In that case, use existing running webserver. + Check here is easier than capturing exception from thread. + """ + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as con: + result = con.connect_ex((host_name, port)) == 0 + + if result: + print(f"Port {port} is already in use") + return result + + def call(self, func): + log.debug("websocket.call {}".format(func)) + future = asyncio.run_coroutine_threadsafe( + func, + self.webserver_thread.loop + ) + result = future.result() + return result + + @staticmethod + def get_instance(): + if WebServerTool._instance is None: + WebServerTool() + return WebServerTool._instance + + @property + def is_running(self): + if not self.webserver_thread: + return False + return self.webserver_thread.is_running + + def stop(self): + if not self.is_running: + return + try: + log.debug("Stopping websocket server") + self.webserver_thread.is_running = False + self.webserver_thread.stop() + except Exception: + log.warning( + "Error has happened during Killing websocket server", + exc_info=True + ) + + def thread_stopped(self): + for callback in self.on_stop_callbacks: + callback() + + +class WebServerThread(threading.Thread): + """ Listener for websocket rpc requests. + + It would be probably better to "attach" this to main thread (as for + example Harmony needs to run something on main thread), but currently + it creates separate thread and separate asyncio event loop + """ + def __init__(self, module, port): + super(WebServerThread, self).__init__() + + self.is_running = False + self.port = port + self.module = module + self.loop = None + self.runner = None + self.site = None + self.tasks = [] + + def run(self): + self.is_running = True + + try: + log.info("Starting web server") + self.loop = asyncio.new_event_loop() # create new loop for thread + asyncio.set_event_loop(self.loop) + + self.loop.run_until_complete(self.start_server()) + + websocket_url = "ws://localhost:{}/ws".format(self.port) + + log.debug( + "Running Websocket server on URL: \"{}\"".format(websocket_url) + ) + + asyncio.ensure_future(self.check_shutdown(), loop=self.loop) + self.loop.run_forever() + except Exception: + self.is_running = False + log.warning( + "Websocket Server service has failed", exc_info=True + ) + raise + finally: + self.loop.close() # optional + + self.is_running = False + self.module.thread_stopped() + log.info("Websocket server stopped") + + async def start_server(self): + """ Starts runner and TCPsite """ + self.runner = web.AppRunner(self.module.app) + await self.runner.setup() + self.site = web.TCPSite(self.runner, 'localhost', self.port) + await self.site.start() + + def stop(self): + """Sets is_running flag to false, 'check_shutdown' shuts server down""" + self.is_running = False + + async def check_shutdown(self): + """ Future that is running and checks if server should be running + periodically. + """ + while self.is_running: + while self.tasks: + task = self.tasks.pop(0) + log.debug("waiting for task {}".format(task)) + await task + log.debug("returned value {}".format(task.result)) + + await asyncio.sleep(0.5) + + log.debug("Starting shutdown") + await self.site.stop() + log.debug("Site stopped") + await self.runner.cleanup() + log.debug("Runner stopped") + tasks = [task for task in asyncio.all_tasks() if + task is not asyncio.current_task()] + list(map(lambda task: task.cancel(), tasks)) # cancel all the tasks + results = await asyncio.gather(*tasks, return_exceptions=True) + log.debug(f'Finished awaiting cancelled tasks, results: {results}...') + await self.loop.shutdown_asyncgens() + # to really make sure everything else has time to stop + await asyncio.sleep(0.07) + self.loop.stop() diff --git a/server_addon/photoshop/client/ayon_photoshop/api/ws_stub.py b/server_addon/photoshop/client/ayon_photoshop/api/ws_stub.py index 36fe0af2f8..3619fa4b7a 100644 --- a/server_addon/photoshop/client/ayon_photoshop/api/ws_stub.py +++ b/server_addon/photoshop/client/ayon_photoshop/api/ws_stub.py @@ -6,7 +6,7 @@ import json import attr from wsrpc_aiohttp import WebSocketAsync -from ayon_core.tools.adobe_webserver.app import WebServerTool +from .webserver import WebServerTool @attr.s diff --git a/server_addon/photoshop/client/pyproject.toml b/server_addon/photoshop/client/pyproject.toml new file mode 100644 index 0000000000..3beb76ba74 --- /dev/null +++ b/server_addon/photoshop/client/pyproject.toml @@ -0,0 +1,6 @@ +[project] +name="photoshop" +description="AYON Phostoshop addon." + +[ayon.runtimeDependencies] +wsrpc_aiohttp = "^3.1.1" # websocket server From 599f6202478e09aaac2b498a3c803b232ab35704 Mon Sep 17 00:00:00 2001 From: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> Date: Fri, 31 May 2024 11:13:46 +0200 Subject: [PATCH 65/67] fix invalid imports --- server_addon/photoshop/client/ayon_photoshop/api/README.md | 2 +- .../photoshop/client/ayon_photoshop/hooks/pre_launch_args.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server_addon/photoshop/client/ayon_photoshop/api/README.md b/server_addon/photoshop/client/ayon_photoshop/api/README.md index 41a26de70a..ef458dea16 100644 --- a/server_addon/photoshop/client/ayon_photoshop/api/README.md +++ b/server_addon/photoshop/client/ayon_photoshop/api/README.md @@ -17,7 +17,7 @@ ExManCmd /install {path to addon}/api/extension.zxp The easiest way to get the server and Photoshop launch is with: ``` -python -c ^"import ayon_core.hosts.photoshop;ayon_core.hosts.photoshop.launch(""C:\Program Files\Adobe\Adobe Photoshop 2020\Photoshop.exe"")^" +python -c ^"import ayon_photoshop;ayon_photoshop.launch(""C:\Program Files\Adobe\Adobe Photoshop 2020\Photoshop.exe"")^" ``` `avalon.photoshop.launch` launches the application and server, and also closes the server when Photoshop exists. diff --git a/server_addon/photoshop/client/ayon_photoshop/hooks/pre_launch_args.py b/server_addon/photoshop/client/ayon_photoshop/hooks/pre_launch_args.py index 70f8fc730f..ff60c2f40d 100644 --- a/server_addon/photoshop/client/ayon_photoshop/hooks/pre_launch_args.py +++ b/server_addon/photoshop/client/ayon_photoshop/hooks/pre_launch_args.py @@ -7,7 +7,7 @@ from ayon_core.lib import ( is_using_ayon_console, ) from ayon_applications import PreLaunchHook, LaunchTypes -from ayon_core.hosts.photoshop import get_launch_script_path +from ayon_photoshop import get_launch_script_path def get_launch_kwargs(kwargs): From 975a1b01422b56fe80f7b360a3d2aa61cace48f9 Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 31 May 2024 11:45:51 +0200 Subject: [PATCH 66/67] Fix import --- client/ayon_core/plugins/publish/validate_version.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/ayon_core/plugins/publish/validate_version.py b/client/ayon_core/plugins/publish/validate_version.py index c2f7d5bf44..f47b5e4d6f 100644 --- a/client/ayon_core/plugins/publish/validate_version.py +++ b/client/ayon_core/plugins/publish/validate_version.py @@ -3,9 +3,9 @@ import pyblish.api from ayon_core.lib import filter_profiles from ayon_core.pipeline.publish import ( PublishValidationError, - OptionalPyblishPluginMixin, - get_current_host_name, + OptionalPyblishPluginMixin ) +from ayon_core.pipeline.context_tools import get_current_host_name class ValidateVersion(pyblish.api.InstancePlugin, OptionalPyblishPluginMixin): From a83a4d1e29153a853748388947708ee39731c48c Mon Sep 17 00:00:00 2001 From: Roy Nieterau Date: Fri, 31 May 2024 11:56:48 +0200 Subject: [PATCH 67/67] Update client/ayon_core/plugins/publish/validate_version.py Co-authored-by: Jakub Trllo <43494761+iLLiCiTiT@users.noreply.github.com> --- client/ayon_core/plugins/publish/validate_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/ayon_core/plugins/publish/validate_version.py b/client/ayon_core/plugins/publish/validate_version.py index f47b5e4d6f..0359f8fb53 100644 --- a/client/ayon_core/plugins/publish/validate_version.py +++ b/client/ayon_core/plugins/publish/validate_version.py @@ -5,7 +5,7 @@ from ayon_core.pipeline.publish import ( PublishValidationError, OptionalPyblishPluginMixin ) -from ayon_core.pipeline.context_tools import get_current_host_name +from ayon_core.pipeline import get_current_host_name class ValidateVersion(pyblish.api.InstancePlugin, OptionalPyblishPluginMixin):