Quick example working with OpenMaya.MFnMesh setUV and assignUV.
Limitation : works only on objects with no construction history.
Download : apiGenerateUV.zip

import maya.cmds as cmds
import maya.OpenMaya as OpenMaya
import random
def main():
runOnSelected( )
def runOnSelected( ):
m_list = OpenMaya.MSelectionList()
OpenMaya.MGlobal.getActiveSelectionList( m_list )
m_listIt = OpenMaya.MItSelectionList( m_list )
while not m_listIt.isDone():
m_path = OpenMaya.MDagPath() # will hold a path to the selected object
if (OpenMaya.MItSelectionList.kDagSelectionItem == m_listIt.itemType()):
m_listIt.getDagPath( m_path )
if ( m_path.hasFn( OpenMaya.MFn.kMesh )):
runItem( m_path )
m_listIt.next()
def runItem( m_path ):
# works only if object has no construction history
cmds.bakePartialHistory( m_path.fullPathName() ,prePostDeformers=True )
#OpenMaya.MGlobal.executeCommand('doBakeNonDefHistory( 1, {"prePost" });')
# copy map1 to map2
m_uvSetStr = cleanupUVSets( m_path )
# get function set to the m_path
m_fnMesh = OpenMaya.MFnMesh( m_path )
m_fnMesh.setCurrentUVSetName(m_uvSetStr)
# generate uv id's
m_uvIds = OpenMaya.MIntArray(m_fnMesh.numFaceVertices())
m_uvCounts = OpenMaya.MIntArray(m_fnMesh.numPolygons())
m_uvIndex = 0
m_uvCountsIndex = 0
m_itPoly = OpenMaya.MItMeshPolygon(m_path)
while not m_itPoly.isDone():
m_polygonIndex = m_itPoly.index()
m_polygonVertices = OpenMaya.MIntArray()
m_itPoly.getVertices( m_polygonVertices )
m_uvCounts[m_uvCountsIndex] = m_itPoly.polygonVertexCount()
m_uvCountsIndex += 1
m_curIndex = m_uvIndex
m_localVertId = 0
for m_polyVertex in m_polygonVertices:
m_uvIds[m_uvIndex] = m_curIndex + m_localVertId
m_uvIndex += 1
m_localVertId +=1
m_itPoly.next()
# generate random uv's
# per face per vertex
m_uvIndex = 0
m_itPoly = OpenMaya.MItMeshPolygon( m_path )
while not m_itPoly.isDone():
m_polygonIndex = m_itPoly.index()
m_polygonVertices = OpenMaya.MIntArray()
m_itPoly.getVertices( m_polygonVertices )
m_localVertId = 0
for m_polyVertex in m_polygonVertices:
# first setUV(uvId,u,v,uvSetStr)
m_fnMesh.setUV( m_uvIds[m_uvIndex], random.random(), random.random(), m_uvSetStr )
# second assignUV(polygonId,vertexIndex,uvId,uvSetStr)
m_fnMesh.assignUV( m_polygonIndex, m_localVertId, m_uvIds[m_uvIndex], m_uvSetStr )
# ----------
m_uvIndex += 1
m_localVertId +=1
m_itPoly.next()
m_fnMesh.updateSurface()
def cleanupUVSets( m_path ):
# keep only 1st uvSet
m_fnMesh = OpenMaya.MFnMesh( m_path )
m_list = []
m_fnMesh.getUVSetNames(m_list)
if (len(m_list) > 1):
for i in range(1,len(m_list)):
m_fnMesh.deleteUVSet(m_list[i])
# create empty uvSet
#m_uvSetStr = m_fnMesh.createUVSetWithName("map2")
m_uvSetStr = m_fnMesh.copyUVSetWithName(m_list[0],'map2')
return m_uvSetStr
main()