Введение в написание скриптов на Питоне для Блендера 2.5x. Примеры кода - страница 35
>
>if __name__ == "__main__":
> ob = makeMesh(5)
> print(ob, "created")
mysphere.py
>#----------------------------------------------------------
># File mysphere.py
>#----------------------------------------------------------
>import bpy
>def makeMesh(z):
> bpy.ops.mesh.primitive_ico_sphere_add(location=(0,0,z))
> return bpy.context.object
>if __name__ == "__main__":
> ob = makeMesh(3)
> print(ob, "created")
__init__.py
Четвертый файл содержит словарь >bl_info
и код регистрации, необходимый для аддона и пользовательского интерфейса. В нем также содержится следующий фрагмент кода для импорта других файлов пакета.
># Для поддержки правильной перезагрузки, пробуем обратиться
># к переменной пакета, если она есть, перезагрузить всё
>if "bpy" in locals():
> import imp imp.reload(mycube)
> imp.reload(mysphere)
> imp.reload(mycylinder)
> print("Reloaded multifiles")
>else:
> from . import mycube, mysphere, mycylinder
> print("Imported multifiles")
Этот код работает следующим образом.
• Если >__init__.py()
запускается в первый раз, т.е. при запуске Блендера с включенным аддоном в вашем файле default.blend, >"bpy" in locals()
возвращает Ложь. Другие файлы в пакете импортируются и в терминале выводится "Imported multifiles".
• Если >__init__.py()
запускается в первый раз после запуска Блендера с выключенным аддоном в вашем файле default.blend, и вы нажали включение аддона, >"bpy" in locals()
возвращает Ложь. Другие файлы в пакете импортируются и в терминале выводится "Imported multifiles".
• После того, как дополнения включены, в любое время вы нажимаете F8, чтобы перезагрузить аддоны, >"bpy" in locals()
возвращает Истину. Другие файлы в пакете перезагружаются, а в терминал выводится "Reloaded multifiles".
>#----------------------------------------------------------
># File __init__.py
>#----------------------------------------------------------
># Addon info
>bl_info = {
> "name": "Multifile",
> 'author': 'Thomas Larsson',
> "location": "View3D > UI panel > Add meshes",
> "category": "3D View"
> }
># Для поддержки правильной перезагрузки, пробуем обратиться
># к переменной пакета, если она есть, перезагрузить всё
>if "bpy" in locals():
> import imp imp.reload(mycube)
> imp.reload(mysphere)
> imp.reload(mycylinder)
> print("Reloaded multifiles")
>else:
> from . import mycube, mysphere, mycylinder
> print("Imported multifiles")
>import bpy
>from bpy.props import *
>#
># class AddMeshPanel(bpy.types.Panel):
>#
>class AddMeshPanel(bpy.types.Panel):
> bl_label = "Add meshes"
> bl_space_type = "VIEW_3D"
> bl_region_type = "UI"
> def draw(self, context):
> self.layout.operator("multifile.add",
> text="Add cube").mesh = "cube"
> self.layout.operator("multifile.add",
> text="Add cylinder").mesh = "cylinder"
> self.layout.operator("multifile.add",
> text="Add sphere").mesh = "sphere"
>#
># class OBJECT_OT_AddButton(bpy.types.Operator):
>#
>class OBJECT_OT_AddButton(bpy.types.Operator):
> bl_idname = "multifile.add"
> bl_label = "Add"
> mesh = bpy.props.StringProperty()
>def execute(self, context):
> if self.mesh == "cube":
> mycube.makeMesh(-8)
> elif self.mesh == "cylinder":
> mycylinder.makeMesh(-5)
> elif self.mesh == "sphere":
> mysphere.makeMesh(-2)
> return{'FINISHED'}
>#
># Регистрация
>#
>def register():
> bpy.utils.register_module(__name__)
>def unregister():
> bpy.utils.unregister_module(__name__)
>if __name__ == "__main__":
> register()
Формат OBJ часто используется для обмена данными меша между различными приложениями. Первоначально изобретеный для Wavefront Maya, он стал отраслевым стандартом. Это простой ASCII-формат, который содержит строки следующего вида:
• >v x y z
Координаты вершин как >(x, y, z)
• >vt u v
Текстурные координаты как >(u, v)
• >f v>1 v>2 ... v>n
Грань с n углами, в вершинах >v>1, v>2, ... v>n
. Для мешей без координат UV.
• >f v>1/vt>1 v>2/vt>2 ... v>n/vt>n
Грани с n углами. Углы — это вершины >v>1, v>2, ... v>n
в 3D-пространстве и >vt>1, vt>2, ... vt>n
в текстурном пространстве.