Skip to content

pipeline

Basic AYON integration

HieroHost

Bases: HostBase, IWorkfileHost, ILoadHost, IPublishHost

Source code in client/ayon_hiero/api/pipeline.py
 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
class HieroHost(
    HostBase, IWorkfileHost, ILoadHost, IPublishHost
):
    name = "hiero"

    def open_workfile(self, filepath):
        return open_file(filepath)

    def save_workfile(self, filepath=None):
        return save_file(filepath)

    def get_current_workfile(self):
        return current_file()

    def workfile_has_unsaved_changes(self):
        return has_unsaved_changes()

    def get_workfile_extensions(self):
        return file_extensions()

    def get_containers(self):
        return ls()

    def install(self):
        """Installing all requirements for hiero host"""

        # adding all events
        events.register_events()

        log.info("Registering Hiero plug-ins..")
        pyblish.register_host("hiero")
        pyblish.register_plugin_path(PUBLISH_PATH)
        register_loader_plugin_path(LOAD_PATH)
        register_creator_plugin_path(CREATE_PATH)

        # install menu
        menu.menu_install()
        menu.add_scripts_menu()

        # register hiero events
        events.register_hiero_events()

    def get_context_data(self):
        """Get publish context data stored in the project.

        Returns:
            dict: The context data, empty if nothing was stored yet.
        """
        context_tag = tags.get_or_create_workfile_tag(
            constants.AYON_CONTEXT_TAG_NAME
        )
        if context_tag is None:
            return {}

        return tags.get_tag_data(context_tag)

    def update_context_data(self, data, changes):
        """Store publish context data to project tag in AYON tag bin.

        Args:
            data (dict): The context data to store.
            changes (dict): Only the data that changed. Not used, the tag
                does always store all the data.
        """
        context_tag = tags.get_or_create_workfile_tag(
            constants.AYON_CONTEXT_TAG_NAME,
            create=True
        )
        tag_data = {
            "metadata": data,
            "note": "AYON context data"
        }
        tags.update_tag(context_tag, tag_data)

get_context_data()

Get publish context data stored in the project.

Returns:

Name Type Description
dict

The context data, empty if nothing was stored yet.

Source code in client/ayon_hiero/api/pipeline.py
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
def get_context_data(self):
    """Get publish context data stored in the project.

    Returns:
        dict: The context data, empty if nothing was stored yet.
    """
    context_tag = tags.get_or_create_workfile_tag(
        constants.AYON_CONTEXT_TAG_NAME
    )
    if context_tag is None:
        return {}

    return tags.get_tag_data(context_tag)

install()

Installing all requirements for hiero host

Source code in client/ayon_hiero/api/pipeline.py
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
def install(self):
    """Installing all requirements for hiero host"""

    # adding all events
    events.register_events()

    log.info("Registering Hiero plug-ins..")
    pyblish.register_host("hiero")
    pyblish.register_plugin_path(PUBLISH_PATH)
    register_loader_plugin_path(LOAD_PATH)
    register_creator_plugin_path(CREATE_PATH)

    # install menu
    menu.menu_install()
    menu.add_scripts_menu()

    # register hiero events
    events.register_hiero_events()

update_context_data(data, changes)

Store publish context data to project tag in AYON tag bin.

Parameters:

Name Type Description Default
data dict

The context data to store.

required
changes dict

Only the data that changed. Not used, the tag does always store all the data.

required
Source code in client/ayon_hiero/api/pipeline.py
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
def update_context_data(self, data, changes):
    """Store publish context data to project tag in AYON tag bin.

    Args:
        data (dict): The context data to store.
        changes (dict): Only the data that changed. Not used, the tag
            does always store all the data.
    """
    context_tag = tags.get_or_create_workfile_tag(
        constants.AYON_CONTEXT_TAG_NAME,
        create=True
    )
    tag_data = {
        "metadata": data,
        "note": "AYON context data"
    }
    tags.update_tag(context_tag, tag_data)

containerise(track_item, name, namespace, context, loader=None, data=None)

Bundle Hiero's object into an assembly and imprint it with metadata

Containerisation enables a tracking of version, author and origin for loaded products.

