Blender Python API Overview
Published
Contents
via http://www.blender.org/documentation/blender_python_api_2_70a_release/info_overview.html
可以用 python api 集成的类型
- bpy.types.Panel
- bpy.types.Menu
- bpy.types.Operator
- bpy.types.PropertyGroup
- bpy.types.KeyingSet
- bpy.types.RenderEngine
可见,使用 Blender Python API 可以做的事情是在 UI 界面可以做的所有事情,以及集成以上6种类型, 所以python api并不能做所有事情,比如 创建一个modifier、 创建一个compositing node, 如有这种需求的时候就需要用到 C/C++ 对源码进行改写了
感觉blender对python api的理解是简化操作而不是增加特性而实现的。
在使用以上类型的时候尽量不涉及任何固有变量,固有变量应该被储存在 blender data 里,这样就能被保存和加载了(话说撤销机制是不是也是这么实现的?), 这么看来其实blender的设计模式并不完全是OOP形式,更像是DOP,面向数据,以及MVC
从blender源码上来分析也是这种感觉,blender靠一个奇怪的 DNA/RNA 机制实现了动态类型
Registration
Module Registration
当一个 python 代码被放在 scripts/addons/
下时,便会自动的被blender import 并调用 register()
和 unregister()
Class Registration
前面提到的6种类型,在继承以后可以通过 bpy.utils.register_class(cls)
来注册,或者通过 bpy.utils.register_module(mod)
来自动注册所有在mod内部的类,按照定义顺序
Inter Classes Dependencies
注册的时候需要考虑调用顺序
Manipulating Classes
properties 可以在运行时被动态的添加
Dynamic Defined-Classes
动态定义类, 这用法太风骚了…还是少用为好
Application Modules
Context Access
bpy.context
: blender 上下文信息,所有变量只读,不过可以通过data api修改
Data Access
bpy.data
: blender内部的所有数据(除开context)
Opetators
bpy.ops
: 所有用python,c和宏实现的 operator 都可以被找到
因为 operator 有一些特性,所以也有一些特殊的调用方法
所有 operator 支持三个特殊的 positional arguments,因为其他参数都是 keyword arguments,所以不会冲突:
override_context
: dict type
用于重载传给 operator 里的 contextexecution_context
: string(enum)
没看懂有啥用…似乎相关invoke和execute的区别,这个之后的文章再深究undo
: bool 是否支持撤销,也就是要不要在做这个操作之前做一次备份
比较神奇的是这三个参数顺序是无所谓的,可以查看代码:
File "Blender Foundation\Blender\2.71\scripts\modules\bpy\ops.py", line 185, in __call__
C_dict, C_exec, C_undo = BPyOpsSubModOp._parse_args(args)
因为三个参数类型不同,所以顺序不同也是可以判断出来的
Types
bpy.types
: blender 中出现的所有类型
继承或者添加自定义属性时会用到
bpy_struct
: 所有类的基类,可以用来添加key,driverID
: 负责GC,连接和储存的基类
Utilities
bpy.utils
: 各种零碎的实用的函数如 register_class
Property Definitions
bpy.props
: 提供若干属性的声明,有 bool, float, int, string… 以及 update, get/set 的设置
这种 property 定义方法被称之为 RNA properties
, 除此之外还有一种定义方法是 ID properties
, RNA properties
的定义是针对一个类型, 而 ID properties
是针对单个实例的
乱
bpy.context.window_manager.popup_menu(draw, title="Greeting", icon='INFO')
bpy.ops.object.select_by_type(type='MESH')
blog comments powered by Disqus