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

стр.

>

>        global theSwatches

>        n = findSwatch(context.object.my_swatch)

>        theSwatches.pop(n)

>        setSwatches()

>        return{'FINISHED'}  


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

>bpy.utils.register_module(__name__)


Объявление оператора и добавление его в меню

Операторы, которые нам до сих пор попадались, были простыми кнопками. В этой программе мы делаем более сложный оператор, который создаёт искривленный цилиндр.

Для вызова оператора нажмите Пробел и наберите "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') 


>def register():

>    bpy.utils.register_module(__name__)

>    bpy.types.INFO_MT_mesh_add.prepend(menu_func)  


>def unregister():

>    bpy.utils.unregister_module(__name__)

>    bpy.types.INFO_MT_mesh_add.remove(menu_func)  


>if __name__ == "__main__":

>    register()


Модальный оператор

Следующий пример взят прямо из документации по API, как и последующие несколько примеров.

Модальный оператор определяет функцию >Operator.modal которая при запуске обрабатывает события, пока не вернёт