Skip to content

validate_alembic_options_defaults

ValidateAlembicDefaultsAnimation

Bases: ValidateAlembicDefaultsPointcache

Validate the attributes on the instance are defaults.

The defaults are defined in the project settings.

Source code in client/ayon_maya/plugins/publish/validate_alembic_options_defaults.py
132
133
134
135
136
137
138
139
140
141
class ValidateAlembicDefaultsAnimation(
    ValidateAlembicDefaultsPointcache
):
    """Validate the attributes on the instance are defaults.

    The defaults are defined in the project settings.
    """
    label = "Validate Alembic Options Defaults"
    families = ["animation"]
    plugin_name = "ExtractAnimation"

ValidateAlembicDefaultsPointcache

Bases: MayaInstancePlugin, OptionalPyblishPluginMixin

Validate the attributes on the instance are defaults.

The defaults are defined in the project settings.

Source code in client/ayon_maya/plugins/publish/validate_alembic_options_defaults.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
 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
class ValidateAlembicDefaultsPointcache(
    plugin.MayaInstancePlugin, OptionalPyblishPluginMixin
):
    """Validate the attributes on the instance are defaults.

    The defaults are defined in the project settings.
    """

    order = pyblish.api.ValidatorOrder
    families = ["pointcache"]
    label = "Validate Alembic Options Defaults"
    actions = [RepairAction]
    optional = True

    plugin_name = "ExtractAlembic"

    ignore_keys = {"active"}

    @classmethod
    def _get_settings(cls, context):
        maya_settings = context.data["project_settings"]["maya"]
        settings = maya_settings["publish"]["ExtractAlembic"]
        return settings

    @classmethod
    def _get_publish_attributes(cls, instance):
        return instance.data["publish_attributes"][cls.plugin_name]

    def process(self, instance):
        if not self.is_active(instance.data):
            return

        settings = self._get_settings(instance.context)
        attributes = self._get_publish_attributes(instance)

        invalid = {}
        for key, value in attributes.items():
            if key in self.ignore_keys:
                continue

            if key not in settings:
                # This may occur if attributes have changed over time and an
                # existing instance has older legacy attributes that do not
                # match the current settings definition.
                self.log.warning(
                    "Publish attribute %s not found in Alembic Export "
                    "default settings. Ignoring validation for attribute.",
                    key
                )
                continue

            default_value = settings[key]

            # Lists are best to compared sorted since we can't rely on
            # the order of the items.
            if isinstance(value, list):
                value = sorted(value)
                default_value = sorted(default_value)

            if value != default_value:
                invalid[key] = value, default_value

        if invalid:
            non_defaults = "\n".join(
                f"- {key}: {value} \t(default: {default_value})"
                for key, (value, default_value) in invalid.items()
            )

            raise PublishValidationError(
                "Alembic extract options differ from default values:\n"
                f"{non_defaults}",
                description=self.get_description()
            )

    @staticmethod
    def get_description():
        return inspect.cleandoc(
            """### Alembic Extract settings differ from defaults

            The alembic export options differ from the project default values.

            If this is intentional you can disable this validation by
            disabling **Validate Alembic Options Default**.

            If not you may use the "Repair" action to revert all the options to
            their default values.

            """
        )

    @classmethod
    def repair(cls, instance):
        # Find create instance twin.
        create_context = instance.context.data["create_context"]
        create_instance = create_context.get_instance_by_id(
            instance.data["instance_id"]
        )

        # Set the settings values on the create context then save to workfile.
        settings = cls._get_settings(instance.context)
        attributes: PublishAttributeValues = (
            cls._get_publish_attributes(create_instance)
        )
        for key in attributes.keys():
            if key in cls.ignore_keys:
                continue

            if key not in settings:
                # This may occur if attributes have changed over time and an
                # existing instance has older legacy attributes that do not
                # match the current settings definition.
                cls.log.warning(
                    "Publish attribute %s not found in Alembic Export "
                    "default settings. Ignoring repair for attribute.",
                    key
                )
                continue
            attributes[key] = settings[key]

        create_context.save_changes()