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

стр.

>

>        name = "Integer",

>        description = "Enter an integer")

>    scn['MyInt'] = 17


>    bpy.types.Scene.MyFloat = FloatProperty(

>        name = "Float",

>        description = "Enter a float",

>        default = 33.33,

>        min = -100,

>        max = 100)


>    bpy.types.Scene.MyBool = BoolProperty(

>        name = "Boolean",

>        description = "True or False?")

>    scn['MyBool'] = True


>    bpy.types.Scene.MyEnum = EnumProperty(

>        items = [('Eine', 'Un', 'One'),

>                 ('Zwei', 'Deux', 'Two'),

>                 ('Drei', 'Trois', 'Three')],

>        name = "Ziffer")

>    scn['MyEnum'] = 2


>    bpy.types.Scene.MyString = StringProperty(

>        name = "String")

>    scn['MyString'] = "Lorem ipsum dolor sit amet"

>    return 


>initSceneProperties(bpy.context.scene)  


>#

># Меню в районе UI

>#

>class UIPanel(bpy.types.Panel):

>    bl_label = "Property panel"

>    bl_space_type = "VIEW_3D"

>    bl_region_type = "UI" 


>    def draw(self, context):

>        layout = self.layout

>        scn = context.scene

>        layout.prop(scn, 'MyInt', icon='BLENDER', toggle=True)

>        layout.prop(scn, 'MyFloat')

>        layout.prop(scn, 'MyBool')

>        layout.prop(scn, 'MyEnum')

>        layout.prop(scn, 'MyString')

>        layout.operator("idname_must.be_all_lowercase_and_contain_one_dot")  


>#

># Кнопка выводит значения свойств в окне консоли.

># 

>class OBJECT_OT_PrintPropsButton(bpy.types.Operator):

>    bl_idname = "idname_must.be_all_lowercase_and_contain_one_dot"

>    bl_label = "Print props" 


>    def execute(self, context):

>        scn = context.scene printProp("Int: ", 'MyInt', scn)

>        printProp("Float: ", 'MyFloat', scn)

>        printProp("Bool: ", 'MyBool', scn)

>        printProp("Enum: ", 'MyEnum', scn)

>        printProp("String: ", 'MyString', scn)

>        return{'FINISHED'}  


>def printProp(label, key, scn):

>    try:

>        val = scn[key]

>    except:

>        val = 'Undefined'

>    print("%s %s" % (key, val))  


># Регистрация

>bpy.utils.register_module(__name__)


Опрос (Polling)

Скрипт часто работает только в некоторых конкретных условиях, например, когда активен объект правильного типа. Например, скрипт, который манипулирует вершинами меша, не может делать что-либо значимое, если активный объект — арматура.

Эта программа добавляет панель, которая модифицирует материал активного объекта. Панель находится в секции интерфейса пользователя (открывается с помощью N), но она видима, только если активным объектом является меш по крайней мере с одним материалом. Проверка, сколько материалов имеет активный объект, делается через >poll(). Это не функция, а скорее метод класса, указанный с помощью команды >@classmethod выше определения. Так в чем же разница между функцией и методом класса? Не спрашивайте меня! Все, что я знаю, что со строкой >@classmethod код работает, а без неё нет.

Ну, с точки зрения программирования на Питоне действие этого декоратора хорошо объяснили здесь python.su/forum, а вот почему объявленный метод класса с именем poll влияет на поведение элементов интерфейса в Блендере, я так и не понял — прим. пер.



>#----------------------------------------------------------

># File poll.py

>#----------------------------------------------------------

>import bpy, random 


>#

># Меню в районе UI

>#

>class ColorPanel(bpy.types.Panel):

>    bl_label = "Modify colors"

>    bl_space_type = "VIEW_3D"

>    bl_region_type = "UI"


>    @classmethod

>    def poll(self, context):

>        if context.object and context.object.type == 'MESH':

>            return len(context.object.data.materials)  


>    def draw(self, context):

>        layout = self.layout

>        scn = context.scene

>        layout.operator("random.button")

>        layout.operator("darken_random.button")

>        layout.operator("invert.button")  


>#

># Три кнопки

># 


>class RandomButton(bpy.types.Operator):

>    bl_idname = "random.button"

>    bl_label = "Randomize" 


>    def execute(self, context):

>        mat = context.object.data.materials[0]

>        for i in range(3):

>            mat.diffuse_color[i] = random.random()

>        return{'FINISHED'}


>class DarkenRandomButton(bpy.types.Operator):