Для того чтобы установить иконку на кнопки в кастомных пользовательских панелях UI в Blender, мы ищем текстовый идентификатор нужной иконки (обычно при помощи встроенного аддона Icon Viewer) и устанавливаем его значение в параметр icon, при привязке к кнопке нужного оператора. Однако иконки, используемые в панели инструментов отсутствуют в перечне стандартных иконок Blender.
Пусть иконок инструментов и нет в стандартном наборе, получить их идентификаторы, а затем использовать их в пользовательских панелях все-таки можно.
Для получения идентификатора иконки нам нужно получить идентификатор инструмента с нужной иконкой, а затем воспользоваться классом ToolSelectPanelHelper для получения собственно идентификатора иконки.
Идентификатор нужного инструмента можно получить при помощи следующего скрипта.
Для примера возьмем инструмент аннотаций Annotate. Его идентификатор: “ops.gpencil.draw”.
Импортируем класс ToolSelectPanelHelper и при помощи метода _icon_value_from_icon_handle получим цифровой идентификатор иконки.
1 2 3 4 5 6 |
from bl_ui.space_toolsystem_common import ToolSelectPanelHelper icon_id = ToolSelectPanelHelper._icon_value_from_icon_handle('ops.gpencil.draw') print(icon_id) # 1003 |
Обратите внимание, этот метод не документирован и является приватным, его корректная работа разработчиками не гарантируется!
Имея идентификатор иконки мы можем использовать его при оформлении кнопок в пользовательской панели UI.
Оформим класс тестовой панели с одной кнопкой.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import bpy from bpy.types import Panel from bpy.utils import register_class from bl_ui.space_toolsystem_common import ToolSelectPanelHelper class TEST_PT_panel(Panel): bl_idname = 'TEST_PT_panel' bl_label = 'TEST' bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_category = 'TEST' def draw(self, context): icon_id = ToolSelectPanelHelper._icon_value_from_icon_handle('ops.gpencil.draw') layout = self.layout layout.scale_y = 2 layout.operator( operator='mesh.primitive_cube_add', icon_value=icon_id, text='' ) register_class(TEST_PT_panel) |
Внутри функции draw(), которая отвечает за отображение UI, мы создаем одну кнопку. На эту кнопку мы привязываем вызов оператора добавления куба в сцену “mesh.primitive_cube_add”.
Перед этим мы получили идентификатор иконки инструмента, а затем устанавливаем полученное значение в параметре icon_value при назначении оператора на кнопку.
Так как иконки инструментов по размеру больше стандартных иконок, мы увеличили размер кнопок на нашей панели в два раза, установив масштаб scale_y = 2.