示例#1
0
        public void SimpleSum()
        {
            string testReqwest = "1 + 1.2";
            var    answer      = MathParser.Parse(testReqwest);

            Assert.AreEqual(2.2, answer);
        }
示例#2
0
        public void ZeroPower()
        {
            string testReqwest = "2^0";
            var    answer      = MathParser.Parse(testReqwest);

            Assert.AreEqual(1, answer);
        }
示例#3
0
        public void BracketsAndPower1()
        {
            string testReqwest = "(2^3)^2";
            var    answer      = MathParser.Parse(testReqwest);

            Assert.AreEqual(64, answer);
        }
示例#4
0
        public void BracketsAndPower2()
        {
            string testReqwest = "2^(3^2)";
            var    answer      = MathParser.Parse(testReqwest);

            Assert.AreEqual(512, answer);
        }
示例#5
0
        public void ComplexPriority()
        {
            string testReqwest = "100 * (1+1)^2";
            var    answer      = MathParser.Parse(testReqwest);

            Assert.AreEqual(400, answer);
        }
示例#6
0
        public void BracketsPriority()
        {
            string testReqwest = "(7 + 3)*(5-2)";
            var    answer      = MathParser.Parse(testReqwest);

            Assert.AreEqual(30, answer);
        }
示例#7
0
        public void PowerPriority()
        {
            string testReqwest = "2 * 3 ^ 2 + 2";
            var    answer      = MathParser.Parse(testReqwest);

            Assert.AreEqual(20, answer);
        }
示例#8
0
        public void Power()
        {
            string testReqwest = "2^3^2";
            var    answer      = MathParser.Parse(testReqwest);

            Assert.AreEqual(512, answer);
        }
示例#9
0
 static void Main(string[] args)
 {
     Console.WriteLine(MathParser.ParseToInt("10 + 10 ^ 2 ^ 2 + 10 * 10"));
     Console.WriteLine(MathParser.ParseToFloat("245.345 * 1032 + 834"));
     Console.WriteLine(MathParser.ParseToDouble("1 / 3"));
     Console.ReadLine( );
 }
示例#10
0
        public static double Integral(string Expression, double LowerIndex, double UpperIndex, char IterationVariable, int Kind)
        {
            var parser = new MathParser();

            var Var = new Variable<double>(IterationVariable.ToString());

            parser.Variables.Add(Var);
            parser.Parse(Expression);

            Func<double,double> proc = x =>
                {
                    Var.Value = x;
                    return parser.Evaluate();
                };

            switch (Kind)
            {
                case 0:
                    return Integration.Trapezoidal(LowerIndex, UpperIndex, proc);

                case 1:
                    return Integration.LeftHand(LowerIndex, UpperIndex, proc);

                default:
                    return Integration.MidPoint(LowerIndex, UpperIndex, proc);
            }
        }
示例#11
0
 public void Add_Exp(string str)
 {
     if (chart1.Series.IndexOf(str) != -1)
     {
         chart1.Series[str].Points.Clear();
     }
     else
     {
         chart1.Series.Add(str);
     }
     chart1.Series[str].ChartType = SeriesChartType.Line;
     str = graphAdd.get_Expression();
     try
     {
         MathParser g = new MathParser();
         double     y;
         for (double i = xmin; i <= xmax; i += 0.01F)
         {
             g.setArgumentValue(i);
             y = g.Calculate(str);
             if (Math.Abs(y) > 99999 || Math.Abs(y) < -99999)
             {
             }
             else
             {
                 if (y != double.NaN)
                 {
                     chart1.Series[str].Points.AddXY(i, y);
                 }
             }
         }
     }
     catch {}
 }
示例#12
0
        public void BuiltInFunctions()
        {
            var parser = new MathParser();

            Assert.AreEqual(21, parser.Parse("round(21.333333333333)"));
            Assert.AreEqual(1, parser.Parse("pow(2,0)"));
        }
示例#13
0
        public void CommaPiBug()
        {
            var parser = new MathParser();
            var result = parser.Parse("pi");

            Assert.AreEqual(result, parser.LocalVariables["pi"], 0.00000000000001);
        }
