Re: afficher les bonnes d'ne armature dans une UIList

Posté par lucky le 2/3/2020 17:01:50
Salut Pierre-y,

C'est possible, les UIList sont faites pour ça (il faut d'abord créer une CollectionProperty, et la remplir avec les bones de l'armature. Ensuite cette CollectionProperty doit être passée en argument dans la fonction qui appelle l'UIList. Un petit exemple pratique, attention le code est pas testé, j'ai extrait rapidement des bouts de code d'un de mes addons, mais ça permet de comprendre la logique dans les grandes lignes:

Créer la collection property, dans la fonction "register" de l'addon:
bpy.types.Scene.bones_map = bpy.props.CollectionProperty(type=CustomProp)


Et une property index pour attribuer un index actif à cette liste (la rangée sélectionnée):
bpy.types.Scene.bones_map_index = bpy.props.IntProperty()



La classe CustomProp:
class CustomProp(bpy.types.PropertyGroup):
    '''name = bpy.props.StringProperty() '''



La fonction appelée pour remplir la collection property:
def _build_bones_list():
    scene = bpy.context.scene
    pose_bones = bpy.context.active_object.pose.bones

    for i in pose_bones:
        item = scene.bones_map.add()
        item.name = i.name

    scene.bones_map_index = 0



La classe UIList:
class EX_UL_items(UIList):
    def draw_item(self, context, layout, data, item, icon, active_data, active_propname, index):
        layout.prop(item, "name", text="", emboss=False, translate=False)

    def invoke(self, context, event):
        pass



Afficher l'UIList dans un Panel:
row = layout.row(align=True)
row.template_list("EX_UL_items", "", scene, "bones_map", scene, "bones_map_index", rows=1)

Cette contribution était de : http://blenderclan.tuxfamily.org/html/newbb/viewtopic.php?forum=2&topic_id=49647&post_id=581258