# Copyright 2009 Autodesk, Inc.  All rights reserved.
# Use of this software is subject to the terms of the Autodesk license agreement 
# provided at the time of installation or download, or which otherwise accompanies
# this software in either electronic or hard copy form.
#
# Script description:
# Create a characterPoseMirror of a pose
#
# Topic: FBTake, FBCharacter, FBCharacterPose, FBPlayerControl, FBKeyControl, FBScene, FBProgress
#

from pyfbsdk import *
import time

#------------------------------------------------------------------
def SwitchTake ( pTakeName ):
    iDestName= pTakeName
    for iTake in lSystem.Scene.Takes:
        if iTake.Name == iDestName:
            lSystem.CurrentTake = iTake

#------------------------------------------------------------------

# find the current character
lApplication = FBApplication()
lCharacter = lApplication.CurrentCharacter

# find the Current take 
lSystem = FBSystem()
lOriginalTake = lSystem.CurrentTake.Name

# get the Player
lPlayer = FBPlayerControl()

# Set the endTime
lEndTime = lSystem.CurrentTake.LocalTimeSpan.GetStop()
lEndFrame = lSystem.CurrentTake.LocalTimeSpan.GetStop().GetFrame(True)
lStartFrameTime = lSystem.CurrentTake.LocalTimeSpan.GetStart()
lStartFrame = lSystem.CurrentTake.LocalTimeSpan.GetStart().GetFrame(True)

# create a new take for new animation
lAnimPoseTake = lOriginalTake + ' mirror ' + str( lSystem.SystemTime.GetTimeString() )
lNewTake = FBTake(lAnimPoseTake)
lNewTake = lNewTake.CopyTake(lAnimPoseTake)

# set pose options 
poseOptions = FBCharacterPoseOptions()
poseOptions.mCharacterPoseKeyingMode = FBCharacterPoseKeyingMode.kFBCharacterPoseKeyingModeFullBody
poseOptions.SetFlag(FBCharacterPoseFlag.kFBCharacterPoseMirror, True)

# set the character keying mode
lCharacter.KeyingMode=FBCharacterKeyingMode.kFBCharacterKeyingFullBody

# start the pose over time sequence
lScene = lSystem.Scene
lStop = int(lEndFrame)
lRange = int(lEndFrame)+1
lTime = lStartFrameTime
lStart = int(lStartFrame)
lProgress = lRange - lStart
FBKeyControl().AutoKey = True

# Create a FBProgress object and set default values for the caption and text.
lFbp = FBProgress()
lFbp.Caption = "Mirroring "
lFbp.Text = "over time ..."
lCount = 0.0

for i in range(lRange):
    ##ENSURE THAT THE TIME IS CORRECT
    timeout = False
    lPlayer.Goto(lTime)
    while not lPlayer.Goto(lTime)or timeout:
        time.sleep(1)
        lSystem.Scene.Evaluate()
        if timeout>5:
            print "Unable to Go to time "+lTime.GetTimeString()
            break
        timeout+=1

    # copy pose    
    poseName = 'CharacterPose_'+str(i)
    targetPose = FBCharacterPose(poseName)

    lSystem.Scene.Evaluate()
    targetPose.CopyPose(lCharacter)

    # Switch to target Take
    SwitchTake(lAnimPoseTake)
    lSystem.Scene.Evaluate()
    targetPose.PastePose(lCharacter, poseOptions )
    lSystem.Scene.Evaluate()
    lPlayer.Key()
    lSystem.Scene.Evaluate()
    # Switch to Original Take
    SwitchTake(lOriginalTake)

    #Delete the pose, 
    targetPose.FBDelete()

    #step forward one frame
    lTime.Set(lTime.Get() + FBTime(0,0,0,1).Get())

    lCount += 1
    lVal = lCount / lProgress * 100
    lFbp.Percent = int(lVal)

lFbp.FBDelete()
SwitchTake(lAnimPoseTake)
lSetTimeSpan = FBTimeSpan(FBTime(0,0,0,lStart),FBTime(0,0,0,lStop) )
lSystem.CurrentTake.LocalTimeSpan = lSetTimeSpan

FBKeyControl().AutoKey = False
lPlayer.GotoStart()


print 'done'