Книга: Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода

Опрос (Polling)

Опрос (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):
    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__)

Оглавление книги


Генерация: 1.473. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз