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'}