About the Animation in the GlobeControl Sample
[C#]
Animation.cs
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Analyst3D;
using ESRI.ArcGIS.GlobeCore;
using System;
using System.Windows.Forms;
using System.Security.Permissions;
using ESRI.ArcGIS;
namespace GlobeCntrlAnimation
{
public class Form1 : System.Windows.Forms.Form
{
public System.Windows.Forms.Label lblStatus;
public System.Windows.Forms.GroupBox FrmAnim;
public System.Windows.Forms.Button CmdPlay;
public System.Windows.Forms.TextBox txtDuration;
public System.Windows.Forms.TextBox TxtFrequency;
public System.Windows.Forms.RadioButton OptDuration;
public System.Windows.Forms.RadioButton OptIteration;
public System.Windows.Forms.Button CmdLoad;
public System.Windows.Forms.Label Label1;
private System.Windows.Forms.OpenFileDialog openFileDialog1;
private System.ComponentModel.Container components = null;
private ESRI.ArcGIS.Controls.AxToolbarControl axToolbarControl1;
private ESRI.ArcGIS.Controls.AxTOCControl axTOCControl1;
private ESRI.ArcGIS.Controls.AxGlobeControl axGlobeControl1;
private ESRI.ArcGIS.Controls.AxLicenseControl axLicenseControl1;
private string m_AnimFilePath;
public Form1()
{
InitializeComponent();
}
protected override void Dispose( bool disposing )
{
//Release COM objects
ESRI.ArcGIS.ADF.COMSupport.AOUninitialize.Shutdown();
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(Form1));
this.lblStatus = new System.Windows.Forms.Label();
this.FrmAnim = new System.Windows.Forms.GroupBox();
this.CmdPlay = new System.Windows.Forms.Button();
this.txtDuration = new System.Windows.Forms.TextBox();
this.TxtFrequency = new System.Windows.Forms.TextBox();
this.OptDuration = new System.Windows.Forms.RadioButton();
this.OptIteration = new System.Windows.Forms.RadioButton();
this.CmdLoad = new System.Windows.Forms.Button();
this.Label1 = new System.Windows.Forms.Label();
this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
this.axToolbarControl1 = new ESRI.ArcGIS.Controls.AxToolbarControl();
this.axTOCControl1 = new ESRI.ArcGIS.Controls.AxTOCControl();
this.axGlobeControl1 = new ESRI.ArcGIS.Controls.AxGlobeControl();
this.axLicenseControl1 = new ESRI.ArcGIS.Controls.AxLicenseControl();
this.FrmAnim.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.axToolbarControl1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.axTOCControl1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.axGlobeControl1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.axLicenseControl1)).BeginInit();
this.SuspendLayout();
//
// lblStatus
//
this.lblStatus.BackColor = System.Drawing.SystemColors.Control;
this.lblStatus.Cursor = System.Windows.Forms.Cursors.Default;
this.lblStatus.Font = new System.Drawing.Font("Arial", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.lblStatus.ForeColor = System.Drawing.SystemColors.ControlText;
this.lblStatus.Location = new System.Drawing.Point(8, 376);
this.lblStatus.Name = "lblStatus";
this.lblStatus.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.lblStatus.Size = new System.Drawing.Size(129, 54);
this.lblStatus.TabIndex = 13;
//
// FrmAnim
//
this.FrmAnim.BackColor = System.Drawing.SystemColors.Control;
this.FrmAnim.Controls.Add(this.CmdPlay);
this.FrmAnim.Controls.Add(this.txtDuration);
this.FrmAnim.Controls.Add(this.TxtFrequency);
this.FrmAnim.Controls.Add(this.OptDuration);
this.FrmAnim.Controls.Add(this.OptIteration);
this.FrmAnim.Controls.Add(this.CmdLoad);
this.FrmAnim.Controls.Add(this.Label1);
this.FrmAnim.Font = new System.Drawing.Font("Arial", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.FrmAnim.ForeColor = System.Drawing.SystemColors.ControlText;
this.FrmAnim.Location = new System.Drawing.Point(144, 376);
this.FrmAnim.Name = "FrmAnim";
this.FrmAnim.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.FrmAnim.Size = new System.Drawing.Size(461, 55);
this.FrmAnim.TabIndex = 12;
this.FrmAnim.TabStop = false;
//
// CmdPlay
//
this.CmdPlay.BackColor = System.Drawing.SystemColors.Control;
this.CmdPlay.Cursor = System.Windows.Forms.Cursors.Default;
this.CmdPlay.Font = new System.Drawing.Font("Arial", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.CmdPlay.ForeColor = System.Drawing.SystemColors.ControlText;
this.CmdPlay.Location = new System.Drawing.Point(266, 10);
this.CmdPlay.Name = "CmdPlay";
this.CmdPlay.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.CmdPlay.Size = new System.Drawing.Size(81, 38);
this.CmdPlay.TabIndex = 9;
this.CmdPlay.Text = "Play Animation";
this.CmdPlay.Click += new System.EventHandler(this.CmdPlay_Click);
//
// txtDuration
//
this.txtDuration.AcceptsReturn = true;
this.txtDuration.AutoSize = false;
this.txtDuration.BackColor = System.Drawing.SystemColors.Window;
this.txtDuration.Cursor = System.Windows.Forms.Cursors.IBeam;
this.txtDuration.Font = new System.Drawing.Font("Arial", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.txtDuration.ForeColor = System.Drawing.SystemColors.WindowText;
this.txtDuration.Location = new System.Drawing.Point(220, 13);
this.txtDuration.MaxLength = 0;
this.txtDuration.Name = "txtDuration";
this.txtDuration.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.txtDuration.Size = new System.Drawing.Size(40, 19);
this.txtDuration.TabIndex = 8;
this.txtDuration.Text = "10";
//
// TxtFrequency
//
this.TxtFrequency.AcceptsReturn = true;
this.TxtFrequency.AutoSize = false;
this.TxtFrequency.BackColor = System.Drawing.SystemColors.Window;
this.TxtFrequency.Cursor = System.Windows.Forms.Cursors.IBeam;
this.TxtFrequency.Font = new System.Drawing.Font("Arial", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.TxtFrequency.ForeColor = System.Drawing.SystemColors.WindowText;
this.TxtFrequency.Location = new System.Drawing.Point(400, 13);
this.TxtFrequency.MaxLength = 0;
this.TxtFrequency.Name = "TxtFrequency";
this.TxtFrequency.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.TxtFrequency.Size = new System.Drawing.Size(40, 19);
this.TxtFrequency.TabIndex = 7;
this.TxtFrequency.Text = "2";
//
// OptDuration
//
this.OptDuration.BackColor = System.Drawing.SystemColors.Control;
this.OptDuration.Checked = true;
this.OptDuration.Cursor = System.Windows.Forms.Cursors.Default;
this.OptDuration.Font = new System.Drawing.Font("Arial", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.OptDuration.ForeColor = System.Drawing.SystemColors.ControlText;
this.OptDuration.Location = new System.Drawing.Point(122, 8);
this.OptDuration.Name = "OptDuration";
this.OptDuration.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.OptDuration.Size = new System.Drawing.Size(98, 17);
this.OptDuration.TabIndex = 6;
this.OptDuration.TabStop = true;
this.OptDuration.Text = "Duration (secs)";
this.OptDuration.CheckedChanged += new System.EventHandler(this.OptDuration_CheckedChanged);
//
// OptIteration
//
this.OptIteration.BackColor = System.Drawing.SystemColors.Control;
this.OptIteration.Cursor = System.Windows.Forms.Cursors.Default;
this.OptIteration.Font = new System.Drawing.Font("Arial", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.OptIteration.ForeColor = System.Drawing.SystemColors.ControlText;
this.OptIteration.Location = new System.Drawing.Point(122, 22);
this.OptIteration.Name = "OptIteration";
this.OptIteration.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.OptIteration.Size = new System.Drawing.Size(94, 19);
this.OptIteration.TabIndex = 5;
this.OptIteration.TabStop = true;
this.OptIteration.Text = "No. Iterations";
this.OptIteration.CheckedChanged += new System.EventHandler(this.OptIteration_CheckedChanged);
//
// CmdLoad
//
this.CmdLoad.BackColor = System.Drawing.SystemColors.Control;
this.CmdLoad.Cursor = System.Windows.Forms.Cursors.Default;
this.CmdLoad.Font = new System.Drawing.Font("Arial", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.CmdLoad.ForeColor = System.Drawing.SystemColors.ControlText;
this.CmdLoad.Location = new System.Drawing.Point(9, 10);
this.CmdLoad.Name = "CmdLoad";
this.CmdLoad.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.CmdLoad.Size = new System.Drawing.Size(94, 38);
this.CmdLoad.TabIndex = 4;
this.CmdLoad.Text = "Load Animation File (*.aga)";
this.CmdLoad.Click += new System.EventHandler(this.CmdLoad_Click);
//
// Label1
//
this.Label1.BackColor = System.Drawing.SystemColors.Control;
this.Label1.Cursor = System.Windows.Forms.Cursors.Default;
this.Label1.Font = new System.Drawing.Font("Arial", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.Label1.ForeColor = System.Drawing.SystemColors.ControlText;
this.Label1.Location = new System.Drawing.Point(354, 14);
this.Label1.Name = "Label1";
this.Label1.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.Label1.Size = new System.Drawing.Size(36, 17);
this.Label1.TabIndex = 10;
this.Label1.Text = "Cycles:";
//
// axToolbarControl1
//
this.axToolbarControl1.Location = new System.Drawing.Point(8, 8);
this.axToolbarControl1.Name = "axToolbarControl1";
this.axToolbarControl1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axToolbarControl1.OcxState")));
this.axToolbarControl1.Size = new System.Drawing.Size(592, 28);
this.axToolbarControl1.TabIndex = 14;
this.axToolbarControl1.OnItemClick += new ESRI.ArcGIS.Controls.IToolbarControlEvents_Ax_OnItemClickEventHandler(this.axToolbarControl1_OnItemClick);
//
// axTOCControl1
//
this.axTOCControl1.Location = new System.Drawing.Point(8, 40);
this.axTOCControl1.Name = "axTOCControl1";
this.axTOCControl1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axTOCControl1.OcxState")));
this.axTOCControl1.Size = new System.Drawing.Size(136, 328);
this.axTOCControl1.TabIndex = 15;
//
// axGlobeControl1
//
this.axGlobeControl1.Location = new System.Drawing.Point(144, 40);
this.axGlobeControl1.Name = "axGlobeControl1";
this.axGlobeControl1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axGlobeControl1.OcxState")));
this.axGlobeControl1.Size = new System.Drawing.Size(456, 328);
this.axGlobeControl1.TabIndex = 16;
//
// axLicenseControl1
//
this.axLicenseControl1.Enabled = true;
this.axLicenseControl1.Location = new System.Drawing.Point(384, 56);
this.axLicenseControl1.Name = "axLicenseControl1";
this.axLicenseControl1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axLicenseControl1.OcxState")));
this.axLicenseControl1.Size = new System.Drawing.Size(32, 32);
this.axLicenseControl1.TabIndex = 17;
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(608, 438);
this.Controls.Add(this.axLicenseControl1);
this.Controls.Add(this.axGlobeControl1);
this.Controls.Add(this.axTOCControl1);
this.Controls.Add(this.axToolbarControl1);
this.Controls.Add(this.lblStatus);
this.Controls.Add(this.FrmAnim);
this.Name = "Form1";
this.Text = "GlobeControlAnimation";
this.Load += new System.EventHandler(this.Form1_Load);
this.FrmAnim.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.axToolbarControl1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.axTOCControl1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.axGlobeControl1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.axLicenseControl1)).EndInit();
this.ResumeLayout(false);
}
#endregion
[STAThread]
static void Main()
{
if (!RuntimeManager.Bind(ProductCode.Engine))
{
if (!RuntimeManager.Bind(ProductCode.Desktop))
{
MessageBox.Show("Unable to bind to ArcGIS runtime. Application will be shut down.");
return;
}
}
Application.Run(new Form1());
}
private void Form1_Load(object sender, System.EventArgs e)
{
//check and load if the animation file is present...
m_AnimFilePath = @"..\..\..\..\..\Data\ArcGlobeAnimation\AnimationSample.aga";
if (System.IO.File.Exists(m_AnimFilePath))
{
//Load the sample animation file into the animation file into the doc...
IGlobe globe = axGlobeControl1.Globe;
IBasicScene basicScene = (IBasicScene) globe;
basicScene.LoadAnimation(m_AnimFilePath);
}
else
{
//Disable Animation Player controls...
OptDuration.Enabled = false;
OptIteration.Enabled = false;
txtDuration.Enabled = false;
TxtFrequency.Enabled = false;
TxtFrequency.Enabled = false;
CmdPlay.Enabled = false;
}
Icon = null;
}
private void OptIteration_CheckedChanged(object sender, System.EventArgs e)
{
if (OptIteration.Checked == true)
{
//Set Default cycle and iteration..
txtDuration.Text = "500";
TxtFrequency.Text = "2";
}
}
private void OptDuration_CheckedChanged(object sender, System.EventArgs e)
{
if (OptDuration.Checked == true)
{
//Set Default cycle and iteration..
txtDuration.Text = "10";
TxtFrequency.Text = "2";
}
}
private void CmdPlay_Click(object sender, System.EventArgs e)
{
if (OptDuration.Checked == true)
{
double duration = Convert.ToInt32(txtDuration.Text);
int numCycle = Convert.ToInt32(TxtFrequency.Text);
//play the animation via duration
PlayAnimation(duration, numCycle);
}
else
{
int iteration = Convert.ToInt32(txtDuration.Text);
int cycles = Convert.ToInt32(TxtFrequency.Text);
//play animation via iteration...
PlayAnimationFast(cycles, iteration);
}
}
private void CmdLoad_Click(object sender, System.EventArgs e)
{
openFileDialog1.Title = "Open ArcGlobe Animation File";
openFileDialog1.Filter = "ArcGlobe Animation Files (*.aga)|*.aga";
//set ArcGlobeAnimaton path folder as default path...
if (m_AnimFilePath != "")
{
openFileDialog1.InitialDirectory = m_AnimFilePath;
}
else
{
openFileDialog1.InitialDirectory = Application.StartupPath;
}
openFileDialog1.ShowDialog();
//if the user selected an animation file
string animFilePath = openFileDialog1.FileName;
if (animFilePath == "") return;
//sAnimFilePath
IGlobe globe = axGlobeControl1.Globe;
IBasicScene basicScene = (IBasicScene) globe;
basicScene.LoadAnimation(animFilePath);
//if loading of the animation succeeded, enable player controls...
//Enable Animation Player controls...
OptDuration.Enabled = true;
OptIteration.Enabled = true;
txtDuration.Enabled = true;
TxtFrequency.Enabled = true;
TxtFrequency.Enabled = true;
CmdPlay.Enabled = true;
}
private int Greatest(ref int[] array)
{
//Function to find the largest count of keyframes (in any one of the Animation tracks)
int max=0;
int length = array.Length;
for (int i=0; i<length; i++)
{
if (max == 0)
{
max = array[i];
}
else if (array[i] > max)
{
max = array[i];
}
}
return max;
}
private void PlayAnimation(double duration, int numCycles)
{
IGlobe globe = axGlobeControl1.Globe;
IAnimationTracks tracks = (IAnimationTracks) globe;
IViewers3D viewers3D = globe.GlobeDisplay;
//exit if document doesn't contain animation..
string sError;
if (tracks.TrackCount == 0)
{
sError = m_AnimFilePath;
if (sError == "")
{
sError = "To get a Sample animation file, Developer Kit Samples need to be installed!";
System.Windows.Forms.MessageBox.Show("The current document doesn't contain animation file." + 0x000A + sError);
}
else
{
System.Windows.Forms.MessageBox.Show("The current document doesn't contain animation file." + 0x000A + "Load " + m_AnimFilePath + @"\AnimationSample.aga for sample.");
}
return;
}
DateTime startTime;
TimeSpan timeSpan;
int j;
double elapsedTime;
for (int i=1; i<=numCycles; i++)
{
startTime = DateTime.Now;
j = 0;
do
{
timeSpan = (DateTime.Now).Subtract(startTime);
elapsedTime = timeSpan.TotalSeconds;
if (elapsedTime > duration) elapsedTime = duration;
tracks.ApplyTracks(null, elapsedTime, duration);
viewers3D.RefreshViewers();
j = j + 1;
}
while (elapsedTime < duration);
}
}
private void PlayAnimationFast(int cycles, int iteration)
{
IGlobe globe = axGlobeControl1.Globe;
IGlobeDisplay globeDisplay = globe.GlobeDisplay;
Scene scene = (Scene) globeDisplay.Scene;
IAnimationTracks sceneTracks = (IAnimationTracks) scene;
IArray trackCamArray = new ArrayClass();
IArray trackGlbArray = new ArrayClass();
IArray trackLyrArray = new ArrayClass();
string sError;
if (sceneTracks.TrackCount == 0)
{
sError = m_AnimFilePath;
if (sError == "")
{
sError = "To get a Sample animation file, Developer Kit Samples need to be installed!";
System.Windows.Forms.MessageBox.Show("The current document doesn't contain animation file." + 0x000A + sError);
}
else
{
System.Windows.Forms.MessageBox.Show("The current document doesn't contain animation file." + 0x000A + "Load " + m_AnimFilePath + @"\AnimationSample.aga for sample.");
}
return;
}
IAnimationTrack track;
IAnimationTrack trackLayer;
IAnimationTrack trackGlobe = null;
IAnimationType animType;
IAnimationType animLayer;
IAnimationType animGlobeCam = null;
IKeyframe kFGlbCam;
IKeyframe kFGlbLayer;
int k;
int[] count = new int[1000];
//get each track from the scene and store tracks of the same kind in an Array
for (int i=0; i<=sceneTracks.TrackCount-1;i++)
{
track = (IAnimationTrack) sceneTracks.Tracks.get_Element(i);
k = i;
animType = track.AnimationType;
if (animType.CLSID.Value.ToString() == "{7CCBA704-3933-4D7A-8E89-4DFEE88AA937}")
{
//GlobeLayer
trackLayer = new AnimationTrackClass();
trackLayer = track;
trackLayer.AnimationType = animType;
kFGlbLayer = new GlobeLayerKeyframeClass();
animLayer = animType;
//Store the keyframe count of each track in an array
count[i] = trackLayer.KeyframeCount;
trackLyrArray.Add(trackLayer);
}
else if (animType.CLSID.Value.ToString() == "{D4565495-E2F9-4D89-A8A7-D0B69FD7A424}")
{
//Globe Camera type
trackGlobe = new AnimationTrackClass();
trackGlobe = track;
trackGlobe.AnimationType = animType;
kFGlbCam = new GlobeCameraKeyframeClass();
animGlobeCam = animType;
//Store the keyframe count of each track in an array
count[i] = trackGlobe.KeyframeCount;
trackGlbArray.Add(trackGlobe);
}
else
{
System.Windows.Forms.MessageBox.Show("Animation Type " + animType.Name + " Not Supported. Check if the animation File is Valid!");
return;
}
}
int larger = Greatest(ref count);
//if nothing gets passed by the argument it takes the max no of keyframes
if (iteration == 0) iteration = larger;
IAnimationTrack trackCamera;
IAnimationType animCam = null;
IKeyframe kFBkmark;
double time = 0;
int keyFrameLayerCount; int keyFrameCameraCount; int keyFrameCount;
for (int i=1; i<=cycles; i++) //no of cycles...
{
for (int start=0; start<=iteration; start++) //no of iterations...
{
for (int j=0; j<=trackCamArray.Count-1; j++)
{
trackCamera = (IAnimationTrack) trackCamArray.get_Element(j);
if (trackCamera != null)
{
if (time >= trackCamera.BeginTime)
{
keyFrameCameraCount = trackGlobe.KeyframeCount;
kFBkmark = trackCamera.get_Keyframe(keyFrameCameraCount - keyFrameCameraCount);
//reset object
animCam.ResetObject(scene, kFBkmark);
//interpolate by using track
trackCamera.InterpolateObjectProperties(scene, time);
keyFrameCameraCount = keyFrameCameraCount - 1;
}
}
}
for (k=0; k<=trackGlbArray.Count-1;k++)
{
trackGlobe = (IAnimationTrack) trackGlbArray.get_Element(k);
if (trackGlobe != null)
{
if (time >= trackGlobe.BeginTime)
{
keyFrameCount = trackGlobe.KeyframeCount;
kFGlbCam = trackGlobe.get_Keyframe(trackGlobe.KeyframeCount - keyFrameCount);
//reset object
animGlobeCam.ResetObject(scene, kFGlbCam);
//interpolate by using track
trackGlobe.InterpolateObjectProperties(scene, time);
keyFrameCount = keyFrameCount - 1;
}
}
}
for (int t=0; t<=trackLyrArray.Count-1; t++)
{
trackLayer = (IAnimationTrack) trackLyrArray.get_Element(t);
if (trackLayer != null)
{
if (time >= trackLayer.BeginTime)
{
keyFrameLayerCount = trackLayer.KeyframeCount;
kFGlbLayer = trackLayer.get_Keyframe(trackLayer.KeyframeCount - keyFrameLayerCount);
//interpolate by using track
trackLayer.InterpolateObjectProperties(scene, time);
keyFrameLayerCount = keyFrameLayerCount - 1;
}
}
}
//reset interpolation Point
time = start / iteration;
//refresh the globeviewer(s)
globeDisplay.RefreshViewers();
}
}
}
private string routin_ReadRegistry(string sKey)
{
//Open the subkey for reading
Microsoft.Win32.RegistryKey rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(sKey,true);
if (rk == null) return "";
// Get the data from a specified item in the key.
return (string) rk.GetValue("InstallDir");
}
private void axToolbarControl1_OnItemClick(object sender, ESRI.ArcGIS.Controls.IToolbarControlEvents_OnItemClickEvent e)
{
//Display help when fly tool and walk tools are selected...
//check if key intercept is enabled,if not enable it.
if (axGlobeControl1.KeyIntercept != 1) axGlobeControl1.KeyIntercept = 1;
UID uID = axToolbarControl1.GetItem(e.index).UID;
//uid for fly tool={2C327C42-8CA9-4FC3-8C7B-F6290680FABB}
//uid for walk tool={56C3BDD4-C51A-4574-8954-D3E1F5F54E57}
if (uID.Value.ToString() == "{2C327C42-8CA9-4FC3-8C7B-F6290680FABB}")
{
//fly...
lblStatus.Text = "Use arrow up or arrow left keys to decelerate and arrow up or arrow left keys to accelerate.";
}
else if (uID.Value.ToString() == "{56C3BDD4-C51A-4574-8954-D3E1F5F54E57}")
{
//walk...
lblStatus.Text = "Use arrow up or down keys to change elevation and the arrow left or right keys to fine-tune travel speed.";
}
else
{
lblStatus.Text = "";
}
}
}
}
[Visual Basic .NET]
Animation.vb
Option Strict Off
Option Explicit On
Imports ESRI.ArcGIS.esriSystem
Imports ESRI.ArcGIS.Analyst3D
Imports ESRI.ArcGIS.GlobeCore
Imports System.Security.Permissions
Imports ESRI.ArcGIS
Friend Class frmGlbCntrl
Inherits System.Windows.Forms.Form
<STAThread()> _
Shared Sub Main()
'Load runtime
If Not RuntimeManager.Bind(ProductCode.Engine) Then
If Not RuntimeManager.Bind(ProductCode.Desktop) Then
MessageBox.Show("Unable to bind to ArcGIS runtime. Application will be shut down.")
System.Environment.Exit(1) ' Force exit or other indication in the application
End If
End If
Application.Run(New frmGlbCntrl())
End Sub
#Region "Windows Form Designer generated code "
Public Sub New()
MyBase.New()
'This call is required by the Windows Form Designer.
InitializeComponent()
End Sub
'Form overrides dispose to clean up the component list.
Protected Overloads Overrides Sub Dispose(ByVal Disposing As Boolean)
'Release COM objects
ESRI.ArcGIS.ADF.COMSupport.AOUninitialize.Shutdown()
If Disposing Then
If Not components Is Nothing Then
components.Dispose()
End If
End If
MyBase.Dispose(Disposing)
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
Public WithEvents CmdPlay As System.Windows.Forms.Button
Public WithEvents txtDuration As System.Windows.Forms.TextBox
Public WithEvents TxtFrequency As System.Windows.Forms.TextBox
Public WithEvents OptDuration As System.Windows.Forms.RadioButton
Public WithEvents OptIteration As System.Windows.Forms.RadioButton
Public WithEvents CmdLoad As System.Windows.Forms.Button
Public WithEvents Label1 As System.Windows.Forms.Label
Public WithEvents FrmAnim As System.Windows.Forms.GroupBox
Public WithEvents lblStatus As System.Windows.Forms.Label
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
Friend WithEvents OpenFileDialog1 As System.Windows.Forms.OpenFileDialog
Friend WithEvents AxLicenseControl2 As ESRI.ArcGIS.Controls.AxLicenseControl
Friend WithEvents AxToolbarControl1 As ESRI.ArcGIS.Controls.AxToolbarControl
Friend WithEvents AxGlobeControl1 As ESRI.ArcGIS.Controls.AxGlobeControl
Friend WithEvents AxTOCControl1 As ESRI.ArcGIS.Controls.AxTOCControl
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Dim resources As System.Resources.ResourceManager = New System.Resources.ResourceManager(GetType(frmGlbCntrl))
Me.FrmAnim = New System.Windows.Forms.GroupBox
Me.CmdPlay = New System.Windows.Forms.Button
Me.txtDuration = New System.Windows.Forms.TextBox
Me.TxtFrequency = New System.Windows.Forms.TextBox
Me.OptDuration = New System.Windows.Forms.RadioButton
Me.OptIteration = New System.Windows.Forms.RadioButton
Me.CmdLoad = New System.Windows.Forms.Button
Me.Label1 = New System.Windows.Forms.Label
Me.lblStatus = New System.Windows.Forms.Label
Me.OpenFileDialog1 = New System.Windows.Forms.OpenFileDialog
Me.AxGlobeControl1 = New ESRI.ArcGIS.Controls.AxGlobeControl
Me.AxLicenseControl2 = New ESRI.ArcGIS.Controls.AxLicenseControl
Me.AxTOCControl1 = New ESRI.ArcGIS.Controls.AxTOCControl
Me.AxToolbarControl1 = New ESRI.ArcGIS.Controls.AxToolbarControl
Me.FrmAnim.SuspendLayout()
CType(Me.AxGlobeControl1, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.AxLicenseControl2, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.AxTOCControl1, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.AxToolbarControl1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'FrmAnim
'
Me.FrmAnim.BackColor = System.Drawing.SystemColors.Control
Me.FrmAnim.Controls.Add(Me.CmdPlay)
Me.FrmAnim.Controls.Add(Me.txtDuration)
Me.FrmAnim.Controls.Add(Me.TxtFrequency)
Me.FrmAnim.Controls.Add(Me.OptDuration)
Me.FrmAnim.Controls.Add(Me.OptIteration)
Me.FrmAnim.Controls.Add(Me.CmdLoad)
Me.FrmAnim.Controls.Add(Me.Label1)
Me.FrmAnim.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.FrmAnim.ForeColor = System.Drawing.SystemColors.ControlText
Me.FrmAnim.Location = New System.Drawing.Point(143, 433)
Me.FrmAnim.Name = "FrmAnim"
Me.FrmAnim.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.FrmAnim.Size = New System.Drawing.Size(461, 55)
Me.FrmAnim.TabIndex = 3
Me.FrmAnim.TabStop = False
'
'CmdPlay
'
Me.CmdPlay.BackColor = System.Drawing.SystemColors.Control
Me.CmdPlay.Cursor = System.Windows.Forms.Cursors.Default
Me.CmdPlay.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.CmdPlay.ForeColor = System.Drawing.SystemColors.ControlText
Me.CmdPlay.Location = New System.Drawing.Point(266, 10)
Me.CmdPlay.Name = "CmdPlay"
Me.CmdPlay.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.CmdPlay.Size = New System.Drawing.Size(81, 38)
Me.CmdPlay.TabIndex = 9
Me.CmdPlay.Text = "Play Animation"
'
'txtDuration
'
Me.txtDuration.AcceptsReturn = True
Me.txtDuration.AutoSize = False
Me.txtDuration.BackColor = System.Drawing.SystemColors.Window
Me.txtDuration.Cursor = System.Windows.Forms.Cursors.IBeam
Me.txtDuration.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.txtDuration.ForeColor = System.Drawing.SystemColors.WindowText
Me.txtDuration.Location = New System.Drawing.Point(220, 13)
Me.txtDuration.MaxLength = 0
Me.txtDuration.Name = "txtDuration"
Me.txtDuration.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.txtDuration.Size = New System.Drawing.Size(40, 19)
Me.txtDuration.TabIndex = 8
Me.txtDuration.Text = "10"
'
'TxtFrequency
'
Me.TxtFrequency.AcceptsReturn = True
Me.TxtFrequency.AutoSize = False
Me.TxtFrequency.BackColor = System.Drawing.SystemColors.Window
Me.TxtFrequency.Cursor = System.Windows.Forms.Cursors.IBeam
Me.TxtFrequency.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.TxtFrequency.ForeColor = System.Drawing.SystemColors.WindowText
Me.TxtFrequency.Location = New System.Drawing.Point(400, 13)
Me.TxtFrequency.MaxLength = 0
Me.TxtFrequency.Name = "TxtFrequency"
Me.TxtFrequency.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.TxtFrequency.Size = New System.Drawing.Size(40, 19)
Me.TxtFrequency.TabIndex = 7
Me.TxtFrequency.Text = "2"
'
'OptDuration
'
Me.OptDuration.BackColor = System.Drawing.SystemColors.Control
Me.OptDuration.Checked = True
Me.OptDuration.Cursor = System.Windows.Forms.Cursors.Default
Me.OptDuration.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.OptDuration.ForeColor = System.Drawing.SystemColors.ControlText
Me.OptDuration.Location = New System.Drawing.Point(122, 8)
Me.OptDuration.Name = "OptDuration"
Me.OptDuration.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.OptDuration.Size = New System.Drawing.Size(98, 17)
Me.OptDuration.TabIndex = 6
Me.OptDuration.TabStop = True
Me.OptDuration.Text = "Duration (secs)"
'
'OptIteration
'
Me.OptIteration.BackColor = System.Drawing.SystemColors.Control
Me.OptIteration.Cursor = System.Windows.Forms.Cursors.Default
Me.OptIteration.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.OptIteration.ForeColor = System.Drawing.SystemColors.ControlText
Me.OptIteration.Location = New System.Drawing.Point(122, 22)
Me.OptIteration.Name = "OptIteration"
Me.OptIteration.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.OptIteration.Size = New System.Drawing.Size(94, 19)
Me.OptIteration.TabIndex = 5
Me.OptIteration.TabStop = True
Me.OptIteration.Text = "No. Iterations"
'
'CmdLoad
'
Me.CmdLoad.BackColor = System.Drawing.SystemColors.Control
Me.CmdLoad.Cursor = System.Windows.Forms.Cursors.Default
Me.CmdLoad.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.CmdLoad.ForeColor = System.Drawing.SystemColors.ControlText
Me.CmdLoad.Location = New System.Drawing.Point(9, 10)
Me.CmdLoad.Name = "CmdLoad"
Me.CmdLoad.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.CmdLoad.Size = New System.Drawing.Size(94, 38)
Me.CmdLoad.TabIndex = 4
Me.CmdLoad.Text = "Load Animation File (*.aga)"
'
'Label1
'
Me.Label1.BackColor = System.Drawing.SystemColors.Control
Me.Label1.Cursor = System.Windows.Forms.Cursors.Default
Me.Label1.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.Label1.ForeColor = System.Drawing.SystemColors.ControlText
Me.Label1.Location = New System.Drawing.Point(354, 14)
Me.Label1.Name = "Label1"
Me.Label1.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.Label1.Size = New System.Drawing.Size(36, 17)
Me.Label1.TabIndex = 10
Me.Label1.Text = "Cycles:"
'
'lblStatus
'
Me.lblStatus.BackColor = System.Drawing.SystemColors.Control
Me.lblStatus.Cursor = System.Windows.Forms.Cursors.Default
Me.lblStatus.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.lblStatus.ForeColor = System.Drawing.SystemColors.ControlText
Me.lblStatus.Location = New System.Drawing.Point(6, 439)
Me.lblStatus.Name = "lblStatus"
Me.lblStatus.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.lblStatus.Size = New System.Drawing.Size(129, 54)
Me.lblStatus.TabIndex = 11
'
'AxGlobeControl1
'
Me.AxGlobeControl1.Location = New System.Drawing.Point(144, 40)
Me.AxGlobeControl1.Name = "AxGlobeControl1"
Me.AxGlobeControl1.OcxState = CType(resources.GetObject("AxGlobeControl1.OcxState"), System.Windows.Forms.AxHost.State)
Me.AxGlobeControl1.Size = New System.Drawing.Size(456, 392)
Me.AxGlobeControl1.TabIndex = 12
'
'AxLicenseControl2
'
Me.AxLicenseControl2.Enabled = True
Me.AxLicenseControl2.Location = New System.Drawing.Point(152, 368)
Me.AxLicenseControl2.Name = "AxLicenseControl2"
Me.AxLicenseControl2.OcxState = CType(resources.GetObject("AxLicenseControl2.OcxState"), System.Windows.Forms.AxHost.State)
Me.AxLicenseControl2.Size = New System.Drawing.Size(200, 50)
Me.AxLicenseControl2.TabIndex = 13
'
'AxTOCControl1
'
Me.AxTOCControl1.Location = New System.Drawing.Point(8, 40)
Me.AxTOCControl1.Name = "AxTOCControl1"
Me.AxTOCControl1.OcxState = CType(resources.GetObject("AxTOCControl1.OcxState"), System.Windows.Forms.AxHost.State)
Me.AxTOCControl1.Size = New System.Drawing.Size(136, 392)
Me.AxTOCControl1.TabIndex = 14
'
'AxToolbarControl1
'
Me.AxToolbarControl1.Location = New System.Drawing.Point(8, 8)
Me.AxToolbarControl1.Name = "AxToolbarControl1"
Me.AxToolbarControl1.OcxState = CType(resources.GetObject("AxToolbarControl1.OcxState"), System.Windows.Forms.AxHost.State)
Me.AxToolbarControl1.Size = New System.Drawing.Size(592, 28)
Me.AxToolbarControl1.TabIndex = 15
'
'frmGlbCntrl
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.BackColor = System.Drawing.SystemColors.Control
Me.ClientSize = New System.Drawing.Size(609, 494)
Me.Controls.Add(Me.AxToolbarControl1)
Me.Controls.Add(Me.AxTOCControl1)
Me.Controls.Add(Me.AxLicenseControl2)
Me.Controls.Add(Me.AxGlobeControl1)
Me.Controls.Add(Me.FrmAnim)
Me.Controls.Add(Me.lblStatus)
Me.Cursor = System.Windows.Forms.Cursors.Default
Me.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.Location = New System.Drawing.Point(4, 23)
Me.MaximizeBox = False
Me.Name = "frmGlbCntrl"
Me.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.Text = "GlobeControlAnimation"
Me.FrmAnim.ResumeLayout(False)
CType(Me.AxGlobeControl1, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.AxLicenseControl2, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.AxTOCControl1, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.AxToolbarControl1, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)
End Sub
#End Region
Private m_sAnimFilePath As String
Private Sub CmdLoad_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles CmdLoad.Click
OpenFileDialog1.Title = "Open ArcGlobe Animation File"
OpenFileDialog1.Filter = "ArcGlobe Animation Files (*.aga)|*.aga"
'set ArcGlobeAnimaton path folder as default path...
If Not m_sAnimFilePath = "" Then
OpenFileDialog1.InitialDirectory = m_sAnimFilePath
Else
OpenFileDialog1.InitialDirectory = Application.StartupPath
End If
OpenFileDialog1.ShowDialog()
'if the user selected an animation file
Dim sAnimFilePath As String
sAnimFilePath = OpenFileDialog1.FileName
If sAnimFilePath = "" Then Exit Sub
'sAnimFilePath
Dim pBasicScene As IBasicScene
Dim pGlobe As IGlobe
pGlobe = AxGlobeControl1.Globe
pBasicScene = pglobe
pBasicScene.LoadAnimation(sAnimFilePath)
'if loading of the animation succeeded, enable player controls...
'Enable Animation Player controls...
OptDuration.Enabled = True
OptIteration.Enabled = True
txtDuration.Enabled = True
TxtFrequency.Enabled = True
TxtFrequency.Enabled = True
CmdPlay.Enabled = True
End Sub
Private Sub frmGlbCntrl_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
Dim pBasicScene As IBasicScene
Dim pGlobe As IGlobe
'check and load if the animation file is present...
m_sAnimFilePath = "..\..\..\..\..\Data\ArcGlobeAnimation\AnimationSample.aga"
If System.IO.File.Exists(m_sAnimFilePath) Then
'Load the sample animation file into the animation file into the doc...
pGlobe = AxGlobeControl1.Globe
pBasicScene = pGlobe
pBasicScene.LoadAnimation(m_sAnimFilePath)
Else
'Disable Animation Player controls...
OptDuration.Enabled = False
OptIteration.Enabled = False
txtDuration.Enabled = False
TxtFrequency.Enabled = False
TxtFrequency.Enabled = False
CmdPlay.Enabled = False
End If
Icon = Nothing
End Sub
Private Sub CmdPlay_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles CmdPlay.Click
Dim duration As Double, numCycle As Integer
Dim iteration As Integer, cycles As Integer
'allows to handle when non integer character is entered in txtDuration.Text or TxtFrequency.Text
On Error Resume Next
If OptDuration.Checked Then
duration = CInt(txtDuration.Text)
numCycle = CInt(TxtFrequency.Text)
'play the animation via duration
PlayAnimation(duration, numCycle)
Else
iteration = CInt(txtDuration.Text)
cycles = CInt(TxtFrequency.Text)
'play animation via iteration...
PlayAnimationFast(cycles, iteration)
End If
End Sub
Private Sub PlayAnimation(ByRef duration As Double, ByRef numCycles As Integer)
Dim pGlobe As IGlobe
Dim pTracks As IAnimationTracks
Dim viewers3D As IViewers3D
pGlobe = AxGlobeControl1.Globe
pTracks = pGlobe
viewers3D = pGlobe.GlobeDisplay
'exit if document doesn't contain animation..
Dim sError As String
If pTracks.TrackCount = 0 Then
sError = m_sAnimFilePath
If sError = "" Then
sError = "To get a Sample animation file, Developer Kit Samples need to be installed!"
System.Windows.Forms.MessageBox.Show("The current document doesn't contain animation file." & Chr(13) & sError)
Else
System.Windows.Forms.MessageBox.Show("The current document doesn't contain animation file." & Chr(13) & "Load " & m_sAnimFilePath & "\AnimationSample.aga for sample.")
End If
Exit Sub
End If
Dim startTime As DateTime, timeSpan As TimeSpan
Dim elapsedTime As Integer, i As Integer, j As Integer
For i = 1 To numCycles Step 1
startTime = DateTime.Now
j = 0
Do
timeSpan = DateTime.Now().Subtract(startTime)
elapsedTime = timeSpan.TotalSeconds
If (elapsedTime > duration) Then
elapsedTime = duration
End If
pTracks.ApplyTracks(Nothing, elapsedTime, duration)
viewers3D.RefreshViewers()
j = j + 1
Loop While elapsedTime < duration
Next i
End Sub
Private Sub PlayAnimationFast(Optional ByVal cycles As Integer = 0, Optional ByVal iteration As Integer = 0)
Dim pGlobe As IGlobe
Dim pGlobeDisplay As IGlobeDisplay
Dim pScene As Scene
Dim pSceneTracks As IAnimationTracks
pGlobe = AxGlobeControl1.Globe
pGlobeDisplay = pGlobe.GlobeDisplay
pScene = pGlobeDisplay.Scene
pSceneTracks = pScene
Dim pCollection As Collection
Dim pTrackCamArray As IArray
Dim pTrackGlbArray As IArray
Dim pTrackLyrArray As IArray
pCollection = New Collection
pTrackCamArray = New Array
pTrackGlbArray = New Array
pTrackLyrArray = New Array
Dim sError As String
If pSceneTracks.TrackCount = 0 Then
sError = m_sAnimFilePath
If sError = "" Then
sError = "To get a Sample animation file, Developer Kit Samples need to be installed!"
System.Windows.Forms.MessageBox.Show("The current document doesn't contain animation file." & Chr(13) & sError)
Else
System.Windows.Forms.MessageBox.Show("The current document doesn't contain animation file." & Chr(13) & "Load " & m_sAnimFilePath & "\AnimationSample.aga for sample.")
End If
Exit Sub
End If
Dim i As Integer, count() As Integer, k As Object
Dim pTrack As IAnimationTrack
Dim pTrackLayer As IAnimationTrack
Dim pTrackGlobe As IAnimationTrack = Nothing
Dim pAnimType As IAnimationType
Dim pAnimLayer As IAnimationType
Dim pAnimGlobeCam As IAnimationType = Nothing
Dim pKFGlbCam As IKeyframe
Dim pKFGlbLayer As IKeyframe
'get each track from the scene and store tracks of the same kind in an Array
For i = 0 To pSceneTracks.TrackCount - 1
pTrack = pSceneTracks.Tracks.Element(i)
ReDim Preserve count(i)
k = i
pAnimType = pTrack.AnimationType
If pAnimType.CLSID.Value = "{7CCBA704-3933-4D7A-8E89-4DFEE88AA937}" Then
'GlobeLayer
pTrackLayer = New AnimationTrackClass
pTrackLayer = pTrack
pTrackLayer.AnimationType = pAnimType
pKFGlbLayer = New GlobeLayerKeyframeClass
pAnimLayer = pAnimType
'Store the keyframe count of each track in an array
count(i) = pTrackLayer.KeyframeCount
pTrackLyrArray.Add(pTrackLayer)
ElseIf pAnimType.CLSID.Value = "{D4565495-E2F9-4D89-A8A7-D0B69FD7A424}" Then
'Globe Camera type
pTrackGlobe = New AnimationTrackClass
pTrackGlobe = pTrack
pTrackGlobe.AnimationType = pAnimType
pKFGlbCam = New GlobeCameraKeyframeClass
pAnimGlobeCam = pAnimType
'Store the keyframe count of each track in an array
count(i) = pTrackGlobe.KeyframeCount
pTrackGlbArray.Add(pTrackGlobe)
Else
System.Windows.Forms.MessageBox.Show("Animation Type " & pAnimType.Name & " Not Supported. Check if the animation File is Valid!")
Exit Sub
End If
Next
Dim larger As Integer
larger = Greatest(count)
' if nothing gets passed by the argument it takes the max no of keyframes
If IsNothing(iteration) Then iteration = larger
Dim start As Integer, j As Integer, t As Integer
Dim keyFrameCount As Integer, keyFrameCameraCount As Integer, keyFrameLayerCount As Integer
Dim time As Double
Dim pTrackCamera As IAnimationTrack
Dim pAnimCam As IAnimationType = Nothing
Dim pKFBkmark As IKeyframe
For i = 1 To cycles 'Total number of cycles
For start = 0 To iteration ' no of iterations...
For j = 0 To pTrackCamArray.Count - 1
pTrackCamera = pTrackCamArray.Element(j)
If Not pTrackCamera Is Nothing Then
If time >= pTrackCamera.BeginTime Then
keyFrameCameraCount = pTrackGlobe.KeyframeCount
pKFBkmark = pTrackCamera.Keyframe(keyFrameCameraCount - keyFrameCameraCount)
'reset object
pAnimCam.ResetObject(pScene, pKFBkmark)
' interpolate by using track
pTrackCamera.InterpolateObjectProperties(pScene, time)
keyFrameCameraCount = keyFrameCameraCount - 1
End If
End If
Next
For k = 0 To pTrackGlbArray.Count - 1
pTrackGlobe = pTrackGlbArray.Element(k)
If Not pTrackGlobe Is Nothing Then
If time >= pTrackGlobe.BeginTime Then
keyFrameCount = pTrackGlobe.KeyframeCount
pKFGlbCam = pTrackGlobe.Keyframe(pTrackGlobe.KeyframeCount - keyFrameCount)
'reset object
pAnimGlobeCam.ResetObject(pScene, pKFGlbCam)
' interpolate by using track
pTrackGlobe.InterpolateObjectProperties(pScene, time)
keyFrameCount = keyFrameCount - 1
End If
End If
Next
For t = 0 To pTrackLyrArray.Count - 1
pTrackLayer = pTrackLyrArray.Element(t)
If Not pTrackLayer Is Nothing Then
If time >= pTrackLayer.BeginTime Then
keyFrameLayerCount = pTrackLayer.KeyframeCount
pKFGlbLayer = pTrackLayer.Keyframe(pTrackLayer.KeyframeCount - keyFrameLayerCount)
'interpolate by using track
pTrackLayer.InterpolateObjectProperties(pScene, time)
keyFrameLayerCount = keyFrameLayerCount - 1
End If
End If
Next
'reset interpolation Point
time = start / iteration
'refresh the globeviewer(s)
pGlobeDisplay.RefreshViewers()
Next start
Next
End Sub
Private Function Greatest(ByRef pArray() As Integer) As Integer
' Function to find the largest count of keyframes (in any one of the Animation tracks)
Dim iLength As Integer, i As Integer, iMax As Integer
iLength = UBound(pArray)
ReDim Preserve pArray(iLength)
For i = 0 To iLength - 1
If IsNothing(iMax) Then
iMax = pArray(i)
ElseIf pArray(i) > iMax Then
iMax = pArray(i)
End If
Next
Greatest = iMax
End Function
Private Sub OptDuration_CheckedChanged(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles OptDuration.CheckedChanged
If eventSender.Checked Then
txtDuration.Text = CStr(10) 'set default values
TxtFrequency.Text = CStr(2) 'set Default values
End If
End Sub
Private Sub OptIteration_CheckedChanged(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles OptIteration.CheckedChanged
If eventSender.Checked Then
'Set Default cycle and iteration..
txtDuration.Text = CStr(500)
TxtFrequency.Text = CStr(2)
End If
End Sub
Private Function routin_ReadRegistry(ByRef sKey As String) As String
'Open the subkey for reading
'Dim rk As Microsoft.Win32.RegistryKey
'rk = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(sKey, True)
'If rk Is Nothing Then routin_ReadRegistry = ""
'Get the data from a specified item in the key.
Dim installationFolder As String = ESRI.ArcGIS.RuntimeManager.ActiveRuntime.Path
'routin_ReadRegistry = rk.GetValue("InstallDir")
routin_ReadRegistry = installationFolder
End Function
Private Sub AxToolbarControl1_OnItemClick(ByVal sender As Object, ByVal e As ESRI.ArcGIS.Controls.IToolbarControlEvents_OnItemClickEvent) Handles AxToolbarControl1.OnItemClick
'Display help when fly tool and walk tools are selected...
'check if key intercept is enabled,if not enable it.
If Not AxGlobeControl1.KeyIntercept = 1 Then AxGlobeControl1.KeyIntercept = 1
Dim puid As UID
puid = AxToolbarControl1.GetItem(e.index).UID
'uid for fly tool={2C327C42-8CA9-4FC3-8C7B-F6290680FABB}
'uid for walk tool={56C3BDD4-C51A-4574-8954-D3E1F5F54E57}
If puid.Value = "{2C327C42-8CA9-4FC3-8C7B-F6290680FABB}" Then
'fly...
lblStatus.Text = "Use arrow up or arrow left keys to decelerate and arrow up or arrow left keys to accelerate."
'Fly tool
ElseIf puid.Value = "{56C3BDD4-C51A-4574-8954-D3E1F5F54E57}" Then
'walk...
lblStatus.Text = "Use arrow up or down keys to change elevation and the arrow left or right keys to fine-tune travel speed."
Else
lblStatus.Text = ""
End If
End Sub
End Class