187 lines
4.5 KiB
Python
187 lines
4.5 KiB
Python
""" docstring """
|
|
|
|
import pickle
|
|
from maya import OpenMaya
|
|
from maya import OpenMayaUI
|
|
from maya import OpenMayaAnim
|
|
from maya import cmds
|
|
from PySide2 import QtWidgets, QtCore
|
|
import shiboken2
|
|
|
|
|
|
def getClusterFromMesh():
|
|
""" docstring """
|
|
|
|
sel = OpenMaya.MSelectionList()
|
|
OpenMaya.MGlobal.getActiveSelectionList(sel)
|
|
dagPath = OpenMaya.MDagPath()
|
|
sel.getDagPath(0, dagPath)
|
|
dagPath.extendToShape()
|
|
|
|
conns = cmds.listConnections(dagPath.fullPathName())
|
|
clusters = [i for i in conns if cmds.objectType(i) == "cluster"]
|
|
|
|
if len(clusters) == 0:
|
|
cmds.warning("No clusters found")
|
|
return
|
|
|
|
firstCluster = clusters[0]
|
|
|
|
return firstCluster
|
|
|
|
|
|
def getClusterWeights(meshName, clusterName=None):
|
|
""" asdf """
|
|
|
|
sel = OpenMaya.MSelectionList()
|
|
sel.add(meshName)
|
|
|
|
if clusterName is None:
|
|
sel.add(getClusterFromMesh())
|
|
else:
|
|
sel.add(clusterName)
|
|
|
|
dagPath = OpenMaya.MDagPath()
|
|
mObj = OpenMaya.MObject()
|
|
sel.getDagPath(0, dagPath)
|
|
sel.getDependNode(1, mObj)
|
|
|
|
fn_c = OpenMaya.MFnSingleIndexedComponent()
|
|
c_obj = fn_c.create(OpenMaya.MFn.kMeshVertComponent)
|
|
|
|
fnMesh = OpenMaya.MFnMesh(dagPath)
|
|
numVerts = fnMesh.numVertices()
|
|
|
|
indexArray = OpenMaya.MIntArray()
|
|
|
|
for i in range(numVerts):
|
|
indexArray.append(i)
|
|
fn_c.addElements(indexArray)
|
|
|
|
cluster = OpenMayaAnim.MFnWeightGeometryFilter()
|
|
cluster.setObject(mObj)
|
|
floatArray = OpenMaya.MFloatArray()
|
|
cluster.getWeights(dagPath, c_obj, floatArray)
|
|
|
|
return floatArray
|
|
|
|
def setClusterWeights(meshName, weights, clusterName=None):
|
|
""" asdf """
|
|
|
|
sel = OpenMaya.MSelectionList()
|
|
sel.add(meshName)
|
|
|
|
if clusterName is None:
|
|
sel.add(getClusterFromMesh())
|
|
else:
|
|
sel.add(clusterName)
|
|
|
|
dagPath = OpenMaya.MDagPath()
|
|
mObj = OpenMaya.MObject()
|
|
sel.getDagPath(0, dagPath)
|
|
sel.getDependNode(1, mObj)
|
|
|
|
fn_c = OpenMaya.MFnSingleIndexedComponent()
|
|
c_obj = fn_c.create(OpenMaya.MFn.kMeshVertComponent)
|
|
|
|
fnMesh = OpenMaya.MFnMesh(dagPath)
|
|
numVerts = fnMesh.numVertices()
|
|
|
|
indexArray = OpenMaya.MIntArray()
|
|
|
|
for i in range(numVerts):
|
|
indexArray.append(i)
|
|
fn_c.addElements(indexArray)
|
|
|
|
cluster = OpenMayaAnim.MFnWeightGeometryFilter()
|
|
cluster.setObject(mObj)
|
|
cluster.setWeight(dagPath, c_obj, weights)
|
|
|
|
|
|
def readSymData(path):
|
|
""" Read sym data file """
|
|
|
|
try:
|
|
with open(path, 'rb') as handle:
|
|
data = pickle.load(handle)
|
|
return data
|
|
except IOError:
|
|
print "No such file"
|
|
|
|
|
|
class Window(QtWidgets.QWidget):
|
|
""" class document """
|
|
|
|
def __init__(self, parent=None):
|
|
super(Window, self).__init__(parent)
|
|
|
|
self.setWindowTitle("Mirror Cluster Weights")
|
|
self.setWindowFlags(QtCore.Qt.Window)
|
|
self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
|
|
|
|
self.lineEdit = QtWidgets.QLineEdit()
|
|
self.setButton = QtWidgets.QPushButton("Set")
|
|
self.setButton.clicked.connect(self.setData)
|
|
self.mirrorButton = QtWidgets.QPushButton("Mirror")
|
|
self.mirrorButton.clicked.connect(self.mirror)
|
|
|
|
layout = QtWidgets.QVBoxLayout()
|
|
layout.addWidget(self.lineEdit)
|
|
layout.addWidget(self.setButton)
|
|
layout.addWidget(self.mirrorButton)
|
|
|
|
self.setLayout(layout)
|
|
|
|
|
|
def setData(self):
|
|
""" Read sym data file """
|
|
|
|
options = QtWidgets.QFileDialog.DontUseNativeDialog
|
|
fileName, _ = QtWidgets.QFileDialog.getOpenFileName(
|
|
self,
|
|
"QFileDialog.getOpenFileName()",
|
|
"",
|
|
"All Files (*);;JSON Files (*.json)",
|
|
options=options)
|
|
|
|
if fileName:
|
|
try:
|
|
# with open(fileName, 'rb') as handle:
|
|
# data = pickle.load(handle)
|
|
self.lineEdit.setText(fileName)
|
|
except IOError:
|
|
print "No such file"
|
|
|
|
def mirror(self):
|
|
""" mirror """
|
|
|
|
sel = cmds.ls(sl=True, fl=True, long=True)[0]
|
|
data = readSymData(self.lineEdit.text())
|
|
|
|
weights = getClusterWeights(sel)
|
|
|
|
for leftIndex in data:
|
|
rightIndex = data[leftIndex]
|
|
leftValue = weights[leftIndex]
|
|
weights.set(leftValue, rightIndex)
|
|
|
|
setClusterWeights(sel, weights)
|
|
|
|
|
|
def getMayaWindow():
|
|
""" Get maya main window """
|
|
|
|
ptr = OpenMayaUI.MQtUtil.mainWindow()
|
|
return shiboken2.wrapInstance(long(ptr), QtWidgets.QMainWindow)
|
|
|
|
|
|
def main():
|
|
""" main """
|
|
|
|
w = Window(getMayaWindow())
|
|
w.show()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|