'/// SRTKeyeMatch: ver 1.0 for XSI 3.5+
'/// By Homam Bahnassi - In|Framez 2003
'--------------------------------------

set oSelection = GetValue("SelectionList")
SRTKeysMatch oSelection, ""

function SRTKeysMatch (oObjCollection,sTol)

SRTKeysMatch = false

'--- Checking oObjCollection...
if typename(oObjCollection) <> "Object" then
	logmessage "SRTKeyeMatch: Invaled Argument 0..."
	exit function
end if

if oObjCollection.count = 0 then
	logmessage "SRTKeyeMatch: Objects required..."
end if

'--- Getting Tollorance
if sTol = "" then
	'---- Call Input Dialog
	GetTol iDlgTol,bValid
	if bValid = false then
		logmessage "SRTKeyeMatch: Cancelled By User..."
		exit function
	else
		iTol = iDlgTol + 0.25
	end if
else
	iTol = sTol + 0.25
end if

for each oObj in oObjCollection
On Error Resume next

Count = 0
set XRotCurve = oObj.Kinematics.Local.Parameters( "RotX" ).Source
set YRotCurve = oObj.Kinematics.Local.Parameters( "RotY" ).Source
set ZRotCurve = oObj.Kinematics.Local.Parameters( "RotZ" ).Source

set XRotKeys = XRotCurve.Keys
set YRotKeys = YRotCurve.Keys
set ZRotKeys = ZRotCurve.Keys

set XPosCurve = oObj.Kinematics.Local.Parameters( "PosX" ).Source
set YPosCurve = oObj.Kinematics.Local.Parameters( "PosY" ).Source
set ZPosCurve = oObj.Kinematics.Local.Parameters( "PosZ" ).Source

set XPosKeys = XPosCurve.Keys
set YPosKeys = YPosCurve.Keys
set ZPosKeys = ZPosCurve.Keys

set XSclCurve = oObj.Kinematics.Local.Parameters( "SclX" ).Source
set YSclCurve = oObj.Kinematics.Local.Parameters( "SclY" ).Source
set ZSclCurve = oObj.Kinematics.Local.Parameters( "SclZ" ).Source

set XSclKeys = XSclCurve.Keys
set YSclKeys = YSclCurve.Keys
set ZSclKeys = ZSclCurve.Keys

'--- Processing Rot-Z fcurve
for each ZKey in ZRotKeys
	set XKey = XRotCurve.GetKey(ZKey.Time,iTol)
	if Err.Number <> 0 then
		'logmessage "X-Rot Key ignored..." ' Debug info
	else
		XKey.Time = ZKey.Time
		Count=Count+1
		'logmessage "X-Rot Key moved to frame " & ZKey.Time ' Debug info
	end if
	Err.Number = 0
	set YKey = YRotCurve.GetKey(ZKey.Time,iTol)
	if Err.Number <> 0 then
		'logmessage "Y-Rot Key ignored..." ' Debug info
	else
		YKey.Time = ZKey.Time
		'logmessage "Y-Rot Key moved to frame " & ZKey.Time ' Debug info
		'Count=Count+1 ' Debug info
	end if
	Err.Number = 0
next

'--- Process Rot-X fcurve
for each XKey in XRotKeys
	set ZKey = ZRotCurve.GetKey(XKey.Time,iTol)
	if Err.Number <> 0 then
		'logmessage "Z-Rot Key ignored..." ' Debug info
	else
		ZKey.Time = XKey.Time
		'logmessage "Z-Rot Key moved to frame " & XKey.Time ' Debug info
		'Count=Count+1 ' Debug info
	end if
	Err.Number = 0
	set YKey = YRotCurve.GetKey(XKey.Time,iTol)
	if Err.Number <> 0 then
		'logmessage "Y-Rot Key ignored..." ' Debug info
	else
		YKey.Time = XKey.Time
		'logmessage "Y-Rot Key moved to frame " & XKey.Time ' Debug info
		'Count=Count+1 ' Debug info
	end if
	Err.Number = 0
next

'--- Process Rot-Y fcurve
for each YKey in YRotKeys
	set XKey = XRotCurve.GetKey(YKey.Time,iTol)
	if Err.Number <> 0 then
		'logmessage "X-Rot Key ignored..." ' Debug info
	else
		XKey.Time = YKey.Time
		'logmessage "X-Rot Key moved to frame " & YKey.Time ' Debug info
		'Count=Count+1 ' Debug info
	end if
	Err.Number = 0
	set XKey = XRotCurve.GetKey(YKey.Time,iTol)
	if Err.Number <> 0 then
		'logmessage "X-Rot Key ignored..." ' Debug info
	else
		XKey.Time = YKey.Time
		'logmessage "X-Rot Key moved to frame " & YKey.Time ' Debug info
		'Count=Count+1 ' Debug info
	end if
	Err.Number = 0
next

'--- Process Pos-Y fcurve
for each YKey in YPosKeys
	set XKey = XPosCurve.GetKey(YKey.Time,iTol)
	if Err.Number <> 0 then
		'logmessage "X-Pos Key ignored..." ' Debug info
	else
		XKey.Time = YKey.Time
		'logmessage "X-Pos Key moved to frame " & YKey.Time ' Debug info
		'Count=Count+1 ' Debug info
	end if
	Err.Number = 0
	set ZKey = ZPosCurve.GetKey(YKey.Time,iTol)
	if Err.Number <> 0 then
		'logmessage "Z-Pos Key ignored..." ' Debug info
	else
		ZKey.Time = YKey.Time
		'logmessage "Z-Pos Key moved to frame " & YKey.Time ' Debug info
		'Count=Count+1 ' Debug info
	end if
	Err.Number = 0
next

'--- Process Pos-Z fcurve
for each ZKey in ZPosKeys
	set XKey = XPosCurve.GetKey(ZKey.Time,iTol)
	if Err.Number <> 0 then
		'logmessage "X-Pos Key ignored..." ' Debug info
	else
		XKey.Time = ZKey.Time
		'logmessage "X-Pos Key moved to frame " & ZKey.Time ' Debug info
		'Count=Count+1 ' Debug info
	end if
	Err.Number = 0
	set YKey = YPosCurve.GetKey(ZKey.Time,iTol)
	if Err.Number <> 0 then
		'logmessage "Y-Pos Key ignored..." ' Debug info
	else
		YKey.Time = ZKey.Time
		'logmessage "Y-Pos Key moved to frame " & ZKey.Time ' Debug info
		'Count=Count+1 ' Debug info	
	end if
	Err.Number = 0
next

'--- Process Pos-X fcurve
for each XKey in XPosKeys
	set ZKey = ZPosCurve.GetKey(XKey.Time,iTol)
	if Err.Number <> 0 then
		'logmessage "Z-Pos Key ignored..." ' Debug info
	else
		ZKey.Time = XKey.Time
		'logmessage "Z-Pos Key moved to frame " & XKey.Time ' Debug info
		'Count=Count+1 ' Debug info
	end if
	Err.Number = 0
	set YKey = YPosCurve.GetKey(XKey.Time,iTol)
	if Err.Number <> 0 then
		'logmessage "Y-Pos Key ignored..." ' Debug info
	else
		YKey.Time = XKey.Time
		'logmessage "Y-Pos Key moved to frame " & XKey.Time ' Debug info
		'Count=Count+1 ' Debug info
	end if
	Err.Number = 0
next

'logmessage Count & " key(s) matched" ' Debug info
next

'--- Process Scl-X fcurve
for each XKey in XSclKeys
	set ZKey = ZSclCurve.GetKey(XKey.Time,iTol)
	if Err.Number <> 0 then
		'logmessage "Z-Scl Key ignored..." ' Debug info
	else
		ZKey.Time = XKey.Time
		'logmessage "Z-Scl Key moved to frame " & XKey.Time ' Debug info
		'Count=Count+1 ' Debug info
	end if
	Err.Number = 0
	set YScl = YSclCurve.GetKey(XKey.Time,iTol)
	if Err.Number <> 0 then
		'logmessage "Y-Scl Key ignored..." ' Debug info
	else
		YKey.Time = XKey.Time
		'logmessage "Y-Scl Key moved to frame " & XKey.Time ' Debug info
		'Count=Count+1 ' Debug info
	end if
	Err.Number = 0
next

'--- Process Scl-Y fcurve
for each YKey in YSclKeys
	set XKey = XSclCurve.GetKey(YKey.Time,iTol)
	if Err.Number <> 0 then
		'logmessage "X-Scl Key ignored..." ' Debug info
	else
		XKey.Time = YKey.Time
		'logmessage "X-Scl Key moved to frame " & YKey.Time ' Debug info
		'Count=Count+1 ' Debug info
	end if
	Err.Number = 0
	set XKey = XSclCurve.GetKey(YKey.Time,iTol)
	if Err.Number <> 0 then
		'logmessage "X-Scl Key ignored..." ' Debug info
	else
		XKey.Time = YKey.Time
		'logmessage "X-Scl Key moved to frame " & YKey.Time ' Debug info
		'Count=Count+1 ' Debug info
	end if
	Err.Number = 0
next

'--- Processing Scl-Z fcurve
for each ZKey in ZSclKeys
	set XKey = XSclCurve.GetKey(ZKey.Time,iTol)
	if Err.Number <> 0 then
		'logmessage "X-Scl Key ignored..." ' Debug info
	else
		XKey.Time = ZKey.Time
		Count=Count+1
		'logmessage "X-Scl Key moved to frame " & ZKey.Time ' Debug info
	end if
	Err.Number = 0
	set YKey = YSclCurve.GetKey(ZKey.Time,iTol)
	if Err.Number <> 0 then
		'logmessage "Y-Scl Key ignored..." ' Debug info
	else
		YKey.Time = ZKey.Time
		'logmessage "Y-Scl Key moved to frame " & ZKey.Time ' Debug info
		'Count=Count+1 ' Debug info
	end if
	Err.Number = 0
next

SRTKeysMatch = true

end function

function GetTol(iTol, bValid)
	set oRoot = application.activeproject.activescene.root

	bValid = false

	set oDial = AddProp("Custom_Parameter_List", oRoot, , "iTol").Value("Value")
	sOptionSliders = oRoot & "." & oDial

	SIAddCustomParameter sOptionSliders, "TolranceValue", siInt4, 1, 0, 10000, , 5, 0, 10

	on error resume next
	InspectObj sOptionSliders ,,,SIModal

	if Err.Number <> 0 then
		DeleteObj sOptionSliders
		exit function
	end if
	
	iTol = GetValue(sOptionSliders & ".TolranceValue")
	
	DeleteObj sOptionSliders
	bValid = true
end function
