code pour "séparer et sélectionner en mode objet"
donc je crée une macro en séparant la sélection en mode éditeur, puis je sélectionne ensuite le maillage séparé en mode objet ... j'ai très peu de connaissances sur ce que je fais, mais je le fais néanmoins. ..
donc j'ai besoin d'aide. quel serait le code pour sélectionner le dernier maillage séparé après être sorti du mode objet ? désolé si cela n'a pas de sens. Je souhaite que Blender sélectionne simplement le maillage séparé en mode objet juste après l'avoir séparé. Je ne sais pas comment trouver le maillage séparé en gros.
Comment pourrais-je faire cela pour que cela fonctionne à chaque fois avec n'importe quel objet? Merci
Réponses
Une solution consiste à stocker d' abord le nom de l'objet sélectionné, puis à le désélectionner après avoir séparé le maillage.
Quelque chose comme ça:
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
Je ne sais pas si c'est la meilleure pratique, mais cela fonctionne.
Un opérateur personnalisé :
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()
Après l'avoir enregistré en tant qu'opérateur, vous pouvez rechercher et exécuter cet opérateur en mode édition dans l'espace 3D :
Ou dans View3d> mode édition> maillage> Séparer la sélection active après avoir ajouté une nouvelle fonction de menu pour la rendre consultable dans Blender 2.90.
Vous devriez voir une invite demandant une méthode de séparation :
Ces options sont exactement les mêmes avec l'opérateur séparé d'origine.
Et cet opérateur le séparera, désélectionnera le maillage d'origine, rendra actif le nouveau maillage créé :
Remarque : Si le processus séparé rend celui que vous souhaitez activer inchangé, cet opérateur activera le mauvais maillage car il s'agit toujours du maillage d'origine portant le même nom.