Memusatkan pembaruan properti dalam satu fungsi? [duplikat]

Dec 14 2020

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

5 batFINGER Dec 14 2020 at 20:22

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 '_'