Published

15 July 2014

Tags

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 里的 context
  • execution_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,driver
  • ID: 负责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