ArcObjects Library Reference  

ViperPinTool

About the ViperPin tool Sample

[C#]

ViperPinTool.cs

using ESRI.ArcGIS.ADF.BaseClasses;
using ESRI.ArcGIS.ADF.CATIDs;
using ESRI.ArcGIS.ArcMapUI;
using ESRI.ArcGIS.Editor;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Framework;
using ESRI.ArcGIS.Geometry;
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace ViperPin
{
  public sealed class ViperPinTool : BaseTool, IShapeConstructorTool, ISketchTool
  {
    #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;
    private IEditor3 m_editor;
    private IEditEvents_Event m_editEvents;
    private IEditEvents5_Event m_editEvents5;
    private IEditSketch3 m_edSketch;
    private IShapeConstructor m_csc;

    private ViperPinForm m_form;

    public ViperPinTool()
    {
      base.m_category = "Developer Samples"; //localizable text
      base.m_caption = "ViperPin"; //Text in construct tools window
      base.m_message = "populate parcel pin"; //localizable text 
      base.m_toolTip = "Viper PIN tool"; //localizable text 
      base.m_name = "DeveloperSamples_ViperPin"; //unique id, non-localizable (e.g. "MyCategory_ArcMapCommand")
      try
      {
        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 ISketchTool Members
    //pass to constructor
    public void AddPoint(IPoint point, bool Clone, bool allowUndo)
    {
      m_csc.AddPoint(point, Clone, allowUndo);
    }

    public IPoint Anchor
    {
      get { return m_csc.Anchor; }
    }

    public double AngleConstraint
    {
      get { return m_csc.AngleConstraint; }
      set { m_csc.AngleConstraint = value; }
    }

    public esriSketchConstraint Constraint
    {
      get { return m_csc.Constraint; }
      set { m_csc.Constraint = value; }
    }

    public double DistanceConstraint
    {
      get { return m_csc.DistanceConstraint; }
      set { m_csc.DistanceConstraint = value; }
    }

    public bool IsStreaming
    {
      get { return m_csc.IsStreaming; }
      set { m_csc.IsStreaming = value; }
    }

    public IPoint Location
    {
      get { return m_csc.Location; }
    }

    #endregion

    #region ITool Members
    //pass to constructor
    public override void OnMouseDown(int Button, int Shift, int X, int Y)
    {
      m_csc.OnMouseDown(Button, Shift, X, Y);
    }

    public override void OnMouseMove(int Button, int Shift, int X, int Y)
    {
      m_csc.OnMouseMove(Button, Shift, X, Y);
    }

    public override void OnMouseUp(int Button, int Shift, int X, int Y)
    {
      m_csc.OnMouseUp(Button, Shift, X, Y);
    }

    public override bool OnContextMenu(int X, int Y)
    {
      return m_csc.OnContextMenu(X, Y);
    }

    public override void OnKeyDown(int keyCode, int Shift)
    {
      m_csc.OnKeyDown(keyCode, Shift);
    }

    public override void OnKeyUp(int keyCode, int Shift)
    {
      m_csc.OnKeyUp(keyCode, Shift);
    }

    public override void Refresh(int hDC)
    {
      m_csc.Refresh(hDC);
    }

    public override int Cursor
    {
      get { return m_csc.Cursor; }
    }

    public override void OnDblClick()
    {
      if (Control.ModifierKeys == Keys.Shift)
      {
        ISketchOperation so = new SketchOperation();
        so.MenuString_2 = "Finish Sketch Part";
        so.Start(m_editor);
        m_edSketch.FinishSketchPart();
        so.Finish(null);
      }
      else
        m_edSketch.FinishSketch();
    }

    public override bool Deactivate()
    {
      //unsubscribe events
      m_editEvents.OnSketchModified -= m_editEvents_OnSketchModified;
      m_editEvents5.OnShapeConstructorChanged -= m_editEvents5_OnShapeConstructorChanged;
      m_editEvents.OnSketchFinished -= m_editEvents_OnSketchFinished;
      return base.Deactivate();
    }

    #endregion

    public override void OnCreate(object hook)
    {
      if (hook == null)
        return;
      m_application = hook as IApplication;

      //get the editor
      UID editorUid = new UID();
      editorUid.Value = "esriEditor.Editor";
      m_editor = m_application.FindExtensionByCLSID(editorUid) as IEditor3;
      m_editEvents = m_editor as IEditEvents_Event;
      m_editEvents5 = m_editor as IEditEvents5_Event;
    }

    public override bool Enabled
    {
      // Enable the tool if we are editing
      get { return (m_editor.EditState == esriEditState.esriStateEditing); }
    }

    public override void OnClick()
    {
      m_edSketch = m_editor as IEditSketch3;

      //Restrict to line constructors (for this tool)
      m_edSketch.GeometryType = esriGeometryType.esriGeometryPolyline;

      //Activate a constructor based on the current sketch geometry
      if (m_edSketch.GeometryType == esriGeometryType.esriGeometryPoint)
        m_csc = new PointConstructorClass();
      else
        m_csc = new StraightConstructorClass();
      m_csc.Initialize(m_editor);
      m_edSketch.ShapeConstructor = m_csc;
      m_csc.Activate();

      //set the current task to null
      m_editor.CurrentTask = null;

      //setup events
      m_editEvents.OnSketchModified += new IEditEvents_OnSketchModifiedEventHandler(m_editEvents_OnSketchModified);
      m_editEvents5.OnShapeConstructorChanged += new IEditEvents5_OnShapeConstructorChangedEventHandler(m_editEvents5_OnShapeConstructorChanged);
      m_editEvents.OnSketchFinished += new IEditEvents_OnSketchFinishedEventHandler(m_editEvents_OnSketchFinished);

      //Create form and pass initialization parameters
      m_form = new ViperPinForm(m_editor);

      base.OnClick();
    }

    void m_editEvents_OnSketchFinished()
    {
      //send a shift-tab to hide the construction toolbar
      //SendKeys.SendWait("+{TAB}");
      OnKeyDown(9,1);

      //Show the dialog modal
      m_form.ShowDialog();
    }

    private void m_editEvents_OnSketchModified()
    {
      m_csc.SketchModified();
    }

    private void m_editEvents5_OnShapeConstructorChanged()
    {
      //activate new constructor
      m_csc.Deactivate();
      m_csc = null;
      m_csc = m_edSketch.ShapeConstructor;
      m_csc.Activate();
    }
  }
}

[Visual Basic .NET]

ViperPinTool.vb

Imports Microsoft.VisualBasic
Imports ESRI.ArcGIS.ADF.BaseClasses
Imports ESRI.ArcGIS.ADF.CATIDs
Imports ESRI.ArcGIS.ArcMapUI
Imports ESRI.ArcGIS.Editor
Imports ESRI.ArcGIS.esriSystem
Imports ESRI.ArcGIS.Framework
Imports ESRI.ArcGIS.Geometry
Imports System
Imports System.Drawing
Imports System.Runtime.InteropServices
Imports System.Windows.Forms

Namespace ViperPin
  Public NotInheritable Class ViperPinTool
	  Inherits BaseTool
	  Implements IShapeConstructorTool, ISketchTool
	#Region "COM Registration Function(s)"
	<ComRegisterFunction(), ComVisible(False)> _
	Private Shared Sub RegisterFunction(ByVal registerType As Type)
	  ' Required for ArcGIS Component Category Registrar support
	  ArcGISCategoryRegistration(registerType)

	  '
	  ' TODO: Add any COM registration code here
	  '
	End Sub

	<ComUnregisterFunction(), ComVisible(False)> _
	Private Shared Sub UnregisterFunction(ByVal registerType As Type)
	  ' Required for ArcGIS Component Category Registrar support
	  ArcGISCategoryUnregistration(registerType)

	  '
	  ' TODO: Add any COM unregistration code here
	  '
	End Sub

	#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 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
	''' <summary>
	''' Required method for ArcGIS Component Category unregistration -
	''' Do not modify the contents of this method with the code editor.
	''' </summary>
	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
  Private m_editor As IEditor3
  Private m_editEvents As IEditEvents_Event
  Private m_editEvents5 As IEditEvents5_Event
  Private m_edSketch As IEditSketch3
  Private m_csc As IShapeConstructor

  Private m_form As ViperPinForm

  Public Sub New()
    MyBase.m_category = "Developer Samples" 'localizable text
    MyBase.m_caption = "ViperPin" 'Text in construct tools window
    MyBase.m_message = "populate parcel pin" 'localizable text
    MyBase.m_toolTip = "Viper PIN tool" 'localizable text      MyBase.m_name = "DeveloperSamples_ViperPin" 'unique id, non-localizable (e.g. "MyCategory_ArcMapCommand")
    Try
      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

#Region "ISketchTool Members"
  'pass to constructor
  Public Sub AddPoint(ByVal point As IPoint, ByVal Clone As Boolean, ByVal allowUndo As Boolean) Implements ISketchTool.AddPoint
    m_csc.AddPoint(point, Clone, allowUndo)
  End Sub

  Public ReadOnly Property Anchor() As IPoint Implements ISketchTool.Anchor
    Get
      Return m_csc.Anchor
    End Get
  End Property

  Public Property AngleConstraint() As Double Implements ISketchTool.AngleConstraint
    Get
      Return m_csc.AngleConstraint
    End Get
    Set(ByVal value As Double)
      m_csc.AngleConstraint = value
    End Set
  End Property

  Public Property Constraint() As esriSketchConstraint Implements ISketchTool.Constraint
    Get
      Return m_csc.Constraint
    End Get
    Set(ByVal value As esriSketchConstraint)
      m_csc.Constraint = value
    End Set
  End Property

  Public Property DistanceConstraint() As Double Implements ISketchTool.DistanceConstraint
    Get
      Return m_csc.DistanceConstraint
    End Get
    Set(ByVal value As Double)
      m_csc.DistanceConstraint = value
    End Set
  End Property

  Public Property IsStreaming() As Boolean Implements ISketchTool.IsStreaming
    Get
      Return m_csc.IsStreaming
    End Get
    Set(ByVal value As Boolean)
      m_csc.IsStreaming = value
    End Set
  End Property

  Public ReadOnly Property Location() As IPoint Implements ISketchTool.Location
    Get
      Return m_csc.Location
    End Get
  End Property

#End Region

#Region "ITool Members"
  'pass to constructor
  Public Overrides Sub OnMouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Integer, ByVal Y As Integer)
    m_csc.OnMouseDown(Button, Shift, X, Y)
  End Sub

  Public Overrides Sub OnMouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Integer, ByVal Y As Integer)
    m_csc.OnMouseMove(Button, Shift, X, Y)
  End Sub

  Public Overrides Sub OnMouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Integer, ByVal Y As Integer)
    m_csc.OnMouseUp(Button, Shift, X, Y)
  End Sub

  Public Overrides Function OnContextMenu(ByVal X As Integer, ByVal Y As Integer) As Boolean
    Return m_csc.OnContextMenu(X, Y)
  End Function

  Public Overrides Sub OnKeyDown(ByVal keyCode As Integer, ByVal Shift As Integer)
    m_csc.OnKeyDown(keyCode, Shift)
  End Sub

  Public Overrides Sub OnKeyUp(ByVal keyCode As Integer, ByVal Shift As Integer)
    m_csc.OnKeyUp(keyCode, Shift)
  End Sub

  Public Overrides Sub Refresh(ByVal hDC As Integer)
    m_csc.Refresh(hDC)
  End Sub

  Public Overrides ReadOnly Property Cursor() As Integer
    Get
      Return m_csc.Cursor
    End Get
  End Property

  Public Overrides Sub OnDblClick()
    If Control.ModifierKeys = Keys.Shift Then
        Dim so As ISketchOperation = New SketchOperation()
        so.MenuString_2 = "Finish Sketch Part"
        so.Start(m_editor)
        m_edSketch.FinishSketchPart()
        so.Finish(Nothing)
    Else
        m_edSketch.FinishSketch()
    End If
  End Sub

  Public Overrides Function Deactivate() As Boolean
    'unsubscribe events
    RemoveHandler m_editEvents.OnSketchModified, AddressOf m_editEvents_OnSketchModified
    RemoveHandler m_editEvents5.OnShapeConstructorChanged, AddressOf m_editEvents5_OnShapeConstructorChanged
    RemoveHandler m_editEvents.OnSketchFinished, AddressOf m_editEvents_OnSketchFinished
    Return MyBase.Deactivate()
  End Function

