Blender スクリプトにおいてクラス間で変数を共有する方法
カテゴリ:blender
グローバル変数を使う
g_var = 0 class DSKJAL_PT_UI(bpy.types.Panel): def draw(self, context): global g_var g_var = 1
プロパティを使う
プロパティのドキュメントは Property Definitions (bpy.props) を参照。
シーン等にプロパティを追加して使う
アドオンでシーン等にプロパティを追加した場合、アドオンアンロード時にプロパティを削除する必要がある。
# プロパティにアクセス class DSKJAL_PT_UI(bpy.types.Panel): def draw(self, context): context.scene.my_var = 0 # UI に配置 self.layout.prop(context.scene, 'my_var') # プロパティの生成 def register(): bpy.types.Scene.my_var = bpy.props.FloatProperty(default=0, min=0, max=1) # プロパティの削除 def unregister(): del bpy.types.Scene.my_var
プロパティグループ
プロパティが大量に必要な場合はクラスにまとめると便利だ。クラスなので register_class を使って登録する必要がある。
class MaterialSettings(bpy.types.PropertyGroup): my_int : bpy.props.IntProperty() my_float : bpy.props.FloatProperty() my_string : bpy.props.StringProperty() def register(): bpy.utils.register_class(MaterialSettings) bpy.types.Material.my_settings = bpy.props.PointerProperty(type=MaterialSettings) def unregister(): del bpy.types.Material.my_settings bpy.utils.unregister_class(MaterialSettings) # 使用例 material = bpy.data.materials[0] material.my_settings.my_int = 5 material.my_settings.my_float = 3.0 material.my_settings.my_string = "Foo"
プロパティの update コールバックメソッド
プロパティの update にメソッドを登録すれば、プロパティが更新されたときにそのメソッドが実行される。しかしそのメソッド内で再度値を更新すると無限再帰が起こる。グローバル変数や他のプロパティを使えばこれを回避できる。
g_lock = False def my_var_update(self, context): global g_lock if g_lock: return None g_lock = True context.scene.my_var += 1 g_lock = False bpy.types.Scene.my_var = bpy.props.FloatProperty(default=0, min=0, max=1, update=my_var_update)
プロパティの get/set コールバックメソッド
get/set を設定する場合、プロパティに値を保存できない。別のプロパティもしくは変数にデータを保存し、get/set を介してそのデータを操作することになる。
g_my_var def my_var_get(self): global g_my_var return g_my_var def my_var_set(self, value): global g_my_var g_my_var = value return None bpy.types.Scene.my_var = bpy.props.FloatProperty(default=0, min=0, max=1, get=my_var_get, set=my_var_set)
クラスにプロパティを追加する
オペレーターにプロパティを追加すると、オペレーターをUI に配置する際に、プロパティを介して引数を渡せる。
class DSKJAL_OT_Operator(bpy.types.Operator): bl_idname = 'dskjal.operator' my_value : bpy.props.IntProperty(default=0) def execute(self, context): print(self.my_value) # 配置 class DSKJAL_PT_UI(bpy.types.Panel): def draw(self, context): ot = self.layout.operator('dskjal.operator') ot.my_value = 1