Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода - страница 25
>
> bl_idname = "darken_random.button"
> bl_label = "Darken Randomly"
>def execute(self, context):
> mat = context.object.data.materials[0]
> for i in range(3):
> mat.diffuse_color[i] *= random.random()
> return{'FINISHED'}
>class InvertButton(bpy.types.Operator):
> bl_idname = "invert.button"
> bl_label = "Invert"
> def execute(self, context):
> mat = context.object.data.materials[0]
> for i in range(3):
> mat.diffuse_color[i] = 1 - mat.diffuse_color[i]
> return{'FINISHED'}
># Регистрация
>bpy.utils.register_module(__name__)
Эта программа добавляет панель с выпадающим меню на панели интерфейса пользователя. В начале меню содержит три пункта: красный, зеленый и синий. Есть две кнопки, помеченные Set color (Задать цвет). Верхняя изменяет цвет активного объекта на цвет, выбранный в выпадающем меню, а нижняя устанавливает цвет, определенный тремя движками. Цвета можно добавлять в выпадающее меню и удалять их из него.
Также заметьте, что с тем же успехом работает опрос для кнопок; кнопка Set color становится серой, если активный объект не является мешем с по крайней мере одним материалом.
>#----------------------------------------------------------
># File swatches.py
>#----------------------------------------------------------
>import bpy
>from bpy.props import *
>theSwatches = [
> ("1 0 0" , "Red" , "1 0 0"),
> ("0 1 0" , "Green" , "0 1 0"),
> ("0 0 1" , "Blue" , "0 0 1")]
>def setSwatches():
> global theSwatches
> bpy.types.Object.my_swatch = EnumProperty(
> items = theSwatches,
> name = "Swatch")
>setSwatches()
>bpy.types.Object.my_red = FloatProperty(
> name = "Red", default = 0.5,
> min = 0, max = 1)
>bpy.types.Object.my_green = FloatProperty(
> name = "Green", default = 0.5,
> min = 0, max = 1)
>bpy.types.Object.my_blue = FloatProperty(
> name = "Blue", default = 0.5,
> min = 0, max = 1)
>def findSwatch(key):
> for n,swatch in enumerate(theSwatches):
> (key1, name, colors) = swatch
> if key == key1:
> return n
> raise NameError("Unrecognized key %s" % key)
># Панель образцов
>class SwatchPanel(bpy.types.Panel):
> bl_label = "Swatches"
> #bl_idname = "myPanelID"
> bl_space_type = "PROPERTIES"
> bl_region_type = "WINDOW"
> bl_context = "material"
>def draw(self , context):
> layout = self.layout
> ob = context.active_object
> layout.prop_menu_enum(ob, "my_swatch")
> layout.operator("swatches.set").swatch=True
> layout.separator()
> layout.prop(ob, "my_red")
> layout.prop(ob, "my_green")
> layout.prop(ob, "my_blue")
> layout.operator("swatches.set").swatch=False
> layout.operator("swatches.add")
> layout.operator("swatches.delete")
># Установка кнопки
>class OBJECT_OT_SetButton(bpy.types.Operator):
> bl_idname = "swatches.set"
> bl_label = "Set color"
> swatch = bpy.props.BoolProperty()
> @classmethod
> def poll(self, context):
> if context.object and context.object.type == 'MESH':
> return len(context.object.data.materials)
> def execute(self, context):
> global theSwatches
> ob = context.object
> if self.swatch:
> n = findSwatch(ob.my_swatch)
> (key, name, colors) = theSwatches[n]
> words = colors.split()
> color = (float(words[0]), float(words[1]), float(words[2]))
> else:
> color = (ob.my_red, ob.my_green, ob.my_blue)
> ob.data.materials[0].diffuse_color = color
> return{'FINISHED'}
># Добавление кнопки
>class OBJECT_OT_AddButton(bpy.types.Operator):
> bl_idname = "swatches.add"
> bl_label = "Add swatch"
> def execute(self, context):
> global theSwatches
> ob = context.object
> colors = "%.2f %.2f %.2f" % (ob.my_red, ob.my_green, ob.my_blue)
> theSwatches.append((colors, colors, colors))
> setSwatches()
> return{'FINISHED'}
># Удаление кнопки
>class OBJECT_OT_DeleteButton(bpy.types.Operator):
> bl_idname = "swatches.delete"
> bl_label = "Delete swatch"
> def execute(self, context):