Книга: Введение в написание скриптов на Питоне для Блендера 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__)
- Панели и кнопки
- Планировка панели и несколько аргументов
- Панель свойств
- Использование свойств сцены для сохранения информации
- Опрос (Polling)
- Динамическое выпадающее меню
- Объявление оператора и добавление его в меню
- Модальный оператор
- Invoke (вызов) против execute (выполнения)
- Всплывающий диалог
- Диалоговое окно ошибки
- 3.2.4. Ошибки при задавании вопросов
- Вопросы и ответы
- Контрольные вопросы
- Скрипт «Опрос об удовлетворенности клиента после сделки»
- Когда следует задавать проясняющие вопросы
- 7.8. Специальные вопросы
- Вопросы и задания
- 4.10. Как грамотно задавать вопросы
- Просмотр результатов опроса
- Пример анкеты для опроса потенциального клиента при продаже кровельных материалов
- Глава 7 Практические вопросы
- Пример анкеты для опроса потенциального клиента при продаже инструмента