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