Отслеживать переключение работы с объектами в режим редактирования и обратно в объектный режим через обычные обработчики в Blender нельзя, в bpy.app.handlers не предусмотрено обработчиков для такого события. Однако это можно отследить через шину передачи сообщений.
Определим простейшую функцию для печати в системной консоли (главное меню – window – toggle system console) имени текущего активного объекта и режима, в который его переключил пользователь.
1 2 |
def on_mode_change(): print(bpy.context.object, bpy.context.object.mode) |
Для того чтобы эта функция вызывалась в момент переключения пользователем режима редактирования объекта, нажатием на клавишу TAB или из рабочего меню, подпишем ее в качестве обработчика для шины передачи сообщений.
1 2 3 4 5 6 |
bpy.msgbus.subscribe_rna( key=bpy.context.object.path_resolve('mode', False), owner=bpy.context.object, args=tuple(), notify=on_mode_change ) |
В первый параметр key мы передаем указатель на отслеживаемое свойство текущего активного объекта – mode. Правильный путь к указателю можно получить через функцию path_resolve.
Второй параметр – owner задает владельца для данной подписки. Назначим владельцем сам объект, для которого отслеживается переключение режима работы.
Наша функция on_mode_change не имеет входных параметров, поэтому для args мы указываем пустой кортеж. При необходимости здесь мы можем передать в нашу функцию нужные параметры.
И наконец, в параметре notify мы присваиваем указатель на нашу функцию, которая будет вызываться при переключении режима работы с объектом.
После выполнения приведенного кода, в системной консоли при каждом переключении режима работы с объектом будет выводиться следующая информация:
1 2 3 4 |
<bpy_struct, Object("Cube.001") at 0x000001BC5EC2EB08> EDIT <bpy_struct, Object("Cube.001") at 0x000001BC5EC2EB08> OBJECT <bpy_struct, Object("Suzanne") at 0x000001BC5EC2DD08> EDIT <bpy_struct, Object("Suzanne") at 0x000001BC5EC2DD08> OBJECT |
Такая подписка отслеживает изменение режима работы с конкретным объектом. Если мы хотим отслеживать переключение режима для других объектов, нужно будет вызывать наш код для каждого из них.
Мы можем упростить ситуацию и отслеживать переключение режима редактирования для всех объектов в сцене разом.
Для этого нужно вместо конкретного объекта в параметре key указать кортеж, состоящий из двух элементов: указателя на тип объекта и названия отслеживаемого свойства.
Владельца подписки также нужно назначить более общего, не связанного с конкретными объектами, например “bpy”.
1 2 3 4 5 6 |
bpy.msgbus.subscribe_rna( key=(bpy.types.Object, 'mode'), owner=bpy, args=tuple(), notify=on_mode_change, ) |
Этот код достаточно выполнить один раз и наша функция, указанная в обработчике notify, будет вызываться для каждого объекта в сцене при изменении режима работы с ним.