はじめてのBlenderアドオン開発
Last Update: 2023.3.1
Blender 2.7
はじめてのBlenderアドオン開発
Blender 2.7
Last Update: 2023.3.1
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
事前に実行した処理に対して、ユーザがツール・シェルフのオプションから細かい制御ができるようにするための方法を紹介しました。本節では浮動小数点数の値を指定するオプションを紹介しましたが、他にも整数やブーリアンなどの異なる型もオプションとして利用できます。
execute
メソッドが実行される