ArcObjects Library Reference  

NAClassToTextfileCmd

About the Export any network analysis class to a text file Sample

[C#]

NAClassToTextfileCmd.cs

using System;
using System.Drawing;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using ESRI.ArcGIS.ADF.BaseClasses;
using ESRI.ArcGIS.Framework;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.NetworkAnalyst;
using ESRI.ArcGIS.NetworkAnalystUI;

namespace ExportNAClass
{
	/// <summary>
	/// This sample command allows you export a text file version
	/// of the active class in the Network Analyst window after 
	/// completion of a successful solve.
	/// </summary>
	/// 
	[ClassInterface(ClassInterfaceType.None)]
	[Guid("08CE5834-8267-4a73-AFDD-2821B4B1F6EC")]
	[ProgId("ExportNAClass.NAClassToTextfileCmd")]
	public sealed class NAClassToTextfileCmd : BaseCommand, INAWindowCommand
	{
		private const string DELIMITER = "\t";
		private INetworkAnalystExtension m_naExt;

		public NAClassToTextfileCmd()
		{
			base.m_category = "Developer Samples";
			base.m_caption = "Export To text file...";
			base.m_message = "Export a network analysis class to a text file.";
			base.m_toolTip = "Export a network analysis class to a text file.";
			base.m_name = "NAClassToTextFileCmd";

			try
			{
				string bitmapResourceName = GetType().Name + ".bmp";
				base.m_bitmap = new Bitmap(GetType(), bitmapResourceName);
			}
			catch (Exception ex)
			{
				System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap");
			}
		}

		#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);
			// Register with NetworkAnalystWindowItemsCommand to get the 
			// command to show up when you right click on the class in the NAWindow
			ESRI.ArcGIS.ADF.CATIDs.NetworkAnalystWindowCategoryCommand.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.NetworkAnalystWindowCategoryCommand.Unregister(regKey);
		}

		#endregion

		#endregion

		#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

		#region "Overridden INAWindowCommand Methods"
		public bool Applies(INALayer naLayer, INAWindowCategory Category)
		{
			return true;
		}
		#endregion

		#region "Overridden BaseCommand Methods"
		public override void OnCreate(object hook)
		{
			// Try to get the network analyst extension from the desktop app's extensions
			IApplication app;
			app = hook as IApplication;
			if (app != null)
				m_naExt = app.FindExtensionByName("Network Analyst") as INetworkAnalystExtension;
		}

		/// <summary>
		/// This command will be enabled only for a NAClass
		/// associated with a successful solve
		/// </summary>
		public override bool Enabled
		{
			get
			{
				// there must be an active analysis layer
				INALayer naLayer = GetActiveAnalysisLayer();
				if (naLayer != null)
				{
					// the context must be valid
					INAContext naContext = naLayer.Context;
					if (naContext != null)
					{
						return true;
					}
				}
				return false;
			}
		}

		public override void OnClick()
		{
			try
			{
				ExportToText();
			}
			catch (Exception exception)
			{
				MessageBox.Show(exception.Message, "Error");
			}

		}
		#endregion

		private void ExportToText()
		{
			SaveFileDialog sfDialog = new SaveFileDialog();
			SetUpSaveDialog(ref sfDialog);
			// generate the dialog and verify the user successfully clicked save
			DialogResult dResult = sfDialog.ShowDialog();

			if (dResult == DialogResult.OK)
			{
				// set up the text file to be written
				FileInfo t = new FileInfo(sfDialog.FileName);
				StreamWriter swText = t.CreateText();

				ITable table = GetActiveCategory().DataLayer as ITable;

				// write the first line of the text file as column headers
				swText.WriteLine(GenerateColumnHeaderString(ref table));

				// iterate through the table associated with the class
				// to write out each line of data into the text file
				ICursor cursor = table.Search(null, true);
				IRow row = cursor.NextRow();
				while (row != null)
				{
					swText.WriteLine(GenerateDataString(ref row));
					row = cursor.NextRow();
				}
				swText.Close();
			}
		}

		private void SetUpSaveDialog(ref SaveFileDialog sfDialog)
		{
			sfDialog.AddExtension = true;
			sfDialog.Title = "Save an export of the specified class in the active analysis...";
			sfDialog.DefaultExt = "txt";
			sfDialog.OverwritePrompt = true;
			sfDialog.FileName = "ClassExport.txt";
			sfDialog.Filter = "Text files (*.txt;*.csv;*.asc;*.tab)|*.txt;*.tab;*.asc;*.csv";
			sfDialog.InitialDirectory = "c:\\";
		}

		private string GenerateColumnHeaderString(ref ITable table)
		{
			IField field = null;

			// export the names of the fields (tab delimited) as the first line of the export
			string fieldNames = "";
			for (int i = 0; i < table.Fields.FieldCount; i++)
			{
				field = table.Fields.get_Field(i);
				if (i > 0) fieldNames += DELIMITER;

				string columnName = field.Name.ToString();

				// point classes have a special output of X and Y, other classes just output "Shape"
				if (field.Type == esriFieldType.esriFieldTypeGeometry)
				{
					if (field.GeometryDef.GeometryType == esriGeometryType.esriGeometryPoint)
					{
						columnName = "X";
						columnName += DELIMITER;
						columnName += "Y";
					}
				}
				fieldNames += columnName;
			}
			return fieldNames;
		}

		private string GenerateDataString(ref IRow row)
		{
			string textOut = "";

			// On a zero-based index, iterate through the fields in the collection.
			for (int i = 0; i < row.Fields.FieldCount; i++)
			{
				if (i > 0) textOut += DELIMITER;
				IField field = row.Fields.get_Field(i);

				// for shape fields in a point layer, export the associated X and Y coordinates
				if (field.Type == esriFieldType.esriFieldTypeGeometry)
				{
					if (field.GeometryDef.GeometryType == esriGeometryType.esriGeometryPoint)
					{
						// x y location information must be retrieved from the Feature
						IPoint point = row.get_Value(i) as ESRI.ArcGIS.Geometry.Point;
						textOut += point.X.ToString();
						textOut += DELIMITER;
						textOut += point.Y.ToString();
					}
					else
					{
						textOut += "Shape";
					}
				}
				else
				{
					textOut += row.get_Value(i).ToString();
				}
			}
			return textOut;
		}
	}
}

[Visual Basic .NET]

NAClassToTextfileCmd.vb

Imports Microsoft.VisualBasic
Imports System
Imports System.IO
Imports System.Windows.Forms
Imports System.Drawing
Imports System.Runtime.InteropServices
Imports System.Reflection
Imports ESRI.ArcGIS.Framework
Imports ESRI.ArcGIS.NetworkAnalyst
Imports ESRI.ArcGIS.Carto
Imports ESRI.ArcGIS.Geometry
Imports ESRI.ArcGIS.Geodatabase
Imports ESRI.ArcGIS.NetworkAnalystUI

Namespace ExportNAClass
	''' <summary>
	''' This sample command allows you export a text file version
	''' of the active class in the Network Analyst window after 
	''' completion of a successful solve.
	''' </summary>
	''' 
	<ClassInterface(ClassInterfaceType.None), Guid("7C12A530-759A-4B12-9241-2215403483E8"), ProgId("ExportNAClass.NAClassToTextfileCmd")> _
	Public NotInheritable Class NAClassToTextfileCmd : Inherits ESRI.ArcGIS.ADF.BaseClasses.BaseCommand : Implements INAWindowCommand
		Private Const DELIMITER As String = Constants.vbTab
		Private m_naExt As INetworkAnalystExtension

		' set up the bitmap for the command icon
		<DllImport("gdi32.dll")> _
		Shared Function DeleteObject(ByVal hObject As IntPtr) As Boolean
		End Function
		Private Shadows m_bitmap As System.Drawing.Bitmap
		Private m_hBitmap As IntPtr

		Public Sub New()

			ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.Desktop)

			' set up the bitmap transparency
			Dim res As String() = Me.GetType().Assembly.GetManifestResourceNames()
			If res.GetLength(0) > 0 Then
				m_bitmap = New System.Drawing.Bitmap(Me.GetType().Assembly.GetManifestResourceStream(res(0)))
				If Not m_bitmap Is Nothing Then
					m_bitmap.MakeTransparent(m_bitmap.GetPixel(0, 0))
					m_hBitmap = m_bitmap.GetHbitmap()
				End If
			End If
		End Sub

		Protected Overrides Sub Finalize()
			If m_hBitmap.ToInt32() <> 0 Then
				DeleteObject(m_hBitmap)
			End If
		End Sub

#Region "Component Category Registration"
		<ComRegisterFunction()> _
		Private Shared Sub Reg(ByVal regKey As String)
			ESRI.ArcGIS.ADF.CATIDs.ControlsCommands.Register(regKey)
			ESRI.ArcGIS.ADF.CATIDs.MxCommands.Register(regKey)
			' Register with NetworkAnalystWindowCategoryCommand to get the 
			' command to show up when you right click on the class in the NAWindow
			ESRI.ArcGIS.ADF.CATIDs.NetworkAnalystWindowCategoryCommand.Register(regKey)
		End Sub

		<ComUnregisterFunction()> _
		Private Shared Sub Unreg(ByVal regKey As String)
			ESRI.ArcGIS.ADF.CATIDs.ControlsCommands.Unregister(regKey)
			ESRI.ArcGIS.ADF.CATIDs.MxCommands.Unregister(regKey)
		End Sub
#End Region

#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
			' Remove the next 2 lines for an engine only install
			If Not m_naExt Is Nothing Then
				Return TryCast(m_naExt.NAWindow.ActiveCategory, INAWindowCategory2)
			Else
				Return Nothing
			End If
		End Function
#End Region

