¿Centralizar las actualizaciones de propiedades en una función? [duplicar]
¿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
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 '_'