Getting Selected Vertices of Mesh

Hi!

I’m trying to write a Python script that modifies the selected vertices in a mesh. I used the mesh.vertices.select property for this as recommended in this Blender StackExchange post:

bl_info = {
    "name": "Resymmetrize Vertices",
    "category": "Mesh",
}

import bpy


class Resymmetrize(bpy.types.Operator):
    """Resymmetrize selected vertices"""      # blender will use this as a tooltip for menu items and buttons.
    bl_idname = "mesh.resymmetrize_selected"  # unique identifier for buttons and menu items to reference.
    bl_label = "Resymmetrize Vertices"        # display name in the interface.
    bl_options = {'REGISTER', 'UNDO'}  # enable undo for the operator.

    def execute(self, context):        # execute() is called by blender when running the operator.

        mesh = bpy.context.active_object.data
        selected_verts = [v for v in mesh.vertices if v.select]
        selected_vert_count = len(selected_verts)

        # ?! str(selected_vert_count) returns string, report() wants something else, it seems

        if selected_vert_count == 0:
            self.report({'INFO'}, '0 vertices selected')
            return {'FINISHED'}

        if selected_vert_count == 1:
            self.report({'INFO'}, '1 vertex selected')
            return {'FINISHED'}

        if selected_vert_count > 2:
            self.report({'INFO'}, 'many vertices selected')
            return {'FINISHED'}

        if len(selected_verts) != 2:
            self.report({'INFO'}, 'Select exactly 2 vertices before using this operator')
            return {'FINISHED'}

        average_x = (abs(selected_verts[0].x) + abs(selected_verts[1].x)) / 2
        selected_verts[0].x = average_x * sgn(selected_verts[0].x)
        selected_verts[1].x = average_x * sgn(selected_verts[1].x)

        average_y = (selected_verts[0].y + selected_verts[1].y) / 2
        selected_verts[0].y = average_y
        selected_verts[1].y = average_y

        average_z = (selected_verts[0].z + selected_verts[1].z) / 2
        selected_verts[0].z = average_z
        selected_verts[1].z = average_z

        return {'FINISHED'}            # this lets blender know the operator finished successfully.

def register():
    bpy.utils.register_class(Resymmetrize)


def unregister():
    bpy.utils.unregister_class(Resymmetrize)

For some reason, I always get the ‘many vertices selected’ message, even if I’m in edit mode and have no vertices selected at all.

What am I doing wrong?

Solved it myself. Here’s a working version:

bl_info = {
    "name": "Resymmetrize Vertices",
    "category": "Mesh",
}

import bpy
import bmesh

def sgn(x):
    return (x > 0) - (x < 0)

class Resymmetrize(bpy.types.Operator):
    """Resymmetrize selected vertices"""      # blender will use this as a tooltip for menu items and buttons.
    bl_idname = "mesh.resymmetrize_selected"  # unique identifier for buttons and menu items to reference.
    bl_label = "Resymmetrize Vertices"        # display name in the interface.
    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]

        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

        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()