Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода - страница 23
>
> layout.label("Fifth row")
> row = layout.row() split = row.split(percentage=0.25)
> col = split.column()
> col.operator("my.button", text="21").loc="5 21"
> col.operator("my.button", text="22")
> split = split.split(percentage=0.3)
> col = split.column()
> col.operator("my.button", text="23")
> split = split.split(percentage=0.5)
> col = split.column()
> col.operator("my.button", text="24")
> col.operator("my.button", text="25")
># Кнопка
>class OBJECT_OT_Button(bpy.types.Operator):
> bl_idname = "my.button"
> bl_label = "Button" number = bpy.props.IntProperty()
> row = bpy.props.IntProperty()
> loc = bpy.props.StringProperty()
> def execute(self, context):
> if self.loc:
> words = self.loc.split()
> self.row = int(words[0])
> self.number = int(words[1])
> print("Row %d button %d" % (self.row, self.number))
> return{'FINISHED'}
># Регистрация
>bpy.utils.register_module(__name__)
Свойства обсуждались в разделе Свойства, но мы не объяснили, как отображать заказные свойства на панели. Этот скрипт как раз делает это. RNA-свойство отображается синтаксисом
>layout.prop(ob, 'myRnaInt')
ID-свойства отображаются с помощью
>layout.prop(ob, '["myRnaInt"]')
Заметьте, что панель регистрируется явно с помощью >bpy.utils.register_class(MyPropPanel)
вместо использования register_module, который регистрирует всё. Какой метод использовать, не имеет значения в этом примере, поскольку >MyPropPanel
- единственное, что нужно зарегистрировать.
>#----------------------------------------------------------
># File panel_props.py
>#----------------------------------------------------------
>import bpy
>from bpy.props import *
># Очистка сцены и создание нескольких объектов
>bpy.ops.object.select_by_type(type='MESH')
>bpy.ops.object.delete()
>bpy.ops.mesh.primitive_cube_add(location=(-3,0,0))
>cube = bpy.context.object
>bpy.ops.mesh.primitive_cylinder_add(location=(0,0,0))
>cyl = bpy.context.object
>bpy.ops.mesh.primitive_uv_sphere_add(location=(3,0,0))
>sphere = bpy.context.object
># Определение RNA-
>свойств для каждого объекта
>bpy.types.Object.myRnaInt = IntProperty(
> name="RNA int",
> min = -100, max = 100,
> default = 33)
># Определение RNA-свойств для каждого меша
>bpy.types.Mesh.myRnaFloat = FloatProperty(
> name="RNA float",
> default = 12.345)
># Присвоение RNA-свойств кубу
>cube.myRnaInt = -99
>cube.data.myRnaFloat = -1
># Создание ID-свойств посредством присвоения
>cube["MyIdString"] = "I am an ID prop"
>cube.data["MyIdBool"] = True
># Панель свойств
>class MyPropPanel(bpy.types.Panel):
> bl_label = "My properties"
> bl_space_type = "VIEW_3D"
> bl_region_type = "UI"
> def draw(self, context):
> ob = context.object
> if not ob:
> return
> layout = self.layout
> layout.prop(ob, 'myRnaInt')
> try:
> ob["MyIdString"]
> layout.prop(ob, '["MyIdString"]')
> except:
> pass
> if ob.type == 'MESH':
> me = ob.data
> layout.prop(me, 'myRnaFloat')
> try:
> me["MyIdBool"]
> layout.prop(me, '["MyIdBool"]')
> except:
> pass
># Регистрация
>bpy.utils.register_class(MyPropPanel)
Эта программа позволяет пользователю ввести информацию различного типа, которая затем посылается на панель кнопкам. Механизм заключается в использовании RNA-свойств, которые можно настроить с помощью панели и читать с помощью кнопки. Все типы данных Блендера могут иметь свойства. Глобальные свойства, которые непосредственно не связаны каким-либо специфическим объектом, может оказаться удобно хранить в текущей сцене. Заметим, однако, что они будут потеряны, если Вы переключитесь на новую сцену.
>#----------------------------------------------------------
># File scene_props.py
>#----------------------------------------------------------
>import bpy
>from bpy.props import *
>#
># Сохранение свойств в активной сцене
>#
>def initSceneProperties(scn):
> bpy.types.Scene.MyInt = IntProperty(