При размещении пользовательских панелей UI на нужной вкладке в рабочей области Properties используется параметр bl_context. Указываемое в этом параметре значение отвечает за то, на какой именно вкладке будет размещаться пользовательская панель.
Например, для того чтобы разместить кастомную панель UI на вкладке “Render Properties”, в описании панели параметру bl_context нужно присвоить значение “render”.
1 2 3 4 5 6 7 8 9 10 11 |
class TestPanel(bpy.types.Panel): bl_idname = 'OBJECT_PT_test_panel' bl_label = 'TEST PANEL' bl_space_type = 'PROPERTIES' bl_region_type = 'WINDOW' bl_context = 'render' def draw(self, context): self.layout.label(text='TEST PANEL') bpy.utils.register_class(TestPanel) |
Узнать нужные значения для каждой вкладки, можно кликнуть правой кнопкой по любому полю, уже размещенному в ней, во всплывающем меню выбрать “Edit Source”, прокрутить открывшийся код вверх до определения класса и просто посмотреть нужное значение.
Также мы можем получить все возможные значения параметра bl_context пройдя по определениям всех панелей, использующихся в API Blender.
Для начала из списка типов bpy.types получим все классы, которые наследованы от типа панели UI – bpy.types.Panel.
Определим функцию-генератор, которая позволит нам пройти в цикле по всем классам панелей:
1 2 3 4 5 6 |
def all_panels_related_classes(): for prop in dir(bpy.types): prop_cls = getattr(bpy.types, prop) if hasattr(prop_cls, '__mro__'): if bpy.types.Panel in prop_cls.__mro__: yield prop_cls |
Кортеж __mro__ предоставляет нам доступ ко всем классам, от которых наследуется текущий класс. Проверяя, есть ли в нем класс bpy.types.Panel мы отсеиваем только те классы bpy.types, которые отвечают за панели интерфейса Blender.
Получив перечень нужных классов, нам остается только пройти по ним и получить значение свойства bl_context:
1 2 3 4 5 6 7 8 9 10 11 |
for cls in all_panels_related_classes(): if hasattr(cls, 'bl_context'): print(getattr(cls, 'bl_context')) # ... # view_layer # view_layer # world # world # world # ... |
Или же, чтобы видеть только уникальные значения, взять сет:
1 2 3 |
print(set((getattr(cls, 'bl_context') for cls in all_panels_related_classes() if hasattr(cls, 'bl_context')))) # {'modifier', 'input', '.sculpt_mode', '.particlemode', 'shaderfx', 'particle', ... , 'material'} |
Полный список значений для Blender 3.5:
{‘modifier’, ‘input’, ‘.sculpt_mode’, ‘.particlemode’, ‘shaderfx’, ‘particle’, ‘keymap’, ‘.mesh_edit’, ‘bone’, ‘experimental’, ‘.greasepencil_weight’, ‘render’, ‘.weightpaint’, ‘.imagepaint’, ‘editing’, ‘viewport’, ‘lights’, ‘.greasepencil_sculpt’, ‘collection’, ‘navigation’, ‘.uv_sculpt’, ‘physics’, ‘output’, ‘.paint_common_2d’, ‘addons’, ‘.greasepencil_vertex’, ‘bone_constraint’, ‘.armature_edit’, ‘data’, ‘.posemode’, ‘.objectmode’, ‘texture’, ‘scene’, ‘file_paths’, ‘.greasepencil_paint’, ‘animation’, ‘.vertexpaint’, ‘view_layer’, ‘object’, ‘interface’, ‘save_load’, ‘system’, ‘themes’, ‘.imagepaint_2d’, ‘world’, ‘constraint’, ‘.paint_common’, ‘.curves_sculpt’, ‘material’}