About the Custom reshape polyline edit task Sample
[C#]
ReshapePolylineEditTask.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.ADF.CATIDs;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.esriSystem;
namespace ReshapePolylineEditTask_CS
{
[Guid("89467aa7-76c1-4531-a160-e160e8d782f7")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("ReshapePolylineEditTask_CS.ReshapePolylineEditTask")]
public class ReshapePolylineEditTask : ESRI.ArcGIS.Controls.IEngineEditTask
{
#region Private Members
IEngineEditor m_engineEditor;
IEngineEditSketch m_editSketch;
IEngineEditLayers m_editLayer;
#endregion
#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);
EngineEditTasks.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);
EngineEditTasks.Unregister(regKey);
}
#endregion
#endregion
#region IEngineEditTask Implementations
public void Activate(ESRI.ArcGIS.Controls.IEngineEditor editor, ESRI.ArcGIS.Controls.IEngineEditTask oldTask)
{
if (editor == null)
return;
m_engineEditor = editor;
m_editSketch = m_engineEditor as IEngineEditSketch;
m_editSketch.GeometryType = esriGeometryType.esriGeometryPolyline;
m_editLayer = m_editSketch as IEngineEditLayers;
//Listen to engine editor events
((IEngineEditEvents_Event)m_editSketch).OnTargetLayerChanged += new IEngineEditEvents_OnTargetLayerChangedEventHandler(OnTargetLayerChanged);
((IEngineEditEvents_Event)m_editSketch).OnSelectionChanged += new IEngineEditEvents_OnSelectionChangedEventHandler(OnSelectionChanged);
((IEngineEditEvents_Event)m_editSketch).OnCurrentTaskChanged += new IEngineEditEvents_OnCurrentTaskChangedEventHandler(OnCurrentTaskChanged);
}
public void Deactivate()
{
m_editSketch.RefreshSketch();
//Stop listening to engine editor events.
((IEngineEditEvents_Event)m_editSketch).OnTargetLayerChanged -= OnTargetLayerChanged;
((IEngineEditEvents_Event)m_editSketch).OnSelectionChanged -= OnSelectionChanged;
((IEngineEditEvents_Event)m_editSketch).OnCurrentTaskChanged -= OnCurrentTaskChanged;
//Release object references.
m_engineEditor = null;
m_editSketch = null;
m_editLayer = null;
}
public string GroupName
{
get
{
//This property allows groups to be created/used in the EngineEditTaskToolControl treeview.
//If an empty string is supplied the task will be appear in an "Other Tasks" group.
//In this example the Reshape Polyline_CSharp task will appear in the existing Modify Tasks group.
return "Modify Tasks";
}
}
public string Name
{
get
{
return "Reshape Polyline_CSharp"; //unique edit task name
}
}
public void OnDeleteSketch()
{
}
public void OnFinishSketch()
{
//get reference to featurelayer being edited
IFeatureLayer featureLayer = m_editLayer.TargetLayer as IFeatureLayer;
//get reference to the sketch geometry
IGeometry reshapeGeom = m_editSketch.Geometry;
if (reshapeGeom.IsEmpty == false)
{
//get the currently selected feature
IFeatureSelection featureSelection = featureLayer as IFeatureSelection;
ISelectionSet selectionSet = featureSelection.SelectionSet;
ICursor cursor;
selectionSet.Search(null, true, out cursor);
IFeatureCursor featureCursor = cursor as IFeatureCursor;
//the PerformSketchToolEnabledChecks property has already checked that only 1 feature is selected
IFeature feature = featureCursor.NextFeature();
//Take a copy of geometry for the selected feature
IGeometry editShape = feature.ShapeCopy;
//create a path from the editsketch geometry
IPointCollection reshapePath = new PathClass();
reshapePath.AddPointCollection(reshapeGeom as IPointCollection);
//reshape the selected feature
IPolyline polyline = editShape as IPolyline;
polyline.Reshape(reshapePath as IPath);
#region Perform an edit operation to store the new geometry for selected feature
try
{
m_engineEditor.StartOperation();
feature.Shape = editShape;
feature.Store();
m_engineEditor.StopOperation("Reshape Feature");
}
catch (Exception ex)
{
m_engineEditor.AbortOperation();
System.Diagnostics.Trace.WriteLine(ex.Message, "Reshape Geometry Failed");
}
#endregion
}
//refresh the display
IActiveView activeView = m_engineEditor.Map as IActiveView;
activeView.PartialRefresh(esriViewDrawPhase.esriViewGeography, (object)featureLayer, activeView.Extent);
}
public string UniqueName
{
get
{
return "ReshapePolylineEditTask_Reshape Polyline_CSharp" ;
}
}
#endregion
#region Event Listeners
public void OnTargetLayerChanged()
{
PerformSketchToolEnabledChecks();
}
public void OnSelectionChanged()
{
PerformSketchToolEnabledChecks();
}
void OnCurrentTaskChanged()
{
if (m_engineEditor.CurrentTask.Name == "Reshape Polyline_CSharp")
{
PerformSketchToolEnabledChecks();
}
}
#endregion
#region private methods
private void PerformSketchToolEnabledChecks()
{
if (m_editLayer == null)
return;
//Only enable the sketch tool if there is a polyline target layer.
if (m_editLayer.TargetLayer.FeatureClass.ShapeType != esriGeometryType.esriGeometryPolyline)
{
m_editSketch.GeometryType = esriGeometryType.esriGeometryNull;
return;
}
//check that only one feature in the target layer is currently selected
IFeatureSelection featureSelection = m_editLayer.TargetLayer as IFeatureSelection;
ISelectionSet selectionSet = featureSelection.SelectionSet;
if (selectionSet.Count != 1)
{
m_editSketch.GeometryType = esriGeometryType.esriGeometryNull;
return;
}
m_editSketch.GeometryType = esriGeometryType.esriGeometryPolyline;
}
#endregion
}
}
[Visual Basic .NET]
ReshapePolylineEditTask.vb
Imports System.Runtime.InteropServices
Imports ESRI.ArcGIS.ADF.CATIDs
Imports ESRI.ArcGIS.Controls
Imports ESRI.ArcGIS.Geodatabase
Imports ESRI.ArcGIS.Geometry
Imports ESRI.ArcGIS.Carto
Imports ESRI.ArcGIS.esriSystem
<ComClass(ReshapePolylineEditTask.ClassId, ReshapePolylineEditTask.InterfaceId, ReshapePolylineEditTask.EventsId), _
ProgId("ReshapePolylineEditTask_VB.ReshapePolylineEditTask")> _
Public Class ReshapePolylineEditTask
Implements ESRI.ArcGIS.Controls.IEngineEditTask
#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)
End Sub
<ComUnregisterFunction(), ComVisibleAttribute(False)> _
Public Shared Sub UnregisterFunction(ByVal registerType As Type)
' Required for ArcGIS Component Category Registrar support
ArcGISCategoryUnregistration(registerType)
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)
EngineEditTasks.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)
EngineEditTasks.Unregister(regKey)
End Sub
#End Region
#End Region
#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 = "3ee19d65-bcb9-4823-995a-a2779d664332"
Public Const InterfaceId As String = "2f536850-a5b7-48b7-a3e6-337dd5d3d9ec"
Public Const EventsId As String = "c83dddf2-f231-4f7d-96b0-630d06e49f97"
#End Region
#Region "Private Members"
Private m_engineEditor As IEngineEditor
Private m_editSketch As IEngineEditSketch
Private m_editLayer As IEngineEditLayers
Private m_ActiveViewEventsAfterDraw As IActiveViewEvents_AfterDrawEventHandler
#End Region
' 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()
End Sub
Public Sub Activate(ByVal editor As ESRI.ArcGIS.Controls.IEngineEditor, ByVal oldTask As ESRI.ArcGIS.Controls.IEngineEditTask) Implements ESRI.ArcGIS.Controls.IEngineEditTask.Activate
If (editor Is Nothing) Then
Return
End If
m_engineEditor = editor
m_editSketch = TryCast(m_engineEditor, IEngineEditSketch)
m_editSketch.GeometryType = esriGeometryType.esriGeometryPolyline
m_editLayer = TryCast(m_editSketch, IEngineEditLayers)
'Listen to engine editor events
AddHandler (CType(m_engineEditor, IEngineEditEvents_Event)).OnTargetLayerChanged, AddressOf OnTargetLayerChanged
AddHandler (CType(m_engineEditor, IEngineEditEvents_Event)).OnSelectionChanged, AddressOf OnSelectionChanged
AddHandler (CType(m_engineEditor, IEngineEditEvents_Event)).OnCurrentTaskChanged, AddressOf OnCurrentTaskChanged
End Sub
Public Sub Deactivate() Implements ESRI.ArcGIS.Controls.IEngineEditTask.Deactivate
m_editSketch.RefreshSketch()
'Stop listening for engine editor events.
RemoveHandler (CType(m_engineEditor, IEngineEditEvents_Event)).OnTargetLayerChanged, AddressOf OnTargetLayerChanged
RemoveHandler (CType(m_engineEditor, IEngineEditEvents_Event)).OnSelectionChanged, AddressOf OnSelectionChanged
RemoveHandler (CType(m_engineEditor, IEngineEditEvents_Event)).OnCurrentTaskChanged, AddressOf OnCurrentTaskChanged
'Release object references.
m_engineEditor = Nothing
m_editSketch = Nothing
m_editLayer = Nothing
End Sub
Public ReadOnly Property GroupName() As String Implements ESRI.ArcGIS.Controls.IEngineEditTask.GroupName
Get
'This property allows groups to be created/used in the EngineEditTaskToolControl treeview.
'If an empty string is supplied the task will be appear in an "Other Tasks" group.
'In this example the Reshape Feature_VB task will appear in the existing Modify Tasks group.
Return "Modify Tasks"
End Get
End Property
Public ReadOnly Property Name() As String Implements ESRI.ArcGIS.Controls.IEngineEditTask.Name
Get
Return "Reshape Polyline_VB"
End Get
End Property
Public Sub OnDeleteSketch() Implements ESRI.ArcGIS.Controls.IEngineEditTask.OnDeleteSketch
End Sub
Public Sub OnFinishSketch() Implements ESRI.ArcGIS.Controls.IEngineEditTask.OnFinishSketch
'get reference to the FeatureLayer being edited
Dim featureLayer As IFeatureLayer = CType(m_editLayer.TargetLayer, IFeatureLayer)
'get reference to the sketch geometry
Dim reshapeGeom As IGeometry = m_editSketch.Geometry
If (reshapeGeom.IsEmpty = False) Then
'get the currently selected feature
Dim featureSelection As IFeatureSelection = featureLayer
Dim selectionSet As ISelectionSet = featureSelection.SelectionSet
Dim featureCursor As IFeatureCursor = Nothing
selectionSet.Search(Nothing, True, featureCursor)
'the enabled property has already checked that only 1 feature is selected
Dim feature As IFeature = featureCursor.NextFeature()
'Take a copy of geometry for the selected feature
Dim editShape As IGeometry = feature.ShapeCopy
'create a path from the editsketch geometry
Dim reshapePath As IPointCollection = New PathClass()
reshapePath.AddPointCollection(reshapeGeom)
'reshape the selected feature
Dim polyline As IPolyline = editShape
polyline.Reshape(reshapePath)
Try
m_engineEditor.StartOperation()
feature.Shape = editShape
feature.Store()
m_engineEditor.StopOperation("Reshape Feature")
Catch ex As Exception
m_engineEditor.AbortOperation()
System.Diagnostics.Trace.WriteLine(ex.Message, "Edit Reshape Feature Failed")
End Try
End If
'refresh the display
Dim activeView As IActiveView = CType(m_engineEditor.Map, IActiveView)
activeView.PartialRefresh(esriViewDrawPhase.esriViewGeography, featureLayer, activeView.Extent)
End Sub
Public ReadOnly Property UniqueName() As String Implements ESRI.ArcGIS.Controls.IEngineEditTask.UniqueName
Get
Return "ReshapePolylineEditTask_Reshape Polyline_VB"
End Get
End Property
#Region "Event Handlers"
Private Sub OnTargetLayerChanged()
PerformSketchToolEnabledChecks()
End Sub
Private Sub OnSelectionChanged()
PerformSketchToolEnabledChecks()
End Sub
Private Sub OnCurrentTaskChanged()
If (m_engineEditor.CurrentTask.Name = "Reshape Polyline_VB") Then
PerformSketchToolEnabledChecks()
End If
End Sub
#End Region
#Region "Private Methods"
Private Sub PerformSketchToolEnabledChecks()
If m_editLayer Is Nothing Then
Return
End If
'Only enable the sketch tool if there is a polyline target layer.
If m_editLayer.TargetLayer.FeatureClass.ShapeType <> esriGeometryType.esriGeometryPolyline Then
m_editSketch.GeometryType = esriGeometryType.esriGeometryNull
Return
End If
'check that only one feature in the target layer is currently selected
Dim featureSelection As IFeatureSelection = CType(m_editLayer.TargetLayer, IFeatureSelection)
Dim selectionSet As ISelectionSet = featureSelection.SelectionSet
If (selectionSet.Count <> 1) Then
m_editSketch.GeometryType = esriGeometryType.esriGeometryNull
Return
End If
m_editSketch.GeometryType = esriGeometryType.esriGeometryPolyline
End Sub
#End Region
End Class