Files
Nexus/2025/scripts/modeling_tools/cornerkiller.py
2025-12-05 08:08:44 +08:00

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()