Subset network evaluators
SubsetNetworkEvaluatorsUI\AddSubsetAttributesCommand.vb
' Copyright 2012 ESRI
' 
' All rights reserved under the copyright laws of the United States
' and applicable international laws, treaties, and conventions.
' 
' You may freely redistribute and use this sample code, with or
' without modification, provided you include the original copyright
' notice and use restrictions.
' 
' See the use restrictions.
' 

Imports Microsoft.VisualBasic
Imports System
Imports System.Drawing
Imports System.Collections.Generic
Imports System.Runtime.InteropServices
Imports System.Windows.Forms
Imports ESRI.ArcGIS.ADF.BaseClasses
Imports ESRI.ArcGIS.ADF.CATIDs
Imports ESRI.ArcGIS.Framework
Imports ESRI.ArcGIS.esriSystem
Imports ESRI.ArcGIS.Geodatabase
Imports ESRI.ArcGIS.Catalog
Imports ESRI.ArcGIS.CatalogUI
Imports ESRI.ArcGIS.NetworkAnalystUI
Imports SubsetNetworkEvaluators

Namespace SubsetNetworkEvaluatorsUI
  ''' <summary>
  ''' The AddSubsetAttributesCommand is a context menu item automatically added to the ArcCatalog
  ''' Network Dataset context menu.  If the network analyst extension license is checked out
  ''' you can use this command to quickly add new attributes with default subset evaluator assignments
  ''' based on the attributes currently present in the context network dataset.  You can always just add
  ''' the attributes along with the necessary parameters and assign these evaluators manually using the
  ''' network dataset property pages instead of using this command.  The command is just a shortcut to quickly
  ''' set up some subset attributes with default parameters and assignments.
  ''' </summary>
  <Guid("E2B0245E-F707-4779-BEB3-9BA62D5325D6"), ClassInterface(ClassInterfaceType.None), ProgId("SubsetNetworkEvaluatorsUI.AddSubsetAttributesCommand")> _
  Public NotInheritable Class AddSubsetAttributesCommand : Inherits BaseCommand
#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)

      '
      ' TODO: Add any COM registration code here
      ''
    End Sub

    <ComUnregisterFunction(), ComVisible(False)> _
    Private Shared Sub UnregisterFunction(ByVal registerType As Type)
      ' Required for ArcGIS Component Category Registrar support
      ArcGISCategoryUnregistration(registerType)

      '
      ' TODO: Add any COM unregistration code here
      ''
    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)
      GxCommands.Register(regKey)
      GxNetworkDatasetContextMenuCommands.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)
      GxCommands.Unregister(regKey)
      GxNetworkDatasetContextMenuCommands.Unregister(regKey)
    End Sub

#End Region
#End Region

    Private m_application As IApplication = Nothing
    Private m_nax As INetworkAnalystExtension = Nothing

    Public Sub New()
      MyBase.m_category = "Network Analyst Samples" 'localizable text
      MyBase.m_caption = "Add Subset Attributes" 'localizable text
      MyBase.m_message = "Add Subset Attributes" 'localizable text
      MyBase.m_toolTip = "Add Subset Attributes" 'localizable text
      MyBase.m_name = "NASamples_AddSubsetAttributes"  'unique id, non-localizable (e.g. "MyCategory_ArcMapCommand")
    End Sub

#Region "Overridden Class Methods"

    ''' <summary>
    ''' Occurs when this command is created
    ''' </summary>
    ''' <param name="hook">Instance of the application</param>
    Public Overloads Overrides Sub OnCreate(ByVal hook As Object)
      If hook Is Nothing Then
        Return
      End If

      m_application = TryCast(hook, IApplication)
      m_nax = TryCast(SubsetHelperUI.GetNAXConfiguration(m_application), INetworkAnalystExtension)
    End Sub

    ''' <summary>
    ''' Occurs when this command is clicked
    ''' </summary>
    Public Overloads Overrides Sub OnClick()
      Dim gxApp As IGxApplication = TryCast(m_application, IGxApplication)
      Dim gxDataset As IGxDataset = Nothing
      Dim dsType As esriDatasetType = esriDatasetType.esriDTAny

      If Not gxApp Is Nothing Then
        gxDataset = TryCast(gxApp.SelectedObject, IGxDataset)
        dsType = gxDataset.Type
      End If

      If dsType <> esriDatasetType.esriDTNetworkDataset Then
        Return
      End If

      Dim ds As IDataset = gxDataset.Dataset
      If ds Is Nothing Then
        Return
      End If

      Dim nds As INetworkDataset = TryCast(ds, INetworkDataset)
      If nds Is Nothing Then
        Return
      End If

      If (Not nds.Buildable) Then
        Return
      End If

      Dim netBuild As INetworkBuild = TryCast(nds, INetworkBuild)
      If netBuild Is Nothing Then
        Return
      End If

      Dim dsComponent As IDatasetComponent = TryCast(nds, IDatasetComponent)
      Dim deNet As IDENetworkDataset = Nothing
      If Not dsComponent Is Nothing Then
        deNet = TryCast(dsComponent.DataElement, IDENetworkDataset)
      End If

      If deNet Is Nothing Then
        Return
      End If

      FilterSubsetEvaluator.RemoveFilterSubsetAttribute(deNet)
      ScaleSubsetEvaluator.RemoveScaleSubsetAttributes(deNet)

      FilterSubsetEvaluator.AddFilterSubsetAttribute(deNet)
      ScaleSubsetEvaluator.AddScaleSubsetAttributes(deNet)

      netBuild.UpdateSchema(deNet)
    End Sub

    Public Overloads Overrides ReadOnly Property Enabled() As Boolean
      Get
        Dim gxApp As IGxApplication = TryCast(m_application, IGxApplication)
        Dim gxDataset As IGxDataset = Nothing
        Dim dsType As esriDatasetType = esriDatasetType.esriDTAny

        Dim naxEnabled As Boolean = False
        Dim naxConfig As IExtensionConfig = TryCast(m_nax, IExtensionConfig)
        If Not naxConfig Is Nothing Then
          naxEnabled = naxConfig.State = esriExtensionState.esriESEnabled
        End If

        If naxEnabled Then
          If Not gxApp Is Nothing Then
            gxDataset = TryCast(gxApp.SelectedObject, IGxDataset)
            dsType = gxDataset.Type
          End If
        End If

        Return (dsType = esriDatasetType.esriDTNetworkDataset)
      End Get
    End Property

#End Region
  End Class
End Namespace