Navigating around the SceneControl
SceneNavigateAndBookmarks.vb
' Copyright 2012 ESRI
' 
' All rights reserved under the copyright laws of the United States
' and applicable international laws, treaties, and conventions.
' 
' You may freely redistribute and use this sample code, with or
' without modification, provided you include the original copyright
' notice and use restrictions.
' 
' See the use restrictions.
' 

Imports ESRI.ArcGIS.esriSystem
Imports ESRI.ArcGIS.SystemUI
Imports ESRI.ArcGIS.Analyst3D
Imports ESRI.ArcGIS
Public Class Form1
    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 Form1())
    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 txtNewBookmarkName As System.Windows.Forms.TextBox
    Public WithEvents cmdCaptureBookmark As System.Windows.Forms.Button
    Public WithEvents cmdBrowse As System.Windows.Forms.Button
    Public WithEvents txtFileName As System.Windows.Forms.TextBox
    Public WithEvents chkRotate As System.Windows.Forms.CheckBox
    Public WithEvents chkNavigate As System.Windows.Forms.CheckBox
    Public WithEvents lstBookmarks As System.Windows.Forms.ListBox
    Public WithEvents cmdLoad As System.Windows.Forms.Button
    Public WithEvents Label5 As System.Windows.Forms.Label
    Public WithEvents Line3 As System.Windows.Forms.Label
    Public WithEvents Line2 As System.Windows.Forms.Label
    Public WithEvents Line1 As System.Windows.Forms.Label
    Public WithEvents Label4 As System.Windows.Forms.Label
    Public WithEvents Label3 As System.Windows.Forms.Label
    Public WithEvents Label2 As System.Windows.Forms.Label
    Public WithEvents Label1 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 AxSceneControl1 As ESRI.ArcGIS.Controls.AxSceneControl
    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(Form1))
        Me.txtNewBookmarkName = New System.Windows.Forms.TextBox
        Me.cmdCaptureBookmark = New System.Windows.Forms.Button
        Me.cmdBrowse = New System.Windows.Forms.Button
        Me.txtFileName = New System.Windows.Forms.TextBox
        Me.chkRotate = New System.Windows.Forms.CheckBox
        Me.chkNavigate = New System.Windows.Forms.CheckBox
        Me.lstBookmarks = New System.Windows.Forms.ListBox
        Me.cmdLoad = New System.Windows.Forms.Button
        Me.Label5 = New System.Windows.Forms.Label
        Me.Line3 = New System.Windows.Forms.Label
        Me.Line2 = New System.Windows.Forms.Label
        Me.Line1 = New System.Windows.Forms.Label
        Me.Label4 = New System.Windows.Forms.Label
        Me.Label3 = New System.Windows.Forms.Label
        Me.Label2 = New System.Windows.Forms.Label
        Me.Label1 = New System.Windows.Forms.Label
        Me.OpenFileDialog1 = New System.Windows.Forms.OpenFileDialog
        Me.AxSceneControl1 = New ESRI.ArcGIS.Controls.AxSceneControl
        Me.AxLicenseControl1 = New ESRI.ArcGIS.Controls.AxLicenseControl
        CType(Me.AxSceneControl1, System.ComponentModel.ISupportInitialize).BeginInit()
        CType(Me.AxLicenseControl1, System.ComponentModel.ISupportInitialize).BeginInit()
        Me.SuspendLayout()
        '
        'txtNewBookmarkName
        '
        Me.txtNewBookmarkName.AcceptsReturn = True
        Me.txtNewBookmarkName.AutoSize = False
        Me.txtNewBookmarkName.BackColor = System.Drawing.SystemColors.Window
        Me.txtNewBookmarkName.Cursor = System.Windows.Forms.Cursors.IBeam
        Me.txtNewBookmarkName.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.txtNewBookmarkName.ForeColor = System.Drawing.SystemColors.WindowText
        Me.txtNewBookmarkName.Location = New System.Drawing.Point(152, 440)
        Me.txtNewBookmarkName.MaxLength = 0
        Me.txtNewBookmarkName.Name = "txtNewBookmarkName"
        Me.txtNewBookmarkName.RightToLeft = System.Windows.Forms.RightToLeft.No
        Me.txtNewBookmarkName.Size = New System.Drawing.Size(121, 27)
        Me.txtNewBookmarkName.TabIndex = 13
        Me.txtNewBookmarkName.Text = "New Bookmark"
        '
        'cmdCaptureBookmark
        '
        Me.cmdCaptureBookmark.BackColor = System.Drawing.SystemColors.Control
        Me.cmdCaptureBookmark.Cursor = System.Windows.Forms.Cursors.Default
        Me.cmdCaptureBookmark.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.cmdCaptureBookmark.ForeColor = System.Drawing.SystemColors.ControlText
        Me.cmdCaptureBookmark.Location = New System.Drawing.Point(8, 440)
        Me.cmdCaptureBookmark.Name = "cmdCaptureBookmark"
        Me.cmdCaptureBookmark.RightToLeft = System.Windows.Forms.RightToLeft.No
        Me.cmdCaptureBookmark.Size = New System.Drawing.Size(137, 25)
        Me.cmdCaptureBookmark.TabIndex = 12
        Me.cmdCaptureBookmark.Text = "Capture Bookmark"
        '
        'cmdBrowse
        '
        Me.cmdBrowse.BackColor = System.Drawing.SystemColors.Control
        Me.cmdBrowse.Cursor = System.Windows.Forms.Cursors.Default
        Me.cmdBrowse.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.cmdBrowse.ForeColor = System.Drawing.SystemColors.ControlText
        Me.cmdBrowse.Location = New System.Drawing.Point(528, 280)
        Me.cmdBrowse.Name = "cmdBrowse"
        Me.cmdBrowse.RightToLeft = System.Windows.Forms.RightToLeft.No
        Me.cmdBrowse.Size = New System.Drawing.Size(65, 25)
        Me.cmdBrowse.TabIndex = 7
        Me.cmdBrowse.Text = "Browse..."
        '
        'txtFileName
        '
        Me.txtFileName.AcceptsReturn = True
        Me.txtFileName.AutoSize = False
        Me.txtFileName.BackColor = System.Drawing.SystemColors.Window
        Me.txtFileName.Cursor = System.Windows.Forms.Cursors.IBeam
        Me.txtFileName.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.txtFileName.ForeColor = System.Drawing.SystemColors.WindowText
        Me.txtFileName.Location = New System.Drawing.Point(88, 280)
        Me.txtFileName.MaxLength = 0
        Me.txtFileName.Name = "txtFileName"
        Me.txtFileName.RightToLeft = System.Windows.Forms.RightToLeft.No
        Me.txtFileName.Size = New System.Drawing.Size(433, 25)
        Me.txtFileName.TabIndex = 6
        Me.txtFileName.Text = "Enter a path to a scene document to load into the SceneControl"
        '
        'chkRotate
        '
        Me.chkRotate.BackColor = System.Drawing.SystemColors.Control
        Me.chkRotate.Cursor = System.Windows.Forms.Cursors.Default
        Me.chkRotate.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.chkRotate.ForeColor = System.Drawing.SystemColors.ControlText
        Me.chkRotate.Location = New System.Drawing.Point(304, 416)
        Me.chkRotate.Name = "chkRotate"
        Me.chkRotate.RightToLeft = System.Windows.Forms.RightToLeft.No
        Me.chkRotate.Size = New System.Drawing.Size(121, 25)
        Me.chkRotate.TabIndex = 4
        Me.chkRotate.Text = "Rotate Gesture"
        '
        'chkNavigate
        '
        Me.chkNavigate.BackColor = System.Drawing.SystemColors.Control
        Me.chkNavigate.Cursor = System.Windows.Forms.Cursors.Default
        Me.chkNavigate.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.chkNavigate.ForeColor = System.Drawing.SystemColors.ControlText
        Me.chkNavigate.Location = New System.Drawing.Point(304, 336)
        Me.chkNavigate.Name = "chkNavigate"
        Me.chkNavigate.RightToLeft = System.Windows.Forms.RightToLeft.No
        Me.chkNavigate.Size = New System.Drawing.Size(113, 25)
        Me.chkNavigate.TabIndex = 3
        Me.chkNavigate.Text = "Navigate Mode"
        '
        'lstBookmarks
        '
        Me.lstBookmarks.BackColor = System.Drawing.SystemColors.Window
        Me.lstBookmarks.Cursor = System.Windows.Forms.Cursors.Default
        Me.lstBookmarks.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.lstBookmarks.ForeColor = System.Drawing.SystemColors.WindowText
        Me.lstBookmarks.ItemHeight = 14
        Me.lstBookmarks.Location = New System.Drawing.Point(8, 352)
        Me.lstBookmarks.Name = "lstBookmarks"
        Me.lstBookmarks.RightToLeft = System.Windows.Forms.RightToLeft.No
        Me.lstBookmarks.Size = New System.Drawing.Size(265, 74)
        Me.lstBookmarks.TabIndex = 2
        '
        '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(8, 280)
        Me.cmdLoad.Name = "cmdLoad"
        Me.cmdLoad.RightToLeft = System.Windows.Forms.RightToLeft.No
        Me.cmdLoad.Size = New System.Drawing.Size(73, 25)
        Me.cmdLoad.TabIndex = 1
        Me.cmdLoad.Text = "Load"
        '
        'Label5
        '
        Me.Label5.BackColor = System.Drawing.SystemColors.Control
        Me.Label5.Cursor = System.Windows.Forms.Cursors.Default
        Me.Label5.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.Label5.ForeColor = System.Drawing.SystemColors.ControlText
        Me.Label5.Location = New System.Drawing.Point(432, 400)
        Me.Label5.Name = "Label5"
        Me.Label5.RightToLeft = System.Windows.Forms.RightToLeft.No
        Me.Label5.Size = New System.Drawing.Size(169, 65)
        Me.Label5.TabIndex = 11
        Me.Label5.Text = "Hold down left mouse button, move mouse left (or right) and keep mouse moving whi" & _
        "le releasing the left button. Press ESC to stop rotation."
        '
        'Line3
        '
        Me.Line3.BackColor = System.Drawing.SystemColors.WindowText
        Me.Line3.Location = New System.Drawing.Point(8, 312)
        Me.Line3.Name = "Line3"
        Me.Line3.Size = New System.Drawing.Size(584, 1)
        Me.Line3.TabIndex = 14
        '
        'Line2
        '
        Me.Line2.BackColor = System.Drawing.SystemColors.WindowText
        Me.Line2.Location = New System.Drawing.Point(288, 392)
        Me.Line2.Name = "Line2"
        Me.Line2.Size = New System.Drawing.Size(304, 1)
        Me.Line2.TabIndex = 15
        '
        'Line1
        '
        Me.Line1.BackColor = System.Drawing.SystemColors.WindowText
        Me.Line1.Location = New System.Drawing.Point(288, 312)
        Me.Line1.Name = "Line1"
        Me.Line1.Size = New System.Drawing.Size(1, 152)
        Me.Line1.TabIndex = 16
        '
        'Label4
        '
        Me.Label4.BackColor = System.Drawing.SystemColors.Control
        Me.Label4.Cursor = System.Windows.Forms.Cursors.Default
        Me.Label4.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.Label4.ForeColor = System.Drawing.SystemColors.ControlText
        Me.Label4.Location = New System.Drawing.Point(432, 344)
        Me.Label4.Name = "Label4"
        Me.Label4.RightToLeft = System.Windows.Forms.RightToLeft.No
        Me.Label4.Size = New System.Drawing.Size(169, 17)
        Me.Label4.TabIndex = 10
        Me.Label4.Text = "Middle mouse to pan"
        '
        'Label3
        '
        Me.Label3.BackColor = System.Drawing.SystemColors.Control
        Me.Label3.Cursor = System.Windows.Forms.Cursors.Default
        Me.Label3.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.Label3.ForeColor = System.Drawing.SystemColors.ControlText
        Me.Label3.Location = New System.Drawing.Point(432, 360)
        Me.Label3.Name = "Label3"
        Me.Label3.RightToLeft = System.Windows.Forms.RightToLeft.No
        Me.Label3.Size = New System.Drawing.Size(169, 17)
        Me.Label3.TabIndex = 9
        Me.Label3.Text = "Right mouse to zoom in and out"
        '
        'Label2
        '
        Me.Label2.BackColor = System.Drawing.SystemColors.Control
        Me.Label2.Cursor = System.Windows.Forms.Cursors.Default
        Me.Label2.Font = New System.Drawing.Font("Arial", 8.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.Label2.ForeColor = System.Drawing.SystemColors.ControlText
        Me.Label2.Location = New System.Drawing.Point(432, 328)
        Me.Label2.Name = "Label2"
        Me.Label2.RightToLeft = System.Windows.Forms.RightToLeft.No
        Me.Label2.Size = New System.Drawing.Size(153, 17)
        Me.Label2.TabIndex = 8
        Me.Label2.Text = "Left mouse to rotate"
        '
        '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(8, 328)
        Me.Label1.Name = "Label1"
        Me.Label1.RightToLeft = System.Windows.Forms.RightToLeft.No
        Me.Label1.Size = New System.Drawing.Size(265, 17)
        Me.Label1.TabIndex = 5
        Me.Label1.Text = "Bookmarks: Click on name below"
        '
        'AxSceneControl1
        '
        Me.AxSceneControl1.Location = New System.Drawing.Point(8, 8)
        Me.AxSceneControl1.Name = "AxSceneControl1"
        Me.AxSceneControl1.OcxState = CType(resources.GetObject("AxSceneControl1.OcxState"), System.Windows.Forms.AxHost.State)
        Me.AxSceneControl1.Size = New System.Drawing.Size(592, 264)
        Me.AxSceneControl1.TabIndex = 17
        '
        'AxLicenseControl1
        '
        Me.AxLicenseControl1.Enabled = True
        Me.AxLicenseControl1.Location = New System.Drawing.Point(384, 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 = 18
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.BackColor = System.Drawing.SystemColors.Control
        Me.ClientSize = New System.Drawing.Size(606, 476)
        Me.Controls.Add(Me.AxLicenseControl1)
        Me.Controls.Add(Me.AxSceneControl1)
        Me.Controls.Add(Me.txtNewBookmarkName)
        Me.Controls.Add(Me.cmdCaptureBookmark)
        Me.Controls.Add(Me.cmdBrowse)
        Me.Controls.Add(Me.txtFileName)
        Me.Controls.Add(Me.chkRotate)
        Me.Controls.Add(Me.chkNavigate)
        Me.Controls.Add(Me.lstBookmarks)
        Me.Controls.Add(Me.cmdLoad)
        Me.Controls.Add(Me.Label5)
        Me.Controls.Add(Me.Line3)
        Me.Controls.Add(Me.Line2)
        Me.Controls.Add(Me.Line1)
        Me.Controls.Add(Me.Label4)
        Me.Controls.Add(Me.Label3)
        Me.Controls.Add(Me.Label2)
        Me.Controls.Add(Me.Label1)
        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, 30)
        Me.Name = "Form1"
        Me.RightToLeft = System.Windows.Forms.RightToLeft.No
        Me.Text = "Form1"
        CType(Me.AxSceneControl1, System.ComponentModel.ISupportInitialize).EndInit()
        CType(Me.AxLicenseControl1, System.ComponentModel.ISupportInitialize).EndInit()
        Me.ResumeLayout(False)

    End Sub
#End Region

    'Hold an array of the Scene Bookmarks
    Dim m_pBookmarks As IArray

    Private Sub cmdBrowse_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles cmdBrowse.Click

        OpenFileDialog1.Title = "Scene Documents"
        OpenFileDialog1.DefaultExt = ".sxd"
        OpenFileDialog1.Filter = "Scene Documents (*.sxd)|*.sxd|Scene Templates (*.sxt)|*.sxt"
        OpenFileDialog1.ShowDialog()
        txtFileName.Text = OpenFileDialog1.FileName

        'Try and load the filename
        cmdLoad_Click(cmdLoad, New System.EventArgs)

    End Sub

    Private Sub cmdCaptureBookmark_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles cmdCaptureBookmark.Click

        Dim pBookmark3d As IBookmark3D
        pBookmark3d = New Bookmark3DClass

        pBookmark3d.Name = txtNewBookmarkName.Text
        pBookmark3d.Capture(AxSceneControl1.Camera)
        Dim pBookmarks As ISceneBookmarks
        pBookmarks = AxSceneControl1.Scene
        pBookmarks.AddBookmark(pBookmark3d)

        UpdateBookmarks()

    End Sub

    Private Sub cmdLoad_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles cmdLoad.Click
        On Error GoTo errorHandler

        AxSceneControl1.LoadSxFile(txtFileName.Text)
        UpdateBookmarks()

        Exit Sub
errorHandler:
        MsgBox("Error occurred trying to load Scene Document: " & vbCrLf & Err.Description, MsgBoxStyle.Exclamation)
    End Sub

    Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load

        chkNavigate.CheckState = AxSceneControl1.Navigate

    End Sub

    Private Sub lstBookmarks_SelectedIndexChanged(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles lstBookmarks.SelectedIndexChanged

        'Get a bookmark corresponding to list and apply it to the SceneViewer
        Dim pBookmark As IBookmark3D
        pBookmark = m_pBookmarks.Element(lstBookmarks.SelectedIndex)

        'Switch to new bookmark location
        pBookmark.Apply(AxSceneControl1.SceneViewer, False, 0)

    End Sub

    Private Sub UpdateBookmarks()

        'Get bookmarks from Scene
        Dim pBookmarks As ISceneBookmarks
        pBookmarks = AxSceneControl1.Scene

        m_pBookmarks = Nothing
        m_pBookmarks = pBookmarks.Bookmarks
        lstBookmarks.Items.Clear()
        Dim haveBookmarks As Boolean
        haveBookmarks = False

        Dim pBookmark3d As IBookmark3D
        Dim i As Integer
        If (Not m_pBookmarks Is Nothing) Then
            'Add the bookmark names to the listbox in the same order as they are in the Scene Document
            For i = 0 To m_pBookmarks.Count - 1
                pBookmark3d = m_pBookmarks.Element(i)
                lstBookmarks.Items.Add(pBookmark3d.Name)
            Next
            haveBookmarks = m_pBookmarks.Count <> 0
            lstBookmarks.Enabled = True
        End If

        If (Not haveBookmarks) Then
            'No bookmarks available
            lstBookmarks.Items.Add("<No Bookmarks Available>")
            lstBookmarks.Enabled = False
        End If

    End Sub

    Private Sub chkNavigate_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles chkNavigate.Click

        'Enable navigation mode
        AxSceneControl1.Navigate = chkNavigate.CheckState

    End Sub

    Private Sub chkRotate_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles chkRotate.Click

        'Enable rotate gesture if checked
        AxSceneControl1.SceneViewer.GestureEnabled = chkRotate.CheckState

    End Sub

End Class