﻿<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://wiki.blender.jp/index.php?action=history&amp;feed=atom&amp;title=%E5%88%A9%E7%94%A8%E8%80%85%3AKoilz%2F2.66.00_code_review_NLA_Editor</id>
	<title>利用者:Koilz/2.66.00 code review NLA Editor - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.blender.jp/index.php?action=history&amp;feed=atom&amp;title=%E5%88%A9%E7%94%A8%E8%80%85%3AKoilz%2F2.66.00_code_review_NLA_Editor"/>
	<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Koilz/2.66.00_code_review_NLA_Editor&amp;action=history"/>
	<updated>2026-05-19T02:38:42Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Koilz/2.66.00_code_review_NLA_Editor&amp;diff=140999&amp;oldid=prev</id>
		<title>Yamyam: 1版 をインポートしました</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Koilz/2.66.00_code_review_NLA_Editor&amp;diff=140999&amp;oldid=prev"/>
		<updated>2018-06-28T20:53:43Z</updated>

		<summary type="html">&lt;p&gt;1版 をインポートしました&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ja&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← 古い版&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;2018年6月28日 (木) 20:53時点における版&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ja&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(相違点なし)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Yamyam</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Koilz/2.66.00_code_review_NLA_Editor&amp;diff=140998&amp;oldid=prev</id>
		<title>2013年3月24日 (日) 16:09にwiki&gt;Koilzによる</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=%E5%88%A9%E7%94%A8%E8%80%85:Koilz/2.66.00_code_review_NLA_Editor&amp;diff=140998&amp;oldid=prev"/>
		<updated>2013-03-24T16:09:54Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;=== 13.03.16: NLA Editor ===&lt;br /&gt;
