Как отследить переключение между объектным режимом и режимом редактирования объекта

Отслеживать переключение работы с объектами в режим редактирования и обратно в объектный режим через обычные обработчики в Blender нельзя, в bpy.app.handlers не предусмотрено обработчиков для такого события. Однако это можно отследить через шину передачи сообщений.

Определим простейшую функцию для печати в системной консоли (главное меню – window – toggle system console) имени текущего активного объекта и режима, в который его переключил пользователь.

Для того чтобы эта функция вызывалась в момент переключения пользователем режима редактирования объекта, нажатием на клавишу TAB или из рабочего меню, подпишем ее в качестве обработчика для шины передачи сообщений.

В первый параметр key мы передаем указатель на отслеживаемое свойство текущего активного объекта – mode. Правильный путь к указателю можно получить через функцию path_resolve.

Второй параметр – owner задает владельца для данной подписки. Назначим владельцем сам объект, для которого отслеживается переключение режима работы.

Наша функция on_mode_change не имеет входных параметров, поэтому для args мы указываем пустой кортеж.  При необходимости здесь мы можем передать в нашу функцию нужные параметры.

И наконец, в параметре notify мы присваиваем указатель на нашу функцию, которая будет вызываться при переключении режима работы с объектом.

После выполнения приведенного кода, в системной консоли при каждом переключении режима работы с объектом будет выводиться следующая информация:

Такая подписка отслеживает изменение режима работы с конкретным объектом. Если мы хотим отслеживать переключение режима для других объектов, нужно будет вызывать наш код для каждого из них.

Мы можем упростить ситуацию и отслеживать переключение режима редактирования для всех объектов в сцене разом.

Для этого нужно вместо конкретного объекта в параметре key указать кортеж, состоящий из двух элементов: указателя на тип объекта и названия отслеживаемого свойства.

Владельца подписки также нужно назначить более общего, не связанного с конкретными объектами, например “bpy”.

Этот код достаточно выполнить один раз и наша функция, указанная в обработчике notify, будет вызываться для каждого объекта в сцене при изменении режима работы с ним.

0 0 голоса
Article Rating
Подписаться
Уведомить о
guest

0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии