import pymel.core as pm
 
def getBuildOrder(face):
    """Returns the uvs of a face in the build order """
    verts = []
    vtxFaces = pm.ls(pm.polyListComponentConversion(face, toVertexFace=True), flatten=True)
    for vtxFace in vtxFaces:
        uvs = pm.polyListComponentConversion(vtxFace, fromVertexFace=True, toUV=True)
        verts.append(uvs[0])
    return verts
 
def getUVFaceNormal(face):
    """Returns the UV normals from face"""
    uvs = getBuildOrder(face)
    if len(uvs) < 3:
        return 1, 0, 0
    uvA_xyz = pm.polyEditUV(uvs[0], query=True, uValue=True, vValue=True)
    uvB_xyz = pm.polyEditUV(uvs[1], query=True, uValue=True, vValue=True)
    uvC_xyz = pm.polyEditUV(uvs[2], query=True, uValue=True, vValue=True)
    uvAB = pm.dt.Vector([uvB_xyz[0]-uvA_xyz[0], uvB_xyz[1]-uvA_xyz[1], 0])
    uvBC = pm.dt.Vector([uvC_xyz[0]-uvB_xyz[0], uvC_xyz[1]-uvB_xyz[1], 0])
    uvNormal = uvAB.cross(uvBC)
    uvNormal = uvNormal.normal()
    return uvNormal
 
def findReversed(obj):
    """Returns meshes with normals pointing inward"""
    reversed = []
    faces = pm.polyListComponentConversion(obj, toFace=True)
    faces = pm.ls(faces, flatten=True)
    for face in faces:
        uv_normal = getUVFaceNormal(face)
        if (uv_normal * pm.dt.Vector([0, 0, 1])) < 0:
            reversed.append(face)
    return reversed
 

sel = pm.ls(type="mesh")
reversed_meshes = []
for object in sel:
    pm.polyNormal(object, normalMode=2, userNormalMode=0,  ch=1)
    reversed = findReversed(object)
    if reversed:
        reversed_meshes.append(object)
    print ("reversed meshes: " + str(reversed_meshes))

    for mesh in reversed_meshes:
        pm.polyNormal(mesh, normalMode=0, userNormalMode=0,  ch=1)
    pm.polySoftEdge(object, a=0, ch=1)
    pm.polySoftEdge(object, a=180, ch=1)