Memusatkan pembaruan properti dalam satu fungsi? [duplikat]
Apakah ada cara untuk mendapatkan lebih banyak informasi tentang prop dari fungsi pembaruannya?
Dalam contoh di bawah ini, sayangnya, self akan menunjuk ke bpy.types.Scene, bukan prop itu sendiri. jadi pada pandangan pertama kami tidak dapat memiliki informasi tentang alat peraga dari fungsi pembaruan, dan kami dipaksa untuk memiliki satu fungsi pembaruan per prop, alih-alih satu fungsi pembaruan terpusat yang dapat bekerja dengan semua prop
(Perhatikan bahwa kita dapat memiliki lebih banyak informasi dari set , tetapi tentu saja, itu akan membuat loop umpan balik jika kita mengubah nilai prop ..)
tolong buktikan saya salah
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)
Jawaban
Buat fungsi umum untuk membuat metode pembaruan Anda.
Ada jawaban lain yang sangat mirip dengan ini oleh @pinkvertex tidak dapat menemukannya.
Alih-alih menggunakan satu fungsi sebagai metode pembaruan, buat pabrik metode untuk meneruskan properti.
Contoh kode, dan contoh run (cukup jelas),
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)
)
)
Contoh dijalankan.
>>> C.scene.prop_this
1.0
>>> C.scene.prop_this = 4
Update prop_this of <bpy_struct, Scene("Scene") at 0x7fc97bff8008>
>>>
Dua hal tentang kode pertanyaan,
Properti ditetapkan ke jenisnya, bukan sebagai anotasi. Gunakan anotasi dalam definisi kelas.
Tidak dapat membuat variabel pribadi yang diawali dengan garis bawah.
>>> 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 '_'