目录
本节课程带你了解,如何在下方的侧栏中添加自定义命令。
如果你想要免费的blender插件、模型等可以看看这个blender资源库
还有免费的Blender入门教程
01 代码框架
修改 __init__.py
代码,除 bl_info 参数不变,其余的更新为以下代码:
import bpy
class View3DPanel:
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_category = "ALESHU"
@classmethod
def poll(cls, context):
return True
class PANEL_PT_ONE(View3DPanel, bpy.types.Panel):
bl_label = "测试面板标签"
def draw(self, context):
layout = self.layout
layout.label(text="测试标签:")
row = layout.row()
row.operator(test_button.bl_idname, text="测试按钮")
class test_button(bpy.types.Operator):
bl_idname = "aleshu.test_button"
bl_label = "测试按钮"
bl_description = "测试按钮-描述"
@classmethod
def poll(cls, context):
return (context.object is not None)
def invoke(self, context, event):
print('测试按钮_点击')
return {"FINISHED"}
classes = (
PANEL_PT_ONE,
test_button
)
def register():
for cls in classes:
bpy.utils.register_class(cls)
def unregister():
for cls in classes:
bpy.utils.unregister_class(cls)
if __name__ == "__main__":
register()
想要在菜单中加入一个自定义命令,你必须要满足几个要求:
-
注册一个Panel类(bpy.types.Panel);
-
指定面板的位置;
-
在面板中添加元素,案例中我们添加了一个标签以及一个按钮。
01.01 定义一个 Panel 类
根据以上步骤,我们需要先定义一个 Panel 类,其中 bl_label 是面板名称。
class PANEL_PT_ONE(View3DPanel, bpy.types.Panel):
bl_label = "测试面板标签"
def draw(self, context):
pass
这个Panel类的类名中需要包含
_PT_
的标识,否则Blender会在控制台窗口生成警告。
01.02 指定面板位置
View3DPanel 是一个自定义类,用于指定面板位置。
class View3DPanel:
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_category = "ALESHU"
@classmethod
def poll(cls, context):
return True
-
bl_space_type:面板位置
-
bl_region_type:UI
-
bl_category:面板分类名称,将软件语言调为英文,如果面板位置里有重名分类名称,就会合并,若名称唯一,则单独生成一个侧栏。
-
poll():返回True表示显示当前面板,返回False表示隐藏当前面板。
01.03 注册 Panel 类
定义完成后,需要在Blender正式启用前注册类:
bpy.utils.register_class(cls)
在案例代码中,我们采用了for循环,去遍历所有类名。
当然有注册,就有卸载,在 unregister() 函数中,必须使用 bpy.utils.unregister_class(cls)
完成卸载动作。
01.04 在面板中添加元素
生成用于显示的标签:
layout = self.layout
layout.label(text="测试标签:")
添加一个占用一整行的按钮元素:
row = layout.row()
row.operator(test_button.bl_idname, text="测试按钮")
test_button 是自定义按钮组件:
class test_button(bpy.types.Operator):
bl_idname = "aleshu.test_button"
bl_label = "测试按钮"
bl_description = "测试按钮-描述"
@classmethod
def poll(cls, context):
return (context.object is not None)
def invoke(self, context, event):
print('测试按钮_点击')
return {"FINISHED"}
bl_idname 名称格式必须为 xx.xx 否则会抛出异常。
poll() 函数和 View3DPanel 中的 poll() 函数含义相同,返回 True 代表按钮可用,返回 False 代表按钮禁用。
invoke() 函数用于执行按钮被按下之后需要执行的指令,需要有返回值。
01.05 效果展示
02 面板位置
若我们想要在不同的编辑器的侧栏中添加自定义面板,就需要了解每一个面板对应的参数。
将上述框出来的代码替换成下面的参数即可更换面板的位置。
-
VIEW_3D:3D 视图
IMAGE_EDITOR:UV/图像编辑器
NODE_EDITOR:纹理/几何节点编辑器
SEQUENCE_EDITOR:视频序列编辑器
CLIP_EDITOR:影片剪辑编辑器
DOPESHEET_EDITOR:动画摄影表、时间线
GRAPH_EDITOR:曲线编辑器、驱动器
NLA_EDITOR:影片剪辑编辑器
TEXT_EDITOR:文本编辑器