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

стр.

>

>    'version': '(0, 1, 2)',

>    'blender': (2, 5, 7),

>    "location": "View3D > UI panel > Shapekey pinning",

>    'description': 'Pin and key the shapekeys of a mesh',

>    'warning': '',

>    'wiki_url': 'http://blenderartists.org/forum/showthread.php?193908',

>    'tracker_url': '',

>    "support": 'COMMUNITY',

>    "category": "3D View"}


>import bpy

>from bpy.props import *  


>#

># class VIEW3D_OT_ResetExpressionsButton(bpy.types.Operator):

>#

>class VIEW3D_OT_ResetExpressionsButton(bpy.types.Operator):

>    bl_idname = "shapepin.reset_expressions"

>    bl_label = "Reset expressions" 


>    def execute(self, context):

>        keys = context.object.data.shape_keys

>        if keys:

>            for shape in keys.keys:

>            shape.value = 0.0

>        return{'FINISHED'}  


>#

># class VIEW3D_OT_PinExpressionButton(bpy.types.Operator):

># 


>class VIEW3D_OT_PinExpressionButton(bpy.types.Operator):

>    bl_idname = "shapepin.pin_expression"

>    bl_label = "Pin"

>    expression = bpy.props.StringProperty()  


>    def execute(self, context):

>        skeys = context.object.data.shape_keys

>        if skeys:

>            frame = context.scene.frame_current

>            for block in skeys.key_blocks:

>                oldvalue = block.value

>                block.value = 1.0 if block.name == self.expression else 0.0

>                if (context.tool_settings.use_keyframe_insert_auto and

>                    (context.scene.key_all or

>                    (block.value > 0.01) or

>                    (abs(block.value-oldvalue) > 0.01))):

>                    block.keyframe_insert("value", index=-1, frame=frame)

>        return{'FINISHED'} 


>#

># class ExpressionsPanel(bpy.types.Panel):

># 


>class ExpressionsPanel(bpy.types.Panel):

>    bl_label = "Pin shapekeys"

>    bl_space_type = "VIEW_3D"

>    bl_region_type = "UI"


>    @classmethod

>    def poll(cls, context):

>        return context.object and (context.object.type == 'MESH')  


>    def draw(self, context):

>        layout = self.layout

>        layout.operator("shapepin.reset_expressions")

>        layout.prop(context.scene, "key_all")

>        skeys = context.object.data.shape_keys

>        if skeys:

>            for block in skeys.key_blocks:

>                row = layout.split(0.75)

>                row.prop(block, 'value', text=block.name)

>                row.operator("shapepin.pin_expression",

>                    text="Pin").expression = block.name

>        return 


>#

># инициализация и регистрация

>#  


>def initialize():

>    bpy.types.Scene.key_all = BoolProperty(

>    name="Key all",

>    description="Set keys for all shapes",

>    default=False) 


>def register():

>    initialize()

>    bpy.utils.register_module(__name__)  


>def unregister():

>    bpy.utils.unregister_module(__name__)  


>if __name__ == "__main__":

>    register()


Простой импорт BVH-файлов

BVH формат обычно используется для передачи анимации персонажей, например, от данных захвата движения (mocap). Эта программа простого импортера BVH, которая строит скелет с действием (action), описанный в файле BVH. Он реализован в виде аддона Блендера со словарём >bl_info в верхней части файла и кодом регистрации в конце.

После выполнения скрипта или включения его в качестве аддона, простой импортер BVH может быть вызван из панели пользовательского интерфейса (Ctrl+N). Есть две опции: логическая переменная с информацией о том, повернуть ли меш на 90 градусов (чтобы направить Z вверх), и масштаб.

Эта программа также показывает, как вызвать диалог выбора файлов, нажав кнопку на панели. Класс кнопки Load BVH наследуется от двух базовых классов >bpy.types.Operator и >ImportHelper.

>class OBJECT_OT_LoadBvhButton(bpy.types.Operator, ImportHelper):

Класс >ImportHelper (возможно, недокументированный) определяет некоторые атрибуты, которые используются для фильтрации файлов, отображающихся в диалоге выбора файлов.

>filename_ext = ".bvh"

>filter_glob = bpy.props.StringProperty(default="*.bvh", options={'HIDDEN'})

>filepath = bpy.props.StringProperty(name="File Path",

>    maxlen=1024, default="")

Существует аналогичный класс ExportHelper, который ограничивает имеющийся выбор файлов экспорта.