【Blender开发】UI示例:面板与属性示例

272 阅读1分钟

原文链接

【Blender开发】UI示例:面板与属性示例

我对配图和代码注释进行了补充。

正文

效果图

  • 首先将下节中的代码保存在插件目录中,然后在 Blender 的 Add-on 选项中勾选 image.png

  • 自定义的面板界面 image.png

  • 自定义的菜单项 image.png

脚本代码与详细注释

import bpy

bl_info = {
    "name" : "test",
    "author" : "yl",
    "description" : "",
    "blender" : (3, 00, 0),
    "version" : (0, 0, 1),
    "location" : "",
    "warning" : "",
    "category" : "Yuelili",
    "doc_url":"https://yuelili.com"
}


# 自定义操作类
class MESH_OT_cube_grid(bpy.types.Operator):
    bl_idname="mesh.first_tool"  # ID,必须。命名必须要带,以小写字母,下划线 数字(my_operator.my_class_name)
    bl_label = "Test Operator" # 标签,显示名称
    bl_options = {'REGISTER','UNDO'}

    numX : bpy.props.IntProperty(name="X",default=3)
    numY : bpy.props.IntProperty(name="Y",default=2)


    @classmethod
    def poll(cls,context):
        return True

    def execute(self,context):
        print("execute")
        for i in range(self.numX):
            for j in range(self.numY):
                bpy.ops.mesh.primitive_cube_add(size=2, location=(i * 10 , j * 10,0))

        return {"FINISHED"}

    def invoke(self, context, event):
        self.execute(context)
        print("invoke")
        return {"FINISHED"}
        
# 自定义面板类
class VIEW3D_PD_cube_grid(bpy.types.Panel):
    bl_space_type = "VIEW_3D"
    bl_region_type = "UI"
    bl_category = "My Panel"
    bl_label = "Grid"

    def draw(self,context):
        self.layout.operator("mesh.first_tool") # 执行测试操作
        col = self.layout.column(align = True)
        col.prop(context.scene.cycles,"preview_samples") # Cycles 采样数

# 执行菜单项
def mesh_add_menu(self,context):
    self.layout.operator("mesh.first_tool")  # 执行测试操作

def register():
    print("塔塔开")

    # 注册
    bpy.utils.register_class(MESH_OT_cube_grid)
    bpy.utils.register_class(VIEW3D_PD_cube_grid)
    bpy.types.VIEW3D_MT_mesh_add.append(mesh_add_menu) # 添加菜单项
    ...

def unregister():
    print("已经不用再战斗了")
    #注销
    bpy.utils.unregister_class(MESH_OT_cube_grid)
    bpy.utils.unregister_class(VIEW3D_PD_cube_grid)
    bpy.types.VIEW3D_MT_mesh_add.remove(mesh_add_menu)
    ...