Como posso imprimir a string de um parâmetro de uma propriedade?

Oct 02 2020

Digamos que eu tenha esta propriedade personalizada fu3dm_model_gender: bpy.props.EnumProperty(name="Gender", description="Choose model's gender", items= [('OP1', "Male", ""), ('OP2', "Female", "")], default='OP1')e desejo imprimir a string do parâmetro name. Como posso fazer isso?

ATUALIZAR

Na verdade, minha propriedade faz parte de uma operadora. No exemplo a seguir, gostaria de obter a string do nameparâmetro e exibi-la onde os três Xs (XXX) são:

class fu3dm_WM_OT_Model_Prefs_Operator(bpy.types.Operator):
    bl_idname = "wm.fu3dm_model_prefs"
    bl_label = "Model Preferences"
    bl_description = "..."

    fu3dm_model_gender : bpy.props.EnumProperty(name="Gender", description="Choose model's gender", items= [('OP1', "Male", ""), ('OP2', "Female", "")], default='OP1')

    def invoke(self, context, event):
        return context.window_manager.invoke_props_dialog(self)
        bpy.ops.wm.fu3dm_model_prefs('INVOKE_DEFAULT')

    def draw(self, context):

        layout = self.layout

    # BODY PREFS BOX - START
        box = layout.box()
        col = box.column()

        row = col.split()
        row.label(text=XXX)
        row.prop(self, "fu3dm_model_gender", text="")
    # BODY PREFS BOX - END

    def execute(self, context):
        pass
        return {"FINISHED"}

Respostas

4 brockmann Oct 02 2020 at 16:59

sim. Depois de registrado, você pode usar bl_rna.propertiespara acessar o nome, seu tipo, os itens, a descrição etc ... Sugiro usar o console Python para testar:

>>> test_items = [
...     ("RED", "Red", "", 1),
...     ("GREEN", "Green", "", 2),
...     ("BLUE", "Blue", "", 3),
...     ("YELLOW", "Yellow", "", 4),
... ] 

>>> bpy.types.Scene.my_enum = bpy.props.EnumProperty(name="Foo", items=test_items)
>>> bpy.types.Scene.bl_rna.properties['my_enum'].name
'Foo'
>>> bpy.types.Scene.bl_rna.properties['my_enum'].enum_items[0]
<bpy_struct, EnumPropertyItem("RED")>
>>> bpy.types.Scene.bl_rna.properties['my_enum'].enum_items[0].name
'Red'

No caso de uma propriedade de operador, sugiro ler os valores do dict de anotação de operadores:

class SimpleOperator(bpy.types.Operator):
    """Tooltip"""
    bl_idname = "object.simple_operator"
    bl_label = "Simple Object Operator"
    
    my_prop: bpy.props.StringProperty(name="foo")

    def execute(self, context):
        
        # via bl_rna
        print (self.properties.bl_rna.properties['my_prop'].name)
        
        # using annotations
        print (self.__annotations__.items())
        print (self.__annotations__['my_prop'][1]['name'])
        
        return {'FINISHED'}