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
 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
class ValidateMayaUnits(plugin.MayaContextPlugin,
                        OptionalPyblishPluginMixin):
    """Check if the Maya units are set correct"""

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

    validate_linear_units = True

    validate_angular_units = True

    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

    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 = []

        project_settings: dict = context.data["project_settings"]
        linear_units, angular_units = get_scene_units_settings(
            project_settings
        )

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

        if (
            self.validate_angular_units
            and angularunits
            and angularunits != angular_units
        ):
            invalid.append({
                "setting": "Angular units",
                "required_value": 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)"""

        linear_units, angular_units = get_scene_units_settings()
        if cls.validate_angular_units:
            cls.log.info("Setting angular unit to '{}'".format(angular_units))
            cmds.currentUnit(angle=angular_units)

        if cls.validate_linear_units:
            cls.log.info("Setting linear unit to '{}'".format(linear_units))
            cmds.currentUnit(linear=linear_units)

        cls.log.info("Setting time unit to match project")
        folder_entity = context.data["folderEntity"]
        mayalib.set_scene_fps(folder_entity["attrib"]["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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
@classmethod
def repair(cls, context):
    """Fix the current FPS setting of the scene, set to PAL(25.0 fps)"""

    linear_units, angular_units = get_scene_units_settings()
    if cls.validate_angular_units:
        cls.log.info("Setting angular unit to '{}'".format(angular_units))
        cmds.currentUnit(angle=angular_units)

    if cls.validate_linear_units:
        cls.log.info("Setting linear unit to '{}'".format(linear_units))
        cmds.currentUnit(linear=linear_units)

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