public void Refresh()
        {
            // This method is called internally during a solve operation immediately prior to performing the actual solve
            // This gives us an opportunity to update our evaluator's internal state based on parameter values

            m_scaleFactor        = 1;
            m_countSourceEIDs    = 0;
            m_sourceEIDHashTable = new Dictionary <int, int>();

            INetworkAttribute2 netAttribute2      = m_networkAttribute as INetworkAttribute2;
            IArray             netAttributeParams = netAttribute2.Parameters;

            // Parameters: "ScaleSubset_Factor", "ScaleSubset_eids_<SourceName>"
            string prefix = BaseParameterName + "_";

            string paramScaleFactorName = prefix + "Factor";
            string paramEIDsName        = prefix + "eids_" + m_networkSource.Name;

            int nParamScaleFactor = SubsetHelper.FindParameter(netAttributeParams, paramScaleFactorName);
            int nParamEIDs        = SubsetHelper.FindParameter(netAttributeParams, paramEIDsName);

            object value;

            INetworkAttributeParameter paramScaleFactor;
            INetworkAttributeParameter paramEIDs;

            if (nParamScaleFactor >= 0)
            {
                paramScaleFactor = netAttributeParams.get_Element(nParamScaleFactor) as INetworkAttributeParameter;
                value            = paramScaleFactor.Value;
                if (value != null)
                {
                    m_scaleFactor = (double)value;
                }
            }

            if (nParamEIDs >= 0)
            {
                paramEIDs = netAttributeParams.get_Element(nParamEIDs) as INetworkAttributeParameter;
                value     = paramEIDs.Value as int[];
                if (value != null)
                {
                    int   eid;
                    int[] rgEIDs;
                    rgEIDs = (int[])value;

                    int lb = rgEIDs.GetLowerBound(0);
                    int ub = rgEIDs.GetUpperBound(0);

                    for (int i = lb; i <= ub; ++i)
                    {
                        ++m_countSourceEIDs;
                        eid = rgEIDs[i];
                        m_sourceEIDHashTable.Add(eid, eid);
                    }
                }
            }
        }
        public static List <INetworkAttribute2> FindAttributes(IArray netAttributesArray, List <int> netAttributeIndexes)
        {
            List <INetworkAttribute2> netAttributes = new List <INetworkAttribute2>();

            foreach (int i in netAttributeIndexes)
            {
                INetworkAttribute2 netAttribute = netAttributesArray.get_Element(i) as INetworkAttribute2;
                if (netAttribute != null)
                {
                    netAttributes.Add(netAttribute);
                }
            }

            return(netAttributes);
        }
        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 static void ResetFilterSubsetParameters(INetworkAttribute2 netAttribute, List <string> netSourceNames)
        {
            IArray netParams = new ESRI.ArcGIS.esriSystem.ArrayClass();
            INetworkAttributeParameter netParam = null;
            object paramValue = null;

            netParam   = new NetworkAttributeParameterClass();
            paramValue = true;

            string paramName = "";

            paramName  = BaseParameterName;
            paramName += "_Restrict";

            netParam.Name         = paramName;
            netParam.VarType      = (int)VarType.Bool;
            netParam.Value        = paramValue;
            netParam.DefaultValue = paramValue;
            netParams.Add(netParam);

            netParam   = new NetworkAttributeParameterClass();
            paramValue = 1;

            foreach (string netSourceName in netSourceNames)
            {
                netParam   = new NetworkAttributeParameterClass();
                paramValue = null;

                paramName             = BaseParameterName;
                paramName            += "_EIDs_";
                paramName            += netSourceName;
                netParam.Name         = paramName;
                netParam.VarType      = (int)(VarType.Array | VarType.Integer);
                netParam.Value        = paramValue;
                netParam.DefaultValue = paramValue;
                netParams.Add(netParam);
            }

            //does not preserve existing parameters if any
            netAttribute.Parameters = netParams;
        }
        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 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 static List <int> FindAttributeIndexes(IArray netAttributes, esriNetworkAttributeUsageType usage, esriNetworkAttributeDataType dataType, bool searchTimeUnits, bool ignoreDataType)
        {
            INetworkAttribute2        netAttribute = null;
            esriNetworkAttributeUnits units        = esriNetworkAttributeUnits.esriNAUUnknown;
            bool isSearchUnits  = false;
            bool isUnknownUnits = false;
            bool isTimeUnits    = false;

            List <int> netAttributeIndexes = new List <int>();
            int        count = netAttributes.Count;

            for (int i = 0; i < count; ++i)
            {
                netAttribute = netAttributes.get_Element(i) as INetworkAttribute2;
                if (netAttribute == null)
                {
                    continue;
                }

                if (netAttribute.UsageType == usage && (ignoreDataType || netAttribute.DataType == dataType))
                {
                    units         = netAttribute.Units;
                    isSearchUnits = false;

                    if (usage != esriNetworkAttributeUsageType.esriNAUTCost)
                    {
                        isSearchUnits = true;
                    }
                    else
                    {
                        isUnknownUnits = false;
                        if (units == esriNetworkAttributeUnits.esriNAUUnknown)
                        {
                            isUnknownUnits = true;
                        }

                        isTimeUnits = false;
                        if (!isUnknownUnits)
                        {
                            if (units == esriNetworkAttributeUnits.esriNAUMinutes ||
                                units == esriNetworkAttributeUnits.esriNAUSeconds ||
                                units == esriNetworkAttributeUnits.esriNAUHours ||
                                units == esriNetworkAttributeUnits.esriNAUDays)
                            {
                                isTimeUnits = true;
                            }

                            if (searchTimeUnits)
                            {
                                isSearchUnits = isTimeUnits;
                            }
                            else
                            {
                                isSearchUnits = !isTimeUnits;
                            }
                        }
                    }
                    if (isSearchUnits)
                    {
                        netAttributeIndexes.Add(i);
                    }
                }
            }

            return(netAttributeIndexes);
        }
		public static void ResetScaleSubsetParameters(INetworkAttribute2 netAttribute, List<string> netSourceNames)
		{
			IArray netParams = new ESRI.ArcGIS.esriSystem.ArrayClass();
			INetworkAttributeParameter netParam = null;
			object paramValue = null;
			string paramName = "";

			netParam = new NetworkAttributeParameterClass();
			paramValue = 1;

			paramName = BaseParameterName;
			paramName += "_Factor";

			netParam.Name = paramName;
			netParam.VarType = (int)VarType.Double;
			netParam.Value = paramValue;
			netParam.DefaultValue = paramValue;
			netParams.Add(netParam);

			foreach (string netSourceName in netSourceNames)
			{
				netParam = new NetworkAttributeParameterClass();
				paramValue = null;

				paramName = BaseParameterName;
				paramName += "_eids_";
				paramName += netSourceName;
				netParam.Name = paramName;
				netParam.VarType = (int)(VarType.Array | VarType.Integer);
				netParam.Value = paramValue;
				netParam.DefaultValue = paramValue;
				netParams.Add(netParam);
			}

			//does not preserve existing parameters if any
			netAttribute.Parameters = netParams;
		}
		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 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);
                }
            }
        }