Выбрать главу

self.layout.operator("hello.hello", text='Hej').country = "Sweden"

Текст на этой кнопке - Hej, и значение свойства country является "Sweden" (Швеция). Когда мы нажимаем эту кнопку, Блендер выводит в окне терминала.следующее:

Hello world from Sweden!

В конце файла всё регистрируется с помощью вызова

bpy.utils.register_module(__name__)

Наш вновь определенный оператор кнопки можно теперь использовать как любой другой оператор Блендера. Вот сеанс в консоли Питона Блендера:

>>> bpy.ops.hello.hello(country = "USA")

Hello world from USA!

{'FINISHED'}

Другой путь вызвать наш новый оператор — нажать Пробел. Появится селектор со всеми доступными операторами в позиции курсора мыши. Сократите выбор, набрав подстроку bl_label нашего оператора в поле редактирования. Оператор с параметрами по-умолчанию выполнится, и Hello world! будет выведено в окне терминала.

#----------------------------------------------------------

# File hello.py

#----------------------------------------------------------

import bpy

#

# Меню в районе tools

#

class ToolsPanel(bpy.types.Panel):

    bl_label = "Hello from Tools"

    bl_space_type = "VIEW_3D"

    bl_region_type = "TOOLS" 

    def draw(self, context):

        self.layout.operator("hello.hello")

#

# Меню в районе toolprops

#

class ToolPropsPanel(bpy.types.Panel):

    bl_label = "Hello from Tool props"

    bl_space_type = "VIEW_3D"

    bl_region_type = "TOOL_PROPS" 

    def draw(self, context):

    self.layout.operator("hello.hello", text='Hej').country = "Sweden"

#

# Меню в районе UI

#

class UIPanel(bpy.types.Panel):

    bl_label = "Hello from UI panel"

    bl_space_type = "VIEW_3D"

    bl_region_type = "UI" 

    def draw(self, context):

        self.layout.operator("hello.hello", text='Servus')  

#

# Меню в районе окна Properties, контекст объектов

#

class ObjectPanel(bpy.types.Panel):

    bl_label = "Hello from Object context"

    bl_space_type = "PROPERTIES"

    bl_region_type = "WINDOW" bl_context = "object" 

    def draw(self, context):

self.layout.operator("hello.hello", text='Bonjour').country = "France"  

#

# Меню в районе окна Properties, контекст материалов

#

class MaterialPanel(bpy.types.Panel):

    bl_label = "Hello from Material context"

    bl_space_type = "PROPERTIES"

    bl_region_type = "WINDOW" bl_context = "material" 

    def draw(self, context):

    self.layout.operator("hello.hello", text='Ciao').country = "Italy"  

#

# Кнопка Hello выводит сообщение в консоли

#

class OBJECT_OT_HelloButton(bpy.types.Operator):

    bl_idname = "hello.hello"

    bl_label = "Say Hello"

    country = bpy.props.StringProperty()  

    def execute(self, context):

        if self.country == '':

            print("Hello world!")

        else:

            print("Hello world from %s!" % self.country)

        return{'FINISHED'}  

#

# Регистрация

# Все панели и операторы должны быть зарегистрированы в Блендере; в противном

# случае они не появятся. Самый простой путь зарегистрировать всё в файле -

# с помощью вызова bpy.utils.register_module(__name__).

bpy.utils.register_module(__name__)

Планировка панели и несколько аргументов

Эта программа иллюстрирует, как организовать размещение объектов на панели. Когда скрипт выполнится, будет создана панель в области tool props, с кнопками, расположенными нетривиальным способом.

Сценарий также показывает один метод отсылания нескольких аргументов оператору. Класс OBJECT_OT_Button имеет два свойства, number (номер) и row (строка) и печатает величины этих свойств в окне терминала. Будучи целочисленными свойствами, они оба возвращают 0 по-умолчанию, если не заданы. Таким образом, если мы нажимаем кнопки 7, 8 и 23, скрипт выведет

Row 0 button 7

Row 3 button 0

Row 0 button 0

Но что, если мы хотим задать свойства как number, так и row, то есть вызвать оператор с двумя аргументами? Это нельзя сделать непосредственно, но мы можем создать третье свойство loc, которое является строкой, и которое анализируется оператором, если не нуль. Если мы нажимаем кнопку 13, скрипт выведет

Row 4 button 13

Этот метод можно также использовать, чтобы посылать более сложные структуры данных оператору. Кроме того, мы можем использовать глобальные переменные с этой целью, смотрите подраздел A popup dialog

#----------------------------------------------------------

# File layout.py

#----------------------------------------------------------

import bpy 

# Планировка панели

class LayoutPanel(bpy.types.Panel):

    bl_label = "Panel with funny layout"

    bl_space_type = "VIEW_3D"

    bl_region_type = "TOOL_PROPS" 

    def draw(self, context):

    layout = self.layout

    layout.label("First row")

    row = layout.row(align=True)

    row.alignment = 'EXPAND'

    row.operator("my.button", text="1").number=1

    row.operator("my.button", text="2", icon='MESH_DATA').number=2

    row.operator("my.button", icon='LAMP_DATA').number=3

    row = layout.row(align=False)

    row.alignment = 'LEFT'

    row.operator("my.button", text="4").number=4

    row.operator("my.button", text="", icon='MATERIAL').number=5

    row.operator("my.button", text="6", icon='BLENDER').number=6

    row.operator("my.button", text="7", icon='WORLD').number=7