# How do I name a mesh using Python, when I don't know its present name?

In a loop, I'm calling bpy.ops.mesh.separate(type="SELECTED") to separate some faces into new meshes. The newly created mesh doesn't seem to automatically become the "active" object, and so it seems like I need to know the name of the newly created mesh before I can rename it.

I'd really like to have the script be able to give these new meshes a meaningful name. However, trying to figure out what they're getting called by default is proving very tedious.

Is there any easy way to do this?

• – zeffii Jun 16 '15 at 17:41

I made http://web.purplefrog.com/~thoth/blender/python-cookbook/find-new-objects.html to solve this problem:

import bpy

scn = bpy.context.scene
names = [ obj.name for obj in scn.objects]

bpy.ops.mesh.separate(type="SELECTED")

new_objs = [ obj for obj in scn.objects if not obj.name in names]

print( [ obj.name for obj in new_objs ] )


There are shortcomings with this approach if your scene has objects linked from external .blend files (because the .name is no longer guaranteed to be unique).

I think it's pretty simple. Let's take an object called cubes which is one mesh consisting of several disjoint cubes that you want to separate.

# with some selection, running: separate()
cubes -> cubes.001

# with some selection, running: separate()
cubes.001 -> cubes.002


if you then deleted cubes.001 and ran separate() on cubes.002 blender will automatically find the earliest unused object name

# with some selection, running: separate()
cubes.002 -> cubes.001


I think this is how it works, at least there's a logic to it. (Tested by seeing what happens in the outliner if I do this manually for a few iterations.

The reason this isn't a very convenient process is because you are calling a function which is used by the user interface, and doesn't need to return the names of the new objects.

A simple snippet using Python's Set class to find out which scene objects are new in the scene after such an operation is:

# before
A = set([bpy.data.objects[:])

# after operation
B = set([bpy.data.objects[:])

# whats the difference
new_objects = A ^ B
print([o.name for o in new_objects])

• I did not know about ^ or that it would work on objects as well as strings. – Mutant Bob Jun 16 '15 at 17:55