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 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);
        }
        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 static void RemoveFilterSubsetAttribute(IDENetworkDataset deNet)
        {
            IArray netAttributes = SubsetHelper.RemoveAttributesByPrefix(deNet.Attributes, "Filter");

            deNet.Attributes = netAttributes;
        }
        public static void RemoveScaleSubsetAttributes(IDENetworkDataset deNet)
        {
            IArray netAttributes = SubsetHelper.RemoveAttributesByPrefix(deNet.Attributes, BaseParameterName);

            deNet.Attributes = netAttributes;
        }