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
 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
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
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()
        items = stub.get_items(comps=True)
        existing_items = [layer.name.replace(stub.LOADED_ICON, '')
                          for layer in items]

        comp_name = get_unique_layer_name(
            existing_items,
            "{}_{}".format(context["folder"]["name"], name))

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

        comp = stub.import_background(None, stub.LOADED_ICON + comp_name,
                                      layers)

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

        self[:] = [comp]
        namespace = namespace or comp_name

        return api.containerise(
            name,
            namespace,
            comp,
            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"])
        comp_name = "{}_{}".format(folder_name, product_name)

        # switching assets
        if namespace_from_container != comp_name:
            items = stub.get_items(comps=True)
            existing_items = [layer.name for layer in items]
            comp_name = get_unique_layer_name(
                existing_items,
                "{}_{}".format(folder_name, product_name))
        else:  # switching version - keep same name
            comp_name = container["namespace"]

        path = get_representation_path(repre_entity)

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

        # update container
        container["representation"] = repre_entity["id"]
        container["name"] = product_name
        container["namespace"] = comp_name
        container["members"] = comp.members

        stub.imprint(comp.id, container)

    def remove(self, container):
        """
            Removes element from scene: deletes layer + removes from file
            metadata.
        Args:
            container (dict): container to be removed - used to get layer_id
        """
        stub = self.get_stub()
        layer = container.pop("layer")
        stub.imprint(layer.id, {})
        stub.delete_item(layer.id)

    def switch(self, container, context):
        self.update(container, context)

remove(container)

Removes element from scene: deletes layer + removes from file
metadata.

Args: container (dict): container to be removed - used to get layer_id

Source code in client/ayon_aftereffects/plugins/load/load_background.py
 97
 98
 99
100
101
102
103
104
105
106
107
def remove(self, container):
    """
        Removes element from scene: deletes layer + removes from file
        metadata.
    Args:
        container (dict): container to be removed - used to get layer_id
    """
    stub = self.get_stub()
    layer = container.pop("layer")
    stub.imprint(layer.id, {})
    stub.delete_item(layer.id)