Blenderの基本機能のトランスフォームのようなmodalでは、数字や記号入力で値の指定や四則演算ができるようになっている。これを自作のmodalでも再現する方法を紹介する。
コード
数字・四則演算のキーが押されたら、対応する整数・記号をself.num_str文字列プロパティに追加していく。
self.num_str に値がある場合のみ、その文字列をeval()によって計算して、メインに数値を利用する方のプロパティself.valueに代入する。
def invoke(self, context,event):
self.value = 1
self.num_str = ""
return {'RUNNING_MODAL'}
def modal(self, context, event):
if event.type in {"ZERO","NUMPAD_0"} and event.value == 'PRESS':
self.num_str += "0"
elif event.type in {"ONE","NUMPAD_1"} and event.value == 'PRESS':
self.num_str += "1"
elif event.type in {"TWO","NUMPAD_2"} and event.value == 'PRESS':
self.num_str += "2"
elif event.type in {"THREE","NUMPAD_3"} and event.value == 'PRESS':
self.num_str += "3"
elif event.type in {"FOUR","NUMPAD_4"} and event.value == 'PRESS':
self.num_str += "4"
elif event.type in {"FIVE","NUMPAD_5"} and event.value == 'PRESS':
self.num_str += "5"
elif event.type in {"SIX","NUMPAD_6"} and event.value == 'PRESS':
self.num_str += "6"
elif event.type in {"SEVEN","NUMPAD_7"} and event.value == 'PRESS':
self.num_str += "7"
elif event.type in {"EIGHT","NUMPAD_8"} and event.value == 'PRESS':
self.num_str += "8"
elif event.type in {"NINE","NUMPAD_9"} and event.value == 'PRESS':
self.num_str += "9"
elif event.type in {"PERIOD","NUMPAD_PERIOD"} and event.value == 'PRESS':
self.num_str += "."
elif event.type in {"MINUS","NUMPAD_MINUS"} and event.value == 'PRESS':
self.num_str += '-'
elif event.type in {"EQUAL","PLUS","NUMPAD_PLUS"} and event.value == 'PRESS':
self.num_str += '+'
elif event.type in {"SLASH","NUMPAD_SLASH"} and event.value == 'PRESS':
self.num_str += '/'
elif event.type in {"SEMI_COLON","ASTERIX","NUMPAD_ASTERIX"} and event.value == 'PRESS':
self.num_str += '*'
elif event.type in {"BACK_SPACE","NUMPAD_BACK_SPACE"} and event.value == 'PRESS':
if self.num_str:
self.num_str = self.num_str[:-1] # 後ろ1文字を削除
if self.num_str:
try:
self.value = float(eval(self.num_str)) # evalで数式として実行する
except SyntaxError: pass # 数式エラーの例外処理
except ValueError: pass # 数値がおかしい場合(記号だけなど)の例外処理
print(self.value)
return {'RUNNING_MODAL'}