código para "separarlo y seleccionarlo en modo objeto"
así que estoy creando una macro a partir de la selección de separación en el modo de editor, y luego selecciono la malla separada después en el modo de objeto... tengo muy poco conocimiento de lo que estoy haciendo, pero lo estoy haciendo sin embargo. ..
así que necesito algo de ayuda. ¿Cuál sería el código para seleccionar la última malla separada después de salir del modo de objeto? Lo siento si esto no tiene sentido. Desearía que Blender simplemente seleccionara la malla separada en modo objeto justo después de separarla. no sé cómo encontrar la malla separada básicamente.
¿Cómo haría eso para que funcione siempre con cualquier objeto? Gracias
Respuestas
Una solución es almacenar primero el nombre del objeto seleccionado y luego anular la selección después de separar la malla.
Algo como esto:
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
No estoy seguro de si esta es la mejor práctica, pero funciona.
Un operador personalizado:
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()
Después de registrarlo como Operador, puede buscar y ejecutar este operador en modo de edición dentro del espacio 3D:

O en View3d> modo de edición> malla> Selección separada activa después de agregar una nueva función de menú para que se pueda buscar en Blender 2.90.

Debería ver un mensaje que le pide un método para separar:

Estas opciones son exactamente las mismas con el operador separado original.
Y este operador lo separará, la malla original deseleccionada, activará la nueva malla creada:

Nota: Si el proceso separado hace que el que desea que esté activo no cambie, este operador activará la malla incorrecta ya que sigue siendo la malla original con el mismo nombre.