Centralisation des mises à jour des propriétés dans une seule fonction? [dupliquer]

Dec 14 2020

Y a-t-il un moyen d'avoir plus d'informations sur l'accessoire à partir de sa fonction de mise à jour?

Dans l'exemple ci-dessous, malheureusement, self indiquera bpy.types.Scene, au lieu de l'accessoire lui-même. il semble donc à première vue que nous ne pouvons pas avoir d'informations sur les accessoires de la fonction de mise à jour, et nous sommes obligés d'avoir une fonction de mise à jour par accessoire, au lieu d'une seule fonction de mise à jour centralisée qui pourrait fonctionner avec chaque accessoire.

(Notez que nous pouvons avoir plus d'informations à partir de set , mais bien sûr, cela créera des boucles de rétroaction si nous changeons la valeur de prop ..)

s'il te plaît prouve moi que j'ai tort

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)

Réponses

5 batFINGER Dec 14 2020 at 20:22

Créez une fonction générique pour créer votre méthode de mise à jour.

Il y a une autre réponse très similaire à celle-ci par @pinkvertex n'a pas pu la trouver.

Au lieu d'utiliser une fonction comme méthode de mise à jour, créez une fabrique de méthodes à laquelle transmettre les propriétés.

Exemple de code et exemple d'exécution (assez explicite),

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)
            )
        )

Échantillon de course.

>>> C.scene.prop_this
1.0

>>> C.scene.prop_this = 4
Update prop_this of <bpy_struct, Scene("Scene") at 0x7fc97bff8008>

>>> 

Deux choses concernant le code de la question,

  • Les propriétés sont affectées au type et non en tant qu'annotation. Utilisez des annotations dans une définition de classe.

    Impossible de créer une variable privée préfixée par un trait de soulignement.

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