About the Managing snap agents Sample
[C#]
SnapEditorForm.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.ADF.CATIDs;
namespace Core
{
public partial class SnapEditor : Form
{
IEngineEditor editor;
IEngineEditLayers editLayers;
IEngineSnapEnvironment snapEnvironment;
public SnapEditor()
{
InitializeComponent();
//get the snapEnvironment
editor = new EngineEditorClass();
editLayers = editor as IEngineEditLayers;
snapEnvironment = editor as IEngineSnapEnvironment;
//Update this form with the snap environment and snap tips
//Note: from here on we expect all snap changes to be made via this form, so it is not updated after direct changes to the snapping
//environment or the Arc Engine Snap Window.
RefreshDisplay();
}
/// <summary>
/// Update the window with the current snap environment and snap tip settings
/// </summary>
private void RefreshDisplay()
{
snapTolerance.Text = snapEnvironment.SnapTolerance.ToString();
snapTolUnits.SelectedIndex = (int)snapEnvironment.SnapToleranceUnits;
snapTips.Checked = ((IEngineEditProperties2)editor).SnapTips;
//remove all feature snap agents from the data grid view
snapAgents.Rows.Clear();
//display feature snap and snap agents that are active
for (int i = 0; i < snapEnvironment.SnapAgentCount; i++)
{
try
{
IEngineSnapAgent snapAgent = snapEnvironment.get_SnapAgent(i);
IEngineFeatureSnapAgent ftrSnapAgent = snapAgent as IEngineFeatureSnapAgent;
if (ftrSnapAgent != null)
{
//for feature snap agents add a row to the data view grid
esriGeometryHitPartType hitType = ftrSnapAgent.HitType;
bool vertex, edge, end;
vertex = (hitType & esriGeometryHitPartType.esriGeometryPartVertex) == esriGeometryHitPartType.esriGeometryPartVertex;
edge = (hitType & esriGeometryHitPartType.esriGeometryPartBoundary) == esriGeometryHitPartType.esriGeometryPartBoundary;
end = (hitType & esriGeometryHitPartType.esriGeometryPartEndpoint) == esriGeometryHitPartType.esriGeometryPartEndpoint;
string vertexString = vertex ? "vertex" : " ";
string edgeString = edge ? " edge" : " ";
string endString = end ? " end " : " ";
string hitTypes = vertexString + edgeString + endString;
object[] rowData = { snapAgent.Name.ToString(), ftrSnapAgent.FeatureClass.AliasName, hitTypes };
snapAgents.Rows.Add(rowData);
}
else
{
//add the active edit sketch snap agents
object[] rowData = { snapAgent.Name.ToString(), "<not applicable>", "<not applicable>" };
snapAgents.Rows.Add(rowData);
}
}
catch (Exception)
{
}
}
}
#region Button Handlers
private void clearAgents_Click(object sender, EventArgs e)
{
snapEnvironment.ClearSnapAgents();
//refresh this window
RefreshDisplay();
}
/// <summary>
/// Turns off feature snap agents and turns off edit sketch snap agents by removing them
/// </summary>
/// <remarks>
/// Using Clear or Remove feature snap agents can be deactivated so that the user can't enable them.
/// Here we simply turn off all the agents, which will allow the user to turn them on.
/// </remarks>
private void turnOffAgents_Click(object sender, EventArgs e)
{
TurnOffAgents();
}
private void reverseAgentsPriority_Click(object sender, EventArgs e)
{
//get all the snap agents in reverse order and then deactivate them
ArrayList snapAgentList = new ArrayList();
for (int i = snapEnvironment.SnapAgentCount - 1; i >= 0; i--)
{
IEngineSnapAgent tmpAgent = snapEnvironment.get_SnapAgent(i);
snapAgentList.Add(tmpAgent);
snapEnvironment.RemoveSnapAgent(i);
}
//add the agents back to the environment
foreach (IEngineSnapAgent agent in snapAgentList)
{
snapEnvironment.AddSnapAgent(agent);
}
//refresh this window
RefreshDisplay();
}
/// <summary>
/// Adds a feature snap agent for the target layer and turn on all options.
/// </summary>
/// <remarks>
/// This method does not check if there already exists a feature snap agent for the
/// target layer. It is recommended that you do so since duplicate agents can appear
/// on the Snap Settings Form
/// </remarks>
private void addFeatureSnapAgent_Click(object sender, EventArgs e)
{
IEngineFeatureSnapAgent featureSnapAgent = new EngineFeatureSnap();
if (editLayers.TargetLayer == null)
{
System.Windows.Forms.MessageBox.Show("Please start an edit session");
return;
}
featureSnapAgent.FeatureClass = editLayers.TargetLayer.FeatureClass; ;
featureSnapAgent.HitType = esriGeometryHitPartType.esriGeometryPartVertex | esriGeometryHitPartType.esriGeometryPartBoundary | esriGeometryHitPartType.esriGeometryPartEndpoint;
snapEnvironment.AddSnapAgent(featureSnapAgent);
//refresh this window
RefreshDisplay();
}
/// <summary>
/// Adds, and hence turns on, Edit Sketch snap agents
/// </summary>
private void addSketchSnapAgent_Click(object sender, EventArgs e)
{
AddSketchSnapAgents();
RefreshDisplay();
}
#endregion
#region Snap Tips and Tolerance Handlers
private void snapTips_CheckedChanged(object sender, EventArgs e)
{
try
{
//turn snap tips on/off
((IEngineEditProperties2)editor).SnapTips = snapTips.Checked;
}
catch
{
snapTips.Checked = ((IEngineEditProperties2)editor).SnapTips;
}
}
private void snapTolerance_TypeValidationEventHandler(object sender, TypeValidationEventArgs e)
{
try
{
snapEnvironment.SnapTolerance = Convert.ToDouble(snapTolerance.Text);
}
catch
{
snapTolerance.Text = snapEnvironment.SnapTolerance.ToString();
}
}
private void snapTolUnits_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
snapEnvironment.SnapToleranceUnits = (esriEngineSnapToleranceUnits)snapTolUnits.SelectedIndex;
}
catch
{
snapTolUnits.SelectedIndex = (int)snapEnvironment.SnapToleranceUnits;
}
}
#endregion
#region Helper Methods
/// <summary>
/// Adds, and hence turns on, Edit Sketch snap agents
/// </summary>
private void AddSketchSnapAgents()
{
//give anchor snap (i.e. vertex snap) priority to get more accurate snap tips while snapped to a vertex
Type t = Type.GetTypeFromProgID("esriControls.EngineAnchorSnap");
System.Object obj = Activator.CreateInstance(t);
IEngineSnapAgent snapAgent = (IEngineSnapAgent)obj;
snapEnvironment.AddSnapAgent(snapAgent);
//edge sketch edges
t = Type.GetTypeFromProgID("esriControls.EngineSketchSnap");
obj = Activator.CreateInstance(t);
snapAgent = (IEngineSnapAgent)obj;
snapEnvironment.AddSnapAgent(snapAgent);
//perpendicular to edit sketch
t = Type.GetTypeFromProgID("esriControls.EnginePerpendicularSnap");
obj = Activator.CreateInstance(t);
snapAgent = (IEngineSnapAgent)obj;
snapEnvironment.AddSnapAgent(snapAgent);
}
/// <summary>
/// Turns off feature snap agents and turns off edit sketch snap agents by removing them
/// </summary>
/// <remarks>
/// Using Clear or Remove feature snap agents can be deactivated so that the user can't enable them.
/// Here we simply turn off all the agents, which will allow the user to turn them on.
/// </remarks>
private void TurnOffAgents()
{
for (int i = snapEnvironment.SnapAgentCount - 1; i >= 0; i--)
{
IEngineSnapAgent snapAgent = snapEnvironment.get_SnapAgent(i);
IEngineFeatureSnapAgent ftrSnapAgent = snapAgent as IEngineFeatureSnapAgent;
if (ftrSnapAgent != null)
{
//turn off the feature snap agent
ftrSnapAgent.HitType = esriGeometryHitPartType.esriGeometryPartNone;
}
else
{
//there is no way to turn snap agents off, they must be removed
snapEnvironment.RemoveSnapAgent(i);
}
}
//refresh this window
RefreshDisplay();
}
#endregion
}
}
[Visual Basic .NET]
SnapEditorForm.vb
Imports System
Imports System.Collections
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Data
Imports System.Drawing
Imports System.Text
Imports System.Windows.Forms
Imports ESRI.ArcGIS.Controls
Imports ESRI.ArcGIS.esriSystem
Imports ESRI.ArcGIS.Geodatabase
Imports ESRI.ArcGIS.GeomeTry
Imports ESRI.ArcGIS.Carto
Imports ESRI.ArcGIS.Display
Imports ESRI.ArcGIS.SystemUI
Imports ESRI.ArcGIS.ADF.CATIDs
Namespace Core
Public partial Class SnapEditor
Inherits Form
Dim editor As IEngineEditor
Dim editLayers As IEngineEditLayers
Dim snapEnvironment As IEngineSnapEnvironment
Dim isRefreshing As Boolean
Public Sub New()
InitializeComponent()
'get the snapEnvironment
editor = New EngineEditorClass()
editLayers = DirectCast(editor, IEngineEditLayers)
snapEnvironment = DirectCast(editor, IEngineSnapEnvironment)
'Update this form with the snap environment and snap tips
'Note: from here on we expect all snap changes to be made via this form, so it is not updated after direct changes to the snapping
'environment or the Arc Engine Snap Window.
RefreshDisplay()
End Sub
'/ <summary>
'/ Update the window with the current snap environment and snap tip settings
'/ </summary>
Private Sub RefreshDisplay()
isRefreshing = True
snapTolerance.Text = snapEnvironment.SnapTolerance.ToString()
snapTolUnits.SelectedIndex = CType(snapEnvironment.SnapToleranceUnits, Integer)
snapTips.Checked = (DirectCast(editor, IEngineEditProperties2)).SnapTips
'remove all feature snap agents from the data grid view
snapAgents.Rows.Clear()
'display feature snap and snap agents that are active
Dim i As Integer
For i = 0 To snapEnvironment.SnapAgentCount - 1
Dim snapAgent As IEngineSnapAgent = DirectCast(snapEnvironment.SnapAgent(i), IEngineSnapAgent)
Dim ftrSnapAgent As IEngineFeatureSnapAgent = TryCast(snapAgent, IEngineFeatureSnapAgent)
If Not ftrSnapAgent Is Nothing Then
'for feature snap agents add a row to the data view grid
Dim hitType As esriGeometryHitPartType = ftrSnapAgent.HitType
Dim vertex As Boolean, edge As Boolean, endSnap As Boolean
vertex = (hitType And esriGeometryHitPartType.esriGeometryPartVertex) = esriGeometryHitPartType.esriGeometryPartVertex
edge = (hitType And esriGeometryHitPartType.esriGeometryPartBoundary) = esriGeometryHitPartType.esriGeometryPartBoundary
endSnap = (hitType And esriGeometryHitPartType.esriGeometryPartEndpoint) = esriGeometryHitPartType.esriGeometryPartEndpoint
Dim vertexString As String = " "
Dim edgeString As String = " "
Dim endString As String = " "
If vertex Then vertexString = "vertex"
If edge Then edgeString = " edge"
If endSnap Then endString = " end"
Dim hitTypes As String = vertexString + edgeString + endString
Dim rowData() As Object = {snapAgent.Name.ToString(), ftrSnapAgent.FeatureClass.AliasName, hitTypes}
snapAgents.Rows.Add(rowData)
Else
'add the active edit sketch snap agents
Dim rowData() As Object = {snapAgent.Name.ToString(), "<not applicable>", "<not applicable>"}
snapAgents.Rows.Add(rowData)
End If
Next
isRefreshing = False
End Sub
#Region "Button Handlers"
Private Sub clearAgents_Click(ByVal sender As Object, ByVal e As EventArgs) Handles clearAgents.Click
snapEnvironment.ClearSnapAgents()
'refresh this window
RefreshDisplay()
End Sub
'/ <summary>
'/ Turns off feature snap agents and turns off edit sketch snap agents by removing them
'/ </summary>
'/ <remarks>
'/ Using Clear or Remove feature snap agents can be deactivated so that the user can't enable them.
'/ Here we simply turn off all the agents, which will allow the user to turn them on.
'/ </remarks>
Private Sub turnOffAgents_Click(ByVal sender As Object, ByVal e As EventArgs) Handles turnOffAgents.Click
TurnOffAgentsHelper()
End Sub
Private Sub reverseAgentsPriority_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles reverseAgentsPriority.Click
'get all the snap agents in reverse order and then deactivate them
Dim snapAgentList As ArrayList = New ArrayList()
Dim i As Integer
For i = snapEnvironment.SnapAgentCount - 1 To 0 Step i - 1
Dim tmpAgent As IEngineSnapAgent = snapEnvironment.SnapAgent(i)
snapAgentList.Add(tmpAgent)
snapEnvironment.RemoveSnapAgent(i)
Next
'add the agents back to the environment
Dim agent As IEngineSnapAgent
For Each agent In snapAgentList
snapEnvironment.AddSnapAgent(agent)
Next
'refresh this window
RefreshDisplay()
End Sub
'/ <summary>
'/ Adds a feature snap agent for the target layer and turn on all options.
'/ </summary>
'/ <remarks>
'/ This method does not check if there already exists a feature snap agent for the
'/ target layer. It is recommended that you do so since duplicate agents can appear
'/ on the Snap Settings Form
'/ </remarks>
Private Sub addFeatureSnapAgent_Click(ByVal sender As Object, ByVal e As EventArgs) Handles addFeatureSnapAgent.Click
Dim featureSnapAgent As IEngineFeatureSnapAgent = New EngineFeatureSnap()
If (editLayers.TargetLayer Is Nothing) Then
System.Windows.Forms.MessageBox.Show("Please start an edit session")
Return
End If
featureSnapAgent.FeatureClass = editLayers.TargetLayer.FeatureClass
featureSnapAgent.HitType = esriGeometryHitPartType.esriGeometryPartVertex Or esriGeometryHitPartType.esriGeometryPartBoundary Or esriGeometryHitPartType.esriGeometryPartEndpoint
snapEnvironment.AddSnapAgent(featureSnapAgent)
'refresh this window
RefreshDisplay()
End Sub
'/ <summary>
'/ Adds, and hence turns on, Edit Sketch snap agents
'/ </summary>
Private Sub addSketchSnapAgent_Click(ByVal sender As Object, ByVal e As EventArgs) Handles addSketchSnapAgent.Click
AddSketchSnapAgents()
RefreshDisplay()
End Sub
#End Region
#Region "Snap Tips and Tolerance Handlers"
Private Sub snapTips_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs) Handles snapTips.CheckedChanged
Try
'turn snap tips on/off
DirectCast(editor, IEngineEditProperties2).SnapTips = snapTips.Checked
Catch
snapTips.Checked = DirectCast(editor, IEngineEditProperties2).SnapTips
End Try
End Sub
Private Sub snapTolerance_TextChanged(ByVal sender As Object, ByVal e As EventArgs) Handles snapTolerance.TextChanged
Try
snapEnvironment.SnapTolerance = Convert.ToDouble(snapTolerance.Text)
Catch
snapTolerance.Text = snapEnvironment.SnapTolerance.ToString()
End Try
End Sub
Private Sub snapTolUnits_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles snapTolUnits.SelectedIndexChanged
Try
snapEnvironment.SnapToleranceUnits = CType(snapTolUnits.SelectedIndex, esriEngineSnapToleranceUnits)
Catch
snapTolUnits.SelectedIndex = CType(snapEnvironment.SnapToleranceUnits, Integer)
End Try
End Sub
#End Region
#Region "Helper Methods"
'/ <summary>
'/ Turns on or turns off the Edit Sketch snap agents by adding or removing them
'/ </summary>
Private Sub AddSketchSnapAgents()
'give anchor snap (i.e. vertex snap) priority to get more accurate snap tips while snapped to a vertex
Dim t As Type = Type.GetTypeFromProgID("esriControls.EngineAnchorSnap")
Dim obj As System.Object = Activator.CreateInstance(t)
Dim snapAgent As IEngineSnapAgent = DirectCast(obj, IEngineSnapAgent)
snapEnvironment.AddSnapAgent(snapAgent)
'edge sketch edges
t = Type.GetTypeFromProgID("esriControls.EngineSketchSnap")
obj = Activator.CreateInstance(t)
snapAgent = DirectCast(obj, IEngineSnapAgent)
snapEnvironment.AddSnapAgent(snapAgent)
'perpendicular to edit sketch
t = Type.GetTypeFromProgID("esriControls.EnginePerpendicularSnap")
obj = Activator.CreateInstance(t)
snapAgent = DirectCast(obj, IEngineSnapAgent)
snapEnvironment.AddSnapAgent(snapAgent)
End Sub
'/ <summary>
'/ Turns off feature snap agents and turns off edit sketch snap agents by removing them
'/ </summary>
'/ <remarks>
'/ Using Clear or Remove feature snap agents can be deactivated so that the user can't enable them.
'/ Here we simply turn off all the agents, which will allow the user to turn them on.
'/ </remarks>
Private Sub TurnOffAgentsHelper()
Dim i As Integer
For i = snapEnvironment.SnapAgentCount - 1 To 0 Step i - 1
Dim snapAgent As IEngineSnapAgent = DirectCast(snapEnvironment.SnapAgent(i), IEngineSnapAgent)
Dim ftrSnapAgent As IEngineFeatureSnapAgent = TryCast(snapAgent, IEngineFeatureSnapAgent)
If (ftrSnapAgent IsNot Nothing) Then
'turn off the feature snap agent
ftrSnapAgent.HitType = esriGeometryHitPartType.esriGeometryPartNone
Else
'there is no way to turn snap agents off, they must be removed
snapEnvironment.RemoveSnapAgent(i)
End If
Next
'refresh this window
RefreshDisplay()
End Sub
#End Region
End Class
End Namespace