Skip to content

load_rendersetup

Load and update RenderSetup settings.

Working with RenderSetup setting is Maya is done utilizing json files. When this json is loaded, it will overwrite all settings on RenderSetup instance.

RenderSetupLoader

Bases: Loader

Load json preset for RenderSetup overwriting current one.

Source code in client/ayon_maya/plugins/load/load_rendersetup.py
 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
class RenderSetupLoader(plugin.Loader):
    """Load json preset for RenderSetup overwriting current one."""

    product_types = {"rendersetup"}
    representations = {"json"}
    defaults = ['Main']

    label = "Load RenderSetup template"
    icon = "tablet"
    color = "orange"

    options = [
        BoolDef("accept_import",
                label="Accept import on load",
                tooltip=(
                  "By default importing or pasting Render Setup collections "
                  "will display them italic in the Render Setup list.\nWith "
                  "this enabled the load will directly mark the import "
                  "'accepted' and remove the italic view."
                ),
                default=True),
        BoolDef("load_managed",
                label="Load Managed",
                tooltip=(
                  "Containerize the rendersetup on load so it can be "
                  "'updated' later."
                ),
                default=True),
        EnumDef("import_mode",
                label="Import mode",
                items={
                    renderSetup.DECODE_AND_OVERWRITE: (
                        "Flush existing render setup and "
                        "add without any namespace"
                    ),
                    renderSetup.DECODE_AND_MERGE: (
                        "Merge with the existing render setup objects and "
                        "rename the unexpected objects"
                    ),
                    renderSetup.DECODE_AND_RENAME: (
                        "Renaming all decoded render setup objects to not "
                        "conflict with the existing render setup"
                    ),
                },
                default=renderSetup.DECODE_AND_OVERWRITE)
    ]

    def load(self, context, name, namespace, data):
        """Load RenderSetup settings."""

        path = self.filepath_from_context(context)

        accept_import = data.get("accept_import", True)
        import_mode = data.get("import_mode", renderSetup.DECODE_AND_OVERWRITE)

        self.log.info(">>> loading json [ {} ]".format(path))
        with mark_all_imported(accept_import):
            with open(path, "r") as file:
                renderSetup.instance().decode(
                    json.load(file), import_mode, None)

        if data.get("load_managed", True):
            self.log.info(">>> containerising [ {} ]".format(name))
            folder_name = context["folder"]["name"]
            namespace = namespace or lib.unique_namespace(
                folder_name + "_",
                prefix="_" if folder_name[0].isdigit() else "",
                suffix="_",
            )

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

    def remove(self, container):
        """Remove RenderSetup settings instance."""
        container_name = container["objectName"]

        self.log.info("Removing '%s' from Maya.." % container["name"])

        container_content = cmds.sets(container_name, query=True) or []
        nodes = cmds.ls(container_content, long=True)

        nodes.append(container_name)

        try:
            cmds.delete(nodes)
        except ValueError:
            # Already implicitly deleted by Maya upon removing reference
            pass

    def update(self, container, context):
        """Update RenderSetup setting by overwriting existing settings."""
        lib.show_message(
            "Render setup update",
            "Render setup setting will be overwritten by new version. All "
            "setting specified by user not included in loaded version "
            "will be lost.")
        repre_entity = context["representation"]
        path = get_representation_path(repre_entity)
        with open(path, "r") as file:
            try:
                renderSetup.instance().decode(
                    json.load(file), renderSetup.DECODE_AND_OVERWRITE, None)
            except Exception:
                self.log.error("There were errors during loading")
                raise

        # Update metadata
        node = container["objectName"]
        cmds.setAttr("{}.representation".format(node),
                     repre_entity["id"],
                     type="string")
        self.log.info("... updated")

    def switch(self, container, context):
        """Switch representations."""
        self.update(container, context)

load(context, name, namespace, data)

Load RenderSetup settings.

Source code in client/ayon_maya/plugins/load/load_rendersetup.py
 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
def load(self, context, name, namespace, data):
    """Load RenderSetup settings."""

    path = self.filepath_from_context(context)

    accept_import = data.get("accept_import", True)
    import_mode = data.get("import_mode", renderSetup.DECODE_AND_OVERWRITE)

    self.log.info(">>> loading json [ {} ]".format(path))
    with mark_all_imported(accept_import):
        with open(path, "r") as file:
            renderSetup.instance().decode(
                json.load(file), import_mode, None)

    if data.get("load_managed", True):
        self.log.info(">>> containerising [ {} ]".format(name))
        folder_name = context["folder"]["name"]
        namespace = namespace or lib.unique_namespace(
            folder_name + "_",
            prefix="_" if folder_name[0].isdigit() else "",
            suffix="_",
        )

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

remove(container)

Remove RenderSetup settings instance.

Source code in client/ayon_maya/plugins/load/load_rendersetup.py
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
def remove(self, container):
    """Remove RenderSetup settings instance."""
    container_name = container["objectName"]

    self.log.info("Removing '%s' from Maya.." % container["name"])

    container_content = cmds.sets(container_name, query=True) or []
    nodes = cmds.ls(container_content, long=True)

    nodes.append(container_name)

    try:
        cmds.delete(nodes)
    except ValueError:
        # Already implicitly deleted by Maya upon removing reference
        pass

switch(container, context)

Switch representations.

Source code in client/ayon_maya/plugins/load/load_rendersetup.py
165
166
167
def switch(self, container, context):
    """Switch representations."""
    self.update(container, context)

update(container, context)

Update RenderSetup setting by overwriting existing settings.

Source code in client/ayon_maya/plugins/load/load_rendersetup.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 update(self, container, context):
    """Update RenderSetup setting by overwriting existing settings."""
    lib.show_message(
        "Render setup update",
        "Render setup setting will be overwritten by new version. All "
        "setting specified by user not included in loaded version "
        "will be lost.")
    repre_entity = context["representation"]
    path = get_representation_path(repre_entity)
    with open(path, "r") as file:
        try:
            renderSetup.instance().decode(
                json.load(file), renderSetup.DECODE_AND_OVERWRITE, None)
        except Exception:
            self.log.error("There were errors during loading")
            raise

    # Update metadata
    node = container["objectName"]
    cmds.setAttr("{}.representation".format(node),
                 repre_entity["id"],
                 type="string")
    self.log.info("... updated")

mark_all_imported(enabled)

Mark all imported nodes accepted by removing the imported attribute

Source code in client/ayon_maya/plugins/load/load_rendersetup.py
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
@contextlib.contextmanager
def mark_all_imported(enabled):
    """Mark all imported nodes accepted by removing the `imported` attribute"""
    if not enabled:
        yield
        return

    node_types = cmds.pluginInfo("renderSetup", query=True, dependNode=True)

    # Get node before load, then we can disable `imported`
    # attribute on all new render setup layers after import
    before = cmds.ls(type=node_types, long=True)
    try:
        yield
    finally:
        after = cmds.ls(type=node_types, long=True)
        for node in (node for node in after if node not in before):
            if cmds.attributeQuery("imported",
                                   node=node,
                                   exists=True):
                plug = "{}.imported".format(node)
                if cmds.getAttr(plug):
                    cmds.deleteAttr(plug)