Введение в написание скриптов на Питоне для Блендера 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
которая при запуске обрабатывает события, пока не вернёт