【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