Skip to content

validate_camera_attributes

ValidateCameraAttributes

Bases: OptionalPyblishPluginMixin, InstancePlugin

Validates Camera has no invalid attribute properties or values.(For 3dsMax Cameras only)

Source code in client/ayon_max/plugins/publish/validate_camera_attributes.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
class ValidateCameraAttributes(OptionalPyblishPluginMixin,
                               pyblish.api.InstancePlugin):
    """Validates Camera has no invalid attribute properties
    or values.(For 3dsMax Cameras only)

    """

    order = pyblish.api.ValidatorOrder
    families = ['camera']
    hosts = ['max']
    label = 'Validate Camera Attributes'
    actions = [SelectInvalidAction, RepairAction]
    optional = True

    settings_category = "max"

    DEFAULTS = ["fov", "nearrange", "farrange",
                "nearclip", "farclip"]
    CAM_TYPE = ["Freecamera", "Targetcamera",
                "Physical"]

    @classmethod
    def get_invalid(cls, instance):
        invalid = []
        if rt.units.DisplayType != rt.Name("Generic"):
            cls.log.warning(
                "Generic Type is not used as a scene unit\n\n"
                "sure you tweak the settings with your own values\n\n"
                "before validation.")
        cameras = instance.data["members"]
        project_settings = instance.context.data["project_settings"].get("max")
        cam_attr_settings = (
            project_settings["publish"]["ValidateCameraAttributes"]
        )
        for camera in cameras:
            if str(rt.ClassOf(camera)) not in cls.CAM_TYPE:
                cls.log.debug(
                    "Skipping camera created from external plugin..")
                continue
            for attr in cls.DEFAULTS:
                default_value = cam_attr_settings.get(attr)
                if default_value == float(0):
                    cls.log.debug(
                        f"the value of {attr} in setting set to"
                        " zero. Skipping the check.")
                    continue
                if round(rt.getProperty(camera, attr), 1) != default_value:
                    cls.log.error(
                        f"Invalid attribute value for {camera.name}:{attr} "
                        f"(should be: {default_value}))")
                    invalid.append(camera)

        return invalid

    def process(self, instance):
        if not self.is_active(instance.data):
            self.log.debug("Skipping Validate Camera Attributes.")
            return
        invalid = self.get_invalid(instance)

        if invalid:
            raise PublishValidationError(
                "Invalid camera attributes found. See log.")

    @classmethod
    def repair(cls, instance):
        invalid_cameras = cls.get_invalid(instance)
        project_settings = instance.context.data["project_settings"].get("max")
        cam_attr_settings = (
            project_settings["publish"]["ValidateCameraAttributes"]
        )
        for camera in invalid_cameras:
            for attr in cls.DEFAULTS:
                expected_value = cam_attr_settings.get(attr)
                if expected_value == float(0):
                    cls.log.debug(
                        f"the value of {attr} in setting set to zero.")
                    continue
                rt.setProperty(camera, attr, expected_value)