Hello guys,
I rewritten script UV2PhongEdges (weird name, I know :D) from scratch. Now it should works much faster. Also UNDO finally works, yyyeeeey!
You can download it here
https://github.com/rocketjump4d/UV2PhongEdges
And here is an example
Also, if you just need to get edges indexes of all UV borders you can use this code:
ο»Ώimport c4d
from c4d import utils
def GetUVBorders(obj):
    edgesIndexes = set()
    abcd = tuple("abcd")
    tuvw = obj.GetTag(c4d.Tuvw)
    nbr = utils.Neighbor()
    nbr.Init(obj)
    # Create empty set for `edgesVV`
    # In this case `edgeVV` means `Edge between Vertex0 and Vertex1 (edgeVertexVertex)`
    # edgeVV is just a tuple(v0, v1), where v0 is index of the first vertex
    # and v1 is the second one
    allEdgesVV = set()
    for i in xrange(obj.GetPointCount()):
        # Find neighbor vertex for this one
        neighborIndexes = nbr.GetPointOneRingPoints(i)
        for ni in neighborIndexes:
            edgeTuple = (i, ni)
            allEdgesVV.add(edgeTuple)
    # At this point I've got a set of all `edgesVV` of the object
    # Something like this:
    # (0, 3)
    # (0, 5)
    # (5, 1)
    for edgeVV in allEdgesVV:
        # Find neighbour polygons for this edge
        # I called them polyA and polyB
        polyAIndex, polyBIndex = nbr.GetEdgePolys(edgeVV[0], edgeVV[1])
        polyA = obj.GetPolygon(polyAIndex)
        if polyBIndex is c4d.NOTOK:
            # There is no polyB. It means that this edge is border of the object
            # eiA stands for `Edge Index in polyA for current edgeVV`
            eiA = polyAIndex * 4 + polyA.FindEdge(edgeVV[0], edgeVV[1])
            edgesIndexes.add(eiA)
            continue
        polyB = obj.GetPolygon(polyBIndex)
        # piA0 stands for `Point Index in polyA for vertex edgeVV[0]`
        # the same for others
        piA0 = polyA.Find(edgeVV[0])
        piA1 = polyA.Find(edgeVV[1])
        piB0 = polyB.Find(edgeVV[0])
        piB1 = polyB.Find(edgeVV[1])
        # Replace "d" (3) to "c" (2) if polygon is triangle
        if polyA.IsTriangle() and piA0 == 3:
            piA0 = 2
        if polyA.IsTriangle() and piA1 == 3:
            piA1 = 2
        if polyB.IsTriangle() and piB0 == 3:
            piB0 = 2
        if polyB.IsTriangle() and piB1 == 3:
            piB1 = 2
        # Get UV coordinates for each point in each polygon
        uvCoordA0 = tuvw.GetSlow(polyAIndex)[abcd[piA0]]
        uvCoordA1 = tuvw.GetSlow(polyAIndex)[abcd[piA1]]
        uvCoordB0 = tuvw.GetSlow(polyBIndex)[abcd[piB0]]
        uvCoordB1 = tuvw.GetSlow(polyBIndex)[abcd[piB1]]
        if uvCoordA0 != uvCoordB0 or uvCoordA1 != uvCoordB1:
            eiA = polyAIndex * 4 + polyA.FindEdge(edgeVV[0], edgeVV[1])
            eiB = polyBIndex * 4 + polyB.FindEdge(edgeVV[0], edgeVV[1])
            edgesIndexes.add(eiA)
            edgesIndexes.add(eiB)
    return edgesIndexes
Let me know if you find bugs.
Btw, sorry any mistakes. My English is... meh