About the Multiple globe viewers Sample
[C#]
MultipleGlobeViewers.cs
using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Windows.Forms; using System.Drawing; using System.Runtime.InteropServices; using ESRI.ArcGIS.ADF.BaseClasses; using ESRI.ArcGIS.ADF.CATIDs; using ESRI.ArcGIS.GlobeCore; using ESRI.ArcGIS.Analyst3D; using ESRI.ArcGIS.Geometry; namespace MultipleGlobeViewers { public class MultipleGlobeViewers : ESRI.ArcGIS.Desktop.AddIns.Button { #region Member Variables private ESRI.ArcGIS.GlobeCore.IGlobe globe; private ESRI.ArcGIS.GlobeCore.IGlobeDisplay globeDisplay; private ESRI.ArcGIS.GlobeCore.IGlobeCamera globeCamera; private ESRI.ArcGIS.GlobeCore.IGlobeDisplayEvents_Event globeDispEvent; private SecondaryViewerForm theForm; private ESRI.ArcGIS.Analyst3D.ISceneViewer viewer; private ESRI.ArcGIS.GlobeCore.IGlobeCamera viewerGlobeCamera; private bool topDownView = false; private string viewerCaption = ""; #endregion #region DLLImportFunction [DllImport("gdi32.dll")] static extern bool DeleteObject(IntPtr hObject); [DllImport("user32.dll")] static extern int ShowWindow(int hwnd, int nCmdShow); #endregion public MultipleGlobeViewers() { globe = ArcGlobe.Globe; globeDisplay = globe.GlobeDisplay; globeCamera = (ESRI.ArcGIS.GlobeCore.IGlobeCamera)globeDisplay.ActiveViewer.Camera; globeDispEvent = (ESRI.ArcGIS.GlobeCore.IGlobeDisplayEvents_Event)globeDisplay; } protected override void OnClick() { theForm = new SecondaryViewerForm(); //register form's events theForm.topDownButton.Click += new EventHandler(topDownButton_Click); theForm.normalButton.Click += new EventHandler(normalButton_Click); theForm.FormClosing += new FormClosingEventHandler(theForm_FormClosing); //get viewer list getListOfSecondaryViewers(); //register the ArcGlobe globe's display afterdraw event globeDispEvent.AfterDraw += new IGlobeDisplayEvents_AfterDrawEventHandler(globeDispEvent_AfterDraw); theForm.Show(); } protected override void OnUpdate() { Enabled = ArcGlobe.Application != null; } #region Custom Methods void globeDispEvent_AfterDraw(ISceneViewer pViewer) { double obsLat; double obsLon; double obsAlt; double tarLat; double tarLon; double tarAlt; globeCamera.GetObserverLatLonAlt(out obsLat, out obsLon, out obsAlt); globeCamera.GetTargetLatLonAlt(out tarLat, out tarLon, out tarAlt); //set the observer and target of the secondary viewer to be the same as main viewer if top-down view = false if (topDownView == false || globeCamera.OrientationMode == esriGlobeCameraOrientationMode.esriGlobeCameraOrientationGlobal) { viewerGlobeCamera.OrientationMode = globeCamera.OrientationMode; viewerGlobeCamera.SetObserverLatLonAlt(obsLat, obsLon, obsAlt); viewerGlobeCamera.SetTargetLatLonAlt(tarLat, tarLon, tarAlt); } //set the observer top down view for the secondary viewer else if (topDownView == true && globeCamera.OrientationMode == esriGlobeCameraOrientationMode.esriGlobeCameraOrientationLocal) { viewerGlobeCamera.OrientationMode = esriGlobeCameraOrientationMode.esriGlobeCameraOrientationLocal; tarLat = obsLat + 0.0000001; tarLon = obsLon + 0.0000001; viewerGlobeCamera.SetTargetLatLonAlt(tarLat, tarLon, tarAlt); } } void getListOfSecondaryViewers() { ESRI.ArcGIS.esriSystem.IArray viewers = globeDisplay.GetAllViewers(); if (viewers.Count < 2) return; for (int i = 0; i < viewers.Count; i++) { ESRI.ArcGIS.Analyst3D.ISceneViewer viewerElement = (ESRI.ArcGIS.Analyst3D.ISceneViewer)viewers.get_Element(i); if (viewerElement.Caption != "Globe view") { theForm.viewerListBox.Items.Add(viewerElement.Caption); } } } void normalButton_Click(object sender, EventArgs e) { topDownView = false; viewerCaption = theForm.viewerListBox.SelectedItem.ToString(); viewer = (ESRI.ArcGIS.Analyst3D.ISceneViewer)globeDisplay.FindViewer(viewerCaption); viewerGlobeCamera = (ESRI.ArcGIS.GlobeCore.IGlobeCamera)viewer.Camera; } void topDownButton_Click(object sender, EventArgs e) { topDownView = true; viewerCaption = theForm.viewerListBox.SelectedItem.ToString(); viewer = (ESRI.ArcGIS.Analyst3D.ISceneViewer)globeDisplay.FindViewer(viewerCaption); viewerGlobeCamera = (ESRI.ArcGIS.GlobeCore.IGlobeCamera)viewer.Camera; } void theForm_FormClosing(object sender, FormClosingEventArgs e) { //unregister the ArcGlobe globe's display afterdraw event globeDispEvent.AfterDraw -= new IGlobeDisplayEvents_AfterDrawEventHandler(globeDispEvent_AfterDraw); } #endregion } }
[Visual Basic .NET]
MultipleGlobeViewers.vb
Imports Microsoft.VisualBasic Imports System Imports System.Collections.Generic Imports System.Text Imports System.IO Imports System.Windows.Forms Imports System.Drawing Imports System.Runtime.InteropServices Imports ESRI.ArcGIS.ADF.BaseClasses Imports ESRI.ArcGIS.ADF.CATIDs Imports ESRI.ArcGIS.GlobeCore Imports ESRI.ArcGIS.Analyst3D Imports ESRI.ArcGIS.Geometry Namespace MultipleGlobeViewers Public Class MultipleGlobeViewers Inherits ESRI.ArcGIS.Desktop.AddIns.Button #Region "Member Variables" Private globe As ESRI.ArcGIS.GlobeCore.IGlobe Private globeDisplay As ESRI.ArcGIS.GlobeCore.IGlobeDisplay Private globeCamera As ESRI.ArcGIS.GlobeCore.IGlobeCamera Private globeDispEvent As ESRI.ArcGIS.GlobeCore.IGlobeDisplayEvents_Event Private theForm As SecondaryViewerForm Private viewer As ESRI.ArcGIS.Analyst3D.ISceneViewer Private viewerGlobeCamera As ESRI.ArcGIS.GlobeCore.IGlobeCamera Private topDownView As Boolean = False Private viewerCaption As String = "" #End Region #Region "DLLImportFunction" <DllImport("gdi32.dll")> _ Shared Function DeleteObject(ByVal hObject As IntPtr) As Boolean End Function <DllImport("user32.dll")> _ Shared Function ShowWindow(ByVal hwnd As Integer, ByVal nCmdShow As Integer) As Integer End Function #End Region Public Sub New() globe = ArcGlobe.Globe globeDisplay = globe.GlobeDisplay globeCamera = CType(globeDisplay.ActiveViewer.Camera, ESRI.ArcGIS.GlobeCore.IGlobeCamera) globeDispEvent = CType(globeDisplay, ESRI.ArcGIS.GlobeCore.IGlobeDisplayEvents_Event) End Sub Protected Overrides Sub OnClick() theForm = New SecondaryViewerForm() 'register form's events AddHandler theForm.topDownButton.Click, AddressOf topDownButton_Click AddHandler theForm.normalButton.Click, AddressOf normalButton_Click AddHandler theForm.FormClosing, AddressOf theForm_FormClosing 'get viewer list getListOfSecondaryViewers() 'register the ArcGlobe globe's display afterdraw event AddHandler globeDispEvent.AfterDraw, AddressOf globeDispEvent_AfterDraw theForm.Show() End Sub Protected Overrides Sub OnUpdate() Enabled = ArcGlobe.Application IsNot Nothing End Sub #Region "Custom Methods" Private Sub globeDispEvent_AfterDraw(ByVal pViewer As ISceneViewer) Dim obsLat As Double Dim obsLon As Double Dim obsAlt As Double Dim tarLat As Double Dim tarLon As Double Dim tarAlt As Double globeCamera.GetObserverLatLonAlt(obsLat, obsLon, obsAlt) globeCamera.GetTargetLatLonAlt(tarLat, tarLon, tarAlt) 'set the observer and target of the secondary viewer to be the same as main viewer if top-down view = false If topDownView = False OrElse globeCamera.OrientationMode = esriGlobeCameraOrientationMode.esriGlobeCameraOrientationGlobal Then viewerGlobeCamera.OrientationMode = globeCamera.OrientationMode viewerGlobeCamera.SetObserverLatLonAlt(obsLat, obsLon, obsAlt) viewerGlobeCamera.SetTargetLatLonAlt(tarLat, tarLon, tarAlt) 'set the observer top down view for the secondary viewer ElseIf topDownView = True AndAlso globeCamera.OrientationMode = esriGlobeCameraOrientationMode.esriGlobeCameraOrientationLocal Then viewerGlobeCamera.OrientationMode = esriGlobeCameraOrientationMode.esriGlobeCameraOrientationLocal tarLat = obsLat + 0.0000001 tarLon = obsLon + 0.0000001 viewerGlobeCamera.SetTargetLatLonAlt(tarLat, tarLon, tarAlt) End If End Sub Private Sub getListOfSecondaryViewers() Dim viewers As ESRI.ArcGIS.esriSystem.IArray = globeDisplay.GetAllViewers() If viewers.Count < 2 Then Return End If For i As Integer = 0 To viewers.Count - 1 Dim viewerElement As ESRI.ArcGIS.Analyst3D.ISceneViewer = CType(viewers.Element(i), ESRI.ArcGIS.Analyst3D.ISceneViewer) If viewerElement.Caption <> "Globe view" Then theForm.viewerListBox.Items.Add(viewerElement.Caption) End If Next i End Sub Private Sub normalButton_Click(ByVal sender As Object, ByVal e As EventArgs) topDownView = False viewerCaption = theForm.viewerListBox.SelectedItem.ToString() viewer = CType(globeDisplay.FindViewer(viewerCaption), ESRI.ArcGIS.Analyst3D.ISceneViewer) viewerGlobeCamera = CType(viewer.Camera, ESRI.ArcGIS.GlobeCore.IGlobeCamera) End Sub Private Sub topDownButton_Click(ByVal sender As Object, ByVal e As EventArgs) topDownView = True viewerCaption = theForm.viewerListBox.SelectedItem.ToString() viewer = CType(globeDisplay.FindViewer(viewerCaption), ESRI.ArcGIS.Analyst3D.ISceneViewer) viewerGlobeCamera = CType(viewer.Camera, ESRI.ArcGIS.GlobeCore.IGlobeCamera) End Sub Private Sub theForm_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) 'unregister the ArcGlobe globe's display afterdraw event RemoveHandler globeDispEvent.AfterDraw, AddressOf globeDispEvent_AfterDraw End Sub #End Region End Class End Namespace