コード例 #1
0
    /// <summary>
    /// 异步校验表达式
    /// </summary>
    /// <param name="error"></param>
    public void Validate(UnityAction <bool, string> error)
    {
        var text = StringExpressionInput.text;

        Loading.SetActive(true);
        try
        {
            var sym  = CalcArgs.GetSymexpr(text);
            var list = new List <string>();
            GetAllFactors(sym, list);
            foreach (var item in RecordManager.tempRecord.quantities)
            {
                if (item.processMethod == 1)
                {
                    if (list.Contains("k_" + item.Symbol) || list.Contains("Δ" + item.Symbol))
                    {
                        Loading.SetActive(false);
                        error?.Invoke(false, $"直接计算的物理量{item.Name}不能使用变化量或变化率");
                        return;
                    }
                }
                else if (item.processMethod == 2)
                {
                    if (list.Contains("k_" + item.Symbol) || list.Contains(item.Symbol))
                    {
                        Loading.SetActive(false);
                        error?.Invoke(false, $"逐差法处理的物理量{item.Name}不能直接使用其测量平均值或变化率");
                        return;
                    }
                }
                else if (item.processMethod == 3 || item.processMethod == 4)
                {
                    if (list.Contains(item.Symbol) || list.Contains("Δ" + item.Symbol))
                    {
                        Loading.SetActive(false);
                        error?.Invoke(false, $"物理量{item.Name}不能直接使用其测量平均值或变化量");
                        return;
                    }
                }
            }
            LatexEquationRender.Render(sym.ToLaTeX(),
                                       action: _ =>
            {
                Loading.SetActive(false);
                var(res, message) = StaticMethods.ValidExpression(ExpressionToCalc(text));
                error?.Invoke(res, message);
            },
                                       errorHandler: () =>
            {
                Loading.SetActive(false);
                error?.Invoke(false, "表达式渲染失败");
            });
        }
        catch
        {
            Loading.SetActive(false);
            error?.Invoke(false, "表达式格式不正确");
        }
    }
コード例 #2
0
    public void Render()
    {
        var text = _Expression.text;

        LatexEquationRender.Render(CalcArgs.GetSymexpr(text).ToLaTeX(), x =>
        {
            _Image.FitHeight(x);
        });
    }
コード例 #3
0
    /// <summary>
    /// 渲染合成量表达式图片
    /// </summary>
    public void Render()
    {
        var exp = CalcArgs.GetSymexpr(
            EnterExpression.ExpressionToShow(RecordManager.tempRecord.stringExpression))
                  .ToLaTeX();

        LatexEquationRender.Render(exp, x =>
        {
            _Image.FitImage(x, 270, 40);
        });
    }
コード例 #4
0
    /// <summary>
    /// 渲染表达式
    /// </summary>
    public void Render()
    {
        var text = StringExpressionInput.text;

        if (string.IsNullOrEmpty(text))
        {
            LatexEquationRender.Render("expr.", LoadSprite);
        }
        else
        {
            LatexEquationRender.Render(CalcArgs.GetSymexpr(text).ToLaTeX(), LoadSprite);
        }
    }
コード例 #5
0
        public override bool ParseArgs(IScenarioContent content, ref CalcArgs args, out string error)
        {
            // calc var += 10;
            // calc var = var + 10;
            if (content.length != 4 && content.length != 6)
            {
                error = GetLengthErrorString(4, 6);
                return(false);
            }

            // 在计算之前,变量必须存在
            if (!IsMatchVar(content[1], true, ref args.name, out error))
            {
                return(false);
            }

            if (!IsMatchEqualOperator(content[2], ref args.equalOp, out error))
            {
                return(false);
            }

            if (!ParseOrGetVarValue(content[3], ref args.value1, out error))
            {
                return(false);
            }

            if (content.length == 4)
            {
                args.binaryOp = "+";
                args.value2   = 0;
            }
            else
            {
                if (!IsMatchBinaryOperator(content[4], ref args.binaryOp, out error))
                {
                    return(false);
                }

                if (!ParseOrGetVarValue(content[5], ref args.value2, out error))
                {
                    return(false);
                }
            }

            error = null;
            return(true);
        }
コード例 #6
0
 public static string ExpressionToShow(string expr)
 {
     try
     {
         var sym     = CalcArgs.GetSymexpr(expr);
         var factors = new List <string>();
         GetAllFactors(sym, factors);
         factors = factors.OrderByDescending(x => x.Length).ToList();
         Dictionary <string, string> replacement = new Dictionary <string, string>();
         foreach (var item in factors)
         {
             string guid = GetUniqueIDTO22();
             replacement.Add(guid, item);
             expr = expr.Replace(item, guid);
         }
         foreach (var item in RecordManager.tempRecord.quantities)
         {
             var replace = replacement.Where(x => x.Value.Equals(item.Symbol));
             if (replace.Any())
             {
                 var tmp = replace.First();
                 if (item.processMethod == 1)
                 {
                     expr = expr.Replace(tmp.Key, item.Symbol);
                 }
                 else if (item.processMethod == 2)
                 {
                     expr = expr.Replace(tmp.Key, "Δ" + item.Symbol);
                 }
                 else if (item.processMethod == 3 || item.processMethod == 4)
                 {
                     expr = expr.Replace(tmp.Key, "k_" + item.Symbol);
                 }
             }
         }
     }
     catch { }
     return(expr);
 }
