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

class MyModalPanel(bpy.types.Panel):

    bl_label = "My modal operator"

    bl_space_type = "VIEW_3D"

    bl_region_type = "TOOLS" 

    def draw(self, context):

        self.layout.operator("mine.modal_op")  

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

bpy.utils.register_module(__name__) 

# Автоматически перемещает активный объект при запуске

bpy.ops.mine.modal_op('INVOKE_DEFAULT')

Invoke (вызов) против execute (выполнения)

Этот скрипт иллюстрирует разницу между invoke (вызывать) и execute (выполнять). Вызываемое (invoking) событие является аргументом функции Operator.invoke, который устанавливает два свойства целого типа x и y для положения мыши и вызывает функцию Operator.execute. Как альтернатива, мы можем выполнить (execute) оператор и явно установить x и y: bpy.ops.wm.mouse_position(’EXEC_DEFAULT’, x=20, y=66)

Вместо вывода координат мыши в окно терминала, информация отправляется в информационную панель в верхнем правом углу. Это хорошее место для отображения краткого уведомления, так как пользователю не придется искать его в другом окне, тем более, что терминал/DOS-окно отображается не во всех версиях Blender. Однако длинные сообщения трудно вписываются в ограниченное пространство информационной панели.

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

# File invoke.py # from API documentation

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

import bpy 

class SimpleMouseOperator(bpy.types.Operator):

    """ Этот оператор показывает расположение мыши,

    эта строка используется для подсказки (tooltip) и документирования API

    """

    bl_idname = "wm.mouse_position"

    bl_label = "Mouse location"

    x = bpy.props.IntProperty()

    y = bpy.props.IntProperty()  

   def execute(self, context):

       # Вместо печати в консоли, используется функция report,

       # таким образом, появляется сообщение в заголовке

        self.report({'INFO'}, "Mouse coords are %d %d" % (self.x, self.y))

       return {'FINISHED'}  

    def invoke(self, context, event):

        self.x = event.mouse_x

        self.y = event.mouse_y

        return self.execute(context)  

#

# Панель в районе tools

#

class MousePanel(bpy.types.Panel):

    bl_label = "Mouse"

    bl_space_type = "VIEW_3D"

    bl_region_type = "TOOL_PROPS" 

    def draw(self, context):

        self.layout.operator("wm.mouse_position")  

#

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

# Нет действительной необходимости регистрировать класс, потому что

# это происходит автоматически, когда регистрируется модуль.

# С другой стороны, это не повредит.

bpy.utils.register_class(SimpleMouseOperator)

bpy.utils.register_module(__name__)  

# Автоматически отображать позицию мыши при запуске

bpy.ops.wm.mouse_position('INVOKE_DEFAULT')  

# Другой тестовый вызов, на этот раз вызывается непосредственно

# execute() с предустановленными настройками.

#bpy.ops.wm.mouse_position('EXEC_DEFAULT', x=20, y=66)

Всплывающий диалог

Если этот скрипт запустить, появится всплывающее окно, где вы можете задать некоторые свойства. После того, как вы выйдите из всплывающего окна перемещением мыши наружу, свойства будут выведены одновременно в окно информации и на консоль.

В подразделе "Планировка панели и несколько аргументов" мы использовали одну строку для передачи нескольких аргументов в оператор. Здесь мы используем глобальные переменные для той же цели.

<

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

# File popup.py

# from API documentation

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

import bpy

from bpy.props import *  

theFloat = 9.8765

theBool = False

theString = "Lorem ..."

theEnum = 'one' 

class DialogOperator(bpy.types.Operator):

    bl_idname = "object.dialog_operator"

    bl_label = "Simple Dialog Operator"

    my_float = FloatProperty(name="Some Floating Point",

        min=0.0, max=100.0)

    my_bool = BoolProperty(name="Toggle Option")

    my_string = StringProperty(name="String Value")

    my_enum = EnumProperty(name="Enum value",

        items = [('one', 'eins', 'un'),

                 ('two', 'zwei', 'deux'),

                 ('three', 'drei', 'trois')])  

    def execute(self, context):

    message = "%.3f, %d, '%s' %s" % (self.my_float,

        self.my_bool, self.my_string, self.my_enum)

    self.report({'INFO'}, message)

    print(message)

    return {'FINISHED'}  

    def invoke(self, context, event):

        global theFloat, theBool, theString, theEnum

        self.my_float = theFloat

        self.my_bool = theBool

        self.my_string = theString

        self.my_enum = theEnum

        return context.window_manager.invoke_props_dialog(self)   

bpy.utils.register_class(DialogOperator)  

# Вызов диалогового окна при загрузке

bpy.ops.object.dialog_operator('INVOKE_DEFAULT')  

#

# Панель в районе tools

#

class DialogPanel(bpy.types.Panel):

    bl_label = "Dialog"

    bl_space_type = "VIEW_3D"

    bl_region_type = "UI" 

    def draw(self, context):

        global theFloat, theBool, theString, theEnum

        theFloat = 12.345

        theBool = True

        theString = "Code snippets"

        theEnum = 'two'

        self.layout.operator("object.dialog_operator")