About the Custom vertex editing commands Sample
[C#]
UsingOutOfBoxVertexCommands.cs
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Resources;
using System.Reflection;
using ESRI.ArcGIS.ADF.BaseClasses;
using ESRI.ArcGIS.ADF.CATIDs;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.SystemUI;
namespace VertexCommands_CS
{
/// <summary>
/// Contains 2 tools to insert or delete vertices.
/// Both make use the out-of-the-box ControlsCommands to do this
/// </summary>
[Guid("6583D8C5-7A4A-4efc-9FAA-2FCD4EAD5BC3")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("VertexCommands_CS.UsingOutOfBoxVertexCommands")]
public sealed class UsingOutOfBoxVertexCommands : BaseTool, ICommandSubType
{
#region COM Registration Function(s)
[ComRegisterFunction()]
[ComVisible(false)]
static void RegisterFunction(Type registerType)
{
// Required for ArcGIS Component Category Registrar support
ArcGISCategoryRegistration(registerType);
}
[ComUnregisterFunction()]
[ComVisible(false)]
static void UnregisterFunction(Type registerType)
{
// Required for ArcGIS Component Category Registrar support
ArcGISCategoryUnregistration(registerType);
}
#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);
ControlsCommands.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);
ControlsCommands.Unregister(regKey);
}
#endregion
#endregion
#region Private Members
private long m_lSubType;
private IHookHelper m_hookHelper = null;
private IEngineEditor m_engineEditor;
private IEngineEditLayers m_editLayer;
private System.Windows.Forms.Cursor m_InsertVertexCursor;
private System.Windows.Forms.Cursor m_DeleteVertexCursor;
#endregion
#region Class constructor
public UsingOutOfBoxVertexCommands()
{
#region load the cursors
try
{
m_InsertVertexCursor = new System.Windows.Forms.Cursor(GetType().Assembly.GetManifestResourceStream("VertexCommands_CS.InsertVertexCursor.cur"));
m_DeleteVertexCursor = new System.Windows.Forms.Cursor(GetType().Assembly.GetManifestResourceStream("VertexCommands_CS.DeleteVertexCursor.cur"));
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Cursor");
}
#endregion
}
#endregion
#region Overriden Class Methods
/// <summary>
/// Return the cursor to be used by the tool
/// </summary>
public override int Cursor
{
get
{
int iHandle = 0;
switch (m_lSubType)
{
case 1:
iHandle = m_InsertVertexCursor.Handle.ToInt32();
break;
case 2:
iHandle = m_DeleteVertexCursor.Handle.ToInt32();
break;
}
return (iHandle);
}
}
public override void OnClick()
{
//Find the Modify Feature task and set it as the current task
IEngineEditTask editTask = m_engineEditor.GetTaskByUniqueName("ControlToolsEditing_ModifyFeatureTask");
m_engineEditor.CurrentTask = editTask;
}
/// <summary>
/// Occurs when this tool is created
/// </summary>
/// <param name="hook">Instance of the application</param>
public override void OnCreate(object hook)
{
try
{
m_hookHelper = new HookHelperClass();
m_hookHelper.Hook = hook;
m_engineEditor = new EngineEditorClass(); //this class is a singleton
m_editLayer = m_engineEditor as IEngineEditLayers;
}
catch
{
m_hookHelper = null;
}
}
/// <summary>
/// Perform checks so that the tool is enabled appropriately
/// </summary>
public override bool Enabled
{
get
{
//check whether Editing
if (m_engineEditor.EditState == esriEngineEditState.esriEngineStateNotEditing)
{
return false;
}
//check for appropriate geometry types
esriGeometryType geomType = m_editLayer.TargetLayer.FeatureClass.ShapeType;
if ((geomType != esriGeometryType.esriGeometryPolygon) & (geomType != esriGeometryType.esriGeometryPolyline))
{
return false;
}
//check that only one feature is currently selected
IFeatureSelection featureSelection = m_editLayer.TargetLayer as IFeatureSelection;
ISelectionSet selectionSet = featureSelection.SelectionSet;
if (selectionSet.Count != 1)
{
return false;
}
return true;
}
}
/// <summary>
/// The mouse up performs the action appropriate for each sub-typed command:
/// insert vertex or delete vertex
/// </summary>
/// <param name="Button"></param>
/// <param name="Shift"></param>
/// <param name="X">The X screen coordinate of the clicked location</param>
/// <param name="Y">The Y screen coordinate of the clicked location</param>
public override void OnMouseUp(int Button, int Shift, int X, int Y)
{
try
{
//get layer being edited
IFeatureLayer featureLayer = m_editLayer.TargetLayer as IFeatureLayer;
//set the x,y location which will be used by the out-of-the-box commands
IEngineEditSketch editsketch = m_engineEditor as IEngineEditSketch;
editsketch.SetEditLocation(X, Y);
Type t = null;
object o = null;
switch (m_lSubType)
{
case 1: //Insert Vertex using out-of-the-box command
t = Type.GetTypeFromProgID("esriControls.ControlsEditingVertexInsertCommand.1");
o = Activator.CreateInstance(t);
ICommand insertVertexCommand = o as ICommand;
if (insertVertexCommand != null)
{
insertVertexCommand.OnCreate(m_hookHelper.Hook);
insertVertexCommand.OnClick();
}
break;
case 2: //Delete Vertex using out-of-the-box command
t = Type.GetTypeFromProgID("esriControls.ControlsEditingVertexDeleteCommand.1");
o = Activator.CreateInstance(t);
ICommand deleteVertexCommand = o as ICommand;
if (deleteVertexCommand != null)
{
deleteVertexCommand.OnCreate(m_hookHelper.Hook);
deleteVertexCommand.OnClick();
}
break;
}
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message, "Unexpected Error");
}
}
#endregion
#region ICommandSubType Interface
/// <summary>
/// Returns the number of subtyped commands
/// </summary>
/// <returns></returns>
public int GetCount()
{
return 2;
}
/// <summary>
/// Sets the sub-type
/// </summary>
/// <param name="SubType"></param>
public void SetSubType(int SubType)
{
m_lSubType = SubType;
ResourceManager rm = new ResourceManager("VertexCommands_CS.Resources", Assembly.GetExecutingAssembly());
//set a common Command category for all subtypes
base.m_category = "Vertex Cmds (C#)";
switch (m_lSubType)
{
case 1: //Insert Vertex using the out-of-the-box ControlsEditingSketchInsertPointCommand command
base.m_caption = (string)rm.GetString("OOBInsertVertex_CommandCaption");
base.m_message = (string)rm.GetString("OOBInsertVertex_CommandMessage");
base.m_toolTip = (string)rm.GetString("OOBInsertVertex_CommandToolTip");
base.m_name = "VertexCommands_UsingOutOfBoxInsertVertex";
base.m_cursor = m_InsertVertexCursor;
#region bitmap
try
{
base.m_bitmap = (System.Drawing.Bitmap)rm.GetObject("OOBInsertVertex");
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap");
}
#endregion
break;
case 2: //Delete vertex at clicked location using the out-of-the-box ControlsEditingSketchDeletePointCommand
base.m_caption = (string)rm.GetString("OOBDeleteVertex_CommandCaption");
base.m_message = (string)rm.GetString("OOBDeleteVertex_CommandMessage");
base.m_toolTip = (string)rm.GetString("OOBDeleteVertex_CommandToolTip");
base.m_name = "VertexCommands_UsingOutOfBoxDeleteVertex";
base.m_cursor = m_DeleteVertexCursor;
#region bitmap
try
{
base.m_bitmap = (System.Drawing.Bitmap)rm.GetObject("OOBDeleteVertex");
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap");
}
#endregion
break;
}
}
#endregion
}
}
[Visual Basic .NET]
UsingOutOfBoxVertexCommands.vb
Imports System.Runtime.InteropServices
Imports System.Drawing
Imports System.Windows.Forms
Imports System.Resources
Imports System.Reflection
Imports ESRI.ArcGIS.ADF.BaseClasses
Imports ESRI.ArcGIS.ADF.CATIDs
Imports ESRI.ArcGIS.Controls
Imports ESRI.ArcGIS.Carto
Imports ESRI.ArcGIS.Geometry
Imports ESRI.ArcGIS.Geodatabase
Imports ESRI.ArcGIS.SystemUI
Imports ESRI.ArcGIS.Display
<ComClass(UsingOutOfBoxVertexCommands.ClassId, UsingOutOfBoxVertexCommands.InterfaceId, UsingOutOfBoxVertexCommands.EventsId), _
ProgId("VertexCommands_VB.UsingOutOfBoxVertexCommands")> _
Public NotInheritable Class UsingOutOfBoxVertexCommands
Inherits BaseTool
Implements ICommandSubType
#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 = "E7083AC5-E3FD-41d4-AA83-E6CA65E5C5E0"
Public Const InterfaceId As String = "3913FFBF-EAF0-453e-89D5-104B072C6138"
Public Const EventsId As String = "4359BAD5-9645-4c60-A570-46E5084E24F9"
#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)
ControlsCommands.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)
ControlsCommands.Unregister(regKey)
End Sub
#End Region
#End Region
#Region "private members"
Private m_hookHelper As IHookHelper
Private m_engineEditor As IEngineEditor
Private m_editLayer As IEngineEditLayers
Private m_lSubType As Long
Private m_InsertVertexCursor As System.Windows.Forms.Cursor
Private m_DeleteVertexCursor As System.Windows.Forms.Cursor
#End Region
#Region "Constructor"
Public Sub New()
MyBase.New()
'load the cursors
Try
m_InsertVertexCursor = New System.Windows.Forms.Cursor(Me.GetType().Assembly.GetManifestResourceStream("VertexCommands_VB.InsertVertexCursor.cur"))
m_DeleteVertexCursor = New System.Windows.Forms.Cursor(Me.GetType().Assembly.GetManifestResourceStream("VertexCommands_VB.DeleteVertexCursor.cur"))
Catch ex As Exception
System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Cursor")
End Try
End Sub
#End Region
#Region "class overrides"
Public Overrides Sub OnClick()
'Find the Modify Feature task and set it as the current task
Dim editTask As IEngineEditTask = m_engineEditor.GetTaskByUniqueName("ControlToolsEditing_ModifyFeatureTask")
m_engineEditor.CurrentTask = editTask
End Sub
Public Overrides Sub OnCreate(ByVal hook As Object)
If (m_hookHelper Is Nothing) Then m_hookHelper = New HookHelperClass
If Not hook Is Nothing Then
m_hookHelper.Hook = hook
m_engineEditor = New EngineEditorClass() 'this class is a singleton
m_editLayer = CType(m_engineEditor, IEngineEditLayers)
End If
End Sub
Public Overrides ReadOnly Property Enabled() As Boolean
Get
'check whether Editing
If (m_engineEditor.EditState = esriEngineEditState.esriEngineStateNotEditing) Then
Return False
End If
'check for appropriate geometry types
Dim geomType As esriGeometryType = m_editLayer.TargetLayer.FeatureClass.ShapeType
If Not (geomType = esriGeometryType.esriGeometryPolyline Or geomType = esriGeometryType.esriGeometryPolygon) Then
Return False
End If
'check that only one feature is currently selected
Dim featureSelection As IFeatureSelection = CType(m_editLayer.TargetLayer, IFeatureSelection)
Dim selectionSet As ISelectionSet = featureSelection.SelectionSet
If selectionSet.Count <> 1 Then
Return False
End If
Return True
End Get
End Property
Public Overrides Sub OnMouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Integer, ByVal Y As Integer)
Try
'set the x,y location which will be used by the out-of-the-box commands
Dim editsketch As IEngineEditSketch = m_engineEditor
editsketch.SetEditLocation(X, Y)
Dim t As Type = Nothing
Dim o As Object = Nothing
Select Case (m_lSubType)
Case 1 'Insert Vertex using out-of-the-box command
t = Type.GetTypeFromProgID("esriControls.ControlsEditingVertexInsertCommand.1")
o = Activator.CreateInstance(t)
Dim insertVertexCommand As ICommand = o
If Not insertVertexCommand Is Nothing Then
insertVertexCommand.OnCreate(m_hookHelper.Hook)
insertVertexCommand.OnClick()
End If
Case 2 'Delete Vertex using out-of-the-box command
t = Type.GetTypeFromProgID("esriControls.ControlsEditingVertexDeleteCommand.1")
o = Activator.CreateInstance(t)
Dim deleteVertexCommand As ICommand = o
If Not deleteVertexCommand Is Nothing Then
deleteVertexCommand.OnCreate(m_hookHelper.Hook)
deleteVertexCommand.OnClick()
End If
End Select
Catch ex As Exception
System.Diagnostics.Trace.WriteLine(ex.Message, "Unexpected Error")
End Try
End Sub
#End Region
#Region "ICommandSubType implementation"
Public Function GetCount() As Integer Implements ESRI.ArcGIS.SystemUI.ICommandSubType.GetCount
Try
Return 2
Catch ex As Exception
System.Diagnostics.Debug.WriteLine(ex.Message())
End Try
End Function
Public Sub SetSubType(ByVal SubType As Integer) Implements ESRI.ArcGIS.SystemUI.ICommandSubType.SetSubType
Try
m_lSubType = SubType
'set a common Command category for all subtypes
MyBase.m_category = "Vertex Cmds (VB)"
Dim rm As ResourceManager = New ResourceManager("VertexCommands_VB.ResourceFile", Assembly.GetExecutingAssembly())
Select Case (m_lSubType)
Case 1 'Insert Vertex
MyBase.m_caption = rm.GetString("OOBInsertVertex_CommandCaption")
MyBase.m_message = rm.GetString("OOBInsertVertex_CommandMessage")
MyBase.m_toolTip = rm.GetString("OOBInsertVertex_CommandToolTip")
MyBase.m_name = "VertexCommands_VB_UsingOutOfBoxInsertVertex"
MyBase.m_cursor = m_InsertVertexCursor
Try
MyBase.m_bitmap = rm.GetObject("OOBInsertVertex")
Catch ex As Exception
System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap")
End Try
Case 2 'Delete vertex
MyBase.m_caption = rm.GetString("OOBDeleteVertex_CommandCaption")
MyBase.m_message = rm.GetString("OOBDeleteVertex_CommandMessage")
MyBase.m_toolTip = rm.GetString("OOBDeleteVertex_CommandToolTip")
MyBase.m_name = "VertexCommands_VB_UsingOutOfBoxDeleteVertex"
MyBase.m_cursor = m_DeleteVertexCursor
Try
MyBase.m_bitmap = rm.GetObject("OOBDeleteVertex")
Catch ex As Exception
System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap")
End Try
End Select
Catch ex As Exception
System.Diagnostics.Debug.WriteLine(ex.Message())
End Try
End Sub
#End Region
End Class