Parameters:

Name Type Description Default
track_item TrackItem

object to imprint as container

required
name str

Name of resulting assembly

required
namespace str

Namespace under which to host container

required
context dict

Context information

required
loader str

Name of node used to produce this container.

None

Returns:

Name Type Description
track_item TrackItem

containerised object

Source code in client/ayon_hiero/api/pipeline.py
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
def containerise(track_item,
                 name,
                 namespace,
                 context,
                 loader=None,
                 data=None):
    """Bundle Hiero's object into an assembly and imprint it with metadata

    Containerisation enables a tracking of version, author and origin
    for loaded products.

    Arguments:
        track_item (hiero.core.TrackItem): object to imprint as container
        name (str): Name of resulting assembly
        namespace (str): Namespace under which to host container
        context (dict): Context information
        loader (str, optional): Name of node used to produce this container.

    Returns:
        track_item (hiero.core.TrackItem): containerised object

    """

    data_imprint = OrderedDict({
        "schema": CONTAINER_SCHEMA,
        "id": AYON_CONTAINER_ID,
        "name": str(name),
        "namespace": str(namespace),
        "loader": str(loader),
        "representation": context["representation"]["id"],
        "project_name": context["project"]["name"]
    })

    if data:
        for k, v in data.items():
            data_imprint.update({k: v})

    log.debug("_ data_imprint: {}".format(data_imprint))
    lib.set_trackitem_ayon_tag(track_item, data_imprint)

    return track_item

launch_workfiles_app(*args)

Wrapping function for workfiles launcher

Source code in client/ayon_hiero/api/pipeline.py
349
350
351
352
353
354
355
def launch_workfiles_app(*args):
    ''' Wrapping function for workfiles launcher '''
    from .lib import get_main_window

    main_window = get_main_window()
    # show workfile gui
    host_tools.show_workfiles(parent=main_window)

ls()

List available containers.

This function is used by the Container Manager in Hiero. You'll need to implement a for-loop that then yields one Container at a time.

See the container.json schema for details on how it should look.

Source code in client/ayon_hiero/api/pipeline.py
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
def ls():
    """List available containers.

    This function is used by the Container Manager in Hiero. You'll
    need to implement a for-loop that then *yields* one Container at
    a time.

    See the `container.json` schema for details on how it should look.
    """

    # get all track items from current timeline
    all_items = lib.get_track_items()

    # append all video tracks
    for track in (lib.get_current_sequence() or []):
        if type(track) is not hiero.core.VideoTrack:
            continue
        all_items.append(track)

    for item in all_items:
        container_data = parse_container(item)

        if isinstance(container_data, list):
            for _c in container_data:
                yield _c
        elif container_data:
            yield container_data

    # get container from tags
    tag_bin = tags.get_workfile_bin()
    if not tag_bin:
        return

    for tag_item in tag_bin.items():
        tag_data = tags.get_tag_data(tag_item)
        if tag_data.get("schema") == CONTAINER_SCHEMA:
            yield tag_data

maintained_selection()

Maintain selection during context

Example

with maintained_selection(): ... for track_item in track_items: ... < do some stuff >

Source code in client/ayon_hiero/api/pipeline.py
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
@contextlib.contextmanager
def maintained_selection():
    """Maintain selection during context

    Example:
        >>> with maintained_selection():
        ...     for track_item in track_items:
        ...         < do some stuff >
    """
    from .lib import (
        set_selected_track_items,
        get_selected_track_items
    )
    previous_selection = get_selected_track_items()
    reset_selection()
    try:
        # do the operation
        yield
    finally:
        reset_selection()
        set_selected_track_items(previous_selection)

parse_container(item, validate=True)

Return container data from track_item's AYON tag.

Data of containers loaded with OpenPype are converted to AYON container data. The conversion is stored to the item on container update.

Parameters:

Name Type Description Default
item TrackItem or VideoTrack

A containerised track item.

required
validate (bool)[optional]

validating with container schema

required

Returns:

Name Type Description
dict

The container schema data for input containerized track item.

