Exemplo n.º 1
0
        /// <summary>
        /// Get criteria(in string) from String Evaluator
        /// </summary>
        /// <param name="fsre">String Evaluator used to retrieve the criteria.</param>
        /// <param name="inverted">Indicates whether rule to which Evaluator belong is inverse rule.
        /// If inverted is true, inverse criteria for this evaluator will be returned. </param>
        /// <returns>criteria of this Evaluator.</returns>
        static string GetEvaluatorCriteriaName(FilterStringRuleEvaluator fsre, bool inverted)
        {
            // indicate if inverse criteria should be returned
            bool isInverseRule = inverted;

            if (fsre is FilterStringBeginsWith)
            {
                return(isInverseRule ? RuleCriteraNames.NotBeginWith : RuleCriteraNames.BeginWith);
            }
            else if (fsre is FilterStringContains)
            {
                return(isInverseRule ? RuleCriteraNames.NotContains : RuleCriteraNames.Contains);
            }
            else if (fsre is FilterStringEndsWith)
            {
                return(isInverseRule ? RuleCriteraNames.NotEndsWith : RuleCriteraNames.EndsWith);
            }
            else if (fsre is FilterStringEquals)
            {
                return(isInverseRule ? RuleCriteraNames.NotEquals : RuleCriteraNames.Equals_);
            }
            else if (fsre is FilterStringGreater)
            {
                return(isInverseRule ? RuleCriteraNames.LessOrEqual : RuleCriteraNames.Greater);
            }
            else if (fsre is FilterStringGreaterOrEqual)
            {
                return(isInverseRule ? RuleCriteraNames.Less : RuleCriteraNames.GreaterOrEqual);
            }
            else if (fsre is FilterStringLess)
            {
                return(isInverseRule ? RuleCriteraNames.GreaterOrEqual : RuleCriteraNames.Less);
            }
            else if (fsre is FilterStringLessOrEqual)
            {
                return(isInverseRule ? RuleCriteraNames.Greater : RuleCriteraNames.LessOrEqual);
            }
            else
            {
                return(RuleCriteraNames.Invalid);
            }
        }
Exemplo n.º 2
0
        protected override void SolveInstance(IGH_DataAccess DA)
        {
            var parameterId = ElementId.InvalidElementId;

            if (!DA.GetData("ParameterKey", ref parameterId))
            {
                return;
            }

            DA.DisableGapLogic();

            if (!TryGetParameterDefinition(Revit.ActiveDBDocument, parameterId, out var storageType, out var parameterType))
            {
                if (parameterId.TryGetBuiltInParameter(out var builtInParameter))
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, $"Failed to found parameter '{LabelUtils.GetLabelFor(builtInParameter)}' in Revit document.");
                }
                else
                {
                    AddRuntimeMessage(GH_RuntimeMessageLevel.Warning, $"Failed to found parameter '{parameterId.IntegerValue}' in Revit document.");
                }

                return;
            }

            var provider = new ParameterValueProvider(parameterId);

            Autodesk.Revit.DB.FilterRule rule = null;
            if (storageType == StorageType.String)
            {
                FilterStringRuleEvaluator ruleEvaluator = null;
                switch (Condition)
                {
                case ConditionType.NotEquals:
                case ConditionType.Equals:          ruleEvaluator = new FilterStringEquals(); break;

                case ConditionType.Greater:         ruleEvaluator = new FilterStringGreater(); break;

                case ConditionType.GreaterOrEqual:  ruleEvaluator = new FilterStringGreaterOrEqual(); break;

                case ConditionType.Less:            ruleEvaluator = new FilterStringLess(); break;

                case ConditionType.LessOrEqual:     ruleEvaluator = new FilterStringLessOrEqual(); break;
                }

                var goo = default(GH_String);
                if (DA.GetData("Value", ref goo))
                {
                    rule = new FilterStringRule(provider, ruleEvaluator, goo.Value, true);
                }
            }
            else
            {
                FilterNumericRuleEvaluator ruleEvaluator = null;
                switch (Condition)
                {
                case ConditionType.NotEquals:
                case ConditionType.Equals:          ruleEvaluator = new FilterNumericEquals(); break;

                case ConditionType.Greater:         ruleEvaluator = new FilterNumericGreater(); break;

                case ConditionType.GreaterOrEqual:  ruleEvaluator = new FilterNumericGreaterOrEqual(); break;

                case ConditionType.Less:            ruleEvaluator = new FilterNumericLess(); break;

                case ConditionType.LessOrEqual:     ruleEvaluator = new FilterNumericLessOrEqual(); break;
                }

                switch (storageType)
                {
                case StorageType.Integer:
                {
                    var goo = default(GH_Integer);
                    if (DA.GetData("Value", ref goo))
                    {
                        rule = new FilterIntegerRule(provider, ruleEvaluator, goo.Value);
                    }
                }
                break;

                case StorageType.Double:
                {
                    var goo = default(GH_Number);
                    if (DA.GetData("Value", ref goo))
                    {
                        if (Condition == ConditionType.Equals || Condition == ConditionType.NotEquals)
                        {
                            if (parameterType == ParameterType.Length || parameterType == ParameterType.Area || parameterType == ParameterType.Volume)
                            {
                                rule = new FilterDoubleRule(provider, ruleEvaluator, ToHost(goo.Value, parameterType), ToHost(Revit.VertexTolerance, parameterType));
                            }
                            else
                            {
                                rule = new FilterDoubleRule(provider, ruleEvaluator, ToHost(goo.Value, parameterType), 1e-6);
                            }
                        }
                        else
                        {
                            rule = new FilterDoubleRule(provider, ruleEvaluator, ToHost(goo.Value, parameterType), 0.0);
                        }
                    }
                }
                break;

                case StorageType.ElementId:
                {
                    switch (parameterType)
                    {
                    case (ParameterType)int.MaxValue: // Category
                    {
                        var value = default(Types.Category);
                        if (DA.GetData("Value", ref value))
                        {
                            rule = new FilterElementIdRule(provider, ruleEvaluator, value);
                        }
                    }
                    break;

                    case ParameterType.FamilyType:
                    {
                        var value = default(Types.ElementType);
                        if (DA.GetData("Value", ref value))
                        {
                            rule = new FilterElementIdRule(provider, ruleEvaluator, value);
                        }
                    }
                    break;

                    default:
                    {
                        var value = default(Types.Element);
                        if (DA.GetData("Value", ref value))
                        {
                            rule = new FilterElementIdRule(provider, ruleEvaluator, value);
                        }
                    }
                    break;
                    }
                }
                break;
                }
            }

            if (rule is object)
            {
                if (Condition == ConditionType.NotEquals)
                {
                    DA.SetData("Rule", new FilterInverseRule(rule));
                }
                else
                {
                    DA.SetData("Rule", rule);
                }
            }
        }
Exemplo n.º 3
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);
        }
