Skip to content

workfile_template_builder

AEPlaceholderPlugin

Bases: PlaceholderPlugin

Contains generic methods for all PlaceholderPlugins.

Source code in client/ayon_aftereffects/api/workfile_template_builder.py
 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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
class AEPlaceholderPlugin(PlaceholderPlugin):
    """Contains generic methods for all PlaceholderPlugins."""

    @abstractmethod
    def _create_placeholder_item(self, item_data: dict) -> PlaceholderItem:
        pass

    def collect_placeholders(self):
        """Collect info from file metadata about created placeholders.

        Returns:
            (list) (LoadPlaceholderItem)
        """
        output = []
        scene_placeholders = self._collect_scene_placeholders()
        for item in scene_placeholders:
            if item.get("plugin_identifier") != self.identifier:
                continue

            item = self._create_placeholder_item(item)
            output.append(item)

        return output

    def update_placeholder(self, placeholder_item, placeholder_data):
        """Resave changed properties for placeholders"""
        item_id, metadata_item = self._get_item(placeholder_item)
        stub = get_stub()
        if not item_id:
            stub.print_msg("Cannot find item for "
                           f"{placeholder_item.scene_identifier}")
            return
        metadata_item["data"] = placeholder_data
        stub.imprint(item_id, metadata_item)

    def _get_item(self, placeholder_item):
        """Returns item id and item metadata for placeholder from file meta"""
        stub = get_stub()
        placeholder_uuid = placeholder_item.scene_identifier
        for metadata_item in stub.get_metadata():
            if not metadata_item.get("is_placeholder"):
                continue
            if placeholder_uuid in metadata_item.get("uuid"):
                return metadata_item["members"][0], metadata_item
        return None, None

    def _collect_scene_placeholders(self):
        """Cache placeholder data to shared data.
        Returns:
            (list) of dicts
        """
        placeholder_items = self.builder.get_shared_populate_data(
            "placeholder_items"
        )
        if not placeholder_items:
            placeholder_items = []
            for item in get_stub().get_metadata():
                if not item.get("is_placeholder"):
                    continue
                placeholder_items.append(item)

            self.builder.set_shared_populate_data(
                "placeholder_items", placeholder_items
            )
        return placeholder_items

    def _imprint_item(self, item_id, name, placeholder_data, stub):
        if not item_id:
            raise ValueError("Couldn't create a placeholder")
        container_data = {
            "id": PLACEHOLDER_ID,
            "name": name,
            "is_placeholder": True,
            "plugin_identifier": self.identifier,
            "uuid": str(uuid.uuid4()),  # scene_identifier
            "data": placeholder_data,
            "members": [item_id]
        }
        stub.imprint(item_id, container_data)

collect_placeholders()

Collect info from file metadata about created placeholders.

Returns:

Type Description

(list) (LoadPlaceholderItem)

Source code in client/ayon_aftereffects/api/workfile_template_builder.py
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
def collect_placeholders(self):
    """Collect info from file metadata about created placeholders.

    Returns:
        (list) (LoadPlaceholderItem)
    """
    output = []
    scene_placeholders = self._collect_scene_placeholders()
    for item in scene_placeholders:
        if item.get("plugin_identifier") != self.identifier:
            continue

        item = self._create_placeholder_item(item)
        output.append(item)

    return output

update_placeholder(placeholder_item, placeholder_data)

Resave changed properties for placeholders

Source code in client/ayon_aftereffects/api/workfile_template_builder.py
72
73
74
75
76
77
78
79
80
81
def update_placeholder(self, placeholder_item, placeholder_data):
    """Resave changed properties for placeholders"""
    item_id, metadata_item = self._get_item(placeholder_item)
    stub = get_stub()
    if not item_id:
        stub.print_msg("Cannot find item for "
                       f"{placeholder_item.scene_identifier}")
        return
    metadata_item["data"] = placeholder_data
    stub.imprint(item_id, metadata_item)

AETemplateBuilder

Bases: AbstractTemplateBuilder

Concrete implementation of AbstractTemplateBuilder for AE

Source code in client/ayon_aftereffects/api/workfile_template_builder.py
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
class AETemplateBuilder(AbstractTemplateBuilder):
    """Concrete implementation of AbstractTemplateBuilder for AE"""

    def import_template(self, path):
        """Import template into current scene.
        Block if a template is already loaded.

        Args:
            path (str): A path to current template (usually given by
            get_template_preset implementation)

        Returns:
            bool: Whether the template was successfully imported or not
        """
        stub = get_stub()
        if not os.path.exists(path):
            stub.print_msg(f"Template file on {path} doesn't exist.")
            return

        stub.save()
        workfile_path = stub.get_active_document_full_name()
        shutil.copy2(path, workfile_path)
        stub.open(workfile_path)

        return True

import_template(path)

Import template into current scene. Block if a template is already loaded.

Parameters:

Name Type Description Default
path str

A path to current template (usually given by

required

Returns:

Name Type Description
bool

Whether the template was successfully imported or not

Source code in client/ayon_aftereffects/api/workfile_template_builder.py
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
def import_template(self, path):
    """Import template into current scene.
    Block if a template is already loaded.

    Args:
        path (str): A path to current template (usually given by
        get_template_preset implementation)

    Returns:
        bool: Whether the template was successfully imported or not
    """
    stub = get_stub()
    if not os.path.exists(path):
        stub.print_msg(f"Template file on {path} doesn't exist.")
        return

    stub.save()
    workfile_path = stub.get_active_document_full_name()
    shutil.copy2(path, workfile_path)
    stub.open(workfile_path)

    return True

create_placeholder(*args)

Called when new workile placeholder should be created.

Source code in client/ayon_aftereffects/api/workfile_template_builder.py
139
140
141
142
143
144
def create_placeholder(*args):
    """Called when new workile placeholder should be created."""
    host = registered_host()
    builder = AETemplateBuilder(host)
    window = WorkfileBuildPlaceholderDialog(host, builder)
    window.exec_()

update_placeholder(*args)

Called after placeholder item is selected to modify it.

Source code in client/ayon_aftereffects/api/workfile_template_builder.py
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
def update_placeholder(*args):
    """Called after placeholder item is selected to modify it."""
    host = registered_host()
    builder = AETemplateBuilder(host)

    stub = get_stub()
    selected_items = stub.get_selected_items(True, True, True)

    if len(selected_items) != 1:
        stub.print_msg("Please select just 1 placeholder")
        return

    selected_id = selected_items[0].id
    placeholder_item = None

    placeholder_items_by_id = {
        placeholder_item.scene_identifier: placeholder_item
        for placeholder_item in builder.get_placeholders()
    }
    for metadata_item in stub.get_metadata():
        if not metadata_item.get("is_placeholder"):
            continue
        if selected_id in metadata_item.get("members"):
            placeholder_item = placeholder_items_by_id.get(
                metadata_item["uuid"])
            break

    if not placeholder_item:
        stub.print_msg("Didn't find placeholder metadata. "
                       "Remove and re-create placeholder.")
        return

    window = WorkfileBuildPlaceholderDialog(host, builder)
    window.set_update_mode(placeholder_item)
    window.exec_()