&lt;br /&gt;
Nla Editor: None Linear Animation Editor.&lt;br /&gt;
&lt;br /&gt;
these are some idears.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 13.03.20: problems ===&lt;br /&gt;
&lt;br /&gt;
make new action from current action&lt;br /&gt;
* this can be done.&lt;br /&gt;
&lt;br /&gt;
auto sync length&lt;br /&gt;
* bool switch: auto sync length.&lt;br /&gt;
* bool switch: sync all strips with same action.&lt;br /&gt;
* problems with strips being to big.&lt;br /&gt;
&lt;br /&gt;
blend interpolation&lt;br /&gt;
* not sure how it does it at the moment. but will need support for multiple strips.&lt;br /&gt;
&lt;br /&gt;
change object&lt;br /&gt;
* should be ok.&lt;br /&gt;
&lt;br /&gt;
smooth transition&lt;br /&gt;
* not sure about this yet. todo with transition between strips.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 13.03.21: what do people do ===&lt;br /&gt;
&lt;br /&gt;
* first usually, make an animation on the timeline, then freeze it.&lt;br /&gt;
* edit strip.&lt;br /&gt;
* duplicate strip.&lt;br /&gt;
* rename strip.&lt;br /&gt;
* bool switch: auto sync length.&lt;br /&gt;
* bool switch: sync all strips with same action.&lt;br /&gt;
* make new strip action from strip action.&lt;br /&gt;
* copy object[A].action to object[B].action then delete object[A].action.&lt;br /&gt;
* auto snap enum.&lt;br /&gt;
* folder feature, dont know what for: (00:00 youtube /watch?v=IBRqmeErOHU)&lt;br /&gt;
* its better for repetative game animations. or loop, like bird wings. or loop background animation.&lt;br /&gt;
* blend is used to blend animations. walk + duck = walk to duck walk. (5:00 &amp;amp; 9:00 &amp;amp; 10:20: youtube /watch?v=x2kkOROZPvE)&lt;br /&gt;
* repeats good.&lt;br /&gt;
* copy paste.&lt;br /&gt;
* mabey good to add code to move keyframe point in nlastrip tweak mode, like dopesheet editor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 13.03.16: Nla Editor vs Composer ===&lt;br /&gt;
&lt;br /&gt;
With composers X is time. Y can have multiple modes.&lt;br /&gt;
&lt;br /&gt;
Y Main&lt;br /&gt;
* Y is usually a sound effect, like a type of synth, for example a cat or dog sound.&lt;br /&gt;
* Moving the data block to the different track would change the sound of the notes.&lt;br /&gt;
&lt;br /&gt;
Y Edit&lt;br /&gt;
* Composers usually have edit mode also, if its a MIDI, this is change the pitch of the notes.&lt;br /&gt;
* If its a raw sound signal, sometimes you can draw the signal.&lt;br /&gt;
* In this mode will not see any other data block.&lt;br /&gt;
&lt;br /&gt;
NlaStrips are animation keyframes in a block. &lt;br /&gt;
&lt;br /&gt;
Nla Editor in Main mode doesnt require an Y property.&lt;br /&gt;
* Sometimmes you may want to overlap animations or just move them about.&lt;br /&gt;
* So its better to keep it free from Y.&lt;br /&gt;
* Though it shouldnt be ruled out, mabey it code have different Main_modes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 13.03.16: NlaTest ===&lt;br /&gt;
&lt;br /&gt;
I made two NlaStrips by by adding keyingsets then pressing freeze to turn them into NlaStrips.&lt;br /&gt;
&lt;br /&gt;
Then i duplicated them.&lt;br /&gt;
&lt;br /&gt;
[[File:NlaTest.PNG|500px]]&lt;br /&gt;
&lt;br /&gt;
NlaTracks&lt;br /&gt;
* NlaTrack&lt;br /&gt;
* NlaTrack.001&lt;br /&gt;
* NlaTrack.002&lt;br /&gt;
* NlaTrack.003&lt;br /&gt;
&lt;br /&gt;
NlaStrips&lt;br /&gt;
* A&lt;br /&gt;
* A.001&lt;br /&gt;
* A.002&lt;br /&gt;
* A.003&lt;br /&gt;
* A..&lt;br /&gt;
* B&lt;br /&gt;
* B.001&lt;br /&gt;
* B.002&lt;br /&gt;
* B.003&lt;br /&gt;
* B..&lt;br /&gt;
&lt;br /&gt;
Actions&lt;br /&gt;
* CubeAction&lt;br /&gt;
* CubeAction.001&lt;br /&gt;
&lt;br /&gt;
Actions are the keyframes.&lt;br /&gt;
&lt;br /&gt;
Transitional strips to process outer keyframes. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 13.03.20: NlaStrips ===&lt;br /&gt;
&lt;br /&gt;
The NlaStrips have Actions.&lt;br /&gt;
&lt;br /&gt;
NlaTrack &amp;gt; NlaStrip &amp;gt; Action &amp;gt; Keyframes&lt;br /&gt;
&lt;br /&gt;
When you duplicate the Strip it uses the same action.&lt;br /&gt;
&lt;br /&gt;
To edit the keyframes of a NlaStrip enter Tweak Mode (TAB).&lt;br /&gt;
&lt;br /&gt;
If you modify the action keyframes of one strip the other strips are modified.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 13.03.20: Sync Action Length === &lt;br /&gt;
&lt;br /&gt;
You can sync the NlaStrip length with: Header: Edit: Sync Action Length.&lt;br /&gt;
&lt;br /&gt;
This will set strip length for the strips selected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 13.03.20: copy set new NlaStrip Action=== &lt;br /&gt;
&lt;br /&gt;
Make a NlaStrip Action unique (copy set).&lt;br /&gt;
* Properties: Animation Data: Brows Action to be linked.&lt;br /&gt;
* select the action you want to copy.&lt;br /&gt;
* this will add the action.keyframes to the timeline.&lt;br /&gt;
* press Properties: Animation Data: [+].&lt;br /&gt;
* this will make a new action with the same keyframes.&lt;br /&gt;
* press snowflake.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 13.03.20: no track ===&lt;br /&gt;
&lt;br /&gt;
[[File:K_nlades.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 13.03.20: auto sync length ===&lt;br /&gt;
&lt;br /&gt;
auto sync length&lt;br /&gt;
* bool switch: auto sync length. &lt;br /&gt;
* bool switch: sync all strips with same action. &lt;br /&gt;
* problems with strips being to big.&lt;br /&gt;
&lt;br /&gt;
bool switch: auto sync length.&lt;br /&gt;
&lt;br /&gt;
comes with problems.&lt;br /&gt;
&lt;br /&gt;
after editing if the strip maybe too big.&lt;br /&gt;
&lt;br /&gt;
so two options, jump track, or be passive, this would be a bool switch.&lt;br /&gt;
&lt;br /&gt;
if passive the track would be processed like an overlapping action.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 13.03.20: stack interpolation ===&lt;br /&gt;
&lt;br /&gt;
i think this is how to process multiple propeties.&lt;br /&gt;
&lt;br /&gt;
this would be after each fcurve interpolation.&lt;br /&gt;
&lt;br /&gt;
[[File:K_stack.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 13.03.20: Blend ===&lt;br /&gt;
&lt;br /&gt;
Not sure about this yet.&lt;br /&gt;
&lt;br /&gt;
This is when keyframes Blend/interpolation.&lt;br /&gt;
&lt;br /&gt;
Automaticly setup when NlaStrips overlap.&lt;br /&gt;
&lt;br /&gt;
When blend is used on an NlaStrip, the NlaTrack becomes dominate.&lt;br /&gt;
&lt;br /&gt;
So the next strip must be on the same track (mabey loop bug).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 13.03.22: mesh blend ===&lt;br /&gt;
&lt;br /&gt;
NLA Editor: Properties: Active Strip&lt;br /&gt;
&lt;br /&gt;
Extrapolation and Blend, this is for mesh blending.&lt;br /&gt;
&lt;br /&gt;
By default its on Replace.&lt;br /&gt;
&lt;br /&gt;
Add will usually make the mesh bigger because there are two meshes it add them together.&lt;br /&gt;
&lt;br /&gt;
Subtract will shrink the mesh.&lt;br /&gt;
&lt;br /&gt;
Playback Settings:&lt;br /&gt;
&lt;br /&gt;
Reversed, will play the strip backwards.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 13.03.22: blend ===&lt;br /&gt;
&lt;br /&gt;
lets say im auto blending these.&lt;br /&gt;
&lt;br /&gt;
[[File:K_nla_blend.PNG]]&lt;br /&gt;
&lt;br /&gt;
[ cube up ] bottom_left to bottom_right.&lt;br /&gt;
&lt;br /&gt;
[cuberight] bottom_right to top_right.&lt;br /&gt;
&lt;br /&gt;
with [ cube up ] blend starts at bottom and goes to top. 0 - 1.&lt;br /&gt;
&lt;br /&gt;
with [cuberight] blend starts at top and goes to bottom. 1 - 0.&lt;br /&gt;
&lt;br /&gt;
the auto blend creates a curve motion.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 13.03.22: blend replace ===&lt;br /&gt;
&lt;br /&gt;
[[File:K_nla_blend_rep.PNG]]&lt;br /&gt;
&lt;br /&gt;
move&lt;br /&gt;
* 2 keyframes&lt;br /&gt;
* Time 00.00 - 20.00&lt;br /&gt;
* X Location 0.0 - 5.0&lt;br /&gt;
* Y Location 0.0 - 0.0&lt;br /&gt;
* Z Location 0.0 - 0.0&lt;br /&gt;
* Auto Blend In/Out: off&lt;br /&gt;
* Blend In: 0.000&lt;br /&gt;
* Blend Out: 0.000&lt;br /&gt;
&lt;br /&gt;
top&lt;br /&gt;
* 2 keyframes&lt;br /&gt;
* Time 05.00 - 15.00&lt;br /&gt;
* Z location 3.0 - 3.0&lt;br /&gt;
* Auto Blend In/Out: off&lt;br /&gt;
* Blend In: 5.000&lt;br /&gt;
* Blend Out: 5.000&lt;br /&gt;
&lt;br /&gt;
time&lt;br /&gt;
*at time 0, 'move' has 1.0 influence.&lt;br /&gt;
*at time 5, 'top' starts to blend in.&lt;br /&gt;
*at time 10, 'top' replaces 'move'. 'top' has 1.0 influence, 'move' has 0.0 influence.&lt;br /&gt;
*at time 15, 'top' blends out and 'move' has 1.0 influence.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 13.03.22: tweak blend tab ===&lt;br /&gt;
&lt;br /&gt;
the nlastrip_action and nla_blend tabs would be shown in tweak mode (TAB).&lt;br /&gt;
&lt;br /&gt;
[[File:K_nla_des2.PNG|600px]]&lt;br /&gt;
&lt;br /&gt;
nla00: the tracks would show strips for all objects in the scene.&lt;br /&gt;
&lt;br /&gt;
with this one, be easier to change strip object.&lt;br /&gt;
&lt;br /&gt;
nla01: object seperated version.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 13.03.24: Auto blend ===&lt;br /&gt;
&lt;br /&gt;
These work good.&lt;br /&gt;
&lt;br /&gt;
[[File:K_nla_auto_blend.PNG]]&lt;br /&gt;
&lt;br /&gt;
The second one, 'left' is blending 'right' and 'right.001' at the same time.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== :::::::: code :::::::: ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 13.03.16: c data ===&lt;br /&gt;
&lt;br /&gt;
Note that keyframes and drivers are Fcurves (AnimData.drivers).&lt;br /&gt;
* Fcurves have a funny IO using ChannelDrivers and rna_path.&lt;br /&gt;
* BezTriple is the keyframe array.&lt;br /&gt;
&lt;br /&gt;
Heres some branches not all.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;----------------------------------------------------------------&lt;br /&gt;
AnimData&lt;br /&gt;
	bAction		*action;		// bAction 			action			/* active action - acts as the 'tweaking track' for the NLA */&lt;br /&gt;
													/* temp-storage for the 'real' active action (i.e. the one used before the tweaking-action */&lt;br /&gt;
													/* took over to be edited in the Animation Editors) */&lt;br /&gt;
	bAction 	*tmpact;		// bAction 			temp action&lt;br /&gt;
	ListBase 	nla_tracks;		// NlaTracks			tracks			/* nla-tracks */&lt;br /&gt;
	NlaStrip 	*actstrip;		// NlaStrip			strip			/* active NLA-strip (only set/used during tweaking, so no need to worry about dangling pointers) */&lt;br /&gt;
&lt;br /&gt;
bAction&lt;br /&gt;
	ListBase	curves;    		// FCurve			curves			/* function-curves (FCurve) */&lt;br /&gt;
	ListBase 	groups;    		// bActionGroup			groups			/* groups of function-curves (bActionGroup) */&lt;br /&gt;
&lt;br /&gt;
NlaTrack&lt;br /&gt;
	struct NlaTrack *next, *prev;		// NlaTrack*			next, prev&lt;br /&gt;
	ListBase 	strips;			// bActionStrips		strips			/* bActionStrips in this track */&lt;br /&gt;
	char 		name[64];		// char				name&lt;br /&gt;
&lt;br /&gt;
NlaStrip&lt;br /&gt;
	struct NlaStrip *next, *prev;		// NlaStrip*			next, prev&lt;br /&gt;
	ListBase 	strips;            	// (NlaStrip,bActionStrips)	strips			/* 'Child' strips (used for 'meta' strips) */&lt;br /&gt;
	bAction 	*act;               	// bAction*			act			/* Action that is referenced by this strip (strip is 'user' of the action) */&lt;br /&gt;
	ListBase 	fcurves;        	// FCurve			fcurves			/* F-Curves for controlling this strip's influence and timing */    // TODO: move out?&lt;br /&gt;
&lt;br /&gt;
	char 		name[64];              	// char				name			/* User-Visible Identifier for Strip */&lt;br /&gt;
	float 		influence;            	// float			influence		/* Influence of strip */&lt;br /&gt;
	float 		strip_time;          	// float			strip_time		/* Current 'time' within action being used (automatically evaluated, but can be overridden) */&lt;br /&gt;
	float 		start, end;          	// float			start, end		/* extents of the strip */&lt;br /&gt;
	float 		actstart, actend;     	// float			actstart, actend	/* range of the action to use */&lt;br /&gt;
	float 		repeat;               	// float			repeat			/* The number of times to repeat the action range (only when no F-Curves) */&lt;br /&gt;
	float 		scale;                	// float			scale			/* The amount the action range is scaled by (only when no F-Curves) */&lt;br /&gt;
&lt;br /&gt;
	float 		blendin, blendout;    	// float			blendin, blendout	/* strip blending length (only used when there are no F-Curves) */&lt;br /&gt;
	short 		blendmode;            	// short			blendmode		/* strip blending mode (layer-based mixing) */&lt;br /&gt;
----------------------------------------------------------------&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;----------------------------------------------------------------&lt;br /&gt;
source/blender/makesdna/DNA_anim_types.h&lt;br /&gt;
	FModifier&lt;br /&gt;
	FMod_Generator&lt;br /&gt;
	FMod_FunctionGenerator&lt;br /&gt;
	FCM_EnvelopeData&lt;br /&gt;
	FMod_Envelope&lt;br /&gt;
	FMod_Cycles&lt;br /&gt;
	FMod_Python&lt;br /&gt;
	FMod_Limits&lt;br /&gt;
	FMod_Noise&lt;br /&gt;
	FMod_Stepped&lt;br /&gt;
	DriverTarget&lt;br /&gt;
	DriverVar&lt;br /&gt;
	ChannelDriver&lt;br /&gt;
	FPoint&lt;br /&gt;
	FCurve&lt;br /&gt;
	AnimMapPair&lt;br /&gt;
	AnimMapper&lt;br /&gt;
	NlaStrip&lt;br /&gt;
	NlaTrack&lt;br /&gt;
	KS_Path&lt;br /&gt;
	KeyingSet&lt;br /&gt;
	AnimOverride&lt;br /&gt;
	AnimData&lt;br /&gt;
	IdAdtTemplate&lt;br /&gt;
	&lt;br /&gt;
source/blender/makesdna/DNA_action_types.h&lt;br /&gt;
	bMotionPathVert&lt;br /&gt;
	bMotionPath&lt;br /&gt;
	bAnimVizSettings&lt;br /&gt;
	bPoseChannel&lt;br /&gt;
	bPose&lt;br /&gt;
	bIKParam&lt;br /&gt;
	bItasc&lt;br /&gt;
	bActionGroup&lt;br /&gt;
	bAction&lt;br /&gt;
	bDopeSheet&lt;br /&gt;
	SpaceAction&lt;br /&gt;
	bActionChannel&lt;br /&gt;
----------------------------------------------------------------&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Python&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;----------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
bpy.data.objects['Cube'].animation_data.nla_tracks['NlaTrack'].&lt;br /&gt;
bpy.data.objects['Cube'].animation_data.nla_tracks['NlaTrack'].strips['A.002'].&lt;br /&gt;
&lt;br /&gt;
--------&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bpy.data.objects['Cube'].animation_data.nla_tracks['NlaTrack'].strips['A.002'].action&lt;br /&gt;
bpy.data.actions['CubeAction']&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bpy.data.actions['CubeAction'].fcurves[0].color&lt;br /&gt;
Color((0.0, 0.0, 0.0))&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bpy.data.actions['CubeAction'].fcurves[0].keyframe_points[0].co&lt;br /&gt;
Vector((7.0, -3.0))&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bpy.data.actions['CubeAction'].fcurves[0].keyframe_points[0].handle_left&lt;br /&gt;
Vector((2.05462646484375, -3.0))&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bpy.data.actions['CubeAction'].fcurves[0].keyframe_points[0].handle_right&lt;br /&gt;
Vector((11.94537353515625, -3.0))&lt;br /&gt;
&lt;br /&gt;
--------&lt;br /&gt;
&lt;br /&gt;
'CubeAction' has 3 keyframes.&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bpy.data.actions['CubeAction'].fcurves[1].keyframe_points[0].co&lt;br /&gt;
Vector((7.0, 0.0))&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bpy.data.actions['CubeAction'].fcurves[1].keyframe_points[1].co&lt;br /&gt;
Vector((20.0, 0.0))&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bpy.data.actions['CubeAction'].fcurves[1].keyframe_points[2].co&lt;br /&gt;
Vector((59.0, 0.0))&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bpy.data.actions['CubeAction'].fcurves[1].keyframe_points[3].co&lt;br /&gt;
Traceback (most recent call last):&lt;br /&gt;
  File &amp;quot;&amp;lt;blender_console&amp;gt;&amp;quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;
IndexError: bpy_prop_collection[index]: index 3 out of range, size 3&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 13.03.19: python data ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;----------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
objects&lt;br /&gt;
	nla_tracks&lt;br /&gt;
		strips&lt;br /&gt;
			action&lt;br /&gt;
				group&lt;br /&gt;
					channels&lt;br /&gt;
						keyframe_points&lt;br /&gt;
action&lt;br /&gt;
	group&lt;br /&gt;
		channels&lt;br /&gt;
			keyframe_points&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
# object track strip action&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bpy.data.objects['Cube'].animation_data.nla_tracks['NlaTrack'].strips['A'].action&lt;br /&gt;
bpy.data.actions['CubeAction']&lt;br /&gt;
&lt;br /&gt;
# first keyframe position&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bpy.data.actions['CubeAction'].frame_range[0]&lt;br /&gt;
7.0&lt;br /&gt;
&lt;br /&gt;
# last keyframe position&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bpy.data.actions['CubeAction'].frame_range[1]&lt;br /&gt;
59.0&lt;br /&gt;
&lt;br /&gt;
# channels&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8]&lt;br /&gt;
bpy.data.actions['CubeAction.002']...FCurve&lt;br /&gt;
&lt;br /&gt;
channels are keying sets like LocRotScale&lt;br /&gt;
so channel[8] is 'Z Scale'&lt;br /&gt;
&lt;br /&gt;
# type&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].keyframe_points[1].type&lt;br /&gt;
'KEYFRAME'&lt;br /&gt;
&lt;br /&gt;
# keyframe extrapolation&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].extrapolation&lt;br /&gt;
'CONSTANT'&lt;br /&gt;
&lt;br /&gt;
# keyframe points&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].keyframe_points[1]&lt;br /&gt;
bpy.data.actions['CubeAction.002']...Keyframe&lt;br /&gt;
&lt;br /&gt;
# point interpolation&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].keyframe_points[1].interpolation&lt;br /&gt;
'BEZIER'&lt;br /&gt;
&lt;br /&gt;
# point position&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].keyframe_points[1].co&lt;br /&gt;
Vector((221.0, 1.0))&lt;br /&gt;
&lt;br /&gt;
# point handle left&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].keyframe_points[1].handle_left&lt;br /&gt;
Vector((202.65066528320312, 1.0))&lt;br /&gt;
&lt;br /&gt;
# point handle right&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].keyframe_points[1].handle_right&lt;br /&gt;
Vector((239.34933471679688, 1.0))&lt;br /&gt;
&lt;br /&gt;
# point selected&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].keyframe_points[1].select_control_point&lt;br /&gt;
True&lt;br /&gt;
&lt;br /&gt;
# point handle selected&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt; bpy.data.actions['CubeAction.002'].groups['LocRotScale'].channels[8].keyframe_points[1].select_left_handle&lt;br /&gt;
True&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 13.03.19: c operators ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;// space_ops.c&lt;br /&gt;
----------------------------------------------------------------&lt;br /&gt;
	/* view */&lt;br /&gt;
	NLA_OT_properties&lt;br /&gt;
	&lt;br /&gt;
	/* channels */&lt;br /&gt;
	NLA_OT_channels_click&lt;br /&gt;
	NLA_OT_tracks_add&lt;br /&gt;
	NLA_OT_delete_tracks&lt;br /&gt;
	&lt;br /&gt;
	/* select */&lt;br /&gt;
	NLA_OT_click_select&lt;br /&gt;
	NLA_OT_select_border&lt;br /&gt;
	NLA_OT_select_all_toggle&lt;br /&gt;
	NLA_OT_select_leftright&lt;br /&gt;
	&lt;br /&gt;
	/* view */&lt;br /&gt;
	NLA_OT_view_all&lt;br /&gt;
	NLA_OT_view_selected&lt;br /&gt;
	&lt;br /&gt;
	/* edit */&lt;br /&gt;
	NLA_OT_tweakmode_enter&lt;br /&gt;
	NLA_OT_tweakmode_exit					// nla_edit.c&lt;br /&gt;
		ot-&amp;gt;exec = nlaedit_disable_tweakmode_exec;	// nla_edit.c&lt;br /&gt;
		ot-&amp;gt;poll = nlaop_poll_tweakmode_on;		// nla_edit.c&lt;br /&gt;
	NLA_OT_actionclip_add&lt;br /&gt;
	NLA_OT_transition_add&lt;br /&gt;
	NLA_OT_soundclip_add&lt;br /&gt;
	NLA_OT_meta_add&lt;br /&gt;
	NLA_OT_meta_remove&lt;br /&gt;
	NLA_OT_duplicate					// nla_edit.c&lt;br /&gt;
		ot-&amp;gt;exec = nlaedit_duplicate_exec;		// nla_edit.c&lt;br /&gt;
		ot-&amp;gt;poll = nlaop_poll_tweakmode_off;		// nla_edit.c&lt;br /&gt;
	NLA_OT_delete&lt;br /&gt;
	NLA_OT_split&lt;br /&gt;
	NLA_OT_mute_toggle&lt;br /&gt;
	NLA_OT_swap&lt;br /&gt;
	NLA_OT_move_up&lt;br /&gt;
	NLA_OT_move_down&lt;br /&gt;
	NLA_OT_action_sync_length				// nla_edit.c&lt;br /&gt;
		ot-&amp;gt;exec = nlaedit_sync_actlen_exec;		// nla_edit.c&lt;br /&gt;
		ot-&amp;gt;poll = ED_operator_nla_active;		// nla_edit.c&lt;br /&gt;
	NLA_OT_apply_scale&lt;br /&gt;
	NLA_OT_clear_scale&lt;br /&gt;
	NLA_OT_snap&lt;br /&gt;
	NLA_OT_fmodifier_add&lt;br /&gt;
	NLA_OT_fmodifier_copy&lt;br /&gt;
	NLA_OT_fmodifier_paste&lt;br /&gt;
----------------------------------------------------------------&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>wiki&gt;Koilz</name></author>
		
	</entry>
</feed>