前言

在Blender中, 操作器(Operator)是它的核心. 用户通过各种操作器来创建和操作场景中的物体.

操作器对象继承自 class bpy.types.Operator(bpy_struct)

下面通过代码实例来学习它, 以下代码来源于https://docs.blender.org/api/2.79/bpy.types.Operator.html
#### 1 最简单的Operator
简单的信息打印
import bpy

class HelloWorldOperator(bpy.types.Operator):
bl_idname = "yy.hello_world"
bl_label = "Minimal Operator" def execute(self, context):
print("Hello World!")
return {'FINISHED'} bpy.utils.register_class(HelloWorldOperator) # test call to the newly defined operator
bpy.ops.yy.hello_world()
#### 2 Invoke

Operator.invoke用于在调用operator时从上下文初始化operator。

Operator.invoke is used to initialize the operator from the context at the moment the operator is called.

import bpy

class SimpleMouseOperator(bpy.types.Operator):
""" This operator shows the mouse location,
this string is used for the tooltip and API docs
"""
bl_idname = "wm.mouse_position"
bl_label = "Invoke Mouse Operator" x = bpy.props.IntProperty()
y = bpy.props.IntProperty() def execute(self, context):
# rather than printing, use the report function,
# this way the message appears in the header,
self.report({'INFO'}, "Mouse coords are %d %d" % (self.x, self.y))
return {'FINISHED'} def invoke(self, context, event):
self.x = event.mouse_x
self.y = event.mouse_y
return self.execute(context) bpy.utils.register_class(SimpleMouseOperator) # Test call to the newly defined operator.
# Here we call the operator and invoke it, meaning that the settings are taken
# from the mouse.
bpy.ops.wm.mouse_position('INVOKE_DEFAULT') # Another test call, this time call execute() directly with pre-defined settings.
bpy.ops.wm.mouse_position('EXEC_DEFAULT', x=20, y=66)
#### 3 调用文件选择器

Opens a file selector with an operator. The string properties ‘filepath’, ‘filename’, ‘directory’ and a ‘files’ collection are assigned

when present in the operator Notice the invoke function calls a window manager method and returns {'RUNNING_MODAL'},
this means the file selector stays open and the operator does not exit immediately after invoke finishes.

import bpy

class ExportSomeData(bpy.types.Operator):
"""Test exporter which just writes hello world"""
bl_idname = "export.some_data"
bl_label = "Export Some Data" filepath = bpy.props.StringProperty(subtype="FILE_PATH") @classmethod
def poll(cls, context):
return context.object is not None def execute(self, context):
file = open(self.filepath, 'r')
print(file.read())
file.close()
#file.write("Hello World " + context.object.name)
return {'FINISHED'} def invoke(self, context, event):
context.window_manager.fileselect_add(self)
return {'RUNNING_MODAL'} # Only needed if you want to add into a dynamic menu
def menu_func(self, context):
self.layout.operator_context = 'INVOKE_DEFAULT'
self.layout.operator(ExportSomeData.bl_idname, text="Text Export Operator") # Register and add to the file selector
bpy.utils.register_class(ExportSomeData)
bpy.types.INFO_MT_file_export.append(menu_func) # test call
bpy.ops.export.some_data('INVOKE_DEFAULT')
#### 4 对话框
import bpy

class DialogOperator(bpy.types.Operator):
bl_idname = "object.dialog_operator"
bl_label = "Simple Dialog Operator" my_float = bpy.props.FloatProperty(name="Some Floating Point")
my_bool = bpy.props.BoolProperty(name="Toggle Option")
my_string = bpy.props.StringProperty(name="String Value") def execute(self, context):
message = "Popup Values: %f, %d, '%s'" % \
(self.my_float, self.my_bool, self.my_string)
self.report({'INFO'}, message)
return {'FINISHED'} def invoke(self, context, event):
wm = context.window_manager
return wm.invoke_props_dialog(self) bpy.utils.register_class(DialogOperator) # test call
bpy.ops.object.dialog_operator('INVOKE_DEFAULT')
#### 5 自定义绘图

By default operator properties use an automatic user interface layout. If you need more control you can create your own layout with a Operator.draw function.

import bpy

class CustomDrawOperator(bpy.types.Operator):
bl_idname = "object.custom_draw"
bl_label = "Simple Modal Operator" filepath = bpy.props.StringProperty(subtype="FILE_PATH") my_float = bpy.props.FloatProperty(name="Float")
my_bool = bpy.props.BoolProperty(name="Toggle Option")
my_string = bpy.props.StringProperty(name="String Value") def execute(self, context):
print("Test", self)
return {'FINISHED'} def invoke(self, context, event):
wm = context.window_manager
return wm.invoke_props_dialog(self) def draw(self, context):
layout = self.layout
col = layout.column()
col.label(text="Custom Interface!") row = col.row()
row.prop(self, "my_float")
row.prop(self, "my_bool") col.prop(self, "my_string") bpy.utils.register_class(CustomDrawOperator) # test call
bpy.ops.object.custom_draw('INVOKE_DEFAULT')
#### 6 Modal执行

This operator defines a Operator.modal function that will keep being run to handle events until it returns {'FINISHED'} or {'CANCELLED'}.

import bpy