示例#14
0
        private double ParseCoefficient(string expression, string variable, List <string> variables)
        {
            var parser           = new MathParser();
            var variablePosition = expression.IndexOf(variable, StringComparison.Ordinal);

            if (variablePosition == 0)
            {
                return(1);
            }

            var leftVariables = variables
                                .Where(x => x != variable && expression.Contains(x) && variablePosition - expression.IndexOf(x, StringComparison.Ordinal) > 0)
                                .OrderBy(x => variablePosition - expression.IndexOf(x, StringComparison.Ordinal));

            if (!leftVariables.Any())
            {
                return((double)parser.Parse(expression.Substring(0, expression.IndexOf(variable, StringComparison.Ordinal))));
            }

            var leftVariable         = leftVariables.First();
            var leftVariablePosition = expression.IndexOf(leftVariable, StringComparison.Ordinal);

            var str = leftVariablePosition < 0
                ? expression.Substring(0, expression.IndexOf(variable, StringComparison.Ordinal))
                : expression.Substring(leftVariablePosition + 2, variablePosition - leftVariablePosition - 2);

            if (str.Length == 1)
            {
                return(1);
            }

            return((double)parser.Parse(str));
        }
示例#15
0
        public void TestTryParse(string input, bool result)
        {
            var returnValue = MathParser.TryEvaluate(input, out var mathResult);

            Assert.NotNull(mathResult);
            Assert.Equal(result, returnValue);
        }
示例#16
0
        private List <Func <double, double> > GetControl()
        {
            var controlTextBoxes = new[] { controlU1, controlU2, controlU3, controlU4 };
            var parser           = new MathParser();

            return(controlTextBoxes
                   .Select(currentControl =>
            {
                currentControl.BorderBrush = Brushes.DarkGray;
                Func <double, double> currenControl = t =>
                {
                    if (string.IsNullOrEmpty(currentControl.Text))
                    {
                        return 0;
                    }

                    try
                    {
                        var calcControlValue = currentControl.Text.Replace("t", t.ToString());
                        return (double)parser.Parse(calcControlValue);
                    }
                    catch (FormatException)
                    {
                        currentControl.BorderBrush = Brushes.Red;
                        throw;
                    }
                };

                return currenControl;
            })
                   .ToList());
        }
示例#17
0
        public Expression Parse(MathParser parser, Token <RMathToken> token)
        {
            var e = parser.ParseExpression();

            parser.Take(RMathToken.RightParen);
            return(e);
        }
示例#18
0
        public void Parse()
        {
            var node = MathParser.Parse("3+3=2*3");

            node = MathParser.Parse("sqrt(x) * sqrt(x) = 7");
            node = MathParser.Parse("4 * x + 3 = 19");
        }
示例#19
0
        public void AdvancedArithmetic()
        {
            var parser = new MathParser();

            Assert.AreEqual(30, parser.Parse("3(7+3)"));
            Assert.AreEqual(20, parser.Parse("(2+3)(3+1)"));
        }
示例#20
0
 public void TestMathParser()
 {
     Assert.AreEqual(MathParser.Evaluate(0, 0, MathParser.ConvertToRPN("3^4")), 81f, 0.01, "Math Parser Test 1 Failed");
     Assert.AreEqual(MathParser.Evaluate(0, 0, MathParser.ConvertToRPN("(2^2)^(2^2)")), 256f, 0.01, "Math Parser Test 2 Failed");
     Assert.AreEqual(MathParser.Evaluate(0, 0, MathParser.ConvertToRPN("0.0001+(-0.4)")), -0.4f, 0.01, "Math Parser Test 3 Failed");
     Assert.AreEqual(MathParser.Evaluate(2, 2, MathParser.ConvertToRPN("0.0001+(x * y)")), 4f, 0.01, "Math Parser Test 4 Failed");
 }
示例#21
0
        static void Main(string[] args)
        {
            IContext context = new Context();

            context.AddConst("a", 0.2);
            context.AddConst("b", 0.3);
            context.AddConst("c", -0.3);

            var mathParser = new MathParser(context);

            try
            {
                var result = mathParser.Calculate("2+3*4");

                if (result.IsValid)
                {
                    Console.WriteLine($"result = {result.Result}");
                }
                else
                {
                    Console.WriteLine(String.Join(Environment.NewLine, result.Errors));
                }
            }
            catch (InvalidOperationException ex)
            {
                Console.WriteLine(ex.Message);
            }

            Console.ReadKey();
        }
示例#22
0
        static void Main(string[] args)
        {
            Console.Write("Введите пример : ");
            try
            {
                string example = Console.ReadLine();
                if (example == String.Empty)
                {
                    throw new FormatException();
                }
                else if (example == ".")
                {
                    throw new ArgumentException();
                }
                Console.Write("Ответ : ");
                Console.Write(MathParser.Example(example.ToCharArray()).ToString());
            }
            catch (FormatException)
            {
                Console.WriteLine("Пустая строка");
            }
            catch (ArgumentException)
            {
                Console.WriteLine("Недопустимый символ \".\"");
            }

            Console.Read();
        }
