Skip to content

load_trackable_clip

Load a clip from a file as trackable clip.

LoadTrackableClip

Bases: MochaLoader

Load a clip from a file.

Source code in client/ayon_mocha/plugins/load/load_trackable_clip.py
 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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
class LoadTrackableClip(MochaLoader):
    """Load a clip from a file."""

    label = "Load Trackable Clip"
    order = -11
    icon = "code-fork"
    color = "orange"

    product_types: ClassVar[set[str]] = {"*"}
    representations: ClassVar[set[str]] = {"*"}
    extensions: ClassVar[set[str]] = {
        ext.lstrip(".") for ext in IMAGE_EXTENSIONS}

    def load(self,
             context: dict,
             name: Optional[str] = None,
             namespace: Optional[str] = None,
             options: Optional[dict] = None) -> None:
        """Load a clip from a file as trackable clip.

        Raises:
            LoadError: If no trackable clip found in the project.

        """
        host: MochaProHost = registered_host()
        project = host.get_current_project()
        with project.undo_group():

            current_clip: Clip = project.default_trackable_clip
            if current_clip is None:
                msg = "No trackable clip found in the project."
                raise LoadError(msg)
            # no way how to change clip name
            # project.parameter([current_clip, "name"]).set(name)

            file_path = self.filepath_from_context(context)

            try:
                image_info = get_image_info(Path(file_path))
            except ValueError as exc:
                msg = (
                    f"Failed to get image info from {file_path}: {exc}"
                )
                raise LoadError(msg) from exc

            # set clip properties
            current_clip.frame_size = (
                image_info.get("width", 1920),
                image_info.get("height", 1080)
            )

            current_clip.relink(file_path)

            for cnt in host.get_containers():
                if cnt.get("name") == current_clip.name:
                    cnt["representation"] = str(
                        context["representation"]["id"])
                    return

            container = Container(
                name=current_clip.name,
                namespace=namespace or "",
                loader=self.__class__.__name__,
                representation=str(context["representation"]["id"]),
                objectName=current_clip.name,
                timestamp=time.time_ns()
            )
            host.add_container(container)

    def switch(self, container: dict, context: dict) -> None:
        """Switch the image sequence on the current camera."""
        self.update(container, context)

    def remove(self, container: dict) -> None:
        """Remove a container."""
        host: MochaProHost = registered_host()
        project = host.get_current_project()

        clips = project.get_clips()
        clip = clips.get(container["objectName"])
        if not clip:
            self.log.warning("Clip %s not found", container["objectName"])
            return
        del clip
        host.remove_container(Container(**container))

    def update(self, container: dict, context: dict) -> None:
        """Update a container.

        Raises:
            LoadError: If the clip information cannot be determined.

        """
        host: MochaProHost = registered_host()

        version_entity = context["version"]
        repre_entity = context["representation"]

        file_path = get_representation_path(repre_entity)
        project = host.get_current_project()
        clips = project.get_clips()

        try:
            image_info = get_image_info(Path(file_path))
        except ValueError as exc:
            msg = f"Failed to get image info from {file_path}: {exc}"
            raise LoadError(msg) from exc
        try:
            clips[container["objectName"]].relink(file_path)
            # set clip properties
            clips[container["objectName"]].frame_size = (
                image_info.get("width", 1920),
                image_info.get("height", 1080),
            )
        except KeyError:
            self.log.warning("Clip %s not found", container["objectName"])
        update_ui()

        container["representation"] = repre_entity["id"]
        container["version"] = str(version_entity["version"])
        host.add_container(Container(**container))

load(context, name=None, namespace=None, options=None)

Load a clip from a file as trackable clip.

Raises:

Type Description
LoadError

If no trackable clip found in the project.

Source code in client/ayon_mocha/plugins/load/load_trackable_clip.py
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
def load(self,
         context: dict,
         name: Optional[str] = None,
         namespace: Optional[str] = None,
         options: Optional[dict] = None) -> None:
    """Load a clip from a file as trackable clip.

    Raises:
        LoadError: If no trackable clip found in the project.

    """
    host: MochaProHost = registered_host()
    project = host.get_current_project()
    with project.undo_group():

        current_clip: Clip = project.default_trackable_clip
        if current_clip is None:
            msg = "No trackable clip found in the project."
            raise LoadError(msg)
        # no way how to change clip name
        # project.parameter([current_clip, "name"]).set(name)

        file_path = self.filepath_from_context(context)

        try:
            image_info = get_image_info(Path(file_path))
        except ValueError as exc:
            msg = (
                f"Failed to get image info from {file_path}: {exc}"
            )
            raise LoadError(msg) from exc

        # set clip properties
        current_clip.frame_size = (
            image_info.get("width", 1920),
            image_info.get("height", 1080)
        )

        current_clip.relink(file_path)

        for cnt in host.get_containers():
            if cnt.get("name") == current_clip.name:
                cnt["representation"] = str(
                    context["representation"]["id"])
                return

        container = Container(
            name=current_clip.name,
            namespace=namespace or "",
            loader=self.__class__.__name__,
            representation=str(context["representation"]["id"]),
            objectName=current_clip.name,
            timestamp=time.time_ns()
        )
        host.add_container(container)

remove(container)

Remove a container.

Source code in client/ayon_mocha/plugins/load/load_trackable_clip.py
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
def remove(self, container: dict) -> None:
    """Remove a container."""
    host: MochaProHost = registered_host()
    project = host.get_current_project()

    clips = project.get_clips()
    clip = clips.get(container["objectName"])
    if not clip:
        self.log.warning("Clip %s not found", container["objectName"])
        return
    del clip
    host.remove_container(Container(**container))

switch(container, context)

Switch the image sequence on the current camera.

Source code in client/ayon_mocha/plugins/load/load_trackable_clip.py
91
92
93
def switch(self, container: dict, context: dict) -> None:
    """Switch the image sequence on the current camera."""
    self.update(container, context)

update(container, context)

Update a container.

Raises:

Type Description
LoadError

If the clip information cannot be determined.

Source code in client/ayon_mocha/plugins/load/load_trackable_clip.py
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
def update(self, container: dict, context: dict) -> None:
    """Update a container.

    Raises:
        LoadError: If the clip information cannot be determined.

    """
    host: MochaProHost = registered_host()

    version_entity = context["version"]
    repre_entity = context["representation"]

    file_path = get_representation_path(repre_entity)
    project = host.get_current_project()
    clips = project.get_clips()

    try:
        image_info = get_image_info(Path(file_path))
    except ValueError as exc:
        msg = f"Failed to get image info from {file_path}: {exc}"
        raise LoadError(msg) from exc
    try:
        clips[container["objectName"]].relink(file_path)
        # set clip properties
        clips[container["objectName"]].frame_size = (
            image_info.get("width", 1920),
            image_info.get("height", 1080),
        )
    except KeyError:
        self.log.warning("Clip %s not found", container["objectName"])
    update_ui()

    container["representation"] = repre_entity["id"]
    container["version"] = str(version_entity["version"])
    host.add_container(Container(**container))