Exemplo n.º 1
0
        public bool ShowModal(INALayer naLayer)
        {
            m_okClicked = false;

            // Get the NAContext and NetworkDataset
            INAContext      naContext      = naLayer.Context;
            INetworkDataset networkDataset = naContext.NetworkDataset;

            // Setup the window based on the current NALayer settings
            PopulateControls(naLayer);
            tabPropPages.SelectedIndex = 1;
            this.Text = ((ILayer)naLayer).Name + " Properties";

            this.ShowDialog();
            if (m_okClicked)
            {
                // Update the layer properties based on the items chosen
                UpdateNALayer(naLayer);

                // Update the Context so it can respond to changes made to the solver settings
                IGPMessages       gpMessages       = new GPMessagesClass();
                IDENetworkDataset deNetworkDataset = ((IDatasetComponent)networkDataset).DataElement as IDENetworkDataset;
                naContext.Solver.UpdateContext(naContext, deNetworkDataset, gpMessages);
            }

            return(m_okClicked);
        }
Exemplo n.º 2
0
        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>();
        }
Exemplo n.º 3
0
        private INALayer CreateRouteAnalysisLayer(string sName, INetworkDataset pNetworkDataset)
        {
            INARouteSolver    solver   = new NARouteSolverClass();
            INASolverSettings settings = solver as INASolverSettings;
            INASolver         solver2  = solver as INASolver;

            solver.FindBestSequence  = true;
            solver.PreserveFirstStop = true;
            solver.PreserveLastStop  = false;
            solver.UseTimeWindows    = false;
            solver.OutputLines       = esriNAOutputLineType.esriNAOutputLineTrueShapeWithMeasure;
            IStringArray restrictionAttributeNames = settings.RestrictionAttributeNames;

            restrictionAttributeNames.Add("Oneway");
            settings.RestrictionAttributeNames = restrictionAttributeNames;
            IDatasetComponent component   = pNetworkDataset as IDatasetComponent;
            IDENetworkDataset dataElement = component.DataElement as IDENetworkDataset;
            INAContext        context     = solver2.CreateContext(dataElement, sName);

            (context as INAContextEdit).Bind(pNetworkDataset, new GPMessagesClass());
            INALayer layer = solver2.CreateLayer(context);

            (layer as ILayer).Name = sName;
            return(layer);
        }
        /// <summary>
        /// When the solver has been update, the context must be updated as well
        /// </summary>
        private void UpdateContextAfterChangingSettings()
        {
            IDatasetComponent datasetComponent = m_NAContext.NetworkDataset as IDatasetComponent;
            IDENetworkDataset deNetworkDataset = datasetComponent.DataElement as IDENetworkDataset;

            m_NAContext.Solver.UpdateContext(m_NAContext, deNetworkDataset, new GPMessagesClass());
        }
Exemplo n.º 5
0
        public INAContext CreateSolverContext(INetworkDataset pNetDataset)
        {
            IDENetworkDataset dENetworkDataset = this.GetDENetworkDataset(pNetDataset);
            INASolver         solver           = new NAClosestFacilitySolverClass();
            INAContextEdit    edit             = solver.CreateContext(dENetworkDataset, solver.Name) as INAContextEdit;

            edit.Bind(pNetDataset, new GPMessagesClass());
            return(edit as INAContext);
        }
        public void Initialize(INetworkDataset networkDataset, IDENetworkDataset DataElement, INetworkSource netSource, IEvaluatedNetworkAttribute netAttribute)
        {
            // Initialize is called once per session (ArcMap session, ArcCatalog session, etc.) to initialize the evaluator for an associated network dataset
            m_networkDataset   = networkDataset;
            m_networkSource    = netSource;
            m_networkAttribute = netAttribute;

            Refresh();
        }