コード例 #7
0
        protected override ActionStatus Run(IGameAction gameAction, IScenarioContent content, CalcArgs args, out string error)
        {
            int binaryResult;

            if (!CalculateBinaryResult(args.binaryOp, args.value1, args.value2, out binaryResult, out error))
            {
                return(ActionStatus.Error);
            }

            int equalResult;

            if (args.equalOp == "=")
            {
                equalResult = binaryResult;
            }
            else
            {
                int oldValue = ScenarioBlackboard.Get(args.name);
                if (!CalculateBinaryResult(args.equalOp, oldValue, binaryResult, out equalResult, out error))
                {
                    return(ActionStatus.Error);
                }
            }

            ScenarioBlackboard.Set(args.name, equalResult);
            return(ActionStatus.Continue);
        }
コード例 #8
0
        public override TaskStatus Run()
        {
            Info("Start Comparator task");

            bool success = false;

            bool IsIndata = false;

            try
            {
                if (indata == "file")
                {
                    foreach (FileInf fi in SelectFiles())
                    {
                        SrezTableLight stl = new SrezTableLight();
                        sa.FileName = fi.Path;
                        sa.Fill(stl);
                        int id = int.Parse(fi.FileName.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries)[1]);
                        stls.AddSrez(id, stl.SrezList.Values[0]);
                    }
                    IsIndata = true;
                }

                if (indata == "mem")
                {
                    foreach (RSServer srv in srvs.GetRSServers())
                    {
                        stls.AddSrez(srv.Id, srv.GetCurrSrez());
                    }
                    IsIndata = true;
                }

                if (IsIndata)
                {
                    foreach (Cnl cnl in Cnls)
                    {
                        Argument cArg = new Argument(cnl.ToString(), stls.GetCnlData(cnl.ID, cnl.Num));
                        CalcArgs.Add(cArg);
                    }
                    CalcArgs.AddRange(xArgs);

                    foreach (Argument arg in CalcArgs)
                    {
                        Info(arg.getArgumentName() + "   " + arg.getArgumentValue().ToString());
                    }

                    Expression expr = new Expression(condition, CalcArgs.ToArray());

                    double pvExpr = expr.calculate();

                    if (pvExpr == 0)
                    {
                        success = false;
                    }
                    else if (pvExpr == 1)
                    {
                        success = true;
                    }

                    if (success)
                    {
                        foreach (Argument arg in odts)
                        {
                            arg.addDefinitions(CalcArgs.ToArray());
                        }
                    }


                    InfoFormat("Condition: {0}", condition);
                    InfoFormat("Result calculate: {0}", expr.calculate());
                    InfoFormat("Success value: {0}", success);
                }
                else
                {
                    Info("Not set parametr indata");
                }

                CalcArgs.Clear();
                stls.ClearSrez();
            }
            catch (ThreadAbortException)
            {
                throw;
            }
            catch (Exception ex)
            {
                ErrorFormat("Ann error calc comparator. Error: {0}", ex.Message);
            }

            Info("Task RSComparator finished.");
            return(new TaskStatus(Status.Success, success));
        }
コード例 #9
0
		public override TaskStatus Run ()
		{
			Info("Start RSSendValues task");


			bool IsIndata = false;

			try {

				if(indata=="file")
				{
					foreach(FileInf fi in SelectFiles())
					{
						SrezTableLight stl = new SrezTableLight ();
						sa.FileName = fi.Path;
						sa.Fill(stl);
						int id = int.Parse (fi.FileName.Split (new char[]{'.'},StringSplitOptions.RemoveEmptyEntries)[1]);
						stls.AddSrez(id,stl.SrezList.Values[0]);
					}
					IsIndata  = true;
				}

				if (indata == "mem")
				{

					foreach(RSServer srv in srvs.GetRSServers())
					{
						stls.AddSrez(srv.Id,srv.GetCurrSrez());
					}
					IsIndata = true;

				}


				if(IsIndata)
				{
					foreach(Cnl cnl in Cnls)
					{
						Argument cArg = new Argument(cnl.ToString(),stls.GetCnlData(cnl.ID,cnl.Num));
						CalcArgs.Add(cArg);
					}
					CalcArgs.AddRange(xArgs);

					List<Cnl> cnls = new List<Cnl>();

					foreach(Argument arg in SendVals)
					{
						PrimitiveElement[] pes = CalcArgs.ToArray();
						arg.addDefinitions(pes);
						Cnl cnl = new Cnl(arg.getArgumentName(),arg.getArgumentValue(),1);
						cnls.Add(cnl);
						arg.removeDefinitions(CalcArgs.ToArray());
					}
					srvs.SendCurrSrez(cnls);
				}
				else{
					Info("No set parametr indata");
				}

				CalcArgs.Clear();
				stls.ClearSrez();
			} catch (ThreadAbortException) {
				throw;
			} catch (Exception ex) {
				InfoFormat ("An error RSSendValues: {0}", ex.Message);
			}
			Info("Task RSSendValues finished");
			return new TaskStatus (Status.Success, false);
		}
