Пример #1
0
        public static ElementFilter createParameterFilter(Document doc, ParameterData parameter, string operation, string ruleString)
        {
            ElementId parameterId              = parameter.Id;
            ParameterValueProvider fvp         = new ParameterValueProvider(parameterId);
            StorageType            storageType = parameter.StorageType;
            FilterRule             fRule       = null;
            FilterInverseRule      fInvRule    = null;
            ElementParameterFilter filter      = null;


            switch (storageType)
            {
            case StorageType.String:
            case StorageType.Integer:
                FilterStringRuleEvaluator fsre = null;
                switch (operation)
                {
                case "равно":
                    fsre   = new FilterStringEquals();
                    fRule  = new FilterStringRule(fvp, fsre, ruleString, true);
                    filter = new ElementParameterFilter(fRule);
                    break;

                case "не равно":
                    fsre     = new FilterStringEquals();
                    fRule    = new FilterStringRule(fvp, fsre, ruleString, true);
                    fInvRule = new FilterInverseRule(fRule);
                    filter   = new ElementParameterFilter(fInvRule);
                    break;

                case "содержит":
                    fsre   = new FilterStringContains();
                    fRule  = new FilterStringRule(fvp, fsre, ruleString, true);
                    filter = new ElementParameterFilter(fRule);
                    break;

                case "не содержит":
                    fsre     = new FilterStringContains();
                    fRule    = new FilterStringRule(fvp, fsre, ruleString, true);
                    fInvRule = new FilterInverseRule(fRule);
                    filter   = new ElementParameterFilter(fInvRule);
                    break;

                case "начинается с":
                    fsre   = new FilterStringBeginsWith();
                    fRule  = new FilterStringRule(fvp, fsre, ruleString, true);
                    filter = new ElementParameterFilter(fRule);
                    break;

                case "не начинается с":
                    fsre     = new FilterStringBeginsWith();
                    fRule    = new FilterStringRule(fvp, fsre, ruleString, true);
                    fInvRule = new FilterInverseRule(fRule);
                    filter   = new ElementParameterFilter(fInvRule);
                    break;

                case "заканчивается на":
                    fsre   = new FilterStringEndsWith();
                    fRule  = new FilterStringRule(fvp, fsre, ruleString, true);
                    filter = new ElementParameterFilter(fRule);
                    break;

                case "не заканчивается на":
                    fsre     = new FilterStringEndsWith();
                    fRule    = new FilterStringRule(fvp, fsre, ruleString, true);
                    fInvRule = new FilterInverseRule(fRule);
                    filter   = new ElementParameterFilter(fInvRule);
                    break;
                }
                break;

            case StorageType.Double:
                FilterNumericRuleEvaluator fnre = null;
                double ruleValue = Convert.ToDouble(ruleString);
                switch (operation)
                {
                case "равно":
                    fnre   = new FilterNumericEquals();
                    fRule  = new FilterDoubleRule(fvp, fnre, ruleValue, 0.0);
                    filter = new ElementParameterFilter(fRule);
                    break;

                case "не равно":
                    fnre     = new FilterNumericEquals();
                    fRule    = new FilterDoubleRule(fvp, fnre, ruleValue, 0.0);
                    fInvRule = new FilterInverseRule(fRule);
                    filter   = new ElementParameterFilter(fInvRule);
                    break;

                case "больше":
                    fnre   = new FilterNumericGreater();
                    fRule  = new FilterDoubleRule(fvp, fnre, ruleValue, 0.0);
                    filter = new ElementParameterFilter(fRule);
                    break;

                case "больше или равно":
                    fnre   = new FilterNumericGreaterOrEqual();
                    fRule  = new FilterDoubleRule(fvp, fnre, ruleValue, 0.0);
                    filter = new ElementParameterFilter(fRule);
                    break;

                case "меньше":
                    fnre   = new FilterNumericLess();
                    fRule  = new FilterDoubleRule(fvp, fnre, ruleValue, 0.0);
                    filter = new ElementParameterFilter(fRule);
                    break;

                case "меньше или равно":
                    fnre   = new FilterNumericLessOrEqual();
                    fRule  = new FilterDoubleRule(fvp, fnre, ruleValue, 0.0);
                    filter = new ElementParameterFilter(fRule);
                    break;
                }
                break;

            case StorageType.ElementId:

                var       levels = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Levels).ToElements();
                var       level  = levels.Where(i => i.Name == ruleString).FirstOrDefault();
                ElementId ruleId = level.Id;

                fnre = null;
                switch (operation)
                {
                case "равно":
                    fnre   = new FilterNumericEquals();
                    fRule  = new FilterElementIdRule(fvp, fnre, ruleId);
                    filter = new ElementParameterFilter(fRule);
                    break;

                case "не равно":
                    fnre     = new FilterNumericEquals();
                    fRule    = new FilterElementIdRule(fvp, fnre, ruleId);
                    fInvRule = new FilterInverseRule(fRule);
                    filter   = new ElementParameterFilter(fInvRule);
                    break;

                case "выше":
                    fnre   = new FilterNumericGreater();
                    fRule  = new FilterElementIdRule(fvp, fnre, ruleId);
                    filter = new ElementParameterFilter(fRule);
                    break;

                case "ровно или выше":
                    fnre   = new FilterNumericGreaterOrEqual();
                    fRule  = new FilterElementIdRule(fvp, fnre, ruleId);
                    filter = new ElementParameterFilter(fRule);
                    break;

                case "ниже":
                    fnre   = new FilterNumericLess();
                    fRule  = new FilterElementIdRule(fvp, fnre, ruleId);
                    filter = new ElementParameterFilter(fRule);
                    break;

                case "ровно или ниже":
                    fnre   = new FilterNumericLessOrEqual();
                    fRule  = new FilterElementIdRule(fvp, fnre, ruleId);
                    filter = new ElementParameterFilter(fRule);
                    break;
                }
                break;
            }
            return(filter);
        }
