11import os
2+ from typing import TYPE_CHECKING
23
34import pyblish .api
45from ayon_core .pipeline import publish
56from ayon_core .pipeline .colorspace import get_remapped_colorspace_from_native
67from ayon_photoshop import api as photoshop
8+ if TYPE_CHECKING :
9+ from ayon_core .pipeline import CreateContext , CreatedInstance
710
811
912class ExtractImage (
1013 pyblish .api .ContextPlugin ,
11- publish .ColormanagedPyblishPluginMixin
14+ publish .ColormanagedPyblishPluginMixin ,
15+ publish .OptionalPyblishPluginMixin
1216):
1317 """Extract all layers (groups) marked for publish.
1418
@@ -23,20 +27,21 @@ class ExtractImage(
2327 order = publish .Extractor .order - 0.48
2428 label = "Extract Image"
2529 hosts = ["photoshop" ]
26-
27- families = ["image" , "background" ]
30+ families = ["image" ]
2831 formats = ["png" , "jpg" , "tga" , "exr" ]
2932 settings_category = "photoshop"
33+ optional = False
3034
3135 def process (self , context ):
3236 # Filter instances
3337 filtered_instances = []
3438 for instance in context :
35- product_base_type = instance .data .get ("productBaseType" )
36- if not product_base_type :
37- product_base_type = instance .data ["productType" ]
38- if product_base_type in self .families :
39- filtered_instances .append (instance )
39+ if (
40+ instance .data ["productBaseType" ] != "image"
41+ or not self .is_active (instance .data )
42+ ):
43+ continue
44+ filtered_instances .append (instance )
4045
4146 if not filtered_instances :
4247 return
@@ -55,25 +60,30 @@ def process(self, context):
5560 staging_dir = self .staging_dir (instance )
5661 self .log .info (f"Outputting image to { staging_dir } " )
5762
58- # Get instance layer ID
59- members = instance .data ("members" )
60- if not members :
63+ ids = set ()
64+
65+ # real layers and groups
66+ members = instance .data .get ("members" )
67+ if members :
68+ ids .update (int (member ) for member in members )
69+
70+ # virtual groups collected by color coding or auto_image
71+ add_ids = instance .data .pop ("ids" , None )
72+ if add_ids :
73+ ids .update (set (add_ids ))
74+
75+ if not ids :
76+ self .log .debug (
77+ f"Instance { instance } has no publishable layers, "
78+ f"skipping."
79+ )
6180 continue
62- instance_id = int (members [0 ])
6381
6482 # Context manager handles all visibility: show instance path,
6583 # hide siblings, restore original state on exit
66- with photoshop .isolated_layers_visibility (stub , instance_id , all_layers ):
84+ with photoshop .isolated_layers_visibility (stub , ids , all_layers ):
6785 # Perform extraction
6886 files = {}
69- ids = set ()
70- # real layers and groups
71- if members :
72- ids .update (int (member ) for member in members )
73- # virtual groups collected by color coding or auto_image
74- add_ids = instance .data .pop ("ids" , None )
75- if add_ids :
76- ids .update (set (add_ids ))
7787
7888 file_basename , workfile_extension = os .path .splitext (
7989 stub .get_active_document_name ()
@@ -127,3 +137,15 @@ def staging_dir(self, instance):
127137 from ayon_core .pipeline .publish import get_instance_staging_dir
128138
129139 return get_instance_staging_dir (instance )
140+
141+ @classmethod
142+ def get_attr_defs_for_context (cls , create_context : "CreateContext" ):
143+ return []
144+
145+ @classmethod
146+ def get_attr_defs_for_instance (
147+ cls , create_context : "CreateContext" , instance : "CreatedInstance"
148+ ):
149+ if instance .product_base_type != "image" :
150+ return []
151+ return cls .get_attribute_defs ()
0 commit comments