एक फ़ंक्शन में केंद्रीयकरण गुण अपडेट? [डुप्लिकेट]

Dec 14 2020

वहाँ किसी भी तरह से यह अद्यतन समारोह से प्रोप की कुछ और जानकारी है?

नीचे दिए गए उदाहरण में, दुर्भाग्य से, स्व bpy.types.Scene को इंगित करेगा, बजाय स्वयं के प्रोप के। इसलिए यह पहली नज़र में लगता है कि हमें अपडेट फ़ंक्शन से प्रॉपर की कोई भी जानकारी नहीं हो सकती है, और हमें एक केंद्रीय अद्यतन अपडेट फ़ंक्शन के बजाय प्रति प्रोपेल प्रति एक अपडेट फ़ंक्शन के लिए मजबूर किया जाता है जो हर एक प्रोप के साथ काम कर सकता है।

(ध्यान दें कि हमारे पास सेट से अधिक जानकारी हो सकती है , लेकिन निश्चित रूप से, यह फीडबैक लूप बनाएगा यदि हम प्रोप वैल्यू को बदलते हैं ..)

कृपया मुझे गलत साबित करें

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)

जवाब

5 batFINGER Dec 14 2020 at 20:22

अपनी अद्यतन विधि बनाने के लिए एक सामान्य कार्य करें।

@Pinkvertex द्वारा इसे खोजने के लिए बहुत ही समान एक और जवाब है।

अद्यतन विधि के रूप में एक फ़ंक्शन का उपयोग करने के बजाय, गुणों को पास करने के लिए एक विधि कारखाना बनाएं।

उदाहरण कोड, और उदाहरण रन (सुंदर आत्म-व्याख्यात्मक),

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

नमूना चला।

>>> C.scene.prop_this
1.0

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

>>> 

दो बातें फिर से सवाल कोड,

  • गुण प्रकार को असाइन किए जाते हैं, एनोटेशन के रूप में नहीं। वर्ग परिभाषा में एनोटेशन का उपयोग करें।

    अंडरस्कोर के साथ पूर्वनिर्मित एक निजी चर नहीं बना सकता।

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