140 lines
3.1 KiB
Python
140 lines
3.1 KiB
Python
import pickle
|
|
from maya import cmds
|
|
from pymel import core as pm
|
|
from functools import partial
|
|
|
|
|
|
PLUGIN_NAME = "symmetryTable.so"
|
|
|
|
|
|
def loadPlugin():
|
|
""" load plugin """
|
|
|
|
if not cmds.pluginInfo("symmetryTable", q=True, loaded=True):
|
|
try:
|
|
cmds.loadPlugin(PLUGIN_NAME)
|
|
print("Plugin loaded successfully")
|
|
except RuntimeError:
|
|
cmds.error("Error loading plugin")
|
|
else:
|
|
print("plugin is already loaded")
|
|
|
|
|
|
def createSymData(*args):
|
|
""" write sym table to a file """
|
|
|
|
# Get file path
|
|
filepath = pm.fileDialog2(fileMode=0, caption="Save sym data")
|
|
if filepath is None:
|
|
return
|
|
filepath = filepath[0]
|
|
|
|
if len(cmds.ls(sl=True)) == 0:
|
|
cmds.warning("Nothing is selected")
|
|
return
|
|
|
|
result = cmds.buildSymmetryTable()
|
|
|
|
# Convret Long to Int
|
|
pp = [int(i) for i in result]
|
|
|
|
# Split two ints to a dict
|
|
# eg. [x, x, x, x, x, x, ...]
|
|
# to..
|
|
# {x: x, x: x, x: x, ...}
|
|
# Key is left verts and values are right verts
|
|
pDict = {}
|
|
pList = [pp[i:i+2] for i in range(0, len(pp), 2)]
|
|
for i in pList:
|
|
pDict[i[0]] = i[1]
|
|
|
|
# Store data (serialize)
|
|
with open(filepath, 'wb') as handle:
|
|
pickle.dump(pDict, handle, protocol=pickle.HIGHEST_PROTOCOL)
|
|
|
|
|
|
def getBlendShapeNodes(*args):
|
|
sel = pm.ls(sl=True, fl=True)
|
|
|
|
blendShapes = []
|
|
|
|
if sel:
|
|
sel = sel[0]
|
|
hist = pm.listHistory(sel)
|
|
for h in hist:
|
|
if isinstance(h, pm.nt.BlendShape):
|
|
blendShapes.append(h)
|
|
|
|
return blendShapes
|
|
|
|
|
|
def mirrorBlendShapeWeights(*args):
|
|
TARGET = "blendShape1.inputTarget[0].baseWeights"
|
|
|
|
textField = args[0]
|
|
symDataPath = textField.getText()
|
|
|
|
numVerts = cmds.polyEvaluate(v=True)
|
|
plug = OpenMaya.MPlug()
|
|
sel = OpenMaya.MSelectionList()
|
|
sel.add(TARGET)
|
|
sel.getPlug(0, plug)
|
|
|
|
weights = []
|
|
|
|
p = OpenMaya.MPlug()
|
|
for i in range(numVerts):
|
|
p = plug.elementByLogicalIndex(i)
|
|
value = p.asFloat()
|
|
weights.append(value)
|
|
|
|
try:
|
|
with open(symDataPath, 'rb') as handle:
|
|
unserialized_data = pickle.load(handle)
|
|
|
|
except IOError:
|
|
print("No such file")
|
|
return
|
|
|
|
for i in unserialized_data:
|
|
leftIndex = i
|
|
leftWeight = weights[leftIndex]
|
|
|
|
rightIndex = unserialized_data[leftIndex]
|
|
weights[rightIndex] = leftWeight
|
|
|
|
for n, i in enumerate(weights):
|
|
p = OpenMaya.MPlug()
|
|
p = plug.elementByLogicalIndex(n)
|
|
p.setFloat(i)
|
|
|
|
|
|
def gui():
|
|
windowName = "symTools"
|
|
if pm.window(windowName, q=True, exists=True):
|
|
pm.deleteUI(windowName)
|
|
|
|
win = pm.window(windowName, title="SymTools")
|
|
pm.columnLayout(adj=True)
|
|
pm.button("Create Sym Data", c=createSymData)
|
|
pm.text("Blend shapes")
|
|
symDataPath = pm.textField()
|
|
pm.button(
|
|
"Mirror blendshape weights",
|
|
command=partial(
|
|
mirrorBlendShapeWeights,
|
|
symDataPath
|
|
))
|
|
win.show()
|
|
|
|
|
|
def main():
|
|
""" main """
|
|
|
|
loadPlugin()
|
|
gui()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|