Bases: Extractor
, 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.
Source code in client/ayon_substancepainter/plugins/publish/extract_textures.py
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 | 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"]
creator_attrs = instance.data["creator_attributes"]
export_channel = creator_attrs.get("exportChannel", [])
node_ids = instance.data.get("selected_node_id", [])
with set_layer_stack_opacity(node_ids, export_channel):
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
|