示例#23
0
        public Expression Parse(MathParser parser, Token <RMathToken> token)
        {
            var e = new AbsExpression(parser.ParseExpression());

            parser.Take(RMathToken.Pipe);
            return(e);
        }
示例#24
0
        public void ExceptionCatching()
        {
            var parser = new MathParser();

            parser.Parse("(-1");
            parser.Parse("rem(20,1,,,,)");
        }
示例#25
0
 private void btnTongHop_Click(object sender, EventArgs e)
 {
     if (dtChiTiet != null && dtGiangVien != null)
     {
         int        TyLe     = 0;
         float      TongDiem = 0;
         MathParser parser   = new MathParser();
         //DataRow[] dr;
         for (int i = 0; i < dtChiTiet.Rows.Count; i++)
         {
             TongDiem = 0;
             TyLe     = 0;
             for (int j = 0; j < grbGiangVien.Columns.Count; j++)
             {
                 //  dr = dtChiTiet.Select(" SV_SinhVienID = " + dtChiTiet.Rows[i]["SV_SinhVienID"].ToString());// + " and KQHT_HoiDongMon_ChiTietID =" + dtGiangVien.Rows[j]["KQHT_HoiDongMon_ChiTietID"].ToString());
                 TongDiem += int.Parse(grbGiangVien.Columns[j].FieldName.Substring(grbGiangVien.Columns[j].FieldName.IndexOf("_") + 1)) * float.Parse("0" + dtChiTiet.Rows[i][grbGiangVien.Columns[j].FieldName].ToString());
                 TyLe     += int.Parse(grbGiangVien.Columns[j].FieldName.Substring(grbGiangVien.Columns[j].FieldName.IndexOf("_") + 1));
             }
             if (TongDiem > 0 && TyLe > 0)
             {
                 dtChiTiet.Rows[i]["DiemTK"] = parser.Round(TongDiem / TyLe, 1, true);
             }
         }
     }
 }
示例#26
0
        public static double CalcStringFormula(List <string> Formulas)
        {
            double val = 0;

            if (Formulas != null)
            {
                if (parser == null)
                {
                    parser = new MathParser();
                }
                foreach (string f in Formulas)
                {
                    if (string.IsNullOrEmpty(f))
                    {
                        continue;
                    }
                    string F = f.Replace("\n", "").Replace("\r", "").Replace("\t", "");
                    double v = parser.Parse(F, new System.Collections.Hashtable());
                    if (double.IsInfinity(v) || double.IsNaN(v))
                    {
                        v = 0;
                    }
                    val += v;
                }
            }
            return(val);
        }
示例#27
0
        public void CustomFunctions()
        {
            /*
             * This test demonstrates three ways of adding a function
             * to the Math Parser
             *
             * 1) directly pointing to the function
             * 2) lambda expression
             * 3) anonymous method
             */

            MathParser parser = new MathParser();

            //for long functions
            parser.LocalFunctions.Add("numberTimesTwo", NumberTimesTwoCustomFunction); // adding the function
            decimal resultA = parser.Parse("numberTimesTwo(3)");

            //for short functions, use lambda expression, or anonymous method
            // 1) using lambda epxression (recommended)
            parser.LocalFunctions.Add("square", x => x[0] * x[0]);
            decimal resultB = parser.Parse("square(4)");

            // 2) using anonymous method
            parser.LocalFunctions.Add("cube", delegate(decimal[] x)
            {
                return(x[0] * x[0] * x[0]);
            });
            decimal resultC = parser.Parse("cube(2)");
        }
示例#28
0
        public override double Evaluate(MathParser parser, VM ii)
        {
            var name = _right as NameExpression;

            switch (_token.ID)
            {
            case RMathToken.Minus:
                return(-_right.Evaluate(parser, ii));

            case RMathToken.Increment:
            {
                if (name == null)
                {
                    throw new RantException(parser.Source, _token, "Increment prefix could not find a variable.");
                }
                double d = name.Evaluate(parser, ii) + 1;
                ii.Engine.Variables.SetVar(name.Name, d);
                return(d);
            }

            case RMathToken.Decrement:
            {
                if (name == null)
                {
                    throw new RantException(parser.Source, _token, "Decrement prefix could not find a variable.");
                }
                double d = name.Evaluate(parser, ii) - 1;
                ii.Engine.Variables.SetVar(name.Name, d);
                return(d);
            }

            default:
                throw new RantException(parser.Source, _token, "Invalid prefix operator '" + _token + "'.");
            }
        }
