はじめてのBlenderアドオン開発 (Blender 2.7版)

Last Update: 2019.4.2

2-3. ツール・シェルフのオプションを活用する①

ここまでの説明で、アドオンの開発の仕方が何となくわかってきたのではないかと思います。 本節では前節のサンプルを改良し、拡大率をツール・シェルフから変更できるようにします。

作成するアドオンの仕様

ツール・シェルフとは?

[3Dビュー] エリアの左端のツール群をツール・シェルフと呼び、[T] キーにより表示/非表示を切り替えることができます。

Blenderでは何かしら操作を行う度に、直前の操作に対するパラメータ設定のためのUI(本書ではオプションと呼びます)がツール・シェルフの下側に表示されます。 直前に行った操作に対し、パラメータを調節して再度操作を実行 する時に使用します。

今回作成するアドオンでは、ツール・シェルフから拡大率や縮小率を指定できるようにします。

アドオンを作成する

1-5節 を参考にして以下のソースコードを入力し、ファイル名 sample_2_3.py で保存します。

import bpy
from bpy.props import FloatProperty


bl_info = {
    "name": "サンプル2-3: オブジェクトを拡大・縮小するアドオン(拡大率/縮小率 任意指定版)",
    "author": "Nutti",
    "version": (2, 0),
    "blender": (2, 75, 0),
    "location": "3Dビュー > オブジェクト",
    "description": "オブジェクトを拡大・縮小するサンプルアドオン(拡大率/縮小率を任意に指定可能)",
    "warning": "",
    "support": "TESTING",
    "wiki_url": "",
    "tracker_url": "",
    "category": "Object"
}


# オブジェクトを拡大するオペレーション
class EnlargeObject2(bpy.types.Operator):

    bl_idname = "object.enlarge_object_2"
    bl_label = "選択オブジェクトの拡大(拡大率任意指定)"
    bl_description = "選択中のオブジェクトを拡大します(拡大率任意指定可能)"
    bl_options = {'REGISTER', 'UNDO'}

    magnification = FloatProperty(
        name="拡大率",
        description="拡大率を設定します",
        default=2.0,
        min=1.0,
        max=10.0
    )

    def execute(self, context):
        active_obj = context.active_object
        active_obj.scale = active_obj.scale * self.magnification
        self.report(
            {'INFO'},
            "サンプル2-3: 「%s」を%f倍に拡大しました。"
            % (active_obj.name, self.magnification)
        )
        print("サンプル2-3: オペレーション「%s」が実行されました。" % (self.bl_idname))

        return {'FINISHED'}


# オブジェクトを縮小するオペレーション
class ReduceObject2(bpy.types.Operator):

    bl_idname = "object.reduce_object_2"
    bl_label = "選択オブジェクトの縮小(縮小率任意指定)"
    bl_description = "選択中のオブジェクトを縮小します(縮小率任意指定可能)"
    bl_options = {'REGISTER', 'UNDO'}

    reduction = FloatProperty(
        name="縮小率",
        description="縮小率を設定します",
        default=0.5,
        min=0.001,
        max=1.0
    )

    def execute(self, context):
        active_obj = context.active_object
        active_obj.scale = active_obj.scale * self.reduction
        self.report(
            {'INFO'},
            "サンプル2-3: 「%s」を%f倍に縮小しました。"
            % (active_obj.name, self.reduction)
        )
        print("サンプル2-3: オペレーション「%s」が実行されました。" % (self.bl_idname))

        return {'FINISHED'}


def menu_fn(self, context):
    self.layout.separator()
    self.layout.operator(EnlargeObject2.bl_idname)
    self.layout.operator(ReduceObject2.bl_idname)


def register():
    bpy.utils.register_module(__name__)
    bpy.types.VIEW3D_MT_object.append(menu_fn)
    print("サンプル2-3: アドオン「サンプル2-3」が有効化されました。")


def unregister():
    bpy.types.VIEW3D_MT_object.remove(menu_fn)
    bpy.utils.unregister_module(__name__)
    print("サンプル2-3: アドオン「サンプル2-3」が無効化されました。")


if __name__ == "__main__":
    register()

アドオンを使用する

アドオンを有効化する

1-5節 を参考にして、作成したアドオンを有効化します。

アドオンを有効化すると、コンソールウィンドウに以下の文字列が出力されます。

サンプル2-3: アドオン「サンプル2-3」が有効化されました。

[3Dビュー] のエリアのメニューに [オブジェクト] > [選択オブジェクトの拡大(拡大率任意指定)] と [オブジェクト] > [選択オブジェクトの縮小(縮小率任意指定)] が追加されていることを確認します。

