"अलग मोड में इसे चुनें और इसे चुनें"

Aug 18 2020

इसलिए मैं संपादक मोड में चयन को अलग करने के लिए एक मैक्रो बना रहा हूं, और फिर ऑब्जेक्ट मोड में बाद में अलग मेष का चयन करें ... मुझे बहुत कम ज्ञान है कि मैं क्या कर रहा हूं, लेकिन मैं इसे कम कभी नहीं कर रहा हूं। ।।

इसलिए मुझे कुछ मदद चाहिए ऑब्जेक्ट मोड से बाहर आने के बाद अंतिम पृथक जाल के चयन के लिए कोड क्या होगा? खेद है अगर यह समझ में नहीं आता है। काश ब्लेंडर आपके द्वारा अलग किए जाने के बाद ऑब्जेक्ट ऑब्जेक्ट में अलग से अलग जाल का चयन करता। मैं नहीं जानता कि मूल रूप से अलग जाल कैसे खोजना है।

मैं ऐसा करने के बारे में कैसे जाऊँगा ताकि यह हर बार किसी वस्तु के साथ काम करे? धन्यवाद

जवाब

2 HikariTW Aug 18 2020 at 15:07

एक समाधान यह है कि आप अपने चयनित ऑब्जेक्ट नाम को पहले स्टोर करें और फिर जाल अलग करने के बाद उनका चयन रद्द करें।

कुछ इस तरह:

org_obj_list = {obj.name for obj in context.selected_objects}
# This is a Set comprehension in Python,
# which create a set of name from the context.selected_objects
# context.selected_objects will be a Iterable collection of some object

bpy.ops.mesh.separate(type = 'SELECTED')
# This will call the separate operator in your code directly
# the type can be a enum string in ['SELECTED', 'LOOSE', 'MATERIAL']

bpy.ops.object.editmode_toggle()
# Switch back to object mode from edit mode

# Those separated object will also be selected now
# We then check if selected object is the one we saved before, then deselect it.
for obj in context.selected_objects:
    if obj and obj.name in org_obj_list:
        # Deselect selected object
        obj.select_set(False)
    else:
        # Set the new created object to active
        context.view_layer.objects.active = obj

यकीन नहीं होता कि यह सबसे अच्छा अभ्यास है, लेकिन यह काम करता है।


एक कस्टम ऑपरेटर:

import bpy

class SeparateSelectionActive(bpy.types.Operator):
    """Separate object by selection and set it as active object."""
    bl_idname = "mesh.select_separate_active"
    bl_label = "Separate Selection Active"
    
    # An enum for prompt dialog
    separate_method: bpy.props.EnumProperty(
        items = {
            ('SELECTED', 'Selected', "Selected mesh"),
            ('MATERIAL', 'Material', "Based on material"),
            ('LOOSE', 'Loose', "Based on loose part")
        },
        name = "Separate Method",
        description = "Choose a method to separate mesh",
        default = 'SELECTED'
    )
    
    @classmethod
    def poll(cls, context):
        return context.object is not None and context.mode == 'EDIT_MESH'
    
    def invoke(self, context, event):
        # Prompt to ask a method to separate
        return context.window_manager.invoke_props_dialog(self)

    def execute(self, context):
        org_obj_list = {o.name for o in context.selected_objects}
        
        # Separate using selected method
        bpy.ops.mesh.separate(type = self.separate_method)
        bpy.ops.object.editmode_toggle()
        for obj in context.selected_objects:
            if obj and obj.name in org_obj_list:
                # Deselect everything selected before
                obj.select_set(False)
            else:
                # Set the new created object to active
                context.view_layer.objects.active = obj
                self.report({'INFO'},f"Set active object to: {obj.name}")
        return {'FINISHED'}

# A menu inject into View3D > Edit > Mesh tab
def _menu_func(self, context):
    self.layout.operator(SeparateSelectionActive.bl_idname)

def register():
    bpy.utils.register_class(SeparateSelectionActive)
    bpy.types.VIEW3D_MT_edit_mesh.append(_menu_func)

def unregister():
    bpy.utils.unregister_class(SeparateSelectionActive)
    bpy.types.VIEW3D_MT_edit_mesh.remove(_menu_func)

if __name__ == "__main__":
    register()

    # test call
    bpy.ops.mesh.select_separate_active()

इसे ऑपरेटर के रूप में पंजीकृत करने के बाद, आप इस ऑपरेटर को 3 डी स्थान के भीतर संपादन मोड में खोज और चला सकते हैं :

या View3d में> संपादन मोड> जाल> अलग चयन सक्रिय एक नया मेनू समारोह के बाद सक्रिय यह Blear 2.90 में खोजा बनाने के लिए।

आपको एक प्रॉम्प्ट को अलग करने के लिए एक तरीका पूछना चाहिए:

मूल अलग ऑपरेटर के साथ ये विकल्प बिल्कुल समान हैं।

और यह ऑपरेटर इसे अलग कर देगा, मूल जाल को हटा देगा, नए बनाए गए जाल को सक्रिय करेगा:

नोट: यदि अलग प्रक्रिया आप को सक्रिय अपरिवर्तित करना चाहते हैं, तो यह ऑपरेटर गलत जाल को सक्रिय करेगा क्योंकि यह अभी भी उसी नाम के साथ मूल जाल है।