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

стр.

>

>                        if space.type == 'VIEW_3D':

>                            space.viewport_shade = 'SOLID'

>                            reg = space.region_3d

>                            reg.view_perspective = 'CAMERA' break

>    return 


>def run():

>    setRenderSettings()

>    setDefaultCameraView()

>    # стартует анимация, к несчастью в старом виде.

>    bpy.ops.screen.animation_play(reverse=False, sync=False)

>    return


>if __name__ == "__main__":

>    run()



Свойства (Properties)

RNA-свойства против ID-свойств

В Блендере есть два различных типа свойств: ID-свойства и RNA-свойства. RNA-свойства расширяют определение структуры данных. Они должны быть объявлены до того, как будут использоваться.


Я потратил некоторое время на выяснение того, как же расшифровывается и что означает аббревиатура RNA для программирования на Питоне в Блендере. Может быть, я был недостаточно настойчив в поисках, но всё, что я нашел — это РНК, Рибонуклеиновая кислота. Разработчики применили химико-биологическую метафору для обозначения реальных структур данных на языке С (DNA, в переводе ДНК) и соответствующих им структур на Питоне (RNA, в переводе РНК). С понятием ID, думаю все и так знакомы, это сокращение слова Идентификатор. - прим. пер.


>bpy.types.Object.myRnaInt = bpy.props.IntProperty(

>    name = "RNA int",

>    min = -100,

>    max = 100,

>    default = 33)

Как только RNA-свойства были объявлены, они будут доступны через точечный синтаксис:

>cube.myRnaInt = -99

После декларации RNA-свойства myRnaInt расширяет определение структуры данных Object, каждый объект будет иметь это свойство.

ID-cвойство добавляется к единственному блоку данных, не влияя на другие данные того же самого типа. Ему не нужна какая-либо предварительная декларация, но оно автоматически определяется при присвоении, напр.

>cube.data["MyIdInt"] = 4711

ID-свойства могут только быть целыми, вещественными, и строками; другие типы автоматически будут преобразованы. Следовательно, строка

>cube.data["MyIdBool"] = True

определяет целое ID-свойство, а не логическое.


Не знаю, как в предыдущих версиях, а в 2.57 вполне можно определять списки — прим. пер.


Свойства сохраняются в blend-файле, но декларации свойств — нет.


Вот скрипт, который создает три меша, назначает различные свойства и печатает их величины в консоли.


>#----------------------------------------------------------

># File properties.py

>#----------------------------------------------------------

>import bpy

>from bpy.props import *


># Очистка сцены и создание нескольких объектов

>bpy.ops.object.select_by_type(type='MESH')

>bpy.ops.object.delete()

>bpy.ops.mesh.primitive_cube_add(location=(-3,0,0))

>cube = bpy.context.object

>bpy.ops.mesh.primitive_cylinder_add(location=(0,0,0))

>cyl = bpy.context.object

>bpy.ops.mesh.primitive_uv_sphere_add(location=(3,0,0))

>sphere = bpy.context.object


># Определение RNA-свойства для каждого объекта

>bpy.types.Object.myRnaInt = IntProperty(

>    name = "RNA int",

>    min = -100, max = 100,

>    default = 33) 


>bpy.types.Object.myRnaFloat = FloatProperty(

>    name = "RNA float",

>    default = 12.345,

>    min = 1, max = 20)  


>bpy.types.Object.myRnaString = StringProperty(

>    name = "RNA string",

>    default = "Ribonucleic acid")  


>bpy.types.Object.myRnaBool = BoolProperty(

>    name = "RNA bool") 


>bpy.types.Object.myRnaEnum = EnumProperty(

>    items = [('one', 'eins', 'un'),

>             ('two', 'zwei', 'deux'),

>             ('three', 'drei', 'trois')],

>    name = "RNA enum")


># Присвоение RNA-свойств кубу

>cube.myRnaInt = -99

>cube.myRnaFloat = -1

>cube.myRnaString = "I am an RNA prop"

>cube.myRnaBool = True

>cube.myRnaEnum = 'three'


># Создание ID-свойств для меша куба присвоением значений.

>cube.data["MyIdInt"] = 4711

>cube.data["MyIdFloat"] = 666.777

>cube.data["MyIdString"] = "I am an ID prop"

>cube.data["MyIdBool"] = True


># Печать всех свойств

>def printProp(rna, path):

>    try:

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

>    except:

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


>for ob in [cube, cyl, sphere]:

>    print("%s RNA properties" % ob)