def join_objects(obs, name=''): ''' uses BMesh to join objects. Advantage is that it is context agnostic, so no editmoe or bpy.ops has to be used. Args: obs - list of Blender objects Returns: new object with name specified. Otherwise '_joined' will be added to the name of the first object in the list ''' target_bme = bmesh.new() target_bme.verts.ensure_lookup_table() target_bme.faces.ensure_lookup_table() trg_mx = obs[0].matrix_world if name == '': name = obs[0].name + '_joined' for ob in obs: src_mx = ob.matrix_world if ob.data.is_editmode: src_bme = bmesh.from_editmesh(ob.data) else: src_bme = bmesh.new() if ob.type == 'MESH': if len(ob.modifiers): src_bme.from_object(ob, bpy.context.scene) else: src_bme.from_mesh(ob.data) else: me = ob.to_mesh(bpy.context.scene, apply_modifiers=True, settings='PREVIEW') src_bme.from_mesh(me) bpy.data.meshes.remove(me) join_bmesh(src_bme, target_bme, src_mx, trg_mx) src_bme.free() new_me = bpy.data.meshes.new(name) new_ob = bpy.data.objects.new(name, new_me) new_ob.matrix_world = trg_mx target_bme.to_mesh(new_me) target_bme.free() return new_ob
def join_objects(obs, name = ''): ''' uses BMesh to join objects. Advantage is that it is context agnostic, so no editmoe or bpy.ops has to be used. Args: obs - list of Blender objects Returns: new object with name specified. Otherwise '_joined' will be added to the name of the first object in the list ''' target_bme = bmesh.new() target_bme.verts.ensure_lookup_table() target_bme.faces.ensure_lookup_table() trg_mx = obs[0].matrix_world if name == '': name = obs[0].name + '_joined' for ob in obs: src_mx = ob.matrix_world if ob.data.is_editmode: src_bme = bmesh.from_editmesh(ob.data) else: src_bme = bmesh.new() src_bme.from_mesh(ob.data) join_bmesh(src_bme, target_bme, src_mx, trg_mx) src_bme.free() new_me = bpy.data.meshes.new(name) new_ob = bpy.data.objects.new(name, new_me) target_bme.to_mesh(new_me) target_bme.free() return new_ob