#End Region

    Public Overrides Sub OnCreate(ByVal hook As Object)
      If hook Is Nothing Then
        Return
      End If
      m_application = TryCast(hook, IApplication)

      'get the editor
      Dim editorUid As New UID()
      editorUid.Value = "esriEditor.Editor"
      m_editor = TryCast(m_application.FindExtensionByCLSID(editorUid), IEditor3)
      m_editEvents = TryCast(m_editor, IEditEvents_Event)
      m_editEvents5 = TryCast(m_editor, IEditEvents5_Event)
    End Sub
    Public Overrides ReadOnly Property Enabled() As Boolean
      Get
        'Enable the tool if we are editing
        Return m_editor.EditState = esriEditState.esriStateEditing
      End Get
    End Property

    Public Overrides Sub OnClick()
      m_edSketch = TryCast(m_editor, IEditSketch3)

      'Restrict to line constructors (for this tool)
      m_edSketch.GeometryType = esriGeometryType.esriGeometryPolyline

      'Activate a constructor based on the current sketch geometry
      If m_edSketch.GeometryType = esriGeometryType.esriGeometryPoint Then
        m_csc = New PointConstructorClass()
      Else
        m_csc = New StraightConstructorClass()
      End If
      m_csc.Initialize(m_editor)
      m_edSketch.ShapeConstructor = m_csc
      m_csc.Activate()

      'set the current task to null
      m_editor.CurrentTask = Nothing

      'setup events
      AddHandler m_editEvents.OnSketchModified, AddressOf m_editEvents_OnSketchModified
      AddHandler m_editEvents5.OnShapeConstructorChanged, AddressOf m_editEvents5_OnShapeConstructorChanged
      AddHandler m_editEvents.OnSketchFinished, AddressOf m_editEvents_OnSketchFinished

      'Create form and pass initialization parameters
      m_form = New ViperPinForm(m_editor)

      MyBase.OnClick()
    End Sub

    Private Sub m_editEvents_OnSketchFinished()
      'send a space to hide the construction toolbar
      SendKeys.SendWait(" ")

      'Show the dialog modal
      m_form.ShowDialog()
    End Sub

    Private Sub m_editEvents_OnSketchModified()
      m_csc.SketchModified()
    End Sub

    Private Sub m_editEvents5_OnShapeConstructorChanged()
      'activate new constructor
      m_csc.Deactivate()
      m_csc = Nothing
      m_csc = m_edSketch.ShapeConstructor
      m_csc.Activate()
    End Sub
  End Class
End Namespace