示例#29
0
        public void DetailedSpeedTestWithOptimization()
        {
            var mp = new MathParser();

            mp.LocalVariables.Add("x", 5);

            var expr = "(3x+2)(2(2x+1))";

            int    itr = 3000;
            double creationTimeAndTokenization = BenchmarkUtil.Benchmark(() => mp.GetTokens(expr), 1);

            var tokens = mp.GetTokens(expr);

            double parsingTime = BenchmarkUtil.Benchmark(() => mp.Parse(tokens), itr);


            double totalTime = creationTimeAndTokenization + parsingTime;


            //var mp = new MathParser();

            //mp.LocalVariables.Add("x", 5);

            //var expr = "(3x+2)(2(2x+1))";

            //int itr = 50;

            double parsingTime2 = BenchmarkUtil.Benchmark(() => mp.Parse(expr), itr);


            double totalTime2 = parsingTime2;
        }
示例#30
0
        public void AdvancedArithmetics()
        {
            MathParser parser  = new MathParser();
            decimal    resultA = parser.Parse("(2+3)(3+1)");

            Assert.IsTrue(resultA == 20);
        }
示例#31
0
        public void CustomFunctionsWithSeverelArguments()
        {
            /*
             * This example demonstrates the "anonymous method" way of adding
             * a function that can take more than one agument.
             */

            MathParser parser = new MathParser(loadPreDefinedFunctions: false);

            //for long functions
            parser.LocalFunctions.Add("log", delegate(decimal[] input) // adding the function
            {
                // input[0] is the number
                // input[1] is the base

                if (input.Length == 1)
                {
                    return((decimal)Math.Log((double)input[0]));
                }
                else if (input.Length == 2)
                {
                    return((decimal)Math.Log((double)input[0], (double)input[1]));
                }
                else
                {
                    return(0); // false
                }
            });

            decimal resultA = parser.Parse("log(2)");
            decimal resultB = parser.Parse("log(2,3)");
        }
示例#32
0
        public void NewOperator()
        {
            var p = new MathParser();

            p.Operators.Add(new BinaryOperator<double>("$", 2, (x, y) => x * y));

            Assert.AreEqual(p.Evaluate("3 $ 4"), 12);
        }
示例#33
0
 public void SetUp()
 {
     var expressionValidator = new MathRegex();
     var expressionFixer = new ExpressionFixer(expressionValidator);
     this.lexer = new MathLexer(expressionValidator, expressionFixer);
     var limitsValidator = new LimitsValidator(-100, 100);
     var proxy = new CalculatorProxy(limitsValidator);
     var calculator = new Calculator();
     var operatorFactory = new OperatorFactory(proxy, calculator);
     this.parser = new MathParser(this.lexer, operatorFactory);
 }
示例#34
0
        public void NewOperatorParsed()
        {
            var p = new MathParser();

            p.Operators.Add(new BinaryOperator<double>("$", 2, (x, y) =>
            {
                p.Manipulate("var x = " + x);
                p.Manipulate("var y = " + y);

                return p.Evaluate("x * y");
            }));

            Assert.AreEqual(p.Evaluate("3 $ 4"), 12);
        }
示例#35
0
        public static void DumpTree(string mathCode)
        {
            Expression expression;

            var tokenizer = new MathTokenizer();
            var parser = new MathParser();

            using (var reader = new StringReader(mathCode))
            {
                var tokens = tokenizer.Tokenize(reader);
                expression = parser.Parse(tokens);
            }

            Console.WriteLine(expression.ToString());
        }
示例#36
0
        public ConsoleMathTypeChecker()
        {
            parser = new MathParser();
            parser.Factory = factory = new MathFactory();

            parser.OnReduction += OnReduction;
            parser.OnCompletion += OnCompletion;
            parser.OnGroupError += OnGroupError;
            parser.OnInternalError += OnInternalError;
            parser.OnNotLoadedError += OnNotLoadedError;
            parser.OnLexicalError += OnLexicalError;
            parser.OnSyntaxError += OnSyntaxError;

            Assembly a = typeof(ConsoleMathTypeChecker).Assembly;
            parser.LoadGrammar(new BinaryReader(a.GetManifestResourceStream("QL_ExtensionTest.Grammar.QL_Grammar.egt")));
            parser.Parse("form Form1 { \"Power:\" << answer1:int = 5 ^ 2; \"Modulo:\" << 10 % 5; \"Modulo2:\" << 10 % true; }");
        }
