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); }
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(); }