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