示例#37
0
        public static MathValue InterpretSingle(string mathCode)
        {
            Expression expression;

            var tokenizer = new MathTokenizer();
            var parser = new MathParser();

            using (var reader = new StringReader(mathCode))
            {
                var tokens = tokenizer.Tokenize(reader);
                expression = parser.Parse(tokens);
            }

            var context = CreateGlobalContext();
            var result = expression.Evaluate(context);

            return result;
        }
示例#38
0
        public static double Sigma(string Expression, double LowerIndex, double UpperIndex, char IterationVariable, double Step)
        {
            double Result = 0;

            var parser = new MathParser();

            var Var = new Variable<double>(IterationVariable.ToString());

            parser.Variables.Add(Var);
            parser.Parse(Expression);

            for (var i = LowerIndex; i <= UpperIndex; i += Step)
            {
                Var.Value = i;
                Result += parser.Evaluate();
            }

            return Result;
        }
        private void UpdateGraph()
        {
            zGraph.GraphPane.CurveList.Clear();
            zGraph.RestoreScale(zGraph.GraphPane);

            PointPairList pointsH2 = new PointPairList();
            PointPairList pointsO2 = new PointPairList();

            PointPairList pointsCO = new PointPairList();
            PointPairList pointsCO2 = new PointPairList();
            PointPairList pointsN2 = new PointPairList();
            PointPairList pointsAr = new PointPairList();
            PointPairList pointsTemp = new PointPairList();
            PointPairList pointsFlow = new PointPairList();
            PointPairList pointsRealCO = new PointPairList();
            PointPairList pointsRealCO2 = new PointPairList();
            PointPairList pointsRealFlow = new PointPairList();

            double time;
            foreach (OffGas og in CurrentListOfGas)
            {
                time = (og.Date - CurrentFussion.StartDate).TotalSeconds;
                pointsH2.Add(time, og.H2);
                pointsO2.Add(time, og.O2);
                pointsCO.Add(time, og.CO);
                pointsCO2.Add(time, og.CO2);
                pointsN2.Add(time, og.N2);
                pointsAr.Add(time, og.Ar);
                pointsTemp.Add(time, og.Temperature);
                pointsFlow.Add(time, og.Flow / 60);
            }

            foreach (OffGasAnalysisEvent ogaEvent in _heat.OffGasAnalysisHistory)
            {
                time = (ogaEvent.Time - CurrentFussion.StartDate).TotalSeconds;
                pointsRealCO.Add(time, ogaEvent.CO);
                pointsRealCO2.Add(time, ogaEvent.CO2);
            }

            foreach (OffGasEvent ogEvent in _heat.OffGasHistory)
            {
                time = (ogEvent.Time - CurrentFussion.StartDate).TotalSeconds;
                pointsRealFlow.Add(time, ogEvent.OffGasFlow / 60);
            }

            if (cbH2.Checked)
            {
                zGraph.GraphPane.AddCurve("H2", pointsH2, Color.Green, SymbolType.None);
            }
            if (cbO2.Checked)
            {
                zGraph.GraphPane.AddCurve("O2", pointsO2, Color.Blue, SymbolType.None);
            }
            if (cbCO.Checked)
            {
                zGraph.GraphPane.AddCurve("CO", pointsCO, Color.Red, SymbolType.None);
            }
            if (cbCO2.Checked)
            {
                zGraph.GraphPane.AddCurve("CO2", pointsCO2, Color.Orange, SymbolType.None);
            }
            if (cbN2.Checked)
            {
                zGraph.GraphPane.AddCurve("N2", pointsN2, Color.Black, SymbolType.None);
            }
            if (cbAr.Checked)
            {
                zGraph.GraphPane.AddCurve("Ar", pointsAr, Color.Turquoise, SymbolType.None);
            }
            if (cbFlow.Checked)
            {
                zGraph.GraphPane.AddCurve("Flow", pointsFlow, Color.SaddleBrown, SymbolType.None);
            }
            if (cbTemp.Checked)
            {
                zGraph.GraphPane.AddCurve("Temp", pointsTemp, Color.OliveDrab, SymbolType.None);
            }
            if (cbRealCO.Checked)
            {
                zGraph.GraphPane.AddCurve("RealCO", pointsRealCO, Color.DarkGray, SymbolType.None);
            }
            if (cbRealCO2.Checked)
            {
                zGraph.GraphPane.AddCurve("RealCO2", pointsRealCO2, Color.Fuchsia, SymbolType.None);
            }
            if (cbRealFlow.Checked)
            {
                zGraph.GraphPane.AddCurve("RealFlow", pointsRealFlow, Color.MidnightBlue, SymbolType.None);
            }

            PointPairList pointsLance = new PointPairList();
            PointPairList pointsOFlow = new PointPairList();

            List<Lance> lanceHeights = CurrentListLance;//m_Db.GetLance(CurrentFussion.Id);
            if (lanceHeights.Count > 0)
            {
                int lanceHeight = lanceHeights.First().Height;

                for (double second = (lanceHeights.First().Date - CurrentFussion.StartDate).TotalSeconds; second < (lanceHeights.Last().Date - CurrentFussion.StartDate).TotalSeconds; second++)
                {
                    foreach (Lance lance in lanceHeights)
                    {
                        if (second > 0)
                        {
                            if ((int)(lance.Date - CurrentFussion.StartDate).TotalSeconds == (int)second)
                            {
                                pointsLance.Add(second, lance.Height * Zoom);
                                pointsOFlow.Add(second, lance.O2Flow * Zoom);
                                lanceHeight = lance.Height;
                                continue;
                            }
                            pointsLance.Add(second, lanceHeight);
                        }
                    }
                }
            }
            if (cbLance.Checked)
            {
                zGraph.GraphPane.AddCurve("Фурма", pointsLance, Color.Lime, SymbolType.None);
            }
            if (cbOFlow.Checked)
            {
                zGraph.GraphPane.AddCurve("OFlow", pointsOFlow, Color.Magenta, SymbolType.None);
            }

            //PointPairList pointsAdditions = new PointPairList();

            if (gbVars.Controls.Count > 0)
            {
                MathParser mathParser = new MathParser();
                int varsCount = gbVars.Controls.Count / 3;
                for (int i = 0; i < varsCount; i++)
                {
                    if ((gbVars.Controls.Find(string.Format("cb{0}", i), true)[0] as System.Windows.Forms.CheckBox).Checked)
                    {
                        PointPairList points = new PointPairList();
                        foreach (OffGas og in CurrentListOfGas)
                        {
                            mathParser.CreateVar("H2", og.H2, null);
                            mathParser.CreateVar("O2", og.O2, null);
                            mathParser.CreateVar("CO", og.CO, null);
                            mathParser.CreateVar("CO2", og.CO2, null);
                            mathParser.CreateVar("N2", og.N2, null);
                            mathParser.CreateVar("Ar", og.Ar, null);
                            mathParser.Expression = (gbVars.Controls.Find(string.Format("tb{0}", i), true)[0] as System.Windows.Forms.TextBox).Text;
                            try
                            {
                                points.Add((og.Date - CurrentFussion.StartDate).TotalSeconds, mathParser.ValueAsDouble * Zoom);
                            }
                            catch (Exception)
                            {
                                MessageBox.Show(string.Format("Переменная {0} задана неверно, ошибка в формуле", (gbVars.Controls.Find(string.Format("lb{0}", i), true)[0] as System.Windows.Forms.Label).Text));
                                return;
                            }
                        }
                        mathParser.CreateVar((gbVars.Controls.Find(string.Format("lb{0}", i), true)[0] as System.Windows.Forms.Label).Text,
                                              mathParser.ValueAsString,
                                              null);
                        if ((gbVars.Controls.Find(string.Format("cb{0}", i), true)[0] as System.Windows.Forms.CheckBox).Checked)
                        {
                            zGraph.GraphPane.AddCurve((gbVars.Controls.Find(string.Format("lb{0}", i), true)[0] as System.Windows.Forms.Label).Text, points, Color.DeepPink, SymbolType.None);
                        }
                    }
                }
            }

            zGraph.GraphPane.Title.IsVisible = false;
            this.Text = string.Format("Плавка: {0}  Марка: {1}  Начало: {2}({3})  Бригада: {4}  Конвертер:{5}  Т зад={6}  Т факт={7}  С зад={8}  С факт={9}",
                                                     CurrentFussion.Number, CurrentFussion.Grade, ((HeatAttributes) CurrentFussion).StartDate, CurrentFussion.StartDate,
                                                     CurrentFussion.TeamNumber, CurrentFussion.AggregateNumber, CurrentFussion.PlannedTemperature,
                                                     CurrentFussion.FactTemperature, CurrentFussion.PlannedCarbon, CurrentFussion.FactCarbon);

            zGraph.AxisChange();
            zGraph.Invalidate();
        }
