makeRound.py

Replace selected verts onto a circle in Edit mode.

import bmesh
import numpy as np
def makeRound():
    if bpy.ops.object.mode_set.poll():
        bpy.ops.object.mode_set(mode='OBJECT', toggle=False)
    if bpy.ops.object.mode_set.poll():
        bpy.ops.object.mode_set(mode='EDIT', toggle=False)
    o = bpy.context.scene.objects.active
    bm = bmesh.from_edit_mesh(o.data)
    tX = tY = tZ = 0
    nVertsSelected = 0
    for v in bm.verts:
        if v.select:
            nVertsSelected += 1
            tX += v.co[0]
            tY += v.co[1]
            tZ += v.co[2]
    # c is the center
    c = np.array([tX/nVertsSelected, tY/nVertsSelected, tZ/nVertsSelected])
    totalLength = 0
    for v in bm.verts:
        if v.select:
            rv = np.array([v.co[0]-c[0], v.co[1]-c[1], v.co[2]-c[2]])
            totalLength += np.linalg.norm(rv)
    avrgLength = totalLength/nVertsSelected
    for v in bm.verts:
        if v.select:
            rv = np.array([v.co[0]-c[0], v.co[1]-c[1], v.co[2]-c[2]])
            v.co = c + (avrgLength*rv/np.linalg.norm(rv))
# Uncomment lines below to go back to Object mode, 
# though undo will be unabled. 
#    if bpy.ops.object.mode_set.poll():
#        bpy.ops.object.mode_set(mode='OBJECT', toggle=False)