Right basically I've got to submit this tomorrow and I'm new to Python and have no idea what any of it means. I've been provided with a MAYA file and this script that is used within it. I know the code is not yet complete, but could anyone possibly add comments to all of the necessary lines of code explaining what they do within MAYA? would be a great help thanks (Also sorry about the format of the script not being correct and not showing indents and such correctly, I can't add the text with it keeping its original layout)
import maya.cmds as mc #imports MEL commands as Python wrapper
import os #importing operate system preferences
import copy
dirPath = ""#declares variable as string
def importFBX(_filepath): #defines importFBX as a file directory
global dirPath
#http://help.autodesk.com/cloudhelp/2016/ENU/Maya-Tech-Docs/CommandsPython/file.html
try:
cmds.file(_filepath, i = True, type = "FBX")
path, filename = os.path.split(_filepath) #runs file
return True
except RuntimeError:
pass
try:
_filepath = dirPath + "\\" +_filepath
cmds.file(_filepath, i = True, type = "FBX")
path, filename = os.path.split(_filepath)
return True
except RuntimeError as er:
print "unable to import FBX file: %s . File may be missing or corrupted" % _filepath
print er
return False
def cd(_newPath):
global dirPath
dirPath = str(_newPath)
def loadExpressions(_path = ""):
global dirPath
expressions = {} # dictionary of dictionaries
f = open(_path + '\\expressions.txt', 'r')
currentExpressionId = ''
currentTarget = ''
currentExpression = {}
for line in f:
line = line[:-1]
print "line:" + line
print "exId:" + currentExpressionId
print "skId:" + currentTarget
if line == "EXID":
currentExpressionId = ''
elif currentExpressionId == '':
currentExpressionId = str(line)
elif currentTarget == '':
strs = str(line).split(':')
num = len(strs)
currentTarget = strs[num-1]
else:
currentExpression[currentTarget] = float(line)
expressions[currentExpressionId] = {}
expressions[currentExpressionId] = copy.deepcopy(currentExpression)
currentTarget = ''
print("ShapeKey added")
f.close()
print ("expression dict")
print (expressions)
print ("------")
return expressions
def writeExpression(name, _path = ""):
global dirPath
if _path == "":
_path = dirPath + '\expressions.txt'
f = open(_path, 'a')
f.write("EXID\n" + str(name) + "\n")
blendShapes = mc.ls(type = 'blendShape', an=True)
print (blendShapes)
for blend in blendShapes:
f.write(generateExpressionString(blend))
f.close()
def generateExpressionString(_blend):
global dirPath
expressionString = ""
expressions = mc.listAttr(_blend + '.w', m = True)
#print (expressions)
for i in expressions:
weight = mc.getAttr(_blend + '.' + i)
expressionString += _blend.lstrip(":") + ".%s\n" % i
expressionString += "%s\n" % weight
return expressionString
def generateBlendShapeTarget(_expressionID, _expression, _basemodel):
global dirPath
print('Building %s expression' %_expressionID)
for AU in _expression: # Action Unit
try:
mc.setAttr(AU, _expression[AU])
except RuntimeError as err:
print(err)
# try:
# with parent name appended
# will need to do a search for it
pass
tempObjs = mc.duplicate( _basemodel , n=_expressionID)
tempObjId = mc.bakePartialHistory( tempObjs, preCache=True )
for AU in _expression: # Action Unit
try:
mc.setAttr(AU, 0.0)
except RuntimeError as err:
print(err)
pass
print('successfully built %s expression' %_expressionID)
return tempObjs
def buildShapeKeyExpressions():
global dirPath #defines "buildshapekeyExpressions as a global variable so it can be called upon in the entire script
objs = mc.ls( selection=True, sn=True)
if len(objs) == 0:
mc.select( clear=True )
geometry = mc.ls(geometry=True)
transforms = mc.listRelatives(geometry, p=True, path=True)
mc.select(geometry, r=True)
objs = mc.ls( selection=True, sn=True)
if len(objs) == 0:
mc.error("no poly objects detected")
expressions = loadExpressions(dirPath)
oldexpressions = blendShapes = mc.ls(type = 'blendShape', an=True)
try:
finalObj = mc.polyUnite( *objs, o=True, ch=True, n='character' );
except RuntimeError:
print("Error: unable to Unite objects, are non-poly obects selected?")# print error message
mc.select( clear=True )
print("creating BlendShape targets")
#print(expressions)
newObjs = [];
for exID in expressions:
#print(exID)
#print(expressions[exID])
newObjs = generateBlendShapeTarget(exID, expressions[exID], finalObj[0])
mc.select( newObjs[0], add=True ) #create a new blend shape and selects it
mc.select( finalObj[0], add=True ) #
mc.blendShape(n='Expressions') # build shape keys, last selected object is base
mc.select( finalObj[0], d=True ) # deselect the final obj
for old in oldexpressions:
mc.select(old, add=True)#loop that selects old and adds a true value
mc.delete(mc.ls( selection=True, sn=True)) # delete all inbetween objects
mc.select( clear=True )
print("Done :)")#displays "Done :)"
cmds.showWindow()#shows window
CreateWindow()#creates window
import maya.cmds as mc #imports MEL commands as Python wrapper
import os #importing operate system preferences
import copy
dirPath = ""#declares variable as string
def importFBX(_filepath): #defines importFBX as a file directory
global dirPath
#http://help.autodesk.com/cloudhelp/2016/ENU/Maya-Tech-Docs/CommandsPython/file.html
try:
cmds.file(_filepath, i = True, type = "FBX")
path, filename = os.path.split(_filepath) #runs file
return True
except RuntimeError:
pass
try:
_filepath = dirPath + "\\" +_filepath
cmds.file(_filepath, i = True, type = "FBX")
path, filename = os.path.split(_filepath)
return True
except RuntimeError as er:
print "unable to import FBX file: %s . File may be missing or corrupted" % _filepath
print er
return False
def cd(_newPath):
global dirPath
dirPath = str(_newPath)
def loadExpressions(_path = ""):
global dirPath
expressions = {} # dictionary of dictionaries
f = open(_path + '\\expressions.txt', 'r')
currentExpressionId = ''
currentTarget = ''
currentExpression = {}
for line in f:
line = line[:-1]
print "line:" + line
print "exId:" + currentExpressionId
print "skId:" + currentTarget
if line == "EXID":
currentExpressionId = ''
elif currentExpressionId == '':
currentExpressionId = str(line)
elif currentTarget == '':
strs = str(line).split(':')
num = len(strs)
currentTarget = strs[num-1]
else:
currentExpression[currentTarget] = float(line)
expressions[currentExpressionId] = {}
expressions[currentExpressionId] = copy.deepcopy(currentExpression)
currentTarget = ''
print("ShapeKey added")
f.close()
print ("expression dict")
print (expressions)
print ("------")
return expressions
def writeExpression(name, _path = ""):
global dirPath
if _path == "":
_path = dirPath + '\expressions.txt'
f = open(_path, 'a')
f.write("EXID\n" + str(name) + "\n")
blendShapes = mc.ls(type = 'blendShape', an=True)
print (blendShapes)
for blend in blendShapes:
f.write(generateExpressionString(blend))
f.close()
def generateExpressionString(_blend):
global dirPath
expressionString = ""
expressions = mc.listAttr(_blend + '.w', m = True)
#print (expressions)
for i in expressions:
weight = mc.getAttr(_blend + '.' + i)
expressionString += _blend.lstrip(":") + ".%s\n" % i
expressionString += "%s\n" % weight
return expressionString
def generateBlendShapeTarget(_expressionID, _expression, _basemodel):
global dirPath
print('Building %s expression' %_expressionID)
for AU in _expression: # Action Unit
try:
mc.setAttr(AU, _expression[AU])
except RuntimeError as err:
print(err)
# try:
# with parent name appended
# will need to do a search for it
pass
tempObjs = mc.duplicate( _basemodel , n=_expressionID)
tempObjId = mc.bakePartialHistory( tempObjs, preCache=True )
for AU in _expression: # Action Unit
try:
mc.setAttr(AU, 0.0)
except RuntimeError as err:
print(err)
pass
print('successfully built %s expression' %_expressionID)
return tempObjs
def buildShapeKeyExpressions():
global dirPath #defines "buildshapekeyExpressions as a global variable so it can be called upon in the entire script
objs = mc.ls( selection=True, sn=True)
if len(objs) == 0:
mc.select( clear=True )
geometry = mc.ls(geometry=True)
transforms = mc.listRelatives(geometry, p=True, path=True)
mc.select(geometry, r=True)
objs = mc.ls( selection=True, sn=True)
if len(objs) == 0:
mc.error("no poly objects detected")
expressions = loadExpressions(dirPath)
oldexpressions = blendShapes = mc.ls(type = 'blendShape', an=True)
try:
finalObj = mc.polyUnite( *objs, o=True, ch=True, n='character' );
except RuntimeError:
print("Error: unable to Unite objects, are non-poly obects selected?")# print error message
mc.select( clear=True )
print("creating BlendShape targets")
#print(expressions)
newObjs = [];
for exID in expressions:
#print(exID)
#print(expressions[exID])
newObjs = generateBlendShapeTarget(exID, expressions[exID], finalObj[0])
mc.select( newObjs[0], add=True ) #create a new blend shape and selects it
mc.select( finalObj[0], add=True ) #
mc.blendShape(n='Expressions') # build shape keys, last selected object is base
mc.select( finalObj[0], d=True ) # deselect the final obj
for old in oldexpressions:
mc.select(old, add=True)#loop that selects old and adds a true value
mc.delete(mc.ls( selection=True, sn=True)) # delete all inbetween objects
mc.select( clear=True )
print("Done :)")#displays "Done :)"
cmds.showWindow()#shows window
CreateWindow()#creates window