ReferenceAPI Usage
Blender有很多内部链接数据类型,这些数据类型需要api,这个文档帮助你了解api
API文档范围
涵盖了bpy.types通过bpy.context获取 ,bpy.data获取blender文件数据
其他模块bge,bmesh和aud不使用Blender-api,因此这篇文档不介绍
获取数据
API最常用的就是获取blender文件的数据,最好意识到数据块的ID,通过ID来获取属性
ID数据
数据块ID作为高层数据容器
从用户界面这个还不是很明显,当开发的时候就会体会到
数据ID类型包括场景,组,物体,网格,屏幕,世界,电枢,图片和纹理。详见bpy.types.ID子类,以下是数据块的ID的特点:
1. ID是blend文件数据,因此加载一个blend文件会重新加载整个新的数据块
2. 通过bpy.data.*获取id
3. 每一个数据块有一个独一无二的.name属性,它显示在界面中
4. 动画数据存储在ID的.animation_data
5. Id可以通过python加载复制和删除
6. ID有自己的垃圾回收机制,当保存的时候会释放ID
7. 当数据块有一个外部数据引用时,这是一个典型的ID 数据块
简单数据获取
一个简单的例子,来演示如何调整物体位置:
Properties Window -> Object -> Transform -> Location打开这个界面,右键选择OnlinePython Reference,这会连接到bpy.types.Object.location
你会使用.location ,这是一个3维浮点型数组,如何获取这个数据呢?
最常用的是方法是通过context,因为object可以在很多方式获取-modifiers, functions, textures and constraints.,所以很容易被覆盖
但是如果你想获取任意选择的数据,你仅仅需要查看bpy.context文档,有各种具体的方式:
使用weight_paint_object获取的数据仅仅用于权重图模式
用户最近选择的要用active成员
获取单一的用户选择的物体,例如active_bone,active_pose_bone,active_node例如active_object
bpy.context.active_object.location
另一个获取object的方式是bpy.types.BlendData.objects,它没有列在bpy.data.objects,因为bpy.data是bpy.types.BlendData一个实例,bpy.data.objects是一个集合,你可以获取其中的成员:
bpy.data.objects["Cube"].location
嵌套属性
复杂的例子:
# access a render layers samples
bpy.context.scene.render.layers["RenderLayer"].samples
# access to the current weight paint brushsize
bpy.context.tool_settings.weight_paint.brush.size
# check if the window is fullscreen
bpy.context.window.screen.show_fullscreen
几种方式帮助你得到你想要的数据:
- Use the Python console’s auto-complete(自动补全) to inspect properties. This can be hit-and-miss but has the advantage that you can easily see the values of properties and assign them to interactively see the results.
- Copy(复制) the Data-Path from the user interface(用户界面). Explained further in :ref:`Copy Data Path <info_data_path_copy>`
- Using the documentation(文档) to follow references. Explained further in :ref:`Indirect Data Access <info_data_path_indirect>`
复制数据路径
Blender可以计算工具tips显示的Python字符串,在python:…一行的下面,这使得使用API文档可以找到数据的源头
复制数据路径(来自bpy.types.ID)到其属性
在默认窗口模式下,tab选择修改模式,为立方体添加一个子分支表面修改(?这个一直没有找到如何添加。。。)
现在,移动鼠标到View按钮,工具tip包括bpy.types.SubsurfModifier.levels但是我想要物体的这个路径属性
注意文本复制不包括bpy.data.collection["name"].组件,因为你不会收集每一次获取的寻找,通常你想用context而不是通过名字获取每一个 bpy.types.ID实例
输入ID的路径到终端,bpy.context.active_object.包含最后一个点,不要点击enter
现在右键鼠标,选择Copy Data Path,将结果粘贴到终端里。
bpy.context.active_object.modifiers["Subsurf"].levels
点击enter键得如下‘1’结果,改变其值:
bpy.context.active_object.modifiers["Subsurf"].levels=2
可以在Subdivision-Surfacemodifier界面更新,cube也更新
间接路径获取
这个例子会让我们更加深入地了解,展示了获取激活雕刻刷子纹理的步骤
通过python获取刷子的纹理,并对其进行对比设置:
1. 在默认窗口视图模式,确保3D-view标题的雕刻模式
2. 从工具条扩展纹理面板,增加新的纹理,注意纹理按钮本身没有有效连接
3. 相反设置没有在雕刻面板显示。因此在属性面板观察纹理
在属性按钮选择纹理context
选择Brush图标,显示Brush纹理
扩展颜色面板里可以定位对比按钮(?)
4. 右键对比按钮OnlinePython Reference进入bpy.types.Texture.contrast
5. 此时我们看到对比是纹理的一个属性了,下一步如何从Brush获取纹理
6. 查看参考文档底部,Brush.texture
7. 现在纹理可以通过bpy.data.brushes["BrushName"].texture获取,但是通常情况下我们不想通过名字获取brush,因此下面是获取激活的brush的方法:bpy.context.brush
多种方式获取同样的数据:
bpy.context.brush.texture.contrast
bpy.context.sculpt.brush.texture.contrast
bpy.data.brushes["BrushName"].texture.contrast
如果你在开发以个用户工具一般用bpy.context因为用户通常希望工具依据他们的选择被操作
自动化呢,你最好用bpy.data,因为你想获取明确的数据并对其进行操作处理,不论用户现在的视图设置是什么样的。
操作
Blender中所有的快捷键和按钮都会调用一个操作,操作在bpy.ops中定义
只要按钮有tips和Python:行(?)就可以得到操作名,如果没有说明没有相关的定义
你可以将鼠标移到按钮,然后ctrl-c复制到键盘上
也可以右键选择OnlinePython Reference,它显示了参数和默认操作(有文件名和行号),这对喜欢查看源码的人有用
注意:不是所有操作都有效,详见usingoperators
信息视图
Blender记录了所有的操作和现实在信息空间,在文件按钮下边,可以下拉看到。选择脚本视图模式可以看到其输出。你可以执行一些操作然后看其显示的内容,删除点例如:
每一个命令可以被鼠标右键选择,复制粘贴到文本编辑器中
注意:不是所有操作都会显示,图像放大就没有,因为它不是那么重要,详见ShowAll Operators