示例#40
0
        private void ButtonEquals_Click(object sender, RoutedEventArgs e)
        {
            Utils.log("ButtonEquals_Click", "Clicked Equals");
            resetFlashTimer = true;

            // if just hit equals, re-evaluate expression;
            if (JUST_HIT_EQUALS)
            {
                Utils.log("ButtonEquals_Click", "Hit equals twice in a row");
                ClearAllTokens();
                this.TextBoxInputTokens.InsertRange(0, MEM_PREV_TOKENS);
                currentToken = MEM_PREV_TOKENS.Count;
                Utils.log("ButtonEquals_Click", "cToken = {0}", currentToken);
            }

            // Uncomment to view list of tokens.
            /*string str = "";
            foreach (Token t in TextBoxInputTokens)
            {
                Debugger.Log(0, "[ButtonEquals]", t.ToString());
                str += t.getRepresentation();
            }

            Debugger.Log(0, "[ButtonEquals]", str);*/

            this.TextBoxInputTokens.Add(new Token(TokenType.EOF, "Null"));

            currentToken += 1;
            Parser parser = new MathParser(this.TextBoxInputTokens);
            try
            {
                parser.term();
                // remove top element.
                this.TextBoxInputTokens.RemoveAt(this.TextBoxInputTokens.Count - 1);
                currentToken -= 1;

                MEM_PREV_TOKENS = new List<Token>(new List<Token>(this.TextBoxInputTokens));
            }
            catch (SyntaxException excp)
            {
                // remove EOF token and error
                this.TextBoxInputTokens.RemoveAt(this.TextBoxInputTokens.Count - 1);
                currentToken -= 1;

                MEM_ANS = 0;
                this.answerTokens.Add(new IdentToken("MATH ERROR"));

                DrawEquals();
                this.currentToken = excp.getPosition();
                UpdateTextBox();

                return;
            }
            catch (Exception)
            {
                // remove EOF token and error
                this.TextBoxInputTokens.RemoveAt(this.TextBoxInputTokens.Count - 1);
                currentToken -= 1;

                MEM_ANS = 0;
                this.answerTokens.Add(new IdentToken("MATH ERROR"));

                DrawEquals();
                return;
            }

            AST output;

            try
            {
                output = parser.Pop();
                double answer = output.evaluate();
                Utils.log("ButtonEquals_Click", "Answer = {0}", answer);

                // Handle infinite answers.
                if (Double.IsInfinity(answer))
                {
                    MEM_ANS = 0;
                    this.answerTokens.Add(new IdentToken("MATH ERR (ANSWER TOO LARGE)"));
                }
                else
                {
                    MEM_ANS = answer;

                    foreach (char c in Convert.ToString(answer))
                    {
                        if (c == '.')
                        {
                            this.answerTokens.Add(new DotToken());
                        }
                        else if (c == 'E')
                        {
                            this.answerTokens.Add(new OperationToken("x10", TokenType.OP_POW10));
                        }
                        else if (c == '-')
                        {
                            this.answerTokens.Add(new OperationToken("-", TokenType.OP_SUB));
                        }
                        else
                        {
                            this.answerTokens.Add(new DigitToken(Convert.ToString(c)));
                        }
                    }
                }

                Utils.log("ButtonEquals_Click", "Drawing AnswerBox");
                DrawEquals();
            }
            catch (MathException)
            {
                // remove EOF token and error
                this.TextBoxInputTokens.RemoveAt(this.TextBoxInputTokens.Count - 1);
                currentToken -= 1;

                MEM_ANS = 0;
                this.answerTokens.Add(new IdentToken("MATH ERROR"));

                DrawEquals();
                return;
            }
            catch (Exception)
            {
                // remove EOF token and error
                this.TextBoxInputTokens.RemoveAt(this.TextBoxInputTokens.Count - 1);
                currentToken -= 1;

                MEM_ANS = 0;
                this.answerTokens.Add(new IdentToken("MATH ERROR"));

                DrawEquals();
                return;
            }
        }
        public void ShowFusion(Fusion fusion)
        {
            lbH2Value.Text = "";
            lbO2Value.Text = "";
            lbCOValue.Text = "";
            lbCO2Value.Text = "";
            lbN2Value.Text = "";
            lbArValue.Text = "";
            zgMain.GraphPane.CurveList.Clear();
            PointPairList pointsH2 = new PointPairList();
            PointPairList pointsO2 = new PointPairList();
            PointPairList pointsCO = new PointPairList();
            PointPairList pointsCO2 = new PointPairList();
            PointPairList pointsN2 = new PointPairList();
            PointPairList pointsAr = new PointPairList();
            foreach (TrendPoint tp in fusion.Points)
            {
                pointsH2.Add(tp.Time.TotalSeconds, tp.H2);
                pointsO2.Add(tp.Time.TotalSeconds, tp.O2);
                pointsCO.Add(tp.Time.TotalSeconds, tp.CO);
                pointsCO2.Add(tp.Time.TotalSeconds, tp.CO2);
                pointsN2.Add(tp.Time.TotalSeconds, tp.N2);
                pointsAr.Add(tp.Time.TotalSeconds, tp.Ar);
            }
            if (cbH2.Checked)
            {
                zgMain.GraphPane.AddCurve("H2", pointsH2, Color.Green, SymbolType.None);
            }
            if (cbO2.Checked)
            {
                zgMain.GraphPane.AddCurve("O2", pointsO2, Color.Blue, SymbolType.None);
            }
            if (cbCO.Checked)
            {
                zgMain.GraphPane.AddCurve("CO", pointsCO, Color.Red, SymbolType.None);
            }
            if (cbCO2.Checked)
            {
                zgMain.GraphPane.AddCurve("CO2", pointsCO2, Color.Orange, SymbolType.None);
            }
            if (cbN2.Checked)
            {
                zgMain.GraphPane.AddCurve("N2", pointsN2, Color.Black, SymbolType.None);
            }
            if (cbAr.Checked)
            {
                zgMain.GraphPane.AddCurve("Ar", pointsAr, Color.Turquoise, SymbolType.None);
            }
            zgMain.GraphPane.Title.FontSpec.Size = 6;
            zgMain.GraphPane.Title.Text = string.Format("Плавка: {0}  Марка: {1}  Начало: {2}({3})  Бригада: {4}  Конвертер:{5}  Т зад={6}  Т факт={7}  С зад={8}  С факт={9}",
                                                         fusion.Number, fusion.Grade, fusion.StartDate, fusion.StartDateDB,
                                                         fusion.TeamNumber, fusion.ConverterNumber, fusion.PlannedTempereture,
                                                         fusion.FactTemperature, fusion.PlannedC, fusion.FactC);

            // Отображаем график для введенных формул
            if (gbVars.Controls.Count > 0)
            {
                MathParser mathParser = new MathParser();
                int varsCount = gbVars.Controls.Count / 3;
                for (int i = 0; i < varsCount; i++)
                {
                    PointPairList points = new PointPairList();
                    foreach (TrendPoint tp in fusion.Points)
                    {
                        mathParser.CreateVar("H2", tp.H2, null);
                        mathParser.CreateVar("O2", tp.O2, null);
                        mathParser.CreateVar("CO", tp.CO, null);
                        mathParser.CreateVar("CO2", tp.CO2, null);
                        mathParser.CreateVar("N2", tp.N2, null);
                        mathParser.CreateVar("Ar", tp.Ar, null);
                        mathParser.Expression = (gbVars.Controls.Find(string.Format("tb{0}", i), true)[0] as System.Windows.Forms.TextBox).Text;
                        try
                        {
                            points.Add(tp.Time.TotalSeconds, mathParser.ValueAsDouble);
                        }
                        catch (Exception e)
                        {
                            MessageBox.Show(string.Format("Переменная {0} задана неверно, ошибка в формуле", (gbVars.Controls.Find(string.Format("lb{0}", i), true)[0] as System.Windows.Forms.Label).Text));
                            return;
                        }
                    }
                    mathParser.CreateVar((gbVars.Controls.Find(string.Format("lb{0}", i), true)[0] as System.Windows.Forms.Label).Text,
                                          mathParser.ValueAsString,
                                          null);
                    if ((gbVars.Controls.Find(string.Format("cb{0}", i), true)[0] as System.Windows.Forms.CheckBox).Checked)
                    {
                        zgMain.GraphPane.AddCurve((gbVars.Controls.Find(string.Format("lb{0}", i), true)[0] as System.Windows.Forms.Label).Text, points, Color.DeepPink, SymbolType.None);
                    }
                }
            }
            zgMain.GraphPane.Legend.IsVisible = false;
            zgMain.AxisChange();
            zgMain.Invalidate();
            zgMain.Visible = true;
            pAddVar.Visible = true;
            pVars.Visible = true;
            gbValues.Visible = true;
        }