/// <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, "表达式格式不正确"); } }
public void Render() { var text = _Expression.text; LatexEquationRender.Render(CalcArgs.GetSymexpr(text).ToLaTeX(), x => { _Image.FitHeight(x); }); }
/// <summary> /// 渲染合成量表达式图片 /// </summary> public void Render() { var exp = CalcArgs.GetSymexpr( EnterExpression.ExpressionToShow(RecordManager.tempRecord.stringExpression)) .ToLaTeX(); LatexEquationRender.Render(exp, x => { _Image.FitImage(x, 270, 40); }); }
/// <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); } }
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); }
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); }
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); }
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)); }
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); }
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); } //} }