About the Network Analyst Engine application Sample
[C#]
frmLoadLocations.cs
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Geometry; using ESRI.ArcGIS.NetworkAnalyst; // This form allows users to load locations from another point feature layer into the selected NALayer and active category. namespace NAEngine { /// <summary> /// Summary description for frmLoadLocations. /// </summary> public class frmLoadLocations : System.Windows.Forms.Form { private System.Windows.Forms.Label lblInputData; private System.Windows.Forms.CheckBox chkUseSelection; private System.Windows.Forms.Button btnCancel; private System.Windows.Forms.Button btnOK; /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.Container components = null; private System.Windows.Forms.ComboBox cboInputData; bool m_okClicked; System.Collections.IList m_listDisplayTable; public frmLoadLocations() { // // Required for Windows Form Designer support // InitializeComponent(); } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose(bool disposing) { if (disposing) { if (components != null) { components.Dispose(); } } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.cboInputData = new System.Windows.Forms.ComboBox(); this.lblInputData = new System.Windows.Forms.Label(); this.chkUseSelection = new System.Windows.Forms.CheckBox(); this.btnCancel = new System.Windows.Forms.Button(); this.btnOK = new System.Windows.Forms.Button(); this.SuspendLayout(); // // cboInputData // this.cboInputData.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cboInputData.Location = new System.Drawing.Point(82, 9); this.cboInputData.Name = "cboInputData"; this.cboInputData.Size = new System.Drawing.Size(381, 21); this.cboInputData.TabIndex = 0; this.cboInputData.SelectedIndexChanged += new System.EventHandler(this.cboInputData_SelectedIndexChanged); // // lblInputData // this.lblInputData.Location = new System.Drawing.Point(12, 12); this.lblInputData.Name = "lblInputData"; this.lblInputData.Size = new System.Drawing.Size(64, 24); this.lblInputData.TabIndex = 1; this.lblInputData.Text = "Input Data"; // // chkUseSelection // this.chkUseSelection.Location = new System.Drawing.Point(15, 39); this.chkUseSelection.Name = "chkUseSelection"; this.chkUseSelection.Size = new System.Drawing.Size(419, 16); this.chkUseSelection.TabIndex = 2; this.chkUseSelection.Text = "Use Selection"; // // btnCancel // this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnCancel.Location = new System.Drawing.Point(351, 61); this.btnCancel.Name = "btnCancel"; this.btnCancel.Size = new System.Drawing.Size(112, 32); this.btnCancel.TabIndex = 6; this.btnCancel.Text = "&Cancel"; this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); // // btnOK // this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnOK.Location = new System.Drawing.Point(223, 61); this.btnOK.Name = "btnOK"; this.btnOK.Size = new System.Drawing.Size(112, 32); this.btnOK.TabIndex = 5; this.btnOK.Text = "&OK"; this.btnOK.Click += new System.EventHandler(this.btnOK_Click); // // frmLoadLocations // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(479, 100); this.Controls.Add(this.btnCancel); this.Controls.Add(this.btnOK); this.Controls.Add(this.chkUseSelection); this.Controls.Add(this.lblInputData); this.Controls.Add(this.cboInputData); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; this.Name = "frmLoadLocations"; this.ShowInTaskbar = false; this.Text = "Load Locations"; this.ResumeLayout(false); } #endregion public bool ShowModal(IMapControl3 mapControl, IEngineNetworkAnalystEnvironment naEnv) { // Initialize variables m_okClicked = false; m_listDisplayTable = new System.Collections.ArrayList(); // Get the NALayer and NAContext INALayer naLayer = naEnv.NAWindow.ActiveAnalysis; INAContext naContext = naLayer.Context; //Get the active category IEngineNAWindowCategory2 activeCategory = naEnv.NAWindow.ActiveCategory as IEngineNAWindowCategory2; if (activeCategory == null) return false; INAClass naClass = activeCategory.NAClass; IDataset naDataset = naClass as IDataset; IDataLayer pDataLayer = activeCategory.DataLayer; ILayer pLayer = pDataLayer as ILayer; IFeatureLayer pFeatureLayer = pDataLayer as IFeatureLayer; IStandaloneTable pStandaloneTable = pDataLayer as IStandaloneTable; esriGeometryType targetGeoType = esriGeometryType.esriGeometryNull; String dataLayerName = ""; if (pFeatureLayer != null) { if (pLayer.Valid) { IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass; if (pFeatureClass != null) { targetGeoType = pFeatureClass.ShapeType; dataLayerName = pLayer.Name; } } } else if (pStandaloneTable != null) { dataLayerName = pStandaloneTable.Name; } if (dataLayerName.Length == 0) return false; this.Text = "Load Items into " + dataLayerName; // Loop through all the sourcedisplayTables having targetGeoType to the combo box and the // list of displayTables IEnumLayer sourceLayers = null; ILayer sourceLayer = null; IDisplayTable sourceDisplayTable = null; UID searchInterfaceUID = new UID(); if (targetGeoType != esriGeometryType.esriGeometryNull) { searchInterfaceUID.Value = typeof(IFeatureLayer).GUID.ToString("B"); sourceLayers = mapControl.Map.get_Layers(searchInterfaceUID, true); sourceLayer = sourceLayers.Next(); while (sourceLayer != null) { IFeatureLayer sourceFeatureLayer = sourceLayer as IFeatureLayer; sourceDisplayTable = sourceLayer as IDisplayTable; if ((sourceFeatureLayer != null) && (sourceDisplayTable != null)) { IFeatureClass sourceFeatureClass = sourceFeatureLayer.FeatureClass; esriGeometryType sourceGeoType = sourceFeatureClass.ShapeType; if ((sourceGeoType == targetGeoType) || (targetGeoType == esriGeometryType.esriGeometryPoint && sourceGeoType == esriGeometryType.esriGeometryMultipoint)) { // Add the layer name to the combobox and the layer to the list cboInputData.Items.Add(sourceLayer.Name); m_listDisplayTable.Add(sourceDisplayTable); } } sourceLayer = sourceLayers.Next(); } } else //if (targetGeoType == esriGeometryType.esriGeometryNull) { IStandaloneTableCollection sourceStandaloneTables = mapControl.Map as IStandaloneTableCollection; IStandaloneTable sourceStandaloneTable = null; sourceDisplayTable = null; int count = 0; if (sourceStandaloneTables != null) count = sourceStandaloneTables.StandaloneTableCount; for (int i = 0; i < count; ++i) { sourceStandaloneTable = sourceStandaloneTables.get_StandaloneTable(i); sourceDisplayTable = sourceStandaloneTable as IDisplayTable; if ((sourceStandaloneTable != null) && (sourceDisplayTable != null)) { // Add the table name to the combobox and the layer to the list cboInputData.Items.Add(sourceStandaloneTable.Name); m_listDisplayTable.Add(sourceDisplayTable); } } searchInterfaceUID.Value = typeof(INALayer).GUID.ToString("B"); sourceLayers = mapControl.Map.get_Layers(searchInterfaceUID, true); sourceLayer = sourceLayers.Next(); while (sourceLayer != null) { INALayer sourceNALayer = sourceLayer as INALayer; if (sourceNALayer != null) { sourceStandaloneTables = sourceNALayer as IStandaloneTableCollection; sourceStandaloneTable = null; sourceDisplayTable = null; count = 0; if (sourceStandaloneTables != null) count = sourceStandaloneTables.StandaloneTableCount; for (int i = 0; i < count; ++i) { sourceStandaloneTable = sourceStandaloneTables.get_StandaloneTable(i); sourceDisplayTable = sourceStandaloneTable as IDisplayTable; if ((sourceStandaloneTable != null) && (sourceDisplayTable != null)) { // Add the table name to the combobox and the layer to the list cboInputData.Items.Add(sourceStandaloneTable.Name); m_listDisplayTable.Add(sourceDisplayTable); } } } sourceLayer = sourceLayers.Next(); } } //Select the first display table from the list if (cboInputData.Items.Count > 0) cboInputData.SelectedIndex = 0; // Show the window this.ShowDialog(); // If we selected a layer and clicked OK, load the locations if (m_okClicked && (cboInputData.SelectedIndex >= 0)) { // Get a cursor on the source display table (either though the selection set or table) // Use IDisplayTable because it accounts for joins, querydefs, etc. // IDisplayTable is implemented by FeatureLayers and StandaloneTables. // IDisplayTable displayTable = m_listDisplayTable[cboInputData.SelectedIndex] as IDisplayTable; ICursor cursor; if (chkUseSelection.Checked) { ISelectionSet selSet; selSet = displayTable.DisplaySelectionSet; selSet.Search(null, false, out cursor); } else { cursor = displayTable.SearchDisplayTable(null, false); } // Setup NAClassLoader and Load Locations INAClassLoader2 naClassLoader = new NAClassLoader() as INAClassLoader2; naClassLoader.Initialize(naContext, naDataset.Name, cursor); // Avoid loading network locations onto non-traversable portions of elements INALocator3 locator = naContext.Locator as INALocator3; locator.ExcludeRestrictedElements = true; locator.CacheRestrictedElements(naContext); int rowsIn = 0; int rowsLocated = 0; naClassLoader.Load(cursor, null, ref rowsIn, ref rowsLocated); return true; } return false; } private void btnOK_Click(object sender, System.EventArgs e) { m_okClicked = true; this.Close(); } private void btnCancel_Click(object sender, System.EventArgs e) { m_okClicked = false; this.Close(); } private void cboInputData_SelectedIndexChanged(object sender, System.EventArgs e) { // Set the chkUseSelecteFeatures control based on if anything is selected or not if (cboInputData.SelectedIndex >= 0) { IDisplayTable displayTable = m_listDisplayTable[cboInputData.SelectedIndex] as IDisplayTable; chkUseSelection.Checked = (displayTable.DisplaySelectionSet.Count > 0); chkUseSelection.Enabled = (displayTable.DisplaySelectionSet.Count > 0); } } } }
[Visual Basic .NET]
frmLoadLocations.vb
Imports Microsoft.VisualBasic Imports System Imports System.Drawing Imports System.Collections Imports System.ComponentModel Imports System.Windows.Forms Imports ESRI.ArcGIS.Controls Imports ESRI.ArcGIS.Geodatabase Imports ESRI.ArcGIS.Carto Imports ESRI.ArcGIS.Geometry Imports ESRI.ArcGIS.NetworkAnalyst ' This form allows users to load locations from another point feature layer into the selected NALayer and active category. Namespace NAEngine ''' <summary> ''' Summary description for frmLoadLocations. ''' </summary> Public Class frmLoadLocations : Inherits System.Windows.Forms.Form Private WithEvents btnCancel As System.Windows.Forms.Button Private WithEvents btnOK As System.Windows.Forms.Button ''' <summary> ''' Required designer variable. ''' </summary> Private components As System.ComponentModel.Container = Nothing Private WithEvents cboInputData As System.Windows.Forms.ComboBox Private m_okClicked As Boolean Private WithEvents chkUseSelection As System.Windows.Forms.CheckBox Private WithEvents lblInputData As System.Windows.Forms.Label Private m_listDisplayTable As System.Collections.IList Public Sub New() ' ' Required for Windows Form Designer support ' InitializeComponent() End Sub ''' <summary> ''' Clean up any resources being used. ''' </summary> Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not components Is Nothing Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub #Region "Windows Form Designer generated code" ''' <summary> ''' Required method for Designer support - do not modify ''' the contents of this method with the code editor. ''' </summary> Private Sub InitializeComponent() Me.cboInputData = New System.Windows.Forms.ComboBox Me.btnCancel = New System.Windows.Forms.Button Me.btnOK = New System.Windows.Forms.Button Me.chkUseSelection = New System.Windows.Forms.CheckBox Me.lblInputData = New System.Windows.Forms.Label Me.SuspendLayout() ' 'cboInputData ' Me.cboInputData.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList Me.cboInputData.Location = New System.Drawing.Point(88, 16) Me.cboInputData.Name = "cboInputData" Me.cboInputData.Size = New System.Drawing.Size(352, 21) Me.cboInputData.TabIndex = 0 ' 'btnCancel ' Me.btnCancel.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) Me.btnCancel.Location = New System.Drawing.Point(328, 104) Me.btnCancel.Name = "btnCancel" Me.btnCancel.Size = New System.Drawing.Size(112, 32) Me.btnCancel.TabIndex = 6 Me.btnCancel.Text = "&Cancel" ' 'btnOK ' Me.btnOK.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) Me.btnOK.Location = New System.Drawing.Point(200, 104) Me.btnOK.Name = "btnOK" Me.btnOK.Size = New System.Drawing.Size(112, 32) Me.btnOK.TabIndex = 5 Me.btnOK.Text = "&OK" ' 'chkUseSelection ' Me.chkUseSelection.Location = New System.Drawing.Point(21, 43) Me.chkUseSelection.Name = "chkUseSelection" Me.chkUseSelection.Size = New System.Drawing.Size(419, 16) Me.chkUseSelection.TabIndex = 7 Me.chkUseSelection.Text = "Use Selection" ' 'lblInputData ' Me.lblInputData.Location = New System.Drawing.Point(18, 19) Me.lblInputData.Name = "lblInputData" Me.lblInputData.Size = New System.Drawing.Size(64, 24) Me.lblInputData.TabIndex = 8 Me.lblInputData.Text = "Input Data" ' 'frmLoadLocations ' Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13) Me.ClientSize = New System.Drawing.Size(456, 148) Me.Controls.Add(Me.lblInputData) Me.Controls.Add(Me.chkUseSelection) Me.Controls.Add(Me.btnCancel) Me.Controls.Add(Me.btnOK) Me.Controls.Add(Me.cboInputData) Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog Me.Name = "frmLoadLocations" Me.ShowInTaskbar = False Me.Text = "Load Locations" Me.ResumeLayout(False) End Sub #End Region Public Function ShowModal(ByVal mapControl As IMapControl3, ByVal naEnv As IEngineNetworkAnalystEnvironment) As Boolean ' Initialize variables m_okClicked = False m_listDisplayTable = New System.Collections.ArrayList() ' Get the NALayer and NAContext Dim naLayer As INALayer = naEnv.NAWindow.ActiveAnalysis Dim naContext As INAContext = naLayer.Context ' Get the active category Dim activeCategory As IEngineNAWindowCategory2 = TryCast(naEnv.NAWindow.ActiveCategory, IEngineNAWindowCategory2) If (activeCategory Is Nothing) Then Return False End If Dim naClass As INAClass = activeCategory.NAClass Dim naDataset As IDataset = TryCast(naClass, IDataset) Dim pDataLayer As IDataLayer = activeCategory.DataLayer Dim pLayer As ILayer = TryCast(pDataLayer, ILayer) Dim pFeatureLayer As IFeatureLayer = TryCast(pDataLayer, IFeatureLayer) Dim pStandaloneTable As IStandaloneTable = TryCast(pDataLayer, IStandaloneTable) Dim targetGeoType As esriGeometryType = esriGeometryType.esriGeometryNull Dim dataLayerName As String = "" If Not pFeatureLayer Is Nothing Then If (pLayer.Valid) Then Dim pFeatureClass As IFeatureClass = pFeatureLayer.FeatureClass If Not pFeatureClass Is Nothing Then targetGeoType = pFeatureClass.ShapeType dataLayerName = pLayer.Name End If End If ElseIf Not pStandaloneTable Is Nothing Then dataLayerName = pStandaloneTable.Name End If If dataLayerName.Length = 0 Then Return False End If Me.Text = "Load Items into " + dataLayerName ' Loop through all the sourcedisplayTables having targetGeoType to the combo box and the ' list of displayTables Dim sourceLayers As IEnumLayer = Nothing Dim sourceLayer As ILayer = Nothing Dim sourceDisplayTable As IDisplayTable = Nothing Dim searchInterfaceUID As ESRI.ArcGIS.esriSystem.UID = New ESRI.ArcGIS.esriSystem.UID() If targetGeoType <> esriGeometryType.esriGeometryNull Then searchInterfaceUID.Value = GetType(IFeatureLayer).GUID.ToString("B") sourceLayers = mapControl.Map.Layers(searchInterfaceUID, True) sourceLayer = sourceLayers.Next() While (Not sourceLayer Is Nothing) Dim sourceFeatureLayer As IFeatureLayer = TryCast(sourceLayer, IFeatureLayer) sourceDisplayTable = TryCast(sourceLayer, IDisplayTable) If ((Not sourceFeatureLayer Is Nothing) And (Not sourceDisplayTable Is Nothing)) Then Dim sourceFeatureClass As IFeatureClass = sourceFeatureLayer.FeatureClass Dim sourceGeoType As esriGeometryType = sourceFeatureClass.ShapeType If ((sourceGeoType = targetGeoType) Or (targetGeoType = esriGeometryType.esriGeometryPoint And sourceGeoType = esriGeometryType.esriGeometryMultipoint)) Then ' Add the layer name to the combobox and the layer to the list cboInputData.Items.Add(sourceLayer.Name) m_listDisplayTable.Add(sourceDisplayTable) End If End If sourceLayer = sourceLayers.Next() End While Else 'if (targetGeoType == esriGeometryType.esriGeometryNull) Dim sourceStandaloneTables As IStandaloneTableCollection = TryCast(mapControl.Map, IStandaloneTableCollection) Dim sourceStandaloneTable As IStandaloneTable = Nothing sourceDisplayTable = Nothing Dim count As Integer = 0 If Not sourceStandaloneTables Is Nothing Then count = sourceStandaloneTables.StandaloneTableCount End If For i As Integer = 0 To count - 1 Step 1 sourceStandaloneTable = sourceStandaloneTables.StandaloneTable(i) sourceDisplayTable = TryCast(sourceStandaloneTable, IDisplayTable) If ((Not sourceStandaloneTable Is Nothing) And (Not sourceDisplayTable Is Nothing)) Then ' Add the table name to the combobox and the layer to the list cboInputData.Items.Add(sourceStandaloneTable.Name) m_listDisplayTable.Add(sourceDisplayTable) End If Next searchInterfaceUID.Value = GetType(INALayer).GUID.ToString("B") sourceLayers = mapControl.Map.Layers(searchInterfaceUID, True) sourceLayer = sourceLayers.Next() While (Not sourceLayer Is Nothing) Dim sourceNALayer As INALayer = TryCast(sourceLayer, INALayer) If Not sourceNALayer Is Nothing Then sourceStandaloneTables = TryCast(sourceNALayer, IStandaloneTableCollection) sourceStandaloneTable = Nothing sourceDisplayTable = Nothing count = 0 If Not sourceStandaloneTables Is Nothing Then count = sourceStandaloneTables.StandaloneTableCount End If For i As Integer = 0 To count - 1 Step 1 sourceStandaloneTable = sourceStandaloneTables.StandaloneTable(i) sourceDisplayTable = TryCast(sourceStandaloneTable, IDisplayTable) If ((Not sourceStandaloneTable Is Nothing) And (Not sourceDisplayTable Is Nothing)) Then ' Add the table name to the combobox and the layer to the list cboInputData.Items.Add(sourceStandaloneTable.Name) m_listDisplayTable.Add(sourceDisplayTable) End If Next End If sourceLayer = sourceLayers.Next() End While End If 'Select the first point feature layer from the list If cboInputData.Items.Count > 0 Then cboInputData.SelectedIndex = 0 End If ' Show the window Me.ShowDialog() ' If we selected a layer and clicked OK, load the locations If m_okClicked AndAlso (cboInputData.SelectedIndex >= 0) Then ' Get a cursor on the source display table (either though the selection set or table) ' Use IDisplayTable because it accounts for joins, querydefs, etc. ' IDisplayTable is implemented by FeatureLayers and StandaloneTables. Dim displayTable As IDisplayTable = TryCast(m_listDisplayTable(cboInputData.SelectedIndex), IDisplayTable) Dim cursor As ICursor = Nothing If chkUseSelection.Checked Then Dim selSet As ISelectionSet selSet = displayTable.DisplaySelectionSet selSet.Search(Nothing, False, cursor) Else cursor = displayTable.SearchDisplayTable(Nothing, False) End If ' Setup NAClassLoader and Load Locations Dim naClassLoader As INAClassLoader2 = New NAClassLoader() naClassLoader.Initialize(naContext, naDataset.Name, cursor) ' Avoid loading network locations onto non-traversable portions of elements Dim locator As INALocator3 = TryCast(naContext.Locator, INALocator3) locator.ExcludeRestrictedElements = True locator.CacheRestrictedElements(naContext) Dim rowsIn As Integer = 0 Dim rowsLocated As Integer = 0 naClassLoader.Load(cursor, Nothing, rowsIn, rowsLocated) Return True Else Return False End If End Function Private Sub btnOK_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnOK.Click m_okClicked = True Me.Close() End Sub Private Sub btnCancel_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCancel.Click m_okClicked = False Me.Close() End Sub Private Sub cboPointLayers_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cboInputData.SelectedIndexChanged ' Set the chkUseSelecteFeatures control based on if anything is selected or not If cboInputData.SelectedIndex >= 0 Then Dim displayTable As IDisplayTable = TryCast(m_listDisplayTable(cboInputData.SelectedIndex), IDisplayTable) chkUseSelection.Checked = (displayTable.DisplaySelectionSet.Count > 0) chkUseSelection.Enabled = (displayTable.DisplaySelectionSet.Count > 0) End If End Sub End Class End Namespace