Пример #2
0
 public void Execute(UpdaterData data)
 {
     if (!Paused)
     {
         Document         doc  = data.GetDocument();
         List <ElementId> list = data.GetAddedElementIds().ToList();
         list.AddRange(data.GetModifiedElementIds());
         IList <Element> list2 = (from ElementId id in list
                                  select doc.GetElement(id)).ToList();
         Definition                parameterDefinition = LODapp.GetParameterDefinition(doc, "Zone");
         ElementId                 val  = LODapp.GetLODparameter(doc, parameterDefinition).get_Id();
         ParameterValueProvider    val2 = new ParameterValueProvider(val);
         FilterStringRuleEvaluator val3 = new FilterStringContains();
         FilterStringRuleEvaluator val4 = new FilterStringEquals();
         FilterStringRuleEvaluator val5 = new FilterStringBeginsWith();
         foreach (Element item in list2)
         {
             string text = item.LookupParameter("Name").AsString();
             if (!string.IsNullOrWhiteSpace(text))
             {
                 FilterRule[] array = (FilterRule[])new FilterRule[3]
                 {
                     new FilterStringRule(val2, val4, text, true),
                     new FilterStringRule(val2, val5, text + ", ", true),
                     new FilterStringRule(val2, val3, ", " + text, true)
                 };
                 ElementParameterFilter      val6        = new ElementParameterFilter((IList <FilterRule>)array);
                 IList <Element>             list3       = new FilteredElementCollector(doc).WhereElementIsNotElementType().WherePasses(val6).ToElements();
                 BoundingBoxIntersectsFilter val7        = new BoundingBoxIntersectsFilter(ToOutline(item.get_BoundingBox(null)));
                 IList <Element>             list4       = new FilteredElementCollector(doc).WhereElementIsNotElementType().WherePasses(val7).ToElements();
                 IEnumerable <Element>       enumerable  = list3.Except(list4, new EqualUniqueId());
                 IEnumerable <Element>       enumerable2 = list4.Except(list3, new EqualUniqueId());
                 foreach (Element item2 in enumerable)
                 {
                     Parameter val8 = item2.get_Parameter(parameterDefinition);
                     if (val8 != null)
                     {
                         string text2 = val8.AsString() ?? string.Empty;
                         string text3;
                         if (text2.Length > text.Length)
                         {
                             int num = text2.IndexOf(text);
                             text3 = ((num < 2 || text2[num - 2] != ',') ? text2.Remove(num, text.Length + 2) : text2.Remove(num - 2, text.Length + 2));
                         }
                         else
                         {
                             text3 = string.Empty;
                         }
                         val8.Set(text3);
                     }
                 }
                 foreach (Element item3 in enumerable2)
                 {
                     Parameter val9  = item3.get_Parameter(parameterDefinition);
                     string    text4 = (((int)val9 != 0) ? val9.AsString() : null) ?? string.Empty;
                     string    text5 = (text4.Length <= 0) ? text : (text4 + ", " + text);
                     Parameter val10 = item3.get_Parameter(parameterDefinition);
                     if ((int)val10 != 0)
                     {
                         val10.Set(text5);
                     }
                 }
             }
         }
     }
 }