Введение в написание скриптов на Питоне для Блендера 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(