Skip to content

load_model

Loader for models.

LoadModel

Bases: LoaderPlugin

Load model to the current point group.

Source code in client/ayon_equalizer/plugins/load/load_model.py
 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
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
class LoadModel(load.LoaderPlugin):
    """Load model to the current point group."""

    product_base_types: ClassVar[Optional[set[str]]] = {"model"}

    product_types = product_base_types

    representations: ClassVar[list[str]] = ["obj"]
    extensions: ClassVar[list[str]] = ["obj"]

    label = "Load model"
    order = -10
    icon = "cube"
    color = "#6b9bd2"

    def load(
        self,
        context: dict,
        name: Optional[str] = None,
        namespace: Optional[str] = None,
        options: Optional[dict] = None,
    ) -> None:
        """Load the model to the current point group.

        Args:
            context (dict): the context to be used to load the model.
            name (str, optional): the name of the model to be loaded.
            namespace (str, optional): the namespace of the model to be loaded.
            options (dict, optional): the options to be used to load the model.

        Raises:
            LoadError: if no or more than one point groups are selected.

        """
        selected_point_group_ids = tuple(
            filter(
                lambda point_group_id: tde4.getPGroupSelectionFlag(
                    point_group_id) > 0,
                tde4.getPGroupList(),
            )
        )
        if not selected_point_group_ids:
            msg = "No point groups selected."
            raise LoadError(msg)

        if len(selected_point_group_ids) > 1:
            msg = (
                "Multiple point groups selected. "
                "Please select only one point group."
            )
            raise LoadError(msg)

        point_group_id = selected_point_group_ids[0]

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

        file_path = self.filepath_from_context(context)

        model_id = tde4.create3DModel(point_group_id)
        if name:
            tde4.set3DModelName(point_group_id, model_id, name)
        tde4.importOBJ3DModel(point_group_id, model_id, file_path)
        # hardcoded for now until putting orientation and spatial unit
        # data against a published model
        tde4.set3DModelRotationScale3D(
            point_group_id,
            model_id,
            [[100.0, 0.0, 0.0], [0.0, 0.0, -100.0], [0.0, 100.0, 0.0]],
        )
        model_name = tde4.get3DModelName(point_group_id, model_id)

        container = Container(
            name=name or model_name,
            namespace=model_name,
            loader=self.__class__.__name__,
            representation=str(repre_entity["id"]),
            objectName=model_name,
            version=str(version_entity["version"]),
            timestamp=time_ns(),
        )
        EqualizerHost.get_host().add_container(container)
        tde4.updateGUI()

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

        Args:
            container (dict): the context to be used to load the model.
            context (dict): the context to be used to load the model.

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

        point_group_id, model_id = next(
            (
                (point_group_id, model_id)
                for point_group_id in tde4.getPGroupList()
                for model_id in tde4.get3DModelList(point_group_id)
                if tde4.get3DModelName(point_group_id, model_id) == container["namespace"]  # noqa: E501
            ),
            (None, None),
        )
        if model_id is None:
            msg = f'Cannot find model {container["namespace"]}'
            raise LoadError(msg)

        file_path = get_representation_path(repre_entity)
        file_path = self.format_path(file_path, repre_entity)

        tde4.importOBJ3DModel(point_group_id, model_id, file_path)

        container["representation"] = repre_entity["id"]
        container["version"] = str(version_entity["version"])

        EqualizerHost.get_host().add_container(Container(**container))
        tde4.updateGUI()

    def switch(self, container: dict, context: dict) -> None:
        """Switch loaded models."""
        self.update(container, context)

    @staticmethod
    def format_path(path: str, representation: dict) -> str:
        """Format file path correctly for single image or sequence."""
        if not os.path.exists(path):
            msg = f"Path does not exist: {path}"
            raise RuntimeError(msg)

        ext = os.path.splitext(path)[-1]

        is_sequence = bool(representation["context"].get("frame"))

        if not is_sequence:
            filename = path
        else:
            hashes = "#" * len(str(representation["context"].get("frame")))
            filename = re.sub(
                f"(.*)\\.(\\d+){re.escape(ext)}$",
                f"\\1.{hashes}{ext}", path)

            filename = os.path.join(path, filename)

        filename = os.path.normpath(filename)
        return filename.replace("\\", "/")

format_path(path, representation) staticmethod

Format file path correctly for single image or sequence.