Exemplo n.º 7
0
        private INAContext CreateSolverContext(INetworkDataset networkDataset)
        {
            IDENetworkDataset dENetworkDataset = GetDENetworkDataset(networkDataset);
            INASolver         nASolver         = new NARouteSolver();
            INAContextEdit    nAContextEdit    = nASolver.CreateContext(dENetworkDataset, nASolver.Name) as INAContextEdit;

            nAContextEdit.Bind(networkDataset, null);
            return(nAContextEdit as INAContext);
        }
        /// <summary>
        ///  根据网络数据集创建网络分析上下文
        /// </summary>
        /// <param name="networkDataset"></param>
        /// <returns></returns>
        private static INAContext CreateNAContext(INetworkDataset networkDataset)
        {
            IDENetworkDataset pDENetworkDataset = GetDENetworkDataset(networkDataset);
            INASolver         pNASolver         = new NARouteSolverClass();
            INAContextEdit    pNAContextEdit    = pNASolver.CreateContext(pDENetworkDataset, pNASolver.Name) as INAContextEdit;

            pNAContextEdit.Bind(networkDataset, new GPMessagesClass());
            return(pNAContextEdit as INAContext);
        }
		/// <summary>
		/// Create NASolver and NAContext
		/// </summary>
		/// <param name="networkDataset">Input network dataset</param>
		/// <returns>NAContext</returns>
		public INAContext CreateSolverContext(INetworkDataset networkDataset)
		{
			//Get the data element
			IDENetworkDataset deNDS = GetDENetworkDataset(networkDataset);
			INASolver naSolver = new NAODCostMatrixSolver();
			INAContextEdit contextEdit = naSolver.CreateContext(deNDS, naSolver.Name) as INAContextEdit;
			//Bind a context using the network dataset 
			contextEdit.Bind(networkDataset, new GPMessagesClass());

			return contextEdit as INAContext;
		}
        //*********************************************************************************
        // ArcGIS Network Analyst extension functions
        // ********************************************************************************

        //*********************************************************************************
        // Create NASolver and NAContext
        //*********************************************************************************
        public INAContext CreateSolverContext(INetworkDataset networkDataset)
        {
            //Get the Data Element
            IDENetworkDataset deNDS = GetDENetworkDataset(networkDataset);

            INASolver      naSolver    = new NALocationAllocationSolverClass();
            INAContextEdit contextEdit = naSolver.CreateContext(deNDS, naSolver.Name) as INAContextEdit;

            contextEdit.Bind(networkDataset, new GPMessagesClass());
            return(contextEdit as INAContext);
        }
Exemplo n.º 11
0
        //创建网络分析上下文
        public static INAContext CreatePathSolverContext(INetworkDataset networkDataset)
        {
            IDENetworkDataset deNDS = GetPathDENetworkDataset(networkDataset);
            INASolver         naSolver;

            naSolver = new NARouteSolver();
            INAContextEdit contextEdit = naSolver.CreateContext(deNDS, naSolver.Name) as INAContextEdit;

            contextEdit.Bind(networkDataset, new GPMessagesClass());
            return(contextEdit as INAContext);
        }
Exemplo n.º 12
0
        /// <summary>
        /// 创建网络分析上下文
        /// </summary>
        public INAContext CreateSolverContext(INetworkDataset networkDataset)
        {
            //获取创建网络分析上下文所需的IDENETWORKDATASET类型参数
            IDENetworkDataset deNDS = GetDENetworkDataset(networkDataset);
            INASolver         naSolver;

            naSolver = new NARouteSolver();
            INAContextEdit contextEdit = naSolver.CreateContext(deNDS, naSolver.Name) as INAContextEdit;

            contextEdit.Bind(networkDataset, new GPMessagesClass());
            return(contextEdit as INAContext);
        }
