bl_info = { "name": "Resymmetrize Vertices", "author": "Markus Ewald", "version": (1, 0), "blender": (2, 7, 7), "location": "Object -> Tools -> Misc", "description": "Saves and restores vertex selections", #"warning": "20 Nov 2016", "wiki_url": "", "tracker_url": "", "category": "Mesh" } import bpy import bmesh def sgn(x): return (x > 0) - (x < 0) class Resymmetrize(bpy.types.Operator): """Resymmetrize selected vertices""" bl_idname = "mesh.resymmetrize_selected_vertices" bl_label = "Resymmetrize Vertices" #bl_options = {'REGISTER', 'UNDO'} # enable undo for the operator. def execute(self, context): # execute() is called by blender when running the operator. bm = bmesh.from_edit_mesh(bpy.context.active_object.data) selected_verts = [v for v in bm.verts if v.select] # ?! str(selected_vert_count) returns string, report() wants something else, it seems selected_vert_count = len(selected_verts) if len(selected_verts) != 2: self.report({'INFO'}, 'Select exactly 2 vertices before using this operator') return {'FINISHED'} average_x = (abs(selected_verts[0].co.x) + abs(selected_verts[1].co.x)) / 2 selected_verts[0].co.x = average_x * sgn(selected_verts[0].co.x) selected_verts[1].co.x = average_x * sgn(selected_verts[1].co.x) average_y = (selected_verts[0].co.y + selected_verts[1].co.y) / 2 selected_verts[0].co.y = average_y selected_verts[1].co.y = average_y average_z = (selected_verts[0].co.z + selected_verts[1].co.z) / 2 selected_verts[0].co.z = average_z selected_verts[1].co.z = average_z bmesh.update_edit_mesh(bpy.context.active_object.data) return {'FINISHED'} # this lets blender know the operator finished successfully. def register(): bpy.utils.register_class(Resymmetrize) def unregister(): bpy.utils.unregister_class(Resymmetrize) # This allows you to run the script directly from blenders text editor # to test the addon without having to install it. if __name__ == "__main__": register()