##-------------------------------------------------------------------------- ## ## ScriptName : cornerKiller ## Author : Joe Wu ## URL : https://www.youtube.com/@Im3dJoe ## LastUpdate : 2023/05/17 ## : fixing corner topology ## Version : 0.3 Beta version for public test ## : 0.3.1 fixed missing codea ## ## Install : copy and paste script into a python tab in maya script editor ## ## test in maya 2023 ## ##-------------------------------------------------------------------------- import maya.cmds as mc import maya.mel as mel def cornerKiller(): if mc.objExists('sortFaceKeep'): mc.delete('sortFaceKeep') mc.sets(name="sortFaceKeep", text="sortFaceKeep") selFace = mc.ls(sl=1,fl=1) threeLessEdgeFaceList = [] doneFaceList = [] meshName = selFace[0].split('.')[0] for s in selFace: AllVertex = mc.polyListComponentConversion(s, tv=True) AllVertex = mc.ls(AllVertex,fl=1) num_edges = 0 for vertex in AllVertex: edges = mc.polyListComponentConversion(vertex, te=True) num_edges = len(mc.ls(edges, fl=True)) if num_edges < 4: threeLessEdgeFaceList.append(s) if threeLessEdgeFaceList: mc.select(threeLessEdgeFaceList) mc.sets(threeLessEdgeFaceList, rm= "sortFaceKeep") cornerTopoL() try: mc.select('sortFaceKeep') CMD = 'doMenuComponentSelectionExt("' + meshName+ '", "facet", 0);' mel.eval(CMD) except: mc.select(meshName) selFace = mc.ls(sl=1,fl=1) fiveEdgeFaceList = [] for s in selFace: AllVertex = mc.polyListComponentConversion(s, tv=True) AllVertex = mc.ls(AllVertex,fl=1) num_edges = 0 for vertex in AllVertex: edges = mc.polyListComponentConversion(vertex, te=True) num_edges = len(mc.ls(edges, fl=True)) if num_edges == 5: fiveEdgeFaceList.append(s) if fiveEdgeFaceList: mc.select(fiveEdgeFaceList) mc.sets(fiveEdgeFaceList, rm= "sortFaceKeep") cornerTopoB() try: mc.select('sortFaceKeep') CMD = 'doMenuComponentSelectionExt("' + meshName+ '", "facet", 0);' mel.eval(CMD) except: mc.select(meshName) def cornerTopoB(): if mc.objExists('secFaceKeep'): mc.delete('secFaceKeep') selFace = mc.ls(sl=1,fl=1) recordRemoveList = [] recordSecondFacesList = [] recordConnetCVList = [] for s in selFace: AllVertex = mc.polyListComponentConversion(s, tv=True) AllVertex = mc.ls(AllVertex,fl=1) vertices_with_5_edges = [] adjVertex = [] removeList = [] for vertex in AllVertex: edges = mc.polyListComponentConversion(vertex, te=True) num_edges = len(mc.ls(edges, fl=True)) if num_edges == 5: vertices_with_5_edges.append(vertex) mc.select(vertices_with_5_edges) mc.ConvertSelectionToEdges() mc.ConvertSelectionToVertices() checkVertex = mc.ls(sl=1,fl=1) adjVertex = list(set(AllVertex) - set(checkVertex)) connectVertex = list(set(AllVertex) - set(vertices_with_5_edges)- set(adjVertex)) recordConnetCVList.append(adjVertex[0]) recordConnetCVList.append(vertices_with_5_edges[0]) removeList = removeList + connectVertex + vertices_with_5_edges checkA = mc.polyListComponentConversion(adjVertex, te=True) checkB = mc.polyListComponentConversion(checkA, tv=True) checkB = mc.ls(checkB,fl=1) checkC = list(set(checkB) - set(AllVertex)) checkDA = mc.polyListComponentConversion(checkC[0], te=True) checkDAB = mc.polyListComponentConversion(checkDA, tv=True) checkDAB = mc.ls(checkDAB,fl=1) checkEA = mc.polyListComponentConversion(checkC[1], te=True) checkEAB = mc.polyListComponentConversion(checkEA, tv=True) checkEAB = mc.ls(checkEAB,fl=1) adjFar = list(set(checkDAB) & set(checkEAB)) mc.select(adjFar,checkC) mc.ConvertSelectionToContainedFaces() getF = mc.ls(sl=1,fl=1)[0] recordSecondFacesList.append(getF) mc.select(removeList) mc.select(adjFar,d=1) mc.ConvertSelectionToContainedEdges() mc.SelectEdgeLoopSp() removeEdgeList= mc.ls(sl=1,fl=1) recordRemoveList = recordRemoveList + removeEdgeList mc.select(cl=1) mc.select(recordSecondFacesList) mc.sets(name="secFaceKeep", text="secFaceKeep") mc.select(recordConnetCVList) mc.polyConnectComponents() mc.select(recordRemoveList) mc.polyDelEdge(cv=1) if mc.objExists('secFaceKeep'): mc.delete('secFaceKeep') def cornerTopoL(): if mc.objExists('secFaceKeep'): mc.delete('secFaceKeep') selFace = mc.ls(sl=1,fl=1) mc.sets(name="secFaceKeep", text="secFaceKeep") recordConnetCVList = [] recordAdjCVList = [] recordOutCVList = [] meshName = selFace[0].split('.')[0] mc.select(meshName) mc.polySelectConstraint(mode=3, type=0x8000, where=1) checkHole = mc.ls(sl=1,fl=1) mc.polySelectConstraint(disable=True) for s in selFace: AllVertex = mc.polyListComponentConversion(s, tv=True) AllVertex = mc.ls(AllVertex,fl=1) verticesLessEdges = '' maxEdgeNo = 100000 for vertex in AllVertex: edges = mc.polyListComponentConversion(vertex, te=True) num_edges = len(mc.ls(edges, fl=True)) if num_edges < maxEdgeNo: maxEdgeNo = num_edges verticesLessEdges = vertex mc.select(verticesLessEdges) mc.ConvertSelectionToEdges() mc.ConvertSelectionToVertices() checkVertex = mc.ls(sl=1,fl=1) adjVertex = list(set(AllVertex) - set(checkVertex)) connectVertex = list(set(AllVertex) - set(adjVertex)) connectVertex.remove(verticesLessEdges) recordAdjCVList.append(adjVertex[0]) recordConnetCVList.append(connectVertex[0]) recordConnetCVList.append(connectVertex[1]) recordOutCVList.append(verticesLessEdges) mc.select(cl=1) mc.select(recordAdjCVList,recordOutCVList) mc.polyConnectComponents() mc.select('secFaceKeep') oldFaceNewEdge = mc.polyListComponentConversion(te=True) oldFaceNewEdge = mc.ls(oldFaceNewEdge,fl=1) mc.select(recordAdjCVList,recordConnetCVList) mc.ConvertSelectionToContainedEdges() if len(selFace) == 1: if len(checkHole) > 0: mc.SelectEdgeLoopSp() if len(selFace) > 1: mc.SelectEdgeLoopSp() mc.polyDelEdge(cv=1) if mc.objExists('secFaceKeep'): mc.delete('secFaceKeep') cornerKiller()