About the Selection restriction evaluator Sample
[C#]
SelectionRestrictionEvaluator.cs
using System; using System.Runtime.InteropServices; using System.Collections; using System.Collections.Generic; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Framework; using ESRI.ArcGIS.ArcMapUI; using ESRI.ArcGIS.Carto; namespace SelectionRestriction { [ClassInterface(ClassInterfaceType.None)] [Guid("1f75097c-7224-4d1f-ae38-1242e26efcef")] public class SelectionRestrictionEvaluator : INetworkEvaluator2, INetworkEvaluatorSetup { #region Member Variables private INetworkDataset m_networkDataset; // Used to store a reference to the network dataset private INetworkSource m_networkSource; // Used to store a reference to the network source associated with this evaluator private IMxDocument m_mxDocument; // Used to store a reference to the current MxDocument private Dictionary<int, int> m_sourceHashTable; // Used to store a dynamic hash table of selected OIDs for the evaluator's network source #endregion #region INetworkEvaluator Members public bool CacheAttribute { // CacheAttribute returns whether or not we want the network dataset to cache our evaluated attribute values during the network dataset build // Since this is a dynamic evaluator, we will return false, so that our attribute values are dynamically queried at runtime get { return false; } } public string DisplayName { get { return "SelectionRestriction"; } } public string Name { get { return "SelectionRestriction.SelectionRestrictionEvaluator"; } } #endregion #region INetworkEvaluatorSetup Members public UID CLSID { get { // Create and return the GUID for this custom evaluator UID uid = new UIDClass(); uid.Value = "{1f75097c-7224-4d1f-ae38-1242e26efcef}"; return uid; } } public IPropertySet Data { // The Data property is intended to make use of property sets to get/set the custom evaluator's properties using only one call to the evaluator object // This custom evaluator does not make use of this property get { return null; } set { } } public bool DataHasEdits { // Since this custom evaluator does not make any data edits, return false get { return false; } } public void Initialize(INetworkDataset networkDataset, IDENetworkDataset dataElement, INetworkSource source, IEvaluatedNetworkAttribute attribute) { // Initialize is called once per session (ArcMap session, ArcCatalog session, etc.) to initialize the evaluator for an associated network dataset Type t = Type.GetTypeFromProgID("esriFramework.AppRef"); try { // Activator.CreateInstance(t) is expected to error if the evaluator is created in an engine application // which can?t get a reference to the AppRef singleton. // This evaluator won?t work in Engine due to this design limitation. It is, however, // fully functional in ArcMap. System.Object obj = Activator.CreateInstance(t); IApplication app = obj as IApplication; if (app != null && app is IMxApplication) m_mxDocument = app.Document as IMxDocument; } catch (Exception e) { m_mxDocument = null; } // Store reference to the network dataset and the network source m_networkDataset = networkDataset; m_networkSource = source; // Create a new Dictionary hashtable for this network source m_sourceHashTable = new Dictionary<int, int>(); } public object QueryValue(INetworkElement element, IRow row) { // This element is restricted if its associated ObjectID is currently stored within the network source's hashtable return m_sourceHashTable.ContainsKey(element.OID); } public bool SupportsDefault(esriNetworkElementType elementType, IEvaluatedNetworkAttribute attribute) { // This custom evaluator can not be used for assigning default attribute values return false; } public bool SupportsSource(INetworkSource source, IEvaluatedNetworkAttribute attribute) { // This custom evaluator supports restriction attributes for all sources return attribute.UsageType == esriNetworkAttributeUsageType.esriNAUTRestriction; } public bool ValidateDefault(esriNetworkElementType elementType, IEvaluatedNetworkAttribute attribute, ref int errorCode, ref string errorDescription, ref string errorAppendInfo) { if (SupportsDefault(elementType, attribute)) { errorCode = 0; errorDescription = errorAppendInfo = string.Empty; return true; } else { errorCode = -1; errorDescription = errorAppendInfo = string.Empty; return false; } } public bool ValidateSource(IDatasetContainer2 datasetContainer, INetworkSource networkSource, IEvaluatedNetworkAttribute attribute, ref int errorCode, ref string errorDescription, ref string errorAppendInfo) { if (SupportsSource(networkSource, attribute)) { errorCode = 0; errorDescription = errorAppendInfo = string.Empty; return true; } else { errorCode = -1; errorDescription = errorAppendInfo = string.Empty; return false; } } #endregion #region INetworkEvaluator2 Members public void Refresh() { // This method is called internally during a solve operation immediately prior to performing the actual solve // This gives us an opportunity to update our evaluator's internal state based on changes to the current source feature selection set within ArcMap if (m_mxDocument != null) { // Clear the hashtable of any previous selections m_sourceHashTable.Clear(); // Loop through every layer in the map, find the appropriate network source feature layer, and add its selection set to the source hashtable IMap map = m_mxDocument.FocusMap; IFeatureClassContainer fcContainer = m_networkDataset as IFeatureClassContainer; IFeatureClass sourceFC = fcContainer.get_ClassByName(m_networkSource.Name); ILayer layer; IFeatureClass layerFC; IEnumLayer enumLayer = map.get_Layers(null, true); while ((layer = enumLayer.Next()) != null) { if (layer.Visible && layer is IFeatureLayer) { layerFC = ((IFeatureLayer)layer).FeatureClass; if (layerFC == sourceFC) { IFeatureSelection featureSelection = layer as IFeatureSelection; ISelectionSet selectionSet = featureSelection.SelectionSet; IEnumIDs idEnumerator = selectionSet.IDs; idEnumerator.Reset(); int oid; while ((oid = idEnumerator.Next()) != -1) { m_sourceHashTable.Add(oid, oid); } break; } } } } } public IStringArray RequiredFieldNames { // This custom evaluator does not require any field names get { return null; } } #endregion } }
[Visual Basic .NET]
SelectionRestrictionEvaluator.vb
Imports Microsoft.VisualBasic Imports System Imports System.Runtime.InteropServices Imports System.Collections Imports System.Collections.Generic Imports ESRI.ArcGIS.esriSystem Imports ESRI.ArcGIS.Geodatabase Imports ESRI.ArcGIS.Framework Imports ESRI.ArcGIS.ArcMapUI Imports ESRI.ArcGIS.Carto Namespace SelectionRestriction <ClassInterface(ClassInterfaceType.None), Guid("32C6254F-7E03-4b57-9EA2-35EA8DAFA306")> _ Public Class SelectionRestrictionEvaluator : Implements INetworkEvaluator2, INetworkEvaluatorSetup #Region "Member Variables" Private m_networkDataset As INetworkDataset ' Used to store a reference to the network dataset Private m_networkSource As INetworkSource ' Used to store a reference to the network source associated with this evaluator Private m_mxDocument As IMxDocument ' Used to store a reference to the current MxDocument Private m_sourceHashTable As Dictionary(Of Integer, Integer) ' Used to store a dynamic hash table of selected OIDs for the evaluator's network source #End Region #Region "INetworkEvaluator Members" Public ReadOnly Property CacheAttribute() As Boolean Implements INetworkEvaluator.CacheAttribute, INetworkEvaluator2.CacheAttribute ' CacheAttribute returns whether or not we want the network dataset to cache our evaluated attribute values during the network dataset build ' Since this is a dynamic evaluator, we will return false, so that our attribute values are dynamically queried at runtime Get Return False End Get End Property Public ReadOnly Property DisplayName() As String Implements INetworkEvaluator.DisplayName, INetworkEvaluator2.DisplayName Get Return "SelectionRestriction" End Get End Property Public ReadOnly Property Name() As String Implements INetworkEvaluator.Name, INetworkEvaluator2.Name Get Return "SelectionRestriction.SelectionRestrictionEvaluator" End Get End Property #End Region #Region "INetworkEvaluatorSetup Members" Public ReadOnly Property CLSID() As UID Implements INetworkEvaluatorSetup.CLSID Get ' Create and return the GUID for this custom evaluator Dim uid As UID = New UIDClass() uid.Value = "{32C6254F-7E03-4b57-9EA2-35EA8DAFA306}" Return uid End Get End Property Public Property Data() As IPropertySet Implements INetworkEvaluatorSetup.Data ' The Data property is intended to make use of property sets to get/set the custom evaluator's properties using only one call to the evaluator object ' This custom evaluator does not make use of this property Get Return Nothing End Get Set(ByVal value As IPropertySet) End Set End Property Public ReadOnly Property DataHasEdits() As Boolean Implements INetworkEvaluatorSetup.DataHasEdits ' Since this custom evaluator does not make any data edits, return false Get Return False End Get End Property Public Sub Initialize(ByVal networkDataset As INetworkDataset, ByVal dataElement As IDENetworkDataset, ByVal source As INetworkSource, ByVal attribute As IEvaluatedNetworkAttribute) Implements INetworkEvaluatorSetup.Initialize ' Initialize is called once per session (ArcMap session, ArcCatalog session, etc.) to initialize the evaluator for an associated network dataset Dim t As Type = Type.GetTypeFromProgID("esriFramework.AppRef") ' Activator.CreateInstance(t) is expected to error if the evaluator is created in an engine application ' which can?t get a reference to the AppRef singleton. ' This evaluator won?t work in Engine due to this design limitation. It is, however, ' fully functional in ArcMap. Try Dim obj As System.Object = Activator.CreateInstance(t) Dim app As IApplication = TryCast(obj, IApplication) If Not app Is Nothing AndAlso TypeOf app Is IMxApplication Then m_mxDocument = TryCast(app.Document, IMxDocument) End If Catch ex As Exception m_mxDocument = Nothing End Try ' Store reference to the network dataset and the network source m_networkDataset = networkDataset m_networkSource = source ' Create a new Dictionary hash table for this network source m_sourceHashTable = New Dictionary(Of Integer, Integer)() End Sub Public Function QueryValue(ByVal element As INetworkElement, ByVal row As IRow) As Object Implements INetworkEvaluatorSetup.QueryValue ' This element is restricted if its associated ObjectID is currently stored within the network source's hash table Return m_sourceHashTable.ContainsKey(element.OID) End Function Public Function SupportsDefault(ByVal elementType As esriNetworkElementType, ByVal attribute As IEvaluatedNetworkAttribute) As Boolean Implements INetworkEvaluatorSetup.SupportsDefault ' This custom evaluator can not be used for assigning default attribute values Return False End Function Public Function SupportsSource(ByVal source As INetworkSource, ByVal attribute As IEvaluatedNetworkAttribute) As Boolean Implements INetworkEvaluatorSetup.SupportsSource ' This custom evaluator supports restriction attributes for all sources Return attribute.UsageType = esriNetworkAttributeUsageType.esriNAUTRestriction End Function Public Function ValidateDefault(ByVal elementType As esriNetworkElementType, ByVal attribute As IEvaluatedNetworkAttribute, ByRef errorCode As Integer, ByRef errorDescription As String, ByRef errorAppendInfo As String) As Boolean Implements INetworkEvaluatorSetup.ValidateDefault If SupportsDefault(elementType, attribute) Then errorCode = 0 errorDescription = String.Empty errorAppendInfo = String.Empty Return True Else errorCode = -1 errorDescription = String.Empty errorAppendInfo = String.Empty Return False End If End Function Public Function ValidateSource(ByVal datasetContainer As IDatasetContainer2, ByVal networkSource As INetworkSource, ByVal attribute As IEvaluatedNetworkAttribute, ByRef errorCode As Integer, ByRef errorDescription As String, ByRef errorAppendInfo As String) As Boolean Implements INetworkEvaluatorSetup.ValidateSource If SupportsSource(networkSource, attribute) Then errorCode = 0 errorDescription = String.Empty errorAppendInfo = String.Empty Return True Else errorCode = -1 errorDescription = String.Empty errorAppendInfo = String.Empty Return False End If End Function #End Region #Region "INetworkEvaluator2 Members" Public Sub Refresh() Implements INetworkEvaluator2.Refresh ' This method is called internally during a solve operation immediately prior to performing the actual solve ' This gives us an opportunity to update our evaluator's internal state based on changes to the current source feature selection set within ArcMap If Not m_mxDocument Is Nothing Then ' Clear the hash table of any previous selections m_sourceHashTable.Clear() ' Loop through every layer in the map, find the appropriate network source feature layer, and add its selection set to the source hash table Dim map As IMap = m_mxDocument.FocusMap Dim fcContainer As IFeatureClassContainer = CType(m_networkDataset, IFeatureClassContainer) Dim sourceFC As IFeatureClass = fcContainer.ClassByName(m_networkSource.Name) Dim layer As ILayer Dim layerFC As IFeatureClass Dim enumLayer As IEnumLayer = map.Layers(Nothing, True) layer = enumLayer.Next() Do While Not layer Is Nothing If layer.Visible AndAlso TypeOf layer Is IFeatureLayer Then layerFC = (CType(layer, IFeatureLayer)).FeatureClass If layerFC Is sourceFC Then Dim featureSelection As IFeatureSelection = CType(layer, IFeatureSelection) Dim selectionSet As ISelectionSet = featureSelection.SelectionSet Dim idEnumerator As IEnumIDs = selectionSet.IDs idEnumerator.Reset() Dim oid As Integer oid = idEnumerator.Next() Do While oid <> -1 m_sourceHashTable.Add(oid, oid) oid = idEnumerator.Next() Loop Exit Do End If End If layer = enumLayer.Next() Loop End If End Sub Public ReadOnly Property RequiredFieldNames() As IStringArray Implements INetworkEvaluator2.RequiredFieldNames ' This custom evaluator does not require any field names Get Return Nothing End Get End Property #End Region End Class End Namespace