Blender Interface
Published
12 August 2014
Contents
blender 主要有两种 UI:
- 继承自
bpy.types.Panel
, 有 properties 和 draw function bpy.types.Operator
, 有 properties, execute function, 可选的 invoke function
一个注册文件中所有类的方法是 bpy.utils.register_module(__name__)
Panels and buttons
可以通过以下代码添加一个按钮
self.layout.operator("hello.hello", text='Hej').country = "Sweden"
UILayout.operator
具有额外参数:
text
: 按钮上的字text_ctxt
: 用于翻译translate
: 是否翻译icon
: 图标, 比如 ‘QUESTION’, ‘ERROR’, ‘CANCEL’emboss
: bool, 是否显示按钮的凸起
同时这个函数具有返回值, 可以对对应的 operator 设置调用时的 properties, 可以设置多个 properties, 如下:
op = row.operator("transform.translate")
op.value = (1,-1,-1)
op.proportional_size = 1
和 operator 一样, panel 同样有 bl_*
的前缀, 常用的有
bl_idname
: idbl_label
: label, 提示性文字, 标题bl_space_type
: 属于哪个 space, 如VIEW_3D
,PROPERTIES
bl_region_type
: 属于哪个 region, 如TOOLS
,TOOL_PROPS
bl_context
: 取决于具体环境, 这三项从上到下决定了具体 panel 的具体位置
可重载函数:
classmethod poll(context)
: 返回bool, 是否绘制uidraw_header(context)
: 用来绘制标题draw(context)
: 用来绘制 panel
Panel properties
除了 operator, 还可以使用 panel 控制 properties, 如下:
layout.prop(ob, 'myRnaInt') # RNA properties
layout.prop(ob, '["myRnaInt"]') # ID properties
以及一些常用的 ui 元素:
layout.template_ID
: ID 链接prop_menu_enum
: 枚举类菜单
Panel layout
layout.row()
: 在同一行, 有一个参数, align, 表示元素是否为紧凑排列layout.column()
: 同 row, 按列排列layout.alignment
: 设置对齐方式layout.box()
: 包围盒layout.separator()
: 分隔符layout.split()
: 有一个参数 percentage, 按行宽度百分比拆分
menu
找到对应的菜单, 使用 prepend
/append
函数添加绘制函数
bpy.types.INFO_MT_mesh_add.prepend(menu_func)
bpy.types.INFO_MT_mesh_add.append(menu_func)
bpy.types.INFO_MT_mesh_add.remove(menu_func)
A modal operator
modal operator 和普通的 operator 的区别是, Operator.modal
被重载用来处理事件, 主要用于交互式的 operator
modal 函数的返回值有 4 种:
FINISHED
: 结束CANCELLED
: 取消RUNNING_MODAL
: 等待下一个事件触发继续运行PASS_THROUGH
: 不知道…把 blender 整个代码搜了一遍也只有很少很集中的地方用到了, 应该不用也没问题, 感觉像是多个 modal operator 调用时处理的事情?
可以通过重载 __init__
和 __del__
获得 modal operator 开始和结束的信息
在调用时使用语句 context.window_manager.modal_handler_add(self)
blog comments powered by Disqus