About the Create a custom tool Sample
[C#]
DrawGraphicLine.cs
using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Carto; using System; using System.Drawing; using System.Runtime.InteropServices; using ESRI.ArcGIS.ADF.BaseClasses; using ESRI.ArcGIS.ADF.CATIDs; using ESRI.ArcGIS.Framework; using ESRI.ArcGIS.ArcMapUI; using System.Windows.Forms; namespace CustomTool { /// <summary> /// Summary description for DrawGraphicLine. /// </summary> [Guid("001c57ca-c292-459d-95a7-9984d78d0d93")] [ClassInterface(ClassInterfaceType.None)] [ProgId("CustomTool.DrawGraphicLine")] public sealed class DrawGraphicLine : BaseTool { #region COM Registration Function(s) [ComRegisterFunction()] [ComVisible(false)] static void RegisterFunction(Type registerType) { // Required for ArcGIS Component Category Registrar support ArcGISCategoryRegistration(registerType); // // TODO: Add any COM registration code here // } [ComUnregisterFunction()] [ComVisible(false)] static void UnregisterFunction(Type registerType) { // Required for ArcGIS Component Category Registrar support ArcGISCategoryUnregistration(registerType); // // TODO: Add any COM unregistration code here // } #region ArcGIS Component Category Registrar generated code /// <summary> /// Required method for ArcGIS Component Category registration - /// Do not modify the contents of this method with the code editor. /// </summary> private static void ArcGISCategoryRegistration(Type registerType) { string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID); MxCommands.Register(regKey); } /// <summary> /// Required method for ArcGIS Component Category unregistration - /// Do not modify the contents of this method with the code editor. /// </summary> private static void ArcGISCategoryUnregistration(Type registerType) { string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID); MxCommands.Unregister(regKey); } #endregion #endregion private IApplication m_application; public DrawGraphicLine() { // // TODO: Define values for the public properties // base.m_category = "Walkthroughs"; //localizable text base.m_caption = "Draw Graphic Line"; //localizable text base.m_message = ""; //localizable text base.m_toolTip = "Draws a graphic line in the map window of ArcMap."; //localizable text base.m_name = "CustomTool_DrawGraphicLine"; //unique id, non-localizable (e.g. "MyCategory_ArcMapTool") try { // // TODO: change resource name if necessary // string bitmapResourceName = GetType().Name + ".bmp"; base.m_bitmap = new Bitmap(GetType(), bitmapResourceName); base.m_cursor = new System.Windows.Forms.Cursor(GetType(), GetType().Name + ".cur"); } catch (Exception ex) { System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap"); } } #region Overriden Class Methods /// <summary> /// Occurs when this tool is created /// </summary> /// <param name="hook">Instance of the application</param> public override void OnCreate(object hook) { m_application = hook as IApplication; //Disable if it is not ArcMap if (hook is IMxApplication) base.m_enabled = true; else base.m_enabled = false; // TODO: Add other initialization code } /// <summary> /// Occurs when this tool is clicked /// </summary> public override void OnClick() { // TODO: Add DrawGraphicLine.OnClick implementation } public override void OnMouseDown(int Button, int Shift, int X, int Y) { //TODO: Add DrawGraphicLine_VB.OnMouseDown implementation //Get the active view from the application object (ie. hook) IActiveView activeView = GetActiveViewFromArcMap(m_application); //Get the polyline object from the users mouse clicks IPolyline polyline = GetPolylineFromMouseClicks(activeView); //Make a color to draw the polyline IRgbColor rgbColor = new RgbColorClass(); rgbColor.Red = 255; //Add the users drawn graphics as persistent on the map AddGraphicToMap(activeView.FocusMap, polyline, rgbColor, rgbColor); //Only redraw the portion of the active view that contains the graphics activeView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, null); } public override void OnMouseMove(int Button, int Shift, int X, int Y) { // TODO: Add DrawGraphicLine.OnMouseMove implementation } public override void OnMouseUp(int Button, int Shift, int X, int Y) { // TODO: Add DrawGraphicLine.OnMouseUp implementation } #endregion //#### ArcGIS Snippets #### #region "Get ActiveView from ArcMap" ///<summary>Get ActiveView from ArcMap</summary> /// ///<param name="application">An IApplication interface that is the ArcMap application.</param> /// ///<returns>An IActiveView interface.</returns> /// ///<remarks></remarks> public IActiveView GetActiveViewFromArcMap(IApplication application) { if (application == null) { return null; } IMxDocument mxDocument = application.Document as IMxDocument; // Dynamic Cast IActiveView activeView = mxDocument.ActiveView; return activeView; } #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 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 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 #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 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 } }
[Visual Basic .NET]
DrawGraphicLine.vb
Imports ESRI.ArcGIS.Geometry Imports ESRI.ArcGIS.Display Imports ESRI.ArcGIS.esriSystem Imports ESRI.ArcGIS.Carto Imports System.Runtime.InteropServices Imports System.Drawing Imports ESRI.ArcGIS.ADF.BaseClasses Imports ESRI.ArcGIS.ADF.CATIDs Imports ESRI.ArcGIS.Framework Imports ESRI.ArcGIS.ArcMapUI Imports System.Windows.Forms <ComClass(DrawGraphicLine.ClassId, DrawGraphicLine.InterfaceId, DrawGraphicLine.EventsId), _ ProgId("CustomTool.DrawGraphicLine")> _ Public NotInheritable Class DrawGraphicLine Inherits BaseTool #Region "COM GUIDs" ' These GUIDs provide the COM identity for this class ' and its COM interfaces. If you change them, existing ' clients will no longer be able to access the class. Public Const ClassId As String = "001c57ca-c292-459d-95a7-9984d78d0d93" Public Const InterfaceId As String = "8704b76e-9dcd-4222-979b-60bcb7831ff8" Public Const EventsId As String = "1ea60cb7-6138-4658-ba05-77c8b3283599" #End Region #Region "COM Registration Function(s)" <ComRegisterFunction(), ComVisibleAttribute(False)> _ Public Shared Sub RegisterFunction(ByVal registerType As Type) ' Required for ArcGIS Component Category Registrar support ArcGISCategoryRegistration(registerType) 'Add any COM registration code after the ArcGISCategoryRegistration() call End Sub <ComUnregisterFunction(), ComVisibleAttribute(False)> _ Public Shared Sub UnregisterFunction(ByVal registerType As Type) ' Required for ArcGIS Component Category Registrar support ArcGISCategoryUnregistration(registerType) 'Add any COM unregistration code after the ArcGISCategoryUnregistration() call End Sub #Region "ArcGIS Component Category Registrar generated code" Private Shared Sub ArcGISCategoryRegistration(ByVal registerType As Type) Dim regKey As String = String.Format("HKEY_CLASSES_ROOT\CLSID\{{{0}}}", registerType.GUID) MxCommands.Register(regKey) End Sub Private Shared Sub ArcGISCategoryUnregistration(ByVal registerType As Type) Dim regKey As String = String.Format("HKEY_CLASSES_ROOT\CLSID\{{{0}}}", registerType.GUID) MxCommands.Unregister(regKey) End Sub #End Region #End Region Private m_application As IApplication ' A creatable COM class must have a Public Sub New() ' with no parameters, otherwise, the class will not be ' registered in the COM registry and cannot be created ' via CreateObject. Public Sub New() MyBase.New() ' TODO: Define values for the public properties ' TODO: Define values for the public properties MyBase.m_category = "Walkthroughs" 'localizable text MyBase.m_caption = "Draw Graphic Line" 'localizable text MyBase.m_message = "" 'localizable text MyBase.m_toolTip = "Draws a graphic line in the map window of ArcMap." 'localizable text MyBase.m_name = "CustomTool_DrawGraphicLine" 'unique id, non-localizable (e.g. "MyCategory_ArcMapTool") Try 'TODO: change resource name if necessary Dim bitmapResourceName As String = Me.GetType().Name + ".bmp" MyBase.m_bitmap = New Bitmap(Me.GetType(), bitmapResourceName) MyBase.m_cursor = New System.Windows.Forms.Cursor(Me.GetType(), Me.GetType().Name + ".cur") Catch ex As Exception System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap") End Try End Sub Public Overrides Sub OnCreate(ByVal hook As Object) If Not hook Is Nothing Then m_application = CType(hook, IApplication) 'Disable if it is not ArcMap If TypeOf hook Is IMxApplication Then MyBase.m_enabled = True Else MyBase.m_enabled = False End If End If ' TODO: Add other initialization code End Sub Public Overrides Sub OnClick() 'TODO: Add DrawGraphicLine.OnClick implementation End Sub Public Overrides Sub OnMouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Integer, ByVal Y As Integer) 'TODO: Add DrawGraphicLine.OnMouseDown implementation 'Get the active view from the application object (ie. hook) Dim activeView As IActiveView = GetActiveViewFromArcMap(m_application) 'Get the polyline object from the users mouse clicks Dim polyline As IPolyline = GetPolylineFromMouseClicks(activeView) 'Make a color to draw the polyline Dim rgbColor As IRgbColor = New ESRI.ArcGIS.Display.RgbColor() rgbColor.Red = 255 'Add the users drawn graphics as persistent on the map AddGraphicToMap(activeView.FocusMap, polyline, rgbColor, rgbColor) 'Only redraw the portion of the active view that contains the graphics activeView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, Nothing, Nothing) End Sub Public Overrides Sub OnMouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Integer, ByVal Y As Integer) 'TODO: Add DrawGraphicLine.OnMouseMove implementation End Sub Public Overrides Sub OnMouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Integer, ByVal Y As Integer) 'TODO: Add DrawGraphicLine.OnMouseUp implementation End Sub '#### ArcGIS Snippets #### #Region "Get ActiveView from ArcMap" '''<summary>Get ActiveView from ArcMap</summary> ''' '''<param name="application">An IApplication interface that is the ArcMap application.</param> ''' '''<returns>An IActiveView interface.</returns> ''' '''<remarks></remarks> Public Function GetActiveViewFromArcMap(ByVal application As IApplication) As IActiveView If application Is Nothing Then Return Nothing End If Dim mxDocument As IMxDocument = TryCast(application.Document, IMxDocument) ' Dynamic Cast Dim activeView As IActiveView = mxDocument.ActiveView Return activeView End Function #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 #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></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) = 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 = esriSimpleMarkerStyle.esriSMSCircle Dim markerElement As IMarkerElement = New MarkerElementClass() markerElement.Symbol = simpleMarkerSymbol element = CType(markerElement, IElement) ' Explicit Cast ElseIf (geometry.GeometryType) = esriGeometryType.esriGeometryPolyline Then ' Line elements Dim simpleLineSymbol As ISimpleLineSymbol = New SimpleLineSymbolClass() simpleLineSymbol.Color = rgbColor simpleLineSymbol.Style = esriSimpleLineStyle.esriSLSSolid simpleLineSymbol.Width = 5 Dim lineElement As ILineElement = New LineElementClass() lineElement.Symbol = simpleLineSymbol element = CType(lineElement, IElement) ' Explicit Cast ElseIf (geometry.GeometryType) = esriGeometryType.esriGeometryPolygon Then ' Polygon elements Dim simpleFillSymbol As ISimpleFillSymbol = New SimpleFillSymbolClass() simpleFillSymbol.Color = rgbColor simpleFillSymbol.Style = 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 End Class