Для отображения в UI рядом со свойством, текстовым лейблом или на кнопке оператора соответствующей иконки нужно указать ее идентификатор в параметре icon или icon_value. Но не для всех видов иконок их идентификаторы заранее известны. Например, нельзя заранее определить id для генерирующихся в рантайме иконок процедурных текстур и материалов.
Для того, чтобы получить идентификатор такой динамической иконки в UI, можно воспользоваться методом icon класса UILayout.
К классу UILayout мы можем обратиться внутри функции draw через ссылку self.layout.
Для примера определим класс, создающий пользовательскую панель в N-панели окна 3D Viewport, и выведем на нее список всех имеющихся в сцене материалов с иконками:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import bpy from bpy.types import Panel from bpy.utils import register_class class MATLIST_PT_panel(Panel): bl_idname = 'MATLIST_PT_panel' bl_label = 'Materials List' bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_category = 'Materials List' def draw(self, context): layout = self.layout register_class(MATLIST_PT_panel) |
В функции draw в переменную layout мы заносим нужный нам указатель на класс UILayout.
Далее, для того, чтобы вывести на панель все материалы сцены, пробежим по их списку, создавая для каждого материала текстовый лейбл.
1 2 |
for mat in bpy.data.materials: layout.label(text=mat.name) |
Рядом с именем материала выведем его иконку.
Получить идентификатор иконки материала мы можем при помощи метода icon, передав ему в параметре ссылку на текущий материал.
1 |
layout.icon(mat) |
Добавим полученный идентификатор иконки при создании текстового лейбла в параметр icon_value.
1 2 |
for mat in bpy.data.materials: layout.label(text=mat.name, icon_value=layout.icon(mat)) |
Теперь рядом с названием материала будет отображаться и его иконка.
Полный текст примера:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
import bpy from bpy.types import Panel from bpy.utils import register_class class MATLIST_PT_panel(Panel): bl_idname = 'MATLIST_PT_panel' bl_label = 'Materials List' bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_category = 'Materials List' def draw(self, context): layout = self.layout for mat in bpy.data.materials: layout.label(text=mat.name, icon_value=layout.icon(mat)) register_class(MATLIST_PT_panel) |
*.blend-файл с примером кода для моих подписчиков на Patreon.