跳转至内容

Blender 3D:菜鸟到专业/高级教程/Blender 脚本/为您的插件添加用户界面

来自维基教科书,为开放世界提供开放书籍

因此您已经在插件中定义了一个新的运算符。现在,为该插件提供一个合适的界面会很不错,这样用户就不必在空格菜单中查找该运算符了。

执行此操作的最佳方法是定义一个面板,该面板显示在某个窗口中,其中包含用户可以单击以操作您的插件的控件。您可以将面板放置在各种位置,但在这里我们将其插入工具架(可以通过按  T  来隐藏或显示在 3D 视图的左侧)。

您的第一个面板

[编辑 | 编辑源代码]

面板是通过对bpy.types.Panel类进行子类化来定义的。您设置各种属性的值(bl_space_type, bl_region_type, bl_categorybl_context)以确定面板将显示的上下文,并为面板提供标题(bl_label):

class TetrahedronMakerPanel(bpy.types.Panel):
    bl_space_type = "VIEW_3D"
    bl_region_type = "TOOLS"
    bl_context = "objectmode"
    bl_category = "Create"
    bl_label = "Add Tetrahedron"

这三个属性会使面板显示在工具架中,但仅在 3D 视图处于对象模式时才会显示。bl_category 行确定插件所在的工具栏选项卡,并且仅适用于带有选项卡的工具栏(2.7 版本添加)。指定任何现有的选项卡,或定义一个新的选项卡。

您的类还需要定义一个draw方法,该方法定义面板中的项目。此示例为面板创建一个新的 UI 元素列,并插入一个 UI 元素,该元素是一个按钮,单击该按钮将调用您之前在定义时定义的运算符。

    def draw(self, context):
        TheCol = self.layout.column(align=True)
        TheCol.operator("mesh.make_tetrahedron", text="Add Tetrahedron")
    #end draw

添加撤销支持

[编辑 | 编辑源代码]

趁此机会,返回并向运算符定义添加以下行

    bl_options = {"UNDO"}

这允许用户以通常的方式使用  CTRL + Z  撤销四面体的添加,并使用  CTRL + SHIFT + Z  重新执行该操作。

将所有内容整合在一起

[编辑 | 编辑源代码]

以下是插件的完整脚本,它现在处于运行状态

import math
import bpy
import mathutils

class TetrahedronMakerPanel(bpy.types.Panel):
    bl_space_type = "VIEW_3D"
    bl_region_type = "TOOLS"
    bl_context = "objectmode"
    bl_category = "Create"
    bl_label = "Add Tetrahedron"

    def draw(self, context):
        TheCol = self.layout.column(align=True)
        TheCol.operator("mesh.make_tetrahedron", text="Add Tetrahedron")
    #end draw

#end TetrahedronMakerPanel

class MakeTetrahedron(bpy.types.Operator):
    bl_idname = "mesh.make_tetrahedron"
    bl_label = "Add Tetrahedron"
    bl_options = {"UNDO"}

    def invoke(self, context, event):
        Vertices = \
          [
            mathutils.Vector((0, -1 / math.sqrt(3),0)),
            mathutils.Vector((0.5, 1 / (2 * math.sqrt(3)), 0)),
            mathutils.Vector((-0.5, 1 / (2 * math.sqrt(3)), 0)),
            mathutils.Vector((0, 0, math.sqrt(2 / 3))),
          ]
        NewMesh = bpy.data.meshes.new("Tetrahedron")
        NewMesh.from_pydata \
          (
            Vertices,
            [],
            [[0, 2, 1], [0, 1, 3], [1, 2, 3], [2, 0, 3]]
          )
        NewMesh.update()
        NewObj = bpy.data.objects.new("Tetrahedron", NewMesh)
        context.scene.objects.link(NewObj)
        return {"FINISHED"}
    #end invoke

#end MakeTetrahedron

bpy.utils.register_class(MakeTetrahedron)
bpy.utils.register_class(TetrahedronMakerPanel)

请注意为我们的自定义面板添加了另一个 register_class 调用。

如前所述,按  ALT + P  执行它。似乎什么也没发生;Blender 会处理您的子类定义,并根据请求将它们注册到相应的位置。

但现在,返回到 3D 视图。确保您处于对象模式。通过按  T  显示工具架(如果它不可见)。在底部,您指定的选项卡中,您应该看到您的新面板出现

请注意标题旁边的三角形,Blender 会自动为您提供它,以在不进行任何额外操作的情况下折叠或展开面板。删除上一页教程中可能创建的任何四面体对象;现在单击新的“添加四面体”按钮,然后观察对象再次被创建!

空间类型、区域类型、上下文,我的天哪!

[编辑 | 编辑源代码]

这些值bl_space_type, bl_region_typebl_context此处 的 Blender API 文档中(部分)列出,但没有完全解释。以下是我通过查看源代码找到的每个属性的允许值列表

属性 允许的值 源引用
bl_space_type "EMPTY", "VIEW_3D", "TIMELINE", "GRAPH_EDITOR", "DOPESHEET_EDITOR", "NLA_EDITOR", "IMAGE_EDITOR", "SEQUENCE_EDITOR", "CLIP_EDITOR", "TEXT_EDITOR", "NODE_EDITOR", "LOGIC_EDITOR", "PROPERTIES", "OUTLINER", "USER_PREFERENCES", "INFO", "FILE_BROWSER", "CONSOLE" space_type_itemsrna_space.c
bl_region_type "WINDOW", "HEADER", "CHANNELS", "TEMPORARY", "UI", "TOOLS", "TOOL_PROPS", "PREVIEW" region_type_itemsrna_screen.c
bl_context "mesh_edit", "curve_edit", "surface_edit", "text_edit", "armature_edit", "mball_edit", "lattice_edit", "posemode", "sculpt_mode", "weightpaint", "vertexpaint", "imagepaint", "particlemode", "objectmode" data_mode_stringscontext.c

可以推测,并非所有组合都有意义。

华夏公益教科书