Aktualisierungen von Eigenschaften in einer Funktion zentralisieren? [Duplikat]
Gibt es eine Möglichkeit, weitere Informationen über die Requisite aus ihrer Update-Funktion zu erhalten?
Im folgenden Beispiel wird self leider auf bpy.types.Scene anstatt auf die Requisite selbst verweisen. Auf den ersten Blick scheinen wir also keine Informationen über die Requisiten aus der Update-Funktion zu haben, und wir sind gezwungen, eine Update-Funktion pro Requisite anstelle einer einzelnen zentralisierten Update-Funktion zu haben, die mit jeder Requisite funktionieren könnte
(Beachten Sie, dass wir mehr Informationen aus dem Set haben können , aber natürlich werden Rückkopplungsschleifen erzeugt, wenn wir den Prop-Wert ändern.)
Bitte beweise mir das Gegenteil
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)
Antworten
Erstellen Sie eine generische Funktion, um Ihre Aktualisierungsmethode zu erstellen.
Es gibt eine andere Antwort, die dieser sehr ähnlich ist, von @pinkvertex konnte sie nicht finden.
Erstellen Sie stattdessen eine Methodenfactory, an die Eigenschaften übergeben werden, indem Sie eine Funktion als Aktualisierungsmethode verwenden.
Beispielcode und Beispiellauf (ziemlich selbsterklärend),
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)
)
)
Probelauf.
>>> C.scene.prop_this
1.0
>>> C.scene.prop_this = 4
Update prop_this of <bpy_struct, Scene("Scene") at 0x7fc97bff8008>
>>>
Zwei Dinge sind Fragencode,
Die Eigenschaften werden dem Typ zugewiesen, nicht als Anmerkung. Verwenden Sie Anmerkungen in einer Klassendefinition.
Es kann keine private Variable mit dem Unterstrich vorangestellt werden.
>>> 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 '_'