Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода - страница 19

стр.

>

>    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 = -99

>    Cube.myRnaFloat = 1.0

>    Cube.myRnaString = I am an RNA prop

>    Cube.myRnaBool = True

>    Cube.myRnaEnum = three

> ID properties

>    Cube.001["MyIdInt"] = 4711

>    Cube.001["MyIdFloat"] = 666.777

>    Cube.001["MyIdString"] = I am an ID prop

>    Cube.001["MyIdBool"] = 1

> RNA properties

>    Cylinder.myRnaInt = 33

>    Cylinder.myRnaFloat = 12.345000267028809

>    Cylinder.myRnaString = Ribonucleic acid

>    Cylinder.myRnaBool = False

>    Cylinder.myRnaEnum = one

> ID properties

>    Cylinder["MyIdInt"] does not exist

>    Cylinder["MyIdFloat"] does not exist

>    Cylinder["MyIdString"] does not exist

>    Cylinder["MyIdBool"] does not exist

> RNA properties

>    Sphere.myRnaInt = 33 Sphere.myRnaFloat = 12.345000267028809

>    Sphere.myRnaString = Ribonucleic acid

>    Sphere.myRnaBool = False

>    Sphere.myRnaEnum = one

> ID properties

>    Sphere["MyIdInt"] does not exist

>    Sphere["MyIdFloat"] does not exist

>    Sphere["MyIdString"] does not exist

>    Sphere["MyIdBool"] does not exist



Все три объекта имеют RNA-свойства, поскольку они являются расширением типа данных Object. RNA-свойствам Куба программой присвоены значения, кроме значения myRnaFloat, которое не может быть меньше чем 1. Цилиндру и сфере никаких свойств присвоено не было, но они все равно имеют RNA-свойства со значением по умолчанию.

Мешу куба программой были заданы ID-свойства. Заметьте, что свойство MyIdBool является целочисленной 1, а не логической True.

Свойства Объекта отображаются в панели пользовательского интерфейса под Properties, и также в контексте объекта. Свойства меша можно найти в контексте меша.




Как мы видели в распечатке, мы можем иметь доступ к 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")