アストラルプリズム

PC、スマホ、ゲームなどの備忘録と日記

Blender python アドオン使用時の数値入力欄の作り方(オペレータプロパティの使い方)

↓自作アドオンを使うときにこういうのを表示したい
オペレータプロパティという名前だそうですね。
f:id:katsumi3:20200224133556p:plain

使う方法

チェックボックスなど使う入力欄の種類ごとにインポートが必要
・下のアドオン基本構造の「ここからここまで」のところに使用する入力欄の設定を書く
・入力した値はself.~という名前にする

入力欄とインポートするもの

数値入力欄→FloatProperty
チェックボックス→BoolProperty
セレクトボックス→ EnumProperty

↓公式のその他のプロパティ定義の詳しい解説(正直よくわからん)
docs.blender.org

例:アドオンの基本構造

import bpy
#オペレータプロパティに数値を入力するためのFloatPropertyをインポートする
from bpy.props import FloatProperty
#アドオンを登録する際の内容
bl_info = {
    "name": "waku",
    "author": "勝己(kastumi)",
    "version": (1, 0),
    "blender": (2, 80, 0),
    "location": "3Dビューポート > 追加 > メッシュ",
    "description": "枠を付けるアドオン",
    "warning": "",
    "support": "TESTING",
    "wiki_url": "",
    "tracker_url": "",
    "category": "Object"
}


class WAKU_OT_CreateObject(bpy.types.Operator):
    bl_idname = "object.waku_create_object"
    bl_label = "枠"
    bl_description = "枠を付けます"
    bl_options = {'REGISTER', 'UNDO'}
 #####ここから###################
    #アドオンを実行したときにオペレータプロパティで数値を入力させる
    v_width: FloatProperty(
        name = "縦の枠の幅",
        description = "幅を設定します",
        default = 8.0,
     )
 #####ここまで###################
 #実際に実行される内容
    def execute(self, context):
  #ココにアドオンで実行したい内容を書く
  #オペレータプロパティで入力した値はself.~になる
       #例:width = self.v_width
        return {'FINISHED'}

#設定したアドオン実行の為の設定を実行させる
def menu_fn(self, context):
    self.layout.separator()
    self.layout.operator(WAKU_OT_CreateObject.bl_idname)

# Blenderに登録するクラス
# pythonで呼び出すときに使う名前なので他とかぶらないようにする
classes = [
    WAKU_OT_CreateObject,
]

# アドオン有効化時の処理
def register():
    for c in classes:
        bpy.utils.register_class(c)
    bpy.types.VIEW3D_MT_mesh_add.append(menu_fn)
    print("waku: アドオン『waku』が有効化されました。")

# アドオン無効化時の処理
def unregister():
    bpy.types.VIEW3D_MT_mesh_add.remove(menu_fn)
    for c in classes:
        bpy.utils.unregister_class(c)
    print("waku: アドオン『waku』が無効化されました。")

# メイン処理
if __name__ == "__main__":
    register()

セレクトボックスを設置する場合の注意

f:id:katsumi3:20200224195933p:plain
セレクトボックスで何かを選んだときに入力される値(ここでは1,2,3)は数字ではなく必ず文字でないとエラーになる

import bpy
from bpy.props import EnumProperty

(省略)

class WAKU_OT_CreateObject(bpy.types.Operator):
 (省略)
    waku_type: EnumProperty(
        name="枠の形状",
        description="移動軸を設定します",
        default='1',
        items=[
            ('1', "梯子", "梯子風にします"),
            ('2', "風車", "風車風にします"),
            ('3', "額縁", "額縁風にします"),
        ]
    )
 def execute(self, context):
      if self.waku_type=="1":
           a=125
     (省略)