前言

在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. rev

    功能说明:反向输出文件内容.   字符串反转   文本反转

  2. Day 22 面向对象编程

    面向对象基础 面向对象编程(抽象) 对象:特征和技能的结合体 面向对象编程:一个个对象进行交互 优点:扩展性非常强 缺点:逻辑非常复杂 类与对象 类(类别):一系列具有相同特征和技能的对象 现实世界中 ...

  3. Axure RP 9 WIN10 64位安装步骤及注册码

    License栏输入:ABC Key栏输入:M5PHzBHvhAG3cNRr2CFxAJaIHaXOkwleDSctQ9sY0pQ2vd7eJzoBNtD7zBZNSPmT http://www.zh ...

  4. TensorFlow学习笔记----例子(2)

    使用TensorFlow中的梯度下降法构建线性学习模型的使用示例:(来源:https://morvanzhou.github.io/tutorials/machine-learning/tensorf ...

  5. js-2018-11-09 关于Array中的srot()方法和compare()方法

    Array中的srot()方法 sort()方法是用来重排序的方法.在默认情况下,sort()方法按升序排列数组项----即最小的值位于最前面,最大的值排在最后面. 我们看看官方是怎么说的: arra ...

  6. 洛谷P1208 [USACO1.3]混合牛奶 Mixing Milk【贪心+背包】

    由于乳制品产业利润很低,所以降低原材料(牛奶)价格就变得十分重要.帮助Marry乳业找到最优的牛奶采购方案. Marry乳业从一些奶农手中采购牛奶,并且每一位奶农为乳制品加工企业提供的价格是不同的.此 ...

  7. AtCoder ARC 076E - Connected?

    传送门:http://arc076.contest.atcoder.jp/tasks/arc076_c 平面上有一个R×C的网格,格点上可能写有数字1~N,每个数字出现两次.现在用一条曲线将一对相同的 ...

  8. vue中的slot理解和使用

    最近被vue 搞得一塌糊涂,理解的比较慢,工作进度进度要求太快,需求理解不明,造成了很大的压力. 在理解Vue中的Slot的时候看了网上的相关内容,看了半天没看到明白说的是什么,然后自己就安装了vue ...

  9. VS-诊断工具和智能跟踪

    MSDN文章

  10. java editor template Eclipse中的快速Java\JavaScript代码模板使用

    java editor template Eclipse中的快速Java\JavaScript代码模板使用 学习了:http://technicalsearch.iteye.com/blog/2150 ...