Source code in client/ayon_equalizer/plugins/load/load_model.py
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
@staticmethod
def format_path(path: str, representation: dict) -> str:
    """Format file path correctly for single image or sequence."""
    if not os.path.exists(path):
        msg = f"Path does not exist: {path}"
        raise RuntimeError(msg)

    ext = os.path.splitext(path)[-1]

    is_sequence = bool(representation["context"].get("frame"))

    if not is_sequence:
        filename = path
    else:
        hashes = "#" * len(str(representation["context"].get("frame")))
        filename = re.sub(
            f"(.*)\\.(\\d+){re.escape(ext)}$",
            f"\\1.{hashes}{ext}", path)

        filename = os.path.join(path, filename)

    filename = os.path.normpath(filename)
    return filename.replace("\\", "/")

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

Load the model to the current point group.

Parameters:

Name Type Description Default
context dict

the context to be used to load the model.

required
name str

the name of the model to be loaded.

None
namespace str

the namespace of the model to be loaded.

None
options dict

the options to be used to load the model.

None

Raises:

Type Description
LoadError

if no or more than one point groups are selected.

Source code in client/ayon_equalizer/plugins/load/load_model.py
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
def load(
    self,
    context: dict,
    name: Optional[str] = None,
    namespace: Optional[str] = None,
    options: Optional[dict] = None,
) -> None:
    """Load the model to the current point group.

    Args:
        context (dict): the context to be used to load the model.
        name (str, optional): the name of the model to be loaded.
        namespace (str, optional): the namespace of the model to be loaded.
        options (dict, optional): the options to be used to load the model.

    Raises:
        LoadError: if no or more than one point groups are selected.

    """
    selected_point_group_ids = tuple(
        filter(
            lambda point_group_id: tde4.getPGroupSelectionFlag(
                point_group_id) > 0,
            tde4.getPGroupList(),
        )
    )
    if not selected_point_group_ids:
        msg = "No point groups selected."
        raise LoadError(msg)

    if len(selected_point_group_ids) > 1:
        msg = (
            "Multiple point groups selected. "
            "Please select only one point group."
        )
        raise LoadError(msg)

    point_group_id = selected_point_group_ids[0]

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

    file_path = self.filepath_from_context(context)

    model_id = tde4.create3DModel(point_group_id)
    if name:
        tde4.set3DModelName(point_group_id, model_id, name)
    tde4.importOBJ3DModel(point_group_id, model_id, file_path)
    # hardcoded for now until putting orientation and spatial unit
    # data against a published model
    tde4.set3DModelRotationScale3D(
        point_group_id,
        model_id,
        [[100.0, 0.0, 0.0], [0.0, 0.0, -100.0], [0.0, 100.0, 0.0]],
    )
    model_name = tde4.get3DModelName(point_group_id, model_id)

    container = Container(
        name=name or model_name,
        namespace=model_name,
        loader=self.__class__.__name__,
        representation=str(repre_entity["id"]),
        objectName=model_name,
        version=str(version_entity["version"]),
        timestamp=time_ns(),
    )
    EqualizerHost.get_host().add_container(container)
    tde4.updateGUI()

switch(container, context)

Switch loaded models.

Source code in client/ayon_equalizer/plugins/load/load_model.py
135
136
137
def switch(self, container: dict, context: dict) -> None:
    """Switch loaded models."""
    self.update(container, context)

update(container, context)

Update loaded models.

Parameters:

Name Type Description Default
container dict

the context to be used to load the model.

required
context dict

the context to be used to load the model.

required
Source code in client/ayon_equalizer/plugins/load/load_model.py
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
def update(self, container: dict, context: dict) -> None:
    """Update loaded models.

    Args:
        container (dict): the context to be used to load the model.
        context (dict): the context to be used to load the model.

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

    point_group_id, model_id = next(
        (
            (point_group_id, model_id)
            for point_group_id in tde4.getPGroupList()
            for model_id in tde4.get3DModelList(point_group_id)
            if tde4.get3DModelName(point_group_id, model_id) == container["namespace"]  # noqa: E501
        ),
        (None, None),
    )
    if model_id is None:
        msg = f'Cannot find model {container["namespace"]}'
        raise LoadError(msg)

    file_path = get_representation_path(repre_entity)
    file_path = self.format_path(file_path, repre_entity)

    tde4.importOBJ3DModel(point_group_id, model_id, file_path)

    container["representation"] = repre_entity["id"]
    container["version"] = str(version_entity["version"])

    EqualizerHost.get_host().add_container(Container(**container))
    tde4.updateGUI()