#Region "Overridden BaseCommand Methods"
		Public Overrides Sub OnCreate(ByVal hook As Object)
			' Try to get the network analyst extension from the desktop app's extensions
			Dim app As IApplication
			app = TryCast(hook, IApplication)
			If Not app Is Nothing Then
				m_naExt = TryCast(app.FindExtensionByName("Network Analyst"), INetworkAnalystExtension)
			End If
		End Sub

		''' <summary>
		''' This command will be enabled only for a NAClass
		''' associated with a successful solve
		''' </summary>
		Public Overrides ReadOnly Property Enabled() As Boolean
			Get
				' there must be an active analysis layer
				Dim naLayer As INALayer = GetActiveAnalysisLayer()
				If Not naLayer Is Nothing Then
					' the context must be valid
					Dim naContext As INAContext = naLayer.Context
					If Not naContext Is Nothing Then
						Return True
					End If
				End If
				Return False
			End Get
		End Property

		Public Overrides ReadOnly Property Message() As String
			Get
				Return "Export a network analysis class to a text file."
			End Get
		End Property

		Public Overrides ReadOnly Property Bitmap() As Integer
			Get
				Return m_hBitmap.ToInt32()
			End Get
		End Property

		Public Overrides ReadOnly Property Tooltip() As String
			Get
				Return "Export a network analysis class to a text file."
			End Get
		End Property

		Public Overrides ReadOnly Property Name() As String
			Get
				Return "NAClassToTextFileCmd"
			End Get
		End Property

		Public Overrides ReadOnly Property Caption() As String
			Get
				Return "Export To text file..."
			End Get
		End Property

		Public Overrides ReadOnly Property Category() As String
			Get
				Return "Developer Samples"
			End Get
		End Property

		Public Overrides Sub OnClick()
			Try
				ExportToText()
			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 ESRI.ArcGIS.NetworkAnalystUI.INAWindowCommand.Applies
			Return True
		End Function
#End Region

		Private Sub ExportToText()
			Dim sfDialog As SaveFileDialog = New SaveFileDialog()
			SetUpSaveDialog(sfDialog)
			' generate the dialog and verify the user successfully clicked save
			Dim dResult As DialogResult = sfDialog.ShowDialog()

			If dResult = System.Windows.Forms.DialogResult.OK Then
				' set up the text file to be written
				Dim t As FileInfo = New FileInfo(sfDialog.FileName)
				Dim swText As StreamWriter = t.CreateText()

				Dim table As ITable = TryCast(GetActiveCategory().DataLayer, ITable)

				' write the first line of the text file as column headers
				swText.WriteLine(GenerateColumnHeaderString(table))

				' iterate through the table associated with the class
				' to write out each line of data into the text file
				Dim cursor As ICursor = table.Search(Nothing, True)
				Dim row As IRow = cursor.NextRow()
				Do While Not row Is Nothing
					swText.WriteLine(GenerateDataString(row))
					row = cursor.NextRow()
				Loop
				swText.Close()
			End If
		End Sub

		Private Sub SetUpSaveDialog(ByRef sfDialog As SaveFileDialog)
			sfDialog.AddExtension = True
			sfDialog.Title = "Save an export of the specified class in the active analysis..."
			sfDialog.DefaultExt = "txt"
			sfDialog.OverwritePrompt = True
			sfDialog.FileName = "ClassExport.txt"
			sfDialog.Filter = "Text files (*.txt;*.csv;*.asc;*.tab)|*.txt;*.tab;*.asc;*.csv"
			sfDialog.InitialDirectory = "c:\"
		End Sub

		Private Function GenerateColumnHeaderString(ByRef table As ITable) As String
			Dim field As IField = Nothing

			' export the names of the fields (tab delimited) as the first line of the export
			Dim fieldNames As String = ""
			Dim i As Integer = 0
			Do While i < table.Fields.FieldCount
				field = table.Fields.Field(i)
				If i > 0 Then
					fieldNames &= DELIMITER
				End If

				Dim columnName As String = field.Name.ToString()

				' point classes have a special output of X and Y, other classes just output "Shape"
				If field.Type = esriFieldType.esriFieldTypeGeometry Then
					If field.GeometryDef.GeometryType = esriGeometryType.esriGeometryPoint Then
						columnName = "X"
						columnName &= DELIMITER
						columnName &= "Y"
					End If
				End If
				fieldNames &= columnName
				i += 1
			Loop
			Return fieldNames
		End Function

		Private Function GenerateDataString(ByRef row As IRow) As String
			Dim textOut As String = ""

			' On a zero-based index, iterate through the fields in the collection.
			Dim i As Integer = 0
			Do While i < row.Fields.FieldCount
				If i > 0 Then
					textOut &= DELIMITER
				End If
				Dim field As IField = row.Fields.Field(i)

				' for shape fields in a point layer, export the associated X and Y coordinates
				If field.Type = esriFieldType.esriFieldTypeGeometry Then
					If field.GeometryDef.GeometryType = esriGeometryType.esriGeometryPoint Then
						' x y location information must be retrieved from the Feature
						Dim point As IPoint = TryCast(row.Value(i), ESRI.ArcGIS.Geometry.Point)
						textOut &= point.X.ToString()
						textOut &= DELIMITER
						textOut &= point.Y.ToString()
					Else
						textOut &= "Shape"
					End If
				Else
					textOut &= row.Value(i).ToString()
				End If
				i += 1
			Loop
			Return textOut
		End Function
	End Class
End Namespace