Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода - страница 20
>
>printProp(ob, ".myRnaBool")
>printProp(ob, ".myRnaEnum")
>print("%s ID properties" % ob)
>printProp(ob, '["myRnaInt"]')
>printProp(ob, '["myRnaFloat"]')
>printProp(ob, '["myRnaString"]')
>printProp(ob, '["myRnaBool"]')
>printProp(ob, '["myRnaEnum"]')
>print("%s ID properties" % ob.data)
>printProp(ob.data, '["MyIdInt"]')
>printProp(ob.data, '["MyIdFloat"]')
>printProp(ob.data, '["MyIdString"]')
>printProp(ob.data, '["MyIdBool"]')
Этот скрипт выведет следующий текст на терминале.
>RNA properties
> Cube.myRnaInt does not exist
> Cube.myRnaFloat does not exist
> Cube.myRnaString does not exist
> Cube.myRnaBool does not exist
> Cube.myRnaEnum does not exist
>
> Cube["myRnaInt"] = -99
> Cube["myRnaFloat"] = 1.0
> Cube["myRnaString"] = I am an RNA prop
> Cube["myRnaBool"] = 1
> Cube["myRnaEnum"] = 2
>
> Cube.001["MyIdInt"] = 4711
> Cube.001["MyIdFloat"] = 666.777
> Cube.001["MyIdString"] = I am an ID prop
> Cube.001["MyIdBool"] = 1
Если мы восстановим декларации свойств, ID-свойства преобразуются обратно в RNA-свойства.
Эта программа ожидает, что активный объект — это арматура. Она сохраняет угол вращения каждой editbone как свойство соответствующей кости, и в конце выводит величины свойств на терминале. При выполнении с выбранной арматурой на изображении ниже, результат на терминале выглядит следующим образом.
>Head 3.1416
>Arm_L 1.5708
>Leg_R -2.7646
>Leg_L 2.7646
>Arm_R -1.5708
>Torso 3.1416
Заметьте, что величины свойств выражены в радианах. В интерфейсе углы отображаются в градусах, но при доступе из Питона они выражены в радианах. Тем не менее, свойство Roll - это просто некоторая вещественная переменная, и Блендер не знает, что его предполагается использовать как угол.
Для нахождения свойства в интерфейсе пользователя, нам нужно выбрать кость в режиме позы,и затем переключиться в режим редактирования, как показано на изображении.
Этот код действительно несколько полезен для скрипта, который перенастраивает данные, полученные от захвата движения (motion capture). Для того, чтобы делать это правильно, нам нужно знать углы поворота roll. Тем не менее, их нельзя получить, если арматура связана с другим файлом через прокси. Для того, чтобы получить доступ к углу поворота rig.data.edit_bones[name].roll, арматуру нужно переключить в режим редактирования, который не доступен для связанных объектов. Но если скрипт выполнен в файле, где арматура определена, свойство Roll может быть доступно из связанного файла как rig.pose.bones[name].bone["Roll"].
>#----------------------------------------------------------
># File bone_roll.py
>#----------------------------------------------------------
>import bpy
>def createBoneRollProps(rig):
> if rig.type != 'ARMATURE':
> raise NameError("Object not an armature")
> # Объект не является арматурой
> bpy.context.scene.objects.active = rig
> try:
> bpy.ops.object.mode_set(mode='EDIT')
> editable = (len(rig.data.edit_bones) > 0)
> except:
> editable = False
> rolls = {}
> if editable:
> for eb in rig.data.edit_bones:
> rolls[eb.name] = eb.roll
> bpy.ops.object.mode_set(mode='POSE')
> for pb in rig.pose.bones:
> pb.bone["Roll"] = rolls[pb.name]
> else:
> try:
> bpy.ops.object.mode_set(mode='POSE')
> except:
> raise NameError("Armature is not posable. Create proxy")
> # У арматуры не доступно позирование. Создайте прокси
> for pb in rig.pose.bones:
> try:
> rolls[pb.name] = pb.bone["Roll"]
> except:
> raise NameError("Create roll props in asset file")
> # Создайте свойство roll в файле актива
> return rolls
>rolls = createBoneRollProps(bpy.context.object)
>for (bname, roll) in rolls.items():
> print(" %16s %8.4f" % (bname, roll))
Интерфейс
Большинство скриптов должны взаимодействовать с пользователем каким-то способом. Скрипт может вызываться из меню или с помощью кнопки на панели, и он может получать входные данные посредством движков, переключателей, выпадающих меню или полей ввода. Элементы интерфейса пользователя реализованы как классы Питона. В этих заметках обсуждаются два типа элементов интерфейса: