miMayaPlugins/symmetryTable/symCluster.py
2024-10-01 19:59:07 +08:00

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