コード例 #10
0
    private void CheckComplex()
    {
        CalcArgs calc_complex = new CalcArgs();

        foreach (var item in RecordManager.tempRecord.quantities)
        {
            if (item.processMethod == 1)
            {
                calc_complex.AddVariable(item.Symbol, GameManager.Instance.GetInstrument(item.InstrumentType).ErrorLimit / Math.Sqrt(3), item.MesuredData.data.Count, item.processMethod);
                calc_complex.Measure(item.Symbol, item.MesuredData.data.ToDouble().ToArray());
            }
            else if (item.processMethod == 2)
            {
                double _ub = GameManager.Instance.GetInstrument(item.InstrumentType).ErrorLimit / Math.Sqrt(3) / item.DifferencedData.data.Count;
                calc_complex.AddVariable(item.Symbol, _ub, item.DifferencedData.data.Count, item.processMethod);
                calc_complex.Measure(item.Symbol, item.DifferencedData.data.ToDouble().ToArray());
            }
            else if (item.processMethod == 3)
            {
                double[] x = new double[item.MesuredData.data.Count];
                double[] y = new double[item.MesuredData.data.Count];
                for (int i = 0; i < item.MesuredData.data.Count; i++)
                {
                    y[i] = double.Parse(item.MesuredData.data[i]);
                    x[i] = double.Parse(item.IndependentData.data[i]);
                }

                //求n,方均根与均方根
                double[] temp = new double[item.IndependentData.data.Count];
                for (int i = 0; i < item.IndependentData.data.Count; i++)
                {
                    temp[i] = double.Parse(item.IndependentData.data[i]);
                }
                double k, x_squre_mean, x_mean_square;
                k             = temp.Length;
                x_squre_mean  = StaticMethods.CenterMoment(temp, 2);
                x_mean_square = Math.Pow(StaticMethods.Average(temp), 2);
                //求n,方均根与均方根结束
                double _ub = GameManager.Instance.GetInstrument(item.InstrumentType).ErrorLimit / Math.Sqrt(3) / Math.Sqrt(k * (x_squre_mean - x_mean_square));
                calc_complex.AddVariable(item.Symbol, _ub, x.Length, 3);
                calc_complex.Measure(item.Symbol, x);
                calc_complex.SelfValue(item.Symbol, y);
            }
            else
            {
                double[] x = new double[item.MesuredData.data.Count];
                double[] y = new double[item.MesuredData.data.Count];
                for (int i = 0; i < item.MesuredData.data.Count; i++)
                {
                    if (item.Yaxis == 0)
                    {
                        y[i] = double.Parse(item.MesuredData.data[i]);
                        x[i] = double.Parse(item.IndependentData.data[i]);
                    }
                    else
                    {
                        x[i] = double.Parse(item.MesuredData.data[i]);
                        y[i] = double.Parse(item.IndependentData.data[i]);
                    }
                }

                calc_complex.AddVariable(item.Symbol, 0, x.Length, 3);
                calc_complex.Measure(item.Symbol, x);
                calc_complex.SelfValue(item.Symbol, y);
            }

            if (item.processMethod == 4)
            {
                calc_complex.MeasureUserUnput(item.Symbol, 0, 0, 0);
            }
            else
            {
                calc_complex.MeasureUserUnput(item.Symbol, item.UaExpression.GetExpressionExecuted(), item.UbExpression.GetExpressionExecuted(), item.ComplexExpression.GetExpressionExecuted());
            }
        }
        CalcResult complexresult;

        if (RecordManager.tempRecord.quantities.Where(x => x.processMethod == 4).Any())
        {
            calc_complex.ComplexUserUnput(RecordManager.tempRecord.complexQuantityModel.AverageExpression.GetExpressionExecuted(), 0);
            complexresult = CalcArgs.CalculateComplexValueNoUncertain(RecordManager.tempRecord.stringExpression, calc_complex);
        }
        else
        {
            calc_complex.ComplexUserUnput(RecordManager.tempRecord.complexQuantityModel.AverageExpression.GetExpressionExecuted(), RecordManager.tempRecord.complexQuantityModel.UncertainExpression.GetExpressionExecuted());
            complexresult = CalcArgs.CalculateComplexValue(RecordManager.tempRecord.stringExpression, calc_complex);
        }

        if (complexresult.status != "计算无误")
        {
            if (!complexresult.err.answer.right)
            {
                RecordManager.tempRecord.score.ComplexQuantityError += 1;//合成测量量错误统计
                complexresult.err.answer.userformula = RecordManager.tempRecord.complexQuantityModel.AverageExpression;
            }
            if (!complexresult.err.answerunc.right)
            {
                RecordManager.tempRecord.score.ComplexQuantityError += 1;//合成测量量错误统计
                complexresult.err.answerunc.userformula              = RecordManager.tempRecord.complexQuantityModel.UncertainExpression;
            }
            quantityErrors.Add(complexresult.err);
        }
        //}
    }