Exemplo n.º 13
0
        //创建网络分析上下文
        public static INAContext CreatePathSolverContext(INetworkDataset networkDataset)
        {
            IDENetworkDataset deNDS = GetPathDENetworkDataset(networkDataset);
            INASolver         naSolver;

            naSolver = new NARouteSolver();
            INAContextEdit contextEdit = naSolver.CreateContext(deNDS, naSolver.DisplayName) as INAContextEdit;

            contextEdit.Bind(networkDataset, new GPMessagesClass());//将网络数据集与网络上下文对象绑定在一起
            //GPMessagesClass对象用于记录错误信息。
            return(contextEdit as INAContext);
        }
        public static IEvaluatedNetworkAttribute AddScaleSubsetAttribute(IDENetworkDataset deNet, INetworkAttribute2 baseNetAttribute)
        {
            if (baseNetAttribute == null)
            {
                return(null);
            }

            if (baseNetAttribute.UsageType != esriNetworkAttributeUsageType.esriNAUTCost)
            {
                return(null);
            }

            IArray netAttributes = deNet.Attributes;
            IEvaluatedNetworkAttribute netAttribute = new EvaluatedNetworkAttributeClass() as IEvaluatedNetworkAttribute;

            string netAttributeName = BaseParameterName;

            netAttributeName += "_";
            netAttributeName += baseNetAttribute.Name;

            netAttribute.Name      = netAttributeName;
            netAttribute.UsageType = baseNetAttribute.UsageType;
            netAttribute.DataType  = baseNetAttribute.DataType;
            netAttribute.Units     = baseNetAttribute.Units;

            List <INetworkSource> allNetSources  = SubsetHelper.GetSourceList(deNet.Sources);
            List <INetworkSource> netSources     = SubsetHelper.GetSourceList(allNetSources, esriNetworkElementType.esriNETEdge);
            List <string>         netSourceNames = SubsetHelper.GetSourceNames(netSources);

            ResetScaleSubsetParameters((INetworkAttribute2)netAttribute, netSourceNames);

            bool supportTurns = deNet.SupportsTurns;

            //default evaluators
            SubsetHelper.SetDefaultEvaluator(netAttribute, 0, esriNetworkElementType.esriNETEdge);
            SubsetHelper.SetDefaultEvaluator(netAttribute, 0, esriNetworkElementType.esriNETJunction);
            if (supportTurns)
            {
                SubsetHelper.SetDefaultEvaluator(netAttribute, 0, esriNetworkElementType.esriNETTurn);
            }

            //sourced evaluators
            foreach (INetworkSource netSource in netSources)
            {
                SubsetHelper.SetEvaluators(netAttribute, netSource, typeof(ScaleSubsetEvaluator));
            }

            netAttributes.Add(netAttribute);
            deNet.Attributes = netAttributes;

            return(netAttribute);
        }
        public static List <IEvaluatedNetworkAttribute> AddScaleSubsetAttributes(IDENetworkDataset deNet)
        {
            List <IEvaluatedNetworkAttribute> scaleSubsetAttributes = new List <IEvaluatedNetworkAttribute>();

            IArray     netAttributesArray = deNet.Attributes;
            List <int> baseIndexes        = SubsetHelper.FindAttributeIndexes(netAttributesArray, esriNetworkAttributeUsageType.esriNAUTCost, esriNetworkAttributeDataType.esriNADTDouble, true, false);
            List <INetworkAttribute2> baseNetAttributes = SubsetHelper.FindAttributes(netAttributesArray, baseIndexes);

            foreach (INetworkAttribute2 baseNetAttribute in baseNetAttributes)
            {
                scaleSubsetAttributes.Add(AddScaleSubsetAttribute(deNet, baseNetAttribute));
            }

            return(scaleSubsetAttributes);
        }
Exemplo n.º 16
0
        /// <summary>
        /// Create NASolver and NAContext
        /// </summary>
        /// <param name="networkDataset">Input network dataset</param>
        /// <returns>NAContext</returns>
        public void CreateSolverContext(INetworkDataset networkDataset)
        {
            if (networkDataset == null)
            {
                return;
            }

            //Get the Data Element
            IDENetworkDataset deNDS = GetDENetworkDataset(networkDataset);

            INASolver naSolver = new NAClosestFacilitySolver();

            m_NAContext = naSolver.CreateContext(deNDS, naSolver.Name);
            ((INAContextEdit)m_NAContext).Bind(networkDataset, new GPMessagesClass());
        }
        public void Initialize(INetworkDataset networkDataset, IDENetworkDataset dataElement, INetworkSource source, IEvaluatedNetworkAttribute evaluatedNetworkAttribute)
        {
            // Cache the network dataset geodatabase path
            m_workspace_path_name = ((IDataset)networkDataset).Workspace.PathName;
            m_UseSpecificDates    = false;
            m_CacheOnEverySolve   = false;
            m_RidingABicycle      = false;
            m_UsingAWheelchair    = false;
            m_networkAttribute    = evaluatedNetworkAttribute as INetworkAttribute2;

            CheckForVerboseLogging();
            if (m_VerboseLogging)
            {
                WriteToOutputFile(m_LogFile, "Initialize" + Environment.NewLine + "m_workspace_path_name: " + m_workspace_path_name + Environment.NewLine + " m_UseSpecificDates defaults to: " + m_UseSpecificDates);
            }
        }
        public void Initialize(INetworkDataset networkDataset, IDENetworkDataset DataElement, INetworkSource netSource, IEvaluatedNetworkAttribute netAttribute)
        {
            // Initialize is called once per session (ArcMap session, ArcCatalog session, etc.) to initialize the evaluator for an associated network dataset
            m_networkDataset   = networkDataset;
            m_networkSource    = netSource;
            m_networkAttribute = netAttribute;

            m_thisNetworkAttributeID = netAttribute.ID;
            m_baseNetworkAttributeID = -1;

            //The attribute name must begin with one or more non underscore characters followed by
            //an underscore character and then the name of the base cost attribute.
            //The underscore prior to the base attribute name should be the first underscore in the name.

            string thisAttributeName = netAttribute.Name;
            int    nPos     = thisAttributeName.IndexOf('_');
            int    nLastPos = thisAttributeName.Length - 1;

            string            baseNetAttributeName;
            INetworkAttribute baseNetAttribute = null;

            if (nPos > 0 && nPos < nLastPos)
            {
                baseNetAttributeName = thisAttributeName.Remove(0, nPos + 1);
                try
                {
                    baseNetAttribute = networkDataset.get_AttributeByName(baseNetAttributeName);
                }
                catch (COMException ex)
                {
                    baseNetAttribute = null;
                    string msg = string.Format("Base Attribute ({0}) not found. {1}.", baseNetAttributeName, ex.Message);
                    System.Diagnostics.Trace.WriteLine(msg, "Scale Subset Network Evaluator");
                }

                if (baseNetAttribute != null)
                {
                    if (baseNetAttribute.ID != m_thisNetworkAttributeID)
                    {
                        m_baseNetworkAttributeID = baseNetAttribute.ID;
                    }
                }
            }

            Refresh();
        }
