ArcObjects Library Reference  

AddGraphicsTool

About the Custom UI elements using add-ins Sample

[C#]

AddGraphicsTool.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using ESRI.ArcGIS.ArcMapUI;
using ESRI.ArcGIS.Framework;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geometry;

namespace CustomUIElements
{
  public class AddGraphicsTool : ESRI.ArcGIS.Desktop.AddIns.Tool
  {
    public AddGraphicsTool()
    {
    }

    protected override void OnUpdate()
    {
      Enabled = ArcMap.Application != null;
    }

    protected override void OnMouseDown(MouseEventArgs arg)
    {
      //Get the active view from the AecMap static class
      IActiveView activeView = ArcMap.Document.ActiveView;

      //if polyline object then get from the user's mouse clicks.
      IPolyline polyline = GetPolylineFromMouseClicks(activeView);

      //Make a color to draw the polyline. 
      IRgbColor rgbColor = new RgbColorClass();
      rgbColor.Red = 255;     

      //Add the user's drawn graphics as persistent on the map.
      AddGraphicToMap(activeView.FocusMap, polyline, rgbColor, rgbColor);

      //Best practice: Only redraw the portion of the active view that contains graphics. 
      activeView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null);
    }

    #region "Add Graphic to Map"

    ///<summary>Draw a specified graphic on the map using the supplied colors.</summary>
    ///      
    ///<param name="map">An IMap interface.</param>
    ///<param name="geometry">An IGeometry interface. It can be of the geometry type: esriGeometryPoint, esriGeometryPolyline, or esriGeometryPolygon.</param>
    ///<param name="rgbColor">An IRgbColor interface. The color to draw the geometry.</param>
    ///<param name="outlineRgbColor">An IRgbColor interface. For those geometry's with an outline it will be this color.</param>
    ///      
    ///<remarks>Calling this function will not automatically make the graphics appear in the map area. Refresh the map area after calling this function with Methods like IActiveView.Refresh or IActiveView.PartialRefresh.</remarks>
    public void AddGraphicToMap(IMap map, IGeometry geometry, IRgbColor rgbColor, IRgbColor outlineRgbColor)
    {
      IGraphicsContainer graphicsContainer = (IGraphicsContainer)map; // Explicit Cast
      IElement element = null;
      if ((geometry.GeometryType) == esriGeometryType.esriGeometryPoint)
      {
        // Marker symbols
        ISimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbolClass();
        simpleMarkerSymbol.Color = rgbColor;
        simpleMarkerSymbol.Outline = true;
        simpleMarkerSymbol.OutlineColor = outlineRgbColor;
        simpleMarkerSymbol.Size = 15;
        simpleMarkerSymbol.Style = esriSimpleMarkerStyle.esriSMSCircle;

        IMarkerElement markerElement = new MarkerElementClass();
        markerElement.Symbol = simpleMarkerSymbol;
        element = (IElement)markerElement; // Explicit Cast
      }
      else if ((geometry.GeometryType) == esriGeometryType.esriGeometryPolyline)
      {
        //  Line elements
        ISimpleLineSymbol simpleLineSymbol = new SimpleLineSymbolClass();
        simpleLineSymbol.Color = rgbColor;
        simpleLineSymbol.Style = esriSimpleLineStyle.esriSLSSolid;
        simpleLineSymbol.Width = 5;

        ILineElement lineElement = new LineElementClass();
        lineElement.Symbol = simpleLineSymbol;
        element = (IElement)lineElement; // Explicit Cast
      }
      else if ((geometry.GeometryType) == esriGeometryType.esriGeometryPolygon)
      {
        // Polygon elements
        ISimpleFillSymbol simpleFillSymbol = new SimpleFillSymbolClass();
        simpleFillSymbol.Color = rgbColor;
        simpleFillSymbol.Style = esriSimpleFillStyle.esriSFSForwardDiagonal;
        IFillShapeElement fillShapeElement = new PolygonElementClass();
        fillShapeElement.Symbol = simpleFillSymbol;
        element = (IElement)fillShapeElement; // Explicit Cast
      }
      if (!(element == null))
      {
        element.Geometry = geometry;
        graphicsContainer.AddElement(element, 0);
      }
    }
    #endregion



    #region "Get Polyline From Mouse Clicks"

    ///<summary>
    ///Create a polyline geometry object using the RubberBand.TrackNew method when a user click the mouse on the map control. 
    ///</summary>
    ///<param name="activeView">An ESRI.ArcGIS.Carto.IActiveView interface that will user will interact with to draw a polyline.</param>
    ///<returns>An ESRI.ArcGIS.Geometry.IPolyline interface that is the polyline the user drew</returns>
    ///<remarks>Double click the left mouse button to end tracking the polyline.</remarks>
    public IPolyline GetPolylineFromMouseClicks(IActiveView activeView)
    {

      IScreenDisplay screenDisplay = activeView.ScreenDisplay;

      IRubberBand rubberBand = new RubberLineClass();
      IGeometry geometry = rubberBand.TrackNew(screenDisplay, null);
      IPolyline polyline = (IPolyline)geometry;
      return polyline;

    }
    #endregion
  }

}

[Visual Basic .NET]

AddGraphicsTool.vb

Imports Microsoft.VisualBasic
Imports System
Imports System.Collections.Generic
Imports System.Text
Imports System.IO
Imports ESRI.ArcGIS.ArcMapUI
Imports ESRI.ArcGIS.Framework
Imports ESRI.ArcGIS.Geodatabase
Imports ESRI.ArcGIS.SystemUI
Imports ESRI.ArcGIS.Display
Imports ESRI.ArcGIS.Carto
Imports ESRI.ArcGIS.Geometry


