Skip to content

load_vrayproxy

Loader for Vray Proxy files.

If there are Alembics published along vray proxy (in the same version), loader will use them instead of native vray vrmesh format.

VRayProxyLoader

Bases: Loader

Load VRay Proxy with Alembic or VrayMesh.

Source code in client/ayon_maya/plugins/load/load_vrayproxy.py
 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
162
163
164
165
166
167
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
class VRayProxyLoader(plugin.Loader):
    """Load VRay Proxy with Alembic or VrayMesh."""

    product_types = {"vrayproxy", "model", "pointcache", "animation", "oxcache"}
    representations = {"vrmesh", "abc"}

    label = "Import VRay Proxy"
    order = -10
    icon = "code-fork"
    color = "orange"

    def load(self, context, name=None, namespace=None, options=None):
        # type: (dict, str, str, dict) -> None
        """Loader entry point.

        Args:
            context (dict): Loaded representation context.
            name (str): Name of container.
            namespace (str): Optional namespace name.
            options (dict): Optional loader options.

        """

        product_type = context["product"]["productType"]

        #  get all representations for this version
        filename = self._get_abc(
            context["project"]["name"], context["version"]["id"]
        )
        if not filename:
            filename = self.filepath_from_context(context)

        folder_name = context["folder"]["name"]
        namespace = namespace or unique_namespace(
            folder_name + "_",
            prefix="_" if folder_name[0].isdigit() else "",
            suffix="_",
        )

        # Ensure V-Ray for Maya is loaded.
        cmds.loadPlugin("vrayformaya", quiet=True)

        with maintained_selection():
            cmds.namespace(addNamespace=namespace)
            with namespaced(namespace, new=False):
                nodes, group_node = self.create_vray_proxy(
                    name, filename=filename)

        self[:] = nodes
        if not nodes:
            return

        # colour the group node
        project_name = context["project"]["name"]
        settings = get_project_settings(project_name)
        color = get_load_color_for_product_type(product_type, settings)
        if color is not None:
            red, green, blue = color
            cmds.setAttr("{0}.useOutlinerColor".format(group_node), 1)
            cmds.setAttr(
                "{0}.outlinerColor".format(group_node), red, green, blue
            )

        return containerise(
            name=name,
            namespace=namespace,
            nodes=nodes,
            context=context,
            loader=self.__class__.__name__)

    def update(self, container, context):
        # type: (dict, dict) -> None
        """Update container with specified representation."""
        node = container['objectName']
        assert cmds.objExists(node), "Missing container"

        members = cmds.sets(node, query=True) or []
        vraymeshes = cmds.ls(members, type="VRayProxy")
        assert vraymeshes, "Cannot find VRayMesh in container"

        #  get all representations for this version
        repre_entity = context["representation"]
        filename = self._get_abc(
            context["project"]["name"], context["version"]["id"]
        )
        if not filename:
            filename = get_representation_path(repre_entity)

        for vray_mesh in vraymeshes:
            cmds.setAttr("{}.fileName".format(vray_mesh),
                         filename,
                         type="string")

        # Update metadata
        cmds.setAttr("{}.representation".format(node),
                     repre_entity["id"],
                     type="string")

    def remove(self, container):
        # type: (dict) -> None
        """Remove loaded container."""
        # Delete container and its contents
        if cmds.objExists(container['objectName']):
            members = cmds.sets(container['objectName'], query=True) or []
            cmds.delete([container['objectName']] + members)

        # Remove the namespace, if empty
        namespace = container['namespace']
        if cmds.namespace(exists=namespace):
            members = cmds.namespaceInfo(namespace, listNamespace=True)
            if not members:
                cmds.namespace(removeNamespace=namespace)
            else:
                self.log.warning("Namespace not deleted because it "
                                 "still has members: %s", namespace)

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

    def create_vray_proxy(self, name, filename):
        # type: (str, str) -> (list, str)
        """Re-create the structure created by VRay to support vrmeshes

        Args:
            name (str): Name of the asset.
            filename (str): File name of vrmesh.

        Returns:
            nodes(list)

        """

        if name is None:
            name = os.path.splitext(os.path.basename(filename))[0]

        parent = cmds.createNode("transform", name=name)
        proxy = cmds.createNode(
            "VRayProxy", name="{}Shape".format(name), parent=parent)
        cmds.setAttr(proxy + ".fileName", filename, type="string")
        cmds.connectAttr("time1.outTime", proxy + ".currentFrame")

        return [parent, proxy], parent

    def _get_abc(self, project_name, version_id):
        # type: (str) -> str
        """Get abc representation file path if present.

        If here is published Alembic (abc) representation published along
        vray proxy, get is file path.

        Args:
            project_name (str): Project name.
            version_id (str): Version hash id.

        Returns:
            str: Path to file.
            None: If abc not found.

        """
        self.log.debug(
            "Looking for abc in published representations of this version.")
        abc_rep = ayon_api.get_representation_by_name(
            project_name, "abc", version_id
        )
        if abc_rep:
            self.log.debug("Found, we'll link alembic to vray proxy.")
            file_name = get_representation_path(abc_rep)
            self.log.debug("File: {}".format(file_name))
            return file_name

        return ""

