Создание одинаковых панелей UI в разных окнах Blender без дублирования кода

Для того, чтобы создать несколько одинаковых панелей UI с одним и тем же набором полей и кнопок в разных окнах в Blender, проще всего скопировать код панели, заменив в нем параметры, определяющие, в каком именно окне панель будет показана.

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

Логичным решением этой проблемы видится использование наследования – мы пишем класс для одной панели, а затем для всех остальных панелей просто наследуем код от этого класса.

Однако API Blender не позволяет сделать это напрямую.

Определим класс для простейшей панели с одной кнопкой, вызывающей стандартный оператор добавления в сцену дефолтного куба:

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

Если мы теперь попытаемся наследовать от него класс для новой панели в окне, например, Shader Editor:

Blender выдаст ошибку:

WARN (bpy.rna): bpy_class_call: unable to get Python class for RNA struct ‘TEST_PT_panel_viewport’

и не сможет корректно отобразить обе панели в нужных окнах.

Кажется, что наследование не решает проблему дублирования кода, однако, мы все же можем ее решить, подойдя к определению классов панелей немного по другому.

Для начала определим общий класс, не наследуя его ни от какого другого класса. Определим в нем точно такие же атрибуты и точно такую же функцию “draw”, как и в классах панелей UI:

Это будет базовый класс, в функции “draw” которого мы опишем всю структуру панели UI, которая нам нужна. Создание всех необходимых на панели полей и кнопок мы поместим в эту функцию.

После этого определим два класса, один для панели в 3D вьюпорте, а второй – для панели в окне Shader Editor и наследуем их не только от системного класса bpy.types.Panel, но и от созданного нами базового класса “TEST_PT_panel_common” с описанием панели.

В этих производных классах мы переопределили параметры, отвечающие за окно для отображения панели так, чтобы каждая из них отображалась в нужном окне.

Регистрировать в API Blender необходимо только эти два производных класса. Базовый класс регистрировать не нужно.

При таком подходе Blender отображает обе панели в нужных нам окнах без ошибок.

Если же нам нужно что-то изменить во внешнем виде обоих панелей, мы будем редактировать только код в функции “draw” в одном месте – в базовом классе.

Финальный код:

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

0 Комментарий
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии