About the Network Analyst barrier location editor Sample
[C#]
NABarrierLocationEditor.cs
using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using ESRI.ArcGIS.ADF.BaseClasses;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Framework;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.NetworkAnalyst;
using ESRI.ArcGIS.NetworkAnalystUI;
namespace NABarrierLocationEditor
{
/// <summary>
/// Summary description for BarrierLocationEditor.
///
/// This sample teaches how to load polygon and polyline barrier values programmatically,
/// while also providing a way to visualize and edit the underlying network element values that make up a polygon or polyline barrier.
/// As a side benefit, the programmer also learns how to flash the geometry of a network element
/// (with a corresponding digitized direction arrow), as well as how to set up a context menu command for the NAWindow.
///
/// </summary>
[Guid("7a93ba10-9dee-11da-a746-0800200c9a66")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("NABarrierLocationEditor.NABarrierLocationEditor")]
public sealed class NABarrierLocationEditor : BaseCommand, INAWindowCommand2
{
public INetworkAnalystExtension m_naExt; // Hook into the Desktop NA Extension
public IApplication m_application; // Hook into ArcMap
#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);
ESRI.ArcGIS.ADF.CATIDs.MxCommands.Register(regKey);
ESRI.ArcGIS.ADF.CATIDs.ControlsCommands.Register(regKey);
// Register with NetworkAnalystWindowItemsCommand to get the
// command to show up when you right click on the class in the NAWindow
ESRI.ArcGIS.ADF.CATIDs.NetworkAnalystWindowItemsCommand.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);
ESRI.ArcGIS.ADF.CATIDs.MxCommands.Unregister(regKey);
ESRI.ArcGIS.ADF.CATIDs.ControlsCommands.Unregister(regKey);
ESRI.ArcGIS.ADF.CATIDs.NetworkAnalystWindowItemsCommand.Unregister(regKey);
}
#endregion
#endregion
public NABarrierLocationEditor()
{
base.m_category = "Developer Samples";
base.m_caption = "Edit Network Analyst Barrier Location Ranges";
base.m_message = "Edit Network Analyst Barrier Location Ranges";
base.m_toolTip = "Edit Network Analyst Barrier Location Ranges";
base.m_name = "EditNABarrierLocationRanges";
try
{
string bitmapResourceName = GetType().Name + ".bmp";
base.m_bitmap = new Bitmap(GetType(), bitmapResourceName);
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap");
}
}
~NABarrierLocationEditor()
{
m_application = null;
m_naExt = null;
GC.Collect();
}
#region Overriden Class Methods
/// <summary>
/// Occurs when this command is created
/// </summary>
/// <param name="hook">Instance of the application</param>
///
public override void OnCreate(object hook)
{
if (hook == null)
return;
m_application = hook as IApplication;
base.m_enabled = true;
if (m_application != null)
m_naExt = m_application.FindExtensionByName("Network Analyst") as INetworkAnalystExtension;
}
/// <summary>
/// Occurs when this command is clicked
/// </summary>
public override void OnClick()
{
try
{
OpenBarrierEditorForm();
}
catch (Exception exception)
{
MessageBox.Show(exception.Message, "Error");
}
}
#endregion
#region Overridden INAWindowCommand Methods
public bool Applies(INALayer naLayer, INAWindowCategory category)
{
// The category is associated with an NAClass.
// In our case, we want the PolygonBarriers and PolylineBarriers classes
if (category != null)
{
string categoryName = category.NAClass.ClassDefinition.Name;
if (categoryName == "PolygonBarriers" || categoryName == "PolylineBarriers")
return true;
}
return false;
}
#region INAWindowCommand2 Members
/// <summary>
/// Occurs in determining whether or not to include the command as a context menu item
/// <param name="naLayer">The active analysis layer</param>
/// <param name="categoryGroup">The selected group in the NAWindow</param>
/// </summary>
bool INAWindowCommand2.AppliesToGroup(INALayer naLayer, INAWindowCategoryGroup categoryGroup)
{
if (categoryGroup != null)
{
return Applies(naLayer, categoryGroup.Category);
}
return false;
}
int INAWindowCommand2.Priority
{
get { return 1; }
}
#endregion
#endregion
/// <summary>
/// This command will be enabled for Polygon and Polyline Barriers
/// </summary>
public override bool Enabled
{
get
{
return Applies(null, GetActiveCategory());
}
}
/// <summary>
/// To open the editor form, we need to first determine which barrier is
/// being edited, then pass that value to the form
/// </summary>
private void OpenBarrierEditorForm()
{
// get the barrier layer by using the category name to as the NAClassName
INAWindowCategory activeCategory = GetActiveCategory();
string categoryName = activeCategory.NAClass.ClassDefinition.Name;
INALayer naLayer = GetActiveAnalysisLayer();
ILayer layer = naLayer.get_LayerByNAClassName(categoryName);
// get a selection count and popup a message if more or less than one item is selected
IFeatureSelection fSel = layer as IFeatureSelection;
ISelectionSet selSet = fSel.SelectionSet;
if (selSet.Count != 1)
System.Windows.Forms.MessageBox.Show("Only one barrier in a category can be selected at a time for this command to execute", "Barrier Location Editor Warning");
else
{
// get the object IDs of the selected item
int id = selSet.IDs.Next();
// Get the barrier feature by using the selected ID
IFeatureClass fClass = naLayer.Context.NAClasses.get_ItemByName(categoryName) as IFeatureClass;
IFeature barrierFeature = fClass.GetFeature(id);
// display the form for editing the barrier
EditorForm form = new EditorForm(m_application, naLayer.Context, barrierFeature);
form.ShowDialog();
form = null;
}
}
#region "NAWindow Interaction"
private INALayer GetActiveAnalysisLayer()
{
if (m_naExt != null)
return m_naExt.NAWindow.ActiveAnalysis;
else
return null;
}
private INAWindowCategory2 GetActiveCategory()
{
if (m_naExt != null)
return m_naExt.NAWindow.ActiveCategory as INAWindowCategory2;
else
return null;
}
#endregion
}
}
[Visual Basic .NET]
NABarrierLocationEditor.vb
Imports Microsoft.VisualBasic
Imports System
Imports System.Drawing
Imports System.Runtime.InteropServices
Imports System.Windows.Forms
Imports ESRI.ArcGIS.ADF.BaseClasses
Imports ESRI.ArcGIS.Carto
Imports ESRI.ArcGIS.Framework
Imports ESRI.ArcGIS.Geodatabase
Imports ESRI.ArcGIS.NetworkAnalyst
Imports ESRI.ArcGIS.NetworkAnalystUI
Namespace NABarrierLocationEditor
''' <summary>
''' Summary description for BarrierLocationEditor.
'''
''' This sample teaches how to load polygon and polyline barrier values programmatically,
''' while also providing a way to visualize and edit the underlying network element values that make up a polygon or polyline barrier.
''' As a side benefit, the programmer also learns how to flash the geometry of a network element
''' (with a corresponding digitized direction arrow), as well as how to set up a context menu command for the NAWindow.
'''
''' </summary>
<Guid("7a93ba10-9dee-11da-a746-0800200c9a66"), ClassInterface(ClassInterfaceType.None), ProgId("NABarrierLocationEditor.NABarrierLocationEditor")> _
Public NotInheritable Class NABarrierLocationEditor
Inherits BaseCommand
Implements INAWindowCommand2
Public m_naExt As INetworkAnalystExtension ' Hook into the Desktop NA Extension
Public m_application As IApplication ' Hook into ArcMap
#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)
End Sub
<ComUnregisterFunction(), ComVisible(False)> _
Private 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)
ESRI.ArcGIS.ADF.CATIDs.MxCommands.Register(regKey)
ESRI.ArcGIS.ADF.CATIDs.ControlsCommands.Register(regKey)
' Register with NetworkAnalystWindowItemsCommand to get the
' command to show up when you right click on the class in the NAWindow
ESRI.ArcGIS.ADF.CATIDs.NetworkAnalystWindowItemsCommand.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)
ESRI.ArcGIS.ADF.CATIDs.MxCommands.Unregister(regKey)
ESRI.ArcGIS.ADF.CATIDs.ControlsCommands.Unregister(regKey)
ESRI.ArcGIS.ADF.CATIDs.NetworkAnalystWindowItemsCommand.Unregister(regKey)
End Sub
#End Region
#End Region
Public Sub New()
MyBase.m_category = "Developer Samples"
MyBase.m_caption = "Edit Network Analyst Barrier Location Ranges"
MyBase.m_message = "Edit Network Analyst Barrier Location Ranges"
MyBase.m_toolTip = "Edit Network Analyst Barrier Location Ranges"
MyBase.m_name = "EditNABarrierLocationRanges"
Try
Dim bitmapResourceName As String = Me.GetType().Name & ".bmp"
MyBase.m_bitmap = New Bitmap(Me.GetType(), bitmapResourceName)
Catch ex As Exception
System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap")
End Try
End Sub
Protected Overrides Sub Finalize()
m_application = Nothing
m_naExt = Nothing
GC.Collect()
End Sub
#Region "Overridden Class Methods"
''' <summary>
''' Occurs when this command is created
''' </summary>
''' <param name="hook">Instance of the application</param>
'''
Public Overrides Sub OnCreate(ByVal hook As Object)
If hook Is Nothing Then
Return
End If
m_application = TryCast(hook, IApplication)
MyBase.m_enabled = True
If Not m_application Is Nothing Then
m_naExt = TryCast(m_application.FindExtensionByName("Network Analyst"), INetworkAnalystExtension)
End If
End Sub
''' <summary>
''' Occurs when this command is clicked
''' </summary>
Public Overrides Sub OnClick()
Try
OpenBarrierEditorForm()
Catch exception As Exception
MessageBox.Show(exception.Message, "Error")
End Try
End Sub
#End Region
#Region "Overridden INAWindowCommand Methods"
Public Function Applies(ByVal naLayer As INALayer, ByVal category As INAWindowCategory) As Boolean Implements INAWindowCommand.Applies, INAWindowCommand2.Applies
' The category is associated with an NAClass.
' In our case, we want the PolygonBarriers and PolylineBarriers classes
If Not category Is Nothing Then
Dim categoryName As String = category.NAClass.ClassDefinition.Name
If categoryName = "PolygonBarriers" OrElse categoryName = "PolylineBarriers" Then
Return True
End If
End If
Return False
End Function
#Region "INAWindowCommand2 Members"
''' <summary>
''' Occurs in determining whether or not to include the command as a context menu item
''' <param name="naLayer">The active analysis layer</param>
''' <param name="categoryGroup">The selected group in the NAWindow</param>
''' </summary>
Private Function AppliesToGroup(ByVal naLayer As INALayer, ByVal categoryGroup As INAWindowCategoryGroup) As Boolean Implements INAWindowCommand2.AppliesToGroup
If Not categoryGroup Is Nothing Then
Return Applies(naLayer, categoryGroup.Category)
End If
Return False
End Function
Private ReadOnly Property Priority() As Integer Implements INAWindowCommand2.Priority
Get
Return 1
End Get
End Property
#End Region
#End Region
''' <summary>
''' This command will be enabled for Polygon and Polyline Barriers
''' </summary>
Public Overrides ReadOnly Property Enabled() As Boolean
Get
Return Applies(Nothing, GetActiveCategory())
End Get
End Property
''' <summary>
''' To open the editor form, we need to first determine which barrier is
''' being edited, then pass that value to the form
''' </summary>
Private Sub OpenBarrierEditorForm()
' get the barrier layer by using the category name to as the NAClassName
Dim activeCategory As INAWindowCategory = GetActiveCategory()
Dim categoryName As String = activeCategory.NAClass.ClassDefinition.Name
Dim naLayer As INALayer = GetActiveAnalysisLayer()
Dim layer As ILayer = naLayer.LayerByNAClassName(categoryName)
' get a selection count and popup a message if more or less than one item is selected
Dim fSel As IFeatureSelection = TryCast(layer, IFeatureSelection)
Dim selSet As ISelectionSet = fSel.SelectionSet
If selSet.Count <> 1 Then
System.Windows.Forms.MessageBox.Show("Only one barrier in a category can be selected at a time for this command to execute", "Barrier Location Editor Warning")
Else
' get the object IDs of the selected item
Dim id As Integer = selSet.IDs.Next()
' Get the barrier feature by using the selected ID
Dim fClass As IFeatureClass = TryCast(naLayer.Context.NAClasses.ItemByName(categoryName), IFeatureClass)
Dim barrierFeature As IFeature = fClass.GetFeature(id)
' display the form for editing the barrier
Dim form As EditorForm = New EditorForm(m_application, naLayer.Context, barrierFeature)
form.ShowDialog()
form = Nothing
End If
End Sub
#Region "NAWindow Interaction"
Private Function GetActiveAnalysisLayer() As INALayer
If Not m_naExt Is Nothing Then
Return m_naExt.NAWindow.ActiveAnalysis
Else
Return Nothing
End If
End Function
Private Function GetActiveCategory() As INAWindowCategory2
If Not m_naExt Is Nothing Then
Return TryCast(m_naExt.NAWindow.ActiveCategory, INAWindowCategory2)
Else
Return Nothing
End If
End Function
#End Region
End Class
End Namespace