create_vray_proxy(name, filename)

Re-create the structure created by VRay to support vrmeshes

Parameters:

Name Type Description Default
name str

Name of the asset.

required
filename str

File name of vrmesh.

required

Returns:

Type Description

nodes(list)

Source code in client/ayon_maya/plugins/load/load_vrayproxy.py
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
def create_vray_proxy(self, name, filename):
    # type: (str, str) -> (list, str)
    """Re-create the structure created by VRay to support vrmeshes

    Args:
        name (str): Name of the asset.
        filename (str): File name of vrmesh.

    Returns:
        nodes(list)

    """

    if name is None:
        name = os.path.splitext(os.path.basename(filename))[0]

    parent = cmds.createNode("transform", name=name)
    proxy = cmds.createNode(
        "VRayProxy", name="{}Shape".format(name), parent=parent)
    cmds.setAttr(proxy + ".fileName", filename, type="string")
    cmds.connectAttr("time1.outTime", proxy + ".currentFrame")

    return [parent, proxy], parent

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

Loader entry point.

Parameters:

Name Type Description Default
context dict

Loaded representation context.

required
name str

Name of container.

None
namespace str

Optional namespace name.

None
options dict

Optional loader options.

None
Source code in client/ayon_maya/plugins/load/load_vrayproxy.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
def load(self, context, name=None, namespace=None, options=None):
    # type: (dict, str, str, dict) -> None
    """Loader entry point.

    Args:
        context (dict): Loaded representation context.
        name (str): Name of container.
        namespace (str): Optional namespace name.
        options (dict): Optional loader options.

    """

    product_type = context["product"]["productType"]

    #  get all representations for this version
    filename = self._get_abc(
        context["project"]["name"], context["version"]["id"]
    )
    if not filename:
        filename = self.filepath_from_context(context)

    folder_name = context["folder"]["name"]
    namespace = namespace or unique_namespace(
        folder_name + "_",
        prefix="_" if folder_name[0].isdigit() else "",
        suffix="_",
    )

    # Ensure V-Ray for Maya is loaded.
    cmds.loadPlugin("vrayformaya", quiet=True)

    with maintained_selection():
        cmds.namespace(addNamespace=namespace)
        with namespaced(namespace, new=False):
            nodes, group_node = self.create_vray_proxy(
                name, filename=filename)

    self[:] = nodes
    if not nodes:
        return

    # colour the group node
    project_name = context["project"]["name"]
    settings = get_project_settings(project_name)
    color = get_load_color_for_product_type(product_type, settings)
    if color is not None:
        red, green, blue = color
        cmds.setAttr("{0}.useOutlinerColor".format(group_node), 1)
        cmds.setAttr(
            "{0}.outlinerColor".format(group_node), red, green, blue
        )

    return containerise(
        name=name,
        namespace=namespace,
        nodes=nodes,
        context=context,
        loader=self.__class__.__name__)

remove(container)

Remove loaded container.

Source code in client/ayon_maya/plugins/load/load_vrayproxy.py
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
def remove(self, container):
    # type: (dict) -> None
    """Remove loaded container."""
    # Delete container and its contents
    if cmds.objExists(container['objectName']):
        members = cmds.sets(container['objectName'], query=True) or []
        cmds.delete([container['objectName']] + members)

    # Remove the namespace, if empty
    namespace = container['namespace']
    if cmds.namespace(exists=namespace):
        members = cmds.namespaceInfo(namespace, listNamespace=True)
        if not members:
            cmds.namespace(removeNamespace=namespace)
        else:
            self.log.warning("Namespace not deleted because it "
                             "still has members: %s", namespace)

switch(container, context)

Switch loaded representation.

Source code in client/ayon_maya/plugins/load/load_vrayproxy.py
136
137
138
139
def switch(self, container, context):
    # type: (dict, dict) -> None
    """Switch loaded representation."""
    self.update(container, context)

update(container, context)

Update container with specified representation.

Source code in client/ayon_maya/plugins/load/load_vrayproxy.py
 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
def update(self, container, context):
    # type: (dict, dict) -> None
    """Update container with specified representation."""
    node = container['objectName']
    assert cmds.objExists(node), "Missing container"

    members = cmds.sets(node, query=True) or []
    vraymeshes = cmds.ls(members, type="VRayProxy")
    assert vraymeshes, "Cannot find VRayMesh in container"

    #  get all representations for this version
    repre_entity = context["representation"]
    filename = self._get_abc(
        context["project"]["name"], context["version"]["id"]
    )
    if not filename:
        filename = get_representation_path(repre_entity)

    for vray_mesh in vraymeshes:
        cmds.setAttr("{}.fileName".format(vray_mesh),
                     filename,
                     type="string")

    # Update metadata
    cmds.setAttr("{}.representation".format(node),
                 repre_entity["id"],
                 type="string")