¿Centralizar las actualizaciones de propiedades en una función? [duplicar]

Dec 14 2020

¿Hay alguna forma de tener más información del accesorio desde su función de actualización?

En el siguiente ejemplo, desafortunadamente, self señalará bpy.types.Scene, en lugar del prop en sí. así que a primera vista parece que no podemos tener ninguna información de los accesorios de la función de actualización, y nos vemos obligados a tener una función de actualización por accesorio, en lugar de una única función de actualización centralizada que podría funcionar con cada uno de los accesorios.

(Tenga en cuenta que podemos tener más información del conjunto , pero por supuesto, creará bucles de retroalimentación si cambiamos el valor de la propiedad ..)

por favor demuéstrame que estoy equivocado

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)

Respuestas

5 batFINGER Dec 14 2020 at 20:22

Cree una función genérica para crear su método de actualización.

Hay otra respuesta muy similar a esta por @pinkvertex no pude encontrarla.

En lugar de utilizar una función como método de actualización, cree una fábrica de métodos a la que pasar propiedades.

Código de ejemplo y ejecución de ejemplo (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)
            )
        )

Ejecución de muestra.

>>> C.scene.prop_this
1.0

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

>>> 

Dos cosas son el código de preguntas,

  • Las propiedades se asignan al tipo, no como una anotación. Utilice anotaciones en una definición de clase.

    No se puede crear una variable privada con el prefijo de subrayado.

     >>> 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 '_'