忘却まとめ

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

modalで数字キー入力により値を設定する方法【Blender Python】

Python

投稿日:

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

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

-Python

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