【Blender Python】blender 增加 Menu

【Blender Python】blender 增加 Menu

入门菜单

import bpy


class BasicMenu(bpy.types.Menu):
    bl_idname = "OBJECT_MT_select_test"
    bl_label = "Select"

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

        op1 = layout.operator("object.select_all", text="Select/Deselect All")
        op1.action = 'TOGGLE'
        layout.operator("object.select_all", text="Inverse").action = 'INVERT'
        layout.operator("object.select_random", text="Random")


bpy.utils.register_class(BasicMenu)

# test call to display immediately.
#bpy.ops.wm.call_menu(name="OBJECT_MT_select_test")
bpy.ops.wm.call_menu(name=BasicMenu.bl_idname)

属性插页 加 自定义Menu

主要是 Menu PreSet 等一些操作

import bpy
from bpy.types import Operator, Menu
from bl_operators.presets import AddPresetBase


class OBJECT_MT_display_presets(Menu):
    bl_label = "Object Display Presets"
    preset_subdir = "object/display"
    preset_operator = "script.execute_preset"
    draw = Menu.draw_preset


class AddPresetObjectDisplay(AddPresetBase, Operator):
    '''Add a Object Display Preset'''
    bl_idname = "camera.object_display_preset_add"
    bl_label = "Add Object Display Preset"
    preset_menu = "OBJECT_MT_display_presets"

    # variable used for all preset values
    preset_defines = [
        "obj = bpy.context.object"
    ]

    # properties to store in the preset
    preset_values = [
        "obj.display_type",
        "obj.show_bounds",
        "obj.display_bounds_type",
        "obj.show_name",
        "obj.show_axis",
        "obj.show_wire",
    ]

    # where to store the preset
    preset_subdir = "object/display"


# Display into an existing panel
def panel_func(self, context):
    layout = self.layout

    row = layout.row(align=True)
    row.menu(OBJECT_MT_display_presets.__name__, text=OBJECT_MT_display_presets.bl_label)
    row.operator(AddPresetObjectDisplay.bl_idname, text="", icon='ZOOM_IN')
    row.operator(AddPresetObjectDisplay.bl_idname, text="", icon='ZOOM_OUT').remove_active = True


classes = (
    OBJECT_MT_display_presets,
    AddPresetObjectDisplay,
)


def register():
    for cls in classes:
        bpy.utils.register_class(cls)
    bpy.types.OBJECT_PT_display.prepend(panel_func)


def unregister():
    for cls in classes:
        bpy.utils.unregister_class(cls)
    bpy.types.OBJECT_PT_display.remove(panel_func)


if __name__ == "__main__":
    register()

操作符绑定快捷键

import bpy

# 将 shift + U 绑定为 物体反转的操作符 object.select_all
# 以上操作的代码等价调用方式 为 bpy.ops.object.select_all(action = 'INVERT')

keymap = {
    'idname': 'object.select_all', # 所绑定的操作符
    'oskey': False,  # 组合 win键(win) / commond键(mac)
    'ctrl': False, # 组合 ctrl
    'shift': True, # 组合 shift
    'alt': False, # 组合 alt(win) / option(mac)
    'key_modifier': 'NONE',
    'any': False,
    'type': 'U',
    'value': 'PRESS',
    'properties': {"action": "INVERT"} # 定义属性
        }

kc = bpy.context.window_manager.keyconfigs.addon
km = kc.keymaps.new(name='Window', space_type='EMPTY')
kmi = km.keymap_items.new(idname=keymap['idname'], type=keymap['type'],
                          value= keymap['value'], ctrl=keymap['ctrl'],
                          shift=keymap['shift'], alt=keymap['alt'],
                          oskey=keymap['oskey'], any=keymap['any'],
                          key_modifier=keymap['key_modifier'])

for pn, p in keymap['properties'].items():
    setattr(kmi.properties, pn, p)
    
