A Track represents the container of clips used to sequence clips in the ClipContainer.
You can retrieve the track object using ClipContainer.GetTracks. A track contains only a specific type of clips; for example, audio clips (where Clip.GetType() == siClipAudioType) are the only type of tracks found in an audio track (where Track.GetType() == siTrackAudioType). The base property SIObject::GetType returns one of the values contained in siTrackType.
Tracks can only be added using the AddTrack command (there is currently no way to add a track using the C++ API).
\* Mixer | |- Track (an animation track) | | | |- CompoundClip | | | |- Track4 (an animation track) | |- Track1 (an animation track) |- Track2 (a shape track) |- Track3 (an audio track) |- Track4 (a layer track) |- Track5 (a cache track) *\
using namespace XSI; Application app; Model root = app.GetActiveSceneRoot(); X3DObject myCube; root.AddGeometry( L"Cube", L"MeshSurface", L"", myCube ); // Creating the first animation source CValueArray args(9); CValue outArg; args[0] = root; args[1] = L"cube.kine.local.posx,cube.kine.local.posy,cube.kine.local.posz"; args[3] = L"StoredStaticPose"; args[4] = true; args[7] = false; args[8] = false; app.ExecuteCommand( L"StoreAction", args, outArg ); Source mySource(outArg); // Creating the first clip CValueArray addClipArgs(6); addClipArgs[0] = root; addClipArgs[1] = mySource.GetFullName(); addClipArgs[5] = L"MyClip1"; app.ExecuteCommand( L"AddClip", addClipArgs, outArg ); Clip myClip(outArg); app.LogMessage(L"First created clip " + myClip.GetFullName() ); app.LogMessage(L"First created Track " + SIObject(myClip.GetParent()).GetFullName() ); myCube.PutParameterValue(L"posx", 3.0f); // Creating the second animation source args[1] = L"cube.kine.local.posx,cube.kine.local.posy,cube.kine.local.posz"; args[5] = 7l; args[6] = 9l; app.ExecuteCommand( L"StoreAction", args, outArg ); mySource = outArg; // Creating the second clip from the second source. addClipArgs[0] = root; addClipArgs[1] = mySource.GetFullName(); addClipArgs[5] = L"MyClip1"; app.ExecuteCommand( L"AddClip", addClipArgs, outArg ); Clip myClip2(outArg); app.LogMessage(L"Second created clip " + myClip2.GetFullName() ); app.LogMessage(L"Second created Track " + SIObject(myClip2.GetParent()).GetFullName() ); // Adding a shape track ClipContainer myMixer = root.GetMixer().GetRef(); CValueArray addTrackArgs(3); addTrackArgs[0] = root; addTrackArgs[1] = myMixer; addTrackArgs[2] = 1l;//Shape track app.ExecuteCommand( L"AddTrack", addTrackArgs, outArg ); Track myShapeTrack(outArg); app.LogMessage(L"Third created Track " + myShapeTrack.GetFullName() ); // Adding an audio track addTrackArgs[2] = 2l;//Audio track app.ExecuteCommand( L"AddTrack", addTrackArgs, outArg ); Track myAudioTrack(outArg); app.LogMessage(L"Fourth created Track " + myAudioTrack.GetFullName() ); // Adding an animation layer track addTrackArgs[2] = 5l;//Animation Layer track app.ExecuteCommand( L"AddTrack", addTrackArgs, outArg ); Track myAnimLayerTrack(outArg); app.LogMessage(L"Fifth created Track " + myAnimLayerTrack.GetFullName() ); // Adding a cache track addTrackArgs[2] = 6l;//Cache track app.ExecuteCommand( L"AddTrack", addTrackArgs, outArg ); Track myCacheTrack(outArg); app.LogMessage(L"Sixth created Track " + myCacheTrack.GetFullName() ); // Creating a compound clip from the clips created earlier // This will implicitly create a track for the nested clip args.Resize(2); args[0] = root; args[1] = myClip.GetFullName() + L"," + myClip2.GetFullName(); app.ExecuteCommand( L"CreateCompound", args, outArg ); // Now retreiving all tracks recursively. // First lets get the tracks which are directly under the mixer. CRefArray myTracks = myMixer.GetTracks(); CRefArray myResultingTracks; LONG i; for(i = 0; i< myTracks.GetCount(); ++i) { Track currentTrack(myTracks[i]); myResultingTracks.Add(currentTrack); CRefArray trackClips = currentTrack.GetClips(); for(LONG j = 0; j < trackClips.GetCount();++j) { ClipContainer compoundClip(trackClips[0]); if(compoundClip.IsValid()) { // We have a compound so let's fetch the nested tracks. CRefArray nestedTracks = compoundClip.GetTracks(); for(LONG k = 0; k < nestedTracks.GetCount(); ++k) { myResultingTracks.Add(nestedTracks[k]); } } } } app.LogMessage(L"The resulting complete track list is the following: "); for(i = 0; i < myResultingTracks.GetCount(); ++i) { app.LogMessage(Track(myResultingTracks[i]).GetFullName()); }
#include <xsi_track.h>
Public Member Functions | |
Track () | |
~Track () | |
Track (const CRef &in_ref) | |
Track (const Track &in_obj) | |
bool | IsA (siClassID in_ClassID) const |
siClassID | GetClassID () const |
Track & | operator= (const Track &in_obj) |
Track & | operator= (const CRef &in_ref) |
CRefArray | GetClips () const |
Track | ( | ) |
Default constructor.
~Track | ( | ) |
Default destructor.
bool IsA | ( | siClassID | in_ClassID | ) | const [virtual] |
Returns true if a given class type is compatible with this API class.
in_ClassID | class type. |
Reimplemented from ProjectItem.
siClassID GetClassID | ( | ) | const [virtual] |
Creates an object from another object. The newly created object is set to empty if the input object is not compatible.
in_obj | constant class object. |
Creates an object from a reference object. The newly created object is set to empty if the input reference object is not compatible.
in_ref | constant class object. |
Reimplemented from ProjectItem.
CRefArray GetClips | ( | ) | const |
Returns the clips contained on that track.