198 lines
6.5 KiB
Python
198 lines
6.5 KiB
Python
|
""" Yet another UV transfer command """
|
||
|
|
||
|
import sys
|
||
|
from maya.api import OpenMaya
|
||
|
|
||
|
|
||
|
kPluginCmdName = "transferUV"
|
||
|
kPluginVersion = "0.0.3"
|
||
|
kPluginAuthor = "Michi Inoue"
|
||
|
kSourceUvSetFlag = "-suv"
|
||
|
kSourceUvSetFlagLong = "-sourceUvSet"
|
||
|
kTargetUvSetFlag = "-tuv"
|
||
|
kTargetUvSetFlagLong = "-targetUvSet"
|
||
|
kSourceMeshFlag = "-sm"
|
||
|
kSourceMeshFlagLong = "-sourceMesh"
|
||
|
kTargetMeshFlag = "-tm"
|
||
|
kTargetMeshFlagLong = "-targetMesh"
|
||
|
|
||
|
|
||
|
class TransferUV(OpenMaya.MPxCommand):
|
||
|
|
||
|
def __init__(self):
|
||
|
super(TransferUV, self).__init__()
|
||
|
|
||
|
self.sourceMesh = None
|
||
|
self.targetMesh = None
|
||
|
self.sourceUvSet = None
|
||
|
self.targetUvSet = None
|
||
|
|
||
|
def doIt(self, args):
|
||
|
|
||
|
# Parse the arguments.
|
||
|
argData = OpenMaya.MArgDatabase(self.syntax(), args)
|
||
|
try:
|
||
|
self.cmdArg = argData.commandArgumentString(0)
|
||
|
except RuntimeError:
|
||
|
pass
|
||
|
|
||
|
if argData.isFlagSet(kSourceMeshFlag):
|
||
|
argList = argData.getFlagArgumentList(kSourceMeshFlag, 0)
|
||
|
self.sourceMesh = argList.asString(0)
|
||
|
|
||
|
if argData.isFlagSet(kTargetMeshFlag):
|
||
|
argList = argData.getFlagArgumentList(kTargetMeshFlag, 0)
|
||
|
self.targetMesh = argList.asString(0)
|
||
|
|
||
|
if argData.isFlagSet(kSourceUvSetFlag):
|
||
|
argList = argData.getFlagArgumentList(kSourceUvSetFlag, 0)
|
||
|
self.sourceUvSet = argList.asString(0)
|
||
|
|
||
|
if argData.isFlagSet(kTargetUvSetFlag):
|
||
|
argList = argData.getFlagArgumentList(kTargetUvSetFlag, 0)
|
||
|
self.targetUvSet = argList.asString(0)
|
||
|
|
||
|
if self.sourceUvSet is None:
|
||
|
self.sourceUvSet = "map1"
|
||
|
|
||
|
if self.targetUvSet is None:
|
||
|
self.targetUvSet = "map1"
|
||
|
|
||
|
mSel = OpenMaya.MGlobal.getActiveSelectionList()
|
||
|
numSel = mSel.length()
|
||
|
|
||
|
if self.sourceMesh is None and numSel < 2:
|
||
|
OpenMaya.MGlobal.displayWarning(
|
||
|
(""" Source mesh and target mesh are not specifiied, or not enough objs are """
|
||
|
"""selected. Specify source and target in the arguments or select two objs"""))
|
||
|
return
|
||
|
|
||
|
if self.sourceMesh is None:
|
||
|
try:
|
||
|
self.sourceDagPath = mSel.getDagPath(0)
|
||
|
print("Source mesh is not given in the arguments. Using {} as a source mesh.".format(self.sourceDagPath.fullPathName()))
|
||
|
except RuntimeError:
|
||
|
OpenMaya.MGlobal.displayWarning(
|
||
|
"Failed to set source DagPath. Select source mesh first, then target mesh")
|
||
|
return
|
||
|
else:
|
||
|
try:
|
||
|
mSel.add(self.sourceMesh)
|
||
|
self.sourceDagPath = mSel.getDagPath(0)
|
||
|
except RuntimeError:
|
||
|
OpenMaya.MGlobal.displayWarning("Object doesn't exist")
|
||
|
return
|
||
|
|
||
|
if self.targetMesh is None:
|
||
|
try:
|
||
|
self.targetDagPath = mSel.getDagPath(1)
|
||
|
print("Target mesh is not given in the arguments. Using {} as a target mesh.".format(self.targetDagPath.fullPathName()))
|
||
|
except RuntimeError:
|
||
|
OpenMaya.MGlobal.displayWarning(
|
||
|
"Failed to set target DagPath. Select source mesh first, then target mesh")
|
||
|
return
|
||
|
else:
|
||
|
try:
|
||
|
mSel.add(self.targetMesh)
|
||
|
self.targetDagPath = mSel.getDagPath(1)
|
||
|
except RuntimeError:
|
||
|
OpenMaya.MGlobal.displayWarning("Object doesn't exist")
|
||
|
return
|
||
|
|
||
|
print("Copying uv from {} to {}".format(
|
||
|
self.sourceDagPath.fullPathName(),
|
||
|
self.targetDagPath.fullPathName()))
|
||
|
|
||
|
self.redoIt()
|
||
|
|
||
|
def redoIt(self):
|
||
|
|
||
|
sourceFnMesh = OpenMaya.MFnMesh(self.sourceDagPath)
|
||
|
targetFnMesh = OpenMaya.MFnMesh(self.targetDagPath)
|
||
|
|
||
|
# Store the original UV data for undo
|
||
|
self.origUArray, self.origVArray = targetFnMesh.getUVs(self.targetUvSet)
|
||
|
self.origUvCounts, self.origUvIds = targetFnMesh.getAssignedUVs(self.targetUvSet)
|
||
|
|
||
|
# Get source UV data to transfer to the target mesh
|
||
|
srcUArray, srcVArray = sourceFnMesh.getUVs(self.sourceUvSet)
|
||
|
srcUvCounts, srcUvIds = sourceFnMesh.getAssignedUVs(self.sourceUvSet)
|
||
|
|
||
|
# Clear target UVs before transfer in order to shrink the uvs array if number of source UVs
|
||
|
# are smaller than that of target UVs
|
||
|
targetFnMesh.clearUVs(self.targetUvSet)
|
||
|
|
||
|
targetFnMesh.setUVs(srcUArray, srcVArray, self.targetUvSet)
|
||
|
targetFnMesh.assignUVs(srcUvCounts, srcUvIds, self.targetUvSet)
|
||
|
|
||
|
def undoIt(self):
|
||
|
undoMesh = OpenMaya.MFnMesh(self.targetDagPath)
|
||
|
|
||
|
# Clear target UVs before transfer in order to shrink the uvs array if number of source UVs
|
||
|
# are smaller than that of target UVs
|
||
|
undoMesh.clearUVs(self.targetUvSet)
|
||
|
undoMesh.setUVs(self.origUArray, self.origVArray, self.targetUvSet)
|
||
|
undoMesh.assignUVs(self.origUvCounts, self.origUvIds, self.targetUvSet)
|
||
|
|
||
|
def isUndoable(self):
|
||
|
return True
|
||
|
|
||
|
@staticmethod
|
||
|
def cmdCreator():
|
||
|
return TransferUV()
|
||
|
|
||
|
|
||
|
def syntaxCreator():
|
||
|
""" Syntax creator
|
||
|
|
||
|
Return:
|
||
|
syntax (OpenMaya.MSyntax): return value
|
||
|
|
||
|
"""
|
||
|
syntax = OpenMaya.MSyntax()
|
||
|
syntax.addArg(OpenMaya.MSyntax.kString)
|
||
|
syntax.addFlag(kSourceUvSetFlag, kSourceUvSetFlagLong, OpenMaya.MSyntax.kString)
|
||
|
syntax.addFlag(kTargetUvSetFlag, kTargetUvSetFlagLong, OpenMaya.MSyntax.kString)
|
||
|
syntax.addFlag(kSourceMeshFlag, kSourceMeshFlagLong, OpenMaya.MSyntax.kString)
|
||
|
syntax.addFlag(kTargetMeshFlag, kTargetMeshFlagLong, OpenMaya.MSyntax.kString)
|
||
|
return syntax
|
||
|
|
||
|
|
||
|
def maya_useNewAPI():
|
||
|
"""
|
||
|
The presence of this function tells Maya that the plugin produces, and
|
||
|
expects to be passed, objects created using the Maya Python API 2.0.
|
||
|
"""
|
||
|
pass
|
||
|
|
||
|
|
||
|
def initializePlugin(mObject):
|
||
|
""" Initialize the script plug-in
|
||
|
|
||
|
Args:
|
||
|
mObject (OpenMaya.MObject):
|
||
|
|
||
|
"""
|
||
|
mplugin = OpenMaya.MFnPlugin(mObject, kPluginAuthor, kPluginVersion, "Any")
|
||
|
try:
|
||
|
mplugin.registerCommand(
|
||
|
kPluginCmdName, TransferUV.cmdCreator, syntaxCreator)
|
||
|
except Exception:
|
||
|
sys.stderr.write("Failed to register command: %s\n" % kPluginCmdName)
|
||
|
raise
|
||
|
|
||
|
|
||
|
def uninitializePlugin(mObject):
|
||
|
""" Uninitialize the script plug-in
|
||
|
|
||
|
Args:
|
||
|
mObject (OpenMaya.MObject):
|
||
|
|
||
|
"""
|
||
|
mplugin = OpenMaya.MFnPlugin(mObject)
|
||
|
try:
|
||
|
mplugin.deregisterCommand(kPluginCmdName)
|
||
|
except Exception:
|
||
|
sys.stderr.write("Failed to unregister command: %s\n" % kPluginCmdName)
|
||
|
raise
|