kmi.active = True
bpy.ops.wm.call_menu(Menu) # 召回菜单
bpy.ops.wm.call_panel(Panel) # 召回面板
bpy.ops.wm.call_menu_pie() # 召回饼状菜单

召回菜单

import bpy

class BasicMenu(bpy.types.Menu):
    bl_idname = "OBJECT_MT_select_test"
    bl_label = "Select"

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

        op1 = layout.operator("object.select_all", text="Select/Deselect All")
        op1.action = 'TOGGLE'
        layout.operator("object.select_all", text="Inverse").action = 'INVERT'
        layout.operator("object.select_random", text="Random")


bpy.utils.register_class(BasicMenu)

# test call to display immediately.
#bpy.ops.wm.call_menu(name="OBJECT_MT_select_test")
#bpy.ops.wm.call_menu(name=BasicMenu.bl_idname)


# 将 shift + U 绑定为 物体反转的操作符 object.select_all
# 以上操作的代码等价调用方式 为 bpy.ops.object.select_all(action = 'INVERT')

keymap = {
    'idname': "wm.call_menu", # 所绑定的操作符
    'oskey': False,  # 组合 win键(win) / commond键(mac)
    'ctrl': False, # 组合 ctrl
    'shift': True, # 组合 shift
    'alt': False, # 组合 alt(win) / option(mac)
    'key_modifier': 'NONE',
    'any': False,
    'type': 'P',
    'value': 'PRESS',
    'properties': {"name": BasicMenu.bl_idname} # 定义属性
        }

kc = bpy.context.window_manager.keyconfigs.addon
km = kc.keymaps.new(name='Window', space_type='EMPTY')
kmi = km.keymap_items.new(idname=keymap['idname'], type=keymap['type'],
                          value= keymap['value'], ctrl=keymap['ctrl'],
                          shift=keymap['shift'], alt=keymap['alt'],
                          oskey=keymap['oskey'], any=keymap['any'],
                          key_modifier=keymap['key_modifier'])

for pn, p in keymap['properties'].items():
    setattr(kmi.properties, pn, p)
    
kmi.active = True

创建饼状菜单及其快捷键绑定

import bpy

class MY_MT_Pie(bpy.types.Menu):
    bl_idname="MY_MT_pietest"
    bl_label="第一个PIE菜单测试"
    
    
    def draw(self, context):
        layout = self.layout
        pie = layout.menu_pie()
        if context.area.type == "VIEW_3D":
            # 左
            p1 = pie.operator("object.select_all", text="反选")
            p1.action = "INVERT"
            # 右
            p2 = pie.operator("object.select_all", text="全选")
            p2.action = "SELECT"
            # 底
            p3 = pie.operator("object.select_all", text="取消选择")
            p3.action = "DESELECT"
            # 顶
            p4 = pie.operator("object.select_all", text="默认")
            
bpy.utils.register_class(MY_MT_Pie)

keymap = {
    'idname': "wm.call_menu_pie", # 所绑定的操作符
    'oskey': False,  # 组合 win键(win) / commond键(mac)
    'ctrl': False, # 组合 ctrl
    'shift': True, # 组合 shift
    'alt': False, # 组合 alt(win) / option(mac)
    'key_modifier': 'NONE',
    'any': False,
    'type': 'P',
    'value': 'PRESS',
    'properties': {"name": MY_MT_Pie.bl_idname} # 定义属性
        }

kc = bpy.context.window_manager.keyconfigs.addon
km = kc.keymaps.new(name='Window', space_type='EMPTY')
kmi = km.keymap_items.new(idname=keymap['idname'], type=keymap['type'],
                          value= keymap['value'], ctrl=keymap['ctrl'],
                          shift=keymap['shift'], alt=keymap['alt'],
                          oskey=keymap['oskey'], any=keymap['any'],
                          key_modifier=keymap['key_modifier'])

for pn, p in keymap['properties'].items():
    setattr(kmi.properties, pn, p)
    
kmi.active = True
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值