As I touched on briefly in that Nukepedia article, <knob>.animations is actually quite unreliable, as it just returns a list of all the animated indices in order, with no reference for which curve belongs to which component.
You should be able to do what you’re after by combining the index-checking logic with a simple loop through the views in your comp. You can check out the Bake Expressions function on Nukepedia for an example of how to safely loop through Array knobs without stepping outside the array size, though you may want to add a knob class check. http://www.nukepedia.com/gizmos/bake-expressions/. Both the .isAnimated() and .animation() knob methods accept an optional view parameter, so you can pretty much loop blindly, check for animation data at every view and index, and offset it if it exists. Even if you haven’t split a knob by view, it still actually has discrete AnimationCurve objects per view (but until you split the knob, the first view’s AnimationCurve is just applied to all components). Hope this helps some, -Nathan From: Howard Jones Sent: Monday, March 07, 2011 2:48 PM To: Nuke Python discussion Subject: Re: [Nuke-python] knobs fields Hi Nathan and all Thanks for that - it got me some way except in my case for stereo. Is there a way then to see if a knob has been split off? The issue is working with your examples on nukepedia that if you pass a higher number into animation(n) than exists it segment faults Nuke (now Bug 17174 - nuke.animation causes segmentation fault ) So what I am trying to do is to find the number of fields so that I never go over the amount. Below is the code I am working on - which for a mono project will take all selected keyframes in a selected node (haven't got round that bit yet) and pastes these further down the line. Ideally I would like to just get this from nuke.animations() but I cant see how to use that information and no-one has come back so I'm stuck. Anyway clunky code but gets someway towards pasting at position, but doesn't paste into another curve. If I can get the exact number of fields (ie split or not) then this will work on multiviews otherwise it can only work on mono. # gets segmentation fault unless you can figure out how many curves there are per knob def pasteKeyframes(): sn=nuke.selectedNodes() s=len(sn) numViews=len(nuke.views()) if s : '''get the array size of the knob so that animation(num) doesn't cause a segmentation fault and check that the knob supports an arraySize() - note a couple of things also slip through''' for n in sn : firstKeyFound=0 offset=0 for k in n.knobs(): try: ks=n[k].arraySize() except: ks=('wrong type') num=0 i=0 if ks is not 'wrong type': while num<ks: ''' get the number of keys on the curve''' try: na=n[k].animation(num) ns=na.size() '''step through the keys - check if they are selected the paste the values from timebar onwards''' while i < ns: keySelected= (na.keys()[i].selected) if keySelected: firstKeyFound+=1 print k,ks,num keyVals= (na.keys()[i].x, na.keys()[i].y) if firstKeyFound==1: offset=nuke.frame()-keyVals[0] print ('keySelected: '+str(keySelected)+' keyvalues: '+str(keyVals)+' firstKeyFound: '+str(firstKeyFound)+ ' offset: '+str(offset)) na.setKey(keyVals[0]+offset,keyVals[1]) else: print ('key not selected') i+=1 except AttributeError: pass num+=1 else: nuke.message ('Please select a node as well as keyframes') ------------------------------------------------------------------------------ From: Nathan Rusch <[email protected]> To: Howard Jones <[email protected]>; Nuke Python discussion <[email protected]> Sent: Monday, 7 March 2011, 18:43 Subject: Re: [Nuke-python] knobs fields I think you’re after <knob>.arraySize() Keep in mind that this will only work with knobs inherited from Array_Knob. And as far as multiple views go, you just need to multiply the arraySize() value by the number of views. -Nathan From: Howard Jones Sent: Monday, March 07, 2011 10:38 AM To: Nuke Python discussion Subject: [Nuke-python] knobs fields Dear all Whats the best way to determine the amount of fields a knob will have. ie XY position knob has 2 fields but 4 in stereo (I think?) What I'd like to do is query the knob and get an integer for its fields. Any help much appreciated Howard ------------------------------------------------------------------------------ _______________________________________________ Nuke-python mailing list [email protected] http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python -------------------------------------------------------------------------------- _______________________________________________ Nuke-python mailing list [email protected] http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python
_______________________________________________ Nuke-python mailing list [email protected] http://support.thefoundry.co.uk/cgi-bin/mailman/listinfo/nuke-python