Exemplo n.º 19
0
        private void CreateContextAndSolver(INetworkDataset networkDataset)
        {
            if (networkDataset == null)
            {
                return;
            }

            IDatasetComponent datasetComponent = networkDataset as IDatasetComponent;
            IDENetworkDataset deNetworkDataset = datasetComponent.DataElement as IDENetworkDataset;

            INASolver naSolver = new NAServiceAreaSolverClass();

            m_naContext = naSolver.CreateContext(deNetworkDataset, "ServiceArea");
            INAContextEdit naContextEdit = m_naContext as INAContextEdit;

            naContextEdit.Bind(networkDataset, new GPMessagesClass());
        }
Exemplo n.º 20
0
        /// <summary>
        /// Create a new network analysis layer and set some solver settings
        /// </summary>
        private INALayer CreateRouteAnalysisLayer(String layerName, INetworkDataset networkDataset)
        {
            INARouteSolver    naRouteSolver    = new NARouteSolverClass();
            INASolverSettings naSolverSettings = naRouteSolver as INASolverSettings;
            INASolver         naSolver         = naRouteSolver as INASolver;

            //Get the NetworkDataset's Data Element
            IDatasetComponent datasetComponent = networkDataset as IDatasetComponent;
            IDENetworkDataset deNetworkDataset = datasetComponent.DataElement as IDENetworkDataset;

            //Create the NAContext and bind to it
            INAContext naContext;

            naContext = naSolver.CreateContext(deNetworkDataset, layerName);
            INAContextEdit naContextEdit = naContext as INAContextEdit;

            naContextEdit.Bind(networkDataset, new GPMessagesClass());

            //Create the NALayer
            INALayer naLayer;

            naLayer = naSolver.CreateLayer(naContext);
            (naLayer as ILayer).Name = layerName;

            //Set properties on the route solver interface
            naRouteSolver.FindBestSequence  = true;
            naRouteSolver.PreserveFirstStop = true;
            naRouteSolver.PreserveLastStop  = false;
            naRouteSolver.UseTimeWindows    = false;
            naRouteSolver.OutputLines       = esriNAOutputLineType.esriNAOutputLineTrueShapeWithMeasure;

            //Set some properties on the general INASolverSettings interface
            IStringArray restrictions = naSolverSettings.RestrictionAttributeNames;

            restrictions.Add("Oneway");
            naSolverSettings.RestrictionAttributeNames = restrictions;

            // Update the context based on the changes made to the solver settings
            naSolver.UpdateContext(naContext, deNetworkDataset, new GPMessagesClass());

            //Return the layer
            return(naLayer);
        }
Exemplo n.º 21
0
		public INAContext CreateRouteSolverContext(INetworkDataset pNetDataset)
		{
			
			INAContextEdit pContextEdit;
			IDENetworkDataset pDENDS= GetDENetworkDataset(pNetDataset);
			INASolver pNASolver=(new NARouteSolverClass()) as INASolver;

			pContextEdit = pNASolver.CreateContext(pDENDS, "Route") as INAContextEdit;

			pContextEdit.Bind(pNetDataset,new GPMessagesClass());



			return pContextEdit as INAContext;
			
			


		}
        public static IEvaluatedNetworkAttribute AddFilterSubsetAttribute(IDENetworkDataset deNet)
        {
            IArray netAttributes = deNet.Attributes;
            IEvaluatedNetworkAttribute netAttribute = new EvaluatedNetworkAttributeClass() as IEvaluatedNetworkAttribute;

            netAttribute.Name      = BaseParameterName;
            netAttribute.UsageType = esriNetworkAttributeUsageType.esriNAUTRestriction;
            netAttribute.DataType  = esriNetworkAttributeDataType.esriNADTBoolean;
            netAttribute.Units     = esriNetworkAttributeUnits.esriNAUUnknown;

            INetworkAttribute2 netAttribute2 = netAttribute as INetworkAttribute2;

            netAttribute2.UseByDefault = true;

            List <INetworkSource> allNetSources  = SubsetHelper.GetSourceList(deNet.Sources);
            List <INetworkSource> netSources     = SubsetHelper.GetSourceList(allNetSources, esriNetworkElementType.esriNETEdge);
            List <string>         netSourceNames = SubsetHelper.GetSourceNames(netSources);

            ResetFilterSubsetParameters((INetworkAttribute2)netAttribute, netSourceNames);

            bool supportTurns = deNet.SupportsTurns;

            //default evaluators
            SubsetHelper.SetDefaultEvaluator(netAttribute, false, esriNetworkElementType.esriNETEdge);
            SubsetHelper.SetDefaultEvaluator(netAttribute, false, esriNetworkElementType.esriNETJunction);
            if (supportTurns)
            {
                SubsetHelper.SetDefaultEvaluator(netAttribute, false, esriNetworkElementType.esriNETTurn);
            }

            //sourced evaluators
            foreach (INetworkSource netSource in netSources)
            {
                SubsetHelper.SetEvaluators(netAttribute, netSource, typeof(FilterSubsetEvaluator));
            }

            netAttributes.Add(netAttribute);
            deNet.Attributes = netAttributes;

            return(netAttribute);
        }
