Skip to content

validate_transform_zero

ValidateTransformZero

Bases: BlenderInstancePlugin, OptionalPyblishPluginMixin

Transforms can't have any values

Source code in client/ayon_blender/plugins/publish/validate_transform_zero.py
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
class ValidateTransformZero(
    plugin.BlenderInstancePlugin,
    OptionalPyblishPluginMixin
):
    """Transforms can't have any values"""

    order = ValidateContentsOrder
    hosts = ["blender"]
    families = ["model"]
    label = "Transform Zero"
    actions = [ayon_blender.api.action.SelectInvalidAction,
               RepairAction]

    _identity = mathutils.Matrix()

    @classmethod
    def get_invalid(cls, instance) -> List:
        invalid = []
        for obj in instance:
            if (
                isinstance(obj, bpy.types.Object)
                and obj.matrix_basis != cls._identity
            ):
                invalid.append(obj)
        return invalid

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

        invalid = self.get_invalid(instance)
        if invalid:
            names = ", ".join(obj.name for obj in invalid)
            raise PublishValidationError(
                "Objects found in instance which do not"
                f" have transform set to zero: {names}",
                description=self.get_description()
            )

    @classmethod
    def repair(cls, instance):

        invalid = cls.get_invalid(instance)
        if not invalid:
            return

        context = plugin.create_blender_context(
            active=invalid[0], selected=invalid
        )
        with lib.maintained_selection():
            with bpy.context.temp_override(**context):
                plugin.deselect_all()
                for obj in invalid:
                    obj.select_set(True)

                # TODO: Preferably this does allow custom pivot point locations
                #  and if so, this should likely apply to the delta instead
                #  using `bpy.ops.object.transforms_to_deltas(mode="ALL")`
                bpy.ops.object.transform_apply(location=True,
                                               rotation=True,
                                               scale=True)

    def get_description(self):
        return inspect.cleandoc(
            """## Transforms can't have any values.

            The location, rotation and scale on the transform must be at
            the default values. This also goes for the delta transforms.

            To solve this issue, try freezing the transforms:
            - `Object` > `Apply` > `All Transforms`

            Using the Repair action directly will do the same.

            So long as the transforms, rotation and scale values are zero,
            you're all good.
            """
        )