# Другой тестовый вызов, на этот раз вызывается непосредственно
# 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 Блендера для создания всплывающего окна диалога для уведомления пользователя.
Скрипт сканирует файл. Если найдено слово return
(возврат), скрипт открывает всплывающее окно, чтобы сообщить пользователю, что произошла ошибка и на какой строке. Если во всём файле такого слова нет, всплывающее окно отображает число отсканированных строк.
На момент написания, этот скрипт был причиной утечек памяти, что делало работу Блендера неустойчивой. Эта ошибка, мы надеемся, будет исправлена в ближайшее время.
#----------------------------------------------------------
# File error.py
# Simple error dialog
#----------------------------------------------------------
import bpy
from bpy.props import *
#
# Оператор сообщения об ошибке. При вызове, всплывает
# диалоговое окно с переданным сообщением.
#
class MessageOperator(bpy.types.Operator):
bl_idname = "error.message"
bl_label = "Message"
type = StringProperty()
message = StringProperty()
def execute(self, context):
self.report({'INFO'}, self.message)
print(self.message)
return {'FINISHED'}
def invoke(self, context, event):
wm = context.window_manager
return wm.invoke_popup(self, width=400, height=200)
def draw(self, context):
self.layout.label("A message has arrived")
row = self.layout.split(0.25)
row.prop(self, "type")
row.prop(self, "message")
row = self.layout.split(0.80)
row.label("") row.operator("error.ok")
#
# Кнопка ОК в диалоге ошибки
#
class OkOperator(bpy.types.Operator):
bl_idname = "error.ok"
bl_label = "OK"
def execute(self, context):
return {'FINISHED'}
#
# Открывает диалог выбора файла и начинает сканирование выбранного файла.
#
class ScanFileOperator(bpy.types.Operator):
bl_idname = "error.scan_file"
bl_label = "Scan file for return"
filepath = bpy.props.StringProperty(subtype="FILE_PATH")
def execute(self, context):
Читать дальше