एक निश्चित संग्रह की सभी वस्तुओं में दर्पण संशोधक कैसे जोड़ें?

Nov 29 2020

मैं एक निश्चित संग्रह की प्रत्येक वस्तु में एक दर्पण संशोधक जोड़ना चाहूंगा।

समस्या यह है कि संशोधक को केवल अंतिम ऑब्जेक्ट में जोड़ा जाएगा जो कि कई बार एक ही संशोधक हो जाता है और मुझे नहीं पता कि क्यों:

 def add_empty_collection(self):
    for obj in bpy.data.collections['my_collection'].all_objects:
        print("obj_: ", obj)
        bpy.ops.object.select_all(action='DESELECT') # Deselecting all
        obj.select_set(True)
        bpy.ops.object.modifier_add(type='MIRROR')
        bpy.context.object.modifiers["Mirror"].use_axis[0] = False
        bpy.context.object.modifiers["Mirror"].use_axis[1] = True
        bpy.context.object.modifiers["Mirror"].use_axis[2] = False
        bpy.context.object.modifiers["Mirror"].mirror_object = bpy.data.objects["target"]

प्रश्न: एक निश्चित संग्रह की सभी वस्तुओं में दर्पण संशोधक कैसे जोड़ें?

जवाब

3 Psyonic Nov 29 2020 at 10:25

आप bpy.data.objectsउन्हें हेरफेर करने के लिए उपयोग करने से बेहतर हैं। इस तरह से आपको इस बात पर भरोसा करने की ज़रूरत नहीं है कि जो चुना गया है, उसकी ज़रूरत आपको वस्तुओं के नाम पर है।

import bpy

mod_name = 'My-Mirror-Modifier'

for obj in bpy.data.collections["My-Collection"].all_objects:
    if obj.type == 'MESH':
        mod = obj.modifiers.new(mod_name, 'MIRROR')
        mod.use_axis[0] = False
        mod.use_axis[1] = True
        mod.use_axis[2] = False
        mod.mirror_object = bpy.data.objects["Light"]
2 batFINGER Nov 30 2020 at 12:47

ऑपरेटरों के लिए संदर्भ का उपयोग करें।

selfप्रश्न कोड को देखते हुए , यह धारणा बनाते हुए कि आप एक ऑपरेटर लिख रहे हैं

स्पष्टीकरण के माध्यम से @RoufirHassan के उत्तर में आगे , संग्रह ऑब्जेक्ट्स को डी-सेलेक्ट करना और एकल का चयन करना, सक्रिय ऑब्जेक्ट को नहीं बदल रहा था। context.objectप्रिंट स्टेटमेंट को जोड़ना इस बात की पुष्टि करेगा।

क्या सक्रिय वस्तु और शून्य चयनित वस्तु हमेशा समान होती है?

कॉल ऑपरेटर से पहले सक्रिय ऑब्जेक्ट को लूप ऑब्जेक्ट पर सेट करने के लिए।

context.view_layer.objects.active = obj

ब्लेंडर 2.8 एपीआई, अजगर, सक्रिय ऑब्जेक्ट सेट करें

हालाँकि, यहाँ एक समस्या यह होगी कि यदि बहुत सारे ऑपरेटरों को लूप किया जाए तो लिपियों की गति धीमी हो जाएगी। संशोधित प्रश्न कोड का उपयोग कर ऑपरेटर रन काउंट संग्रह में 2 x संख्या की वस्तु होगी।

संशोधक जोड़ ऑपरेटर संशोधक स्टैक के अंत में जोड़ता है

यदि संशोधक का उपयोग करने वाला ऑपरेटर जोड़ देता है तो नया जोड़ा संशोधक होगा

context.object.modifiers[-1]

यानी आखिरी वाला। एक बार फिर से ब्लेंडर में नाम का उपयोग करके डोडी बनाया जा सकता है, ठीक उसी तरह जैसे किसी अन्य नाम के साथ वस्तुओं को जोड़ने पर समान नाम नहीं होगा।

KeyError के लिए प्रमुख उम्मीदवार

bpy.data.whatevers["Foo"]जब तक आप निश्चित नहीं हैं तब तक कभी भी उपयोग न करें जब तक कि "फू" मौजूद न हो। जहाँ इसका मान हो सकता है None, दृश्य वस्तुओं का उपयोग करने की भी सलाह देते हैं, जैसे कि वस्तु bpy.data.objectsदृश्य से जुड़ी नहीं है , तो यह अपेक्षित रूप में काम नहीं करेगा।

target = context.scene.objects.get("Foo")

या संदर्भ का उपयोग करें। इस मामले में उदाहरण के लिए, संग्रह संदर्भ संग्रह (आउटलाइनर में अंतिम रूप से चयनित) और संशोधक लक्ष्य हो सकता हैcontext.object

अधिभावी प्रसंग

ऑपरेटरों के लिए एक संदर्भ शब्दकोश पारित कर सकते हैं। ओवरराइड का उपयोग करके विधि @RoufirHassan द्वारा समझाया गया है । नोट: यह संग्रह में अन्य सभी मेष वस्तुओं को संग्रह में पहली जाली वस्तु के सभी संशोधक (नव जोड़ा दर्पण सहित) जोड़ देगा, दर्पण लक्ष्य को छोड़कर अगर यह उसी संग्रह में एक जाल वस्तु है

यह केवल 2 ऑपरेटरों को चलाएगा चाहे कितनी भी वस्तुएं संग्रह में हों।

import bpy

context = bpy.context

coll = context.collection
ob = context.object

mesh_obs = [o for o in coll.all_objects 
        if o.type == 'MESH'
        and o is not ob]


if mesh_obs:
    ao = mesh_obs.pop(0)
    bpy.ops.object.modifier_add(
            {"object" : ao},
            type='MIRROR'
            )
    mod = ao.modifiers[-1]
    mod.use_axis = (True, False, True)
    mod.mirror_object = ob
    bpy.ops.object.make_links_data(
            {"object" : ao,
             "selected_editable_objects": mesh_obs
             },
             type='MODIFIERS',
             )

एपीआई तरीके।

अंत में @Pysonic के उत्तर में सुझाए गए एपीआई विधि का उपयोग करने की सिफारिश करेंगे , सिवाय संग्रह और संशोधन लक्ष्य के संदर्भ के उपयोग के।

1 RoufirHasan Nov 29 2020 at 09:50

अपने संग्रह में सभी मेश का चयन करें और एक दर्पण संशोधक जोड़ें।

लेकिन जैसा कि आपने कहा कि यह केवल सक्रिय वस्तु (सक्रिय वस्तु = अंतिम वस्तु को अलग-अलग रंगीन रूपरेखा के साथ चयनित) को दर्पण करेगा। तो हर एक वस्तु को बस टाइप करने के लिए ( Ctrl+ L) > संशोधक । यह सभी वस्तुओं को एक ही संशोधक से जोड़ेगा।

आप इसे किसी भी अन्य संशोधक के लिए उपयोग कर सकते हैं।