कैसे * कुशलता से * एक दृश्य के भीतर सभी रोशनी मिल जाए?

Nov 26 2020

मैं सभी दृश्यों के साथ एक कस्टम UI सूची भरना चाहता हूं जो वर्तमान दृश्य में हैं, लेकिन ऐसा करने के लिए सबसे अच्छा तरीका अनिश्चित है। हम चीजों को फ़िल्टर bpy.context.scene.objectsकरने के object.type == 'LIGHT'लिए इसे खत्म कर सकते हैं और इसे सत्यापित कर सकते हैं और फिर objects[i].dataवास्तविक प्रकाश प्राप्त करने के लिए उपयोग कर सकते हैं, लेकिन यह मुझे क्लंकी और गैर-प्रदर्शनकारी के रूप में प्रभावित करता है, खासकर उन दृश्यों के लिए जिनमें बड़ी संख्या में ऑब्जेक्ट हैं।

आदर्श रूप से मैं इसमें ड्रिल करना चाहता हूं bpy.data.lightsऔर फिर दृश्य के आधार पर इस छोटे से डेटासेट को फ़िल्टर करना चाहता हूं । लेकिन, इसमें एक प्रकाश दिया गया है bpy.data.lights, मैं उस वस्तु का पता कैसे लगा सकता हूं जो इसका उपयोग कर रही है, और वहां से इस ऑब्जेक्ट की user_sceneविशेषता की जांच करें ? यह मुझे एक bazillion वस्तुओं की dataविशेषताओं पर एक टॉप-डाउन फैशन में पुनरावृत्ति करने की तुलना में अधिक तेज़ बनाता है , लेकिन अगर प्रकाश से वस्तु तक नीचे जाने का एक तंत्र है जो इसका उपयोग कर रहे हैं तो मैं नहीं कर सकता इसे एपीआई में खोजें। किसी भी विचार, StackExchange के होशियार लोग?

बहुत धन्यवाद, और माफी अगर यह एक DOH है! इस तरह का सवाल, मैं इसके लिए नया हूं और अभी भी अंधेरे में अपना रास्ता महसूस कर रहा हूं।

जवाब

2 batFINGER Nov 27 2020 at 11:28

उन्हें एक संग्रह में रखो

IMO ऐसा करने का सबसे सरल तरीका है, जैसा कि सुझाव दिया गया है

scene_lights = [ob for ob in scene.objects if ob.type == 'LIGHT']

एक प्रकाश वस्तु में एक दृश्य में किसी भी या सभी रोशनी के समान प्रकाश डेटा हो सकता है। यहां तक ​​कि अगर कुछ रोशनी हैं, तो यह जांचना कि डेटा दृश्य में किसी वस्तु से संबंधित है, ऊपर से कम कुशल साबित हो सकता है।

यदि आपको लगता है कि दृश्य में इतनी सारी वस्तुएं हैं कि उन पर चलना अक्षम है, तो प्रकाश वस्तुओं के रूप में संग्रह को टैग करने के लिए नाम या आईडी संपत्ति का उपयोग करके उन्हें संग्रह (ओं) से जोड़ने पर विचार करें।

lightcol = bpy.data.collections.get("Lights")

if not lightcol:
    lightcol =  bpy.data.collections.new("Lights")
    scene.collection.children.link(lightcol) # or wherever
# populate it.
for lt in scene_lights:
    lightcol.objects.link(lt)

इस संग्रह के भीतर प्रकाश प्रकार द्वारा और अधिक वर्गीकृत करने के लिए संग्रह बना सकता है

पोइंटरप्रोपरेट्टी को मतदान किया

जैसा कि @brockmann ने उल्लेख किया है कि एक पोलेड पॉइंटर संपत्ति का उपयोग करने पर भी विचार कर सकते हैं, सामग्री के लिए एक उदाहरण

कस्टम खोज डेटा को UILayout.prop_search पर

जबकि रोशनी के मामले में सूचक संपत्ति प्रकार होगा bpy.types.Object, और चुनाव विधि प्रकार के खिलाफ परीक्षण करेगी। आसानी से प्रकाश प्रकार तक बढ़ाया जा सकता है

MohammadHosseinJamshidi Nov 27 2020 at 04:20

नीचे दी गई स्क्रिप्ट का उपयोग करें:

import bpy

light_set = set(bpy.data.lights.keys())
obj_set = set(bpy.data.objects.keys())

# light data doesn't update by deleting:
light_set.intersection_update(obj_set)

light_objects = [bpy.data.objects[name] for name in light_set]