forked from pyblish/pyblish-magenta
/
validate_transform_zero.py
67 lines (48 loc) · 1.84 KB
/
validate_transform_zero.py
1
2
3
4
5
6
7
8
9
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
import pyblish.api
import pyblish_magenta.api
from pyblish_magenta.action import SelectInvalidAction
from maya import cmds
class ValidateTransformZero(pyblish.api.Validator):
"""Transforms can't have any values
To solve this issue, try freezing the transforms. So long
as the transforms, rotation and scale values are zero,
you're all good.
"""
order = pyblish_magenta.api.ValidateContentsOrder
families = ["model"]
hosts = ["maya"]
category = "geometry"
version = (0, 1, 0)
label = "Transform Zero (Freeze)"
actions = [SelectInvalidAction]
_identity = [1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0]
_tolerance = 1e-30
@classmethod
def get_invalid(cls, instance):
"""Returns the invalid transforms in the instance.
This is the same as checking:
- translate == [0, 0, 0] and rotate == [0, 0, 0] and
scale == [1, 1, 1] and shear == [0, 0, 0]
.. note::
This will also catch camera transforms if those
are in the instances.
Returns:
list: Transforms that are not identity matrix
"""
transforms = cmds.ls(instance, type="transform")
invalid = []
for transform in transforms:
mat = cmds.xform(transform, q=1, matrix=True, objectSpace=True)
if not all(abs(x-y) < cls._tolerance
for x, y in zip(cls._identity, mat)):
invalid.append(transform)
return invalid
def process(self, instance):
"""Process all the nodes in the instance "objectSet"""
invalid = self.get_invalid(instance)
if invalid:
raise ValueError("Nodes found with transform "
"values: {0}".format(invalid))