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)