एक निश्चित संग्रह की सभी वस्तुओं में दर्पण संशोधक कैसे जोड़ें?
मैं एक निश्चित संग्रह की प्रत्येक वस्तु में एक दर्पण संशोधक जोड़ना चाहूंगा।
समस्या यह है कि संशोधक को केवल अंतिम ऑब्जेक्ट में जोड़ा जाएगा जो कि कई बार एक ही संशोधक हो जाता है और मुझे नहीं पता कि क्यों:
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"]
प्रश्न: एक निश्चित संग्रह की सभी वस्तुओं में दर्पण संशोधक कैसे जोड़ें?
जवाब
आप 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"]
ऑपरेटरों के लिए संदर्भ का उपयोग करें।
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 के उत्तर में सुझाए गए एपीआई विधि का उपयोग करने की सिफारिश करेंगे , सिवाय संग्रह और संशोधन लक्ष्य के संदर्भ के उपयोग के।
अपने संग्रह में सभी मेश का चयन करें और एक दर्पण संशोधक जोड़ें।
लेकिन जैसा कि आपने कहा कि यह केवल सक्रिय वस्तु (सक्रिय वस्तु = अंतिम वस्तु को अलग-अलग रंगीन रूपरेखा के साथ चयनित) को दर्पण करेगा। तो हर एक वस्तु को बस टाइप करने के लिए ( Ctrl+ L) > संशोधक । यह सभी वस्तुओं को एक ही संशोधक से जोड़ेगा।
आप इसे किसी भी अन्य संशोधक के लिए उपयोग कर सकते हैं।