Özellik güncellemelerini tek bir işlevde merkezileştirmek mi? [çiftleme]
Güncelleme işlevinden prop hakkında daha fazla bilgi edinmenin bir yolu var mı?
Aşağıdaki örnekte maalesef self , prop yerine bpy.types.Scene'i gösterecektir. Bu yüzden ilk bakışta, güncelleme işlevinden gelen aksesuarlar hakkında herhangi bir bilgiye sahip olamayacağımız ve her bir pervane ile çalışabilecek tek bir merkezi güncelleme işlevi yerine, prop başına bir güncelleme işlevine sahip olmak zorunda olduğumuz görülüyor.
(Biz daha fazla bilgiye sahip olabilir Not seti , ama biz prop değerini değiştirirseniz elbette, geri besleme döngüleri yaratacaktır ..)
lütfen yanlış olduğumu kanıtla
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)
Yanıtlar
Güncelleme yönteminizi oluşturmak için genel bir işlev yapın.
Buna çok benzer başka bir cevap daha var @pinkvertex onu bulamadı.
Güncelleme yöntemi olarak bir işlevi kullanmak yerine, özelliklerin iletileceği bir yöntem fabrikası oluşturun.
Örnek kod ve örnek çalıştırma (oldukça açıklayıcı),
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)
)
)
Örnek çalışma.
>>> C.scene.prop_this
1.0
>>> C.scene.prop_this = 4
Update prop_this of <bpy_struct, Scene("Scene") at 0x7fc97bff8008>
>>>
Soru kodu iki şeydir,
Özellikler, açıklama olarak değil türe atanır. Bir sınıf tanımında ek açıklamalar kullanın.
Alt çizgi ile öneki özel bir değişken oluşturulamaz.
>>> 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 '_'