Mapping On A Plane

# let u, v vectors on the plane. b the origin on it.
# let a a point off plane. and n a normal of the plane.
import sys
import bmesh
import numpy as np

def mapOnPlane(a, b0, b1, b2):
    u = np.array([b1[0]-b0[0], b1[1]-b0[1], b1[2]-b0[2]])
    v = np.array([b2[0]-b0[0], b2[1]-b0[1], b2[2]-b0[2]])
    n = np.cross(u, v)
    tX = np.array([n, u, v])
    X = np.array([tX[:,0], tX[:,1], tX[:,2]])
    print(X)
#    X = np.array([[n[0], u[0], v[0]], [n[1], u[1], v[1]], [n[2], u[2], v[2]]])
#    print(X)
    Y = np.array([b0[0]-a[0], b0[1]-a[1], b0[2]-a[2]])
#    print(u,v,n,X,Y)
    s = np.linalg.solve(X, Y)
    return (a[0] + s[0]*n[0], a[1] + s[0]*n[1], a[2] + s[0]*n[2])

def pressLine():
    if bpy.ops.object.mode_set.poll():
        bpy.ops.object.mode_set(mode='EDIT', toggle=False)
    ao = bpy.context.scene.objects.active
    bm = bmesh.from_edit_mesh(ao.data)
    vs = bm.verts
    l = len(vs)
    print("lenth = "+str(l))
    if l<4:
        sys.exit()
    b = []
    b.append(vs[1])
    b.append(vs[-1])
    b.append(vs[0])
    k=0
    for i in range(l):
        if bm.verts[i].select and k<3:
            b[k] = vs[i]
            k += 1
            print(i)
    for i in range(l):
        print(i, vs[i].co)
        vs[i].co = mapOnPlane(vs[i].co, b[0].co, b[1].co, b[2].co)
        print(i, vs[i].co)
    ao.data.update()