Skip to content

action

SelectInvalidAction

Bases: Action

Select invalid objects in Blender when a publish plug-in failed.

Source code in client/ayon_blender/api/action.py
 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
class SelectInvalidAction(pyblish.api.Action):
    """Select invalid objects in Blender when a publish plug-in failed."""
    label = "Select Invalid"
    on = "failed"
    icon = "search"

    def process(self, context, plugin):
        errored_instances = get_errored_instances_from_context(context,
                                                               plugin=plugin)

        # Get the invalid nodes for the plug-ins
        self.log.info("Finding invalid nodes...")
        invalid = list()
        for instance in errored_instances:
            invalid_nodes = plugin.get_invalid(instance)
            if invalid_nodes:
                if isinstance(invalid_nodes, (list, tuple)):
                    invalid.extend(invalid_nodes)
                else:
                    self.log.warning(
                        "Failed plug-in doesn't have any selectable objects."
                    )

        bpy.ops.object.select_all(action='DESELECT')

        # Make sure every node is only processed once
        invalid = list(set(invalid))
        if not invalid:
            self.log.info("No invalid nodes found.")
            return

        invalid_names = [obj.name for obj in invalid]
        self.log.info(
            "Selecting invalid objects: %s", ", ".join(invalid_names)
        )
        # Select the objects and also make the last one the active object.
        for obj in invalid:
            obj.select_set(True)

        bpy.context.view_layer.objects.active = invalid[-1]