codice per "separalo e selezionalo in modalità oggetto"
quindi sto creando una macro separando la selezione in modalità editor, quindi seleziono successivamente la mesh separata in modalità oggetto ... ho pochissima conoscenza di quello che sto facendo, ma lo sto facendo comunque. ..
quindi ho bisogno di un aiuto. quale sarebbe il codice per selezionare l'ultima mesh separata dopo essere uscito dalla modalità oggetto? scusa se questo non ha senso. vorrei che Blender selezionasse semplicemente la mesh separata in modalità oggetto subito dopo averla separata. non so come trovare fondamentalmente la mesh separata.
Come potrei farlo in modo che funzioni ogni volta con qualsiasi oggetto? Grazie
Risposte
Una soluzione consiste nel memorizzare prima il nome dell'oggetto selezionato e quindi deselezionarlo dopo aver separato la mesh.
Qualcosa come questo:
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
Non sono sicuro che questa sia la migliore pratica, ma funziona.
Un operatore personalizzato:
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()
Dopo averlo registrato come operatore, puoi cercare ed eseguire questo operatore in modalità di modifica all'interno dello spazio 3D:

Oppure in View3d > modalità di modifica > mesh > Separate Selection Active dopo aver aggiunto una nuova funzione di menu per renderla ricercabile in Blender 2.90.

Dovresti vedere un prompt che chiede un metodo per separare:

Queste opzioni sono esattamente le stesse con l'operatore separato originale.
E questo operatore lo separerà, mesh originale deselezionata, renderà attiva la nuova mesh creata:

Nota: se il processo separato rende quello che vuoi sia attivo invariato, questo operatore attiverà la mesh sbagliata poiché è ancora la mesh originale con lo stesso nome.