Centralizacja aktualizacji właściwości w jednej funkcji? [duplikować]

Dec 14 2020

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

5 batFINGER Dec 14 2020 at 20:22

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