Введение в написание скриптов на Питоне для Блендера 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 формат обычно используется для передачи анимации персонажей, например, от данных захвата движения (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, который ограничивает имеющийся выбор файлов экспорта.