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
 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
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
        scene_linear_units = context.data.get("linearUnits")
        scene_angular_units = context.data.get("angularUnits")
        scene_fps = context.data.get("fps")
        self.log.info(f"Units (linear): {scene_linear_units}")
        self.log.info(f"Units (angular): {scene_angular_units}")
        self.log.info(f"Units (time): {scene_fps} FPS")

        context_fps = mayalib.convert_to_maya_fps(
            self._get_context_fps(context)
        )

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

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

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

        if self.validate_fps and scene_fps and scene_fps != context_fps:
            invalid.append({
                "setting": "FPS",
                "required_value": context_fps,
                "current_value": scene_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(f"Setting angular unit to '{angular_units}'")
            cmds.currentUnit(angle=angular_units)

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

        context_fps = cls._get_context_fps(context)
        cls.log.info(f"Setting time unit to match context: {context_fps}")
        mayalib.set_scene_fps(context_fps)

    @staticmethod
    def _get_context_fps(context: pyblish.api.Context) -> float:
        return context.data["taskEntity"]["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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
@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(f"Setting angular unit to '{angular_units}'")
        cmds.currentUnit(angle=angular_units)

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

    context_fps = cls._get_context_fps(context)
    cls.log.info(f"Setting time unit to match context: {context_fps}")
    mayalib.set_scene_fps(context_fps)