Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода - страница 34
>
> bl_label = "BVH import"
> bl_space_type = "VIEW_3D"
> bl_region_type = "UI"
> def draw(self, context):
> self.layout.prop(context.scene, "MyBvhRot90")
> self.layout.prop(context.scene, "MyBvhScale")
> self.layout.operator("simple_bvh.load")
>#
># class OBJECT_OT_LoadBvhButt
>on(bpy.types.Operator, ImportHelper):
>#
>class OBJECT_OT_LoadBvhButton(bpy.types.Operator, ImportHelper):
> bl_idname = "simple_bvh.load"
> bl_label = "Load BVH file (.bvh)"
> # From ImportHelper. Filter filenames.
> filename_ext = ".bvh"
> filter_glob = bpy.props.StringProperty(default="*.bvh", options={'HIDDEN'})
> filepath = bpy.props.StringProperty(name="File Path",
> maxlen=1024, default="")
> def execute(self, context):
> import bpy, os
> readBvhFile(context, self.properties.filepath,
> context.scene.MyBvhRot90, context.scene.MyBvhScale)
> return{'FINISHED'}
> def invoke(self, context, event):
> context.window_manager.fileselect_add(self)
> return {'RUNNING_MODAL'}
>#
># Registration
>#
>def menu_func(self, context):
> self.layout.operator("simple_bvh.load", text="Simple BVH (.bvh)...")
>def register():
> bpy.utils.register_module(__name__)
> bpy.types.INFO_MT_file_import.append(menu_func)
>def unregister():
> bpy.utils.unregister_module(__name__)
> bpy.types.INFO_MT_file_import.remove(menu_func)
>if __name__ == "__main__":
> try:
> unregister()
> except:
> pass
> register()
Многофайловые пакеты
Пакеты — это способ структурирования пространства имен модулей Питона, используя "точечную нотацию имен модулей". Например, имя модуля >A.B
определяет подмодуль с именем >B
в пакете с именем >A
. Точно так же как использование модулей спасает авторов различных модулей от необходимости беспокоиться о существовании совпадающих глобальных имен переменных, использование точечной нотации имен модулей спасает авторов многомодульных пакетов от необходимости волноваться о совпадающих именах модулей. За дополнительной информацией о пакетах Питона, пожалуйста, обратитесь к документации на пакеты Питона
Каждый пакет должен содержать файл >__init__.py
. Этот файл необходим, чтобы заставить Питон относиться к каталогу, как к содержащему пакет, это сделано для предотвращения у каталогов с частоиспользуемым названием, например, string, непреднамеренного сокрытия действительного модуля, которое происходит в дальнейшем пути поиска модулей. В простейшем случае, >__init__.py
может быть просто пустым файлом, но он также может выполнять код инициализации пакета. В Блендере >__init__.py
часто содержит пользовательский интерфейс и информацию аддона, в то время как реальная работа делается в других файлах.
В отличие от других скриптов в этой книге, многофайловый пакет не может быть выполнен из текстового редактора. Он должен быть скопирован в место, которое входит в путь поиска в Блендере, например, >addons
или >addons-contrib
, см. раздел аддоны Блендера. К счастью, вам не нужно перезагружать весь Блендер для перезагрузки файлов после каждой модификации. Нажатие F8 на клавиатуре перезагружает все активированные аддоны в Блендере.
Этот пакет разнесён на четыре файла. Три из них создают меши: куб, цилиндр и сферу, соответственно. Это файлы автономных скриптов, которые можно выполнять в окне текстового редактора для отладочных целей. Условие >(__name__ == "__main__")
истинно, если файл был запущен в автономном режиме.
mycube.py
>#----------------------------------------------------------
># File mycube.py
>#----------------------------------------------------------
>import bpy
>def makeMesh(z):
> bpy.ops.mesh.primitive_cube_add(location=(0,0,z))
> return bpy.context.object
>if __name__ == "__main__":
> ob = makeMesh(1)
> print(ob, "created")
mycylinder.py
>#----------------------------------------------------------
># File mycylinder.py
>#----------------------------------------------------------
>import bpy
>def makeMesh(z):
> bpy.ops.mesh.primitive_cylinder_add(location=(0,0,z))
> return bpy.context.object