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

Для вызова оператора нажмите Пробел и наберите "Add twisted cylinder"; Блендер предлагает сопоставляемые имена операторов во время набора. Цилиндр имеет несколько опций, которые появятся в области Tool props (ниже секции Tools), сразу после создания цилиндра. Их можно интерактивно модифицировать, и результат немедленно отобразится в 3D-виде.

Последняя часть скрипта регистрирует его. Вместо нажатия клавиши Пробел, теперь можно вызывать скрипт гораздо более удобным образом из подменю Add » Mesh. Если бы мы использовали append (добавить) вместо prepend (предварять) в функции register(), вызов появился бы внизу вместо верхнего меню.



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

# File twisted.py

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

import bpy, math 


def addTwistedCylinder(context, r, nseg, vstep, nplanes, twist):

    # Функция создания цилиндра

    verts = []

    faces = []

    w = 2*math.pi/nseg

    a = 0

    da = twist*math.pi/180

    for j in range(nplanes+1):

        z = j*vstep

        a += da

        for i in range(nseg):

            verts.append((r*math.cos(w*i+a), r*math.sin(w*i+a), z))

            if j > 0:

                i0 = (j-1)*nseg

                i1 = j*nseg

                for i in range(1, nseg):

                    faces.append((i0+i-1, i0+i, i1+i, i1+i-1))

                faces.append((i0+nseg-1, i0, i1, i1+nseg-1))


    me = bpy.data.meshes.new("TwistedCylinder")

    me.from_pydata(verts, [], faces)

    ob = bpy.data.objects.new("TwistedCylinder", me)

    context.scene.objects.link(ob)

    context.scene.objects.active = ob return ob 


#

# Интерфейс пользователя

#


from bpy.props import * 


class MESH_OT_primitive_twisted_cylinder_add(bpy.types.Operator):

    '''Add a twisted cylinder'''

    bl_idname = "mesh.primitive_twisted_cylinder_add"

    bl_label = "Add twisted cylinder"

    bl_options = {'REGISTER', 'UNDO'}


    radius = FloatProperty(name="Radius",

        default=1.0, min=0.01, max=100.0)

    nseg = IntProperty(name="Major Segments",

        description="Number of segments for one layer",

        default=12, min=3, max=256)

    vstep = FloatProperty(name="Vertical step",

        description="Distance between subsequent planes",

        default=1.0, min=0.01, max=100.0)

    nplanes = IntProperty(name="Planes",

        description="Number of vertical planes",

        default=4, min=2, max=256)

    twist = FloatProperty(name="Twist angle",

        description="Angle between subsequent planes (degrees)",

        default=15, min=0, max=90)


    location = FloatVectorProperty(name="Location")

    rotation = FloatVectorProperty(name="Rotation")

    # Заметьте: вращение (Rotation) в радианах! 


    def execute(self, context):

    ob = addTwistedCylinder(context, self.radius, self.nseg, self.vstep,

        self.nplanes, self.twist)

    ob.location = self.location

    ob.rotation_euler = self.rotation

    #context.scene.objects.link(ob)

    #context.scene.objects.active = ob

    return {'FINISHED'}  


#

# Регистрация

# Делает возможным иметь доступ к скрипту из меню Add > Mesh


def menu_func(self, context):

    self.layout.operator("mesh.primitive_twisted_cylinder_add",

        text="Twisted cylinder",

        icon='MESH_TORUS') 


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

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