from pyfbsdk import FBApplication, FBSystem, FBFindModelByName, FBBodyNodeId, FBTime, FBTake
import math
import sys
def loadScene(sceneFile):
application = FBApplication()
if (not application.FileOpen(sceneFile, False)):
return False
return True
def getFullPrefix(name):
if len( name.split(":") )>1:
lastPref = name.split(":")[-2]
firstPref = name.split(lastPref)[0]
fullPrefix = firstPref+lastPref
return fullPrefix
else:
return None
def addAllGroupMembers(group, members):
for member in group.Items:
if member.ClassName() == str("FBGroup"):
addAllGroupMembers(member, members)
else:
members.append(member)
def addAllSetMembers(set, members):
for member in set.Items:
if member.ClassName() == str("FBGroup"):
addAllGroupMembers(member, members)
elif member.ClassName() == str("FBSet"):
addAllSetMembers(member, members)
else:
members.append(member)
def getGroupMembers(groupName, members):
for group in FBSystem().Scene.Groups:
if group.Name == groupName.split(":")[-1]:
for item in group.Items:
if not getFullPrefix(item.LongName):
continue
elif getFullPrefix(item.LongName) == groupName.split(":")[-2]:
addAllGroupMembers(group, members)
return
else:
members.append(item)
return
def getSetMembers(setName, members):
for set in FBSystem().Scene.Sets:
if set.Name == setName.split(":")[-1]:
for item in set.Items:
if not getFullPrefix(item.LongName):
continue
elif getFullPrefix(item.LongName) == setName.split(":")[-2]:
addAllSetMembers(set, members)
return
return
def getHierarchy (modelName, models, transModels):
model = FBFindModelByName(modelName)
if not model == None:
if not model.ClassName() == str("FBModel"):
models.append(model)
if not transModels == None:
transModels.append(model)
for child in model.Children:
getHierarchy(child.LongName, models, None)
def getCharacterModels(character, models, transModels):
chars = FBSystem().Scene.Characters
for char in chars:
if char.Name == character:
for nodeID in FBBodyNodeId.values.values():
mod = char.GetModel(nodeID)
if mod != None:
models.append(mod)
if nodeID == FBBodyNodeId.kFBHipsNodeId:
transModels.append(mod)
return
def getModel(modelName, models):
mod = FBFindModelByName(modelName)
if not mod == None:
models.append(mod)
def mineCurve(start, end, fcurve, modifier):
curveData = dict()
counter = start
while counter <= end:
frameTime = FBTime(0,0,0,counter)
value = fcurve.Evaluate(frameTime) * modifier
curveData[frameTime.GetSecondDouble()] = value
counter = counter + 1
return curveData
def exportAnimData(animNodes, prefix, animDataType, start, end, outData, outDataType, modifier = 1.0):
if animNodes == None:
return
for animNode in animNodes:
curveName = prefix + animNode.Name
curveData = mineCurve(start, end, animNode.FCurve, modifier)
outData[curveName] = curveData
outDataType[curveName] = animDataType
exportAnimData(animNode.Nodes, prefix, animDataType, start, end, outData, outDataType)
def exportModels(outFile, models, transModels, startFrame, endFrame):
for mod in models:
mod.Selected = True
take = FBSystem().CurrentTake
take.SetCurrentLayer(0)
period = FBTime(0, 0, 0, 1)
take.PlotTakeOnSelected(period)
for mod in models:
mod.Selected = False
allData = dict()
dataType = dict()
for mod in models:
if mod != None:
print mod.LongName
nodeAnim = mod.AnimationNode
for nodeAnimNode in nodeAnim.Nodes:
if "Lcl Rotation" in nodeAnimNode.Name:
if len(nodeAnimNode.Nodes) > 0:
exportAnimData(nodeAnimNode.Nodes, mod.Name + '_rotate', 'animCurveTA', \
start, end, allData, dataType, math.pi/180.0)
for mod in transModels:
if mod != None:
nodeAnim = mod.AnimationNode
for nodeAnimNode in nodeAnim.Nodes:
if "Lcl Translation" in nodeAnimNode.Name:
if len(nodeAnimNode.Nodes) > 0:
exportAnimData(nodeAnimNode.Nodes, mod.Name + '_translate', 'animCurveTL', \
start, end, allData, dataType)
output = open (outFile, 'w')
output.write('allData=%s\ndataType=%s\n' % (str(allData), str(dataType)))
output.close()
start = 0
end = 100
inFile = 'C:/Temp/myInFile.fbx'
outFile = 'C:/Temp/myOutFile.py'
if not loadScene(inFile):
sys.stderr.write('Could not load file %s' % inFile)
raise Exception('quitting')
models = list()
transModels = list()
getCharacterModels('MyCharacter11', models, transModels)
getCharacterModels('MyCharacter2', models, transModels)
getHierarchy ("MyRootNode1", models, transModels)
getHierarchy ("MyRootNode2", models, transModels)
getGroupMembers("MyNamespace:MyRotGroup1", models)
getGroupMembers("MyNamespace:MyRotGroup2", models)
getGroupMembers("MyNamespace:MyTransGroup2", transModels)
getSetMembers("MyNamespace:MyRotSet1", models)
getSetMembers("MyNamespace:MyRotSet2", models)
getSetMembers("MyNamespace:MyTransSet2", transModels)
getModel("SRC", models)
getModel("myNamespace1:myTrans1", transModels)
getModel("DST", models)
getModel("myNamespace2:myTrans2", transModels)
if len(models) == 0:
sys.stderr.write('No models were found.')
raise Exception('quitting')
exportModels(outFile, models, transModels, start, end)