This post is related to this issue: ⚓ T89472 Object using Point Instance GN node can not be converted to mesh.
Basically, with the rise of GN, it’s becoming more and more common for users to want to “collapse” the result of whatever procedural modeling they do in GN. There are many cases where this is desired, such as exporting to game engines.
Unfortunately, the way Blender currently handles converting instances placed through GN or Particle System is very clumsy, and offloads tons of work onto the user, instead of handling it for them.
I’ve been needing to do that so often I actually wrote a script to do it:
bl_idname = 'object.lk_applied_copy'
bl_label = 'Applied Copy'
@classmethod
def poll(cls, context):
return context.active_object is not None
def execute(self, context):
# Store active base object
obj = context.active_object
# Turn Instances into real objects (It selects the objects)
bpy.ops.object.duplicates_make_real()
bpy.context.view_layer.objects.active = bpy.context.selected_objects[0]
# If base object had mesh instances, join them together and join them with base object
if context.active_object is not obj:
bpy.ops.object.make_single_user(object=False, obdata=True, material=False, animation=False)
bpy.ops.object.join()
bpy.ops.object.transform_apply(location=True, rotation=True, scale=True, properties=False)
# Store merged instances oject
instances = context.active_object
# Clear selection and set base object to be selected and active
bpy.ops.object.select_all(action="DESELECT")
obj.select_set(True)
bpy.context.view_layer.objects.active = obj
# Duplicate base object and apply modifiers
bpy.ops.object.duplicate()
bpy.ops.object.convert(target='MESH')
# Join merged instances to base object
instances.select_set(True)
bpy.ops.object.join()
else:
# Duplicate base object and apply modifiers
bpy.ops.object.duplicate()
bpy.ops.object.convert(target='MESH')
return {'FINISHED'}
The length of it kinda shows how many manual steps users have to do to perform this simple task. Writing the script made me realize how ridiculous it is that such a basic functionality has to be scripted, and that most Blender users don’t even know how to use Python anyway.
So what I propose is to simply make the Convert to Mesh operator handle instances, so that it merges them together and joins them with the mesh for the user.