コード例 #1
0
        public override bool TryCreate(string pattern, FormulaBuilder builder, out FormulaItem item)
        {
            item = null;

            string trimmed = pattern.Trim();

            ValueInfo valueInfo = FormulaBuilderTools.Instance.GetValueInfo(trimmed);

            if (!valueInfo.IsOk)
            {
                return(false);
            }

            item         = new ValueItem();
            item.Pattern = pattern;
            (item as ValueItem).Value = valueInfo.Value;

            UnitItem unit = new UnitItem();

            unit.Unit    = valueInfo.Unit;
            unit.Pattern = valueInfo.Unit;
            (item as ValueItem).Arguments.Add(unit);



            return(true);
        }
コード例 #2
0
ファイル: Equation.cs プロジェクト: macieja79/formulas
        public override void Calculate(CalculationItemStack calculationStack, bool isToAdd = true)
        {
            if (null == Value)
            {
                if (null == Numbers)
                {
                    if (null != Symbolic)
                    {
                        List <SymbolValuePair> symbolValueList = calculationStack.GetAsSymbolValueList();
                        Numbers = Symbolic.Clone(symbolValueList);
                    }
                    else
                    {
                        if (null != Symbol)
                        {
                            List <SymbolValuePair> symbolValueList = calculationStack.GetAsSymbolValueList();
                            Value = (ValueItem)Symbol.Clone(symbolValueList);
                            return;
                        }
                    }
                }

                double value = Numbers.GetValue();
                Value       = new ValueItem();
                Value.Value = value;
            }

            if (isToAdd)
            {
                calculationStack.Items.Add(this);
            }
        }
コード例 #3
0
ファイル: ValueItem.cs プロジェクト: macieja79/formulas
        public override FormulaItem Clone(List <SymbolValuePair> values)
        {
            ValueItem cloned = (ValueItem)base.Clone(values);

            cloned.Value = Value;
            return(cloned);
        }
コード例 #4
0
        public override FormulaItem Clone(List <SymbolValuePair> values)
        {
            SymbolValuePair matched = values.FirstOrDefault(p => p.Symbol.Symbol == Symbol);

            if (null != matched)
            {
                ValueItem item = (ValueItem)matched.Value.Clone(values);
                return(item);
            }

            return(this);
        }
コード例 #5
0
ファイル: Converter.cs プロジェクト: macieja79/formulas
        public Element Convert(FormulaItem item)
        {
            Element element = null;

            if (item is ValueItem)
            {
                ValueItem    i = (ValueItem)item;
                ValueElement e = new ValueElement();
                e.Value = i.Value.ToString();
                element = e;
            }

            if (item is SymbolItem)
            {
                SymbolItem    i = (SymbolItem)item;
                SymbolElement e = new SymbolElement();

                if (!string.IsNullOrEmpty(i.Symbol))
                {
                    string[] splited = i.Symbol.Split('.');
                    e.Symbol = splited[0];
                    if (splited.Length == 2)
                    {
                        e.Suffix = splited[1];
                    }
                }

                element = e;
            }

            if (item is UnitItem)
            {
                UnitItem    u = (UnitItem)item;
                UnitElement e = new UnitElement();
                e.Unit  = u.Unit;
                element = e;
            }



            if (item is FunctionSum)
            {
                FunctionSum sum     = (FunctionSum)item;
                SumElement  sumElem = new SumElement();

                for (int i = 0; i < sum.Coeffs.Count; ++i)
                {
                    if (i == 0)
                    {
                        sumElem.Signs.Add(string.Empty);
                        continue;
                    }
                    double coeff = sum.Coeffs[i];
                    string sign  = (coeff > 0) ? "+" : "-";
                    sumElem.Signs.Add(sign);
                }

                element = sumElem;
            }

            if (item is FunctionMultiply)
            {
                FunctionMultiply multi = (FunctionMultiply)item;

                if (multi.Arguments.Count == 2 && multi.Flags[1] == false)
                {
                    FractionElement fraction = new FractionElement();
                    element = fraction;
                }
                else
                {
                    SumElement sumElem = new SumElement();

                    for (int i = 0; i < multi.Flags.Count; ++i)
                    {
                        if (i == 0)
                        {
                            sumElem.Signs.Add(string.Empty);
                            continue;
                        }
                        bool   flag = multi.Flags[i];
                        string sign = flag ? "x" : "/";
                        sumElem.Signs.Add(sign);
                    }

                    element = sumElem;
                }
            }

            if (item is FunctionSqrt)
            {
                element = new SqrtElement();
            }

            if (item is FunctionPow)
            {
                element = new PowElement();
            }

            if (item is FunctionMax)
            {
                element = createElement("max");
            }

            if (item is FunctionMin)
            {
                element = createElement("min");
            }

            if (item is FunctionSin)
            {
                element = createElement("sin");
            }

            if (item is FunctionCos)
            {
                element = createElement("cos");
            }

            if (item is FunctionTan)
            {
                element = createElement("tan");
            }


            if (item is BracketItem)
            {
                element = createElement("");
            }



            if (item is FunctionItem)
            {
                FunctionItem function = (FunctionItem)item;
                foreach (FormulaItem arg in function.Arguments)
                {
                    Element argElement = Convert(arg);
                    element.Arguments.Add(argElement);
                }
            }

            return(element);
        }