class ModalOperator(bpy.types.Operator):
bl_idname = "object.modal_operator"
bl_label = "Simple Modal Operator" def __init__(self):
print("Start") def __del__(self):
print("End") def execute(self, context):
context.object.location.x = self.value / 100.0
return {'FINISHED'} def modal(self, context, event):
if event.type == 'MOUSEMOVE': # Apply
self.value = event.mouse_x
self.execute(context)
elif event.type == 'LEFTMOUSE': # Confirm
return {'FINISHED'}
elif event.type in {'RIGHTMOUSE', 'ESC'}: # Cancel
context.object.location.x = self.init_loc_x
return {'CANCELLED'} return {'RUNNING_MODAL'} def invoke(self, context, event):
self.init_loc_x = context.object.location.x
self.value = event.mouse_x
self.execute(context) context.window_manager.modal_handler_add(self)
return {'RUNNING_MODAL'} bpy.utils.register_class(ModalOperator) # test call
bpy.ops.object.modal_operator('INVOKE_DEFAULT')

Blender插件之操作器(Operator)实战的更多相关文章

  1. Blender插件编写指南

    前言 Blender插件是Blender的利器, 用户可以使用各种插件扩充Blender的功能. Blender Python插件以bpy.props, bpy.types.Operator, bpy ...

  2. Blender插件之Panel

    目标 [x] 总结Blender之Panel 总结 Blender之Panel需要从Blender界面组成开始理解. 直观上Blender的界面层次为 Editors ‣ Regions ‣ (Tab ...

  3. Dynamics CRM2013 6.1.1.1143版本号插件注冊器的一个bug

    近期在做的项目客户用的是CRM2013sp1版本号,所以插件注冊器使用的也是与之相应的6.1.1.1143,悲剧的事情也因此而開始. 在插件中注冊step时,工具里有个run in user's co ...

  4. MYSQL的Java操作器——JDBC

    MYSQL的Java操作器--JDBC 在学习了Mysql之后,我们就要把Mysql和我们之前所学习的Java所结合起来 而JDBC就是这样一种工具:帮助我们使用Java语言来操作Mysql数据库 J ...

  5. WordPress Tweet Blender插件跨站脚本漏洞

    漏洞名称: WordPress Tweet Blender插件跨站脚本漏洞 CNNVD编号: CNNVD-201310-645 发布时间: 2013-10-30 更新时间: 2013-10-30 危害 ...

  6. MVC框架的插件与拦截器基础

    自制MVC框架的插件与拦截器基础 上篇谈到我自己写的MVC框架,接下来讲讲插件及拦截器! 在处理一些通用的逻辑最好把它封装一个插件或者拦截器,以便日后可以直接拿过来直接使用.在我的框架中可以通过继承以 ...

  7. mongoDB的shell数组操作器

    http://www.2cto.com/database/201304/205024.html mongoDB数组操作器   $push会向数组末尾加入一个元素,如果数组不存在,则会创建这个数组. 增 ...

  8. 自制MVC框架的插件与拦截器基础

    上篇谈到我自己写的MVC框架,接下来讲讲插件及拦截器! 在处理一些通用的逻辑最好把它封装一个插件或者拦截器,以便日后可以直接拿过来直接使用.在我的框架中可以通过继承以下抽象类来实现插件或者拦截器. 1 ...

  9. Blender插件加载研究

    目标 [x] 解析Blender插件代码加载原理, 为测试做准备 结论 采用方法3的方式, 可以在测试中保证重新加载子模块, 是想要的方式, 代码如下: _qk_locals = locals() d ...

随机推荐

  1. 【Oracle】DG中物理备库、快照备库的相互转换

    一.物理备库切换快照备库 1. 如果正在运行日志应用,先停止 ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; 2. 确保数据库为MOUN ...

  2. hibernate_02_session介绍

    什么是session? hibernate的session对象就相当于jdbc的connection.我们对数据库的操作(增删改等)都是使用的session方法. 写一个java类 package c ...

  3. JSP_内置对象_请求转发和请求重定向的区别

    请求重定向:客户端行为,response.sendRedirect(),从本质上将等同与两次请求,前一次请求request对象不会保存,地址栏的URL地址会改变. 请求转发:服务器行为,request ...

  4. day35-2 类的三大特性---多态,以及菱形继承问题

    目录 菱形继承问题 经典类 新式类 菱形继承 大招 多态与多态性 多态 多态性 多态在Python中的体现 鸭子类型(重要) 结论 菱形继承问题 经典类 没有继承object类的就是经典类,只有Pyt ...

  5. bos开发时,测试卡在登录界面解决

    在BOS工作空间工程路径下新建sp文件夹,如在E:\bosworkspace8.2\Project_0\lib 新建sp文件夹E:\bosworkspace8.2\Project_0\lib\sp.然 ...

  6. 【Shell编程】Shell基本语法

    Shell 语法   Shell程序设计作为一种脚本语言,在Linux系统中有广泛的应用,本文记录了关于Shell程序设计的基础语法知识和常用命令,方便查询,熟练使用shell也需要经常实践,这对于完 ...

  7. Vue解决跨域之反向代理

    目录 : config/index.js module.exports = { dev: { // Paths assetsSubDirectory: 'static', assetsPublicPa ...

  8. C++string和int的相互转化

    本方法主要利用sstream头文件中的方法来进行转换 1.int转成string #include <iostream> #include<string> #include&l ...

  9. Docker在WIN7上的配置

    为什么使用Docker Toolbox Docker在Windows上使用有两种方式,一是利用VirtualBox建立linux虚拟机,在linux虚拟机中安装docker服务端和客户端,二是利用Wi ...

  10. 如何用firefox57看中国大学mooc视频

    最新的firefox57看mooc视频不成功,查了很多帖子,不知所云. 其实只要几步: 1.安装User Agent Switcher(看一下其条目,如果没有的话就添加 [Mozilla/5.0 (W ...