アドオンの機能を使用する

以下の手順に従い、作成したアドオンの機能を使います。

1 Blender起動直後に生成されるオブジェクト [Cube] を選択します
2 [3Dビュー] エリアのメニューである、[オブジェクト] > [選択オブジェクトの拡大(拡大率任意指定)] を実行すると、選択したオブジェクト [Cube] のサイズが2倍に拡大されます。この状態でツール・シェルフの下側を見てみましょう。[選択オブジェクトの拡大(拡大率任意指定)] のラベルの下に [拡大率] というオプションが追加され、数値を入力できるようになっています。
3 [拡大率] の数値を好きな値に変更します。指定した拡大率の値に応じて、オブジェクトの拡大率が変わります。また、数値変更の度に拡大したことを示すメッセージがスクリプト実行ログに表示されます。
4 [3Dビュー] エリアのメニューである、[オブジェクト] > [選択オブジェクトの縮小(縮小率任意指定)] を実行すると、ツール・シェルフの選択オブジェクトの縮小(縮小率任意指定)ラベルの下に、[縮小率] というオプションが追加されます。
5 [縮小率] の数値を変更することで、オブジェクトの縮小率を変えることができます。

アドオンを無効化する

1-5節 を参考に、有効化したアドオンを無効化します。

アドオンが無効化されると、コンソールウィンドウに以下の文字列が出力されます。

サンプル2-3: アドオン「サンプル2-3」が無効化されました。

ソースコードの解説

作成したアドオンのソースコードを解説します。

オプションの作成

ツール・シェルフのオプションから直前に行った処理のパラメータを調整して再実行できるようにするためには、bpy.props に定義されている プロパティクラスをオペレータクラスのメンバに追加 します。

プロパティクラスにはツール・シェルフのオプションを作成する以外の用途もありますが、オプション作成時に利用するクラスは以下の通りです。

クラス名
IntProperty 整数
IntVectorProperty 整数(グループ)
FloatProperty 浮動小数点
FloatVectorProperty 浮動小数点(グループ)
StringProperty 文字列
BoolProperty ブーリアンBlender上ではセレクトボックスのUIとなる
BoolVectorProperty ブーリアン(グループ)
EnumProperty 列挙Blender上ではリストボックスのUIとなる

プロパティクラス作成時に引数を指定することで、ユーザがクラスの設定を決めることができます。 以下に代表的な引数を示しますが、クラスによって指定可能な引数が異なるため注意が必要です。

引数 値の説明
name ツール・シェルフに表示されるオプション名
description オプションの説明文
default オプションのデフォルト値
max オプションに指定できる最大値
min オプションに指定できる最小値

今回は以下のように、FloatPropery クラスを用いて拡大率と縮小率を指定できるようにします。

    magnification = FloatProperty(
        name="拡大率",
        description="拡大率を設定します",
        default=2.0,
        min=1.0,
        max=10.0
    )
    reduction = FloatProperty(
        name="縮小率",
        description="縮小率を設定します",
        default=0.5,
        min=0.001,
        max=1.0
    )

次に、[オブジェクト] > [選択オブジェクトの拡大(拡大率任意指定)] を実行した時の処理について解説します。

引数 name はオプションの名称で、本節のサンプルでは "拡大率" を指定しています。 引数 description はオプションをマウスオーバーした時に表示される説明文を指定します。 引数 default には 2.0 が指定されているため、デフォルトの拡大率は2.0倍となります。 また拡大率は、引数 max に指定した 10.0 倍、引数 min に指定した 1.0 倍の間で変化させることができます。

オプションの値を変更すると、オペレータクラスの execute メソッドが実行されます。

本節のサンプルのように値を連続的に変更可能なオプションを作成した場合、値が変更される度に execute メソッドが呼ばれます。 execute メソッドの処理が重い場合は値の変更だけで時間がかかってしまうため、ユーザがオプションによるパラメータ調整をできるようにしたい場合は、execute メソッドの処理を可能な限り軽くするようにしましょう。

execute メソッドの中で指定されたオプションの値は、以下のように通常のクラス変数と同様、self変数からアクセスすることで取得します。

        active_obj.scale = active_obj.scale * self.reduction

まとめ

事前に実行した処理に対して、ユーザがツール・シェルフのオプションから細かい制御ができるようにするための方法を紹介しました。本節では浮動小数点数の値を指定するオプションを紹介しましたが、他にも整数やブーリアンなどの異なる型もオプションとして利用できます。

ポイント