Exemplo n.º 4
0
 //Private Method
 private static string CastFilterRule(FilterRule r)
 {
     if (r is FilterStringRule)
     {
         FilterStringRule          filterRule = r as FilterStringRule;
         FilterStringRuleEvaluator evaluator  = filterRule.GetEvaluator();
         if (filterRule.GetEvaluator() is FilterStringBeginsWith)
         {
             return("FilterStringBeginsWith");
         }
         else if (filterRule.GetEvaluator() is FilterStringContains)
         {
             return("FilterStringContains");
         }
         else if (filterRule.GetEvaluator() is FilterStringEndsWith)
         {
             return("FilterStringEndsWith");
         }
         else if (filterRule.GetEvaluator() is FilterStringEquals)
         {
             return("FilterStringEquals");
         }
         else if (filterRule.GetEvaluator() is FilterStringGreaterOrEqual)
         {
             return("FilterStringGreaterOrEqual");
         }
         else if (filterRule.GetEvaluator() is FilterStringLess)
         {
             return("FilterStringLess");
         }
         else if (filterRule.GetEvaluator() is FilterStringLessOrEqual)
         {
             return("FilterStringLessOrEqual");
         }
     }
     else if (r is FilterIntegerRule || r is FilterDoubleRule || r is FilterGlobalParameterAssociationRule)
     {
         FilterIntegerRule          filterRule = r as FilterIntegerRule;
         FilterNumericRuleEvaluator evaluator  = filterRule.GetEvaluator();
         if (filterRule.GetEvaluator() is FilterNumericEquals)
         {
             return("FilterNumericEquals");
         }
         else if (filterRule.GetEvaluator() is FilterNumericGreater)
         {
             return("FilterNumericGreater");
         }
         else if (filterRule.GetEvaluator() is FilterNumericGreaterOrEqual)
         {
             return("FilterNumericGreaterOrEqual");
         }
         else if (filterRule.GetEvaluator() is FilterNumericLess)
         {
             return("FilterNumericLess");
         }
         else if (filterRule.GetEvaluator() is FilterNumericLessOrEqual)
         {
             return("FilterNumericLessOrEqual");
         }
     }
     else if (r is FilterInverseRule)
     {
         FilterInverseRule filterRule = r as FilterInverseRule;
         FilterRule        innerRule  = filterRule.GetInnerRule();
         return(CastFilterRule(innerRule) + "_InnerRule");
     }
     else if (r is SharedParameterApplicableRule)
     {
         return("SharedParameterApplicableRule");
     }
     ;
     return(null);
 }
