Files
MetaBox/Scripts/Modeling/Edit/LDMT/ldmt_function/ldmt_morphToUV.py
2025-04-17 04:52:48 +08:00

75 lines
2.6 KiB
Python

import maya.cmds as cmds
import maya.mel as mel
import maya.api.OpenMaya as om2
def deleteNoUV():
selObj = cmds.ls(sl=1,o=1)
selObj = selObj[0]
selObj_face = selObj + '.f[*]'
selObj_face = cmds.ls(selObj_face, fl=1)
selObj_uv = cmds.polyListComponentConversion(selObj,tuv=1)
selObj_face_hasUV = cmds.polyListComponentConversion(selObj_uv,tf=1)
selObj_face_hasUV = cmds.ls(selObj_face_hasUV, fl=1)
selObj_face_noUV = list(set(selObj_face).difference(set(selObj_face_hasUV)))
if selObj_face_noUV:
cmds.delete(selObj_face_noUV)
return selObj
def splitIfOnUVBorder():
sel = cmds.ls(sl=1,o=1)
sel = sel[0]
selList = om2.MGlobal.getActiveSelectionList()
selListPath = selList.getDagPath(0)
vertIt = om2.MItMeshVertex(selListPath)
selMesh = om2.MFnMesh(selListPath)
vertIdToSplit = []
vertToSplit = []
while not vertIt.isDone():
uvIndices = vertIt.getUVIndices()
uvIndices = list(set(uvIndices))
if len(uvIndices)>=2:
vertIdToSplit.append(vertIt.index())
elif vertIt.onBoundary():
vertIdToSplit.append(vertIt.index())
vertIt.next()
for i in range(len(vertIdToSplit)):
vertToSplit.append(sel+'.vtx['+str(vertIdToSplit[i])+']')
cmds.polySplitVertex(vertToSplit,cch=0)
def morph2UV():
sel = cmds.ls(sl=1,o=1)
sel = sel[0]
selList = om2.MSelectionList()
selList.add(sel)
path = selList.getDagPath(0)
myMesh = om2.MFnMesh(path)
newPointArray = om2.MPointArray()
space = om2.MSpace.kWorld
myMesh_UVs = myMesh.getUVs()
myMesh_points = myMesh.getPoints()
# for i in range(myMesh.numVertices):
myMesh_itVertex = om2.MItMeshVertex(path)
points = om2.MPointArray()
while not myMesh_itVertex.isDone():
vertIndex = myMesh_itVertex.index()
gotUV = myMesh_itVertex.getUV()
point = om2.MPoint(gotUV[0],gotUV[1],0)
points.append(point)
myMesh_itVertex.next()
myMesh.setPoints(points,space)
def runMorph2UV():
baseObj = cmds.ls(sl=1,o=1) #1. inputmesh
baseObjDup = cmds.duplicate() #2. duplicate
mel.eval("FreezeTransformations")
mel.eval("ResetTransformations")
baseObj = baseObjDup[0]
deleteNoUV()
splitIfOnUVBorder()
morph2UV()
currentSelection = cmds.ls(sl=1)
currentUV = cmds.polyListComponentConversion(currentSelection,tuv=1)
cmds.polyMergeVertex(currentSelection,d=0.0001,cch=0)
cmds.polyMergeUV(currentUV,d=0.001,cch=0) # fix split
cmds.select(baseObj,r=1)
if __name__ == "__main__":
runMorph2UV()