About the Navigating around the GlobeControl Sample
[C#]
Navigation.cs
using System;
using System.Windows.Forms;
using ESRI.ArcGIS.Analyst3D;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.GlobeCore;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS;
namespace GlobeNavigation
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Navigation : System.Windows.Forms.Form
{
internal System.Windows.Forms.TrackBar TrackBar1;
public System.Windows.Forms.CheckBox chkSpin;
public System.Windows.Forms.RadioButton optTools1;
public System.Windows.Forms.RadioButton optTools0;
public System.Windows.Forms.Button cmdLoadDocument;
public System.Windows.Forms.Button cmdZoomOut;
public System.Windows.Forms.Button cmdZoomIn;
public System.Windows.Forms.Button cmdFullExtent;
public System.Windows.Forms.Label Label1;
public System.Windows.Forms.Label lblNavigate;
public System.Windows.Forms.Label lblZoom;
public System.Windows.Forms.Label lblLoad;
private System.Windows.Forms.OpenFileDialog openFileDialog1;
private ISceneViewer m_ActiveView;
private ICamera m_Camera;
private IPoint m_pMousePos = new PointClass();
private bool m_bMouseDown;
private bool m_bZooming = false;
private double m_dSpinSpeed = 0;
private double m_dZoom;
const double cMinZoom = 1.00002;
const double cMaxZoom = 1.1;
const double cDistanceZoomLimit = 200.0;
private ESRI.ArcGIS.Controls.AxGlobeControl axGlobeControl1;
private ESRI.ArcGIS.Controls.AxLicenseControl axLicenseControl1;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;
public Navigation()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call
//
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
//Release COM objects, check in extension and shutdown
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(Navigation));
this.TrackBar1 = new System.Windows.Forms.TrackBar();
this.chkSpin = new System.Windows.Forms.CheckBox();
this.optTools1 = new System.Windows.Forms.RadioButton();
this.optTools0 = new System.Windows.Forms.RadioButton();
this.cmdLoadDocument = new System.Windows.Forms.Button();
this.cmdZoomOut = new System.Windows.Forms.Button();
this.cmdZoomIn = new System.Windows.Forms.Button();
this.cmdFullExtent = new System.Windows.Forms.Button();
this.Label1 = new System.Windows.Forms.Label();
this.lblNavigate = new System.Windows.Forms.Label();
this.lblZoom = new System.Windows.Forms.Label();
this.lblLoad = new System.Windows.Forms.Label();
this.openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
this.axGlobeControl1 = new ESRI.ArcGIS.Controls.AxGlobeControl();
this.axLicenseControl1 = new ESRI.ArcGIS.Controls.AxLicenseControl();
((System.ComponentModel.ISupportInitialize)(this.TrackBar1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.axGlobeControl1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.axLicenseControl1)).BeginInit();
this.SuspendLayout();
//
// TrackBar1
//
this.TrackBar1.Location = new System.Drawing.Point(440, 432);
this.TrackBar1.Name = "TrackBar1";
this.TrackBar1.Size = new System.Drawing.Size(104, 45);
this.TrackBar1.TabIndex = 26;
this.TrackBar1.Scroll += new System.EventHandler(this.TrackBar1_Scroll);
//
// chkSpin
//
this.chkSpin.BackColor = System.Drawing.SystemColors.Control;
this.chkSpin.Cursor = System.Windows.Forms.Cursors.Default;
this.chkSpin.Font = new System.Drawing.Font("Arial", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.chkSpin.ForeColor = System.Drawing.SystemColors.ControlText;
this.chkSpin.Location = new System.Drawing.Point(456, 408);
this.chkSpin.Name = "chkSpin";
this.chkSpin.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.chkSpin.Size = new System.Drawing.Size(57, 17);
this.chkSpin.TabIndex = 25;
this.chkSpin.Text = "Spin";
this.chkSpin.Click += new System.EventHandler(this.chkSpin_Click);
//
// optTools1
//
this.optTools1.Appearance = System.Windows.Forms.Appearance.Button;
this.optTools1.BackColor = System.Drawing.SystemColors.Control;
this.optTools1.Cursor = System.Windows.Forms.Cursors.Default;
this.optTools1.Font = new System.Drawing.Font("Arial", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.optTools1.ForeColor = System.Drawing.SystemColors.ControlText;
this.optTools1.Location = new System.Drawing.Point(448, 328);
this.optTools1.Name = "optTools1";
this.optTools1.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.optTools1.Size = new System.Drawing.Size(81, 25);
this.optTools1.TabIndex = 20;
this.optTools1.TabStop = true;
this.optTools1.Text = "Zoom In/Out";
this.optTools1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.optTools1.Click += new System.EventHandler(this.MixedControls_Click);
//
// optTools0
//
this.optTools0.Appearance = System.Windows.Forms.Appearance.Button;
this.optTools0.BackColor = System.Drawing.SystemColors.Control;
this.optTools0.Cursor = System.Windows.Forms.Cursors.Default;
this.optTools0.Font = new System.Drawing.Font("Arial", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.optTools0.ForeColor = System.Drawing.SystemColors.ControlText;
this.optTools0.Location = new System.Drawing.Point(448, 288);
this.optTools0.Name = "optTools0";
this.optTools0.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.optTools0.Size = new System.Drawing.Size(81, 25);
this.optTools0.TabIndex = 19;
this.optTools0.TabStop = true;
this.optTools0.Text = "Navigate";
this.optTools0.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.optTools0.Click += new System.EventHandler(this.MixedControls_Click);
//
// cmdLoadDocument
//
this.cmdLoadDocument.BackColor = System.Drawing.SystemColors.Control;
this.cmdLoadDocument.Cursor = System.Windows.Forms.Cursors.Default;
this.cmdLoadDocument.Font = new System.Drawing.Font("Arial", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.cmdLoadDocument.ForeColor = System.Drawing.SystemColors.ControlText;
this.cmdLoadDocument.Location = new System.Drawing.Point(456, 48);
this.cmdLoadDocument.Name = "cmdLoadDocument";
this.cmdLoadDocument.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.cmdLoadDocument.Size = new System.Drawing.Size(67, 25);
this.cmdLoadDocument.TabIndex = 18;
this.cmdLoadDocument.Text = "Load ...";
this.cmdLoadDocument.Click += new System.EventHandler(this.cmdLoadDocument_Click);
//
// cmdZoomOut
//
this.cmdZoomOut.BackColor = System.Drawing.SystemColors.Control;
this.cmdZoomOut.Cursor = System.Windows.Forms.Cursors.Default;
this.cmdZoomOut.Font = new System.Drawing.Font("Arial", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.cmdZoomOut.ForeColor = System.Drawing.SystemColors.ControlText;
this.cmdZoomOut.Location = new System.Drawing.Point(440, 168);
this.cmdZoomOut.Name = "cmdZoomOut";
this.cmdZoomOut.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.cmdZoomOut.Size = new System.Drawing.Size(99, 25);
this.cmdZoomOut.TabIndex = 17;
this.cmdZoomOut.Text = "Fixed Zoom Out";
this.cmdZoomOut.Click += new System.EventHandler(this.cmdZoomOut_Click);
//
// cmdZoomIn
//
this.cmdZoomIn.BackColor = System.Drawing.SystemColors.Control;
this.cmdZoomIn.Cursor = System.Windows.Forms.Cursors.Default;
this.cmdZoomIn.Font = new System.Drawing.Font("Arial", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.cmdZoomIn.ForeColor = System.Drawing.SystemColors.ControlText;
this.cmdZoomIn.Location = new System.Drawing.Point(440, 136);
this.cmdZoomIn.Name = "cmdZoomIn";
this.cmdZoomIn.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.cmdZoomIn.Size = new System.Drawing.Size(99, 25);
this.cmdZoomIn.TabIndex = 16;
this.cmdZoomIn.Text = "Fixed Zoom In";
this.cmdZoomIn.Click += new System.EventHandler(this.cmdZoomIn_Click);
//
// cmdFullExtent
//
this.cmdFullExtent.BackColor = System.Drawing.SystemColors.Control;
this.cmdFullExtent.Cursor = System.Windows.Forms.Cursors.Default;
this.cmdFullExtent.Font = new System.Drawing.Font("Arial", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.cmdFullExtent.ForeColor = System.Drawing.SystemColors.ControlText;
this.cmdFullExtent.Location = new System.Drawing.Point(440, 200);
this.cmdFullExtent.Name = "cmdFullExtent";
this.cmdFullExtent.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.cmdFullExtent.Size = new System.Drawing.Size(99, 25);
this.cmdFullExtent.TabIndex = 15;
this.cmdFullExtent.Text = "Full Extent";
this.cmdFullExtent.Click += new System.EventHandler(this.cmdFullExtent_Click);
//
// Label1
//
this.Label1.BackColor = System.Drawing.SystemColors.Control;
this.Label1.Cursor = System.Windows.Forms.Cursors.Default;
this.Label1.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.Label1.ForeColor = System.Drawing.SystemColors.Highlight;
this.Label1.Location = new System.Drawing.Point(440, 360);
this.Label1.Name = "Label1";
this.Label1.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.Label1.Size = new System.Drawing.Size(97, 49);
this.Label1.TabIndex = 24;
this.Label1.Text = "Control the spin speed with the slider.";
//
// lblNavigate
//
this.lblNavigate.BackColor = System.Drawing.SystemColors.Control;
this.lblNavigate.Cursor = System.Windows.Forms.Cursors.Default;
this.lblNavigate.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.lblNavigate.ForeColor = System.Drawing.SystemColors.Highlight;
this.lblNavigate.Location = new System.Drawing.Point(440, 232);
this.lblNavigate.Name = "lblNavigate";
this.lblNavigate.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.lblNavigate.Size = new System.Drawing.Size(105, 49);
this.lblNavigate.TabIndex = 23;
this.lblNavigate.Text = "Use the option buttons to select a navigation tool. ";
//
// lblZoom
//
this.lblZoom.BackColor = System.Drawing.SystemColors.Control;
this.lblZoom.Cursor = System.Windows.Forms.Cursors.Default;
this.lblZoom.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.lblZoom.ForeColor = System.Drawing.SystemColors.Highlight;
this.lblZoom.Location = new System.Drawing.Point(440, 80);
this.lblZoom.Name = "lblZoom";
this.lblZoom.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.lblZoom.Size = new System.Drawing.Size(104, 49);
this.lblZoom.TabIndex = 22;
this.lblZoom.Text = "Use the buttons to navigate the Globe data.";
//
// lblLoad
//
this.lblLoad.BackColor = System.Drawing.SystemColors.Control;
this.lblLoad.Cursor = System.Windows.Forms.Cursors.Default;
this.lblLoad.Font = new System.Drawing.Font("Tahoma", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
this.lblLoad.ForeColor = System.Drawing.SystemColors.Highlight;
this.lblLoad.Location = new System.Drawing.Point(440, 8);
this.lblLoad.Name = "lblLoad";
this.lblLoad.RightToLeft = System.Windows.Forms.RightToLeft.No;
this.lblLoad.Size = new System.Drawing.Size(97, 33);
this.lblLoad.TabIndex = 21;
this.lblLoad.Text = "Browse to a 3dd file to load.";
//
// axGlobeControl1
//
this.axGlobeControl1.Location = new System.Drawing.Point(8, 8);
this.axGlobeControl1.Name = "axGlobeControl1";
this.axGlobeControl1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axGlobeControl1.OcxState")));
this.axGlobeControl1.Size = new System.Drawing.Size(424, 464);
this.axGlobeControl1.TabIndex = 27;
this.axGlobeControl1.OnMouseDown += new ESRI.ArcGIS.Controls.IGlobeControlEvents_Ax_OnMouseDownEventHandler(this.axGlobeControl1_OnMouseDown);
this.axGlobeControl1.OnMouseMove += new ESRI.ArcGIS.Controls.IGlobeControlEvents_Ax_OnMouseMoveEventHandler(this.axGlobeControl1_OnMouseMove);
this.axGlobeControl1.OnMouseUp += new ESRI.ArcGIS.Controls.IGlobeControlEvents_Ax_OnMouseUpEventHandler(this.axGlobeControl1_OnMouseUp);
//
// axLicenseControl1
//
this.axLicenseControl1.Enabled = true;
this.axLicenseControl1.Location = new System.Drawing.Point(216, 24);
this.axLicenseControl1.Name = "axLicenseControl1";
this.axLicenseControl1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject("axLicenseControl1.OcxState")));
this.axLicenseControl1.Size = new System.Drawing.Size(200, 50);
this.axLicenseControl1.TabIndex = 28;
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
this.ClientSize = new System.Drawing.Size(552, 478);
this.Controls.Add(this.axLicenseControl1);
this.Controls.Add(this.axGlobeControl1);
this.Controls.Add(this.TrackBar1);
this.Controls.Add(this.chkSpin);
this.Controls.Add(this.optTools1);
this.Controls.Add(this.optTools0);
this.Controls.Add(this.cmdLoadDocument);
this.Controls.Add(this.cmdZoomOut);
this.Controls.Add(this.cmdZoomIn);
this.Controls.Add(this.cmdFullExtent);
this.Controls.Add(this.Label1);
this.Controls.Add(this.lblNavigate);
this.Controls.Add(this.lblZoom);
this.Controls.Add(this.lblLoad);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
((System.ComponentModel.ISupportInitialize)(this.TrackBar1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.axGlobeControl1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.axLicenseControl1)).EndInit();
this.ResumeLayout(false);
}
#endregion
/// <summary>
/// The main entry point for the application.
/// </summary>
[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 Navigation());
}
private void Form1_Load(object sender, System.EventArgs e)
{
//Initialize member variables
m_ActiveView = axGlobeControl1.GlobeDisplay.ActiveViewer;
m_Camera = m_ActiveView.Camera;
}
private void cmdLoadDocument_Click(object sender, System.EventArgs e)
{
//Open a file dialog for selecting map documents
openFileDialog1.Title = "Globe Documents";
openFileDialog1.DefaultExt = ".3dd";
openFileDialog1.Filter = "Globe Document(*.3dd)|*.3dd";
openFileDialog1.ShowDialog();
//Check a file is selected and that it's a valid Globe document
//before attempting to load it
if (openFileDialog1.FileName != "")
{
if (axGlobeControl1.Check3dFile(openFileDialog1.FileName) == true)
{
axGlobeControl1.Load3dFile(openFileDialog1.FileName);
}
else
{
MessageBox.Show("Cannot load " + openFileDialog1.FileName);
}
}
}
private void cmdFullExtent_Click(object sender, System.EventArgs e)
{
IGlobeCamera camera = (IGlobeCamera) m_Camera;
//Make sure that the camera is using global coordinates
camera.OrientationMode = esriGlobeCameraOrientationMode.esriGlobeCameraOrientationGlobal;
//Point the camera at 0,0 in lat,long - this is the default target
IPoint target = new PointClass();
target.PutCoords(0.0, 0.0);
target.Z = 0.0;
m_Camera.Target = target;
//Reset the camera to its default values
m_Camera.Azimuth = 140;
m_Camera.Inclination = 45;
m_Camera.ViewingDistance = 4.0;
m_Camera.ViewFieldAngle = 30.0;
m_Camera.RollAngle = 0.0;
m_Camera.RecalcUp();
m_ActiveView.Redraw(false);
}
private void cmdZoomIn_Click(object sender, System.EventArgs e)
{
//Reset the camera field of view angle to 0.9 of its previous value
double vfa = m_Camera.ViewFieldAngle;
m_Camera.ViewFieldAngle = vfa * 0.9;
m_ActiveView.Redraw(false);
}
private void cmdZoomOut_Click(object sender, System.EventArgs e)
{
//Reset the camera field of view angle to 1.1 times its previous value
double vfa = m_Camera.ViewFieldAngle;
m_Camera.ViewFieldAngle = vfa * 1.1;
m_ActiveView.Redraw(false);
}
private void CalculateMoveFactors(double dist)
{
bool bIsAtCenter;
int indexGlobe;
//See if the camera is pointing at the center of the globe.
IGlobeViewer globeViewer = (IGlobeViewer) m_ActiveView;
globeViewer.GetIsTargetAtCenter(out bIsAtCenter, out indexGlobe);
//If the camera is pointing at the center of the globe then the zoom speed
//depends on how far away it is, otherwise the zoom factor is fixed. As the
//camera approaches the globe surface (where dist = 1) the zoom speed slows
//down. The other factors were worked out by trial and error.
if (bIsAtCenter == true)
{
m_dZoom = cMinZoom + (cMaxZoom - cMinZoom) * (dist - 1.0) / 3.0;
}
else
{
m_dZoom = 1.1;
}
}
private void chkSpin_Click(object sender, System.EventArgs e)
{
if (chkSpin.CheckState == CheckState.Checked)
{
axGlobeControl1.GlobeViewer.StartSpinning(esriGlobeSpinDirection.esriCounterClockwise);
axGlobeControl1.GlobeViewer.SpinSpeed = 3;
TrackBar1.Enabled = true;
m_dSpinSpeed = 3;
}
else
{
axGlobeControl1.GlobeViewer.StopSpinning();
TrackBar1.Enabled = false;
m_dSpinSpeed = 0;
}
}
private void TrackBar1_Scroll(object sender, System.EventArgs e)
{
//The globe should increase its spin speed with every increment greater than
//5 and decrease it for every increment less.
int sliderPos = (TrackBar1.Value - 5);
if (sliderPos == 0)
{
m_dSpinSpeed = 3;
}
else if (sliderPos > 0)
{
m_dSpinSpeed = 3 * (sliderPos + 1);
}
else
{
m_dSpinSpeed = 3 / (1 - sliderPos);
}
axGlobeControl1.GlobeViewer.SpinSpeed = m_dSpinSpeed;
}
private void MixedControls_Click(object sender, System.EventArgs e)
{
RadioButton b = (RadioButton) sender;
//Set current tool
switch (b.Name)
{
case "optTools0":
m_bZooming = false;
axGlobeControl1.Navigate = true;
axGlobeControl1.MousePointer = esriControlsMousePointer.esriPointerDefault;
break;
case "optTools1":
m_bZooming = true;
axGlobeControl1.Navigate = false;
axGlobeControl1.MousePointer = esriControlsMousePointer.esriPointerZoom;
break;
}
}
private void axGlobeControl1_OnMouseUp(object sender, ESRI.ArcGIS.Controls.IGlobeControlEvents_OnMouseUpEvent e)
{
//Cancel the zoom operation
m_bMouseDown = false;
//Navigate can cancel spin - make sure it starts again
if (m_dSpinSpeed > 0)
{
axGlobeControl1.GlobeViewer.StartSpinning(esriGlobeSpinDirection.esriCounterClockwise);
}
}
private void axGlobeControl1_OnMouseMove(object sender, ESRI.ArcGIS.Controls.IGlobeControlEvents_OnMouseMoveEvent e)
{
if (m_bMouseDown == false)
{
return;
}
//If we're in a zoom operation then
//Get the difference in mouse position between this and the last one
double dx = e.x - m_pMousePos.X;
double dy = e.y - m_pMousePos.Y;
if ((dx == 0) & (dy == 0))
{
return;
}
//Work out how far the observer is currently from the globe and use this
//distance to determine how far to move
IPoint observer = m_Camera.Observer;
double zObs;
double xObs;
double yObs;
double dist;
observer.QueryCoords(out xObs, out yObs);
zObs = observer.Z;
dist = System.Math.Sqrt(xObs * xObs + yObs * yObs + zObs * zObs);
CalculateMoveFactors(dist);
//Zoom out and in as the mouse moves up and down the screen respectively
if ((dy < 0) & (dist < cDistanceZoomLimit))
{
m_Camera.Zoom(m_dZoom);
}
else if (dy > 0)
{
m_Camera.Zoom((1 / m_dZoom));
}
m_pMousePos.X = e.x;
m_pMousePos.Y = e.y;
m_ActiveView.Redraw(false);
}
private void axGlobeControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.IGlobeControlEvents_OnMouseDownEvent e)
{
//Mouse down should initiate a zoom only if the Zoom check box is checked
if (m_bZooming == false)
{
return;
}
if (e.button == 1)
{
m_bMouseDown = true;
m_pMousePos.X = e.x;
m_pMousePos.Y = e.y;
}
}
}
}
[Visual Basic .NET]
Navigation.vb
Imports ESRI.ArcGIS.esriSystem
Imports ESRI.ArcGIS.controls
Imports ESRI.ArcGIS.Analyst3D
Imports ESRI.ArcGIS.Geometry
Imports ESRI.ArcGIS.GlobeCore
Imports ESRI.ArcGIS
Public Class frmGlobeNavigation
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 frmGlobeNavigation())
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 chkSpin As System.Windows.Forms.CheckBox
Public WithEvents cmdLoadDocument As System.Windows.Forms.Button
Public WithEvents cmdZoomOut As System.Windows.Forms.Button
Public WithEvents cmdZoomIn As System.Windows.Forms.Button
Public WithEvents cmdFullExtent As System.Windows.Forms.Button
Public WithEvents Label1 As System.Windows.Forms.Label
Public WithEvents lblNavigate As System.Windows.Forms.Label
Public WithEvents lblZoom As System.Windows.Forms.Label
Public WithEvents lblLoad 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 TrackBar1 As System.Windows.Forms.TrackBar
Public WithEvents optTools1 As System.Windows.Forms.RadioButton
Public WithEvents optTools0 As System.Windows.Forms.RadioButton
Friend WithEvents AxGlobeControl1 As ESRI.ArcGIS.Controls.AxGlobeControl
Friend WithEvents AxLicenseControl1 As ESRI.ArcGIS.Controls.AxLicenseControl
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Dim resources As System.Resources.ResourceManager = New System.Resources.ResourceManager(GetType(frmGlobeNavigation))
Me.chkSpin = New System.Windows.Forms.CheckBox
Me.optTools1 = New System.Windows.Forms.RadioButton
Me.optTools0 = New System.Windows.Forms.RadioButton
Me.cmdLoadDocument = New System.Windows.Forms.Button
Me.cmdZoomOut = New System.Windows.Forms.Button
Me.cmdZoomIn = New System.Windows.Forms.Button
Me.cmdFullExtent = New System.Windows.Forms.Button
Me.Label1 = New System.Windows.Forms.Label
Me.lblNavigate = New System.Windows.Forms.Label
Me.lblZoom = New System.Windows.Forms.Label
Me.lblLoad = New System.Windows.Forms.Label
Me.OpenFileDialog1 = New System.Windows.Forms.OpenFileDialog
Me.TrackBar1 = New System.Windows.Forms.TrackBar
Me.AxGlobeControl1 = New ESRI.ArcGIS.Controls.AxGlobeControl
Me.AxLicenseControl1 = New ESRI.ArcGIS.Controls.AxLicenseControl
CType(Me.TrackBar1, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.AxGlobeControl1, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.AxLicenseControl1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'chkSpin
'
Me.chkSpin.BackColor = System.Drawing.SystemColors.Control
Me.chkSpin.Cursor = System.Windows.Forms.Cursors.Default
Me.chkSpin.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.chkSpin.ForeColor = System.Drawing.SystemColors.ControlText
Me.chkSpin.Location = New System.Drawing.Point(496, 408)
Me.chkSpin.Name = "chkSpin"
Me.chkSpin.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.chkSpin.Size = New System.Drawing.Size(57, 17)
Me.chkSpin.TabIndex = 12
Me.chkSpin.Text = "Spin"
'
'optTools1
'
Me.optTools1.Appearance = System.Windows.Forms.Appearance.Button
Me.optTools1.BackColor = System.Drawing.SystemColors.Control
Me.optTools1.Cursor = System.Windows.Forms.Cursors.Default
Me.optTools1.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.optTools1.ForeColor = System.Drawing.SystemColors.ControlText
Me.optTools1.Location = New System.Drawing.Point(488, 328)
Me.optTools1.Name = "optTools1"
Me.optTools1.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.optTools1.Size = New System.Drawing.Size(81, 25)
Me.optTools1.TabIndex = 6
Me.optTools1.TabStop = True
Me.optTools1.Text = "Zoom In/Out"
Me.optTools1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
'
'optTools0
'
Me.optTools0.Appearance = System.Windows.Forms.Appearance.Button
Me.optTools0.BackColor = System.Drawing.SystemColors.Control
Me.optTools0.Cursor = System.Windows.Forms.Cursors.Default
Me.optTools0.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.optTools0.ForeColor = System.Drawing.SystemColors.ControlText
Me.optTools0.Location = New System.Drawing.Point(488, 288)
Me.optTools0.Name = "optTools0"
Me.optTools0.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.optTools0.Size = New System.Drawing.Size(81, 25)
Me.optTools0.TabIndex = 5
Me.optTools0.TabStop = True
Me.optTools0.Text = "Navigate"
Me.optTools0.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
'
'cmdLoadDocument
'
Me.cmdLoadDocument.BackColor = System.Drawing.SystemColors.Control
Me.cmdLoadDocument.Cursor = System.Windows.Forms.Cursors.Default
Me.cmdLoadDocument.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.cmdLoadDocument.ForeColor = System.Drawing.SystemColors.ControlText
Me.cmdLoadDocument.Location = New System.Drawing.Point(496, 48)
Me.cmdLoadDocument.Name = "cmdLoadDocument"
Me.cmdLoadDocument.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.cmdLoadDocument.Size = New System.Drawing.Size(67, 25)
Me.cmdLoadDocument.TabIndex = 4
Me.cmdLoadDocument.Text = "Load ..."
'
'cmdZoomOut
'
Me.cmdZoomOut.BackColor = System.Drawing.SystemColors.Control
Me.cmdZoomOut.Cursor = System.Windows.Forms.Cursors.Default
Me.cmdZoomOut.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.cmdZoomOut.ForeColor = System.Drawing.SystemColors.ControlText
Me.cmdZoomOut.Location = New System.Drawing.Point(480, 168)
Me.cmdZoomOut.Name = "cmdZoomOut"
Me.cmdZoomOut.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.cmdZoomOut.Size = New System.Drawing.Size(99, 25)
Me.cmdZoomOut.TabIndex = 3
Me.cmdZoomOut.Text = "Fixed Zoom Out"
'
'cmdZoomIn
'
Me.cmdZoomIn.BackColor = System.Drawing.SystemColors.Control
Me.cmdZoomIn.Cursor = System.Windows.Forms.Cursors.Default
Me.cmdZoomIn.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.cmdZoomIn.ForeColor = System.Drawing.SystemColors.ControlText
Me.cmdZoomIn.Location = New System.Drawing.Point(480, 136)
Me.cmdZoomIn.Name = "cmdZoomIn"
Me.cmdZoomIn.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.cmdZoomIn.Size = New System.Drawing.Size(99, 25)
Me.cmdZoomIn.TabIndex = 2
Me.cmdZoomIn.Text = "Fixed Zoom In"
'
'cmdFullExtent
'
Me.cmdFullExtent.BackColor = System.Drawing.SystemColors.Control
Me.cmdFullExtent.Cursor = System.Windows.Forms.Cursors.Default
Me.cmdFullExtent.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.cmdFullExtent.ForeColor = System.Drawing.SystemColors.ControlText
Me.cmdFullExtent.Location = New System.Drawing.Point(480, 200)
Me.cmdFullExtent.Name = "cmdFullExtent"
Me.cmdFullExtent.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.cmdFullExtent.Size = New System.Drawing.Size(99, 25)
Me.cmdFullExtent.TabIndex = 1
Me.cmdFullExtent.Text = "Full Extent"
'
'Label1
'
Me.Label1.BackColor = System.Drawing.SystemColors.Control
Me.Label1.Cursor = System.Windows.Forms.Cursors.Default
Me.Label1.Font = New System.Drawing.Font("Tahoma", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.Label1.ForeColor = System.Drawing.SystemColors.Highlight
Me.Label1.Location = New System.Drawing.Point(480, 360)
Me.Label1.Name = "Label1"
Me.Label1.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.Label1.Size = New System.Drawing.Size(97, 49)
Me.Label1.TabIndex = 11
Me.Label1.Text = "Control the spin speed with the slider."
'
'lblNavigate
'
Me.lblNavigate.BackColor = System.Drawing.SystemColors.Control
Me.lblNavigate.Cursor = System.Windows.Forms.Cursors.Default
Me.lblNavigate.Font = New System.Drawing.Font("Tahoma", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.lblNavigate.ForeColor = System.Drawing.SystemColors.Highlight
Me.lblNavigate.Location = New System.Drawing.Point(480, 232)
Me.lblNavigate.Name = "lblNavigate"
Me.lblNavigate.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.lblNavigate.Size = New System.Drawing.Size(105, 49)
Me.lblNavigate.TabIndex = 9
Me.lblNavigate.Text = "Use the option buttons to select a navigation tool. "
'
'lblZoom
'
Me.lblZoom.BackColor = System.Drawing.SystemColors.Control
Me.lblZoom.Cursor = System.Windows.Forms.Cursors.Default
Me.lblZoom.Font = New System.Drawing.Font("Tahoma", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.lblZoom.ForeColor = System.Drawing.SystemColors.Highlight
Me.lblZoom.Location = New System.Drawing.Point(480, 80)
Me.lblZoom.Name = "lblZoom"
Me.lblZoom.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.lblZoom.Size = New System.Drawing.Size(97, 49)
Me.lblZoom.TabIndex = 8
Me.lblZoom.Text = "Use the buttons to navigate the Globe data."
'
'lblLoad
'
Me.lblLoad.BackColor = System.Drawing.SystemColors.Control
Me.lblLoad.Cursor = System.Windows.Forms.Cursors.Default
Me.lblLoad.Font = New System.Drawing.Font("Tahoma", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
Me.lblLoad.ForeColor = System.Drawing.SystemColors.Highlight
Me.lblLoad.Location = New System.Drawing.Point(480, 8)
Me.lblLoad.Name = "lblLoad"
Me.lblLoad.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.lblLoad.Size = New System.Drawing.Size(97, 33)
Me.lblLoad.TabIndex = 7
Me.lblLoad.Text = "Browse to a 3dd file to load."
'
'TrackBar1
'
Me.TrackBar1.Location = New System.Drawing.Point(480, 432)
Me.TrackBar1.Name = "TrackBar1"
Me.TrackBar1.Size = New System.Drawing.Size(104, 45)
Me.TrackBar1.TabIndex = 14
'
'AxGlobeControl1
'
Me.AxGlobeControl1.Location = New System.Drawing.Point(8, 8)
Me.AxGlobeControl1.Name = "AxGlobeControl1"
Me.AxGlobeControl1.OcxState = CType(resources.GetObject("AxGlobeControl1.OcxState"), System.Windows.Forms.AxHost.State)
Me.AxGlobeControl1.Size = New System.Drawing.Size(464, 448)
Me.AxGlobeControl1.TabIndex = 15
'
'AxLicenseControl1
'
Me.AxLicenseControl1.Enabled = True
Me.AxLicenseControl1.Location = New System.Drawing.Point(256, 24)
Me.AxLicenseControl1.Name = "AxLicenseControl1"
Me.AxLicenseControl1.OcxState = CType(resources.GetObject("AxLicenseControl1.OcxState"), System.Windows.Forms.AxHost.State)
Me.AxLicenseControl1.Size = New System.Drawing.Size(200, 50)
Me.AxLicenseControl1.TabIndex = 16
'
'frmGlobeNavigation
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.BackColor = System.Drawing.SystemColors.Control
Me.ClientSize = New System.Drawing.Size(593, 465)
Me.Controls.Add(Me.AxLicenseControl1)
Me.Controls.Add(Me.AxGlobeControl1)
Me.Controls.Add(Me.TrackBar1)
Me.Controls.Add(Me.chkSpin)
Me.Controls.Add(Me.optTools1)
Me.Controls.Add(Me.optTools0)
Me.Controls.Add(Me.cmdLoadDocument)
Me.Controls.Add(Me.cmdZoomOut)
Me.Controls.Add(Me.cmdZoomIn)
Me.Controls.Add(Me.cmdFullExtent)
Me.Controls.Add(Me.Label1)
Me.Controls.Add(Me.lblNavigate)
Me.Controls.Add(Me.lblZoom)
Me.Controls.Add(Me.lblLoad)
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.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle
Me.Location = New System.Drawing.Point(182, 132)
Me.MaximizeBox = False
Me.MinimizeBox = False
Me.Name = "frmGlobeNavigation"
Me.RightToLeft = System.Windows.Forms.RightToLeft.No
Me.StartPosition = System.Windows.Forms.FormStartPosition.Manual
Me.Text = "Globe Navigation"
CType(Me.TrackBar1, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.AxGlobeControl1, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.AxLicenseControl1, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)
End Sub
#End Region
Private m_pActiveView As ISceneViewer
Private m_pCamera As ICamera
Private m_pMousePos As IPoint
Private m_bMouseDown As Boolean
Private m_bZooming As Boolean
Private m_dSpinSpeed As Double
Private m_dZoom As Double
Const cMinZoom As Double = 1.00002
Const cMaxZoom As Double = 1.1
Const cDistanceZoomLimit As Double = 200.0#
Private Sub frmGlobeNavigation_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
'Initialize member variables
m_bZooming = False
m_dSpinSpeed = 0
m_pMousePos = New Point
m_pActiveView = AxGlobeControl1.GlobeDisplay.ActiveViewer
m_pCamera = m_pActiveView.Camera
End Sub
Private Sub cmdLoadDocument_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles cmdLoadDocument.Click
On Error GoTo load_err
OpenFileDialog1.Filter = "Globe Files (*.3dd)|*.3dd"
OpenFileDialog1.ShowDialog()
'Check a file is selected and that it's a valid Globe document
'before attempting to load it
If Not OpenFileDialog1.FileName = "" Then
If Not AxGlobeControl1.Check3dFile(OpenFileDialog1.FileName) Then
MsgBox("Cannot load " & OpenFileDialog1.FileName, MsgBoxStyle.Exclamation)
Else
AxGlobeControl1.Load3dFile(OpenFileDialog1.FileName)
End If
End If
Exit Sub
load_err:
MsgBox(Err.Description)
End Sub
Private Sub cmdFullExtent_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles cmdFullExtent.Click
Dim pCamera As IGlobeCamera
pCamera = m_pCamera
'Make sure that the camera is using global coordinates
pCamera.OrientationMode = esriGlobeCameraOrientationMode.esriGlobeCameraOrientationGlobal
'Point the camera at 0,0 in lat,long - this is the default target
Dim pTarget As IPoint
pTarget = New PointClass
pTarget.PutCoords(0.0#, 0.0#)
pTarget.Z = 0.0#
m_pCamera.Target = pTarget
'Reset the camera to its default values
m_pCamera.Azimuth = 140
m_pCamera.Inclination = 45
m_pCamera.ViewingDistance = 4.0#
m_pCamera.ViewFieldAngle = 30.0#
m_pCamera.RollAngle = 0.0#
m_pCamera.RecalcUp()
m_pActiveView.Redraw(False)
End Sub
Private Sub cmdZoomIn_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles cmdZoomIn.Click
'Reset the camera field of view angle to 0.9 of its previous value
Dim vfa As Double
vfa = m_pCamera.ViewFieldAngle
m_pCamera.ViewFieldAngle = vfa * 0.9
m_pActiveView.Redraw(False)
End Sub
Private Sub cmdZoomOut_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles cmdZoomOut.Click
'Reset the camera field of view angle to 1.1 times its previous value
Dim vfa As Double
vfa = m_pCamera.ViewFieldAngle
m_pCamera.ViewFieldAngle = vfa * 1.1
m_pActiveView.Redraw(False)
End Sub
Private Sub CalculateMoveFactors(ByRef dist As Double)
Dim bIsAtCenter As Boolean
Dim indexGlobe As Integer
Dim pGlobeViewer As IGlobeViewer
'See if the camera is pointing at the center of the globe.
pGlobeViewer = m_pActiveView
pGlobeViewer.GetIsTargetAtCenter(bIsAtCenter, indexGlobe)
'If the camera is pointing at the center of the globe then the zoom speed
'depends on how far away it is, otherwise the zoom factor is fixed. As the
'camera approaches the globe surface (where dist = 1) the zoom speed slows
'down. The other factors were worked out by trial and error.
If bIsAtCenter Then
m_dZoom = cMinZoom + (cMaxZoom - cMinZoom) * (dist - 1.0#) / 3.0#
Else
m_dZoom = 1.1
End If
End Sub
Private Sub chkSpin_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles chkSpin.Click
If chkSpin.CheckState Then
AxGlobeControl1.GlobeViewer.StartSpinning(esriGlobeSpinDirection.esriCounterClockwise)
AxGlobeControl1.GlobeViewer.SpinSpeed = 3
TrackBar1.Enabled = True
m_dSpinSpeed = 3
Else
AxGlobeControl1.GlobeViewer.StopSpinning()
TrackBar1.Enabled = False
m_dSpinSpeed = 0
End If
End Sub
Private Sub MixedControls_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles optTools0.Click, optTools1.Click
Dim radioButton As RadioButton = sender
Select Case radioButton.Name
'Set current tool
Case "optTools0"
m_bZooming = False
AxGlobeControl1.Navigate = True
AxGlobeControl1.MousePointer = esriControlsMousePointer.esriPointerDefault
Case "optTools1"
m_bZooming = True
AxGlobeControl1.Navigate = False
AxGlobeControl1.MousePointer = esriControlsMousePointer.esriPointerZoom
End Select
End Sub
Private Sub TrackBar1_Scroll(ByVal sender As Object, ByVal e As System.EventArgs) Handles TrackBar1.Scroll
Dim sliderPos As Short
'The globe should increase its spin speed with every increment greater than
'5 and decrease it for every increment less.
sliderPos = (TrackBar1.Value - 5)
If sliderPos = 0 Then
m_dSpinSpeed = 3
ElseIf sliderPos > 0 Then
m_dSpinSpeed = 3 * (sliderPos + 1)
Else
m_dSpinSpeed = 3 / (1 - sliderPos)
End If
AxGlobeControl1.GlobeViewer.SpinSpeed = m_dSpinSpeed
End Sub
Private Sub AxGlobeControl1_OnMouseDown(ByVal sender As System.Object, ByVal e As ESRI.ArcGIS.Controls.IGlobeControlEvents_OnMouseDownEvent) Handles AxGlobeControl1.OnMouseDown
'Mouse down should initiate a zoom only if the Zoom check box is checked
If Not m_bZooming Then Exit Sub
If e.button = 1 Then
m_bMouseDown = True
m_pMousePos.X = e.x
m_pMousePos.Y = e.y
End If
End Sub
Private Sub AxGlobeControl1_OnMouseMove(ByVal sender As Object, ByVal e As ESRI.ArcGIS.Controls.IGlobeControlEvents_OnMouseMoveEvent) Handles AxGlobeControl1.OnMouseMove
If Not m_bMouseDown Then Exit Sub
'If we're in a zoom operation then
'Get the difference in mouse position between this and the last one
Dim dx, dy As Integer
dx = e.x - m_pMousePos.X
dy = e.y - m_pMousePos.Y
If dx = 0 And dy = 0 Then Exit Sub
'Work out how far the observer is currently from the globe and use this
'distance to determine how far to move
Dim pObserver As IPoint
pObserver = m_pCamera.Observer
Dim zObs, xObs, yObs, dist As Double
pObserver.QueryCoords(xObs, yObs)
zObs = pObserver.Z
dist = System.Math.Sqrt(xObs * xObs + yObs * yObs + zObs * zObs)
CalculateMoveFactors(dist)
'Zoom out and in as the mouse moves up and down the screen respectively
If dy < 0 And dist < cDistanceZoomLimit Then
m_pCamera.Zoom(m_dZoom)
ElseIf dy > 0 Then
m_pCamera.Zoom((1 / m_dZoom))
End If
m_pMousePos.X = e.x
m_pMousePos.Y = e.y
m_pActiveView.Redraw(False)
End Sub
Private Sub AxGlobeControl1_OnMouseUp(ByVal sender As Object, ByVal e As ESRI.ArcGIS.Controls.IGlobeControlEvents_OnMouseUpEvent) Handles AxGlobeControl1.OnMouseUp
'Cancel the zoom operation
m_bMouseDown = False
'Navigate can cancel spin - make sure it starts again
If m_dSpinSpeed > 0 Then
AxGlobeControl1.GlobeViewer.StartSpinning(esriGlobeSpinDirection.esriCounterClockwise)
End If
End Sub
End Class