Exemplo n.º 5
0
        private ElementFilter CreateParamFilter(int paramId, string strOperator, string paramValue, bool emptyValue)
        {
            try
            {
                ParameterProperties    pp  = selectedParameters[paramId];
                ParameterValueProvider pvp = new ParameterValueProvider(new ElementId(pp.ParamId));

                switch (pp.ParamStorageType)
                {
                case StorageType.ElementId:
                    if (pp.ParamName == "Phase Created" || pp.ParamName == "Phase Demolished")
                    {
                        FilterNumericRuleEvaluator fnre1 = new FilterNumericEquals();

                        var       phaseId   = from phase in phases where phase.Value.Name == paramValue select phase.Key;
                        int       pId       = phaseId.First();
                        ElementId ruleValId = new ElementId(pId);

                        FilterRule filterRule1 = new FilterElementIdRule(pvp, fnre1, ruleValId);

                        if (strOperator == "does not equal")
                        {
                            return(new ElementParameterFilter(filterRule1, true));
                        }
                        else
                        {
                            return(new ElementParameterFilter(filterRule1));
                        }
                    }
                    return(null);

                case StorageType.Double:
                    if (emptyValue)
                    {
                        FilterNumericRuleEvaluator fnre       = new FilterNumericGreater();
                        FilterDoubleRule           doubleRule = new FilterDoubleRule(pvp, fnre, 0, double.Epsilon);
                        return(new ElementParameterFilter(doubleRule, true));
                    }

                    FilterNumericRuleEvaluator fnre2 = FindFilterNumericRuleEvaluator(strOperator);
                    double dblValue = 0;
                    if (!string.IsNullOrEmpty(paramValue))
                    {
                        double.TryParse(paramValue, out dblValue);
                    }

                    FilterRule filterRule2 = new FilterDoubleRule(pvp, fnre2, dblValue, double.Epsilon);

                    if (strOperator == "does not equal")
                    {
                        return(new ElementParameterFilter(filterRule2, true));
                    }
                    else
                    {
                        return(new ElementParameterFilter(filterRule2));
                    }

                case StorageType.Integer:
                    if (emptyValue)
                    {
                        FilterNumericRuleEvaluator fnre        = new FilterNumericGreater();
                        FilterIntegerRule          integerRule = new FilterIntegerRule(pvp, fnre, 0);
                        return(new ElementParameterFilter(integerRule, true));
                    }
                    FilterNumericRuleEvaluator fnre3 = FindFilterNumericRuleEvaluator(strOperator);

                    int intValue = 0;
                    if (pp.ParamName == "Workset")
                    {
                        var worksetId = from ws in worksets where ws.Value.Name == paramValue select ws.Key;
                        intValue = worksetId.First();
                    }
                    else if (!string.IsNullOrEmpty(paramValue))
                    {
                        int.TryParse(paramValue, out intValue);
                    }

                    FilterRule filterRule3 = new FilterIntegerRule(pvp, fnre3, intValue);

                    if (strOperator == "does not equal")
                    {
                        return(new ElementParameterFilter(filterRule3, true));
                    }
                    else
                    {
                        return(new ElementParameterFilter(filterRule3));
                    }

                case StorageType.String:
                    if (emptyValue)
                    {
                        FilterStringRuleEvaluator fsre       = new FilterStringGreater();
                        FilterStringRule          stringRule = new FilterStringRule(pvp, fsre, "", false);
                        return(new ElementParameterFilter(stringRule, true));
                    }

                    FilterStringRuleEvaluator fnre4 = FindFilterStringRuleEvaluator(strOperator);
                    string           strValue       = paramValue;
                    FilterStringRule filterRule4    = new FilterStringRule(pvp, fnre4, strValue, false);

                    if (strOperator.Contains("does not"))
                    {
                        return(new ElementParameterFilter(filterRule4, true));
                    }
                    else
                    {
                        return(new ElementParameterFilter(filterRule4, false));
                    }

                default:
                    return(null);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Failed to create parameter filters.\n" + ex.Message, "CreateParamFilter", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            return(null);
        }
Exemplo n.º 6
0
 /// <summary>
 /// Get criteria(in string) from String Evaluator
 /// </summary>
 /// <param name="fsre">String Evaluator used to retrieve the criteria.</param>
 /// <param name="inverted">Indicates whether rule to which Evaluator belong is inverse rule.
 /// If inverted is true, inverse criteria for this evaluator will be returned. </param>
 /// <returns>criteria of this Evaluator.</returns>
 static string GetEvaluatorCriteriaName(FilterStringRuleEvaluator fsre, bool inverted)
 {
     // indicate if inverse criteria should be returned
     bool isInverseRule = inverted;
     if (fsre is FilterStringBeginsWith)
         return (isInverseRule ? RuleCriteraNames.NotBeginWith : RuleCriteraNames.BeginWith);
     else if (fsre is FilterStringContains)
         return (isInverseRule ? RuleCriteraNames.NotContains : RuleCriteraNames.Contains);
     else if (fsre is FilterStringEndsWith)
         return (isInverseRule ? RuleCriteraNames.NotEndsWith : RuleCriteraNames.EndsWith);
     else if (fsre is FilterStringEquals)
         return (isInverseRule ? RuleCriteraNames.NotEquals : RuleCriteraNames.Equals_);
     else if (fsre is FilterStringGreater)
         return (isInverseRule ? RuleCriteraNames.LessOrEqual : RuleCriteraNames.Greater);
     else if (fsre is FilterStringGreaterOrEqual)
         return (isInverseRule ? RuleCriteraNames.Less: RuleCriteraNames.GreaterOrEqual);
     else if (fsre is FilterStringLess)
         return (isInverseRule ? RuleCriteraNames.GreaterOrEqual: RuleCriteraNames.Less);
     else if (fsre is FilterStringLessOrEqual)
         return (isInverseRule ? RuleCriteraNames.Greater: RuleCriteraNames.LessOrEqual);
     else
         return RuleCriteraNames.Invalid;
 }