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()
BlenderのPythonスクリプトに関する情報をメインにまとめていきます。
調べながら、試行錯誤しながらですので、拙い部分があるとは思いますが、
よろしくお願いします。