Книга: Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода

Группы

Группы

Эта программа показывает, как создавать группы, добавлять объекты в группы, и пустышки, которые дублируют группы. Мы добавляем четыре группы, четыре меш-объекта назначаются каждый в две группы, и четыре текстовых объекта назначаются каждый в единственную группу. Затем мы добавляем четыре пустышки, которые будут дубликатами (dupli-group) четырёх групп. Наконец пустышки перемещаются, так что каждая колонка содержит элементы в этой группе.


#----------------------------------------------------------
# File groups.py
# Create groups
#----------------------------------------------------------
import bpyimport mathutils
from mathutils
import Vector
# Слои
Display = 5
Build = 6 
def setObject(name, mat):
    ob = bpy.context.object
    ob.name = name
    ob.data.materials.append(mat)
    return ob
# Перемещение объекта в данный слой.
def moveToLayer(ob, layer):
    ob.layers[layer] = True
    for n in range(20):
        if n != layer:
            ob.layers[n] = False
    return
  # Добавление объекта TextCurve в слое 13
def addText(string, loc):
    tcu = bpy.data.curves.new(string+'Data', 'FONT')
    text = bpy.data.objects.new(string+'Text', tcu)
    tcu.body = string
    tcu.align = 'RIGHT'
    text.location = loc
    bpy.context.scene.objects.link(text)
    # Нужно изменить text.layers после того, как текст будет привязан к сцене,
   # в противном случае изменение не сможет сработать. moveToLayer(text, Build)
    return text 
def run():
    # Создание двух материалов
    red = bpy.data.materials.new('RedMat')
    red.diffuse_color = (1,0,0)
    green = bpy.data.materials.new('GreenMat')
    green.diffuse_color = (0,1,0)
    # Позиции
    origin = Vector((0,0,0))
    dx = Vector((2,0,0))
    dy = Vector((0,2,0))
    dz = Vector((0,0,2))
    # Размещение объектов на слой построения (Build)
    layers = 20*[False]
    layers[Build] = True
    # Создание объектов
    bpy.ops.mesh.primitive_cube_add(location=dz, layers=layers)
    redCube = setObject('RedCube', red)
    bpy.ops.mesh.primitive_cube_add(location=dx+dz, layers=layers)
    greenCube = setObject('GreenCube', green)
    bpy.ops.mesh.primitive_uv_sphere_add(location=2*dx+dz, layers=layers)
    redSphere = setObject('RedSphere', red)
    bpy.ops.mesh.primitive_uv_sphere_add(location=3*dx+dz, layers=layers)
    greenSphere = setObject('GreenSphere', green)
    # Создание текстов
    redText = addText('Red', -dx)
    greenText = addText('Green', -dx)
    cubeText = addText('Cube', -dx)
    sphereText = addText('Sphere', -dx)
    # Создание групп
    redGrp = bpy.data.groups.new('RedGroup')
    greenGrp = bpy.data.groups.new('GreenGroup')
    cubeGrp = bpy.data.groups.new('CubeGroup')
    sphereGrp = bpy.data.groups.new('SphereGroup')
   # Таблица членов групп
 members = {
 redGrp : [redCube, redSphere, redText],
 greenGrp : [greenCube, greenSphere, greenText],
 cubeGrp : [redCube, greenCube, cubeText],
 sphereGrp : [redSphere, greenSphere, sphereText] }
    # Привязка объектов к группам
    for group in members.keys():
        for ob in members[group]:
            group.objects.link(ob)
    # Список пустышек
    empties = [
        ('RedEmpty', origin, redGrp),
        ('GreenEmpty', dy, greenGrp),
        ('CubeEmpty', 2*dy, cubeGrp),
        ('SphereEmpty', 3*dy, sphereGrp) ]
    # Создание пустышек и размещение их в слое отображения (Display)
    scn = bpy.context.scene
    for (name, loc, group) in empties:
        empty = bpy.data.objects.new(name, None)
        empty.location = loc
        empty.name = name
        empty.dupli_type = 'GROUP'
        empty.dupli_group = group
        scn.objects.link(empty)
        moveToLayer(empty, Display)
    # Слой отображения назначается активным слоем
    scn.layers[Display] = True
    for n in range(20):
        if n != Display:
            scn.layers[n] = False
    return
if __name__ == "__main__":
    run()

Оглавление книги


Генерация: 0.036. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз