Blender的插件开发-对象体系探索

按照python的说法一切皆对象,Blender中亦然。

Blender的根对象是bpy,因此任何模块都需要:

import bpy

bpy.data

然后,任何对象其实都是数据,因此访问blender的第一个关键对象是bpy.data。现在,我们打开python的命令行窗口:

拖动3D视图的右上角,向左下,扩展出一个窗口。
选择左下角的立方体,选择Python控制台,然后就可以输入Python脚本了。

在其中输入:

>>bpy.data.objects
<bpy_collection[4], BlendDataObjects>

bpy_collection是一个python的词典对象,显示有四个对象(窗口初始是三个对象,我加了一个)。

想知道是哪几个对象?很好办。用一个遍历,如下所示,列出了所有对象的名字:

>>> for obj in bpy.data.objects:
...     print(obj.name)
...     
Camera
Cube
Lamp
融球

通过这种方式,我们可以操作Blender的几乎所有数据。

bpy.context

bpy.context顾名思义就是运行的上下文环境,这个在脚本环境里到处碰到了。知道了这个,呵呵!

>>> bpy.context.object
>>> bpy.context.selected_objects
>>> bpy.context.visible_bones

这里可以看到,context也可以访问到object,这个是当前的环境可用的对象,其数据跟data里是一致的。后面的ops还可以来访问和修改对象的属性值。

这是典型的python式的“面向对象”,数据按照对象来组织,但是访问时却是以函数方式出现的,从而适应脚本环境的运行需要。

bpy.ops

bpy.ops是Operator(操作器)的简写,封装了很多的对象操作在里面,是Blender功能的核心了。

>>> bpy.ops.mesh.flip_normals()
{‘FINISHED‘}

>>> bpy.ops.mesh.hide(unselected=False)
{‘FINISHED‘}

>>> bpy.ops.object.scale_apply()
{‘FINISHED‘}

一个操作器的完整例子:

import bpy

def main(context):
    for ob in context.scene.objects:
        print(ob)

class SimpleOperator(bpy.types.Operator):
    """Tooltip"""
    bl_idname = "object.simple_operator"
    bl_label = "Simple Object Operator"

    @classmethod
    def poll(cls, context):
        return context.active_object is not None

    def execute(self, context):
        main(context)
        return {‘FINISHED‘}

def register():
    bpy.utils.register_class(SimpleOperator)

def unregister():
    bpy.utils.unregister_class(SimpleOperator)

if __name__ == "__main__":
    register()

    # test call
    bpy.ops.object.simple_operator()

注意里面的register/unregister,以及其中的class和poll、execute成员函数,这是一个典型的插件的实现结构。

大部分插件照着上面这个结构依瓢画葫芦就可以了。

bpy.types

bpy.types不是python的type对象的简单封装,而是Blender各种“类”的集合,不要问我到底有啥区别哈,谁用谁知道啊。

注意:Panel也是types里面的东东啊。下面是定义Panel的插件:

import bpyclass HelloWorldPanel(bpy.types.Panel):
    """Creates a Panel in the Object properties window"""
    bl_label = "Hello World Panel"
    bl_idname = "OBJECT_PT_hello"
    bl_space_type = ‘PROPERTIES‘
    bl_region_type = ‘WINDOW‘
    bl_context = "object"

    def draw(self, context):
        layout = self.layout

        obj = context.object

        row = layout.row()
        row.label(text="Hello world!", icon=‘WORLD_DATA‘)

        row = layout.row()
        row.label(text="Active object is: " + obj.name)
        row = layout.row()
        row.prop(obj, "name")

        row = layout.row()
        row.operator("mesh.primitive_cube_add")

def register():
    bpy.utils.register_class(HelloWorldPanel)

def unregister():
    bpy.utils.unregister_class(HelloWorldPanel)

if __name__ == "__main__":
    register()

注意,这里多了一些变量的声明,这是插件的一些说明。

bl_label = "Hello World Panel"
bl_idname = "OBJECT_PT_hello"
bl_space_type = ‘PROPERTIES‘
bl_region_type = ‘WINDOW‘
bl_context = "object"

所有插件原则上都应该包含上面这些信息,引号内的字符串可以修改,变量名不能修改(否则就成自己的了)。这个插件信息声明了这个panel是在对象的属性面板中出现。

bpy.types包含的一些对象如下:

bpy.types.Panel
bpy.types.Menu
bpy.types.Operator
bpy.types.PropertyGroup
bpy.types.KeyingSet
bpy.types.RenderEngine

这里再次了出现Operator对象,跟前面的bpy.ops是不是一样的啊?

我猜测应该是,考虑到type是python的基本对象,这个现象一点也不奇怪。要想一探究竟,很简单,到python控制台运行一下即可。

时间: 2024-08-11 19:45:37

Blender的插件开发-对象体系探索的相关文章

Python对象体系揭秘

Guido用C语言创造了Python,在Python的世界中一切皆为对象. 一.C视角中的Python对象 让我们一起追溯到源头,Python由C语言实现,且向外提供了C的API http://docs.python.org/c-api/index.html . 我们思考问题的时候,可能对于对象这种东西很容易理解,而计算机能理解的只有0,1序列这样的字节序列,从根本上讲,我们所说的计算机语言中的对象只是在内存中的一块内存空间里的0,1序列而已,这些连续或者非连续的内存空间在更高层次上可以看作是一

【Excel&amp;VBA】VBA对象体系

VBA对象体系 Application对象——代表整个Microsoft Excel应用程序 常用属性   常用方法 常用事件 ActiveCell  OnWindow  Calculate  SheetActive ActiveSheet  Path  ConvertFormula  SheetDeactive ActiveWindow  PathSeparator  OnKey  SheetFollowHyperlink  ActiveWorkbook  Range  InputBox  W

ARPG客户端中场景对象体系设计

一.场景对象体系 二.场景对象生命周期管理 场景对象的生命周期,不适合采用原始的c++管理方式, 即由使用者自己负责删除.而应该采用引用计数方式, 自动负责删除. 采用引用计数方式, 目前用法比较广的分两类: 1.智能指针, 如boost::shared_ptr, 这种方式原理是基于c++对象的生命周期和析构函数来实现的, 而且引用计数是由智能指针对象保存的.在这种方式下, 对象的传递和引用都是使用智能指针对象, 例如: class A; typedef boost::shared_ptr<A>

Blender的插件开发-Operator操作器(算子)

毫无疑问,Operator是Blender中最为核心的一个对象,而且里面包罗万象(不仅可以操作几何对象,所有的菜单都可以控制,因为Blender其实就是一个三维图形的超级命令解释器嘛!). 我们先定义一个简单的Operator.把下面的代码复制到文本编辑中,点击"执行脚本". import bpy class SimpleOperator(bpy.types.Operator):     bl_idname = "object.simple_operator"   

Blender的插件开发-Panel面板

工具栏面板 先创建一个简单的面板. import bpy class View3DPanel():     bl_space_type = 'VIEW_3D'     bl_region_type = 'TOOLS'     @classmethod     def poll(cls, context):         return (context.object is not None) class PanelOne(View3DPanel, bpy.types.Panel):     bl

js对象体系总结

废话不多说,抛图一张... 总结: 所有的函数都有prototype属性. prototype属性本质上也是对象(实际上是Object的实例对象{ })----原型对象中也有一个__proto__属性,并且指向Object.prototype,但是Object.prototype中没有该属性. 原型对象中默认会有一个constructor属性,该属性指向原型所属的构造函数. 所有的函数都是Function的实例. Function也是自己的实例. 所有的实例对象中都有一个__proto__属性,

对象体系图解

对象实例化图解

高职院校软件技术专业程序设计课程体系探索(一)

邹韬奋先生在<职业教育研究>中说,"总言之,职业教育乃准备能操一技之长,从事有益于社会之生产事业,籍以求适当之生活,乃教育中之一方面".我同意这种观点.所以我觉得高职院校软件技术专业的培养目标应当是"培养具有扎实程序设计.实现.调试能力,掌握一项软件开发技能,有一定实践经验与理论基础的具备较高综合素质的软件开发与运维人才".其中的核心是"程序设计.实现.调试能力".所以问题的核心是如何培养这项能力. 在我学习程序设计,还有观察周边小伙

jQuery插件开发全解析,类级别与对象级别开发

jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级别的插件开发,即给jQuery对象添加方法.下面就两种函数的开发做详细的说明. 1.类级别的插件开发 类级别的插件开发最直接的理解就是给jQuery类添加类方法,可以理解为添加静态方法.典型的例子就是$.AJAX()这个函数,将函数定义于jQuery的命名空间中.关于类级别的插件开发可以采用如下几种