Книга: Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода

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

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)

Оглавление книги


Генерация: 1.029. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз