Skip to content

load_background

BackgroundLoader

Bases: AfterEffectsLoader

Load images from Background product type Creates for each background separate folder with all imported images from background json AND automatically created composition with layers, each layer for separate image.

For each load container is created and stored in project (.aep) metadata

Source code in client/ayon_aftereffects/plugins/load/load_background.py
 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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
class BackgroundLoader(api.AfterEffectsLoader):
    """
        Load images from Background product type
        Creates for each background separate folder with all imported images
        from background json AND automatically created composition with layers,
        each layer for separate image.

        For each load container is created and stored in project (.aep)
        metadata
    """
    label = "Load JSON Background"
    product_types = {"background"}
    representations = {"json"}

    def load(self, context, name=None, namespace=None, data=None):
        stub = self.get_stub()
        loaded_item_name = f"{context['folder']['name']}_{name}"
        comps = stub.get_items(comps=True)
        loaded_item_name = self._get_unique_loaded_item_name(
            stub, comps, loaded_item_name
        )

        path = self.filepath_from_context(context)
        layers = get_background_layers(path)
        if not layers:
            raise ValueError("No layers found in {}".format(path))

        loaded_item = stub.import_background(
            None, stub.LOADED_ICON + loaded_item_name, layers
        )

        if not loaded_item:
            raise ValueError(
                "Import background failed. "
                "Please contact support"
            )

        self[:] = [loaded_item]
        namespace = namespace or loaded_item

        return api.containerise(
            name,
            namespace,
            loaded_item,
            context,
            self.__class__.__name__
        )

    def update(self, container, context):
        stub = self.get_stub()
        folder_name = context["folder"]["name"]
        product_name = context["product"]["name"]
        repre_entity = context["representation"]

        _ = container.pop("layer")

        # without iterator number (_001, 002...)
        namespace_from_container = re.sub(
            r"_\d{3}$", "", container["namespace"]
        )

        loaded_item_name = f"{folder_name}_{product_name}"
        # switching assets
        if namespace_from_container != loaded_item_name:
            loaded_item_name = self._get_unique_loaded_item_name(
                stub, loaded_item_name)
        else:  # switching version - keep same name
            loaded_item_name = container["namespace"]

        path = get_representation_path(repre_entity)

        layers = get_background_layers(path)
        loaded_item = stub.reload_background(
            container["members"][1],
            stub.LOADED_ICON + loaded_item_name,
            layers
        )

        # update container
        container["representation"] = repre_entity["id"]
        container["name"] = product_name
        container["namespace"] = loaded_item_name
        container["members"] = loaded_item.members

        stub.imprint(loaded_item.id, container)