kode untuk "pisahkan dan pilih dalam mode objek"
jadi saya membuat makro dari memisahkan pilihan dalam mode editor, dan kemudian memilih mesh yang dipisahkan setelah itu dalam mode objek ... saya memiliki sedikit pengetahuan tentang apa yang saya lakukan, tetapi saya melakukannya tidak pernah kurang. ..
jadi saya butuh bantuan. apa kode untuk memilih jala terpisah terakhir setelah keluar dari mode objek? maaf jika ini tidak masuk akal. Saya berharap blender hanya akan memilih jala terpisah dalam mode objek tepat setelah Anda memisahkannya. saya tidak tahu bagaimana menemukan mesh yang dipisahkan pada dasarnya.
Bagaimana saya akan melakukan itu sehingga akan bekerja setiap saat dengan objek apa pun? Terima kasih
Jawaban
Solusinya adalah menyimpan nama objek yang Anda pilih terlebih dahulu dan kemudian membatalkannya setelah Anda memisahkan mesh.
Sesuatu seperti ini:
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
Tidak yakin apakah ini adalah praktik terbaik, tetapi berhasil.
Operator khusus:
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()
Setelah mendaftarkannya sebagai Operator, Anda dapat mencari dan menjalankan operator ini dalam mode edit dalam ruang 3d:

Atau di View3d> mode edit> mesh> Pisahkan Pilihan Aktif setelah menambahkan fungsi menu baru agar dapat dicari di Blender 2.90.

Anda akan melihat prompt yang menanyakan metode untuk memisahkan:

Opsi ini sama persis dengan operator terpisah asli.
Dan operator ini akan memisahkannya, membatalkan pilihan mesh asli, mengaktifkan mesh baru yang dibuat:

Catatan: Jika proses terpisah membuat yang Anda ingin aktifkan tidak berubah, operator ini akan mengaktifkan mesh yang salah karena masih mesh asli dengan nama yang sama.