Centralizacja aktualizacji właściwości w jednej funkcji? [duplikować]
Czy jest jakiś sposób, aby uzyskać więcej informacji o rekwizycie z jego funkcji aktualizacji?
W poniższym przykładzie, niestety, self wskaże bpy.types.Scene zamiast samego elementu. więc na pierwszy rzut oka wydaje się, że nie możemy mieć żadnych informacji o właściwościach z funkcji aktualizacji i jesteśmy zmuszeni mieć jedną funkcję aktualizacji na właściwość , zamiast jednej scentralizowanej funkcji aktualizacji, która mogłaby działać z każdym rekwizytem
(Zauważ, że możemy mieć więcej informacji z zestawu , ale oczywiście utworzy to pętle sprzężenia zwrotnego, jeśli zmienimy wartość właściwości.)
proszę udowodnij mi, że się mylę
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)
Odpowiedzi
Utwórz ogólną funkcję, aby utworzyć metodę aktualizacji.
Jest inna odpowiedź bardzo podobna do tej, której @pinkvertex nie mógł znaleźć.
Zamiast używać jednej funkcji jako metody aktualizacji, utwórz fabrykę metod, do której zostaną przekazane właściwości.
Przykładowy kod i przykładowe uruchomienie (dość oczywiste),
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)
)
)
Próbny przebieg.
>>> C.scene.prop_this
1.0
>>> C.scene.prop_this = 4
Update prop_this of <bpy_struct, Scene("Scene") at 0x7fc97bff8008>
>>>
Dwie rzeczy to kod zapytania,
Właściwości są przypisywane do typu, a nie jako adnotacja. Użyj adnotacji w definicji klasy.
Nie można utworzyć zmiennej prywatnej poprzedzonej podkreśleniem.
>>> 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 '_'