Skip to content

validate_maya_units

ValidateMayaUnits

Bases: MayaContextPlugin, OptionalPyblishPluginMixin

Check if the Maya units are set correct

Source code in client/ayon_maya/plugins/publish/validate_maya_units.py
 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
130
131
class ValidateMayaUnits(plugin.MayaContextPlugin,
                        OptionalPyblishPluginMixin):
    """Check if the Maya units are set correct"""

    order = ValidateSceneOrder
    label = "Maya Units"
    actions = [RepairContextAction]

    validate_linear_units = True
    linear_units = "cm"

    validate_angular_units = True
    angular_units = "deg"

    validate_fps = True

    nice_message_format = (
        "- <b>{setting}</b> must be <b>{required_value}</b>.  "
        "Your scene is set to <b>{current_value}</b>"
    )
    log_message_format = (
        "Maya scene {setting} must be '{required_value}'. "
        "Current value is '{current_value}'."
    )
    optional = False

    @classmethod
    def apply_settings(cls, project_settings):
        """Apply project settings to creator"""
        settings = (
            project_settings["maya"]["publish"]["ValidateMayaUnits"]
        )

        cls.validate_linear_units = settings.get("validate_linear_units",
                                                 cls.validate_linear_units)
        cls.linear_units = settings.get("linear_units", cls.linear_units)
        cls.validate_angular_units = settings.get("validate_angular_units",
                                                  cls.validate_angular_units)
        cls.angular_units = settings.get("angular_units", cls.angular_units)
        cls.validate_fps = settings.get("validate_fps", cls.validate_fps)

    def process(self, context):
        if not self.is_active(context.data):
            return
        # Collected units
        linearunits = context.data.get('linearUnits')
        angularunits = context.data.get('angularUnits')

        fps = context.data.get('fps')

        folder_attributes = context.data["folderEntity"]["attrib"]
        folder_fps = mayalib.convert_to_maya_fps(folder_attributes["fps"])

        self.log.info('Units (linear): {0}'.format(linearunits))
        self.log.info('Units (angular): {0}'.format(angularunits))
        self.log.info('Units (time): {0} FPS'.format(fps))

        invalid = []

        # Check if units are correct
        if (
            self.validate_linear_units
            and linearunits
            and linearunits != self.linear_units
        ):
            invalid.append({
                "setting": "Linear units",
                "required_value": self.linear_units,
                "current_value": linearunits
            })

        if (
            self.validate_angular_units
            and angularunits
            and angularunits != self.angular_units
        ):
            invalid.append({
                "setting": "Angular units",
                "required_value": self.angular_units,
                "current_value": angularunits
            })

        if self.validate_fps and fps and fps != folder_fps:
            invalid.append({
                "setting": "FPS",
                "required_value": folder_fps,
                "current_value": fps
            })

        if invalid:

            issues = []
            for data in invalid:
                self.log.error(self.log_message_format.format(**data))
                issues.append(self.nice_message_format.format(**data))
            issues = "\n".join(issues)

            raise PublishXmlValidationError(
                plugin=self,
                message="Invalid maya scene units",
                formatting_data={"issues": issues}
            )

    @classmethod
    def repair(cls, context):
        """Fix the current FPS setting of the scene, set to PAL(25.0 fps)"""

        cls.log.info("Setting angular unit to '{}'".format(cls.angular_units))
        cmds.currentUnit(angle=cls.angular_units)
        current_angle = cmds.currentUnit(query=True, angle=True)
        cls.log.debug(current_angle)

        cls.log.info("Setting linear unit to '{}'".format(cls.linear_units))
        cmds.currentUnit(linear=cls.linear_units)
        current_linear = cmds.currentUnit(query=True, linear=True)
        cls.log.debug(current_linear)

        cls.log.info("Setting time unit to match project")
        folder_entity = context.data["folderEntity"]
        mayalib.set_scene_fps(folder_entity["attrib"]["fps"])

apply_settings(project_settings) classmethod

Apply project settings to creator

Source code in client/ayon_maya/plugins/publish/validate_maya_units.py
38
39
40
41
42
43
44
45
46
47
48
49
50
51
@classmethod
def apply_settings(cls, project_settings):
    """Apply project settings to creator"""
    settings = (
        project_settings["maya"]["publish"]["ValidateMayaUnits"]
    )

    cls.validate_linear_units = settings.get("validate_linear_units",
                                             cls.validate_linear_units)
    cls.linear_units = settings.get("linear_units", cls.linear_units)
    cls.validate_angular_units = settings.get("validate_angular_units",
                                              cls.validate_angular_units)
    cls.angular_units = settings.get("angular_units", cls.angular_units)
    cls.validate_fps = settings.get("validate_fps", cls.validate_fps)

repair(context) classmethod

Fix the current FPS setting of the scene, set to PAL(25.0 fps)

Source code in client/ayon_maya/plugins/publish/validate_maya_units.py
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
@classmethod
def repair(cls, context):
    """Fix the current FPS setting of the scene, set to PAL(25.0 fps)"""

    cls.log.info("Setting angular unit to '{}'".format(cls.angular_units))
    cmds.currentUnit(angle=cls.angular_units)
    current_angle = cmds.currentUnit(query=True, angle=True)
    cls.log.debug(current_angle)

    cls.log.info("Setting linear unit to '{}'".format(cls.linear_units))
    cmds.currentUnit(linear=cls.linear_units)
    current_linear = cmds.currentUnit(query=True, linear=True)
    cls.log.debug(current_linear)

    cls.log.info("Setting time unit to match project")
    folder_entity = context.data["folderEntity"]
    mayalib.set_scene_fps(folder_entity["attrib"]["fps"])