#!BPY
""" Released under the Blender Artistic Licence (BAL)
Name: 'ipo cyclic2real'
Blender: 241
Group: 'Animation'
Tooltip: 'wandelt eine extrapolierte ipo um'
"""
__author__ = "pat"
__version__ = "0.1 - 20060813 -"
__email__ = ('Author, pat:psycho3d*de')
__url__ = ("Author's website, www.psycho3d.de")
__bpydoc__ ="""\
Dieses Script wandelt eine extrapolierte Shape-Ipo um sodass der extrapolierte Teil auch Keys gesetzt hat.

Als Hilftsscript für Animesh Bridge
"""

import Blender as b

def apply():
	
	ob = b.Object.GetSelected()[0]
	ipo = b.NMesh.GetRaw(ob.getData(1)).getKey().getIpo()

	# alle curves bearbeiten
	for curve in ipo.curves:
		keys = []
		handles = []
		offset = -1
		
		# alle punkte speichern
		for bez in curve.bezierPoints:
			# init
			if offset == -1:
				offset = bez.pt[0]
				
			# keys speichern, relativ zum ersten
			keys.append([bez.pt[0] - offset, bez.pt[1]])
			
			# damit jeder key seine handles behaelt
			# und man mischen kann
			handles.append(bez.handleTypes)
		
		# echter startframe
		frameStart = offset
		# echter endframe
		frameEnd = keys[-1][0] + offset
		myStart = frameStart
		
		# letzten wegmachen, sonst isser doppelt
		keys = keys[:-1]
		del curve.bezierPoints[ -1 ]
		
		# falls wir nicht am anfang sind
		diff = frameEnd - frameStart
		while myStart > 1:
			myStart -= diff
		
		skip = 0
		# durchloopen bis zum ende
		while myStart < b.Get('endframe'):
			
			# keys adden, relativ zu mystart
			# handletypen werden beibehalten
			for i in range(len(keys)):

				# offset und skip damit die 
				# originale nicht nochmal gesetz werden
				if myStart != offset:
					if skip == 0:
						bez = b.BezTriple.New([keys[i][0] + myStart, keys[i][1], 1])
						bez.handleTypes = handles[i]
						curve.append( bez )
					else:
						skip -= 1
				else:
					skip = 1
			
			# einen schritt weiter und nochmal
			myStart += diff

		# nochmal aktualisieren
		curve.recalc()

apply()