Source code in client/ayon_hiero/api/pipeline.py
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
def parse_container(item, validate=True):
    """Return container data from track_item's AYON tag.

    Data of containers loaded with OpenPype are converted to AYON container
    data. The conversion is stored to the item on container update.

    Args:
        item (hiero.core.TrackItem or hiero.core.VideoTrack):
            A containerised track item.
        validate (bool)[optional]: validating with container schema

    Returns:
        dict: The container schema data for input containerized track item.

    """
    def data_to_container(item, data):
        data = _convert_legacy_container_data(data)
        if (
            not isinstance(data, dict)
            or data.get("id") != AYON_CONTAINER_ID
        ):
            return

        if validate and data.get("schema"):
            schema.validate(data)

        # If not all required data return the empty container
        required = ['schema', 'id', 'name',
                    'namespace', 'loader', 'representation']

        if any(key not in data for key in required):
            return

        container = {key: data[key] for key in required}
        if "project_name" in data:
            container["project_name"] = data["project_name"]

        container["objectName"] = item.name()

        # Store reference to the node object
        container["_item"] = item

        return container

    # convert tag metadata to normal keys names
    if type(item) is hiero.core.VideoTrack:
        return_list = []
        _data = lib.get_track_ayon_data(item)

        if not _data:
            return
        # convert the data to list and validate them
        for obj_data in _data.values():
            container = data_to_container(item, obj_data)
            if container:
                return_list.append(container)
        return return_list
    else:
        _data = lib.get_trackitem_ayon_data(item)
        return data_to_container(item, _data)

publish(parent)

Shorthand to publish from within host

Source code in client/ayon_hiero/api/pipeline.py
358
359
360
def publish(parent):
    """Shorthand to publish from within host"""
    return host_tools.show_publish(parent)

reload_config()

Attempt to reload pipeline at run-time.

CAUTION: This is primarily for development and debugging purposes.

Source code in client/ayon_hiero/api/pipeline.py
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
def reload_config():
    """Attempt to reload pipeline at run-time.

    CAUTION: This is primarily for development and debugging purposes.

    """
    import importlib

    for module in (
        "ayon_hiero.lib",
        "ayon_hiero.menu",
        "ayon_hiero.tags"
    ):
        log.info("Reloading module: {}...".format(module))
        try:
            module = importlib.import_module(module)
            import imp
            imp.reload(module)
        except Exception as e:
            log.warning("Cannot reload module: {}".format(e))
            importlib.reload(module)

reset_selection()

Deselect all selected nodes

Source code in client/ayon_hiero/api/pipeline.py
386
387
388
389
390
def reset_selection():
    """Deselect all selected nodes
    """
    from .lib import set_selected_track_items
    set_selected_track_items([])

update_container(item, data=None)

Update container data to input track_item or track's AYON tag.

Containers loaded with OpenPype are stored as AYON containers.

Parameters:

Name Type Description Default
item TrackItem or VideoTrack

A containerised track item.

required
data (dict)[optional]

dictionery with data to be updated

required

Returns:

Name Type Description
bool

True if container was updated correctly

Source code in client/ayon_hiero/api/pipeline.py
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
def update_container(item, data=None):
    """Update container data to input track_item or track's
    AYON tag.

    Containers loaded with OpenPype are stored as AYON containers.

    Args:
        item (hiero.core.TrackItem or hiero.core.VideoTrack):
            A containerised track item.
        data (dict)[optional]: dictionery with data to be updated

    Returns:
        bool: True if container was updated correctly

    """

    data = data or {}

    if type(item) is hiero.core.VideoTrack:
        # form object data for test
        object_name = data["objectName"]

        # get all available containers
        containers = {
            name: _convert_legacy_container_data(container)
            for name, container in (
                lib.get_track_ayon_data(item) or {}
            ).items()
        }

        # merge updated container back to containers
        containers[object_name] = _update_container_data(
            containers.get(object_name), data
        )

        return bool(lib.set_track_ayon_tag(item, containers))
    else:
        container = _convert_legacy_container_data(
            lib.get_trackitem_ayon_data(item)
        )
        updated_container = _update_container_data(container, data)

        log.info("Updating container: `{}`".format(item.name()))
        return bool(lib.set_trackitem_ayon_tag(item, updated_container))