忍者ブログ

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

prop_searchの使い方

prop_searchによるドロップダウンUIの作成方法をまとめてみました。
普段目にするオブジェクトを選択するときに使うコントロールです。

row.prop_search(tps, "sel_obj", context.scene, "objects", text="Objects")
基本的にはCollectionPropertyと選択しているオブジェクトの名前を格納するプロパティを指定します。
上記例では、context.scene.objectsがCollectionなので、そのままプロパティとして渡すことができます。

必要があれば、自分で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()
PR

Comment

お名前
タイトル
E-MAIL
URL
コメント
パスワード

Copyright © blender-scriptメモ : All rights reserved

TemplateDesign by KARMA7

忍者ブログ [PR]

管理人限定

プロフィール

HN:
ののき
性別:
非公開
職業:
プログラマ
自己紹介:
どこかのCGプロダクションでツール開発などをやっております。
Blenderはよい実験台です。

P R