Скрипт часто работает только в некоторых конкретных условиях, например, когда активен объект правильного типа. Например, скрипт, который манипулирует вершинами меша, не может делать что-либо значимое, если активный объект — арматура.
Эта программа добавляет панель, которая модифицирует материал активного объекта. Панель находится в секции интерфейса пользователя (открывается с помощью N), но она видима, только если активным объектом является меш по крайней мере с одним материалом. Проверка, сколько материалов имеет активный объект, делается через
poll
. Это не функция, а скорее метод класса, указанный с помощью команды
@classmethod
выше определения. Так в чем же разница между функцией и методом класса? Не спрашивайте меня! Все, что я знаю, что со строкой
@classmethod
код работает, а без неё нет.
Ну, с точки зрения программирования на Питоне действие этого декоратора хорошо объяснили здесь python.su/forum, а вот почему объявленный метод класса с именем poll влияет на поведение элементов интерфейса в Блендере, я так и не понял — прим. пер.
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):
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 становится серой, если активный объект не является мешем с по крайней мере одним материалом.