原文:https://docs.blender.org/api/blender_python_api_current/info_quickstart.html#native-types
1 前言
可以做的:
~可以编辑所有数据
~可以修改用户设置,快捷键和主题
~可以使用自己定义的工具
~可以创建用户接口,例如,菜单,标题,面板
~。。。
不可以做的:
~创建新的空间类型
~
2 开始之前
运行脚本
1、使用内建的文本编辑器
2、使用Pyhton控制台
这两者都是区域的一种类型,都可以在标题栏中进行切换
3 关键概念
3.1 使用数据
使用数据块
Python使用数据的方式与动画系统与用户界面使用数据的方式一样,也就是说你可以通过按钮更改的设置,同时也可以使用Python来更改。
使用bpy.data模块来操作当前打开的blend文件。
关于集合
您会注意到,索引和字符串都可以用来访问集合的成员。
>>> bpy.data.objects['Cube']
bpy.data.objects["Cube"]
>>> bpy.data.objects[0]
bpy.data.objects["Cube"]
获取属性
当获取一个数据块后,就可以通过访问它的属性来进行操作,就像在图形界面中一样。事实上,每个工具提示框中都显示了你在Python中如何访问到这个属性
可以使用“控制台”来测试你要访问哪些数据,这是它自己的空间类型。这个支持自动完成,给你一个快速的方法,在你的文件中挖掘不同的数据。
新建数据和移除
新的数据块不能通过调用它的类来创建,这对熟悉其他Python API的人来说或许有些诧异。这在API设计中是有意义的,Blender/Python API不能
在主要的Blender数据库之外创建Blender数据(通过bpy.data访问),因为这个数据是由Blender(save /load/undo/ append)管理的。等等)。通过
bpy. Data中的集合的方法来添加和删除数据。
>>> mesh = bpy.data.meshes.new(name="MyMesh")
>>> print(mesh)
<bpy_struct, Mesh("MyMesh.001")>
>>> bpy.data.meshes.remove(mesh)
自定义属性
如果数据块有自己的ID,那么Python就能访问它的属性。当指定一个新的属性时,它将被创建或是重写原来的同名属性。这些数据将会随着blend文件
一起保存,随着对象一起被复制。
注意:这些属性只能被指定为基础Python数据类型:
· int, float, string
· array of ints/floats
· dictionary (only string keys are supported, values must be basic types too)
这些属性在Python之外是有效的。它们可以通过曲线或在驱动路径中使用。
3.2 上下文
虽然直接通过名称或列表访问数据非常有用,但在用户的选择上进行具体操作更为常见。上下文始终可以从bpy获得。上下文,可用于获取活动对象、
场景、工具设置以及其他许多属性。
注意,上下文是只读的。这些值不能直接修改,尽管它们可以通过运行API函数或使用bpy.data API来改变。
上下文属性根据被访问的位置而变化。3D视图的上下文成员与控制台不同,因此在访问用户状态所知道的上下文属性时要小心。
3.3 运算符(工具)
操作符是用户通过按钮、菜单项或快捷键访问的工具。从用户的角度来看,它们是一个工具,但Python可以通过 bpy.ops 模块来运行这些设置。
poll()
通过提前调用poll(),可以避免使用try/catch语句,从而可以检查是否在合适的上下文中执行ops操作
4 结合
Python脚本可以通过下面的方式来与Blender结合:
· 定义一个渲染引擎
· 定义一系列操作
· 定义菜单,标题栏和面板
· 向已有的菜单,标题栏和面板中插入新的按钮
这可以通过定义一个已经存在类型的子类来完成。
4.1 自定义运算操作脚本
import bpy
def main(context):
for ob in context.scene.objects:
print(ob)
class SimpleOperator(bpy.types.Operator):
"""Tooltip"""
bl_idname = "object.simple_operator"
bl_label = "Simple Object Operator"
@classmethod
def poll(cls, context):
return context.active_object is not None
def execute(self, context):
main(context)
return {'FINISHED'}
def register():
bpy.utils.register_class(SimpleOperator)
def unregister():
bpy.utils.unregister_class(SimpleOperator)
if __name__ == "__main__":
register()
# test call
bpy.ops.object.simple_operator()
4.2 面板例
注意,额外的bl_变量用于设置它们所显示的上下文。
import bpy
class HelloWorldPanel(bpy.types.Panel):
"""Creates a Panel in the Object properties window"""
bl_label = "Hello World Panel"
bl_idname = "OBJECT_PT_hello"
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "object"
def draw(self, context):
layout = self.layout
obj = context.object
row = layout.row()
row.label(text="Hello world!", icon='WORLD_DATA')
row = layout.row()
row.label(text="Active object is: " + obj.name)
row = layout.row()
row.prop(obj, "name")
row = layout.row()
row.operator("mesh.primitive_cube_add")
def register():
bpy.utils.register_class(HelloWorldPanel)
def unregister():
bpy.utils.unregister_class(HelloWorldPanel)
if __name__ == "__main__":
register()
5 类型
5.1 原生类型
1)Blender float/int/boolean -> float/int/boolean
2)Blender enumerator -> string
>>> C.object.rotation_mode = 'AXIS_ANGLE'
3)Blender enumerator (multiple) -> set of strings
# setting multiple camera overlay guides
bpy.context.scene.camera.data.show_guide = {'GOLDEN', 'CENTER'}
# passing as an operator argument for report types
self.report({'WARNING', 'INFO'}, "Some message!")
5.2 内部类型
数据包含自己的属性组/网格/骨头/场景……等等
5.3 Mathutils类型(数学工具)
用于矢量,四元数,欧拉,矩阵和颜色类型 mathutils
6 动画
在Python中有两种方法来添加关键帧,一种是直接通过key属性来添加,就像通过界面中按钮添加一样。还可以手动创建曲线和关键帧数据,
然后设置该属性的路径。
#Simple example:
obj = bpy.context.object
obj.location[2] = 0.0
obj.keyframe_insert(data_path="location", frame=10.0, index=2)
obj.location[2] = 1.0
obj.keyframe_insert(data_path="location", frame=20.0, index=2)
#Using Low-Level Functions:
obj = bpy.context.object
obj.animation_data_create()
obj.animation_data.action = bpy.data.actions.new(name="MyAction")
fcu_z = obj.animation_data.action.fcurves.new(data_path="location", index=2)
fcu_z.keyframe_points.add(2)
fcu_z.keyframe_points[0].co = 10.0, 0.0
fcu_z.keyframe_points[1].co = 20.0, 1.0