Exemplo n.º 23
0
        public static INALayer CreateNetworkAnalysisLayer(string name, INetworkDataset networkDataset,
                                                          INASolver naSolver)
        {
            if (naSolver is INARouteSolver)
            {
                return(CreateRouteAnalysisLayer(name, networkDataset, naSolver as INARouteSolver));
            }
            if (naSolver is INAClosestFacilitySolver)
            {
                return(CreateClosestFacilityLayer(name, networkDataset, naSolver as INAClosestFacilitySolver));
            }
            IDatasetComponent component   = (IDatasetComponent)networkDataset;
            IDENetworkDataset dataElement = (IDENetworkDataset)component.DataElement;
            INAContext        context     = naSolver.CreateContext(dataElement, name);

            ((INAContextEdit)context).Bind(networkDataset, null);
            INALayer layer = naSolver.CreateLayer(context);

            ((ILayer)layer).Name = name;
            return(layer);
        }
Exemplo n.º 24
0
        public static INALayer CreateClosestFacilityLayer(string layerName, INetworkDataset networkDataset,
                                                          INAClosestFacilitySolver naClosesFacilitySolver)
        {
            INASolverSettings settings    = naClosesFacilitySolver as INASolverSettings;
            INASolver         solver      = naClosesFacilitySolver as INASolver;
            IDatasetComponent component   = networkDataset as IDatasetComponent;
            IDENetworkDataset dataElement = component.DataElement as IDENetworkDataset;
            INAContext        context     = solver.CreateContext(dataElement, layerName);

            (context as INAContextEdit).Bind(networkDataset, new GPMessagesClass());
            INALayer layer = solver.CreateLayer(context);

            (layer as ILayer).Name = layerName;
            naClosesFacilitySolver.CreateTraversalResult = true;
            naClosesFacilitySolver.TravelDirection       = esriNATravelDirection.esriNATravelDirectionFromFacility;
            naClosesFacilitySolver.OutputLines           = esriNAOutputLineType.esriNAOutputLineTrueShapeWithMeasure;
            IStringArray restrictionAttributeNames = settings.RestrictionAttributeNames;

            restrictionAttributeNames.Add("Oneway");
            settings.RestrictionAttributeNames = restrictionAttributeNames;
            solver.UpdateContext(context, dataElement, new GPMessagesClass());
            return(layer);
        }
		public static void RemoveScaleSubsetAttributes(IDENetworkDataset deNet)
		{
			IArray netAttributes = SubsetHelper.RemoveAttributesByPrefix(deNet.Attributes, BaseParameterName);
			deNet.Attributes = netAttributes;
		}
        public static void RemoveScaleSubsetAttributes(IDENetworkDataset deNet)
        {
            IArray netAttributes = SubsetHelper.RemoveAttributesByPrefix(deNet.Attributes, BaseParameterName);

            deNet.Attributes = netAttributes;
        }
        /// <summary>
        /// Occurs when this command is clicked
        /// </summary>
        public override void OnClick()
        {
            IGxApplication  gxApp     = m_application as IGxApplication;
            IGxDataset      gxDataset = null;
            esriDatasetType dsType    = esriDatasetType.esriDTAny;

            if (gxApp != null)
            {
                gxDataset = gxApp.SelectedObject as IGxDataset;
                dsType    = gxDataset.Type;
            }

            if (dsType != esriDatasetType.esriDTNetworkDataset)
            {
                return;
            }

            IDataset ds = gxDataset.Dataset;

            if (ds == null)
            {
                return;
            }

            INetworkDataset nds = ds as INetworkDataset;

            if (nds == null)
            {
                return;
            }

            if (!nds.Buildable)
            {
                return;
            }

            INetworkBuild netBuild = nds as INetworkBuild;

            if (netBuild == null)
            {
                return;
            }

            IDatasetComponent dsComponent = nds as IDatasetComponent;
            IDENetworkDataset deNet       = null;

            if (dsComponent != null)
            {
                deNet = dsComponent.DataElement as IDENetworkDataset;
            }

            if (deNet == null)
            {
                return;
            }

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

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

            netBuild.UpdateSchema(deNet);
        }
		public static void RemoveFilterSubsetAttribute(IDENetworkDataset deNet)
		{
			IArray netAttributes = SubsetHelper.RemoveAttributesByPrefix(deNet.Attributes, "Filter");
			deNet.Attributes = netAttributes;
		}
		public static IEvaluatedNetworkAttribute AddFilterSubsetAttribute(IDENetworkDataset deNet)
		{
			IArray netAttributes = deNet.Attributes;
			IEvaluatedNetworkAttribute netAttribute = new EvaluatedNetworkAttributeClass() as IEvaluatedNetworkAttribute;

			netAttribute.Name = BaseParameterName;
			netAttribute.UsageType = esriNetworkAttributeUsageType.esriNAUTRestriction;
			netAttribute.DataType = esriNetworkAttributeDataType.esriNADTBoolean;
			netAttribute.Units = esriNetworkAttributeUnits.esriNAUUnknown;

			INetworkAttribute2 netAttribute2 = netAttribute as INetworkAttribute2;
			netAttribute2.UseByDefault = true;

			List<INetworkSource> allNetSources = SubsetHelper.GetSourceList(deNet.Sources);
			List<INetworkSource> netSources = SubsetHelper.GetSourceList(allNetSources, esriNetworkElementType.esriNETEdge);
			List<string> netSourceNames = SubsetHelper.GetSourceNames(netSources);

			ResetFilterSubsetParameters((INetworkAttribute2)netAttribute, netSourceNames);

			bool supportTurns = deNet.SupportsTurns;

			//default evaluators
			SubsetHelper.SetDefaultEvaluator(netAttribute, false, esriNetworkElementType.esriNETEdge);
			SubsetHelper.SetDefaultEvaluator(netAttribute, false, esriNetworkElementType.esriNETJunction);
			if (supportTurns)
				SubsetHelper.SetDefaultEvaluator(netAttribute, false, esriNetworkElementType.esriNETTurn);

			//sourced evaluators
			foreach (INetworkSource netSource in netSources)
				SubsetHelper.SetEvaluators(netAttribute, netSource, typeof(FilterSubsetEvaluator));

			netAttributes.Add(netAttribute);
			deNet.Attributes = netAttributes;

			return netAttribute;
		}
		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 static void PushParameterValuesToNetwork(INetworkAnalystExtension nax)
        {
            try
            {
                if (nax == null)
                {
                    return;
                }

                bool             naxEnabled = false;
                IExtensionConfig naxConfig  = nax as IExtensionConfig;
                naxEnabled = naxConfig.State == esriExtensionState.esriESEnabled;

                if (!naxEnabled)
                {
                    return;
                }

                INAWindow       naWindow  = nax.NAWindow;
                INALayer        naLayer   = null;
                INAContext      naContext = null;
                INetworkDataset nds       = null;

                naLayer = naWindow.ActiveAnalysis;
                if (naLayer != null)
                {
                    naContext = naLayer.Context;
                }

                if (naContext != null)
                {
                    nds = naContext.NetworkDataset;
                }

                if (nds == null)
                {
                    return;
                }

                IDatasetComponent dsComponent = nds as IDatasetComponent;
                IDENetworkDataset deNet       = dsComponent.DataElement as IDENetworkDataset;

                INASolver          naSolver          = naContext.Solver;
                INASolverSettings2 naSolverSettings2 = naSolver as INASolverSettings2;

                if (naSolverSettings2 == null)
                {
                    return;
                }

                INetworkAttribute2 netAttribute;
                string             attributeName;

                IArray netParameters;
                INetworkAttributeParameter netParameter;
                string paramName;
                int    cParameters;

                object paramValue;

                int cAttributes = nds.AttributeCount;
                for (int a = 0; a < cAttributes; ++a)
                {
                    netAttribute  = nds.get_Attribute(a) as INetworkAttribute2;
                    attributeName = netAttribute.Name;
                    netParameters = netAttribute.Parameters;

                    cParameters = netParameters.Count;
                    for (int p = 0; p < cParameters; ++p)
                    {
                        netParameter = netParameters.get_Element(p) as INetworkAttributeParameter;
                        paramName    = netParameter.Name;

                        paramValue         = naSolverSettings2.get_AttributeParameterValue(attributeName, paramName);
                        netParameter.Value = paramValue;
                    }

                    netAttribute.Refresh();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Push Parameter Values To Network");
            }
        }
		public void Initialize(INetworkDataset networkDataset, IDENetworkDataset DataElement, INetworkSource netSource, IEvaluatedNetworkAttribute netAttribute)
		{
			// Initialize is called once per session (ArcMap session, ArcCatalog session, etc.) to initialize the evaluator for an associated network dataset            
			m_networkDataset = networkDataset;
			m_networkSource = netSource;
			m_networkAttribute = netAttribute;

			Refresh();
		}
        public static void RemoveFilterSubsetAttribute(IDENetworkDataset deNet)
        {
            IArray netAttributes = SubsetHelper.RemoveAttributesByPrefix(deNet.Attributes, "Filter");

            deNet.Attributes = netAttributes;
        }
		public static List<IEvaluatedNetworkAttribute> AddScaleSubsetAttributes(IDENetworkDataset deNet)
		{
			List<IEvaluatedNetworkAttribute> scaleSubsetAttributes = new List<IEvaluatedNetworkAttribute>();

			IArray netAttributesArray = deNet.Attributes;
			List<int> baseIndexes = SubsetHelper.FindAttributeIndexes(netAttributesArray, esriNetworkAttributeUsageType.esriNAUTCost, esriNetworkAttributeDataType.esriNADTDouble, true, false);
			List<INetworkAttribute2> baseNetAttributes = SubsetHelper.FindAttributes(netAttributesArray, baseIndexes);
			foreach (INetworkAttribute2 baseNetAttribute in baseNetAttributes)
				scaleSubsetAttributes.Add(AddScaleSubsetAttribute(deNet, baseNetAttribute));

			return scaleSubsetAttributes;
		}
		public static IEvaluatedNetworkAttribute AddScaleSubsetAttribute(IDENetworkDataset deNet, INetworkAttribute2 baseNetAttribute)
		{
			if (baseNetAttribute == null)
				return null;

			if (baseNetAttribute.UsageType != esriNetworkAttributeUsageType.esriNAUTCost)
				return null;

			IArray netAttributes = deNet.Attributes;
			IEvaluatedNetworkAttribute netAttribute = new EvaluatedNetworkAttributeClass() as IEvaluatedNetworkAttribute;

			string netAttributeName = BaseParameterName;
			netAttributeName += "_";
			netAttributeName += baseNetAttribute.Name;

			netAttribute.Name = netAttributeName;
			netAttribute.UsageType = baseNetAttribute.UsageType;
			netAttribute.DataType = baseNetAttribute.DataType;
			netAttribute.Units = baseNetAttribute.Units;

			List<INetworkSource> allNetSources = SubsetHelper.GetSourceList(deNet.Sources);
			List<INetworkSource> netSources = SubsetHelper.GetSourceList(allNetSources, esriNetworkElementType.esriNETEdge);
			List<string> netSourceNames = SubsetHelper.GetSourceNames(netSources);

			ResetScaleSubsetParameters((INetworkAttribute2)netAttribute, netSourceNames);

			bool supportTurns = deNet.SupportsTurns;

			//default evaluators
			SubsetHelper.SetDefaultEvaluator(netAttribute, 0, esriNetworkElementType.esriNETEdge);
			SubsetHelper.SetDefaultEvaluator(netAttribute, 0, esriNetworkElementType.esriNETJunction);
			if (supportTurns)
				SubsetHelper.SetDefaultEvaluator(netAttribute, 0, esriNetworkElementType.esriNETTurn);

			//sourced evaluators
			foreach (INetworkSource netSource in netSources)
				SubsetHelper.SetEvaluators(netAttribute, netSource, typeof(ScaleSubsetEvaluator));

			netAttributes.Add(netAttribute);
			deNet.Attributes = netAttributes;

			return netAttribute;
		}
        public static void UpdateEIDArrayParameterValuesFromEIDLists(INetworkAnalystExtension nax, Dictionary <string, List <int> > eidsBySourceName, string baseName)
        {
            if (nax == null)
            {
                return;
            }

            bool             naxEnabled = false;
            IExtensionConfig naxConfig  = nax as IExtensionConfig;

            naxEnabled = naxConfig.State == esriExtensionState.esriESEnabled;

            if (!naxEnabled)
            {
                return;
            }

            INAWindow       naWindow  = nax.NAWindow;
            INALayer        naLayer   = null;
            INAContext      naContext = null;
            INetworkDataset nds       = null;

            naLayer = naWindow.ActiveAnalysis;
            if (naLayer != null)
            {
                naContext = naLayer.Context;
            }

            if (naContext != null)
            {
                nds = naContext.NetworkDataset;
            }

            if (nds == null)
            {
                return;
            }

            IDatasetComponent dsComponent = nds as IDatasetComponent;
            IDENetworkDataset deNet       = dsComponent.DataElement as IDENetworkDataset;

            INASolver          naSolver          = naContext.Solver;
            INASolverSettings2 naSolverSettings2 = naSolver as INASolverSettings2;

            if (naSolverSettings2 == null)
            {
                return;
            }

            string  prefix = GetEIDArrayPrefixFromBaseName(baseName);
            VarType vt     = GetEIDArrayParameterType();

            int cAttributes = nds.AttributeCount;

            for (int a = 0; a < cAttributes; ++a)
            {
                INetworkAttribute2 netAttribute = nds.get_Attribute(a) as INetworkAttribute2;
                IArray             netParams    = netAttribute.Parameters;
                int    cParams = netParams.Count;
                object paramValue;
                for (int p = 0; p < cParams; ++p)
                {
                    INetworkAttributeParameter param = netParams.get_Element(p) as INetworkAttributeParameter;
                    if (param.VarType != (int)vt)
                    {
                        continue;
                    }

                    string paramName  = param.Name;
                    string sourceName = GetSourceNameFromParameterName(prefix, paramName);
                    if (sourceName.Length == 0)
                    {
                        continue;
                    }

                    List <int> eids = null;
                    if (eidsBySourceName.TryGetValue(sourceName, out eids))
                    {
                        if (eids != null)
                        {
                            if (eids.Count == 0)
                            {
                                eids = null;
                            }
                        }
                    }

                    paramValue = (eids != null) ? eids.ToArray() : null;
                    naSolverSettings2.set_AttributeParameterValue(netAttribute.Name, param.Name, paramValue);
                }
            }
        }
        public void Initialize(INetworkDataset networkDataset, IDENetworkDataset dataElement, INetworkSource source, IEvaluatedNetworkAttribute evaluatedNetworkAttribute)
        {
            // Cache the network dataset geodatabase path
            m_workspace_path_name = ((IDataset)networkDataset).Workspace.PathName;
            m_UseSpecificDates = false;
            m_CacheOnEverySolve = false;
            m_RidingABicycle = false;
            m_UsingAWheelchair = false;
            m_networkAttribute = evaluatedNetworkAttribute as INetworkAttribute2;

            CheckForVerboseLogging();
            if (m_VerboseLogging) WriteToOutputFile(m_LogFile, "Initialize" + Environment.NewLine + "m_workspace_path_name: " + m_workspace_path_name + Environment.NewLine + " m_UseSpecificDates defaults to: " + m_UseSpecificDates);
        }
		public void Initialize(INetworkDataset networkDataset, IDENetworkDataset DataElement, INetworkSource netSource, IEvaluatedNetworkAttribute netAttribute)
		{
			// Initialize is called once per session (ArcMap session, ArcCatalog session, etc.) to initialize the evaluator for an associated network dataset            
			m_networkDataset = networkDataset;
			m_networkSource = netSource;
			m_networkAttribute = netAttribute;

			m_thisNetworkAttributeID = netAttribute.ID;
			m_baseNetworkAttributeID = -1;

			//The attribute name must begin with one or more non underscore characters followed by
			//an underscore character and then the name of the base cost attribute.
			//The underscore prior to the base attribute name should be the first underscore in the name.

			string thisAttributeName = netAttribute.Name;
			int nPos = thisAttributeName.IndexOf('_');
			int nLastPos = thisAttributeName.Length - 1;

			string baseNetAttributeName;
			INetworkAttribute baseNetAttribute = null;

			if (nPos > 0 && nPos < nLastPos)
			{
				baseNetAttributeName = thisAttributeName.Remove(0, nPos + 1);
				try
				{
					baseNetAttribute = networkDataset.get_AttributeByName(baseNetAttributeName);
				}
				catch (COMException ex)
				{
					baseNetAttribute = null;
					string msg = string.Format("Base Attribute ({0}) not found. {1}.", baseNetAttributeName, ex.Message);
					System.Diagnostics.Trace.WriteLine(msg, "Scale Subset Network Evaluator");
				}

				if (baseNetAttribute != null)
				{
					if (baseNetAttribute.ID != m_thisNetworkAttributeID)
						m_baseNetworkAttributeID = baseNetAttribute.ID;
				}
			}

			Refresh();
		}