Files
gtav-src/tools_ng/techart/sandboxmotionbuilder/Shared/AC_RealTimePhaseCalc.py
T
2025-09-29 00:52:08 +02:00

1405 lines
50 KiB
Python
Executable File

PNG
from pyfbsdk import *
from pyfbsdk_additions import *
from RS.Utils import Scene
from RS.Utils.Scene import Constraint
def FindAnimationNode( pParent, pName ):
lResult = None
for lNode in pParent.Nodes:
if lNode.Name == pName:
lResult = lNode
break
return lResult
def plotOptions():
plot_options = FBPlotOptions()
plot_options.PlotAllTakes = False
plot_options.PlotOnFrame = True
plot_options.PlotPeriod = FBTime(0, 0, 0, 1)
plot_options.RotationFilterToApply = FBRotationFilter.kFBRotationFilterUnroll
plot_options.UseConstantKeyReducer = False
plot_options.ConstantKeyReducerKeepOneKey = True
plot_options.PlotTranslationOnRootOnly = False
return plot_options
def RemoveXandYRotationKeys( object ):
for key in object.Rotation.GetAnimationNode().Nodes[0].FCurve.Keys:
key.Value = 0.0
for key in object.Rotation.GetAnimationNode().Nodes[1].FCurve.Keys:
key.Value = 0.0
def getCharacterHeirarchyList(character):
characterNodeList = []
hips = character.GetModel( FBBodyNodeId.kFBHipsNodeId )
dummy = Scene.GetParent( hips )
Scene.GetChildren( dummy, characterNodeList, "", True )
return characterNodeList
def clearSelection():
''' Clear selection function '''
# Get selected models
modelList = FBModelList ()
FBGetSelectedModels (modelList, None, True)
# Deselect models
for model in modelList:
model.Selected = False
currentCharacter = FBApplication().CurrentCharacter
characterNodeList = getCharacterHeirarchyList(currentCharacter)
OH_Facing = None
Skel_Head = None
# Find required nodes for constraint
for node in characterNodeList:
if node.Name.lower() == 'oh_facingdirection':
OH_Facing = node
elif node.Name.lower() == 'skel_head':
Skel_Head = node
if OH_Facing != None:
print ("Found OH Facing Node")
if Skel_Head != None:
print ("Found Skel_Head Node")
animalAimNull = FBModelNull("Animal_Aim_Null")
animalAimNull.Show = True
animalAimOffsetNull = FBModelNull("Animal_Aim_Offset_Null")
animalAimOffsetNull.Show = True
headPositionConstraint = Constraint.CreateConstraint(Constraint.PARENT_CHILD)
for i in range(0, headPositionConstraint.ReferenceGroupGetCount()):
if headPositionConstraint.ReferenceGroupGetName(i) == 'Constrained object (Child)':
headPositionConstraint.ReferenceAdd(i, animalAimNull )
elif headPositionConstraint.ReferenceGroupGetName(i) == 'Source (Parent)':
headPositionConstraint.ReferenceAdd(i, Skel_Head )
headPositionConstraint.Active = True
headPositionConstraint.PropertyList.Find("%s.Offset T" % Skel_Head.LongName).Data = FBVector3d( 5.0, 0.0, 0.0 )
headPositionOffsetXZConstraint = Constraint.CreateConstraint(Constraint.PARENT_CHILD)
for i in range(0, headPositionOffsetXZConstraint.ReferenceGroupGetCount()):
if headPositionOffsetXZConstraint.ReferenceGroupGetName(i) == 'Constrained object (Child)':
headPositionOffsetXZConstraint.ReferenceAdd(i, animalAimOffsetNull )
elif headPositionOffsetXZConstraint.ReferenceGroupGetName(i) == 'Source (Parent)':
headPositionOffsetXZConstraint.ReferenceAdd(i, animalAimNull )
headPositionOffsetXZConstraint.PropertyList.Find("Affect Rotation X").Data = False
headPositionOffsetXZConstraint.PropertyList.Find("Affect Rotation Y").Data = False
headPositionOffsetXZConstraint.PropertyList.Find("Affect Rotation Z").Data = False
headPositionOffsetXZConstraint.PropertyList.Find("Affect Translation Y").Data = False
headPositionOffsetXZConstraint.Active = True
headPositionOffsetYConstraint = Constraint.CreateConstraint(Constraint.PARENT_CHILD)
for i in range(0, headPositionOffsetYConstraint.ReferenceGroupGetCount()):
if headPositionOffsetYConstraint.ReferenceGroupGetName(i) == 'Constrained object (Child)':
headPositionOffsetYConstraint.ReferenceAdd(i, animalAimOffsetNull )
elif headPositionOffsetYConstraint.ReferenceGroupGetName(i) == 'Source (Parent)':
headPositionOffsetYConstraint.ReferenceAdd(i, OH_Facing )
headPositionOffsetYConstraint.PropertyList.Find("Affect Rotation X").Data = False
headPositionOffsetYConstraint.PropertyList.Find("Affect Rotation Y").Data = False
headPositionOffsetYConstraint.PropertyList.Find("Affect Rotation Z").Data = False
headPositionOffsetYConstraint.PropertyList.Find("Affect Translation X").Data = False
headPositionOffsetYConstraint.PropertyList.Find("Affect Translation Z").Data = False
headPositionOffsetYConstraint.Active = True
headAimConstraint = Constraint.CreateConstraint(Constraint.AIM)
for i in range(0, headAimConstraint.ReferenceGroupGetCount()):
if headAimConstraint.ReferenceGroupGetName(i) == 'Constrained Object':
headAimConstraint.ReferenceAdd(i, OH_Facing )
elif headAimConstraint.ReferenceGroupGetName(i) == 'Aim At Object':
headAimConstraint.ReferenceAdd(i, animalAimOffsetNull )
headAimConstraint.Active = True
headAimConstraint.PropertyList.Find("Rotation Offset").Data = FBVector3d( 0.0, -90.0, -90.0 )
#####################################################################################################
# Plot and delete constraint
#####################################################################################################
selected_takes_list = []
# how many takes has user selected?
for iTake in FBSystem().Scene.Takes:
if ( iTake.Selected == True ):
selected_takes_list.append(iTake)
clearSelection()
# make sure system in on base layer
FBSystem().CurrentTake.SetCurrentLayer(0)
OH_Facing.Selected = True
# if user hasn't selected any takes then just use the current one
if len( selected_takes_list ) == 0:
FBSystem().CurrentTake.PlotTakeOnSelected( plotOptions() )
# flatten torso contraint by zeroing keys on X and Y axes
RemoveXandYRotationKeys( OH_Facing )
# else plot each selected take
else:
for take in selected_takes_list:
FBSystem().CurrentTake = take
FBSystem().CurrentTake.PlotTakeOnSelected( plotOptions() )
# flatten torso contraint by zeroing keys on X and Y axes
RemoveXandYRotationKeys( OH_Facing )
headAimConstraint.FBDelete()
headPositionOffsetYConstraint.FBDelete()
headPositionConstraint.FBDelete()
headPositionOffsetXZConstraint.FBDelete()
animalAimOffsetNull.FBDelete()
animalAimNull.FBDelete()PNG
from pyfbsdk import *
from pyfbsdk_additions import *
from RS.Utils import Scene
from RS.Utils.Scene import Constraint
def FindAnimationNode( pParent, pName ):
lResult = None
for lNode in pParent.Nodes:
if lNode.Name == pName:
lResult = lNode
break
return lResult
def plotOptions():
plot_options = FBPlotOptions()
plot_options.PlotAllTakes = False
plot_options.PlotOnFrame = True
plot_options.PlotPeriod = FBTime(0, 0, 0, 1)
plot_options.RotationFilterToApply = FBRotationFilter.kFBRotationFilterUnroll
plot_options.UseConstantKeyReducer = False
plot_options.ConstantKeyReducerKeepOneKey = True
plot_options.PlotTranslationOnRootOnly = False
return plot_options
def RemoveXandYRotationKeys( object ):
for key in object.Rotation.GetAnimationNode().Nodes[0].FCurve.Keys:
key.Value = 0.0
for key in object.Rotation.GetAnimationNode().Nodes[1].FCurve.Keys:
key.Value = 0.0
def getCharacterHeirarchyList(character):
characterNodeList = []
hips = character.GetModel( FBBodyNodeId.kFBHipsNodeId )
dummy = Scene.GetParent( hips )
Scene.GetChildren( dummy, characterNodeList, "", True )
return characterNodeList
def clearSelection():
''' Clear selection function '''
# Get selected models
modelList = FBModelList ()
FBGetSelectedModels (modelList, None, True)
# Deselect models
for model in modelList:
model.Selected = False
currentCharacter = FBApplication().CurrentCharacter
characterNodeList = getCharacterHeirarchyList(currentCharacter)
OH_Facing = None
Skel_Head = None
# Find required nodes for constraint
for node in characterNodeList:
if node.Name.lower() == 'oh_facingdirection':
OH_Facing = node
elif node.Name.lower() == 'skel_head':
Skel_Head = node
if OH_Facing != None:
print ("Found OH Facing Node")
if Skel_Head != None:
print ("Found Skel_Head Node")
animalAimNull = FBModelNull("Animal_Aim_Null")
animalAimNull.Show = True
animalAimOffsetNull = FBModelNull("Animal_Aim_Offset_Null")
animalAimOffsetNull.Show = True
headPositionConstraint = Constraint.CreateConstraint(Constraint.PARENT_CHILD)
for i in range(0, headPositionConstraint.ReferenceGroupGetCount()):
if headPositionConstraint.ReferenceGroupGetName(i) == 'Constrained object (Child)':
headPositionConstraint.ReferenceAdd(i, animalAimNull )
elif headPositionConstraint.ReferenceGroupGetName(i) == 'Source (Parent)':
headPositionConstraint.ReferenceAdd(i, Skel_Head )
headPositionConstraint.Active = True
headPositionConstraint.PropertyList.Find("%s.Offset T" % Skel_Head.LongName).Data = FBVector3d( 0.0, 5.0, 0.0 )
headPositionOffsetXZConstraint = Constraint.CreateConstraint(Constraint.PARENT_CHILD)
for i in range(0, headPositionOffsetXZConstraint.ReferenceGroupGetCount()):
if headPositionOffsetXZConstraint.ReferenceGroupGetName(i) == 'Constrained object (Child)':
headPositionOffsetXZConstraint.ReferenceAdd(i, animalAimOffsetNull )
elif headPositionOffsetXZConstraint.ReferenceGroupGetName(i) == 'Source (Parent)':
headPositionOffsetXZConstraint.ReferenceAdd(i, animalAimNull )
headPositionOffsetXZConstraint.PropertyList.Find("Affect Rotation X").Data = False
headPositionOffsetXZConstraint.PropertyList.Find("Affect Rotation Y").Data = False
headPositionOffsetXZConstraint.PropertyList.Find("Affect Rotation Z").Data = False
headPositionOffsetXZConstraint.PropertyList.Find("Affect Translation Y").Data = False
headPositionOffsetXZConstraint.Active = True
headPositionOffsetYConstraint = Constraint.CreateConstraint(Constraint.PARENT_CHILD)
for i in range(0, headPositionOffsetYConstraint.ReferenceGroupGetCount()):
if headPositionOffsetYConstraint.ReferenceGroupGetName(i) == 'Constrained object (Child)':
headPositionOffsetYConstraint.ReferenceAdd(i, animalAimOffsetNull )
elif headPositionOffsetYConstraint.ReferenceGroupGetName(i) == 'Source (Parent)':
headPositionOffsetYConstraint.ReferenceAdd(i, OH_Facing )
headPositionOffsetYConstraint.PropertyList.Find("Affect Rotation X").Data = False
headPositionOffsetYConstraint.PropertyList.Find("Affect Rotation Y").Data = False
headPositionOffsetYConstraint.PropertyList.Find("Affect Rotation Z").Data = False
headPositionOffsetYConstraint.PropertyList.Find("Affect Translation X").Data = False
headPositionOffsetYConstraint.PropertyList.Find("Affect Translation Z").Data = False
headPositionOffsetYConstraint.Active = True
headAimConstraint = Constraint.CreateConstraint(Constraint.AIM)
for i in range(0, headAimConstraint.ReferenceGroupGetCount()):
if headAimConstraint.ReferenceGroupGetName(i) == 'Constrained Object':
headAimConstraint.ReferenceAdd(i, OH_Facing )
elif headAimConstraint.ReferenceGroupGetName(i) == 'Aim At Object':
headAimConstraint.ReferenceAdd(i, animalAimOffsetNull )
headAimConstraint.Active = True
headAimConstraint.PropertyList.Find("Rotation Offset").Data = FBVector3d( 0.0, -90.0, -90.0 )
#####################################################################################################
# Plot and delete constraint
#####################################################################################################
selected_takes_list = []
# how many takes has user selected?
for iTake in FBSystem().Scene.Takes:
if ( iTake.Selected == True ):
selected_takes_list.append(iTake)
clearSelection()
# make sure system in on base layer
FBSystem().CurrentTake.SetCurrentLayer(0)
OH_Facing.Selected = True
# if user hasn't selected any takes then just use the current one
if len( selected_takes_list ) == 0:
FBSystem().CurrentTake.PlotTakeOnSelected( plotOptions() )
# flatten torso contraint by zeroing keys on X and Y axes
RemoveXandYRotationKeys( OH_Facing )
# else plot each selected take
else:
for take in selected_takes_list:
FBSystem().CurrentTake = take
FBSystem().CurrentTake.PlotTakeOnSelected( plotOptions() )
# flatten torso contraint by zeroing keys on X and Y axes
RemoveXandYRotationKeys( OH_Facing )
headAimConstraint.FBDelete()
headPositionOffsetYConstraint.FBDelete()
headPositionConstraint.FBDelete()
headPositionOffsetXZConstraint.FBDelete()
animalAimOffsetNull.FBDelete()
animalAimNull.FBDelete()from pyfbsdk import *
def HUDDisplay(HUD, event):
currentTime = FBSystem().LocalTime.GetFrame()
start = float( FBSystem().CurrentTake.LocalTimeSpan.GetStart().GetFrame() )
stop = float(FBSystem().CurrentTake.LocalTimeSpan.GetStop().GetFrame() )
result = float((currentTime - start) / (stop - start))
actualTime = float(currentTime - start)
currentSeconds = float(actualTime / 30.00)
HUDTextElement.Content = ("Phase: %0.3f" % result + " Frame: %0.0f" % actualTime + " Seconds: %0.3f" % currentSeconds)
take = FBSystem().CurrentTake
#Init
Scene = FBSystem().Scene
System = FBSystem()
Application = FBApplication()
#Create HUD with Text Element
HUD = FBHUD("Phase Calculator HUD")
HUDTextElement = FBHUDTextElement("Top Element")
Scene.ConnectSrc(HUD) # Connect the HUD to the scene
HUDTextElement.Content = "Free memory"
HUDTextElement.X = 0
HUDTextElement.Y = 0
HUDTextElement.Font = "Malgun Gothic"
HUDTextElement.Height = 3
HUDTextElement.Scale = 2.2
HUDTextElement.Justification = FBHUDElementHAlignment.kFBHUDRight
HUDTextElement.HorizontalDock = FBHUDElementHAlignment.kFBHUDRight
HUDTextElement.VerticalDock = FBHUDElementVAlignment.kFBHUDTop
HUD.ConnectSrc(HUDTextElement) # Connect HUDTextElement to the HUD
Scene.Cameras[0].ConnectSrc(HUD) # Connect to Perspective camera
# Register for HUD Display
HUD.OnDisplay.Add(HUDDisplay)PNG
from pyfbsdk import *
from pyfbsdk_additions import *
def CreateCube(StairZPos, StairYPos, StairHeight, StairWidth, StairDepth, stairOrigin):
name = 'Stair'
cube = FBModelCube(name)
cube.Show = True
cube.Translation = FBVector3d(0.0, StairYPos, -StairZPos)
cube.Scaling = FBVector3d(StairWidth, StairHeight, StairDepth)
cube.Parent = stairOrigin
return cube
def DeleteBranch(topModel):
'''
Deletes the given model and all of its descendants.
'''
while len(topModel.Children) > 0:
DeleteBranch(topModel.Children[-1])
topModel.FBDelete()
def BtnCallback(control, event):
existingOrigin = FBFindModelByLabelName("stairOrigin")
if existingOrigin != None:
DeleteBranch(existingOrigin)
stairOrigin = FBModelNull("stairOrigin")
stairOrigin.Show = True
stairHeight = t.height.Value / 2
print stairHeight
stairWidth = t.width.Value / 2
print stairWidth
stairDepth = t.depth.Value / 2
print stairDepth
stairCount = t.stair_number.Value
print stairCount
StairZPos = stairDepth
StairYPos = stairHeight
i = 0
while i < stairCount:
CreateCube(StairZPos, StairYPos, stairHeight, stairWidth, stairDepth, stairOrigin)
StairYPos += (stairHeight * 2)
StairZPos += (stairDepth * 2)
i += 1
ui_x_offset = 5
ui_y_offset = 5
ui_x_width = 240
ui_button_height = 30
ui_button_width = 40
ui_column_a = 20
ui_column_b = 110
ui_column_c = 100
t = FBCreateUniqueTool("Led Zeppelins Stairway to Heaven Helper")
t.StartSizeX = ui_x_width + 30
t.StartSizeY = 600
##########################################################################################
# Width Border and Controls
##########################################################################################
ui_y_offset += 10
x = FBAddRegionParam(ui_x_offset, FBAttachType.kFBAttachNone, "")
y = FBAddRegionParam(ui_y_offset, FBAttachType.kFBAttachNone, "")
w = FBAddRegionParam(ui_x_width, FBAttachType.kFBAttachNone, "")
h = FBAddRegionParam(40, FBAttachType.kFBAttachNone, "")
t.AddRegion("width_border", "Width", x, y, w, h)
t.SetBorder("width_border", FBBorderStyle.kFBEmbossBorder, True, True, 2, 0, 90.0, 0)
ui_y_offset += 10
x = FBAddRegionParam(ui_x_offset + 5, FBAttachType.kFBAttachTop, "")
y = FBAddRegionParam(ui_y_offset, FBAttachType.kFBAttachNone, "")
w = FBAddRegionParam(ui_x_width - 10, FBAttachType.kFBAttachNone, "")
h = FBAddRegionParam(20, FBAttachType.kFBAttachNone, "")
t.AddRegion("width_edit", "width_edit", x, y, w, h)
t.width = FBEditNumber()
t.SetControl("width_edit", t.width)
t.width.Visible = True
t.width.ReadOnly = False
t.width.Enabled = True
t.width.Value = 400.0
t.width.Hint = "Width of the stairs"
t.width.Min = 0.0
##########################################################################################
# Height Border and Controls
##########################################################################################
ui_y_offset += 50
x = FBAddRegionParam(ui_x_offset, FBAttachType.kFBAttachNone, "")
y = FBAddRegionParam(ui_y_offset, FBAttachType.kFBAttachNone, "")
w = FBAddRegionParam(ui_x_width, FBAttachType.kFBAttachNone, "")
h = FBAddRegionParam(40, FBAttachType.kFBAttachNone, "")
t.AddRegion("height_border", "Height", x, y, w, h)
t.SetBorder("height_border", FBBorderStyle.kFBEmbossBorder, True, True, 2, 0, 90.0, 0)
ui_y_offset += 10
x = FBAddRegionParam(ui_x_offset + 5, FBAttachType.kFBAttachTop, "")
y = FBAddRegionParam(ui_y_offset, FBAttachType.kFBAttachNone, "")
w = FBAddRegionParam(ui_x_width - 10, FBAttachType.kFBAttachNone, "")
h = FBAddRegionParam(20, FBAttachType.kFBAttachNone, "")
t.AddRegion("height_edit", "height_edit", x, y, w, h)
t.height = FBEditNumber()
t.SetControl("height_edit", t.height)
t.height.Visible = True
t.height.ReadOnly = False
t.height.Enabled = True
t.height.Value = 20.0
t.height.Hint = "Height of the stairs"
t.height.Min = 0.0
##########################################################################################
# Depth Border and Controls
##########################################################################################
ui_y_offset += 50
x = FBAddRegionParam(ui_x_offset, FBAttachType.kFBAttachNone, "")
y = FBAddRegionParam(ui_y_offset, FBAttachType.kFBAttachNone, "")
w = FBAddRegionParam(ui_x_width, FBAttachType.kFBAttachNone, "")
h = FBAddRegionParam(40, FBAttachType.kFBAttachNone, "")
t.AddRegion("depth_border", "Depth", x, y, w, h)
t.SetBorder("depth_border", FBBorderStyle.kFBEmbossBorder, True, True, 2, 0, 90.0, 0)
ui_y_offset += 10
x = FBAddRegionParam(ui_x_offset + 5, FBAttachType.kFBAttachTop, "")
y = FBAddRegionParam(ui_y_offset, FBAttachType.kFBAttachNone, "")
w = FBAddRegionParam(ui_x_width - 10, FBAttachType.kFBAttachNone, "")
h = FBAddRegionParam(20, FBAttachType.kFBAttachNone, "")
t.AddRegion("depth_edit", "depth_edit", x, y, w, h)
t.depth = FBEditNumber()
t.SetControl("depth_edit", t.depth)
t.depth.Visible = True
t.depth.ReadOnly = False
t.depth.Enabled = True
t.depth.Value = 30.0
t.depth.Hint = "Depth of the stairs"
t.depth.Min = 0.0
##########################################################################################
# Stair Number
##########################################################################################
ui_y_offset += 50
x = FBAddRegionParam(ui_x_offset, FBAttachType.kFBAttachNone, "")
y = FBAddRegionParam(ui_y_offset, FBAttachType.kFBAttachNone, "")
w = FBAddRegionParam(ui_x_width, FBAttachType.kFBAttachNone, "")
h = FBAddRegionParam(40, FBAttachType.kFBAttachNone, "")
t.AddRegion("stairs_border", "Stair Amount", x, y, w, h)
t.SetBorder("stairs_border", FBBorderStyle.kFBEmbossBorder, True, True, 2, 0, 90.0, 0)
ui_y_offset += 10
x = FBAddRegionParam(ui_x_offset + 5, FBAttachType.kFBAttachTop, "")
y = FBAddRegionParam(ui_y_offset, FBAttachType.kFBAttachNone, "")
w = FBAddRegionParam(ui_x_width - 10, FBAttachType.kFBAttachNone, "")
h = FBAddRegionParam(20, FBAttachType.kFBAttachNone, "")
t.AddRegion("stairs_edit", "stairs_edit", x, y, w, h)
t.stair_number = FBEditNumber()
t.SetControl("stairs_edit", t.stair_number)
t.stair_number.Visible = True
t.stair_number.ReadOnly = False
t.stair_number.Enabled = True
t.stair_number.Value = 30.0
t.stair_number.Hint = "Depth of the stairs"
t.stair_number.Min = 0.0
##########################################################################################
# Create Stairs Button
##########################################################################################
ui_y_offset += 40
# Pin button
x = FBAddRegionParam(ui_x_offset, FBAttachType.kFBAttachTop, "")
y = FBAddRegionParam(ui_y_offset, FBAttachType.kFBAttachNone, "")
w = FBAddRegionParam(ui_x_width, FBAttachType.kFBAttachNone, "")
h = FBAddRegionParam(ui_button_height, FBAttachType.kFBAttachNone, "")
t.AddRegion("create_stairs_region", "create_stairs_region", x, y, w, h)
t.create_stairs_button = FBButton()
t.SetControl("create_stairs_region", t.create_stairs_button)
t.create_stairs_button.Visible = True
t.create_stairs_button.ReadOnly = False
t.create_stairs_button.Enabled = True
t.create_stairs_button.Hint = ""
t.create_stairs_button.Caption = "Create Stairs"
t.create_stairs_button.State = 0
t.create_stairs_button.Style = FBButtonStyle.kFBPushButton
t.create_stairs_button.Justify = FBTextJustify.kFBTextJustifyCenter
t.create_stairs_button.Look = FBButtonLook.kFBLookNormal
t.create_stairs_button.OnClick.Add(BtnCallback)
t.StartSizeX = 267
t.StartSizeY = ui_y_offset + 75
ShowTool(t)from pyfbsdk import *
DupeTake = FBSystem().CurrentTake.CopyTake
def getNumberOfSelectedTakes():
number_of_selected_takes = 0
for take_index in range( len( FBSystem().Scene.Takes ) ):
if FBSystem().Scene.Takes[ take_index ].Selected == True:
number_of_selected_takes += 1
return number_of_selected_takes
number_of_selected_takes = getNumberOfSelectedTakes()
if number_of_selected_takes > 1:
for take_index in range( len( FBSystem().Scene.Takes ) ):
if FBSystem().Scene.Takes[ take_index ].Selected == True:
# go to take
FBSystem().CurrentTake = FBSystem().Scene.Takes[ take_index ]
CurrentTakeName = FBSystem().CurrentTake.Name
new = DupeTake(CurrentTakeName + "_TURN_L1")
new = DupeTake(CurrentTakeName + "_TURN_L2")
new = DupeTake(CurrentTakeName + "_TURN_R1")
new = DupeTake(CurrentTakeName + "_TURN_R2")
else:
CurrentTakeName = FBSystem().CurrentTake.Name
new = DupeTake(CurrentTakeName + "_TURN_L1")
new = DupeTake(CurrentTakeName + "_TURN_L2")
new = DupeTake(CurrentTakeName + "_TURN_R1")
new = DupeTake(CurrentTakeName + "_TURN_R2")
PNG
from pyfbsdk import *
from pyfbsdk_additions import *
region1 = FBLabel()
editStart = FBEditNumber()
buttonStart = FBButton()
region4 = FBLabel()
editStop = FBEditNumber()
buttonStop = FBButton()
buttonTimeline = FBButton()
buttonAction = FBButton()
listAction = FBList()
region9 = FBLabel()
editBlendTime = FBEditNumber()
def PopulateTool(t):
#populate regions here
x = FBAddRegionParam(15,FBAttachType.kFBAttachNone,"")
y = FBAddRegionParam(15,FBAttachType.kFBAttachNone,"")
w = FBAddRegionParam(80,FBAttachType.kFBAttachNone,"")
h = FBAddRegionParam(25,FBAttachType.kFBAttachNone,"")
t.AddRegion("region1","region1", x, y, w, h)
t.SetControl("region1", region1)
region1.Visible = True
region1.ReadOnly = False
region1.Enabled = True
region1.Hint = ""
region1.Caption = "Start"
region1.Style = FBTextStyle.kFBTextStyleNone
region1.Justify = FBTextJustify.kFBTextJustifyLeft
region1.WordWrap = True
x = FBAddRegionParam(15,FBAttachType.kFBAttachNone,"")
y = FBAddRegionParam(45,FBAttachType.kFBAttachNone,"")
w = FBAddRegionParam(80,FBAttachType.kFBAttachNone,"")
h = FBAddRegionParam(25,FBAttachType.kFBAttachNone,"")
t.AddRegion("editStart","editStart", x, y, w, h)
t.SetControl("editStart", editStart)
editStart.Visible = True
editStart.ReadOnly = False
editStart.Enabled = True
editStart.Hint = ""
editStart.Value = 0.000000
editStart.Min = 0.000000
editStart.Max = 0.000000
editStart.Precision = 0.000000
editStart.LargeStep = 5.000000
editStart.SmallStep = 1.000000
x = FBAddRegionParam(15,FBAttachType.kFBAttachNone,"")
y = FBAddRegionParam(75,FBAttachType.kFBAttachNone,"")
w = FBAddRegionParam(80,FBAttachType.kFBAttachNone,"")
h = FBAddRegionParam(25,FBAttachType.kFBAttachNone,"")
t.AddRegion("buttonStart","buttonStart", x, y, w, h)
t.SetControl("buttonStart", buttonStart)
buttonStart.Visible = True
buttonStart.ReadOnly = False
buttonStart.Enabled = True
buttonStart.Hint = ""
buttonStart.Caption = "Assign Start"
buttonStart.State = 0
buttonStart.Style = FBButtonStyle.kFBPushButton
buttonStart.Justify = FBTextJustify.kFBTextJustifyLeft
buttonStart.Look = FBButtonLook.kFBLookNormal
buttonStart.OnClick.Add(ButtonStartEvent)
x = FBAddRegionParam(110,FBAttachType.kFBAttachNone,"")
y = FBAddRegionParam(15,FBAttachType.kFBAttachNone,"")
w = FBAddRegionParam(80,FBAttachType.kFBAttachNone,"")
h = FBAddRegionParam(25,FBAttachType.kFBAttachNone,"")
t.AddRegion("region4","region4", x, y, w, h)
t.SetControl("region4", region4)
region4.Visible = True
region4.ReadOnly = False
region4.Enabled = True
region4.Hint = ""
region4.Caption = "Stop"
region4.Style = FBTextStyle.kFBTextStyleNone
region4.Justify = FBTextJustify.kFBTextJustifyLeft
region4.WordWrap = True
x = FBAddRegionParam(110,FBAttachType.kFBAttachNone,"")
y = FBAddRegionParam(45,FBAttachType.kFBAttachNone,"")
w = FBAddRegionParam(80,FBAttachType.kFBAttachNone,"")
h = FBAddRegionParam(25,FBAttachType.kFBAttachNone,"")
t.AddRegion("editStop","editStop", x, y, w, h)
t.SetControl("editStop", editStop)
editStop.Visible = True
editStop.ReadOnly = False
editStop.Enabled = True
editStop.Hint = ""
editStop.Value = 0.000000
editStop.Min = 0.000000
editStop.Max = 0.000000
editStop.Precision = 0.000000
editStop.LargeStep = 5.000000
editStop.SmallStep = 1.000000
x = FBAddRegionParam(110,FBAttachType.kFBAttachNone,"")
y = FBAddRegionParam(75,FBAttachType.kFBAttachNone,"")
w = FBAddRegionParam(80,FBAttachType.kFBAttachNone,"")
h = FBAddRegionParam(25,FBAttachType.kFBAttachNone,"")
t.AddRegion("buttonStop","buttonStop", x, y, w, h)
t.SetControl("buttonStop", buttonStop)
buttonStop.Visible = True
buttonStop.ReadOnly = False
buttonStop.Enabled = True
buttonStop.Hint = ""
buttonStop.Caption = "Assign Stop"
buttonStop.State = 0
buttonStop.Style = FBButtonStyle.kFBPushButton
buttonStop.Justify = FBTextJustify.kFBTextJustifyLeft
buttonStop.Look = FBButtonLook.kFBLookNormal
buttonStop.OnClick.Add(ButtonStopEvent)
x = FBAddRegionParam(205,FBAttachType.kFBAttachNone,"")
y = FBAddRegionParam(75,FBAttachType.kFBAttachNone,"")
w = FBAddRegionParam(80,FBAttachType.kFBAttachNone,"")
h = FBAddRegionParam(25,FBAttachType.kFBAttachNone,"")
t.AddRegion("buttonTimeline","buttonTimeline", x, y, w, h)
t.SetControl("buttonTimeline", buttonTimeline)
buttonTimeline.Visible = True
buttonTimeline.ReadOnly = False
buttonTimeline.Enabled = True
buttonTimeline.Hint = ""
buttonTimeline.Caption = "Timeline range"
buttonTimeline.State = 0
buttonTimeline.Style = FBButtonStyle.kFBPushButton
buttonTimeline.Justify = FBTextJustify.kFBTextJustifyLeft
buttonTimeline.Look = FBButtonLook.kFBLookNormal
buttonTimeline.OnClick.Add(ButtonTimelineEvent)
x = FBAddRegionParam(45,FBAttachType.kFBAttachNone,"")
y = FBAddRegionParam(120,FBAttachType.kFBAttachNone,"")
w = FBAddRegionParam(110,FBAttachType.kFBAttachNone,"")
h = FBAddRegionParam(30,FBAttachType.kFBAttachNone,"")
t.AddRegion("buttonAction","buttonAction", x, y, w, h)
t.SetControl("buttonAction", buttonAction)
buttonAction.Visible = True
buttonAction.ReadOnly = False
buttonAction.Enabled = True
buttonAction.Hint = ""
buttonAction.Caption = "Do it!"
buttonAction.State = 0
buttonAction.Style = FBButtonStyle.kFBPushButton
buttonAction.Justify = FBTextJustify.kFBTextJustifyLeft
buttonAction.Look = FBButtonLook.kFBLookNormal
buttonAction.OnClick.Add(ButtonActionEvent)
x = FBAddRegionParam(175,FBAttachType.kFBAttachNone,"")
y = FBAddRegionParam(120,FBAttachType.kFBAttachNone,"")
w = FBAddRegionParam(110,FBAttachType.kFBAttachNone,"")
h = FBAddRegionParam(30,FBAttachType.kFBAttachNone,"")
t.AddRegion("listAction","listAction", x, y, w, h)
t.SetControl("listAction", listAction)
listAction.Style = FBListStyle.kFBDropDownList
listAction.Items.append('T')
listAction.Items.append('R')
listAction.Items.append('TR')
listAction.Items.append('S')
listAction.Items.append('TRS')
listAction.ItemIndex = 2
x = FBAddRegionParam(205,FBAttachType.kFBAttachNone,"")
y = FBAddRegionParam(15,FBAttachType.kFBAttachNone,"")
w = FBAddRegionParam(80,FBAttachType.kFBAttachNone,"")
h = FBAddRegionParam(25,FBAttachType.kFBAttachNone,"")
t.AddRegion("region9","region9", x, y, w, h)
t.SetControl("region9", region9)
region9.Visible = True
region9.ReadOnly = False
region9.Enabled = True
region9.Hint = ""
region9.Caption = "Blend Time"
region9.Style = FBTextStyle.kFBTextStyleNone
region9.Justify = FBTextJustify.kFBTextJustifyLeft
region9.WordWrap = True
x = FBAddRegionParam(205,FBAttachType.kFBAttachNone,"")
y = FBAddRegionParam(45,FBAttachType.kFBAttachNone,"")
w = FBAddRegionParam(80,FBAttachType.kFBAttachNone,"")
h = FBAddRegionParam(25,FBAttachType.kFBAttachNone,"")
t.AddRegion("editBlendTime","editBlendTime", x, y, w, h)
t.SetControl("editBlendTime", editBlendTime)
editBlendTime.Visible = True
editBlendTime.ReadOnly = False
editBlendTime.Enabled = True
editBlendTime.Hint = ""
editBlendTime.Value = 3.000000
editBlendTime.Min = 0.000000
editBlendTime.Max = 100.000000
editBlendTime.Precision = 0.000000
editBlendTime.LargeStep = 1.000000
editBlendTime.SmallStep = 0.100000
def ButtonStartEvent(control, event):
time = FBSystem().LocalTime
frame = time.GetFrame()
editStart.Value = frame
def ButtonStopEvent(control, event):
time = FBSystem().LocalTime
frame = time.GetFrame()
editStop.Value = frame
def ButtonTimelineEvent(control, event):
btime = FBPlayerControl().LoopStart
etime = FBPlayerControl().LoopStop
editStart.Value = btime.GetFrame()
editStop.Value = etime.GetFrame()
def IsTimeInside(timespan, time):
if (time > timespan.GetStart() and time < timespan.GetStop() ): return True
return False
def ProcessFCurve(curve, currTime, startTime, stopTime, blendTime):
value = curve.Evaluate(currTime)
count = len(curve.Keys)
startTimeBlend = startTime - blendTime
stopTimeBlend = stopTime + blendTime
if curve: curve.KeyDeleteByTimeRange(startTimeBlend, stopTimeBlend, True)
startNdx = curve.KeyAdd(startTime, value)
stopNdx = curve.KeyAdd(stopTime, value)
if startNdx >= 0:
curve.Keys[startNdx].TangentMode = FBTangentMode.kFBTangentModeUser
curve.Keys[startNdx].LeftDerivative = 0.0
curve.Keys[startNdx].RightDerivative = 0.0
if stopNdx >= 0:
curve.Keys[stopNdx].TangentMode = FBTangentMode.kFBTangentModeUser
curve.Keys[stopNdx].LeftDerivative = 0.0
curve.Keys[stopNdx].RightDerivative = 0.0
def ProcessAnimationNode(animNode, currTime, startTime, stopTime, blendTime):
for node in animNode.Nodes:
if node.FCurve:
ProcessFCurve(node.FCurve, currTime, startTime, stopTime, blendTime)
def ButtonActionEvent(control, event):
currTime = FBSystem().LocalTime
startTime = FBTime(0,0,0, int(editStart.Value) )
stopTime = FBTime(0,0,0, int(editStop.Value) )
blendTime = FBTime(0,0,0, int(editBlendTime.Value) )
models = FBModelList()
FBGetSelectedModels(models)
mode = listAction.ItemIndex
for model in models:
if mode in [0,2,4]:
animNode = model.Translation.GetAnimationNode()
if animNode: ProcessAnimationNode(animNode, currTime, startTime, stopTime, blendTime)
if mode in [1,2,4]:
animNode = model.Rotation.GetAnimationNode()
if animNode: ProcessAnimationNode(animNode, currTime, startTime, stopTime, blendTime)
if mode in [3,4]:
animNode = model.Scaling.GetAnimationNode()
if animNode: ProcessAnimationNode(animNode, currTime, startTime, stopTime, blendTime)
def CreateTool():
t = FBCreateUniqueTool("Foot Fix")
t.StartSizeX = 325
t.StartSizeY = 200
PopulateTool(t)
ShowTool(t)
CreateTool()
PNG
from pyfbsdk import *
from RS.Utils import Scene
#Create a relation constraint called SaddleConstraint
lConstraintRelation = FBConstraintRelation( 'SaddleConstraint' )
lVectorToNumberBoxMover = lConstraintRelation.CreateFunctionBox( 'Converters', 'Vector to Number' )
lConstraintRelation.SetBoxPosition( lVectorToNumberBoxMover, 400, 30 )
lVectorToNumberBoxSaddle = lConstraintRelation.CreateFunctionBox( 'Converters', 'Vector to Number' )
lConstraintRelation.SetBoxPosition( lVectorToNumberBoxSaddle, 400, 230 )
lNumberToVectorBox = lConstraintRelation.CreateFunctionBox( 'Converters', 'Number to Vector' )
lConstraintRelation.SetBoxPosition( lNumberToVectorBox, 700, 130 )
def ConnectBox(nodeOut, nodeOutPos, nodeIn, nodeInPos):
mynodeOut = FindAnimationNode(nodeOut.AnimationNodeOutGet(), nodeOutPos )
mynodeIn = FindAnimationNode(nodeIn.AnimationNodeInGet(), nodeInPos )
if mynodeOut and mynodeIn:
FBConnect(mynodeOut, mynodeIn)
def FindAnimationNode( pParent, pName ):
lResult = None
for lNode in pParent.Nodes:
if lNode.Name == pName:
lResult = lNode
break
return lResult
#Get Mover
def getCharacterHeirarchyList(character):
characterNodeList = []
hips = character.GetModel( FBBodyNodeId.kFBHipsNodeId )
dummy = Scene.GetParent( hips )
Scene.GetChildren( dummy, characterNodeList, "", True )
return characterNodeList
currentCharacter = FBApplication().CurrentCharacter
characterNodeList = getCharacterHeirarchyList(currentCharacter)
mover = None
saddle = None
for node in characterNodeList:
if node.Name.lower() == 'mover':
mover = node
elif node.Name.lower() == 'skel_saddle':
saddle = node
if mover != None and saddle != None:
SaddleMoverSender = lConstraintRelation.SetAsSource(mover)
lConstraintRelation.SetBoxPosition( SaddleMoverSender, 100, 30 )
SaddleMoverReceiver = lConstraintRelation.ConstrainObject(mover)
lConstraintRelation.SetBoxPosition( SaddleMoverReceiver, 1000, 30 )
SaddleRootSender = lConstraintRelation.SetAsSource(saddle)
lConstraintRelation.SetBoxPosition( SaddleRootSender, 100, 230 )
# Connect Constraints
ConnectBox(SaddleRootSender, "Translation", lVectorToNumberBoxSaddle, 'V')
ConnectBox(SaddleMoverSender, "Translation", lVectorToNumberBoxMover, 'V')
ConnectBox(lVectorToNumberBoxMover, "Y", lNumberToVectorBox, 'Y')
ConnectBox(lVectorToNumberBoxSaddle, "X", lNumberToVectorBox, 'X')
ConnectBox(lVectorToNumberBoxSaddle, "Z", lNumberToVectorBox, 'Z')
ConnectBox(lNumberToVectorBox, "Result", SaddleMoverReceiver, 'Translation')
# Finally activate the constraint.
lConstraintRelation.Active = Truefrom pyfbsdk import *
def GetParent(model):
parentModel = model.Parent
if parentModel:
parentModel = GetParent(parentModel)
else:
parentModel = model
return parentModel
def MoveKeysToZero(time, node):
fcurve = node.FCurve
if fcurve:
print len(fcurve.Keys)
for key in fcurve.Keys:
key.Time -= time
for child in node.Nodes:
MoveKeysToZero(time, child)
def SelectHierarchy(time, model):
print model.Name
MoveKeysToZero(time, model.AnimationNode)
for child in model.Children:
SelectHierarchy(time, child)
playerControl = FBPlayerControl()
startTime = playerControl.LoopStart
endTime = playerControl.LoopStop
zeroTime = FBTime(0)
print startTime
print zeroTime
IsZero = startTime != zeroTime
print IsZero
currChar = FBApplication().CurrentCharacter
if currChar and (startTime != zeroTime):
hipsModel = currChar.GetModel(FBBodyNodeId.kFBHipsNodeId)
if hipsModel:
print hipsModel.Name
parentModel = GetParent(hipsModel)
if parentModel:
SelectHierarchy(startTime, parentModel)
playerControl.LoopStart = zeroTime
playerControl.LoopStop = endTime - startTime
PNG
from pyfbsdk import *
from RS.Utils import Scene
lConstraintRelation = FBConstraintRelation( 'OH_AutoConstraint' )
lVectorToNumberBoxHead = lConstraintRelation.CreateFunctionBox( 'Converters', 'Vector to Number' )
lConstraintRelation.SetBoxPosition( lVectorToNumberBoxHead, 400, 30 )
lVectorToNumberBoxShoulders = lConstraintRelation.CreateFunctionBox( 'Converters', 'Vector to Number' )
lConstraintRelation.SetBoxPosition( lVectorToNumberBoxShoulders, 400, 230 )
lNumberToVectorBoxHead = lConstraintRelation.CreateFunctionBox( 'Converters', 'Number to Vector' )
lConstraintRelation.SetBoxPosition( lNumberToVectorBoxHead, 1000, 30 )
lNumberToVectorBoxShoulders = lConstraintRelation.CreateFunctionBox( 'Converters', 'Number to Vector' )
lConstraintRelation.SetBoxPosition( lNumberToVectorBoxShoulders, 1000, 230 )
lNumberAddBoxHead = lConstraintRelation.CreateFunctionBox( 'Number', 'Add (a + b)' )
lConstraintRelation.SetBoxPosition( lNumberAddBoxHead, 700, 30 )
lNumberAddBoxShoulders = lConstraintRelation.CreateFunctionBox( 'Number', 'Add (a + b)' )
lConstraintRelation.SetBoxPosition( lNumberAddBoxShoulders, 700, 230 )
def ConnectBox(nodeOut, nodeOutPos, nodeIn, nodeInPos):
mynodeOut = FindAnimationNode(nodeOut.AnimationNodeOutGet(), nodeOutPos )
mynodeIn = FindAnimationNode(nodeIn.AnimationNodeInGet(), nodeInPos )
if mynodeOut and mynodeIn:
FBConnect(mynodeOut, mynodeIn)
def SetBoxInput(nodeIn, nodeInPos):
mynodeOut = FindAnimationNode(nodeOut.AnimationNodeOutGet(), nodeOutPos )
mynodeIn = FindAnimationNode(nodeIn.AnimationNodeInGet(), nodeInPos )
if mynodeOut and mynodeIn:
FBConnect(mynodeOut, mynodeIn)
def FindAnimationNode( pParent, pName ):
lResult = None
for lNode in pParent.Nodes:
if lNode.Name == pName:
lResult = lNode
break
return lResult
def getCharacterHeirarchyList(character):
characterNodeList = []
hips = character.GetModel( FBBodyNodeId.kFBHipsNodeId )
dummy = Scene.GetParent( hips )
Scene.GetChildren( dummy, characterNodeList, "", True )
return characterNodeList
currentCharacter = FBApplication().CurrentCharacter
characterNodeList = getCharacterHeirarchyList(currentCharacter)
OH_Facing = None
OH_MoverFixup = None
Skel_Head = None
Skel_Shoulders = None
# Find required nodes for constraint
for node in characterNodeList:
if node.Name.lower() == 'oh_upperfixupdirection':
OH_MoverFixup = node
elif node.Name.lower() == 'oh_facingdirection':
OH_Facing = node
elif node.Name.lower() == 'skel_head':
Skel_Head = node
elif node.Name.lower() == 'skel_spine5':
Skel_Shoulders = node
# Add nodes to constraint
if OH_MoverFixup != None:
OH_Facing_Reciever = lConstraintRelation.ConstrainObject(OH_Facing)
lConstraintRelation.SetBoxPosition( OH_Facing_Reciever, 1300, 30 )
if OH_Facing != None:
OH_MoverFixup_Receiver = lConstraintRelation.ConstrainObject(OH_MoverFixup)
lConstraintRelation.SetBoxPosition( OH_MoverFixup_Receiver, 1300, 230 )
if Skel_Head != None:
Skel_Head_Sender = lConstraintRelation.SetAsSource(Skel_Head)
lConstraintRelation.SetBoxPosition( Skel_Head_Sender, 100, 30 )
if Skel_Shoulders != None:
Skel_Shoulders_Sender = lConstraintRelation.SetAsSource(Skel_Shoulders)
lConstraintRelation.SetBoxPosition( Skel_Shoulders_Sender, 100, 230 )
# Connect Head Facing Constraints
ConnectBox(Skel_Head_Sender, "Rotation", lVectorToNumberBoxHead, 'V')
ConnectBox(lVectorToNumberBoxHead, "X", lNumberAddBoxHead, 'a')
ConnectBox(lNumberAddBoxHead, "Result", lNumberToVectorBoxHead, 'Y')
ConnectBox(lNumberToVectorBoxHead, "Result", OH_Facing_Reciever, 'Rotation')
# Add Head Offsets
lAddHeadInB = FindAnimationNode( lNumberAddBoxHead.AnimationNodeInGet(), 'b' )
lAddHeadInB.WriteData( [90] )
lVectorHeadInX = FindAnimationNode( lNumberToVectorBoxHead.AnimationNodeInGet(), 'X' )
lVectorHeadInX.WriteData( [-90] )
# Connect Shoulder Facing Constraints
ConnectBox(Skel_Shoulders_Sender, "Rotation", lVectorToNumberBoxShoulders, 'V')
ConnectBox(lVectorToNumberBoxShoulders, "X", lNumberAddBoxShoulders, 'a')
lAddShoulderInB = FindAnimationNode( lNumberAddBoxShoulders.AnimationNodeInGet(), 'b' )
ConnectBox(lNumberToVectorBoxShoulders, "Result", OH_MoverFixup_Receiver, 'Rotation')
# Add Shoulder Upperfixup Offsets
lAddShoulderInB.WriteData( [90] )
ConnectBox(lNumberAddBoxShoulders, "Result", lNumberToVectorBoxShoulders, 'Y')
lVectorShoulderInX = FindAnimationNode( lNumberToVectorBoxShoulders.AnimationNodeInGet(), 'X' )
lVectorShoulderInX.WriteData( [-90] )
# Activate the constraint.
lConstraintRelation.Active = True
###################################
#PLOTTING
###################################
# Set options for Plot process
lOptions = FBPlotOptions()
lOptions.ConstantKeyReducerKeepOneKey = True
lOptions.PlotAllTakes = True
lOptions.PlotOnFrame = True
lOptions.PlotPeriod = FBTime( 0, 0, 0, 1 )
lOptions.PlotTranslationOnRootOnly = True
lOptions.PreciseTimeDiscontinuities = True
lOptions.RotationFilterToApply = FBRotationFilter.kFBRotationFilterUnroll
lOptions.UseConstantKeyReducer = False
lCharacter = FBApplication().CurrentCharacter
lCharacter.PlotAnimation (FBCharacterPlotWhere.kFBCharacterPlotOnControlRig,lOptions )
# Deactivate Relation Cosntraint
lConstraintRelation.Active = False
OH_MoverFixup.Selected = True
OH_Facing.Selected = True
# Find a given model in the scene.
def facingFilter():
lFilterFacing = FBFilterManager().CreateFilter( 'Key Reducing' )
lFilterFacing.PropertyList.Find( 'Precision' ).Data = 4.0
lFilterFacing.Apply( OH_Facing.Rotation.GetAnimationNode(), True )
del(lFilterFacing)
def upperFilter():
lFilterUpper = FBFilterManager().CreateFilter( 'Key Reducing' )
lFilterUpper.PropertyList.Find( 'Precision' ).Data = 4.0
lFilterUpper.Apply( OH_MoverFixup.Rotation.GetAnimationNode(), True )
del(lFilterUpper)
allTakes = FBSystem().Scene.Takes
for take in allTakes:
FBSystem().CurrentTake = take
upperFilter()
facingFilter()
# Cleanup.
lConstraints = FBSystem().Scene.Constraints
for aConstraint in lConstraints:
if aConstraint.Name == 'OH_AutoConstraint':
aConstraint.FBDelete()
PNG
PNG
from pyfbsdk import *
from pyfbsdk_additions import *
from RS.Utils import Scene
def clearSelection():
''' Clear selection function '''
# Get selected models
modelList = FBModelList ()
FBGetSelectedModels (modelList, None, True)
# Deselect models
for model in modelList:
model.Selected = False
def getCharacterHeirarchyList(character):
characterNodeList = []
hips = character.GetModel( FBBodyNodeId.kFBHipsNodeId )
dummy = Scene.GetParent( hips )
Scene.GetChildren( dummy, characterNodeList, "", True )
return characterNodeList
def getSceneObject( name, characterNodeList ):
for node in characterNodeList:
if node.Name.lower() == name:
return node
# Error node not found in scene!
FBMessageBox( "Error", "Error: '" + name + "' object not found in scene!", "OK" )
raise Exception( "Error: " + name + " not found in scene!" )
currentCharacter = FBApplication().CurrentCharacter
characterNodeList = getCharacterHeirarchyList(currentCharacter)
# Find Camera nodes
cameraNode = getSceneObject( 'camerabasepivotoffset', characterNodeList)
cameraStartNode = getSceneObject( 'camerabasepivotoffsetstart', characterNodeList)
cameraEndNode = getSceneObject( 'camerabasepivotoffsetend', characterNodeList)
def ClearAnim( pNode ):
if pNode.FCurve:
pNode.FCurve.EditClear()
else:
for lNode in pNode.Nodes:
ClearAnim( lNode )
del( lNode )
def cameraToolStart():
ClearAnim( cameraStartNode.AnimationNode )
ClearAnim( cameraEndNode.AnimationNode )
# Setup CameraStartPivot Offset keys
lPlayerControl = FBPlayerControl()
lPlayerControl.GotoStart()
cameraNodelTranslation = cameraNode.PropertyList.Find( 'Lcl Translation' ).Data
cameraStartNode.PropertyList.Find( 'Lcl Translation' ).Data = cameraNodelTranslation
cameraNodelRotation = cameraNode.PropertyList.Find( 'Lcl Rotation' ).Data
cameraStartNode.PropertyList.Find( 'Lcl Rotation' ).Data = cameraNodelRotation
keyCameraStartNodelTranslation = cameraStartNode.PropertyList.Find( 'Lcl Translation' )
keyCameraStartNodelRotation = cameraStartNode.PropertyList.Find( 'Lcl Rotation' )
keyCameraStartNodelTranslation.Key()
keyCameraStartNodelRotation.Key()
# Setup CameraStartPivot Offset keys
lPlayerControl = FBPlayerControl()
lPlayerControl.GotoEnd()
cameraNodelTranslation = cameraNode.PropertyList.Find( 'Lcl Translation' ).Data
cameraEndNode.PropertyList.Find( 'Lcl Translation' ).Data = cameraNodelTranslation
cameraNodelRotation = cameraNode.PropertyList.Find( 'Lcl Rotation' ).Data
cameraEndNode.PropertyList.Find( 'Lcl Rotation' ).Data = cameraNodelRotation
keyCameraEndNodelTranslation = cameraEndNode.PropertyList.Find( 'Lcl Translation' )
keyCameraEndNodelRotation = cameraEndNode.PropertyList.Find( 'Lcl Rotation' )
keyCameraEndNodelTranslation.Key()
keyCameraEndNodelRotation.Key()
# Plot Camera Nodes
cameraEndNode.Selected = True
cameraStartNode.Selected = True
lOptions = FBPlotOptions()
lOptions.PlotOnFrame = True
lOptions.UseConstantKeyReducer = False
lOptions.ConstantKeyReducerKeepOneKey = True
lOptions.PlotLockedProperties = False
lSystem = FBSystem()
lSystem.CurrentTake.PlotTakeOnSelected( lOptions )
selected_takes_list = []
# how many takes has user selected?
for iTake in FBSystem().Scene.Takes:
if ( iTake.Selected == True ):
selected_takes_list.append(iTake)
if len( selected_takes_list ) == 0:
cameraToolStart()
# else plot each selected take
else:
for take in selected_takes_list:
FBSystem().CurrentTake = take
cameraToolStart()
PNG
from pyfbsdk import *
from RS.Utils import Scene
def FindAnimationNode( pParent, pName ):
lResult = None
for lNode in pParent.Nodes:
if lNode.Name == pName:
lResult = lNode
break
return lResult
def getCharacterHeirarchyList(character):
characterNodeList = []
hips = character.GetModel( FBBodyNodeId.kFBHipsNodeId )
dummy = Scene.GetParent( hips )
Scene.GetChildren( dummy, characterNodeList, "", True )
return characterNodeList
currentCharacter = FBApplication().CurrentCharacter
characterNodeList = getCharacterHeirarchyList(currentCharacter)
mover = None
moveroffset = None
independentmoverdirection = None
upperfixupdirection = None
facingdirection = None
moveroffset = None
torsodirection = None
for node in characterNodeList:
if node.Name.lower() == 'mover':
mover = node
elif node.Name.lower() == 'oh_moveroffset':
moveroffset = node
elif node.Name.lower() == 'oh_independentmoverdirection':
independentmoverdirection = node
elif node.Name.lower() == 'oh_upperfixupdirection':
upperfixupdirection = node
elif node.Name.lower() == 'oh_torsodirection':
torsodirection = node
elif node.Name.lower() == 'oh_facingdirection':
facingdirection = node
elif node.Name.lower() == 'oh_moveroffset':
moveroffset = node
print mover
print moveroffset
print independentmoverdirection
print upperfixupdirection
print facingdirection
print moveroffset
print torsodirection
moverVisibility = mover.Show
if mover != None:
mover.Show = not moverVisibility
if moveroffset != None:
moveroffset.Show = not moverVisibility
if independentmoverdirection != None:
independentmoverdirection.Show = not moverVisibility
if upperfixupdirection != None:
upperfixupdirection.Show = not moverVisibility
if facingdirection != None:
facingdirection.Show = not moverVisibility
if moveroffset != None:
moveroffset.Show = not moverVisibility
if torsodirection != None:
torsodirection.Show = not moverVisibility
PNG