Читаем Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода полностью

Как мы видели в распечатке, мы можем иметь доступ к RNA-свойствам объекта сферы. Тем не менее, они не появляются в интерфейсе пользователя. Очевидно, только присвоенные значения свойств сохраняются в блоке данных Объекта. Мы можем использовать RNA-свойство, которое не присвоено в скрипте; при этом берется значение по умолчанию. В противовес этому, если мы попытаемся получить доступ к незаданному ID-свойству, будет возбуждена ошибка.




Свойства совместимы со связями файлов. Сохраните blend-файл и привяжите (link) куб в новый файл. Как RNA-, так и ID-свойства появляются в новом файле, но они серые, поскольку они не могут быть доступны в связанном файле.



Если мы проксим (proxify) связанный куб, свойства объекта принадлежат блоку данных прокси-объекта, и могут быть модифицированы в связанном файле. В противовес этому, свойства меша принадлежат блоку данных меша и не могут изменяться.



Как упомянуто выше, свойства сохранены в blend-файлах, но декларации свойств — нет. Закройте и перезапустите Блендер и откройте файл, который мы сохранили выше. Свойства myRnaBool и myRnaEnum окажутся преобразованными в целые. Фактически, они и были сохранены как целые всё время, но отображались как логические и перечисления из-за продекларированных свойств, сохранённых в типе данных Object.

Чтобы подтвердить, что RNA-свойства превратились в ID-свойства, выполните следующий скрипт.


#----------------------------------------------------------

# File print_props.py

#----------------------------------------------------------

import bpy 


def printProp(rna, path):

    try:

        print('  %s%s =' % (rna.name, path), eval("rna"+path))

    except:

        print('  %s%s does not exist' % (rna.name, path))  


ob = bpy.context.object print("%s RNA properties" % ob)

printProp(ob, ".myRnaInt")

printProp(ob, ".myRnaFloat")

printProp(ob, ".myRnaString")

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

ID properties

    Cube["myRnaInt"] = -99

    Cube["myRnaFloat"] = 1.0

    Cube["myRnaString"] = I am an RNA prop

    Cube["myRnaBool"] = 1

    Cube["myRnaEnum"] = 2

ID properties

    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 - это просто некоторая вещественная переменная, и Блендер не знает, что его предполагается использовать как угол.

Для нахождения свойства в интерфейсе пользователя, нам нужно выбрать кость в режиме позы,и затем переключиться в режим редактирования, как показано на изображении.



Перейти на страницу:

Похожие книги