Beispiel #1
0
        private void addDynamicVariablesToFormula(ExplicitFormula explicitFormula, StringBuilder stringBuilder, IFormulaUsable formulaUsable, int index0, IObjectPathFactory objectPathFactory)
        {
            string index1          = $"{index0 + 1}";
            string currentVariable = $"{Variable}_{index1}";

            //replace current variable in formula string and add reference to the explicit formula
            string formulaStringPart = FormulaString.Replace(VariablePattern, currentVariable);

            explicitFormula.AddObjectPath(objectPathFactory.CreateAbsoluteFormulaUsablePath(formulaUsable).WithAlias(currentVariable));

            foreach (var objectPath in ObjectPaths)
            {
                if (explicitFormula.ObjectPaths.Contains(objectPath))
                {
                    continue;
                }

                if (objectPath.Alias.Contains(_iterationPattern))
                {
                    bool success;
                    var  referenceVariable = objectPath.TryResolve <IFormulaUsable>(formulaUsable, out success);
                    if (!success)
                    {
                        throw new UnableToResolvePathException(objectPath, formulaUsable);
                    }

                    var referenceAlias = objectPath.Alias.Replace(_iterationPattern, index1);
                    formulaStringPart = formulaStringPart.Replace(objectPath.Alias, referenceAlias);
                    explicitFormula.AddObjectPath(objectPathFactory.CreateAbsoluteFormulaUsablePath(referenceVariable).WithAlias(referenceAlias));
                }
                else
                {
                    //it is an usable path that is not dynamic. Simply add it
                    explicitFormula.AddObjectPath(objectPath);
                }
            }

            stringBuilder.Append(formulaStringPart);
        }
Beispiel #2
0
        private void ProcessFormula()
        {
            Expression e;

            try
            {
                e = new Expression(
                    FormulaString.ToLower()
                    .Replace(" and ", "+").Replace("&&", "+")
                    .Replace(" or ", "+").Replace("||", "+"),
                    EvaluateOptions.IgnoreCase);
            }
            catch (Exception ex)
            {
                Error(ex.Message);
                return;
            }

            if (e.HasErrors())
            {
                Error(e.Error);
                return;
            }

            var parameters = new List <string>();
            var paramSet   = new HashSet <string>();

            e.EvaluateParameter += delegate(string name, ParameterArgs args)
            {
                if (!paramSet.Contains(name) && !reservedParamNames.Contains(name))
                {
                    paramSet.Add(name);
                    parameters.Add(name);
                }

                args.Result = 0;
            };

            e.EvaluateFunction += delegate(string name, FunctionArgs args)
            {
                foreach (var p in args.Parameters)
                {
                    p.Evaluate();
                }

                args.Result = 0;
            };

            try
            {
                e.Evaluate();
            }
            catch { }

            InPorts.Clear();

            foreach (var p in parameters)
            {
                InPorts.Add(new PortModel(PortType.Input, this, new PortData(p, "variable")));
            }

            ClearRuntimeError();
        }