prop_searchによるドロップダウンUIの作成方法をまとめてみました。
普段目にするオブジェクトを選択するときに使うコントロールです。
row.prop_search(tps, "sel_obj", context.scene, "objects", text="Objects")基本的にはCollectionPropertyと選択しているオブジェクトの名前を格納するプロパティを指定します。
class StringValGroup(bpy.types.PropertyGroup):
string_val = bpy.props.StringProperty()
class TestPropSearchProps(bpy.types.PropertyGroup):
string_val_list = bpy.props.CollectionProperty(type=bpy.types.StringValGroup)
PropertyGroupにいろいろな情報を持たせていけばいろいろ便利なことができそうです。# -*- coding: utf-8 -*-
import bmesh
import bpy
from bpy_extras import view3d_utils
class StringValGroup(bpy.types.PropertyGroup):
string_val = bpy.props.StringProperty()
bpy.utils.register_class(StringValGroup)
#-----------------------------
class TestPropSearchProps(bpy.types.PropertyGroup):
# リストで選択されているオブジェクトの名前
sel_obj = bpy.props.StringProperty()
# Drop Downリストに表示される値のリスト
string_val_list = bpy.props.CollectionProperty(type=bpy.types.StringValGroup)
# 選択されている値が格納されるプロパティ
sel_string = bpy.props.StringProperty()
sel_string_val = bpy.props.StringProperty()
def init_val_list(self):
self.string_val_list.clear()
for i in range(10):
v = self.string_val_list.add()
v.string_val = "val" + str( i )
v.name = "name" + str(i)
def update_val(self, nm):
for sv in self.string_val_list:
if sv.name == nm:
self.sel_string_val = sv.string_val
class TestPropSearchPanel(bpy.types.Panel):
bl_label = "TestPropSearch"
bl_idname = "OBJECT_PT_rename"
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_description = "Rename Tools"
bl_context = "object"
def draw(self, context):
tps = context.window_manager.test_prop_search
layout = self.layout
row = layout.row()
row.prop_search(tps, "sel_obj", context.scene, "objects", text="Objects")
row = layout.row()
row.prop(tps, "sel_obj")
tps.init_val_list()
row = layout.row()
row.prop_search(tps, "sel_string", tps, "string_val_list", text="Test")
row = layout.row()
row.prop(tps, "sel_string")
tps.update_val(tps.sel_string)
row.prop(tps, "sel_string_val")
def register():
bpy.utils.register_class(TestPropSearchProps)
bpy.utils.register_class(TestPropSearchPanel)
bpy.types.WindowManager.test_prop_search = bpy.props.PointerProperty(\
type = TestPropSearchProps)
def unregister():
bpy.utils.unregister_class(StringValGroup)
bpy.utils.unregister_class(TestPropSearchProps)
bpy.utils.unregister_class(TestPropSearchPanel)
if __name__ == "__main__":
register()