miMayaPlugins/symmetryTable/symCluster.py

187 lines
4.5 KiB
Python
Raw Normal View History

2024-10-01 19:59:07 +08:00
""" 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()