void RefreshDisplay() { OutputState os = PrepareCalculators(); if (os != null) { // Refresh result label immediately string resultText = null; try { foreach (var c in os.Calcs) { resultText = resultText == null ? "" : resultText + ", "; resultText += CalculatorCore.Eval(c.Expr, c.Vars); } txtResult.Enabled = true; } catch (Exception e) { if (resultText == null) { resultText = e.Message; } txtResult.Enabled = false; } txtResult.Text = resultText; if (_bw.IsBusy) { _refreshRequested = true; return; } os.Bitmap = new DirectBitmap(graphPanel.ClientSize); _bw.RunWorkerAsync(os); } }
void RenderSeries(CalculatorCore calc, int seriesIndex, Graphics g) { sbyte[,] bins = null; using (Pen pen = MakePen(calc.Expr, seriesIndex)) { if (calc.Results is double[]) { RenderXFunc(g, (double[])calc.Results, pen); } else { double[,] data = (double[, ])calc.Results; if (((Calculator3D)calc).EquationMode) { RenderXYFunc(data, true, pen.Color); } else { bins = bins ?? new sbyte[data.GetLength(0), data.GetLength(1)]; double lo, interval = ChooseGridSpacing(out lo, ZRange, data); RenderContourLines(data, bins, pen.Color, lo, interval); DrawText(g, "Contour interval: {0}".Localized(interval), Bitmap.Width / 2, 5, pen.Color, StringAlignment.Center, StringAlignment.Near); } } } }
OutputState PrepareCalculators() { try { // Parse the three combo boxes and build a dictionary of variables var exprs = ParseExprs("Formula", cbFormulas.Text); var variables = ParseExprs("Variables", string.Format(CultureInfo.InvariantCulture, "pi={0};tau={1};e={2};phi=1.6180339887498948; {3}", Math.PI, Math.PI * 2, Math.E, cbVariables.Text)); var ranges = ParseExprs("Range", cbRanges.Text); var varDict = CalculatorCore.ParseVarList(variables); // Get display range. Size size = graphPanel.ClientSize; LNode xRangeExpr = ranges.TryGet(0, null), yRangeExpr = ranges.TryGet(1, null); var xRange = GraphRange.New("x", xRangeExpr, size.Width, varDict); var yRange = GraphRange.New("y", yRangeExpr ?? xRangeExpr, size.Height, varDict); var zRange = GraphRange.New("z", ranges.TryGet(2, null), 0, varDict); yRange.AutoRange = (yRangeExpr == null); // For functions of x only; ignored if y is used var calcs = exprs.Select(e => CalculatorCore.New(e, varDict, xRange, yRange)).ToList(); panelError.Visible = false; return(new OutputState(calcs, xRange, yRange, zRange, _prevBitmap)); } catch (Exception exc) { ShowError("(Immediate) {msg}".Localized("msg", exc.Message)); return(null); } }
public static GraphRange New(string rangeName, LNode range, int numPixels, Dictionary <Symbol, LNode> varDict) { if (range == null) { return new GraphRange(-1, 1, numPixels, Pens.MidnightBlue, null) { AutoRange = true } } ; if (range.Calls(CodeSymbols.Colon, 2) && range[0].IsId && string.Compare(range[0].Name.Name, rangeName, true) == 0) { range = range[1]; // ignore axis prefix like "x:" or "y:" } if (range.Calls(CodeSymbols.Sub, 2) || range.Calls(CodeSymbols.DotDot, 2)) { double lo = CalculatorCore.Eval(range[0], varDict); double hi = CalculatorCore.Eval(range[1], varDict); Pen pen = OutputState.MakePen(range); string label = range.Attrs.Select(a => a.Value as string).FirstOrDefault(s => s != null); var result = new GraphRange(lo, hi, numPixels, pen, label) { RangeExpr = range }; foreach (var attr in range.Attrs) { if (attr.Value is int) { result.RoughLineCount = (int)attr.Value; } } return(result); } throw new FormatException("Invalid range for {axis}: {range}".Localized("axis", rangeName, "range", range)); } }