Skip to content
This repository has been archived by the owner on Sep 20, 2024. It is now read-only.

Photoshop: implemented {layer} placeholder in subset template #3591

53 changes: 53 additions & 0 deletions openpype/hosts/photoshop/api/plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@

from openpype.pipeline import LoaderPlugin
from .launch_logic import stub
from openpype.pipeline import legacy_io
from openpype.client import get_asset_by_name
from openpype.settings import get_project_settings
from openpype.lib import prepare_template_data
from openpype.lib.profiles_filtering import filter_profiles


def get_unique_layer_name(layers, asset_name, subset_name):
Expand Down Expand Up @@ -33,3 +38,51 @@ class PhotoshopLoader(LoaderPlugin):
@staticmethod
def get_stub():
return stub()


def get_subset_template(family):
"""Get subset template name from Settings"""
project_name = legacy_io.Session["AVALON_PROJECT"]
asset_name = legacy_io.Session["AVALON_ASSET"]
task_name = legacy_io.Session["AVALON_TASK"]

asset_doc = get_asset_by_name(
project_name, asset_name, fields=["data.tasks"]
)
asset_tasks = asset_doc.get("data", {}).get("tasks") or {}
task_info = asset_tasks.get(task_name) or {}
task_type = task_info.get("type")

tools_settings = get_project_settings(project_name)["global"]["tools"]
profiles = tools_settings["creator"]["subset_name_profiles"]
filtering_criteria = {
"families": family,
"hosts": "photoshop",
"tasks": task_name,
"task_types": task_type
}

matching_profile = filter_profiles(profiles, filtering_criteria)
if matching_profile:
return matching_profile["template"]


def get_subset_name_for_multiple(subset_name, subset_template, group,
family, variant):
"""Update subset name with layer information to differentiate multiple

subset_template might contain specific way how to format layer name
({layer},{Layer} or {LAYER}). If subset_template doesn't contain placeholder
at all, fall back to original solution.
"""
if not subset_template or 'layer' not in subset_template.lower():
subset_name += group.name.title().replace(" ", "")
else:
fill_pairs = {
"family": family,
"variant": variant,
"task": legacy_io.Session["AVALON_TASK"],
"layer": group.name
}

return subset_template.format(**prepare_template_data(fill_pairs))
37 changes: 29 additions & 8 deletions openpype/hosts/photoshop/plugins/create/create_image.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@
CreatedInstance,
legacy_io
)
from openpype.hosts.photoshop.api.plugin import (
get_subset_template,
get_subset_name_for_multiple
)


class ImageCreator(Creator):
Expand Down Expand Up @@ -38,17 +42,24 @@ def create(self, subset_name_from_ui, data, pre_create_data):
top_level_selected_items = stub.get_selected_layers()
if pre_create_data.get("use_selection"):
only_single_item_selected = len(top_level_selected_items) == 1
for selected_item in top_level_selected_items:
if (
only_single_item_selected or
pre_create_data.get("create_multiple")):
if (
only_single_item_selected or
pre_create_data.get("create_multiple")):
for selected_item in top_level_selected_items:
if selected_item.group:
groups_to_create.append(selected_item)
else:
top_layers_to_wrap.append(selected_item)
else:
group = stub.group_selected_layers(subset_name_from_ui)
groups_to_create.append(group)
else:
group = stub.group_selected_layers(subset_name_from_ui)
groups_to_create.append(group)
else:
stub.select_layers(stub.get_layers())
try:
group = stub.group_selected_layers(subset_name_from_ui)
except:
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do not use bare except:, it also catches unexpected events like memory errors, interrupts, system exit, and so on. Prefer except Exception:. If you're sure what you're doing, be explicit and write except BaseException:.
do not use bare 'except'

raise ValueError("Cannot group locked Bakcground layer!")
groups_to_create.append(group)

if not groups_to_create and not top_layers_to_wrap:
group = stub.create_group(subset_name_from_ui)
Expand All @@ -68,7 +79,12 @@ def create(self, subset_name_from_ui, data, pre_create_data):

if creating_multiple_groups:
# concatenate with layer name to differentiate subsets
subset_name += group.name.title().replace(" ", "")
subset_template = get_subset_template(self.family)
subset_name = get_subset_name_for_multiple(subset_name,
subset_template,
group,
self.family,
data["variant"])

if group.long_name:
for directory in group.long_name[::-1]:
Expand Down Expand Up @@ -143,3 +159,8 @@ def _handle_legacy(self, instance_data):
def _clean_highlights(self, stub, item):
return item.replace(stub.PUBLISH_ICON, '').replace(stub.LOADED_ICON,
'')
@classmethod
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

expected 1 blank line, found 0

def get_dynamic_data(
cls, variant, task_name, asset_id, project_name, host_name
):
return {"layer": ""}
18 changes: 17 additions & 1 deletion openpype/hosts/photoshop/plugins/create/create_legacy_image.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@
from openpype.pipeline import create
from openpype.hosts.photoshop import api as photoshop

from openpype.hosts.photoshop.api.plugin import (
get_subset_template,
get_subset_name_for_multiple
)


class CreateImage(create.LegacyCreator):
"""Image folder for publish."""
Expand Down Expand Up @@ -82,7 +87,12 @@ def process(self):

subset_name = creator_subset_name
if len(groups) > 1:
subset_name += group.name.title().replace(" ", "")
subset_template = get_subset_template(self.family)
subset_name = get_subset_name_for_multiple(subset_name,
subset_template,
group,
self.family,
self.data["variant"])

if group.long_name:
for directory in group.long_name[::-1]:
Expand All @@ -98,3 +108,9 @@ def process(self):
# reusing existing group, need to rename afterwards
if not create_group:
stub.rename_layer(group.id, stub.PUBLISH_ICON + group.name)

@classmethod
def get_dynamic_data(
cls, variant, task_name, asset_id, project_name, host_name
):
return {"layer": ""}