ArcGIS Add graphics
ArcGIS_AddGraphics_VBNet\App_Code\TextTool.vb
' Copyright 2010 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 Microsoft.VisualBasic
Imports System
Public Class TextTool
    Implements ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.IMapServerCommandAction, ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.IMapServerToolAction
  #Region "IServerAction Members"

  Private Sub ServerAction(ByVal toolbarItemInfo As ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.ToolbarItemInfo) Implements ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.IServerAction.ServerAction
    ' Get a reference to the Web ADF Map control that's buddied to the toolbar containing the command
    Dim adfMap As ESRI.ArcGIS.ADF.Web.UI.WebControls.Map = CType(toolbarItemInfo.BuddyControls(0), ESRI.ArcGIS.ADF.Web.UI.WebControls.Map)

    ' Get an ArcGIS Server specific map functionality.  Note this code assumes the existence of an ArcGIS
    ' Server resource item with the name "MapResourceItem0"
    Dim agsMapFunctionality As ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapFunctionality = CType(adfMap.GetFunctionality("MapResourceItem0"), ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapFunctionality)

    ' Get the ArcGIS Server MapDescription for the resource
    Dim agsSoapMapDescription As ESRI.ArcGIS.ADF.ArcGISServer.MapDescription = agsMapFunctionality.MapDescription

    ' Create a Web ADF Point for the point on the map at screen coordinates (200, 200).  Note that this 
    ' code assumes the map control's dimensions are at least 200 x 200.
    Dim adfPoint As ESRI.ArcGIS.ADF.Web.Geometry.Point = ESRI.ArcGIS.ADF.Web.Geometry.Point.ToMapPoint(200, 200, adfMap.GetTransformationParams (ESRI.ArcGIS.ADF.Web.Geometry.TransformationDirection.ToMap))

    ' Convert the Web ADF point to its ArcGIS Server specific equivalent
    Dim agsSoapPoint As ESRI.ArcGIS.ADF.ArcGISServer.PointN = ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.Converter.FromAdfPoint(adfPoint)

    ' Create a blue ArcGIS Server data source specific color object
    Dim agsSoapRgbColor As ESRI.ArcGIS.ADF.ArcGISServer.RgbColor = New ESRI.ArcGIS.ADF.ArcGISServer.RgbColor()
    agsSoapRgbColor.Red = 0
    agsSoapRgbColor.Green = 0
    agsSoapRgbColor.Blue = 255

    ' Initialize an ArcGIS Server data source specific text symbol
    Dim agsSoapTextSymbol As ESRI.ArcGIS.ADF.ArcGISServer.TextSymbol = New ESRI.ArcGIS.ADF.ArcGISServer.TextSymbol()
    agsSoapTextSymbol.Color = agsSoapRgbColor
    agsSoapTextSymbol.Size = 10
    agsSoapTextSymbol.FontName = "Arial"

    ' Create an ArcGIS Server data source specific text element with the text symbol, input point, and the
    ' text "COMMAND"
    Dim agsSoapTextElement As ESRI.ArcGIS.ADF.ArcGISServer.TextElement = New ESRI.ArcGIS.ADF.ArcGISServer.TextElement()
    agsSoapTextElement.TextGeometry = agsSoapPoint
    agsSoapTextElement.Symbol = agsSoapTextSymbol
    agsSoapTextElement.Scale = True
    agsSoapTextElement.Text = "COMMAND"

    ' If the current resource does not have any custom graphics specified, initialize this property with
    ' a new array with just the newly created graphics element.  Otherwise, create a new array with both
    ' the current custom graphics and teh newly created element.
    If Not agsSoapMapDescription.CustomGraphics Is Nothing Then
      ' Create a new ArcGIS Server graphic element array with a size that is one bigger than the
      ' resource's current element array
      Dim elementCount As Integer = agsSoapMapDescription.CustomGraphics.Length
      Dim agsSoapGraphicElementArray As ESRI.ArcGIS.ADF.ArcGISServer.GraphicElement() = New ESRI.ArcGIS.ADF.ArcGISServer.GraphicElement(elementCount){}

      ' Copy the resource's current element graphic array to the new array
      agsSoapMapDescription.CustomGraphics.CopyTo(agsSoapGraphicElementArray, 0)

      ' Add the newly created text element to the array
      agsSoapGraphicElementArray(elementCount) = agsSoapTextElement

      ' Update the resource's element array with the new array
      agsSoapMapDescription.CustomGraphics = agsSoapGraphicElementArray
    Else
      ' Create a new ArcGIS Server graphic element array with only the newly created text element
      Dim agsSoapGraphicElement As ESRI.ArcGIS.ADF.ArcGISServer.GraphicElement() = New ESRI.ArcGIS.ADF.ArcGISServer.GraphicElement(0){}
      agsSoapGraphicElement(0) = agsSoapTextElement

      ' Update the resource's element array with the new array
      agsSoapMapDescription.CustomGraphics = agsSoapGraphicElement
    End If

    ' Refresh the resource so the new point is shown
    adfMap.RefreshResource(agsMapFunctionality.Resource.Name)
  End Sub

  #End Region

  #Region "IMapServerToolAction Members"

  Private Sub ServerAction(ByVal toolEventArgs As ESRI.ArcGIS.ADF.Web.UI.WebControls.ToolEventArgs) Implements ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.IMapServerToolAction.ServerAction
    ' Get a reference to the Map control on which the tool was executed
    Dim adfMap As ESRI.ArcGIS.ADF.Web.UI.WebControls.Map
    adfMap = CType(toolEventArgs.Control, ESRI.ArcGIS.ADF.Web.UI.WebControls.Map)

    ' Get the point clicked by the user
    Dim mapPointEventArgs As ESRI.ArcGIS.ADF.Web.UI.WebControls.MapPointEventArgs = CType(toolEventArgs, ESRI.ArcGIS.ADF.Web.UI.WebControls.MapPointEventArgs)
    Dim adfPoint As ESRI.ArcGIS.ADF.Web.Geometry.Point = mapPointEventArgs.MapPoint

    ' Convert the Web ADF input point to its ArcGIS Server specific equivalent
    Dim agsSoapPoint As ESRI.ArcGIS.ADF.ArcGISServer.PointN = ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.Converter.FromAdfPoint(adfPoint)

    ' Get an ArcGIS Server specific map functionality.  Note this code assumes the existence of an ArcGIS
    ' Server resource item with the name "MapResourceItem0"
    Dim agsMapFunctionality As ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapFunctionality = CType(adfMap.GetFunctionality("MapResourceItem0"), ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapFunctionality)

    ' Get the ArcGIS Server MapDescription for the resource
    Dim agsSoapMapDescription As ESRI.ArcGIS.ADF.ArcGISServer.MapDescription = agsMapFunctionality.MapDescription

    ' Create a red ArcGIS Server data source specific color object
    Dim agsSoapRgbColor As ESRI.ArcGIS.ADF.ArcGISServer.RgbColor = New ESRI.ArcGIS.ADF.ArcGISServer.RgbColor()
    agsSoapRgbColor.Red = 255
    agsSoapRgbColor.Green = 0
    agsSoapRgbColor.Blue = 0
    agsSoapRgbColor.AlphaValue = 255

    ' Initialize an ArcGIS Server data source specific text symbol
    Dim agsSoapTextSymbol As ESRI.ArcGIS.ADF.ArcGISServer.TextSymbol = New ESRI.ArcGIS.ADF.ArcGISServer.TextSymbol()
    agsSoapTextSymbol.Color = agsSoapRgbColor
    agsSoapTextSymbol.Size = 10
    agsSoapTextSymbol.FontName = "Tahoma"

    ' Create an ArcGIS Server data source specific text element with the text symbol, input point, and the
    ' text "TOOL"
    Dim agsSoapTextElement As ESRI.ArcGIS.ADF.ArcGISServer.TextElement = New ESRI.ArcGIS.ADF.ArcGISServer.TextElement()
    agsSoapTextElement.TextGeometry = agsSoapPoint
    agsSoapTextElement.Symbol = agsSoapTextSymbol
    agsSoapTextElement.Scale = True
    agsSoapTextElement.Text = "TOOL"

    ' If the current resource does not have any custom graphics specified, initialize this property with
    ' a new array with just the newly created graphics element.  Otherwise, create a new array with both
    ' the current custom graphics and teh newly created element.
    If Not agsSoapMapDescription.CustomGraphics Is Nothing Then
      ' Create a new ArcGIS Server graphic element array with a size that is one bigger than the
      ' resource's current element array
      Dim elementCount As Integer = agsSoapMapDescription.CustomGraphics.Length
      Dim agsSoapGraphicElementArray As ESRI.ArcGIS.ADF.ArcGISServer.GraphicElement() = New ESRI.ArcGIS.ADF.ArcGISServer.GraphicElement(elementCount){}

      ' Copy the resource's current element graphic array to the new array
      agsSoapMapDescription.CustomGraphics.CopyTo(agsSoapGraphicElementArray, 0)

      ' Add the newly created text element to the array
      agsSoapGraphicElementArray(elementCount) = agsSoapTextElement

      ' Update the resource's element array with the new array
      agsSoapMapDescription.CustomGraphics = agsSoapGraphicElementArray
    Else
      ' Create a new ArcGIS Server graphic element array with only the newly created text element
      Dim agsSoapGraphicElement As ESRI.ArcGIS.ADF.ArcGISServer.GraphicElement() = New ESRI.ArcGIS.ADF.ArcGISServer.GraphicElement(0){}
      agsSoapGraphicElement(0) = agsSoapTextElement

      ' Update the resource's element array with the new array
      agsSoapMapDescription.CustomGraphics = agsSoapGraphicElement
    End If

    ' Refresh the resource so the new point is shown
    adfMap.RefreshResource(agsMapFunctionality.Resource.Name)
  End Sub

  #End Region
End Class