Centralizando atualizações de propriedades em uma função? [duplicado]

Dec 14 2020

Existe alguma maneira de obter mais informações do prop a partir de sua função de atualização?

No exemplo abaixo, infelizmente, self irá apontar para bpy.types.Scene, em vez do próprio prop. então parece à primeira vista que não podemos ter nenhuma informação dos props da função de atualização, e somos forçados a ter uma função de atualização por prop, em vez de uma única função de atualização centralizada que poderia funcionar com cada um dos prop

(Observe que podemos ter mais informações do conjunto , mas é claro, ele criará ciclos de feedback se alterarmos o valor da proposta ..)

por favor me prove que estou errado

def update(self,context):
    print("what is this prop value?")
    print("what is this prop api?")
    print("what is this prop name?")
    return None 

bpy.types.Scene._prop          : bpy.props.FloatProperty(default=1.0 , name="Prop", update=update)
bpy.types.Scene._prop_this     : bpy.props.FloatProperty(default=1.1 , name="Prop This", update=update)
bpy.types.Scene._prop_that     : bpy.props.FloatProperty(default=1.2 , name="Prop That", update=update)
bpy.types.Scene._prop_another  : bpy.props.FloatProperty(default=1.3 , name="Prop Another", update=update)

Respostas

5 batFINGER Dec 14 2020 at 20:22

Faça uma função genérica para criar seu método de atualização.

Existe outra resposta muito semelhante a esta por @pinkvertex não conseguiu encontrá-la.

Em vez de usar uma função como método de atualização, crie uma fábrica de métodos para passar as propriedades.

Código de exemplo e execução de exemplo (bastante autoexplicativo),

import bpy
from bpy.props import FloatProperty
from bpy.types import Scene


def update(prop):
    def update(self, context):
        print(f"Update {prop} of {self}")
        return None
    return update


for prop in ("prop_this", "prop_that", "prop_another"):
    setattr(
        Scene, 
        prop,
        FloatProperty(
            default=1.0,
            name="Prop", 
            update=update(prop)
            )
        )

Execução de amostra.

>>> C.scene.prop_this
1.0

>>> C.scene.prop_this = 4
Update prop_this of <bpy_struct, Scene("Scene") at 0x7fc97bff8008>

>>> 

Duas coisas são o código da pergunta,

  • As propriedades são atribuídas ao tipo, não como uma anotação. Use anotações em uma definição de classe.

    Não é possível criar uma variável privada prefixada com sublinhado.

     >>> bpy.types.Scene._prop = bpy.props.FloatProperty()
     Traceback (most recent call last):
     File "<blender_console>", line 1, in <module>
     ValueError: bpy_struct "Scene" registration error: _prop could not register because the property starts with an '_'