Введение в написание скриптов на Питоне для Блендера 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__)
Скрипт часто работает только в некоторых конкретных условиях, например, когда активен объект правильного типа. Например, скрипт, который манипулирует вершинами меша, не может делать что-либо значимое, если активный объект — арматура.
Эта программа добавляет панель, которая модифицирует материал активного объекта. Панель находится в секции интерфейса пользователя (открывается с помощью 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):