Namespace CustomUIElements
  Public Class AddGraphicsTool
    Inherits ESRI.ArcGIS.Desktop.AddIns.Tool
    Public Sub New()
    End Sub

    Protected Overrides Sub OnUpdate()
      Enabled = My.ArcMap.Application IsNot Nothing
    End Sub

    Protected Overrides Sub OnActivate()
      MyBase.OnActivate()

    End Sub
    Protected Overrides Sub OnMouseDown(ByVal arg As ESRI.ArcGIS.Desktop.AddIns.Tool.MouseEventArgs)
      MyBase.OnMouseDown(arg)

      'Get the active view from the AecMap static class
      Dim activeView As IActiveView = My.ArcMap.Document.ActiveView

      'if polyline object then get from the user's mouse clicks.
      Dim polyline As IPolyline = GetPolylineFromMouseClicks(activeView)

      'Make a color to draw the polyline. 
      Dim rgbColor As IRgbColor = New RgbColor
      rgbColor.Red = 255

      'Add the user's drawn graphics as persistent on the map.
      AddGraphicToMap(activeView.FocusMap, polyline, rgbColor, rgbColor)

      'Best practice: Only redraw the portion of the active view that contains graphics. 
      activeView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, Nothing, Nothing)

    End Sub

#Region "Add Graphic to Map"

    '''<summary>Draw a specified graphic on the map using the supplied colors.</summary>
    '''      
    '''<param name="map">An IMap interface.</param>
    '''<param name="geometry">An IGeometry interface. It can be of the geometry type: esriGeometryPoint, esriGeometryPolyline, or esriGeometryPolygon.</param>
    '''<param name="rgbColor">An IRgbColor interface. The color to draw the geometry.</param>
    '''<param name="outlineRgbColor">An IRgbColor interface. For those geometry's with an outline it will be this color.</param>
    '''      
    '''<remarks>Calling this function will not automatically make the graphics appear in the map area. Refresh the map area after after calling this function with Methods like IActiveView.Refresh or IActiveView.PartialRefresh.</remarks>
    Public Sub AddGraphicToMap(ByVal map As IMap, ByVal geometry As IGeometry, ByVal rgbColor As IRgbColor, ByVal outlineRgbColor As IRgbColor)
      Dim graphicsContainer As IGraphicsContainer = CType(map, IGraphicsContainer) ' Explicit Cast
      Dim element As IElement = Nothing
      If (geometry.GeometryType) = ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint Then
        ' Marker symbols
        Dim simpleMarkerSymbol As ISimpleMarkerSymbol = New SimpleMarkerSymbolClass()
        simpleMarkerSymbol.Color = rgbColor
        simpleMarkerSymbol.Outline = True
        simpleMarkerSymbol.OutlineColor = outlineRgbColor
        simpleMarkerSymbol.Size = 15
        simpleMarkerSymbol.Style = ESRI.ArcGIS.Display.esriSimpleMarkerStyle.esriSMSCircle

        Dim markerElement As IMarkerElement = New MarkerElementClass()
        markerElement.Symbol = simpleMarkerSymbol
        element = CType(markerElement, IElement) ' Explicit Cast
      ElseIf (geometry.GeometryType) = ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline Then
        '  Line elements
        Dim simpleLineSymbol As ISimpleLineSymbol = New SimpleLineSymbolClass()
        simpleLineSymbol.Color = rgbColor
        simpleLineSymbol.Style = ESRI.ArcGIS.Display.esriSimpleLineStyle.esriSLSSolid
        simpleLineSymbol.Width = 5

        Dim lineElement As ILineElement = New LineElementClass()
        lineElement.Symbol = simpleLineSymbol
        element = CType(lineElement, IElement) ' Explicit Cast
      ElseIf (geometry.GeometryType) = ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon Then
        ' Polygon elements
        Dim simpleFillSymbol As ISimpleFillSymbol = New SimpleFillSymbolClass()
        simpleFillSymbol.Color = rgbColor
        simpleFillSymbol.Style = ESRI.ArcGIS.Display.esriSimpleFillStyle.esriSFSForwardDiagonal
        Dim fillShapeElement As IFillShapeElement = New PolygonElementClass()
        fillShapeElement.Symbol = simpleFillSymbol
        element = CType(fillShapeElement, IElement) ' Explicit Cast
      End If
      If Not (element Is Nothing) Then
        element.Geometry = geometry
        graphicsContainer.AddElement(element, 0)
      End If
    End Sub
#End Region

#Region "Get Polyline From Mouse Clicks"

    '''<summary>
    '''Create a polyline geometry object using the RubberBand.TrackNew method when a user click the mouse on the map control. 
    '''</summary>
    '''<param name="activeView">An ESRI.ArcGIS.Carto.IActiveView interface that will user will interace with to draw a polyline.</param>
    '''<returns>An ESRI.ArcGIS.Geometry.IPolyline interface that is the polyline the user drew</returns>
    '''<remarks>Double click the left mouse button to end tracking the polyline.</remarks>
    Public Function GetPolylineFromMouseClicks(ByVal activeView As IActiveView) As IPolyline

      Dim screenDisplay As IScreenDisplay = activeView.ScreenDisplay

      Dim rubberBand As IRubberBand = New RubberLineClass()
      Dim geometry As IGeometry = rubberBand.TrackNew(screenDisplay, Nothing)
      Dim polyline As IPolyline = CType(geometry, IPolyline)
      Return polyline

    End Function
#End Region

  End Class

End Namespace