Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода - страница 28

стр.

>

># 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")  


>#

># Регистрация bpy.utils.register_module(__name__)


Диалоговое окно ошибки

Насколько я знаю, Блендер не имеет элегантных средств уведомления пользователя, что что-то пошло не так. Можно напечатать сообщение в окне терминала или в информационной панели, а затем вызвать исключение. Большинство современных приложений вместо этого открывают окно сообщения и выводят сообщение об ошибке. Следующий скрипт использует API Блендера для создания всплывающего окна диалога для уведомления пользователя.