Blenderには、ユーザから値を指定できるようにUIを提供するためのProperty系の関数があり、その中でもセレクトボックスを作成するEnumPropertyというものがあります。
この関数、選択項目を静的に設定する分には問題なかったのですが、選択項目を動的に設定する場合に少し戸惑ってしまったので、同じ問題に当たってしまっている人向けに紹介したいと思います。
選択項目を静的に設定
動的に設定する場合との比較のため、選択項目を静的に設定するサンプルコードを以下に示します。
あらかじめ作成しておいたリストをitemsに指定することで、セレクトボックスを作成しています。
static_append.py
import bpy
from by.props import *
# セレクトボックスに表示したい項目
axis = (
("X", "X-axis", ""), # (識別子, UI表示名, 説明文)
("Y", "Y-axis", ""),
("Z", "Z-axis", ""))
transform_axis = EnumProperty(
name = "Transform Axis", # 名称
description = "Transform Axis", # 説明文
items = axis) # セレクトボックスに表示したい項目リスト
選択項目を動的に設定
続いて選択項目を動的に設定するサンプルコードを以下に示します。
こちらでは、itemに項目リストを作成する関数を指定しています。
項目リストを作成する関数内で設定したい項目を設定し、作成した項目リストを関数の戻り値として返しています。
変数object_listが参照される度にitemsに指定した関数が呼ばれるため、選択項目を動的に設定することができます。
dynamic_append.py
import bpy
from bpy.props import *
# セレクトボックスに表示したい項目リストを作成する関数
def get_object_list_callback(scene, context):
items = []
# itemsに項目を追加する処理...
return items
object_list = EnumProperty(
name = "Object List", # 名称
description = "Object List", # 説明文
items = get_object_list_callback) # 項目リストを作成する関数