Following the question I had asked yesterday which is here passing contents from multiple lists generated in different functions to a file I have written the code. Part of the code is below,
def lower_lip_under_upper_teeth_bezier(x_n, p0, p3) :
""" Calculating sampling points using rational bezier curve equation"""
lower_lip_under_upper_teeth_p_u_list = []
u = x_n
p1 = p0
p2 = p3
lower_lip_under_upper_teeth_p_u = math.pow(1 - u, 3) * p0 + 3 * u * math.pow(1 - u, 2) * p1 \
+ 3 * (1 - u) * math.pow(u, 2) * p2 + math.pow(u, 3) * p3
lower_lip_under_upper_teeth_p_u = lower_lip_under_upper_teeth_p_u * w
d = math.pow(1 - u, 3) * w + 3 * u * w * math.pow(1 - u, 2) + 3 * (1 - u) * w * math.pow(u, 2) + math.pow(u, 3) * w
lower_lip_under_upper_teeth_p_u = lower_lip_under_upper_teeth_p_u / d
print "p(u): ", lower_lip_under_upper_teeth_p_u
lower_lip_under_upper_teeth_p_u_list.append(lower_lip_under_upper_teeth_p_u)
return lower_lip_under_upper_teeth_p_u_list
def mel_script() :
""" Generating the mel script with the animation information """
print "\n The mel script generated for the input speech with the chosen energy level"
with open("mel.txt", "w") as melFile :
melFile.write('setKeyframe "BS_stickyLips_SL_recept.head_geo_stickyLips_wire";'
'setKeyframe "BS_stickyLips_baseSL_recept.head_geo";'
'setKeyframe "BS_stickyLips_wireSL_recept.head_geo";'
'setKeyframe "blend_shape.lip_round";'
'setKeyframe "blend_shape.jaw_open";'
'setKeyframe "blend_shape.lips_spread";'
'setKeyframe "blend_shape.lips_part";'
'setKeyframe "blend_shape.lower_lip_under_upper_teeth";')
for p in lower_lip_under_upper_teeth_bezier :
melFile.write('setAttr "blend_shape.jaw_open" %f ;' % p )
melFile.write('setKeyframe -breakdown 0 -hierarchy none -controlPoints 0 -shape 0 {"blend_shape"};')
But I am getting an error which is,
for p in lower_lip_under_upper_teeth_bezier :
TypeError: 'function' object is not iterable
lower_lip_under_upper_teeth_bezieris a function. The error message clearly tells it, there is no way around it.You might believe that
lower_lip_under_upper_teeth_bezieris an iterable, but it is not.Now, mine is just a guess, but I believe what you want to do is something like:
EDIT (see comments): I think there is some basic misunderstanding on how python works going on here… In python (as in most programming languages!) when you declare a function, you declare its name and what arguments it expects.
If you are trying to pass 5 lists to
mel_script, when you declaremel_scriptyou should say so:Then, when calling
mel_script, you need to pass these lists to it. If such lists are generated by functions (sayf1,f2,f3…). You could do it all in one line with:otherwise you have to store the lists in temporary variables and pass those to
mel_scirpt:In the above examples note that
f1()has round parenthesis denoting the fact you are calling the function namedf1. If you would omit those, then you would be passing the function itself, not its result.In reality there are cleverer ways to achieve this (like passing a variable number of arguments, or using closures, but from your question I understand that you are not (yet!) proficient with python, so it would be better to stick with this method for now! 🙂
HTH!