広告
広告

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

関連記事

RNA プロパティと ID プロパティとの違い

Blender 記事の目次


広告
広告