Шина передачи сообщений

В API Blender существует модуль, с помощью которого можно отслеживать изменение любого свойства, доступного через Python API. Этот модуль – шина передачи данных или “Message Bus”.

 

Рассмотрим, как можно создать функцию-обработчик события для отслеживания изменения какого-либо свойства. Например – местоположения 3D курсора в сцене.

Для начала определим простейшую функцию, которая будет выводить в системную консоль (Главное меню – window – Toggle System Console) текущие координаты 3D курсора при их изменении.

Шина передачи данных работает с rna-структурами объектов. Поэтому для того, чтобы получить возможность отслеживать какое-либо свойство с ее помощью, нужно обращаться к объекту через его тип в bpy.types.

Воспользовавшись документацией Blender API, найдем описание типа для 3D курсора:

Получив нужный тип и зная название свойства, которое мы хотим отслеживать – location, подпишем определенную выше  функцию “on_change_cursor_pos” в качестве обработчика на изменение положения 3D курсора.

В параметр “key” мы передаем тип объекта и имя его отслеживаемого свойства.

Через параметр “args” можно передать необязательные дополнительные аргументы.

В параметре “notify” мы указываем функцию – обработчик, которая будет выполняться каждый раз, когда свойство из параметра “key” будет изменено.

Соберем весь код вместе:

После выполнения этого кода при изменении положения 3D курсора в консоль будут выводиться его новые координаты.

Ограничения

Шина передачи данных является мощным инструментом контроля за свойствами объектов в Blender. Однако, в ней есть очень существенный недостаток – ее работа завязана на rna-структуру объекта, что означает. что сообщения об изменении свойств будут проходить через шину только если свойство меняется через интерфейс (панели интерфейса) Blender или через его Python API.

Пока мы меняем положение курсора, изменяя значения в полях в N-панели – наш обработчик отлично работает.

Он также сработает если в Python-консоли мы зададим координаты курсора через API:

Однако шина передачи сообщений не будет работать при изменении положения курсора мышкой напрямую в окне вьюпорта – через зажатие клавиши “shift” и клик правой кнопкой мышки, или, при активном инструменте “Cursor” – при перемещении курсора левой кнопкой мышки!

Также шина передачи данных не работает при изменении свойства с помощью кривых анимации!

 

*.blend файл и python-скрипт с кодом для моих подписчиков на Patreon

0 0 голоса
Article Rating
Подписаться
Уведомить о
guest
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии