from win32com.client import constants as c

def main(oCrv):

	oCrv = Application.Selection(0)
	oCrvPrimitive = oCrv.ActivePrimitive

	oRoot = Application.ActiveSceneRoot
	oLin = oRoot.AddNurbsCurve([[0,1], [2,3], [4,5], [1,1]], None, 0, 1)
	oLin.Name = oCrv.FullName + '_Uniform_Linear'

	oScop = XSIFactory.CreateScriptedOp("jj_evenCurve", "", "Python")
	oScop.AddOutputPort(oLin.ActivePrimitive)
	oScop.AddInputPort(oCrvPrimitive)
	oScop.AddInputPort(oCrv.Kinematics.Global)
	oScop.AddInputPort(oLin.Kinematics.Global)
	oPDef = XSIFactory.CreateParamDef2( "Resolution", 2, 40)
	oScop.AddParameter(oPDef)
	oPDef = XSIFactory.CreateParamDef2( "Constrain", 11, 1)
	oScop.AddParameter(oPDef)
	oPDef = XSIFactory.CreateParamDef2( "Degree", 2, 1, 1, 3)
	oScop.AddParameter(oPDef)
	oScop.AlwaysEvaluate = 1

	oScop.Code = codeStr
	oScop.Connect()
	Application.InspectObj(oScop)
	Application.SelectObj(oLin)
	return

codeStr = """
def unzip(list):
	if len(list) == 0: return ()
	l = []
	for t in range(len(list[0])):
		l.append(map( lambda x,t=t: x[t], list ))
	return l
	
def jj_evenCurve_Update(ctx, Out, oCrv, in_trans, in_trans2):
	l = []
	oCrv = oCrv.Value.Geometry.Curves(0)
	res = ctx.Operator.Parameters("Resolution").Value
	constrain = ctx.Operator.Parameters("Constrain").Value
	degree = ctx.Operator.Parameters("Degree").Value
	if res > 1:
		oTrans = in_trans.Value.Transform
		oTrans2 = in_trans2.Value.Transform
		
		for x in range(res + 1):
			u = oCrv.GetUFromPercentage((x/float(res))*100)
			l.append(oCrv.EvaluatePosition(u)[0])

		l_data = []
		for x in l:
			if constrain:
				oMat = oTrans2.Matrix4
				oMat.InvertInPlace() 
				x.MulByTransformationInPlace(oTrans)
				x.MulByMatrix4InPlace(oMat)
				
				#oTrans2.Matrix4 = oMat
				#x.MulByTransformationInPlace(oTrans2)
				
				
			l_data.append( x.Get2() )
		l_data = unzip(l_data)
		w = [1.0] * len(l_data[0])
		l_data.append(w)
		
		Out.Value.Geometry.Set(1, l_data, None,None,None,None,(degree,),(1,))
"""	

oCrv = Application.Selection(0)
if oCrv and oCrv.Type == 'crvlist': 
	main(oCrv)