忘却まとめ

Blenderの中級者・上級者向けの踏み込んだ情報や、アドオン・3DCGに関する情報を記事にします

キーマップの登録・キーマップメニューの表示【Blender / アドオン / Python】

Python

投稿日:

Blenderアドオンで使えるキーマップの登録と、登録したキーマップをメニューに表示する方法を紹介する。

ダウンロード

gumroad

BOOTH

上記からサンプルアドオンをダウンロードできる。

キーマップのメニュー(悪い例)

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

前項の問題点を改善したキーマップメニューを紹介する。

  1. addon_keymapsというキーマップリストをfor文で回す
  2. Blenderのキーマップ内(km.keymap_items)から、キーマップリストのアイテムと同じidnameを探し出して、キーアイテム(kmi)を決定する
    1. これだけだと、違うキーマップやプロパティを持つアイテムが複数存在する場合に、正常に表示することができない(最初のものだけが何度も表示される)
  3. old_id_lにキーアイテムの固有idを保存しておき、1度表示したものは弾くようにする
  4. old_km_nameに直前のカテゴリ名(km)を保存しておき、今のカテゴリ名と重複しているなら表示しないようにする
  5. キーアイテム(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()で、キーマップリスト自体を削除する

アドオンの制作依頼はこちら

-Python

Copyright© 忘却まとめ , 2020 All Rights Reserved Powered by STINGER.