188 lines
6.7 KiB
Python
188 lines
6.7 KiB
Python
##--------------------------------------------------------------------------
|
|
##
|
|
## 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() |