Blenderアドオンで使えるキーマップの登録と、登録したキーマップをメニューに表示する方法を紹介する。
もくじ
ダウンロード
上記からサンプルアドオンをダウンロードできる。
キーマップのメニュー(悪い例)
import rna_keymap_ui layout = self.layout box = layout.box() col = box.column() col.label(text="Keymap List:",icon="KEYINGSET") wm = bpy.context.window_manager kc = wm.keyconfigs.user for km, kmi in addon_keymaps: col.label(text=km.name,icon="DOT") col.context_pointer_set("keymap", km) rna_keymap_ui.draw_kmi([], kc, km, kmi, col, 0) col.separator()
キーマップリストをそのままメニュー表示した例。
これでも登録されるキーを表示することはできる。
しかし、単なるリストを表示しているだけなので、このメニューでBlenderに登録されたキーマップを変更することはできない。
また、カテゴリが重複表示されてしまっていて見にくい。
キーマップのメニュー(改善後)
import rna_keymap_ui layout = self.layout wm = bpy.context.window_manager kc = wm.keyconfigs.user old_km_name = "" old_id_l = [] for km_add, kmi_add in addon_keymaps: km = kc.keymaps[km_add.name] for kmi_con in km.keymap_items: if kmi_add.idname == kmi_con.idname: if not kmi_con.id in old_id_l: kmi = kmi_con old_id_l.append(kmi_con.id) break if kmi: if not km.name == old_km_name: col.label(text=km.name,icon="DOT") col.context_pointer_set("keymap", km) rna_keymap_ui.draw_kmi([], kc, km, kmi, col, 0) col.separator() old_km_name = km.name kmi = None
前項の問題点を改善したキーマップメニューを紹介する。
- addon_keymapsというキーマップリストをfor文で回す
- Blenderのキーマップ内(km.keymap_items)から、キーマップリストのアイテムと同じidnameを探し出して、キーアイテム(kmi)を決定する
- これだけだと、違うキーマップやプロパティを持つアイテムが複数存在する場合に、正常に表示することができない(最初のものだけが何度も表示される)
- old_id_lにキーアイテムの固有idを保存しておき、1度表示したものは弾くようにする
- old_km_nameに直前のカテゴリ名(km)を保存しておき、今のカテゴリ名と重複しているなら表示しないようにする
- キーアイテム(kmi)をrna_keymap_ui~でメニュー表示する
キーの登録
例:3Dビューに、「モンキープリミティブの追加」のキーマップを追加
addon_keymaps = [] def add_hotkey(): wm = bpy.context.window_manager kc = wm.keyconfigs.addon if kc: km = wm.keyconfigs.addon.keymaps.new(name = '3D View', space_type = 'VIEW_3D') kmi = km.keymap_items.new("mesh.primitive_monkey_add", 'Y', 'PRESS', alt=True) addon_keymaps.append((km, kmi))
3DビューのAlt + Y に、モンキープリミティブを追加のキーマップを追加する。
- addon_keymapsというリストに、キーマップを追加する
- if kc で、まずキーコンフィグにアドオンを入れる場所があるか確認する
- これがないと、BlenderをGUIなしで起動した時にエラーが出る
- コマンドラインレンダリングしたときなど
例:プロパティの追加
km = wm.keyconfigs.addon.keymaps.new(name = '3D View', space_type = 'VIEW_3D') kmi = km.keymap_items.new("mesh.primitive_monkey_add", 'Y', 'PRESS', alt=True, shift=True) kmi.properties.align='VIEW' addon_keymaps.append((km, kmi))
- オペレーターのプロパティを設定したい場合は、kmi.propertiesからアクセスできる
- 例では、Alt + Shift + Y に、整列をビュー基準にするプロパティを追加する
例:メッシュ編集モードに、「モンキープリミティブの追加」を追加(Y45度回転)
km = wm.keyconfigs.addon.keymaps.new(name = 'Mesh') kmi = km.keymap_items.new("mesh.primitive_monkey_add", 'U', 'PRESS', alt=True, shift=True) kmi.properties.rotation=(0, 0.785398, 0) addon_keymaps.append((km, kmi))
キーの登録解除
def remove_hotkey(): for km, kmi in addon_keymaps: km.keymap_items.remove(kmi) addon_keymaps.clear()
- 作成したキーマップリストには、追加場所とキーアイテムが保存されている
- for文でキーマップリストを回して、追加場所にあるキーアイテムを削除する
- addon_keymaps.clear()で、キーマップリスト自体を削除する