import bpy, bmesh from mathutils import Vector def straight(n1,n2,mid): v1 = Vector(n1.co-mid.co) v2 = Vector(n2.co-mid.co) if v1.length>0 and v2.length > 0: scangle = v1*v2/v1.length/v2.length if scangle < -0.85: return True return False def follow(v): v.select = True neighbours = [e.other_vert(v) for e in v.link_edges] newn = [n for n in neighbours if not n.select] known = [n for n in neighbours if n.select] if len(known) == 1: print(v,1) next = [n for n in newn if straight(known[0],n,v)] print(next) elif len(known) > 1: print(">1") next = [] print(next) else: print(0) next = [n for n in newn if any([straight(nn,n,v) for nn in newn if nn != n])] print(next) if len(next) == 1: follow(next[0]) elif len(known) == 0 and len(next) == 2: follow(next[0]) follow(next[1]) obj = bpy.context.object bm = bmesh.new() bm.from_mesh(obj.data) vs = [v for v in bm.verts if v.select] for v in vs: follow(v) bm.to_mesh(obj.data)