Skip to content

validate_xgen

ValidateXgen

Bases: MayaInstancePlugin

Validate Xgen data.

Source code in client/ayon_maya/plugins/publish/validate_xgen.py
10
11
12
13
14
15
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
class ValidateXgen(plugin.MayaInstancePlugin):
    """Validate Xgen data."""

    label = "Validate Xgen"
    order = pyblish.api.ValidatorOrder
    families = ["xgen"]

    def process(self, instance):
        set_members = instance.data.get("setMembers")

        # Only 1 collection/node per instance.
        if len(set_members) != 1:
            raise PublishValidationError(
                "Only one collection per instance is allowed."
                " Found:\n{}".format(set_members)
            )

        # Only xgen palette node is allowed.
        node_type = cmds.nodeType(set_members[0])
        if node_type != "xgmPalette":
            raise PublishValidationError(
                "Only node of type \"xgmPalette\" are allowed. Referred to as"
                " \"collection\" in the Maya UI."
                " Node type found: {}".format(node_type)
            )

        # Can't have inactive modifiers in collection cause Xgen will try and
        # look for them when loading.
        palette = instance.data["xgmPalette"].replace("|", "")
        inactive_modifiers = {}
        for description in instance.data["xgmDescriptions"]:
            description = description.split("|")[-2]
            modifier_names = xgenm.fxModules(palette, description)
            for name in modifier_names:
                attr = xgenm.getAttr("active", palette, description, name)
                # Attribute value are lowercase strings of false/true.
                if attr == "false":
                    try:
                        inactive_modifiers[description].append(name)
                    except KeyError:
                        inactive_modifiers[description] = [name]

        if inactive_modifiers:
            raise PublishValidationError(
                "There are inactive modifiers on the collection. "
                "Please delete these:\n{}".format(
                    json.dumps(inactive_modifiers, indent=4, sort_keys=True)
                )
            )

        # We need a namespace else there will be a naming conflict when
        # extracting because of stripping namespaces and parenting to world.
        node_names = [instance.data["xgmPalette"]]
        node_names.extend(instance.data["xgenConnections"])
        non_namespaced_nodes = [n for n in node_names if ":" not in n]
        if non_namespaced_nodes:
            raise PublishValidationError(
                "Could not find namespace on {}. Namespace is required for"
                " xgen publishing.".format(non_namespaced_nodes)
            )